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+Ci0gKi8KLXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlpbnQgaERDID0gT1MuR2V0REMgKGhhbmRsZSk7Ci0JV0dMLlN3YXBCdWZmZXJzIChoREMpOwotCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL0xBWUVSUExBTkVERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjc0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmludGVybmFsLndpbjMyOwotCi0KLXB1YmxpYyBjbGFzcyBMQVlFUlBMQU5FREVTQ1JJUFRPUiB7Ci0gICAgcHVibGljIHNob3J0IG5TaXplOwotICAgIHB1YmxpYyBzaG9ydCBuVmVyc2lvbjsKLSAgICBwdWJsaWMgaW50IGR3RmxhZ3M7Ci0gICAgcHVibGljIGJ5dGUgaVBpeGVsVHlwZTsKLSAgICBwdWJsaWMgYnl0ZSBjQ29sb3JCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNHcmVlblNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNCbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQmx1ZVNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNBbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1SZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUdyZWVuQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1BbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0RlcHRoQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjU3RlbmNpbEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0F1eEJ1ZmZlcnM7Ci0gICAgcHVibGljIGJ5dGUgaUxheWVyUGxhbmU7Ci0gICAgcHVibGljIGJ5dGUgYlJlc2VydmVkOwotICAgIHB1YmxpYyBpbnQgY3JUcmFuc3BhcmVudDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSAzNjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1BJWEVMRk9STUFUREVTQ1JJUFRPUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTcwMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC53aW4zMjsKLQotCi1wdWJsaWMgY2xhc3MgUElYRUxGT1JNQVRERVNDUklQVE9SIHsKLSAgIAlwdWJsaWMgc2hvcnQgblNpemU7Ci0gICAgcHVibGljIHNob3J0IG5WZXJzaW9uOwotICAgIHB1YmxpYyBpbnQgZHdGbGFnczsKLSAgICBwdWJsaWMgYnl0ZSBpUGl4ZWxUeXBlOwotICAgIHB1YmxpYyBieXRlIGNDb2xvckJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZFNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNHcmVlbkJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0dyZWVuU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0JsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNCbHVlU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWxwaGFTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bVJlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUJsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUFscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjRGVwdGhCaXRzOwotICAgIHB1YmxpYyBieXRlIGNTdGVuY2lsQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQXV4QnVmZmVyczsKLSAgICBwdWJsaWMgYnl0ZSBpTGF5ZXJUeXBlOwotICAgIHB1YmxpYyBieXRlIGJSZXNlcnZlZDsKLSAgICBwdWJsaWMgaW50IGR3TGF5ZXJNYXNrOwotICAgIHB1YmxpYyBpbnQgZHdWaXNpYmxlTWFzazsKLSAgICBwdWJsaWMgaW50IGR3RGFtYWdlTWFzazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA0MDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1dHTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGI2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuaW50ZXJuYWwud2luMzI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotCi1wdWJsaWMgY2xhc3MgV0dMIHsKLQkKLXN0YXRpYyB7Ci0JTGlicmFyeS5sb2FkTGlicmFyeSgiZ2wiKTsKLX0KLQkKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdHTF9GT05UX0xJTkVTICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX0ZPTlRfUE9MWUdPTlMgICA9IDE7Ci0KLS8qIExBWUVSUExBTkVERVNDUklQVE9SIGZsYWdzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfRE9VQkxFQlVGRkVSICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1RFUkVPICAgICAgICAgICAgICA9IDB4MDAwMDAwMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9HREkgICAgICAgICA9IDB4MDAwMDAwMTA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9PUEVOR0wgICAgICA9IDB4MDAwMDAwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfREVQVEggICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfU1RFTkNJTCAgICAgICA9IDB4MDAwMDAwODA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfQUNDVU0gICAgICAgICA9IDB4MDAwMDAxMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9FWENIQU5HRSAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9DT1BZICAgICAgICAgICA9IDB4MDAwMDA0MDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfVFJBTlNQQVJFTlQgICAgICAgICA9IDB4MDAwMDEwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX1JHQkEgICAgICAgID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX0NPTE9SSU5ERVggID0gMTsKLQotLyogd2dsU3dhcExheWVyQnVmZmVycyBmbGFncyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfTUFJTl9QTEFORSAgICAgPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTIgICAgICAgPSAweDAwMDAwMDA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTMgICAgICAgPSAweDAwMDAwMDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTQgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTUgICAgICAgPSAweDAwMDAwMDIwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTYgICAgICAgPSAweDAwMDAwMDQwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTcgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTggICAgICAgPSAweDAwMDAwMTAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTkgICAgICAgPSAweDAwMDAwMjAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEwICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTExICAgICAgPSAweDAwMDAwODAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEyICAgICAgPSAweDAwMDAxMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEzICAgICAgPSAweDAwMDAyMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE0ICAgICAgPSAweDAwMDA0MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE1ICAgICAgPSAweDAwMDA4MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxICAgICAgPSAweDAwMDEwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkyICAgICAgPSAweDAwMDIwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkzICAgICAgPSAweDAwMDQwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk0ICAgICAgPSAweDAwMDgwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk1ICAgICAgPSAweDAwMTAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk2ICAgICAgPSAweDAwMjAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk3ICAgICAgPSAweDAwNDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk4ICAgICAgPSAweDAwODAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk5ICAgICAgPSAweDAxMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMCAgICAgPSAweDAyMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMSAgICAgPSAweDA0MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMiAgICAgPSAweDA4MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMyAgICAgPSAweDEwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNCAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNSAgICAgPSAweDQwMDAwMDAwOwotCi0vKiBwaXhlbCB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfUkdCQSAgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfQ09MT1JJTkRFWCAgPSAxOwotCi0vKiBsYXllciB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX01BSU5fUExBTkUgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX09WRVJMQVlfUExBTkUgICAgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1VOREVSTEFZX1BMQU5FICAgPSAoLTEpOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9ET1VCTEVCVUZGRVIgICAgICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1RFUkVPICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RSQVdfVE9fV0lORE9XICAgICAgICAgID0gMHgwMDAwMDAwNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9EUkFXX1RPX0JJVE1BUCAgICAgICAgICA9IDB4MDAwMDAwMDg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9HREkgICAgICAgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NVUFBPUlRfT1BFTkdMICAgICAgICAgID0gMHgwMDAwMDAyMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0ZPUk1BVCAgICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfTkVFRF9QQUxFVFRFICAgICAgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX05FRURfU1lTVEVNX1BBTEVUVEUgICAgID0gMHgwMDAwMDEwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TV0FQX0VYQ0hBTkdFICAgICAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1dBUF9DT1BZICAgICAgICAgICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NXQVBfTEFZRVJfQlVGRkVSUyAgICAgID0gMHgwMDAwMDgwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0FDQ0VMRVJBVEVEICAgICA9IDB4MDAwMDEwMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9ESVJFQ1REUkFXICAgICAgPSAweDAwMDAyMDAwOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgZm9yIHVzZSBpbiBDaG9vc2VQaXhlbEZvcm1hdCBvbmx5ICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfREVQVEhfRE9OVENBUkUgICAgICAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RPVUJMRUJVRkZFUl9ET05UQ0FSRSAgID0gMHg0MDAwMDAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TVEVSRU9fRE9OVENBUkUgICAgICAgICA9IDB4ODAwMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDaG9vc2VQaXhlbEZvcm1hdChpbnQgaGRjLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgRGVzY3JpYmVQaXhlbEZvcm1hdChpbnQgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgbkJ5dGVzLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR2V0UGl4ZWxGb3JtYXQoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIFNldFBpeGVsRm9ybWF0KGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIFBJWEVMRk9STUFUREVTQ1JJUFRPUiBwcGZkKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gU3dhcEJ1ZmZlcnMoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbENvcHlDb250ZXh0KGludCBoZ2xyY1NyYywgaW50IGhnbHJjRHN0LCBpbnQgbWFzayk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsQ3JlYXRlQ29udGV4dChpbnQgaGRjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xDcmVhdGVMYXllckNvbnRleHQoaW50IGhkYywgaW50IGlMYXllclBsYW5lKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVsZXRlQ29udGV4dChpbnQgaGdscmMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IHdnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0Q3VycmVudERDKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0UHJvY0FkZHJlc3MoYnl0ZVtdIGxwc3pQcm9jKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsTWFrZUN1cnJlbnQoaW50IGhkYywgaW50IGhnbHJjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsU2hhcmVMaXN0cyhpbnQgaGdscmMxLCBpbnQgaGdscmMyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHNBKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xVc2VGb250Qml0bWFwc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHMoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSkgewotCWlmIChPUy5Jc1VuaWNvZGUpIHJldHVybiB3Z2xVc2VGb250Qml0bWFwc1coaGRjLCBmaXJzdCwgY291bnQsIGxpc3RCYXNlKTsKLQlyZXR1cm4gd2dsVXNlRm9udEJpdG1hcHNBKGhkYywgZmlyc3QsIGNvdW50LCBsaXN0QmFzZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc0EoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udE91dGxpbmVzKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UsIGZsb2F0IGRldmlhdGlvbiwgZmxvYXQgZXh0cnVzaW9uLCBpbnQgZm9ybWF0LCBpbnQgbHBnbWYpIHsKLQlpZiAoT1MuSXNVbmljb2RlKSByZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzVyhoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLQlyZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzQShoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVzY3JpYmVMYXllclBsYW5lKGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIGludCBpTGF5ZXJQbGFuZSwgaW50IG5CeXRlcywgTEFZRVJQTEFORURFU0NSSVBUT1IgcGxwZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllcyhpbnQgaGRjLCBpbnQgaUxheWVyUGxhbmUsIGludCBpU3RhcnQsIGludCBjRW50cmllcywgaW50W10gcGNyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgaW50IGlTdGFydCwgaW50IGNFbnRyaWVzLCBpbnRbXSBwY3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xSZWFsaXplTGF5ZXJQYWxldHRlKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgYm9vbGVhbiBiUmVhbGl6ZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFN3YXBMYXllckJ1ZmZlcnMoaW50IGhkYywgaW50IGZ1UGxhbmVzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmFiMjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iSk5JIEdlbmVyYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJNYWMgR2VuZXJhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IlNsZWFrIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iTW96aWxsYSBHZW5lcmF0aW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iTmF0aXZlU3RhdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJJY29uIEV4ZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDNlYWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LnRvb2xzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5hcGFjaGUuYW50PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5zd3Q8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2NGIzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNToxMzoyNCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ljb25FeGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9JY29uRXhlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2I0NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ljb25FeGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIEN1c3RvbWl6ZSB0aGUgaWNvbiBvZiBhIFdpbmRvd3MgZXhlCi0gKiAKLSAqIFdBUk5JTkchIFRoaXMgY2xhc3MgaXMgbm90IHBhcnQgb2YgU1dUIEFQSS4gSXQgaXMgTk9UIEFQSS4gSXQgaXMgYW4gaW50ZXJuYWwKLSAqIHRvb2wgdGhhdCBtYXkgYmUgY2hhbmdlZCBvciByZW1vdmVkIGF0IGFueXRpbWUuCi0gKiAKLSAqIEJhc2VkIG9uIE1TRE4gIkFuIEluLURlcHRoIExvb2sgaW50byB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZSBGaWxlIEZvcm1hdCIKLSAqLwotcHVibGljIGNsYXNzIEljb25FeGUgewotCQotCSAvKioKLQkgKiBSZXBsYWNlIHRoZSBEZXNrdG9wIGljb25zIHByb3ZpZGVkIGluIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgcHJvZ3JhbQotCSAqIHdpdGggbWF0Y2hpbmcgaWNvbnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCi0JICoKLSAJICogVGFrZXMgMiBhcmd1bWVudHMKLQkgKiBhcmd1bWVudCAwOiB0aGUgV2luZG93cyBleGVjdXRhYmxlIGUuZyBjOi9lY2xpcHNlL2VjbGlwc2UuZXhlCi0JICogYXJndW1lbnQgMTogVGhlIC5pY28gZmlsZSB0byB3cml0ZSB0byB0aGUgZ2l2ZW4gZXhlY3V0YWJsZSBlLmcuIGM6L215QXBwLmljbwotCSAqCi0JICogTm90ZSAxLiBXcml0ZSBhY2Nlc3MgdG8gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyByZXF1aXJlZC4gQXMgYSByZXN1bHQsIHRoYXQKLQkgKiBwcm9ncmFtIG11c3Qgbm90IGJlIGN1cnJlbnRseSBydW5uaW5nIG9yIGVkaXRlZCBlbHNld2hlcmUuCi0JICogCi0JICogTm90ZSAyLiAgVGhlIEVjbGlwc2UgMy4xIGxhdW5jaGVyIHJlcXVpcmVzIGEgLmljbyBmaWxlIHdpdGggdGhlIGZvbGxvd2luZyA2IGltYWdlcwotCSAqIDEuIDMyeDMyLCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAyLiAxNngxNiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMy4gMTZ4MTYsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDQuIDMyeDMyLCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA1LiA0OHg0OCwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogNi4gNDh4NDgsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIEEgdXNlciBpY29uIG1hdGNoaW5nIGV4YWN0bHkgdGhlIHdpZHRoL2hlaWdodC9kZXB0aCBvZiBhbiBleGVjdXRhYmxlIGljb24gd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGV4ZWN1dGFibGUgYW5kIHdpbGwgcmVwbGFjZSB0aGF0IGV4ZWN1dGFibGUgaWNvbi4gSWYgYW4gZXhlY3V0YWJsZSBpY29uCi0JICogZG9lcyBub3QgbWF0Y2ggYSB1c2VyIGljb24sIGl0IGlzIHNpbGVudGx5IGxlZnQgYXMgaXMuCi0JICogCi0JICogTm90ZSAzLiBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBjb250ZW50IG9mIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gYW5kIG1heSBjYXVzZQotCSAqIGl0cyBjb3JydXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MubGVuZ3RoIDwgMikgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogSWNvbkV4ZSA8d2luZG93cyBleGVjdXRhYmxlPiA8aWNvIGZpbGU+Iik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCXRyeSB7Ci0JCQlJbWFnZURhdGFbXSBkYXRhID0gbnVsbDsKLQkJCQotCQkJaWYgKGFyZ3MubGVuZ3RoID09IDIpIHsKLQkJCQkvKiBJQ08gY2FzZSAqLwotCQkJCWRhdGEgPSBsb2FkZXIubG9hZChhcmdzWzFdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogQk1QIGNhc2UgLSBlYWNoIGZvbGxvd2luZyBhcmd1bWVudCBpcyBhIHNpbmdsZSBCTVAgZmlsZQotCQkJCSAqIEJNUCBpcyBoYW5kbGVkIGZvciB0ZXN0aW5nIHB1cnBvc2Ugb25seS4gVGhlIElDTyBmaWxlIGlzIHRoZQotCQkJCSAqIG9mZmljaWFsIE1pY3Jvc29mdCBmb3JtYXQgZm9yIGltYWdlIHJlc291cmNlcy4KLQkJCQkgKi8KLQkJCQlkYXRhID0gbmV3IEltYWdlRGF0YVthcmdzLmxlbmd0aCAtIDFdOwotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJCQlJbWFnZURhdGFbXSBjdXJyZW50ID0gbG9hZGVyLmxvYWQoYXJnc1tpXSk7Ci0JCQkJCWRhdGFbaSAtIDFdID0gY3VycmVudFswXTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbnQgbk1pc3NpbmcgPSB1bmxvYWRJY29ucyhhcmdzWzBdLCBkYXRhKTsKLQkJCWlmIChuTWlzc2luZyAhPSAwKSBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yIC0gIituTWlzc2luZysiIGljb24ocykgbm90IHJlcGxhY2VkIGluICIrYXJnc1swXSsiIHVzaW5nICIrYXJnc1sxXSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCS8qIEltcGxlbWVudGF0aW9uICovCi0KLQkvKiogCi0JICogUmV0cmlldmUgdGhlIERlc2t0b3AgaWNvbnMgcHJvdmlkZWQgaW4gdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBwcm9ncmFtLgotCSAqIFRoZXNlIGljb25zIGFyZSB0eXBpY2FsbHkgc2hvd24gaW4gdmFyaW91cyBwbGFjZXMgb2YgdGhlIFdpbmRvd3MgZGVza3RvcC4KLQkgKiAKLQkgKiBOb3RlLiAgVGhlIEVjbGlwc2UgMy4xIGxhdW5jaGVyIHJldHVybnMgdGhlIGZvbGxvd2luZyA2IGltYWdlcwotCSAqIDEuIDMyeDMyLCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAyLiAxNngxNiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMy4gMTZ4MTYsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDQuIDMyeDMyLCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA1LiA0OHg0OCwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogNi4gNDh4NDgsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIAotCSAqIEBwYXJhbSBwcm9ncmFtIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgZS5nIGM6L2VjbGlwc2UvZWNsaXBzZS5leGUKLQkgKi8JCi0Jc3RhdGljIEltYWdlRGF0YVtdIGxvYWRJY29ucyhTdHJpbmcgcHJvZ3JhbSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHByb2dyYW0sICJyIik7Ci0JCUljb25FeGUgaWNvbkV4ZSA9IG5ldyBJY29uRXhlKCk7Ci0JCUljb25SZXNJbmZvW10gaWNvbkluZm8gPSBpY29uRXhlLmdldEljb25zKHJhZik7Ci0JCUltYWdlRGF0YVtdIGRhdGEgPSBuZXcgSW1hZ2VEYXRhW2ljb25JbmZvLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgZGF0YVtpXSA9IGljb25JbmZvW2ldLmRhdGE7Ci0JCXJhZi5jbG9zZSgpOwotCQlyZXR1cm4gZGF0YTsKLQl9Ci0JCi0JLyoqIAotCSAqIFJlcGxhY2UgdGhlIERlc2t0b3AgaWNvbnMgcHJvdmlkZWQgaW4gdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBwcm9ncmFtCi0JICogd2l0aCBpY29ucyBwcm92aWRlZCBieSB0aGUgdXNlci4KLQkgKiAKLQkgKiBOb3RlIDEuIFdyaXRlIGFjY2VzcyB0byB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGlzIHJlcXVpcmVkLiBBcyBhIHJlc3VsdCwgdGhhdAotCSAqIHByb2dyYW0gbXVzdCBub3QgYmUgY3VycmVudGx5IHJ1bm5pbmcgb3IgZWRpdGVkIGVsc2V3aGVyZS4KLQkgKiAKLQkgKiBOb3RlIDIuIFVzZSBsb2FkSWNvbnMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBpY29ucyAod2lkdGgsIGhlaWdodCwgZGVwdGgpCi0JICogaXMgcmVxdWlyZWQgdG8gcmVwbGFjZSB0aGUgaWNvbnMgaW4gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbS4gQSB1c2VyIGljb24KLQkgKiBtYXRjaGluZyBleGFjdGx5IHRoZSB3aWR0aC9oZWlnaHQvZGVwdGggb2YgYW4gZXhlY3V0YWJsZSBpY29uIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBleGVjdXRhYmxlIGFuZCB3aWxsIHJlcGxhY2UgdGhhdCBleGVjdXRhYmxlIGljb24uIElmIGFuIGV4ZWN1dGFibGUgaWNvbgotCSAqIGRvZXMgbm90IG1hdGNoIGEgdXNlciBpY29uLCBpdCBpcyBsZWZ0IGFzIGlzLiBWZXJpZnkgdGhlIHJldHVybiB2YWx1ZSBtYXRjaGVzCi0JICogdGhlIG51bWJlciBvZiBpY29ucyB0byB3cml0ZS4gRmluYWxseSwgdXNlIGxvYWRJY29ucyBhZnRlciB0aGlzIG9wZXJhdGlvbgotCSAqIHRvIHZlcmlmeSB0aGUgaWNvbnMgaGF2ZSBjaGFuZ2VkIGFzIGV4cGVjdGVkLgotCSAqIAotCSAqIE5vdGUgMy4gVGhlIEVjbGlwc2UgMy4xIGxhdW5jaGVyIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgNiBpbWFnZXMgKGluIGFueSBvcmRlcikuCi0JICogMS4gMzJ4MzIsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDIuIDE2eDE2LCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAzLiAxNngxNiwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogNC4gMzJ4MzIsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDUuIDQ4eDQ4LCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiA2LiA0OHg0OCwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogCi0JICogTm90ZSA0LiBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBjb250ZW50IG9mIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gYW5kIG1heSBjYXVzZQotCSAqIGl0cyBjb3JydXB0aW9uLiAKLQkgKiAKLQkgKiBAcGFyYW0gcHJvZ3JhbSB0aGUgV2luZG93cyBleGVjdXRhYmxlIGUuZyBjOi9lY2xpcHNlL2VjbGlwc2UuZXhlCi0JICogQHBhcmFtIGljb25zIHRvIHdyaXRlIHRvIHRoZSBnaXZlbiBleGVjdXRhYmxlCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGljb25zIGZyb20gdGhlIG9yaWdpbmFsIHByb2dyYW0gdGhhdCB3ZXJlIG5vdCBzdWNjZXNzZnVsbHkgcmVwbGFjZWQgKDAgaWYgc3VjY2VzcykKLQkgKi8JCi0Jc3RhdGljIGludCB1bmxvYWRJY29ucyhTdHJpbmcgcHJvZ3JhbSwgSW1hZ2VEYXRhW10gaWNvbnMpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShwcm9ncmFtLCAicnciKTsKLQkJSWNvbkV4ZSBpY29uRXhlID0gbmV3IEljb25FeGUoKTsKLQkJSWNvblJlc0luZm9bXSBpY29uSW5mbyA9IGljb25FeGUuZ2V0SWNvbnMocmFmKTsKLQkJaW50IGNudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWNvbkluZm8ubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgaWNvbnMubGVuZ3RoOyBqKyspCi0JCQlpZiAoaWNvbkluZm9baV0uZGF0YS53aWR0aCA9PSBpY29uc1tqXS53aWR0aCAmJiAKLQkJCQlpY29uSW5mb1tpXS5kYXRhLmhlaWdodCA9PSBpY29uc1tqXS5oZWlnaHQgJiYgCi0JCQkJaWNvbkluZm9baV0uZGF0YS5kZXB0aCA9PSBpY29uc1tqXS5kZXB0aCkgewotCQkJCXJhZi5zZWVrKGljb25JbmZvW2ldLm9mZnNldCk7Ci0JCQkJdW5sb2FkSWNvbihyYWYsIGljb25zW2pdKTsKLQkJCQljbnQrKzsKLQkJCX0KLQkJfQotCQlyYWYuY2xvc2UoKTsKLQkJcmV0dXJuIGljb25JbmZvLmxlbmd0aCAtIGNudDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIyMDA1MDEyNCI7Ci0JCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEljb25SZXNJbmZvIHsKLQkJSW1hZ2VEYXRhIGRhdGE7Ci0JCWludCBvZmZzZXQ7Ci0JCWludCBzaXplOwotCX0KLQkKLQlJY29uUmVzSW5mb1tdIGljb25JbmZvID0gbnVsbDsKLQlpbnQgaWNvbkNudDsKLQkKLQlJY29uUmVzSW5mb1tdIGdldEljb25zKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpY29uSW5mbyA9IG5ldyBJY29uUmVzSW5mb1s0XTsKLQkJaWNvbkNudCA9IDA7Ci0JCUlNQUdFX0RPU19IRUFERVIgaW1hZ2VEb3NIZWFkZXIgPSBuZXcgSU1BR0VfRE9TX0hFQURFUigpOwotCQlyZWFkKHJhZiwgaW1hZ2VEb3NIZWFkZXIpOwotCQlpZiAoaW1hZ2VEb3NIZWFkZXIuZV9tYWdpYyAhPSBJTUFHRV9ET1NfU0lHTkFUVVJFKSByZXR1cm4gbnVsbDsKLQkJaW50IGltYWdlTnRIZWFkZXJzT2Zmc2V0ID0gaW1hZ2VEb3NIZWFkZXIuZV9sZmFuZXc7Ci0JCXJhZi5zZWVrKGltYWdlTnRIZWFkZXJzT2Zmc2V0KTsKLQkJSU1BR0VfTlRfSEVBREVSUyBpbWFnZU50SGVhZGVycyA9IG5ldyBJTUFHRV9OVF9IRUFERVJTKCk7Ci0JCXJlYWQocmFmLCBpbWFnZU50SGVhZGVycyk7Ci0JCWlmIChpbWFnZU50SGVhZGVycy5TaWduYXR1cmUgIT0gSU1BR0VfTlRfU0lHTkFUVVJFKSByZXR1cm4gbnVsbDsKLQkJCi0JCS8vIER1bXBSZXNvdXJjZXMKLQkJaW50IHJlc291cmNlc1JWQSA9IGltYWdlTnRIZWFkZXJzLk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX1JFU09VUkNFXS5WaXJ0dWFsQWRkcmVzczsKLQkJaWYgKHJlc291cmNlc1JWQSA9PSAwKSByZXR1cm4gbnVsbDsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIiogUmVzb3VyY2VzIChSVkE9ICIrcmVzb3VyY2VzUlZBKyIpIik7Ci0JCUlNQUdFX1NFQ1RJT05fSEVBREVSIGltYWdlU2VjdGlvbkhlYWRlciA9IG5ldyBJTUFHRV9TRUNUSU9OX0hFQURFUigpOwotCQlpbnQgZmlyc3RTZWN0aW9uT2Zmc2V0ID0gaW1hZ2VOdEhlYWRlcnNPZmZzZXQgKyBJTUFHRV9OVF9IRUFERVJTLkZJRUxEX09GRlNFVF9PcHRpb25hbEhlYWRlciArIGltYWdlTnRIZWFkZXJzLkZpbGVIZWFkZXIuU2l6ZU9mT3B0aW9uYWxIZWFkZXI7Ci0JCXJhZi5zZWVrKGZpcnN0U2VjdGlvbk9mZnNldCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZU50SGVhZGVycy5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnM7IGkrKykgewotCQkJcmVhZChyYWYsIGltYWdlU2VjdGlvbkhlYWRlcik7Ci0JCQlpZiAocmVzb3VyY2VzUlZBID49IGltYWdlU2VjdGlvbkhlYWRlci5WaXJ0dWFsQWRkcmVzcyAmJiByZXNvdXJjZXNSVkEgPCBpbWFnZVNlY3Rpb25IZWFkZXIuVmlydHVhbEFkZHJlc3MgKyBpbWFnZVNlY3Rpb25IZWFkZXIuTWlzY19WaXJ0dWFsU2l6ZSkgewotCQkJCS8vIGNvdWxkIGNoZWNrIHRoZSBpbWFnZVNlY3Rpb25IZWFkZXIgbmFtZSBpcyAucnNyYwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIWZvdW5kKSByZXR1cm4gbnVsbDsKLQkJaW50IGRlbHRhID0gaW1hZ2VTZWN0aW9uSGVhZGVyLlZpcnR1YWxBZGRyZXNzIC0gaW1hZ2VTZWN0aW9uSGVhZGVyLlBvaW50ZXJUb1Jhd0RhdGE7Ci0JCWludCBpbWFnZVJlc291cmNlRGlyZWN0b3J5T2Zmc2V0ID0gcmVzb3VyY2VzUlZBIC0gZGVsdGE7Ci0JCWR1bXBSZXNvdXJjZURpcmVjdG9yeShyYWYsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQsIGRlbHRhLCAwLCAwLCBmYWxzZSk7Ci0JCWlmIChpY29uQ250IDwgaWNvbkluZm8ubGVuZ3RoKSB7Ci0JCQlJY29uUmVzSW5mb1tdIG5ld0FycmF5ID0gbmV3IEljb25SZXNJbmZvW2ljb25DbnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShpY29uSW5mbywgMCwgbmV3QXJyYXksIDAsIGljb25DbnQpOwotCQkJaWNvbkluZm8gPSBuZXdBcnJheTsKLQkJfQotCQlyZXR1cm4gaWNvbkluZm87Ci0JfQotCi12b2lkIGR1bXBSZXNvdXJjZURpcmVjdG9yeShSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQsIGludCByZXNvdXJjZUJhc2UsIGludCBkZWx0YSwgaW50IHR5cGUsIGludCBsZXZlbCwgYm9vbGVhbiBydF9pY29uX3Jvb3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIExFVkVMICIrbGV2ZWwpOwotCi0JSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIGltYWdlUmVzb3VyY2VEaXJlY3RvcnkgPSBuZXcgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKCk7Ci0JcmFmLnNlZWsoaW1hZ2VSZXNvdXJjZURpcmVjdG9yeU9mZnNldCk7Ci0JcmVhZChyYWYsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnkpOwotCi0JaWYgKERFQlVHKSB7Ci0JCVN0cmluZyBzVHlwZSA9ICIiK3R5cGU7Ci0JCS8vIGxldmVsIDEgcmVzb3VyY2VzIGFyZSByZXNvdXJjZSB0eXBlcwotCQlpZiAobGV2ZWwgPT0gMSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJfX19fX19fX19fX19fX19fX19fX19fX19fX18iKTsKLQkJCWlmICh0eXBlID09IFJUX0lDT04pIHNUeXBlID0gIlJUX0lDT04iOwotCQkJaWYgKHR5cGUgPT0gUlRfR1JPVVBfSUNPTikgc1R5cGUgPSAiUlRfR1JPVVBfSUNPTiI7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBEaXJlY3RvcnkgWyIrc1R5cGUrIl0iKyIgKE5hbWVkICIraW1hZ2VSZXNvdXJjZURpcmVjdG9yeS5OdW1iZXJPZk5hbWVkRW50cmllcysiLCBJRCAiK2ltYWdlUmVzb3VyY2VEaXJlY3RvcnkuTnVtYmVyT2ZJZEVudHJpZXMrIikiKTsKLQl9Ci0vLwlpbnQgSVJERV9TdGFydE9mZnNldCA9IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQgKyBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkuU0laRU9GOwkKLQlJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUllbXSBpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllcyA9IG5ldyBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUllbaW1hZ2VSZXNvdXJjZURpcmVjdG9yeS5OdW1iZXJPZklkRW50cmllc107Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllcy5sZW5ndGg7IGkrKykgewotCQlpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXSA9IG5ldyBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkoKTsKLQkJcmVhZChyYWYsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllcy5sZW5ndGg7IGkrKykgewotCQlpZiAoaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV0uRGF0YUlzRGlyZWN0b3J5KSB7Ci0JCQlkdW1wUmVzb3VyY2VEaXJlY3RvcnkocmFmLCBpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXS5PZmZzZXRUb0RpcmVjdG9yeSArIHJlc291cmNlQmFzZSwgcmVzb3VyY2VCYXNlLCBkZWx0YSwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV0uSWQsIGxldmVsICsgMSwgcnRfaWNvbl9yb290ID8gdHJ1ZSA6IHR5cGUgPT0gUlRfSUNPTik7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBSZXNvdXJjZSBmb3VuZAotCQkJLy8vIHBSZXNEaXJFbnRyeS0+TmFtZQotCQkJSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZIGlyZGUgPSBpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXTsKLQkJCUlNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkgZGF0YSA9IG5ldyBJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZKCk7Ci0JCQlyYWYuc2VlayhpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXS5PZmZzZXRUb0RhdGEgKyByZXNvdXJjZUJhc2UpOwotCQkJcmVhZChyYWYsIGRhdGEpOwotCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIElkICIraXJkZS5JZCsiIERhdGEgT2Zmc2V0IFJWQSAiK2RhdGEuT2Zmc2V0VG9EYXRhKyIsIFNpemUgIitkYXRhLlNpemUpOwotCQkJaWYgKHJ0X2ljb25fcm9vdCkgewotCQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJpY29uY250ICIraWNvbkNudCsiIHwiK2ljb25JbmZvLmxlbmd0aCk7Ci0JCQkJaWNvbkluZm9baWNvbkNudF0gPSBuZXcgSWNvblJlc0luZm8oKTsKLQkJCQlpY29uSW5mb1tpY29uQ250XS5kYXRhID0gcGFyc2VJY29uKHJhZiwgZGF0YS5PZmZzZXRUb0RhdGEgLSBkZWx0YSwgZGF0YS5TaXplKTsKLQkJCQlpY29uSW5mb1tpY29uQ250XS5vZmZzZXQgPSBkYXRhLk9mZnNldFRvRGF0YSAtIGRlbHRhOwotCQkJCWljb25JbmZvW2ljb25DbnRdLnNpemUgPSBkYXRhLlNpemU7CQotCQkJCWljb25DbnQrKzsKLQkJCQlpZiAoaWNvbkNudCA9PSBpY29uSW5mby5sZW5ndGgpIHsKLQkJCQkJSWNvblJlc0luZm9bXSBuZXdBcnJheSA9IG5ldyBJY29uUmVzSW5mb1tpY29uSW5mby5sZW5ndGggKyA0XTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShpY29uSW5mbywgMCwgbmV3QXJyYXksIDAsIGljb25JbmZvLmxlbmd0aCk7Ci0JCQkJCWljb25JbmZvID0gbmV3QXJyYXk7Ci0JCQkJfQotCQkJfQotCQl9Ci0gCX0KLX0KLQotc3RhdGljIEltYWdlRGF0YSBwYXJzZUljb24oUmFuZG9tQWNjZXNzRmlsZSByYWYsIGludCBvZmZzZXQsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJhZi5zZWVrKG9mZnNldCk7Ci0JQklUTUFQSU5GTyBiaXRtYXBJbmZvID0gbmV3IEJJVE1BUElORk8oKTsKLQlyZWFkKHJhZiwgYml0bWFwSW5mbyk7Ci0JYml0bWFwSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgLz0gMjsKLQlpbnQgd2lkdGggPSBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoOwotCWludCBoZWlnaHQgPSBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodDsKLQlpbnQgZGVwdGggPSBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50OwotCi0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGxvYWRQYWxldHRlKGJpdG1hcEluZm8uYm1pSGVhZGVyLCByYWYpOwotCWJ5dGVbXSBzaGFwZURhdGEgPSBsb2FkRGF0YShiaXRtYXBJbmZvLmJtaUhlYWRlciwgcmFmKTsKLQliaXRtYXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ID0gMTsKLQlieXRlW10gbWFza0RhdGEgPSBsb2FkRGF0YShiaXRtYXBJbmZvLmJtaUhlYWRlciwgcmFmKTsKLQltYXNrRGF0YSA9IGNvbnZlcnRQYWQobWFza0RhdGEsIHdpZHRoLCBoZWlnaHQsIDEsIDQsIDIpOwotCWJpdEludmVydERhdGEobWFza0RhdGEsIDAsIG1hc2tEYXRhLmxlbmd0aCk7Ci0JcmV0dXJuIEltYWdlRGF0YS5pbnRlcm5hbF9uZXcoCi0JCXdpZHRoLAotCQloZWlnaHQsCi0JCWRlcHRoLAotCQlwYWxldHRlLAotCQk0LAotCQlzaGFwZURhdGEsCi0JCTIsCi0JCW1hc2tEYXRhLAotCQludWxsLAotCQktMSwKLQkJLTEsCi0JCVNXVC5JTUFHRV9JQ08sCi0JCTAsCi0JCTAsCi0JCTAsCi0JCTApOwotfQotCi1zdGF0aWMgYnl0ZVtdIGJpdEludmVydERhdGEoYnl0ZVtdIGRhdGEsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKLQkvLyBEZXN0cnVjdGl2ZWx5IGJpdCBpbnZlcnQgZGF0YSBpbiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheS4KLQlmb3IgKGludCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspIHsKLQkJZGF0YVtpXSA9IChieXRlKSgyNTUgLSBkYXRhW2kgLSBzdGFydEluZGV4XSk7Ci0JfQotCXJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgZmluYWwgYnl0ZVtdIGNvbnZlcnRQYWQoYnl0ZVtdIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgcGFkLCBpbnQgbmV3UGFkKSB7Ci0JaWYgKHBhZCA9PSBuZXdQYWQpIHJldHVybiBkYXRhOwotCWludCBzdHJpZGUgPSAod2lkdGggKiBkZXB0aCArIDcpIC8gODsKLQlpbnQgYnBsID0gKHN0cmlkZSArIChwYWQgLSAxKSkgLyBwYWQgKiBwYWQ7Ci0JaW50IG5ld0JwbCA9IChzdHJpZGUgKyAobmV3UGFkIC0gMSkpIC8gbmV3UGFkICogbmV3UGFkOwotCWJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbaGVpZ2h0ICogbmV3QnBsXTsKLQlpbnQgc3JjSW5kZXggPSAwLCBkZXN0SW5kZXggPSAwOwotCWZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBzcmNJbmRleCwgbmV3RGF0YSwgZGVzdEluZGV4LCBuZXdCcGwpOwotCQlzcmNJbmRleCArPSBicGw7Ci0JCWRlc3RJbmRleCArPSBuZXdCcGw7Ci0JfQotCXJldHVybiBuZXdEYXRhOwotfQotc3RhdGljIFBhbGV0dGVEYXRhIGxvYWRQYWxldHRlKEJJVE1BUElORk9IRUFERVIgYmloLCBSYW5kb21BY2Nlc3NGaWxlIHJhZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbnQgZGVwdGggPSBiaWguYmlCaXRDb3VudDsKLQlpZiAoZGVwdGggPD0gOCkgewotCQlpbnQgbnVtQ29sb3JzID0gYmloLmJpQ2xyVXNlZDsKLQkJaWYgKG51bUNvbG9ycyA9PSAwKSB7Ci0JCQludW1Db2xvcnMgPSAxIDw8IGRlcHRoOwotCQl9IGVsc2UgewotCQkJaWYgKG51bUNvbG9ycyA+IDI1NikKLQkJCQludW1Db2xvcnMgPSAyNTY7Ci0JCX0KLQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW251bUNvbG9ycyAqIDRdOwotCQlyYWYucmVhZChidWYpOwotCQlyZXR1cm4gcGFsZXR0ZUZyb21CeXRlcyhidWYsIG51bUNvbG9ycyk7Ci0JfQotCWlmIChkZXB0aCA9PSAxNikgcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweDdDMDAsIDB4M0UwLCAweDFGKTsKLQlpZiAoZGVwdGggPT0gMjQpIHJldHVybiBuZXcgUGFsZXR0ZURhdGEoMHhGRiwgMHhGRjAwLCAweEZGMDAwMCk7Ci0JcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweEZGMDAsIDB4RkYwMDAwLCAweEZGMDAwMDAwKTsKLX0KLXN0YXRpYyBQYWxldHRlRGF0YSBwYWxldHRlRnJvbUJ5dGVzKGJ5dGVbXSBieXRlcywgaW50IG51bUNvbG9ycykgewotCWludCBieXRlc09mZnNldCA9IDA7Ci0JUkdCW10gY29sb3JzID0gbmV3IFJHQltudW1Db2xvcnNdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sb3JzOyBpKyspIHsKLQkJY29sb3JzW2ldID0gbmV3IFJHQihieXRlc1tieXRlc09mZnNldCArIDJdICYgMHhGRiwKLQkJCWJ5dGVzW2J5dGVzT2Zmc2V0ICsgMV0gJiAweEZGLAotCQkJYnl0ZXNbYnl0ZXNPZmZzZXRdICYgMHhGRik7Ci0JCWJ5dGVzT2Zmc2V0ICs9IDQ7Ci0JfQotCXJldHVybiBuZXcgUGFsZXR0ZURhdGEoY29sb3JzKTsKLX0KLXN0YXRpYyBieXRlW10gbG9hZERhdGEoQklUTUFQSU5GT0hFQURFUiBiaWgsIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBzdHJpZGUgPSAoYmloLmJpV2lkdGggKiBiaWguYmlCaXRDb3VudCArIDcpIC8gODsKLQlzdHJpZGUgPSAoc3RyaWRlICsgMykgLyA0ICogNDsgLy8gUm91bmQgdXAgdG8gNCBieXRlIG11bHRpcGxlCi0JYnl0ZVtdIGRhdGEgPSBsb2FkRGF0YShiaWgsIHJhZiwgc3RyaWRlKTsKLQlmbGlwU2NhbkxpbmVzKGRhdGEsIHN0cmlkZSwgYmloLmJpSGVpZ2h0KTsKLQlyZXR1cm4gZGF0YTsKLX0KLXN0YXRpYyB2b2lkIGZsaXBTY2FuTGluZXMoYnl0ZVtdIGRhdGEsIGludCBzdHJpZGUsIGludCBoZWlnaHQpIHsKLQlpbnQgaTEgPSAwOwotCWludCBpMiA9IChoZWlnaHQgLSAxKSAqIHN0cmlkZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodCAvIDI7IGkrKykgewotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc3RyaWRlOyBpbmRleCsrKSB7Ci0JCQlieXRlIGIgPSBkYXRhW2luZGV4ICsgaTFdOwotCQkJZGF0YVtpbmRleCArIGkxXSA9IGRhdGFbaW5kZXggKyBpMl07Ci0JCQlkYXRhW2luZGV4ICsgaTJdID0gYjsKLQkJfQotCQlpMSArPSBzdHJpZGU7Ci0JCWkyIC09IHN0cmlkZTsKLQl9Ci19Ci1zdGF0aWMgYnl0ZVtdIGxvYWREYXRhKEJJVE1BUElORk9IRUFERVIgYmloLCBSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IHN0cmlkZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbnQgZGF0YVNpemUgPSBiaWguYmlIZWlnaHQgKiBzdHJpZGU7Ci0JYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtkYXRhU2l6ZV07Ci0JaW50IGNtcCA9IGJpaC5iaUNvbXByZXNzaW9uOwotCWlmIChjbXAgPT0gMCkgeyAvLyBCTVBfTk9fQ09NUFJFU1NJT04KLQkJcmFmLnJlYWQoZGF0YSk7Ci0JfSBlbHNlIHsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIklDTyBjYW5ub3QgYmUgY29tcHJlc3NlZD8iKTsKLQl9Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyB2b2lkIHVubG9hZEljb24oUmFuZG9tQWNjZXNzRmlsZSByYWYsIEltYWdlRGF0YSBpY29uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBzaXplSW1hZ2UgPSAoKChpY29uLndpZHRoICogaWNvbi5kZXB0aCArIDMxKSAvIDMyICogNCkgKwotCQkoKGljb24ud2lkdGggKyAzMSkgLyAzMiAqIDQpKSAqIGljb24uaGVpZ2h0OwotCXdyaXRlNChyYWYsIEJNUEhlYWRlckZpeGVkU2l6ZSk7Ci0Jd3JpdGU0KHJhZiwgaWNvbi53aWR0aCk7Ci0Jd3JpdGU0KHJhZiwgaWNvbi5oZWlnaHQgKiAyKTsKLQl3cml0ZVUyKHJhZiwgMSk7Ci0Jd3JpdGVVMihyYWYsIGljb24uZGVwdGgpOwotCXdyaXRlNChyYWYsIDApOwotCXdyaXRlNChyYWYsIHNpemVJbWFnZSk7Ci0Jd3JpdGU0KHJhZiwgMCk7Ci0Jd3JpdGU0KHJhZiwgMCk7Ci0Jd3JpdGU0KHJhZiwgaWNvbi5wYWxldHRlLmNvbG9ycyAhPSBudWxsID8gaWNvbi5wYWxldHRlLmNvbG9ycy5sZW5ndGggOiAwKTsKLQl3cml0ZTQocmFmLCAwKTsKLQkKLQlieXRlW10gcmdicyA9IHBhbGV0dGVUb0J5dGVzKGljb24ucGFsZXR0ZSk7Ci0JcmFmLndyaXRlKHJnYnMpOwotCXVubG9hZFNoYXBlRGF0YShyYWYsIGljb24pOwotCXVubG9hZE1hc2tEYXRhKHJhZiwgaWNvbik7Ci19Ci1zdGF0aWMgYnl0ZVtdIHBhbGV0dGVUb0J5dGVzKFBhbGV0dGVEYXRhIHBhbCkgewotCWludCBuID0gcGFsLmNvbG9ycyA9PSBudWxsID8gMCA6IChwYWwuY29sb3JzLmxlbmd0aCA8IDI1NiA/IHBhbC5jb2xvcnMubGVuZ3RoIDogMjU2KTsKLQlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtuICogNF07Ci0JaW50IG9mZnNldCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUkdCIGNvbCA9IHBhbC5jb2xvcnNbaV07Ci0JCWJ5dGVzW29mZnNldF0gPSAoYnl0ZSljb2wuYmx1ZTsKLQkJYnl0ZXNbb2Zmc2V0ICsgMV0gPSAoYnl0ZSljb2wuZ3JlZW47Ci0JCWJ5dGVzW29mZnNldCArIDJdID0gKGJ5dGUpY29sLnJlZDsKLQkJb2Zmc2V0ICs9IDQ7Ci0JfQotCXJldHVybiBieXRlczsKLX0KLXN0YXRpYyB2b2lkIHVubG9hZE1hc2tEYXRhKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJbWFnZURhdGEgaWNvbikgewotCUltYWdlRGF0YSBtYXNrID0gaWNvbi5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JaW50IGJwbCA9IChpY29uLndpZHRoICsgNykgLyA4OwotCWludCBwYWQgPSBtYXNrLnNjYW5saW5lUGFkOwotCWludCBzcmNCcGwgPSAoYnBsICsgcGFkIC0gMSkgLyBwYWQgKiBwYWQ7Ci0JaW50IGRlc3RCcGwgPSAoYnBsICsgMykgLyA0ICogNDsKLQlieXRlW10gYnVmID0gbmV3IGJ5dGVbZGVzdEJwbF07Ci0JaW50IG9mZnNldCA9IChpY29uLmhlaWdodCAtIDEpICogc3JjQnBsOwotCWJ5dGVbXSBkYXRhID0gbWFzay5kYXRhOwotCXRyeSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWNvbi5oZWlnaHQ7IGkrKykgewotCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBvZmZzZXQsIGJ1ZiwgMCwgYnBsKTsKLQkJCWJpdEludmVydERhdGEoYnVmLCAwLCBicGwpOwotCQkJcmFmLndyaXRlKGJ1ZiwgMCwgZGVzdEJwbCk7Ci0JCQlvZmZzZXQgLT0gc3JjQnBsOwotCQl9Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci19Ci1zdGF0aWMgdm9pZCB1bmxvYWRTaGFwZURhdGEoUmFuZG9tQWNjZXNzRmlsZSByYWYsIEltYWdlRGF0YSBpY29uKSB7Ci0JaW50IGJwbCA9IChpY29uLndpZHRoICogaWNvbi5kZXB0aCArIDcpIC8gODsKLQlpbnQgcGFkID0gaWNvbi5zY2FubGluZVBhZDsKLQlpbnQgc3JjQnBsID0gKGJwbCArIHBhZCAtIDEpIC8gcGFkICogcGFkOwotCWludCBkZXN0QnBsID0gKGJwbCArIDMpIC8gNCAqIDQ7Ci0JYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2Rlc3RCcGxdOwotCWludCBvZmZzZXQgPSAoaWNvbi5oZWlnaHQgLSAxKSAqIHNyY0JwbDsKLQlieXRlW10gZGF0YSA9IGljb24uZGF0YTsKLQl0cnkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGljb24uaGVpZ2h0OyBpKyspIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgb2Zmc2V0LCBidWYsIDAsIGJwbCk7Ci0JCQlyYWYud3JpdGUoYnVmLCAwLCBkZXN0QnBsKTsKLQkJCW9mZnNldCAtPSBzcmNCcGw7Ci0JCX0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLX0KLXN0YXRpYyBib29sZWFuIHJlYWRJY29uR3JvdXAoUmFuZG9tQWNjZXNzRmlsZSByYWYsIGludCBvZmZzZXQsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJhZi5zZWVrKG9mZnNldCk7Ci0JTkVXSEVBREVSIG5ld0hlYWRlciA9IG5ldyBORVdIRUFERVIoKTsKLQlyZWFkKHJhZiwgbmV3SGVhZGVyKTsKLQlpZiAobmV3SGVhZGVyLlJlc1R5cGUgIT0gUkVTX0lDT04pIHJldHVybiBmYWxzZTsKLQlSRVNESVJbXSByZXNEaXIgPSBuZXcgUkVTRElSW25ld0hlYWRlci5SZXNDb3VudF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdIZWFkZXIuUmVzQ291bnQ7IGkrKykgewotCQlyZXNEaXJbaV0gPSBuZXcgUkVTRElSKCk7Ci0JCXJlYWQocmFmLCByZXNEaXJbaV0pOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgY29weUZpbGUoU3RyaW5nIHNyYywgU3RyaW5nIGRzdCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyYyk7Ci0JRmlsZSBkc3RGaWxlID0gbmV3IEZpbGUoZHN0KTsKLQlGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyY0ZpbGUpOwotCUZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZHN0RmlsZSk7Ci0JaW50IGM7Ci0Jd2hpbGUgKChjID0gaW4ucmVhZCgpKSAhPSAtMSkgb3V0LndyaXRlKGMpOyAKLQlpbi5jbG9zZSgpOwotCW91dC5jbG9zZSgpOwotfQotCi0vKiBJTyB1dGlsaXRpZXMgdG8gcGFyc2UgV2luZG93cyBleGVjdXRhYmxlICovCi1zdGF0aWMgZmluYWwgaW50IElNQUdFX0RPU19TSUdOQVRVUkUgPSAweDVhNGQ7Ci1zdGF0aWMgZmluYWwgaW50IElNQUdFX05UX1NJR05BVFVSRSA9IDB4MDAwMDQ1NTA7Ci1zdGF0aWMgZmluYWwgaW50IElNQUdFX0RJUkVDVE9SWV9FTlRSWV9SRVNPVVJDRSA9IDI7Ci1zdGF0aWMgZmluYWwgaW50IFJFU19JQ09OID0gMTsKLXN0YXRpYyBmaW5hbCBpbnQgUlRfSUNPTiA9IDM7Ci1zdGF0aWMgZmluYWwgaW50IFJUX0dST1VQX0lDT04gPSAxNDsKLXN0YXRpYyBmaW5hbCBpbnQgQk1QSGVhZGVyRml4ZWRTaXplID0gNDA7Ci0JCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX0RPU19IRUFERVIgewotCWludCBlX21hZ2ljOyAvLyBXT1JECi0JaW50IGVfY2JscDsgLy8gV09SRAotCWludCBlX2NwOyAvLyBXT1JECi0JaW50IGVfY3JsYzsgLy8gV09SRAotCWludCBlX2NwYXJoZHI7IC8vIFdPUkQKLQlpbnQgZV9taW5hbGxvYzsgLy8gV09SRAotCWludCBlX21heGFsbG9jOyAvLyBXT1JECi0JaW50IGVfc3M7IC8vIFdPUkQKLQlpbnQgZV9zcDsgLy8gV09SRAotCWludCBlX2NzdW07IC8vIFdPUkQKLQlpbnQgZV9pcDsgLy8gV09SRAotCWludCBlX2NzOyAvLyBXT1JECi0JaW50IGVfbGZhcmxjOyAvLyBXT1JECi0JaW50IGVfb3ZubzsgLy8gV09SRAotCWludFtdIGVfcmVzID0gbmV3IGludFs0XTsgLy8gV09SRFs0XQotCWludCBlX29lbWlkOyAvLyBXT1JECi0JaW50IGVfb2VtaW5mbzsgLy8gV09SRAotCWludFtdIGVfcmVzMiA9IG5ldyBpbnRbMTBdOyAvLyBXT1JEWzEwXQotCWludCBlX2xmYW5ldzsgLy8gTE9ORwotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX0ZJTEVfSEVBREVSIHsKLQlpbnQgTWFjaGluZTsgLy8gV09SRAotCWludCBOdW1iZXJPZlNlY3Rpb25zOyAvLyBXT1JECi0JaW50IFRpbWVEYXRlU3RhbXA7IC8vIERXT1JECi0JaW50IFBvaW50ZXJUb1N5bWJvbFRhYmxlOyAvLyBEV09SRAotCWludCBOdW1iZXJPZlN5bWJvbHM7IC8vIERXT1JECi0JaW50IFNpemVPZk9wdGlvbmFsSGVhZGVyOyAvLyBXT1JECi0JaW50IENoYXJhY3RlcmlzdGljczsgLy8gV09SRAotfTsKLQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9EQVRBX0RJUkVDVE9SWSB7Ci0JaW50IFZpcnR1YWxBZGRyZXNzOyAvLyBEV09SRAotCWludCBTaXplOyAvLyBEV09SRAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX09QVElPTkFMX0hFQURFUiB7Ci0JaW50IE1hZ2ljOyAvLyBXT1JECi0JaW50IE1ham9yTGlua2VyVmVyc2lvbjsgLy8gQllURQotCWludCBNaW5vckxpbmtlclZlcnNpb247IC8vIEJZVEUKLQlpbnQgU2l6ZU9mQ29kZTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mSW5pdGlhbGl6ZWREYXRhOyAvLyBEV09SRAotCWludCBTaXplT2ZVbmluaXRpYWxpemVkRGF0YTsgLy8gRFdPUkQKLQlpbnQgQWRkcmVzc09mRW50cnlQb2ludDsgLy8gRFdPUkQKLQlpbnQgQmFzZU9mQ29kZTsgLy8gRFdPUkQKLQlpbnQgQmFzZU9mRGF0YTsgLy8gRFdPUkQKLQlpbnQgSW1hZ2VCYXNlOyAvLyBEV09SRAotCWludCBTZWN0aW9uQWxpZ25tZW50OyAvLyBEV09SRAotCWludCBGaWxlQWxpZ25tZW50OyAvLyBEV09SRAotCWludCBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOyAvLyBXT1JECi0JaW50IE1ham9ySW1hZ2VWZXJzaW9uOyAvLyBXT1JECi0JaW50IE1pbm9ySW1hZ2VWZXJzaW9uOyAvLyBXT1JECi0JaW50IE1ham9yU3Vic3lzdGVtVmVyc2lvbjsgLy8gV09SRAotCWludCBNaW5vclN1YnN5c3RlbVZlcnNpb247IC8vIFdPUkQKLQlpbnQgV2luMzJWZXJzaW9uVmFsdWU7IC8vIERXT1JECi0JaW50IFNpemVPZkltYWdlOyAvLyBEV09SRAotCWludCBTaXplT2ZIZWFkZXJzOyAvLyBEV09SRAotCWludCBDaGVja1N1bTsgLy8gRFdPUkQKLQlpbnQgU3Vic3lzdGVtOyAvLyBXT1JECi0JaW50IERsbENoYXJhY3RlcmlzdGljczsgLy8gV09SRAotCWludCBTaXplT2ZTdGFja1Jlc2VydmU7IC8vIERXT1JECi0JaW50IFNpemVPZlN0YWNrQ29tbWl0OyAvLyBEV09SRAotCWludCBTaXplT2ZIZWFwUmVzZXJ2ZTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mSGVhcENvbW1pdDsgLy8gRFdPUkQKLQlpbnQgTG9hZGVyRmxhZ3M7IC8vIERXT1JECi0JaW50IE51bWJlck9mUnZhQW5kU2l6ZXM7IC8vIERXT1JECi0JSU1BR0VfREFUQV9ESVJFQ1RPUllbXSBEYXRhRGlyZWN0b3J5ID0gbmV3IElNQUdFX0RBVEFfRElSRUNUT1JZWzE2XTsKLX0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfTlRfSEVBREVSUyB7Ci0JaW50IFNpZ25hdHVyZTsgLy8gRFdPUkQKLQlJTUFHRV9GSUxFX0hFQURFUiBGaWxlSGVhZGVyID0gbmV3IElNQUdFX0ZJTEVfSEVBREVSKCk7Ci0JSU1BR0VfT1BUSU9OQUxfSEVBREVSIE9wdGlvbmFsSGVhZGVyID0gbmV3IElNQUdFX09QVElPTkFMX0hFQURFUigpOwotCWZpbmFsIHN0YXRpYyBpbnQgRklFTERfT0ZGU0VUX09wdGlvbmFsSGVhZGVyID0gMjQ7ICAKLX0KLQkKLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfU0VDVElPTl9IRUFERVIgewotCWludFtdIE5hbWUgPSBuZXcgaW50WzhdOyAvLyBCWVRFWzhdCi0JaW50IE1pc2NfVmlydHVhbFNpemU7IC8vIERXT1JEICh1bmlvbiBNaXNjIHsgRFdPUkQgUGh5c2ljYWxBZGRyZXNzOyBEV09SRCBWaXJ0dWFsU2l6ZSB9Ci0JaW50IFZpcnR1YWxBZGRyZXNzOyAvLyBEV09SRAotCWludCBTaXplT2ZSYXdEYXRhOyAvLyBEV09SRAotCWludCBQb2ludGVyVG9SYXdEYXRhOyAvLyBEV09SRAotCWludCBQb2ludGVyVG9SZWxvY2F0aW9uczsgLy8gRFdPUkQKLQlpbnQgUG9pbnRlclRvTGluZW51bWJlcnM7IC8vIERXT1JECi0JaW50IE51bWJlck9mUmVsb2NhdGlvbnM7IC8vIFdPUkQKLQlpbnQgTnVtYmVyT2ZMaW5lbnVtYmVyczsgLy8gV09SRAotCWludCBDaGFyYWN0ZXJpc3RpY3M7IC8vIERXT1JECi19OwotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSB7Ci0JaW50IENoYXJhY3RlcmlzdGljczsgLy8gRFdPUkQKLQlpbnQgVGltZURhdGVTdGFtcDsgLy8gRFdPUkQKLQlpbnQgTWFqb3JWZXJzaW9uOyAvLyBXT1JECi0JaW50IE1pbm9yVmVyc2lvbjsgLy8gV09SRAotCWludCBOdW1iZXJPZk5hbWVkRW50cmllczsgLy8gV09SRCAtIHVzZWQKLQlpbnQgTnVtYmVyT2ZJZEVudHJpZXM7IC8vIFdPUkQgLSB1c2VkCi0JZmluYWwgc3RhdGljIGludCBTSVpFT0YgPSAxNjsKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkgewotCS8vIHVuaW9uCi0JaW50IE5hbWVPZmZzZXQ7IC8vIERXT1JEIDMxIGJpdHMKLQlib29sZWFuIE5hbWVJc1N0cmluZzsgLy8gRFdPUkQgMSBiaXQKLQlpbnQgTmFtZTsgLy8gRFdPUkQKLQlpbnQgSWQ7IC8vIFdPUkQKLQkvLyB1bmlvbgotCWludCBPZmZzZXRUb0RhdGE7IC8vIERXT1JECi0JaW50IE9mZnNldFRvRGlyZWN0b3J5OyAvLyBEV09SRCAzMSBiaXRzCi0JYm9vbGVhbiBEYXRhSXNEaXJlY3Rvcnk7IC8vIERXT1JEIDEgYml0Ci19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSB7Ci0JaW50IE9mZnNldFRvRGF0YTsgLy8gRFdPUkQKLQlpbnQgU2l6ZTsgLy8gRFdPUkQKLQlpbnQgQ29kZVBhZ2U7IC8vIERXT1JECi0JaW50IFJlc2VydmVkOyAvLyBEV09SRAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIE5FV0hFQURFUiB7Ci0JaW50IFJlc2VydmVkOyAvLyBXT1JECi0JaW50IFJlc1R5cGU7IC8vIFdPUkQKLQlpbnQgUmVzQ291bnQ7IC8vIFdPUkQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBJQ09OUkVTRElSIHsKLQlpbnQgV2lkdGg7IC8vIEJZVEUKLQlpbnQgSGVpZ2h0OyAvLyBCWVRFCi0JaW50IENvbG9yQ291bnQ7IC8vIEJZVEUKLQlpbnQgcmVzZXJ2ZWQ7IC8vIEJZVEUKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBDVVJTT1JESVIgewotCWludCBXaWR0aDsgLy8gV09SRAotCWludCBIZWlnaHQ7IC8vIFdPUkQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBSRVNESVIgewotCS8vIHVuaW9uCi0JSUNPTlJFU0RJUiBJY29uID0gbmV3IElDT05SRVNESVIoKTsKLQlDVVJTT1JESVIgQ3Vyc29yID0gbmV3IENVUlNPUkRJUigpOwotCWludCBQbGFuZXM7IC8vIFdPUkQKLQlpbnQgQml0Q291bnQ7IC8vIFdPUkQKLQlpbnQgQnl0ZXNJblJlczsgLy8gRFdPUkQKLQlpbnQgSWNvbkN1cnNvcklkOyAvLyBXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgQklUTUFQSU5GT0hFQURFUiB7Ci0JaW50IGJpU2l6ZTsgLy8gRFdPUkQKLQlpbnQgYmlXaWR0aDsgLy8gTE9ORwotCWludCBiaUhlaWdodDsgLy8gTE9ORwotCWludCBiaVBsYW5lczsgLy8gV09SRAotCWludCBiaUJpdENvdW50OyAvLyBXT1JECi0JaW50IGJpQ29tcHJlc3Npb247IC8vIERXT1JECi0JaW50IGJpU2l6ZUltYWdlOyAvLyBEV09SRAotCWludCBiaVhQZWxzUGVyTWV0ZXI7IC8vIExPTkcKLQlpbnQgYmlZUGVsc1Blck1ldGVyOyAvLyBMT05HCi0JaW50IGJpQ2xyVXNlZDsgLy8gRFdPUkQKLQlpbnQgYmlDbHJJbXBvcnRhbnQ7IC8vIERXT1JECi19Ci0KLXN0YXRpYyBjbGFzcyBSR0JRVUFEIHsKLQlpbnQgcmdCbHVlOyAvLyBCWVRFCi0JaW50IHJnYkdyZWVuOyAvLyBCWVRFCi0JaW50IHJnYlJlZDsgLy8gQllURQotCWludCByZ2JSZXNlcnZlZDsgLy8gQllURQotfQotc3RhdGljIGNsYXNzIEJJVE1BUElORk8gewotCUJJVE1BUElORk9IRUFERVIgYm1pSGVhZGVyID0gbmV3IEJJVE1BUElORk9IRUFERVIoKTsKLQlSR0JRVUFEW10gYm1pQ29sb3JzID0gbnVsbDsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIEJJVE1BUElORk9IRUFERVIgYmloKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJpaC5iaVNpemUgPSByZWFkNChyYWYpOwotCWJpaC5iaVdpZHRoID0gcmVhZDQocmFmKTsKLQliaWguYmlIZWlnaHQgPSByZWFkNChyYWYpOwotCWJpaC5iaVBsYW5lcyA9IHJlYWRVMihyYWYpOwotCWJpaC5iaUJpdENvdW50ID0gcmVhZFUyKHJhZik7Ci0JYmloLmJpQ29tcHJlc3Npb24gPSByZWFkNChyYWYpOwotCWJpaC5iaVNpemVJbWFnZSA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpWFBlbHNQZXJNZXRlciA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpWVBlbHNQZXJNZXRlciA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpQ2xyVXNlZCA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpQ2xySW1wb3J0YW50ID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIEJJVE1BUElORk8gYmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmVhZChyYWYsIGJpLmJtaUhlYWRlcik7Ci19Ci0vKiBMaXR0bGUgRW5kaWFuIGhlbHBlcnMgKi8KLXN0YXRpYyBpbnQgcmVhZFUyKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBiMCA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjsKLQlpbnQgYjEgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7Ci0JcmV0dXJuIChiMSA8PCA4IHwgYjApOwotfQotc3RhdGljIGludCByZWFkNChSYW5kb21BY2Nlc3NGaWxlIHJhZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbnQgYjAgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7OwotCWludCBiMSA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjs7Ci0JaW50IGIyID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOzsKLQlpbnQgYjMgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7OwotCXJldHVybiBiMyA8PCAyNCB8IGIyIDw8IDE2IHwgYjEgPDwgOCB8IGIwOwotfQotc3RhdGljIHZvaWQgd3JpdGU0KFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmFmLndyaXRlKHZhbHVlICYgMHhGRik7Ci0JcmFmLndyaXRlKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOwotCXJhZi53cml0ZSgodmFsdWUgPj4gMTYpICYgMHhGRik7Ci0JcmFmLndyaXRlKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKLX0KLXN0YXRpYyB2b2lkIHdyaXRlVTIoUmFuZG9tQWNjZXNzRmlsZSByYWYsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyYWYud3JpdGUodmFsdWUgJiAweEZGKTsKLQlyYWYud3JpdGUoKHZhbHVlID4+IDgpICYgMHhGRik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9ET1NfSEVBREVSIGlkaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpZGguZV9tYWdpYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NibHAgPSByZWFkVTIocmFmKTsKLQlpZGguZV9jcCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NybGMgPSByZWFkVTIocmFmKTsKLQlpZGguZV9jcGFyaGRyID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfbWluYWxsb2MgPSByZWFkVTIocmFmKTsKLQlpZGguZV9tYXhhbGxvYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX3NzID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfc3AgPSByZWFkVTIocmFmKTsKLQlpZGguZV9jc3VtID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfaXAgPSByZWFkVTIocmFmKTsKLQlpZGguZV9jcyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2xmYXJsYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX292bm8gPSByZWFkVTIocmFmKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGlkaC5lX3Jlcy5sZW5ndGg7IGkrKykgaWRoLmVfcmVzW2ldID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfb2VtaWQgPSByZWFkVTIocmFmKTsKLQlpZGguZV9vZW1pbmZvID0gcmVhZFUyKHJhZik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpZGguZV9yZXMyLmxlbmd0aDsgaSsrKSBpZGguZV9yZXMyW2ldID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfbGZhbmV3ID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX0ZJTEVfSEVBREVSIGlmaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpZmguTWFjaGluZSA9IHJlYWRVMihyYWYpOwotCWlmaC5OdW1iZXJPZlNlY3Rpb25zID0gcmVhZFUyKHJhZik7Ci0JaWZoLlRpbWVEYXRlU3RhbXAgPSByZWFkNChyYWYpOwotCWlmaC5Qb2ludGVyVG9TeW1ib2xUYWJsZSA9IHJlYWQ0KHJhZik7Ci0JaWZoLk51bWJlck9mU3ltYm9scyA9IHJlYWQ0KHJhZik7Ci0JaWZoLlNpemVPZk9wdGlvbmFsSGVhZGVyID0gcmVhZFUyKHJhZik7Ci0JaWZoLkNoYXJhY3RlcmlzdGljcyAgPSByZWFkVTIocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX0RBVEFfRElSRUNUT1JZIGlkZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpZGQuVmlydHVhbEFkZHJlc3MgPSByZWFkNChyYWYpOwotCWlkZC5TaXplID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX09QVElPTkFMX0hFQURFUiBpb2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW9oLk1hZ2ljID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1ham9yTGlua2VyVmVyc2lvbiA9IHJhZi5yZWFkKCk7Ci0JaW9oLk1pbm9yTGlua2VyVmVyc2lvbiA9IHJhZi5yZWFkKCk7Ci0JaW9oLlNpemVPZkNvZGUgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZJbml0aWFsaXplZERhdGEgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZVbmluaXRpYWxpemVkRGF0YSA9IHJlYWQ0KHJhZik7Ci0JaW9oLkFkZHJlc3NPZkVudHJ5UG9pbnQgPSByZWFkNChyYWYpOwotCWlvaC5CYXNlT2ZDb2RlID0gcmVhZDQocmFmKTsKLQlpb2guQmFzZU9mRGF0YSA9IHJlYWQ0KHJhZik7Ci0JaW9oLkltYWdlQmFzZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNlY3Rpb25BbGlnbm1lbnQgPSByZWFkNChyYWYpOwotCWlvaC5GaWxlQWxpZ25tZW50ID0gcmVhZDQocmFmKTsKLQlpb2guTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlvaC5NYWpvckltYWdlVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlvaC5NaW5vckltYWdlVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlvaC5NYWpvclN1YnN5c3RlbVZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpb2guTWlub3JTdWJzeXN0ZW1WZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLldpbjMyVmVyc2lvblZhbHVlID0gcmVhZDQocmFmKTsKLQlpb2guU2l6ZU9mSW1hZ2UgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZIZWFkZXJzID0gcmVhZDQocmFmKTsKLQlpb2guQ2hlY2tTdW0gPSByZWFkNChyYWYpOwotCWlvaC5TdWJzeXN0ZW0gPSByZWFkVTIocmFmKTsKLQlpb2guRGxsQ2hhcmFjdGVyaXN0aWNzID0gcmVhZFUyKHJhZik7Ci0JaW9oLlNpemVPZlN0YWNrUmVzZXJ2ZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZlN0YWNrQ29tbWl0ID0gcmVhZDQocmFmKTsKLQlpb2guU2l6ZU9mSGVhcFJlc2VydmUgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZIZWFwQ29tbWl0ID0gcmVhZDQocmFmKTsKLQlpb2guTG9hZGVyRmxhZ3MgPSByZWFkNChyYWYpOwotCWlvaC5OdW1iZXJPZlJ2YUFuZFNpemVzID0gcmVhZDQocmFmKTsKLQlmb3IgKGludCBpID0gMCA7IGkgPCBpb2guRGF0YURpcmVjdG9yeS5sZW5ndGg7IGkrKykgewotCQlpb2guRGF0YURpcmVjdG9yeVtpXSA9IG5ldyBJTUFHRV9EQVRBX0RJUkVDVE9SWSgpOwotCQlyZWFkKHJhZiwgaW9oLkRhdGFEaXJlY3RvcnlbaV0pOwotCX0KLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX05UX0hFQURFUlMgaW5oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWluaC5TaWduYXR1cmUgPSByZWFkNChyYWYpOwotCXJlYWQocmFmLCBpbmguRmlsZUhlYWRlcik7Ci0JcmVhZChyYWYsIGluaC5PcHRpb25hbEhlYWRlcik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9TRUNUSU9OX0hFQURFUiBpc2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JZm9yIChpbnQgaSA9IDAgOyBpIDwgaXNoLk5hbWUubGVuZ3RoOyBpKyspIGlzaC5OYW1lW2ldID0gcmFmLnJlYWQoKTsKLQlpc2guTWlzY19WaXJ0dWFsU2l6ZSA9IHJlYWQ0KHJhZik7Ci0JaXNoLlZpcnR1YWxBZGRyZXNzID0gcmVhZDQocmFmKTsKLQlpc2guU2l6ZU9mUmF3RGF0YSA9IHJlYWQ0KHJhZik7Ci0JaXNoLlBvaW50ZXJUb1Jhd0RhdGEgPSByZWFkNChyYWYpOwotCWlzaC5Qb2ludGVyVG9SZWxvY2F0aW9ucyA9IHJlYWQ0KHJhZik7Ci0JaXNoLlBvaW50ZXJUb0xpbmVudW1iZXJzID0gcmVhZDQocmFmKTsKLQlpc2guTnVtYmVyT2ZSZWxvY2F0aW9ucyA9IHJlYWRVMihyYWYpOwotCWlzaC5OdW1iZXJPZkxpbmVudW1iZXJzID0gcmVhZFUyKHJhZik7Ci0JaXNoLkNoYXJhY3RlcmlzdGljcyA9IHJlYWQ0KHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgaXJkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlyZC5DaGFyYWN0ZXJpc3RpY3MgPSByZWFkNChyYWYpOwotCWlyZC5UaW1lRGF0ZVN0YW1wID0gcmVhZDQocmFmKTsKLQlpcmQuTWFqb3JWZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaXJkLk1pbm9yVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlyZC5OdW1iZXJPZk5hbWVkRW50cmllcyA9IHJlYWRVMihyYWYpOwotCWlyZC5OdW1iZXJPZklkRW50cmllcyA9IHJlYWRVMihyYWYpOwotfTsKLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSBpcmRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlyZGUuTmFtZSA9IHJlYWQ0KHJhZik7Ci0JaXJkZS5PZmZzZXRUb0RhdGEgPSByZWFkNChyYWYpOwotCS8vIGNvbnN0cnVjdCBvdGhlciB1bmlvbiBtZW1iZXJzCi0JaXJkZS5OYW1lT2Zmc2V0ID0gaXJkZS5OYW1lICYgfiAoMSA8PCAzMSk7Ci0JaXJkZS5OYW1lSXNTdHJpbmcgPSAoaXJkZS5OYW1lICYgKDEgPDwgMzEpKSAhPSAwOwotCWlyZGUuSWQgPSBpcmRlLk5hbWUgJiAweEZGRkY7Ci0JaXJkZS5PZmZzZXRUb0RpcmVjdG9yeSA9IGlyZGUuT2Zmc2V0VG9EYXRhICYgfiAoMSA8PCAzMSk7Ci0JaXJkZS5EYXRhSXNEaXJlY3RvcnkgPSAoaXJkZS5PZmZzZXRUb0RhdGEgJiAoMSA8PCAzMSkpICE9IDA7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZIGlyZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaXJkZS5PZmZzZXRUb0RhdGEgPSByZWFkNChyYWYpOwotCWlyZGUuU2l6ZSA9IHJlYWQ0KHJhZik7Ci0JaXJkZS5Db2RlUGFnZSA9IHJlYWQ0KHJhZik7Ci0JaXJkZS5SZXNlcnZlZCA9IHJlYWQ0KHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBORVdIRUFERVIgbmgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JbmguUmVzZXJ2ZWQgPSByZWFkVTIocmFmKTsKLQluaC5SZXNUeXBlID0gcmVhZFUyKHJhZik7Ci0JbmguUmVzQ291bnQgPSByZWFkVTIocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElDT05SRVNESVIgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpLldpZHRoID0gcmFmLnJlYWQoKTsKLQlpLkhlaWdodCA9IHJhZi5yZWFkKCk7Ci0JaS5Db2xvckNvdW50ID0gcmFmLnJlYWQoKTsKLQlpLnJlc2VydmVkID0gcmFmLnJlYWQoKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIENVUlNPUkRJUiBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWMuV2lkdGggPSByZWFkVTIocmFmKTsKLQljLkhlaWdodCA9IHJlYWRVMihyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgUkVTRElSIHJzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWxvbmcgc3RhcnQgPSByYWYuZ2V0RmlsZVBvaW50ZXIoKTsKLQlyZWFkKHJhZiwgcnMuSWNvbik7Ci0JcmFmLnNlZWsoc3RhcnQpOwotCXJlYWQocmFmLCBycy5DdXJzb3IpOwotCXJzLlBsYW5lcyA9IHJlYWRVMihyYWYpOwotCXJzLkJpdENvdW50ID0gcmVhZFUyKHJhZik7Ci0JcnMuQnl0ZXNJblJlcyA9IHJlYWQ0KHJhZik7Ci0JcnMuSWNvbkN1cnNvcklkID0gcmVhZFUyKHJhZik7Ci19Ci0KLS8qIEltYWdlRGF0YSBhbmQgSW1hZ2UgRGVjb2RlciBpbmxpbmluZyB0byBhdm9pZCBkZXBlbmRlbmN5IG9uIFNXVCAKLSAqIFRoZSBmb2xsb3dpbmcgc2VjdGlvbiBjYW4gYmUgZW50aXJlbHkgcmVtb3ZlZCBpZiBTV1QgY2FuIGJlIHVzZWQuCi0gKi8KLQotc3RhdGljIGNsYXNzIFJHQiB7Ci0JCi0JLyoqCi0JICogdGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIFJHQgotCSAqLwotCXB1YmxpYyBpbnQgcmVkOwotCQotCS8qKgotCSAqIHRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIFJHQgotCSAqLwotCXB1YmxpYyBpbnQgZ3JlZW47Ci0JCi0JLyoqCi0JICogdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBSR0IKLQkgKi8KLQlwdWJsaWMgaW50IGJsdWU7Ci0JCi0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTg0MTUwMjM0NjEyNDkwNzRMOwotCQotLyoqCi0gKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4KLSAqIHJlZCwgZ3JlZW4gYW5kIGJsdWUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSByZWQgdGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIG5ldyBpbnN0YW5jZQotICogQHBhcmFtIGdyZWVuIHRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIG5ldyBpbnN0YW5jZQotICogQHBhcmFtIGJsdWUgdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBuZXcgaW5zdGFuY2UKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSByZWQsIGdyZWVuIG9yIGJsdWUgYXJndW1lbnQgaXMgbm90IGJldHdlZW4gMCBhbmQgMjU1PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBSR0IoaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSkgewotCWlmICgocmVkID4gMjU1KSB8fCAocmVkIDwgMCkgfHwKLQkJKGdyZWVuID4gMjU1KSB8fCAoZ3JlZW4gPCAwKSB8fAotCQkoYmx1ZSA+IDI1NSkgfHwgKGJsdWUgPCAwKSkKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JdGhpcy5yZWQgPSByZWQ7Ci0JdGhpcy5ncmVlbiA9IGdyZWVuOwotCXRoaXMuYmx1ZSA9IGJsdWU7Ci19Ci0KLS8qKgotICogQ29tcGFyZXMgdGhlIGFyZ3VtZW50IHRvIHRoZSByZWNlaXZlciwgYW5kIHJldHVybnMgdHJ1ZQotICogaWYgdGhleSByZXByZXNlbnQgdGhlIDxlbT5zYW1lPC9lbT4gb2JqZWN0IHVzaW5nIGEgY2xhc3MKLSAqIHNwZWNpZmljIGNvbXBhcmlzb24uCi0gKgotICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9iamVjdAotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoaXMgb2JqZWN0IGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gKgotICogQHNlZSAjaGFzaENvZGUoKQotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMgKE9iamVjdCBvYmplY3QpIHsKLQlpZiAob2JqZWN0ID09IHRoaXMpIHJldHVybiB0cnVlOwotCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIFJHQikpIHJldHVybiBmYWxzZTsKLQlSR0IgcmdiID0gKFJHQilvYmplY3Q7Ci0JcmV0dXJuIChyZ2IucmVkID09IHRoaXMucmVkKSAmJiAocmdiLmdyZWVuID09IHRoaXMuZ3JlZW4pICYmIChyZ2IuYmx1ZSA9PSB0aGlzLmJsdWUpOwotfQotCi0vKioKLSAqIFJldHVybnMgYW4gaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSByZWNlaXZlci4gQW55IHR3byAKLSAqIG9iamVjdHMgd2hpY2ggcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIAotICogPGNvZGU+ZXF1YWxzPC9jb2RlPiBtdXN0IHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhpcwotICogbWV0aG9kLgotICoKLSAqIEByZXR1cm4gdGhlIHJlY2VpdmVyJ3MgaGFzaAotICoKLSAqIEBzZWUgI2VxdWFscyhPYmplY3QpCi0gKi8KLXB1YmxpYyBpbnQgaGFzaENvZGUgKCkgewotCXJldHVybiAoYmx1ZSA8PCAxNikgfCAoZ3JlZW4gPDwgOCkgfCByZWQ7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUKLSAqIGRlc2NyaXB0aW9uIG9mIHRoZSByZWNlaXZlci4KLSAqCi0gKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSA8Y29kZT5SR0I8L2NvZGU+Ci0gKi8KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCkgewotCXJldHVybiAiUkdCIHsiICsgcmVkICsgIiwgIiArIGdyZWVuICsgIiwgIiArIGJsdWUgKyAifSI7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0KLS8vJE5PTi1OTFMtNCQKLX0KLQotfQotc3RhdGljIGNsYXNzIFBhbGV0dGVEYXRhIHsKLQkKLQkvKioKLQkgKiB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIGRpcmVjdCBwYWxldHRlLCAKLQkgKiBhbmQgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJlY3Q7Ci0JCi0JLyoqCi0JICogdGhlIFJHQiB2YWx1ZXMgZm9yIGFuIGluZGV4ZWQgcGFsZXR0ZSwgd2hlcmUgdGhlCi0JICogaW5kaWNlcyBvZiB0aGUgYXJyYXkgY29ycmVzcG9uZCB0byBwaXhlbCB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgUkdCW10gY29sb3JzOwotCQotCS8qKgotCSAqIHRoZSByZWQgbWFzayBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgcmVkTWFzazsKLQkKLQkvKioKLQkgKiB0aGUgZ3JlZW4gbWFzayBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgZ3JlZW5NYXNrOwotCQotCS8qKgotCSAqIHRoZSBibHVlIG1hc2sgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IGJsdWVNYXNrOwotCQotCS8qKgotCSAqIHRoZSByZWQgc2hpZnQgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IHJlZFNoaWZ0OwotCQotCS8qKgotCSAqIHRoZSBncmVlbiBzaGlmdCBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgZ3JlZW5TaGlmdDsKLQkKLQkvKioKLQkgKiB0aGUgYmx1ZSBzaGlmdCBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgYmx1ZVNoaWZ0OwotCi0vKioKLSAqIENvbnN0cnVjdHMgYSBuZXcgaW5kZXhlZCBwYWxldHRlIGdpdmVuIGFuIGFycmF5IG9mIFJHQiB2YWx1ZXMuCi0gKgotICogQHBhcmFtIGNvbG9ycyB0aGUgYXJyYXkgb2YgPGNvZGU+UkdCPC9jb2RlPnMgZm9yIHRoZSBwYWxldHRlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgUGFsZXR0ZURhdGEoUkdCW10gY29sb3JzKSB7Ci0JaWYgKGNvbG9ycyA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXRoaXMuY29sb3JzID0gY29sb3JzOwotCXRoaXMuaXNEaXJlY3QgPSBmYWxzZTsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGRpcmVjdCBwYWxldHRlIGdpdmVuIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIG1hc2tzLgotICoKLSAqIEBwYXJhbSByZWRNYXNrIHRoZSByZWQgbWFzawotICogQHBhcmFtIGdyZWVuTWFzayB0aGUgZ3JlZW4gbWFzawotICogQHBhcmFtIGJsdWVNYXNrIHRoZSBibHVlIG1hc2sKLSAqLwotcHVibGljIFBhbGV0dGVEYXRhKGludCByZWRNYXNrLCBpbnQgZ3JlZW5NYXNrLCBpbnQgYmx1ZU1hc2spIHsKLQl0aGlzLnJlZE1hc2sgPSByZWRNYXNrOwotCXRoaXMuZ3JlZW5NYXNrID0gZ3JlZW5NYXNrOwotCXRoaXMuYmx1ZU1hc2sgPSBibHVlTWFzazsKLQl0aGlzLmlzRGlyZWN0ID0gdHJ1ZTsKLQl0aGlzLnJlZFNoaWZ0ID0gc2hpZnRGb3JNYXNrKHJlZE1hc2spOwotCXRoaXMuZ3JlZW5TaGlmdCA9IHNoaWZ0Rm9yTWFzayhncmVlbk1hc2spOwotCXRoaXMuYmx1ZVNoaWZ0ID0gc2hpZnRGb3JNYXNrKGJsdWVNYXNrKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBwaXhlbCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiA8Y29kZT5SQkc8L2NvZGU+LgotICoKLSAqIEBwYXJhbSByZ2IgdGhlIFJHQiB0byBnZXQgdGhlIHBpeGVsIHZhbHVlIGZvcgotICogQHJldHVybiB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBnaXZlbiBSR0IKLSAqIAotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSBSR0IgaXMgbm90IGZvdW5kIGluIHRoZSBwYWxldHRlPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0UGl4ZWwoUkdCIHJnYikgewotCWlmIChyZ2IgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAoaXNEaXJlY3QpIHsKLQkJaW50IHBpeGVsID0gMDsKLQkJcGl4ZWwgfD0gKHJlZFNoaWZ0IDwgMCA/IHJnYi5yZWQgPDwgLXJlZFNoaWZ0IDogcmdiLnJlZCA+Pj4gcmVkU2hpZnQpICYgcmVkTWFzazsKLQkJcGl4ZWwgfD0gKGdyZWVuU2hpZnQgPCAwID8gcmdiLmdyZWVuIDw8IC1ncmVlblNoaWZ0IDogcmdiLmdyZWVuID4+PiBncmVlblNoaWZ0KSAmIGdyZWVuTWFzazsKLQkJcGl4ZWwgfD0gKGJsdWVTaGlmdCA8IDAgPyByZ2IuYmx1ZSA8PCAtYmx1ZVNoaWZ0IDogcmdiLmJsdWUgPj4+IGJsdWVTaGlmdCkgJiBibHVlTWFzazsKLQkJcmV0dXJuIHBpeGVsOwotCX0gZWxzZSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29sb3JzW2ldLmVxdWFscyhyZ2IpKSByZXR1cm4gaTsKLQkJfQotCQkvKiBUaGUgUkdCIGRpZCBub3QgZXhpc3QgaW4gdGhlIHBhbGV0dGUgKi8KLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKioKLSAqIFJldHVybnMgYW4gPGNvZGU+UkdCPC9jb2RlPiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwaXhlbCB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gcGl4ZWwgdGhlIHBpeGVsIHRvIGdldCB0aGUgUkdCIHZhbHVlIGZvcgotICogQHJldHVybiB0aGUgUkdCIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcGl4ZWwKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHBpeGVsIGRvZXMgbm90IGV4aXN0IGluIHRoZSBwYWxldHRlPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBSR0IgZ2V0UkdCKGludCBwaXhlbCkgewotCWlmIChpc0RpcmVjdCkgewotCQlpbnQgciA9IHBpeGVsICYgcmVkTWFzazsKLQkJciA9IChyZWRTaGlmdCA8IDApID8gciA+Pj4gLXJlZFNoaWZ0IDogciA8PCByZWRTaGlmdDsKLQkJaW50IGcgPSBwaXhlbCAmIGdyZWVuTWFzazsKLQkJZyA9IChncmVlblNoaWZ0IDwgMCkgPyBnID4+PiAtZ3JlZW5TaGlmdCA6IGcgPDwgZ3JlZW5TaGlmdDsKLQkJaW50IGIgPSBwaXhlbCAmIGJsdWVNYXNrOwotCQliID0gKGJsdWVTaGlmdCA8IDApID8gYiA+Pj4gLWJsdWVTaGlmdCA6IGIgPDwgYmx1ZVNoaWZ0OwotCQlyZXR1cm4gbmV3IFJHQihyLCBnLCBiKTsKLQl9IGVsc2UgewotCQlpZiAocGl4ZWwgPCAwIHx8IHBpeGVsID49IGNvbG9ycy5sZW5ndGgpIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGNvbG9yc1twaXhlbF07Ci0JfQotfQotCi0vKioKLSAqIFJldHVybnMgYWxsIHRoZSBSR0IgdmFsdWVzIGluIHRoZSByZWNlaXZlciBpZiBpdCBpcyBhbgotICogaW5kZXhlZCBwYWxldHRlLCBvciBudWxsIGlmIGl0IGlzIGEgZGlyZWN0IHBhbGV0dGUuCi0gKgotICogQHJldHVybiB0aGUgPGNvZGU+UkdCPC9jb2RlPnMgZm9yIHRoZSByZWNlaXZlciBvciBudWxsCi0gKi8KLXB1YmxpYyBSR0JbXSBnZXRSR0JzKCkgewotCXJldHVybiBjb2xvcnM7Ci19Ci0KLS8qKgotICogQ29tcHV0ZXMgdGhlIHNoaWZ0IHZhbHVlIGZvciBhIGdpdmVuIG1hc2suCi0gKgotICogQHBhcmFtIG1hc2sgdGhlIG1hc2sgdG8gY29tcHV0ZSB0aGUgc2hpZnQgZm9yCi0gKiBAcmV0dXJuIHRoZSBzaGlmdCBhbW91bnQKLSAqCi0gKiBAc2VlIFBhbGV0dGVEYXRhCi0gKi8KLWludCBzaGlmdEZvck1hc2soaW50IG1hc2spIHsKLQlmb3IgKGludCBpID0gMzE7IGkgPj0gMDsgaS0tKSB7IAotCQlpZiAoKChtYXNrID4+IGkpICYgMHgxKSAhPSAwKSByZXR1cm4gNyAtIGk7Ci0JfQotCXJldHVybiAzMjsKLX0KLQotfQotc3RhdGljIGNsYXNzIEltYWdlTG9hZGVyIHsKLQkKLQkvKioKLQkgKiB0aGUgYXJyYXkgb2YgSW1hZ2VEYXRhIG9iamVjdHMgaW4gdGhpcyBJbWFnZUxvYWRlci4KLQkgKiBUaGlzIGFycmF5IGlzIHJlYWQgaW4gd2hlbiB0aGUgbG9hZCBtZXRob2QgaXMgY2FsbGVkLAotCSAqIGFuZCBpdCBpcyB3cml0dGVuIG91dCB3aGVuIHRoZSBzYXZlIG1ldGhvZCBpcyBjYWxsZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEYXRhW10gZGF0YTsKLQkKLQkvKioKLQkgKiB0aGUgd2lkdGggb2YgdGhlIGxvZ2ljYWwgc2NyZWVuIG9uIHdoaWNoIHRoZSBpbWFnZXMKLQkgKiByZXNpZGUsIGluIHBpeGVscyAodGhpcyBjb3JyZXNwb25kcyB0byB0aGUgR0lGODlhCi0JICogTG9naWNhbCBTY3JlZW4gV2lkdGggdmFsdWUpCi0JICovCi0JcHVibGljIGludCBsb2dpY2FsU2NyZWVuV2lkdGg7Ci0KLQkvKioKLQkgKiB0aGUgaGVpZ2h0IG9mIHRoZSBsb2dpY2FsIHNjcmVlbiBvbiB3aGljaCB0aGUgaW1hZ2VzCi0JICogcmVzaWRlLCBpbiBwaXhlbHMgKHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIEdJRjg5YQotCSAqIExvZ2ljYWwgU2NyZWVuIEhlaWdodCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgaW50IGxvZ2ljYWxTY3JlZW5IZWlnaHQ7Ci0KLQkvKioKLQkgKiB0aGUgYmFja2dyb3VuZCBwaXhlbCBmb3IgdGhlIGxvZ2ljYWwgc2NyZWVuICh0aGlzIAotCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBHSUY4OWEgQmFja2dyb3VuZCBDb2xvciBJbmRleCB2YWx1ZSkuCi0JICogVGhlIGRlZmF1bHQgaXMgLTEgd2hpY2ggbWVhbnMgJ3Vuc3BlY2lmaWVkIGJhY2tncm91bmQnCi0JICogCi0JICovCi0JcHVibGljIGludCBiYWNrZ3JvdW5kUGl4ZWw7Ci0KLQkvKioKLQkgKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgZGlzcGxheSBvZiBhIHNlcXVlbmNlCi0JICogb2YgYW5pbWF0ZWQgaW1hZ2VzICh0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBjb21tb25seS11c2VkCi0JICogR0lGIGFwcGxpY2F0aW9uIGV4dGVuc2lvbiBmb3IgIk5FVFNDQVBFIDIuMCAwMSIpCi0JICovCi0JcHVibGljIGludCByZXBlYXRDb3VudDsKLQkJCi0JLyoKLQkgKiB0aGUgc2V0IG9mIEltYWdlTG9hZGVyIGV2ZW50IGxpc3RlbmVycywgY3JlYXRlZCBvbiBkZW1hbmQKLQkgKi8KLQlWZWN0b3IgaW1hZ2VMb2FkZXJMaXN0ZW5lcnM7Ci0KLS8qKgotICogQ29uc3RydWN0IGEgbmV3IGVtcHR5IEltYWdlTG9hZGVyLgotICovCi1wdWJsaWMgSW1hZ2VMb2FkZXIoKSB7Ci0JcmVzZXQoKTsKLX0KLQotLyoqCi0gKiBSZXNldHMgdGhlIGZpZWxkcyBvZiB0aGUgSW1hZ2VMb2FkZXIsIGV4Y2VwdCBmb3IgdGhlCi0gKiA8Y29kZT5pbWFnZUxvYWRlckxpc3RlbmVyczwvY29kZT4gZmllbGQuCi0gKi8KLXZvaWQgcmVzZXQoKSB7Ci0JZGF0YSA9IG51bGw7Ci0JbG9naWNhbFNjcmVlbldpZHRoID0gMDsKLQlsb2dpY2FsU2NyZWVuSGVpZ2h0ID0gMDsKLQliYWNrZ3JvdW5kUGl4ZWwgPSAtMTsKLQlyZXBlYXRDb3VudCA9IDE7Ci19Ci0KLS8qKgotICogTG9hZHMgYW4gYXJyYXkgb2YgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiBvYmplY3RzIGZyb20gdGhlCi0gKiBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtLiBUaHJvd3MgYW4gZXJyb3IgaWYgZWl0aGVyIGFuIGVycm9yCi0gKiBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgaW1hZ2VzLCBvciBpZiB0aGUgaW1hZ2VzIGFyZSBub3QKLSAqIG9mIGEgc3VwcG9ydGVkIHR5cGUuIFJldHVybnMgdGhlIGxvYWRlZCBpbWFnZSBkYXRhIGFycmF5LgotICoKLSAqIEBwYXJhbSBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSB0byBsb2FkIHRoZSBpbWFnZXMgZnJvbQotICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IG9iamVjdHMgbG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJlYW0gaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfSU1BR0UgLSBpZiB0aGUgaW1hZ2UgZmlsZSBjb250YWlucyBpbnZhbGlkIGRhdGE8L2xpPgotICogICAgPGxpPkVSUk9SX0lPIC0gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGRhdGE8L2xpPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCAtIGlmIHRoZSBpbWFnZSBmaWxlIGNvbnRhaW5zIGFuIHVucmVjb2duaXplZCBmb3JtYXQ8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEltYWdlRGF0YVtdIGxvYWQoSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0JaWYgKHN0cmVhbSA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXJlc2V0KCk7Ci0JZGF0YSA9IEZpbGVGb3JtYXQubG9hZChzdHJlYW0sIHRoaXMpOwotCXJldHVybiBkYXRhOwotfQotCi0vKioKLSAqIExvYWRzIGFuIGFycmF5IG9mIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gb2JqZWN0cyBmcm9tIHRoZQotICogZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVGhyb3dzIGFuIGVycm9yIGlmIGVpdGhlcgotICogYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGxvYWRpbmcgdGhlIGltYWdlcywgb3IgaWYgdGhlIGltYWdlcyBhcmUKLSAqIG5vdCBvZiBhIHN1cHBvcnRlZCB0eXBlLiBSZXR1cm5zIHRoZSBsb2FkZWQgaW1hZ2UgZGF0YSBhcnJheS4KLSAqCi0gKiBAcGFyYW0gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gbG9hZCB0aGUgaW1hZ2VzIGZyb20KLSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiBvYmplY3RzIGxvYWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGZpbGUgbmFtZSBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9JTUFHRSAtIGlmIHRoZSBpbWFnZSBmaWxlIGNvbnRhaW5zIGludmFsaWQgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU8gLSBpZiBhbiBJTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQgLSBpZiB0aGUgaW1hZ2UgZmlsZSBjb250YWlucyBhbiB1bnJlY29nbml6ZWQgZm9ybWF0PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBJbWFnZURhdGFbXSBsb2FkKFN0cmluZyBmaWxlbmFtZSkgewotCWlmIChmaWxlbmFtZSA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JdHJ5IHsKLQkJc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSk7Ci0JCXJldHVybiBsb2FkKHN0cmVhbSk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJaWYgKHN0cmVhbSAhPSBudWxsKSBzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gSWdub3JlIGVycm9yCi0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci19Ci1zdGF0aWMgY2xhc3MgSW1hZ2VEYXRhIHsKLQkKLQkvKioKLQkgKiBUaGUgd2lkdGggb2YgdGhlIGltYWdlLCBpbiBwaXhlbHMuCi0JICovCi0JcHVibGljIGludCB3aWR0aDsKLQotCS8qKgotCSAqIFRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLCBpbiBwaXhlbHMuCi0JICovCi0JcHVibGljIGludCBoZWlnaHQ7Ci0KLQkvKioKLQkgKiBUaGUgY29sb3IgZGVwdGggb2YgdGhlIGltYWdlLCBpbiBiaXRzIHBlciBwaXhlbC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgYSBkZXB0aCBvZiA4IG9yIGxlc3MgZG9lcyBub3QgbmVjZXNzYXJpbHkKLQkgKiBtZWFuIHRoYXQgdGhlIGltYWdlIGlzIHBhbGV0dGUgaW5kZXhlZCwgb3IKLQkgKiBjb252ZXJzZWx5IHRoYXQgYSBkZXB0aCBncmVhdGVyIHRoYW4gOCBtZWFucyB0aGF0Ci0JICogdGhlIGltYWdlIGlzIGRpcmVjdCBjb2xvci4gIENoZWNrIHRoZSBhc3NvY2lhdGVkCi0JICogUGFsZXR0ZURhdGEncyBpc0RpcmVjdCBmaWVsZCBmb3Igc3VjaCBkZXRlcm1pbmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgaW50IGRlcHRoOwotCi0JLyoqCi0JICogVGhlIHNjYW5saW5lIHBhZGRpbmcuCi0JICogPHA+Ci0JICogSWYgb25lIHNjYW5saW5lIG9mIHRoZSBpbWFnZSBpcyBub3QgYSBtdWx0aXBsZSBvZgotCSAqIHRoaXMgbnVtYmVyLCBpdCB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zIHVudGlsIGl0IGlzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5saW5lUGFkOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBieXRlcyBwZXIgc2NhbmxpbmUuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIG11bHRpcGxlIG9mIHRoZSBzY2FubGluZSBwYWRkaW5nLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IGJ5dGVzUGVyTGluZTsKLQotCS8qKgotCSAqIFRoZSBwaXhlbCBkYXRhIG9mIHRoZSBpbWFnZS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgZm9yIDE2IGJpdCBkZXB0aCBpbWFnZXMgdGhlIHBpeGVsIGRhdGEgaXMgc3RvcmVkCi0JICogaW4gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvcmRlcjsgaG93ZXZlciwgZm9yIDI0Yml0IGFuZAotCSAqIDMyYml0IGRlcHRoIGltYWdlcyB0aGUgcGl4ZWwgZGF0YSBpcyBzdG9yZWQgaW4gbW9zdAotCSAqIHNpZ25pZmljYW50IGJ5dGUgb3JkZXIuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBieXRlW10gZGF0YTsKLQotCS8qKgotCSAqIFRoZSBjb2xvciB0YWJsZSBmb3IgdGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBQYWxldHRlRGF0YSBwYWxldHRlOwotCi0JLyoqCi0JICogVGhlIHRyYW5zcGFyZW50IHBpeGVsLgotCSAqIDxwPgotCSAqIFBpeGVscyB3aXRoIHRoaXMgdmFsdWUgYXJlIHRyYW5zcGFyZW50LgotCSAqIDwvcD48cD4KLQkgKiBUaGUgZGVmYXVsdCBpcyAtMSB3aGljaCBtZWFucyAnbm8gdHJhbnNwYXJlbnQgcGl4ZWwnLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IHRyYW5zcGFyZW50UGl4ZWw7Ci0KLQkvKioKLQkgKiBBbiBpY29uLXNwZWNpZmljIGZpZWxkIGNvbnRhaW5pbmcgdGhlIGRhdGEgZnJvbSB0aGUgaWNvbiBtYXNrLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSAxIGJpdCBiaXRtYXAgc3RvcmVkIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLQkgKiBiaXQgZmlyc3QuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBzY2FubGluZSBpcwotCSAqICcoKHdpZHRoICsgNykgLyA4ICsgKG1hc2tQYWQgLSAxKSkgLyBtYXNrUGFkICogbWFza1BhZCcuCi0JICogPC9wPjxwPgotCSAqIFRoZSBkZWZhdWx0IGlzIG51bGwgd2hpY2ggbWVhbnMgJ25vIHRyYW5zcGFyZW5jeSBtYXNrJy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGJ5dGVbXSBtYXNrRGF0YTsKLQotCS8qKgotCSAqIEFuIGljb24tc3BlY2lmaWMgZmllbGQgY29udGFpbmluZyB0aGUgc2NhbmxpbmUgcGFkIG9mIHRoZSBtYXNrLgotCSAqIDxwPgotCSAqIElmIG9uZSBzY2FubGluZSBvZiB0aGUgdHJhbnNwYXJlbmN5IG1hc2sgaXMgbm90IGEKLQkgKiBtdWx0aXBsZSBvZiB0aGlzIG51bWJlciwgaXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB1bnRpbAotCSAqIGl0IGlzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IG1hc2tQYWQ7Ci0JCi0JLyoqCi0JICogVGhlIGFscGhhIGRhdGEgb2YgdGhlIGltYWdlLgotCSAqIDxwPgotCSAqIEV2ZXJ5IHBpeGVsIGNhbiBoYXZlIGFuIDxlbT5hbHBoYSBibGVuZGluZzwvZW0+IHZhbHVlIHRoYXQKLQkgKiB2YXJpZXMgZnJvbSAwLCBtZWFuaW5nIGZ1bGx5IHRyYW5zcGFyZW50LCB0byAyNTUgbWVhbmluZwotCSAqIGZ1bGx5IG9wYXF1ZS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHNjYW5saW5lIGlzCi0JICogJ3dpZHRoJy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGJ5dGVbXSBhbHBoYURhdGE7Ci0JCi0JLyoqCi0JICogVGhlIGdsb2JhbCBhbHBoYSB2YWx1ZSB0byBiZSB1c2VkIGZvciBldmVyeSBwaXhlbC4KLQkgKiA8cD4KLQkgKiBJZiB0aGlzIHZhbHVlIGlzIHNldCwgdGhlIDxjb2RlPmFscGhhRGF0YTwvY29kZT4gZmllbGQKLQkgKiBpcyBpZ25vcmVkIGFuZCB3aGVuIHRoZSBpbWFnZSBpcyByZW5kZXJlZCBlYWNoIHBpeGVsCi0JICogd2lsbCBiZSBibGVuZGVkIHdpdGggdGhlIGJhY2tncm91bmQgYW4gYW1vdW50Ci0JICogcHJvcG9ydGlvbmFsIHRvIHRoaXMgdmFsdWUuCi0JICogPC9wPjxwPgotCSAqIFRoZSBkZWZhdWx0IGlzIC0xIHdoaWNoIG1lYW5zICdubyBnbG9iYWwgYWxwaGEgdmFsdWUnCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgYWxwaGE7Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiBmaWxlIGZyb20gd2hpY2ggdGhlIGltYWdlIHdhcyByZWFkLgotCSAqIAotCSAqIEl0IGlzIGV4cHJlc3NlZCBhcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0JICogPGRsPgotCSAqIDxkdD48Y29kZT5JTUFHRV9CTVA8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+V2luZG93cyBCTVAgZmlsZSBmb3JtYXQsIG5vIGNvbXByZXNzaW9uPC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfQk1QX1JMRTwvY29kZT48L2R0PgotCSAqIDxkZD5XaW5kb3dzIEJNUCBmaWxlIGZvcm1hdCwgUkxFIGNvbXByZXNzaW9uIGlmIGFwcHJvcHJpYXRlPC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfR0lGPC9jb2RlPjwvZHQ+Ci0JICogPGRkPkdJRiBmaWxlIGZvcm1hdDwvZGQ+Ci0JICogPGR0Pjxjb2RlPklNQUdFX0lDTzwvY29kZT48L2R0PgotCSAqIDxkZD5XaW5kb3dzIElDTyBmaWxlIGZvcm1hdDwvZGQ+Ci0JICogPGR0Pjxjb2RlPklNQUdFX0pQRUc8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+SlBFRyBmaWxlIGZvcm1hdDwvZGQ+Ci0JICogPGR0Pjxjb2RlPklNQUdFX1BORzwvY29kZT48L2R0PgotCSAqIDxkZD5QTkcgZmlsZSBmb3JtYXQ8L2RkPgotCSAqIDwvZGw+Ci0JICovCi0JcHVibGljIGludCB0eXBlOwotCi0JLyoqCi0JICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZQotCSAqIHdpdGhpbiB0aGUgbG9naWNhbCBzY3JlZW4gKHRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8KLQkgKiB0aGUgR0lGODlhIEltYWdlIExlZnQgUG9zaXRpb24gdmFsdWUpLgotCSAqLwotCXB1YmxpYyBpbnQgeDsKLQotCS8qKgotCSAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UKLQkgKiB3aXRoaW4gdGhlIGxvZ2ljYWwgc2NyZWVuICh0aGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvCi0JICogdGhlIEdJRjg5YSBJbWFnZSBUb3AgUG9zaXRpb24gdmFsdWUpLgotCSAqLwotCXB1YmxpYyBpbnQgeTsKLQotCS8qKgotCSAqIEEgZGVzY3JpcHRpb24gb2YgaG93IHRvIGRpc3Bvc2Ugb2YgdGhlIGN1cnJlbnQgaW1hZ2UKLQkgKiBiZWZvcmUgZGlzcGxheWluZyB0aGUgbmV4dC4KLQkgKiAKLQkgKiBJdCBpcyBleHByZXNzZWQgYXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCSAqIDxkbD4KLQkgKiA8ZHQ+PGNvZGU+RE1fVU5TUEVDSUZJRUQ8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+ZGlzcG9zYWwgbWV0aG9kIG5vdCBzcGVjaWZpZWQ8L2RkPgotCSAqIDxkdD48Y29kZT5ETV9GSUxMX05PTkU8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+ZG8gbm90aGluZyAtIGxlYXZlIHRoZSBpbWFnZSBpbiBwbGFjZTwvZGQ+Ci0JICogPGR0Pjxjb2RlPkRNX0ZJTExfQkFDS0dST1VORDwvY29kZT48L2R0PgotCSAqIDxkZD5maWxsIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3I8L2RkPgotCSAqIDxkdD48Y29kZT5ETV9GSUxMX1BSRVZJT1VTPC9jb2RlPjwvZHQ+Ci0JICogPGRkPnJlc3RvcmUgdGhlIHByZXZpb3VzIHBpY3R1cmU8L2RkPgotCSAqIDwvZGw+Ci0JICogKHRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIEdJRjg5YSBEaXNwb3NhbCBNZXRob2QgdmFsdWUpCi0JICovCi0JcHVibGljIGludCBkaXNwb3NhbE1ldGhvZDsKLQotCS8qKgotCSAqIFRoZSB0aW1lIHRvIGRlbGF5IGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBuZXh0IGltYWdlCi0JICogaW4gYW4gYW5pbWF0aW9uICh0aGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSBHSUY4OWEKLQkgKiBEZWxheSBUaW1lIHZhbHVlKS4KLQkgKi8KLQlwdWJsaWMgaW50IGRlbGF5VGltZTsKLQotCS8qKgotCSAqIEFyYml0cmFyeSBjaGFubmVsIHdpZHRoIGRhdGEgdG8gOC1iaXQgY29udmVyc2lvbiB0YWJsZS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgYnl0ZVtdW10gQU5ZX1RPX0VJR0hUID0gbmV3IGJ5dGVbOV1bXTsKLQlzdGF0aWMgewotCQlmb3IgKGludCBiID0gMDsgYiA8IDk7ICsrYikgewotCQkJYnl0ZVtdIGRhdGEgPSBBTllfVE9fRUlHSFRbYl0gPSBuZXcgYnl0ZVsxIDw8IGJdOwotCQkJaWYgKGIgPT0gMCkgY29udGludWU7Ci0JCQlpbnQgaW5jID0gMDsKLQkJCWZvciAoaW50IGJpdCA9IDB4MTAwMDA7IChiaXQgPj49IGIpICE9IDA7KSBpbmMgfD0gYml0OwotCQkJZm9yIChpbnQgdiA9IDAsIHAgPSAwOyB2IDwgMHgxMDAwMDsgdis9IGluYykgZGF0YVtwKytdID0gKGJ5dGUpKHYgPj4gOCk7Ci0JCX0KLQl9Ci0Jc3RhdGljIGZpbmFsIGJ5dGVbXSBPTkVfVE9fT05FX01BUFBJTkcgPSBBTllfVE9fRUlHSFRbOF07Ci0KLQkvKioKLQkgKiBTY2FsZWQgOHg4IEJheWVyIGRpdGhlciBtYXRyaXguCi0JICovCi0Jc3RhdGljIGZpbmFsIGludFtdW10gRElUSEVSX01BVFJJWCA9IHsKLQkJeyAweGZjMDAwMCwgMHg3YzAwMDAsIDB4ZGMwMDAwLCAweDVjMDAwMCwgMHhmNDAwMDAsIDB4NzQwMDAwLCAweGQ0MDAwMCwgMHg1NDAwMDAgfSwKLQkJeyAweDNjMDAwMCwgMHhiYzAwMDAsIDB4MWMwMDAwLCAweDljMDAwMCwgMHgzNDAwMDAsIDB4YjQwMDAwLCAweDE0MDAwMCwgMHg5NDAwMDAgfSwKLQkJeyAweGNjMDAwMCwgMHg0YzAwMDAsIDB4ZWMwMDAwLCAweDZjMDAwMCwgMHhjNDAwMDAsIDB4NDQwMDAwLCAweGU0MDAwMCwgMHg2NDAwMDAgfSwKLQkJeyAweDBjMDAwMCwgMHg4YzAwMDAsIDB4MmMwMDAwLCAweGFjMDAwMCwgMHgwNDAwMDAsIDB4ODQwMDAwLCAweDI0MDAwMCwgMHhhNDAwMDAgfSwKLQkJeyAweGYwMDAwMCwgMHg3MDAwMDAsIDB4ZDAwMDAwLCAweDUwMDAwMCwgMHhmODAwMDAsIDB4NzgwMDAwLCAweGQ4MDAwMCwgMHg1ODAwMDAgfSwKLQkJeyAweDMwMDAwMCwgMHhiMDAwMDAsIDB4MTAwMDAwLCAweDkwMDAwMCwgMHgzODAwMDAsIDB4YjgwMDAwLCAweDE4MDAwMCwgMHg5ODAwMDAgfSwKLQkJeyAweGMwMDAwMCwgMHg0MDAwMDAsIDB4ZTAwMDAwLCAweDYwMDAwMCwgMHhjODAwMDAsIDB4NDgwMDAwLCAweGU4MDAwMCwgMHg2ODAwMDAgfSwKLQkJeyAweDAwMDAwMCwgMHg4MDAwMDAsIDB4MjAwMDAwLCAweGEwMDAwMCwgMHgwODAwMDAsIDB4ODgwMDAwLCAweDI4MDAwMCwgMHhhODAwMDAgfQotCX07Ci0KLS8qKgotICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgSW1hZ2VEYXRhIHdpdGggdGhlIGdpdmVuIHdpZHRoLCBoZWlnaHQsCi0gKiBkZXB0aCBhbmQgcGFsZXR0ZS4gVGhlIGRhdGEgd2lsbCBiZSBpbml0aWFsaXplZCB0byBhbiAoYWxsIHplcm8pCi0gKiBhcnJheSBvZiB0aGUgYXBwcm9wcmlhdGUgc2l6ZS4KLSAqCi0gKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGRlcHRoIHRoZSBkZXB0aCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBwYWxldHRlIHRoZSBwYWxldHRlIG9mIHRoZSBpbWFnZSAobXVzdCBub3QgYmUgbnVsbCkKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSB3aWR0aCBvciBoZWlnaHQgaXMgbmVnYXRpdmUsIG9yIGlmIHRoZSBkZXB0aCBpcyBub3QKLSAqICAgICAgICAJb25lIG9mIDEsIDIsIDQsIDgsIDE2LCAyNCBvciAzMjwvbGk+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYWxldHRlIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEltYWdlRGF0YShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgUGFsZXR0ZURhdGEgcGFsZXR0ZSkgewotCXRoaXMod2lkdGgsIGhlaWdodCwgZGVwdGgsIHBhbGV0dGUsCi0JCTQsIG51bGwsIDAsIG51bGwsCi0JCW51bGwsIC0xLCAtMSwgU1dULklNQUdFX1VOREVGSU5FRCwKLQkJMCwgMCwgMCwgMCk7Ci19Ci0KLS8qKgotICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgSW1hZ2VEYXRhIHdpdGggdGhlIGdpdmVuIHdpZHRoLCBoZWlnaHQsCi0gKiBkZXB0aCwgcGFsZXR0ZSwgc2NhbmxpbmVQYWQgYW5kIGRhdGEuCi0gKgotICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBkZXB0aCB0aGUgZGVwdGggb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gcGFsZXR0ZSB0aGUgcGFsZXR0ZSBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBzY2FubGluZVBhZCB0aGUgcGFkZGluZyBvZiBlYWNoIGxpbmUsIGluIGJ5dGVzCi0gKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBvZiB0aGUgaW1hZ2UKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSB3aWR0aCBvciBoZWlnaHQgaXMgbmVnYXRpdmUsIG9yIGlmIHRoZSBkZXB0aCBpcyBub3QKLSAqICAgICAgICAJb25lIG9mIDEsIDIsIDQsIDgsIDE2LCAyNCBvciAzMjwvbGk+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYWxldHRlIG9yIGRhdGEgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfQ0FOTk9UX0JFX1pFUk8gLSBpZiB0aGUgc2NhbmxpbmVQYWQgaXMgemVybzwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBQYWxldHRlRGF0YSBwYWxldHRlLCBpbnQgc2NhbmxpbmVQYWQsIGJ5dGVbXSBkYXRhKSB7Ci0JdGhpcyh3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgcGFsZXR0ZSwKLQkJc2NhbmxpbmVQYWQsIGNoZWNrRGF0YShkYXRhKSwgMCwgbnVsbCwKLQkJbnVsbCwgLTEsIC0xLCBTV1QuSU1BR0VfVU5ERUZJTkVELAotCQkwLCAwLCAwLCAwKTsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGFuIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gbG9hZGVkIGZyb20gYSBmaWxlIHdpdGggdGhlCi0gKiBzcGVjaWZpZWQgbmFtZS4gVGhyb3dzIGFuIGVycm9yIGlmIGFuIGVycm9yIG9jY3VycyBsb2FkaW5nIHRoZQotICogaW1hZ2UsIG9yIGlmIHRoZSBpbWFnZSBoYXMgYW4gdW5zdXBwb3J0ZWQgdHlwZS4KLSAqIDxwPgotICogVGhpcyBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2Ugd2hlbiBsb2FkaW5nIGEgc2luZ2xlCi0gKiBpbWFnZSBvbmx5LiBJZiB0aGUgZmlsZSBjb250YWlucyBtdWx0aXBsZSBpbWFnZXMsIG9ubHkgdGhlIGZpcnN0Ci0gKiBvbmUgd2lsbCBiZSBsb2FkZWQuIFRvIGxvYWQgbXVsdGlwbGUgaW1hZ2VzLCB1c2UgCi0gKiA8Y29kZT5JbWFnZUxvYWRlci5sb2FkKCk8L2NvZGU+LgotICogPC9wPgotICoKLSAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBsb2FkIHRoZSBpbWFnZSBmcm9tIChtdXN0IG5vdCBiZSBudWxsKQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGZpbGUgbmFtZSBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9JTUFHRSAtIGlmIHRoZSBpbWFnZSBmaWxlIGNvbnRhaW5zIGludmFsaWQgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU8gaWYgYW4gSU8gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfRk9STUFUIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgYW4gdW5yZWNvZ25pemVkIGZvcm1hdDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhKFN0cmluZyBmaWxlbmFtZSkgewotCUltYWdlRGF0YVtdIGRhdGEgPSBuZXcgSW1hZ2VMb2FkZXIoKS5sb2FkKGZpbGVuYW1lKTsKLQlpZiAoZGF0YS5sZW5ndGggPCAxKSBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCUltYWdlRGF0YSBpID0gZGF0YVswXTsKLQlzZXRBbGxGaWVsZHMoCi0JCWkud2lkdGgsCi0JCWkuaGVpZ2h0LAotCQlpLmRlcHRoLAotCQlpLnNjYW5saW5lUGFkLAotCQlpLmJ5dGVzUGVyTGluZSwKLQkJaS5kYXRhLAotCQlpLnBhbGV0dGUsCi0JCWkudHJhbnNwYXJlbnRQaXhlbCwKLQkJaS5tYXNrRGF0YSwKLQkJaS5tYXNrUGFkLAotCQlpLmFscGhhRGF0YSwKLQkJaS5hbHBoYSwKLQkJaS50eXBlLAotCQlpLngsCi0JCWkueSwKLQkJaS5kaXNwb3NhbE1ldGhvZCwKLQkJaS5kZWxheVRpbWUpOwotfQotCi0vKioKLSAqIFByZXZlbnRzIHVuaW5pdGlhbGl6ZWQgaW5zdGFuY2VzIGZyb20gYmVpbmcgY3JlYXRlZCBvdXRzaWRlIHRoZSBwYWNrYWdlLgotICovCi1JbWFnZURhdGEoKSB7Ci19Ci0KLS8qKgotICogQ29uc3RydWN0cyBhbiBpbWFnZSBkYXRhIGJ5IGdpdmluZyB2YWx1ZXMgZm9yIGFsbCBub24tY29tcHV0YWJsZSBmaWVsZHMuCi0gKiA8cD4KLSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2UsIGFuZCBpcyBub3QgZGVzY3JpYmVkIGZ1cnRoZXIuCi0gKiA8L3A+Ci0gKi8KLUltYWdlRGF0YSgKLQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgUGFsZXR0ZURhdGEgcGFsZXR0ZSwKLQlpbnQgc2NhbmxpbmVQYWQsIGJ5dGVbXSBkYXRhLCBpbnQgbWFza1BhZCwgYnl0ZVtdIG1hc2tEYXRhLAotCWJ5dGVbXSBhbHBoYURhdGEsIGludCBhbHBoYSwgaW50IHRyYW5zcGFyZW50UGl4ZWwsIGludCB0eXBlLAotCWludCB4LCBpbnQgeSwgaW50IGRpc3Bvc2FsTWV0aG9kLCBpbnQgZGVsYXlUaW1lKQotewotCi0JaWYgKHBhbGV0dGUgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAoIShkZXB0aCA9PSAxIHx8IGRlcHRoID09IDIgfHwgZGVwdGggPT0gNCB8fCBkZXB0aCA9PSA4Ci0JCXx8IGRlcHRoID09IDE2IHx8IGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCX0KLQlpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCX0KLQlpZiAoc2NhbmxpbmVQYWQgPT0gMCkgU1dULmVycm9yIChTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pOwotCi0JaW50IGJ5dGVzUGVyTGluZSA9ICgoKHdpZHRoICogZGVwdGggKyA3KSAvIDgpICsgKHNjYW5saW5lUGFkIC0gMSkpCi0JCS8gc2NhbmxpbmVQYWQgKiBzY2FubGluZVBhZDsKLQlzZXRBbGxGaWVsZHMoCi0JCXdpZHRoLAotCQloZWlnaHQsCi0JCWRlcHRoLAotCQlzY2FubGluZVBhZCwKLQkJYnl0ZXNQZXJMaW5lLAotCQlkYXRhICE9IG51bGwgPyBkYXRhIDogbmV3IGJ5dGVbYnl0ZXNQZXJMaW5lICogaGVpZ2h0XSwKLQkJcGFsZXR0ZSwKLQkJdHJhbnNwYXJlbnRQaXhlbCwKLQkJbWFza0RhdGEsCi0JCW1hc2tQYWQsCi0JCWFscGhhRGF0YSwKLQkJYWxwaGEsCi0JCXR5cGUsCi0JCXgsCi0JCXksCi0JCWRpc3Bvc2FsTWV0aG9kLAotCQlkZWxheVRpbWUpOwotfQotCi0vKioKLSAqIEluaXRpYWxpemVzIGFsbCBmaWVsZHMgaW4gdGhlIHJlY2VpdmVyLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZAotICogYnkgYWxsIHB1YmxpYyBjb25zdHJ1Y3RvcnMgdG8gZW5zdXJlIHRoYXQgYWxsIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQKLSAqIGZvciBhIG5ldyBJbWFnZURhdGEgb2JqZWN0LiBJZiBhIG5ldyBmaWVsZCBpcyBhZGRlZCB0byB0aGUgY2xhc3MsCi0gKiB0aGVuIGl0IG11c3QgYmUgYWRkZWQgdG8gdGhpcyBtZXRob2QuCi0gKiA8cD4KLSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2UsIGFuZCBpcyBub3QgZGVzY3JpYmVkIGZ1cnRoZXIuCi0gKiA8L3A+Ci0gKi8KLXZvaWQgc2V0QWxsRmllbGRzKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgc2NhbmxpbmVQYWQsCi0JaW50IGJ5dGVzUGVyTGluZSwgYnl0ZVtdIGRhdGEsIFBhbGV0dGVEYXRhIHBhbGV0dGUsIGludCB0cmFuc3BhcmVudFBpeGVsLAotCWJ5dGVbXSBtYXNrRGF0YSwgaW50IG1hc2tQYWQsIGJ5dGVbXSBhbHBoYURhdGEsIGludCBhbHBoYSwKLQlpbnQgdHlwZSwgaW50IHgsIGludCB5LCBpbnQgZGlzcG9zYWxNZXRob2QsIGludCBkZWxheVRpbWUpIHsKLQotCXRoaXMud2lkdGggPSB3aWR0aDsKLQl0aGlzLmhlaWdodCA9IGhlaWdodDsKLQl0aGlzLmRlcHRoID0gZGVwdGg7Ci0JdGhpcy5zY2FubGluZVBhZCA9IHNjYW5saW5lUGFkOwotCXRoaXMuYnl0ZXNQZXJMaW5lID0gYnl0ZXNQZXJMaW5lOwotCXRoaXMuZGF0YSA9IGRhdGE7Ci0JdGhpcy5wYWxldHRlID0gcGFsZXR0ZTsKLQl0aGlzLnRyYW5zcGFyZW50UGl4ZWwgPSB0cmFuc3BhcmVudFBpeGVsOwotCXRoaXMubWFza0RhdGEgPSBtYXNrRGF0YTsKLQl0aGlzLm1hc2tQYWQgPSBtYXNrUGFkOwotCXRoaXMuYWxwaGFEYXRhID0gYWxwaGFEYXRhOwotCXRoaXMuYWxwaGEgPSBhbHBoYTsKLQl0aGlzLnR5cGUgPSB0eXBlOwotCXRoaXMueCA9IHg7Ci0JdGhpcy55ID0geTsKLQl0aGlzLmRpc3Bvc2FsTWV0aG9kID0gZGlzcG9zYWxNZXRob2Q7Ci0JdGhpcy5kZWxheVRpbWUgPSBkZWxheVRpbWU7Ci19Ci0KLS8qKgkgCi0gKiBJbnZva2VzIGludGVybmFsIFNXVCBmdW5jdGlvbmFsaXR5IHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZgotICogdGhpcyBjbGFzcy4KLSAqIDxwPgotICogPGI+SU1QT1JUQU5UOjwvYj4gVGhpcyBtZXRob2QgaXMgPGVtPm5vdDwvZW0+IHBhcnQgb2YgdGhlIHB1YmxpYwotICogQVBJIGZvciA8Y29kZT5JbWFnZURhdGE8L2NvZGU+LiBJdCBpcyBtYXJrZWQgcHVibGljIG9ubHkgc28gdGhhdCBpdAotICogY2FuIGJlIHNoYXJlZCB3aXRoaW4gdGhlIHBhY2thZ2VzIHByb3ZpZGVkIGJ5IFNXVC4gSXQgaXMgc3ViamVjdAotICogdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmcm9tCi0gKiBhcHBsaWNhdGlvbiBjb2RlLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlLCBhbmQgaXMgbm90IGRlc2NyaWJlZCBmdXJ0aGVyLgotICogPC9wPgotICovCi1wdWJsaWMgc3RhdGljIEltYWdlRGF0YSBpbnRlcm5hbF9uZXcoCi0JaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIFBhbGV0dGVEYXRhIHBhbGV0dGUsCi0JaW50IHNjYW5saW5lUGFkLCBieXRlW10gZGF0YSwgaW50IG1hc2tQYWQsIGJ5dGVbXSBtYXNrRGF0YSwKLQlieXRlW10gYWxwaGFEYXRhLCBpbnQgYWxwaGEsIGludCB0cmFuc3BhcmVudFBpeGVsLCBpbnQgdHlwZSwKLQlpbnQgeCwgaW50IHksIGludCBkaXNwb3NhbE1ldGhvZCwgaW50IGRlbGF5VGltZSkKLXsKLQlyZXR1cm4gbmV3IEltYWdlRGF0YSgKLQkJd2lkdGgsIGhlaWdodCwgZGVwdGgsIHBhbGV0dGUsIHNjYW5saW5lUGFkLCBkYXRhLCBtYXNrUGFkLCBtYXNrRGF0YSwKLQkJYWxwaGFEYXRhLCBhbHBoYSwgdHJhbnNwYXJlbnRQaXhlbCwgdHlwZSwgeCwgeSwgZGlzcG9zYWxNZXRob2QsIGRlbGF5VGltZSk7Ci19Ci0KLUltYWdlRGF0YSBjb2xvck1hc2tJbWFnZShpbnQgcGl4ZWwpIHsKLQlJbWFnZURhdGEgbWFzayA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgMSwgYndQYWxldHRlKCksCi0JCTIsIG51bGwsIDAsIG51bGwsIG51bGwsIC0xLCAtMSwgU1dULklNQUdFX1VOREVGSU5FRCwKLQkJMCwgMCwgMCwgMCk7Ci0JaW50W10gcm93ID0gbmV3IGludFt3aWR0aF07Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlnZXRQaXhlbHMoMCwgeSwgd2lkdGgsIHJvdywgMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgewotCQkJaWYgKHBpeGVsICE9IC0xICYmIHJvd1tpXSA9PSBwaXhlbCkgewotCQkJCXJvd1tpXSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXJvd1tpXSA9IDE7Ci0JCQl9Ci0JCX0KLQkJbWFzay5zZXRQaXhlbHMoMCwgeSwgd2lkdGgsIHJvdywgMCk7Ci0JfQotCXJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgYnl0ZVtdIGNoZWNrRGF0YShieXRlIFtdIGRhdGEpIHsKLQlpZiAoZGF0YSA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXJldHVybiBkYXRhOwotfQotCi0vKioKLSAqIFJldHVybnMgPGNvZGU+Z2V0V2lkdGg8L2NvZGU+IHBpeGVsIHZhbHVlcyBzdGFydGluZyBhdCBvZmZzZXQKLSAqIDxjb2RlPng8L2NvZGU+IGluIHNjYW5saW5lIDxjb2RlPnk8L2NvZGU+IGluIHRoZSByZWNlaXZlcidzCi0gKiBkYXRhIHN0YXJ0aW5nIGF0IDxjb2RlPnN0YXJ0SW5kZXg8L2NvZGU+LgotICoKLSAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwaXhlbCB0byBnZXQKLSAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwaXhlbCB0byBnZXQKLSAqIEBwYXJhbSBnZXRXaWR0aCB0aGUgd2lkdGggb2YgdGhlIGRhdGEgdG8gZ2V0Ci0gKiBAcGFyYW0gcGl4ZWxzIHRoZSBidWZmZXIgaW4gd2hpY2ggdG8gcHV0IHRoZSBwaXhlbHMKLSAqIEBwYXJhbSBzdGFydEluZGV4IHRoZSBvZmZzZXQgaW50byB0aGUgYnl0ZSBhcnJheSB0byBiZWdpbiBzdG9yaW5nIHBpeGVscwotICoKLSAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBnZXRXaWR0aCBpcyB0b28gbGFyZ2UKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgcGl4ZWxzIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB4IG9yIHkgaXMgb3V0IG9mIGJvdW5kczwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIGdldFdpZHRoIGlzIG5lZ2F0aXZlPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfREVQVEggLSBpZiB0aGUgZGVwdGggaXMgbm90IG9uZSBvZiAxLCAyLCA0IG9yIDgKLSAqICAgICAgICAoRm9yIGhpZ2hlciBkZXB0aHMsIHVzZSB0aGUgaW50W10gdmVyc2lvbiBvZiB0aGlzIG1ldGhvZC4pPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCBnZXRXaWR0aCwgYnl0ZVtdIHBpeGVscywgaW50IHN0YXJ0SW5kZXgpIHsKLQlpZiAocGl4ZWxzID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKGdldFdpZHRoIDwgMCB8fCB4ID49IHdpZHRoIHx8IHkgPj0gaGVpZ2h0IHx8IHggPCAwIHx8IHkgPCAwKSBTV1QuZXJyb3IKLQotKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQlpZiAoZ2V0V2lkdGggPT0gMCkgcmV0dXJuOwotCWludCBpbmRleDsKLQlpbnQgdGhlQnl0ZTsKLQlpbnQgbWFzayA9IDA7Ci0JaW50IG4gPSBnZXRXaWR0aDsKLQlpbnQgaSA9IHN0YXJ0SW5kZXg7Ci0JaW50IHNyY1ggPSB4LCBzcmNZID0geTsKLQlpZiAoZGVwdGggPT0gMSkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDMpOwotCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW1hc2sgPSAxIDw8ICg3IC0gKHNyY1ggJiAweDcpKTsKLQkJCWlmICgodGhlQnl0ZSAmIG1hc2spID09IDApIHsKLQkJCQlwaXhlbHNbaV0gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwaXhlbHNbaV0gPSAxOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1hc2sgPT0gMSkgewotCQkJCQlpbmRleCsrOwotCQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDIpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAyKTsKLQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJaW50IG9mZnNldDsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQlvZmZzZXQgPSAzIC0gKHNyY1ggJSA0KTsKLQkJCW1hc2sgPSAzIDw8IChvZmZzZXQgKiAyKTsKLQkJCXBpeGVsc1tpXSA9IChieXRlKSgodGhlQnl0ZSAmIG1hc2spID4+IChvZmZzZXQgKiAyKSk7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2Zmc2V0ID09IDApIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDEpOwotCQlpZiAoKHggJiAweDEpID09IDEpIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSAoYnl0ZSkodGhlQnl0ZSAmIDB4MEYpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXdoaWxlIChuID4gMSkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IChieXRlKSh0aGVCeXRlID4+IDQpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwaXhlbHNbaV0gPSAoYnl0ZSkodGhlQnl0ZSAmIDB4MEYpOwotCQkJCWkrKzsKLQkJCQluLS07Ci0JCQkJc3JjWCsrOwotCQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJCXNyY1krKzsKLQkJCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCQlzcmNYID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSAoYnl0ZSkodGhlQnl0ZSA+PiA0KTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA4KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgeDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBnZXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbHNbaV0gPSBkYXRhW2luZGV4XTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCVNXVC5lcnJvcihTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotfQotCi0vKioKLSAqIFJldHVybnMgPGNvZGU+Z2V0V2lkdGg8L2NvZGU+IHBpeGVsIHZhbHVlcyBzdGFydGluZyBhdCBvZmZzZXQKLSAqIDxjb2RlPng8L2NvZGU+IGluIHNjYW5saW5lIDxjb2RlPnk8L2NvZGU+IGluIHRoZSByZWNlaXZlcidzCi0gKiBkYXRhIHN0YXJ0aW5nIGF0IDxjb2RlPnN0YXJ0SW5kZXg8L2NvZGU+LgotICoKLSAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwaXhlbCB0byBnZXQKLSAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwaXhlbCB0byBnZXQKLSAqIEBwYXJhbSBnZXRXaWR0aCB0aGUgd2lkdGggb2YgdGhlIGRhdGEgdG8gZ2V0Ci0gKiBAcGFyYW0gcGl4ZWxzIHRoZSBidWZmZXIgaW4gd2hpY2ggdG8gcHV0IHRoZSBwaXhlbHMKLSAqIEBwYXJhbSBzdGFydEluZGV4IHRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIHRvIGJlZ2luIHN0b3JpbmcgcGl4ZWxzCi0gKgotICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGdldFdpZHRoIGlzIHRvbyBsYXJnZQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiBwaXhlbHMgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHggb3IgeSBpcyBvdXQgb2YgYm91bmRzPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgZ2V0V2lkdGggaXMgbmVnYXRpdmU8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCAtIGlmIHRoZSBkZXB0aCBpcyBub3Qgb25lIG9mIDEsIDIsIDQsIDgsIDE2LCAyNCBvciAzMjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBnZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgZ2V0V2lkdGgsIGludFtdIHBpeGVscywgaW50IHN0YXJ0SW5kZXgpIHsKLQlpZiAocGl4ZWxzID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKGdldFdpZHRoIDwgMCB8fCB4ID49IHdpZHRoIHx8IHkgPj0gaGVpZ2h0IHx8IHggPCAwIHx8IHkgPCAwKSBTV1QuZXJyb3IKLQotKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQlpZiAoZ2V0V2lkdGggPT0gMCkgcmV0dXJuOwotCWludCBpbmRleDsKLQlpbnQgdGhlQnl0ZTsKLQlpbnQgbWFzazsKLQlpbnQgbiA9IGdldFdpZHRoOwotCWludCBpID0gc3RhcnRJbmRleDsKLQlpbnQgc3JjWCA9IHgsIHNyY1kgPSB5OwotCWlmIChkZXB0aCA9PSAxKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMyk7Ci0JCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJbWFzayA9IDEgPDwgKDcgLSAoc3JjWCAmIDB4NykpOwotCQkJaWYgKCh0aGVCeXRlICYgbWFzaykgPT0gMCkgewotCQkJCXBpeGVsc1tpXSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBpeGVsc1tpXSA9IDE7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobWFzayA9PSAxKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0JCQotCWlmIChkZXB0aCA9PSAyKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMik7Ci0JCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCWludCBvZmZzZXQ7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJb2Zmc2V0ID0gMyAtIChzcmNYICUgNCk7Ci0JCQltYXNrID0gMyA8PCAob2Zmc2V0ICogMik7Ci0JCQlwaXhlbHNbaV0gPSAoYnl0ZSkoKHRoZUJ5dGUgJiBtYXNrKSA+PiAob2Zmc2V0ICogMikpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAxKTsKLQkJaWYgKCh4ICYgMHgxKSA9PSAxKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gdGhlQnl0ZSAmIDB4MEY7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKG4gPiAxKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gdGhlQnl0ZSA+PiA0OwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwaXhlbHNbaV0gPSB0aGVCeXRlICYgMHgwRjsKLQkJCQlpKys7Ci0JCQkJbi0tOwotCQkJCXNyY1grKzsKLQkJCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCQlzcmNZKys7Ci0JCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQkJc3JjWCA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gdGhlQnl0ZSA+PiA0OwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDgpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyB4OwotCQlmb3IgKGludCBqID0gMDsgaiA8IGdldFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsc1tpXSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAxNikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogMik7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZ2V0V2lkdGg7IGorKykgewotCQkJcGl4ZWxzW2ldID0gKChkYXRhW2luZGV4KzFdICYgMHhGRikgPDwgOCkgKyAoZGF0YVtpbmRleF0gJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gMjsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAyNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogMyk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZ2V0V2lkdGg7IGorKykgewotCQkJcGl4ZWxzW2ldID0gKChkYXRhW2luZGV4XSAmIDB4RkYpIDw8IDE2KSB8ICgoZGF0YVtpbmRleCsxXSAmIDB4RkYpIDw8IDgpCi0JCQkJfCAoZGF0YVtpbmRleCsyXSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSAzOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDMyKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiA0KTsKLQkJaSA9IHN0YXJ0SW5kZXg7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZ2V0V2lkdGg7IGorKykgewotCQkJcGl4ZWxzW2ldID0gKChkYXRhW2luZGV4XSAmIDB4RkYpIDw8IDI0KSB8ICgoZGF0YVtpbmRleCsxXSAmIDB4RkYpIDw8IDE2KQotCQkJCXwgKChkYXRhW2luZGV4KzJdICYgMHhGRikgPDwgOCkgfCAoZGF0YVtpbmRleCszXSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSA0OwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbiBhcnJheSBvZiA8Y29kZT5SR0I8L2NvZGU+cyB3aGljaCBjb21wcmlzZSB0aGUKLSAqIGluZGV4ZWQgY29sb3IgdGFibGUgb2YgdGhlIHJlY2VpdmVyLCBvciBudWxsIGlmIHRoZSByZWNlaXZlcgotICogaGFzIGEgZGlyZWN0IGNvbG9yIG1vZGVsLgotICoKLSAqIEByZXR1cm4gdGhlIFJHQiB2YWx1ZXMgZm9yIHRoZSBpbWFnZSBvciBudWxsIGlmIGRpcmVjdCBjb2xvcgotICoKLSAqIEBzZWUgUGFsZXR0ZURhdGEjZ2V0UkdCcygpCi0gKi8KLXB1YmxpYyBSR0JbXSBnZXRSR0JzKCkgewotCXJldHVybiBwYWxldHRlLmdldFJHQnMoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGFuIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gd2hpY2ggc3BlY2lmaWVzIHRoZQotICogdHJhbnNwYXJlbmN5IG1hc2sgaW5mb3JtYXRpb24gZm9yIHRoZSByZWNlaXZlciwgb3IgbnVsbCBpZiB0aGUKLSAqIHJlY2VpdmVyIGhhcyBubyB0cmFuc3BhcmVuY3kgYW5kIGlzIG5vdCBhbiBpY29uLgotICoKLSAqIEByZXR1cm4gdGhlIHRyYW5zcGFyZW5jeSBtYXNrIG9yIG51bGwgaWYgbm9uZSBleGlzdHMKLSAqLwotcHVibGljIEltYWdlRGF0YSBnZXRUcmFuc3BhcmVuY3lNYXNrKCkgewotCWlmIChnZXRUcmFuc3BhcmVuY3lUeXBlKCkgPT0gU1dULlRSQU5TUEFSRU5DWV9NQVNLKSB7Ci0JCXJldHVybiBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIDEsIGJ3UGFsZXR0ZSgpLCBtYXNrUGFkLCBtYXNrRGF0YSk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIGNvbG9yTWFza0ltYWdlKHRyYW5zcGFyZW50UGl4ZWwpOwotCX0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBpbWFnZSB0cmFuc3BhcmVuY3kgdHlwZS4KLSAqCi0gKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIHRyYW5zcGFyZW5jeSB0eXBlCi0gKi8KLXB1YmxpYyBpbnQgZ2V0VHJhbnNwYXJlbmN5VHlwZSgpIHsKLQlpZiAobWFza0RhdGEgIT0gbnVsbCkgcmV0dXJuIFNXVC5UUkFOU1BBUkVOQ1lfTUFTSzsKLQlpZiAodHJhbnNwYXJlbnRQaXhlbCAhPSAtMSkgcmV0dXJuIFNXVC5UUkFOU1BBUkVOQ1lfUElYRUw7Ci0JaWYgKGFscGhhRGF0YSAhPSBudWxsKSByZXR1cm4gU1dULlRSQU5TUEFSRU5DWV9BTFBIQTsKLQlyZXR1cm4gU1dULlRSQU5TUEFSRU5DWV9OT05FOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIHJlY2VpdmVyLgotICogCi0gKiBAcmV0dXJuIE1TQl9GSVJTVCBvciBMU0JfRklSU1QKLSAqLwotaW50IGdldEJ5dGVPcmRlcigpIHsKLQlyZXR1cm4gZGVwdGggIT0gMTYgPyBNU0JfRklSU1QgOiBMU0JfRklSU1Q7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgcGl4ZWwgdmFsdWVzIHN0YXJ0aW5nIGF0IG9mZnNldCA8Y29kZT54PC9jb2RlPiBpbgotICogc2NhbmxpbmUgPGNvZGU+eTwvY29kZT4gaW4gdGhlIHJlY2VpdmVyJ3MgZGF0YSB0byB0aGUKLSAqIHZhbHVlcyBmcm9tIHRoZSBhcnJheSA8Y29kZT5waXhlbHM8L2NvZGU+IHN0YXJ0aW5nIGF0Ci0gKiA8Y29kZT5zdGFydEluZGV4PC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgcGl4ZWwgdG8gc2V0Ci0gKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgcGl4ZWwgdG8gc2V0Ci0gKiBAcGFyYW0gcHV0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBwaXhlbHMgdG8gc2V0Ci0gKiBAcGFyYW0gcGl4ZWxzIHRoZSBwaXhlbHMgdG8gc2V0Ci0gKiBAcGFyYW0gc3RhcnRJbmRleCB0aGUgaW5kZXggYXQgd2hpY2ggdG8gYmVnaW4gc2V0dGluZwotICoKLSAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBwdXRXaWR0aCBpcyB0b28gbGFyZ2UKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgcGl4ZWxzIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB4IG9yIHkgaXMgb3V0IG9mIGJvdW5kczwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHB1dFdpZHRoIGlzIG5lZ2F0aXZlPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfREVQVEggaWYgdGhlIGRlcHRoIGlzIG5vdCBvbmUgb2YgMSwgMiwgNCwgOAotICogICAgICAgIChGb3IgaGlnaGVyIGRlcHRocywgdXNlIHRoZSBpbnRbXSB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kLik8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHB1dFdpZHRoLCBieXRlW10gcGl4ZWxzLCBpbnQgc3RhcnRJbmRleCkgewotCWlmIChwaXhlbHMgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAocHV0V2lkdGggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA+PSBoZWlnaHQgfHwgeCA8IDAgfHwgeSA8IDApIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JaWYgKHB1dFdpZHRoID09IDApIHJldHVybjsKLQlpbnQgaW5kZXg7Ci0JaW50IHRoZUJ5dGU7Ci0JaW50IG1hc2s7Ci0JaW50IG4gPSBwdXRXaWR0aDsKLQlpbnQgaSA9IHN0YXJ0SW5kZXg7Ci0JaW50IHNyY1ggPSB4LCBzcmNZID0geTsKLQlpZiAoZGVwdGggPT0gMSkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDMpOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW1hc2sgPSAxIDw8ICg3IC0gKHNyY1ggJiAweDcpKTsKLQkJCWlmICgocGl4ZWxzW2ldICYgMHgxKSA9PSAxKSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGRikgfCBtYXNrKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGRikgJiAobWFzayBeIC0xKSk7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtYXNrID09IDEpIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMikgewotCQlieXRlIFtdIG1hc2tzID0geyAoYnl0ZSkweEZDLCAoYnl0ZSkweEYzLCAoYnl0ZSkweENGLCAoYnl0ZSkweDNGIH07Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMik7Ci0JCWludCBvZmZzZXQgPSAzIC0gKHggJSA0KTsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gcGl4ZWxzW2ldICYgMHgzOwotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgbWFza3Nbb2Zmc2V0XSkgfCAodGhlQnl0ZSA8PCAob2Zmc2V0ICogMikpKTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlvZmZzZXQgPSAwOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2Zmc2V0ID09IDApIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJb2Zmc2V0ID0gMzsKLQkJCQl9IGVsc2UgewotCQkJCQlvZmZzZXQtLTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDEpOwotCQlib29sZWFuIGhpZ2ggPSAoeCAmIDB4MSkgPT0gMDsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gcGl4ZWxzW2ldICYgMHgwRjsKLQkJCWlmIChoaWdoKSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHgwRikgfCAodGhlQnl0ZSA8PCA0KSk7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RjApIHwgdGhlQnl0ZSk7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaGlnaCA9IHRydWU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghaGlnaCkgaW5kZXgrKzsKLQkJCQloaWdoID0gIWhpZ2g7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gOCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArIHg7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHV0V2lkdGg7IGorKykgewotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkocGl4ZWxzW2ldICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBwaXhlbCB2YWx1ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0IDxjb2RlPng8L2NvZGU+IGluCi0gKiBzY2FubGluZSA8Y29kZT55PC9jb2RlPiBpbiB0aGUgcmVjZWl2ZXIncyBkYXRhIHRvIHRoZQotICogdmFsdWVzIGZyb20gdGhlIGFycmF5IDxjb2RlPnBpeGVsczwvY29kZT4gc3RhcnRpbmcgYXQKLSAqIDxjb2RlPnN0YXJ0SW5kZXg8L2NvZGU+LgotICoKLSAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBwaXhlbCB0byBzZXQKLSAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIG9mIHRoZSBwaXhlbCB0byBzZXQKLSAqIEBwYXJhbSBwdXRXaWR0aCB0aGUgd2lkdGggb2YgdGhlIHBpeGVscyB0byBzZXQKLSAqIEBwYXJhbSBwaXhlbHMgdGhlIHBpeGVscyB0byBzZXQKLSAqIEBwYXJhbSBzdGFydEluZGV4IHRoZSBpbmRleCBhdCB3aGljaCB0byBiZWdpbiBzZXR0aW5nCi0gKgotICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHB1dFdpZHRoIGlzIHRvbyBsYXJnZQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiBwaXhlbHMgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHggb3IgeSBpcyBvdXQgb2YgYm91bmRzPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgcHV0V2lkdGggaXMgbmVnYXRpdmU8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCBpZiB0aGUgZGVwdGggaXMgbm90IG9uZSBvZiAxLCAyLCA0LCA4LCAxNiwgMjQgb3IgMzI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHB1dFdpZHRoLCBpbnRbXSBwaXhlbHMsIGludCBzdGFydEluZGV4KSB7Ci0JaWYgKHBpeGVscyA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmIChwdXRXaWR0aCA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5ID49IGhlaWdodCB8fCB4IDwgMCB8fCB5IDwgMCkgU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQlpZiAocHV0V2lkdGggPT0gMCkgcmV0dXJuOwotCWludCBpbmRleDsKLQlpbnQgdGhlQnl0ZTsKLQlpbnQgbWFzazsKLQlpbnQgbiA9IHB1dFdpZHRoOwotCWludCBpID0gc3RhcnRJbmRleDsKLQlpbnQgcGl4ZWw7Ci0JaW50IHNyY1ggPSB4LCBzcmNZID0geTsKLQlpZiAoZGVwdGggPT0gMSkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDMpOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW1hc2sgPSAxIDw8ICg3IC0gKHNyY1ggJiAweDcpKTsKLQkJCWlmICgocGl4ZWxzW2ldICYgMHgxKSA9PSAxKSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGRikgfCBtYXNrKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGRikgJiAobWFzayBeIC0xKSk7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtYXNrID09IDEpIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMikgewotCQlieXRlIFtdIG1hc2tzID0geyAoYnl0ZSkweEZDLCAoYnl0ZSkweEYzLCAoYnl0ZSkweENGLCAoYnl0ZSkweDNGIH07Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMik7Ci0JCWludCBvZmZzZXQgPSAzIC0gKHggJSA0KTsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gcGl4ZWxzW2ldICYgMHgzOwotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgbWFza3Nbb2Zmc2V0XSkgfCAodGhlQnl0ZSA8PCAob2Zmc2V0ICogMikpKTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlvZmZzZXQgPSAzOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2Zmc2V0ID09IDApIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJb2Zmc2V0ID0gMzsKLQkJCQl9IGVsc2UgewotCQkJCQlvZmZzZXQtLTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDEpOwotCQlib29sZWFuIGhpZ2ggPSAoeCAmIDB4MSkgPT0gMDsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gcGl4ZWxzW2ldICYgMHgwRjsKLQkJCWlmIChoaWdoKSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHgwRikgfCAodGhlQnl0ZSA8PCA0KSk7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RjApIHwgdGhlQnl0ZSk7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaGlnaCA9IHRydWU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghaGlnaCkgaW5kZXgrKzsKLQkJCQloaWdoID0gIWhpZ2g7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gOCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArIHg7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHV0V2lkdGg7IGorKykgewotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkocGl4ZWxzW2ldICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCi0JfQotCWlmIChkZXB0aCA9PSAxNikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogMik7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHV0V2lkdGg7IGorKykgewotCQkJcGl4ZWwgPSBwaXhlbHNbaV07Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKShwaXhlbCAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDFdID0gKGJ5dGUpKChwaXhlbCA+PiA4KSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSAyOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDI0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiAzKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwdXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbCA9IHBpeGVsc1tpXTsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChwaXhlbCA+PiAxNikgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAxXSA9IChieXRlKSgocGl4ZWwgPj4gOCkgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAyXSA9IChieXRlKShwaXhlbCAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSAzOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDMyKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiA0KTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwdXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbCA9IHBpeGVsc1tpXTsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChwaXhlbCA+PiAyNCkgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAxXSA9IChieXRlKSgocGl4ZWwgPj4gMTYpICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgMl0gPSAoYnl0ZSkoKHBpeGVsID4+IDgpICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgM10gPSAoYnl0ZSkocGl4ZWwgJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gNDsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCVNXVC5lcnJvcihTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBwYWxldHRlIHdpdGggMiBjb2xvcnM6IGJsYWNrICYgd2hpdGUuCi0gKi8KLXN0YXRpYyBQYWxldHRlRGF0YSBid1BhbGV0dGUoKSB7Ci0JcmV0dXJuIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KTsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGZvcgotICogdGhlIGdpdmVuIG1hc2suCi0gKi8KLXN0YXRpYyBpbnQgZ2V0TVNCT2Zmc2V0KGludCBtYXNrKSB7Ci0JZm9yIChpbnQgaSA9IDMxOyBpID49IDA7IGktLSkgewotCQlpZiAoKChtYXNrID4+IGkpICYgMHgxKSAhPSAwKSByZXR1cm4gaSArIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoLgotICovCi1zdGF0aWMgaW50IGNsb3Nlc3RNYXRjaChpbnQgZGVwdGgsIGJ5dGUgcmVkLCBieXRlIGdyZWVuLCBieXRlIGJsdWUsIGludCByZWRNYXNrLCBpbnQgZ3JlZW5NYXNrLCBpbnQgYmx1ZU1hc2ssIGJ5dGVbXSByZWRzLCBieXRlW10gZ3JlZW5zLCBieXRlW10gYmx1ZXMpIHsKLQlpZiAoZGVwdGggPiA4KSB7Ci0JCWludCByc2hpZnQgPSAzMiAtIGdldE1TQk9mZnNldChyZWRNYXNrKTsKLQkJaW50IGdzaGlmdCA9IDMyIC0gZ2V0TVNCT2Zmc2V0KGdyZWVuTWFzayk7Ci0JCWludCBic2hpZnQgPSAzMiAtIGdldE1TQk9mZnNldChibHVlTWFzayk7Ci0JCXJldHVybiAoKChyZWQgPDwgMjQpID4+PiByc2hpZnQpICYgcmVkTWFzaykgfAotCQkJKCgoZ3JlZW4gPDwgMjQpID4+PiBnc2hpZnQpICYgZ3JlZW5NYXNrKSB8Ci0JCQkoKChibHVlIDw8IDI0KSA+Pj4gYnNoaWZ0KSAmIGJsdWVNYXNrKTsKLQl9Ci0JaW50IHIsIGcsIGI7Ci0JaW50IG1pbkRpc3RhbmNlID0gMHg3ZmZmZmZmZjsKLQlpbnQgbmVhcmVzdFBpeGVsID0gMDsKLQlpbnQgbiA9IHJlZHMubGVuZ3RoOwotCWZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0JCXIgPSAocmVkc1tqXSAmIDB4RkYpIC0gKHJlZCAmIDB4RkYpOwotCQlnID0gKGdyZWVuc1tqXSAmIDB4RkYpIC0gKGdyZWVuICYgMHhGRik7Ci0JCWIgPSAoYmx1ZXNbal0gJiAweEZGKSAtIChibHVlICYgMHhGRik7Ci0JCWludCBkaXN0YW5jZSA9IHIqciArIGcqZyArIGIqYjsKLQkJaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHsKLQkJCW5lYXJlc3RQaXhlbCA9IGo7Ci0JCQlpZiAoZGlzdGFuY2UgPT0gMCkgYnJlYWs7Ci0JCQltaW5EaXN0YW5jZSA9IGRpc3RhbmNlOwotCQl9Ci0JfQotCXJldHVybiBuZWFyZXN0UGl4ZWw7Ci19Ci0KLXN0YXRpYyBmaW5hbCBJbWFnZURhdGEgY29udmVydE1hc2soSW1hZ2VEYXRhIG1hc2spIHsKLQlpZiAobWFzay5kZXB0aCA9PSAxKSByZXR1cm4gbWFzazsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsMjU1LDI1NSl9KTsKLQlJbWFnZURhdGEgbmV3TWFzayA9IG5ldyBJbWFnZURhdGEobWFzay53aWR0aCwgbWFzay5oZWlnaHQsIDEsIHBhbGV0dGUpOwotCS8qIEZpbmQgaW5kZXggb2YgYmxhY2sgaW4gbWFzayBwYWxldHRlICovCi0JaW50IGJsYWNrSW5kZXggPSAwOwotCVJHQltdIHJnYnMgPSBtYXNrLmdldFJHQnMoKTsKLQlpZiAocmdicyAhPSBudWxsKSB7Ci0JCXdoaWxlIChibGFja0luZGV4IDwgcmdicy5sZW5ndGgpIHsKLQkJCWlmIChyZ2JzW2JsYWNrSW5kZXhdLmVxdWFscyhwYWxldHRlLmNvbG9yc1swXSkpIGJyZWFrOwotCQkJYmxhY2tJbmRleCsrOwotCQl9Ci0JfQotCWludFtdIHBpeGVscyA9IG5ldyBpbnRbbWFzay53aWR0aF07Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBtYXNrLmhlaWdodDsgeSsrKSB7Ci0JCW1hc2suZ2V0UGl4ZWxzKDAsIHksIG1hc2sud2lkdGgsIHBpeGVscywgMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGl4ZWxzW2ldID09IGJsYWNrSW5kZXgpIHsKLQkJCQlwaXhlbHNbaV0gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwaXhlbHNbaV0gPSAxOwotCQkJfQotCQl9Ci0JCW5ld01hc2suc2V0UGl4ZWxzKDAsIHksIG1hc2sud2lkdGgsIHBpeGVscywgMCk7Ci0JfQotCXJldHVybiBuZXdNYXNrOwotfQotCi1zdGF0aWMgZmluYWwgYnl0ZVtdIGNvbnZlcnRQYWQoYnl0ZVtdIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgcGFkLCBpbnQgbmV3UGFkKSB7Ci0JaWYgKHBhZCA9PSBuZXdQYWQpIHJldHVybiBkYXRhOwotCWludCBzdHJpZGUgPSAod2lkdGggKiBkZXB0aCArIDcpIC8gODsKLQlpbnQgYnBsID0gKHN0cmlkZSArIChwYWQgLSAxKSkgLyBwYWQgKiBwYWQ7CQotCWludCBuZXdCcGwgPSAoc3RyaWRlICsgKG5ld1BhZCAtIDEpKSAvIG5ld1BhZCAqIG5ld1BhZDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlW2hlaWdodCAqIG5ld0JwbF07Ci0JaW50IHNyY0luZGV4ID0gMCwgZGVzdEluZGV4ID0gMDsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgc3RyaWRlKTsKLQkJc3JjSW5kZXggKz0gYnBsOwotCQlkZXN0SW5kZXggKz0gbmV3QnBsOwotCX0KLQlyZXR1cm4gbmV3RGF0YTsKLX0KLQotLyoqCi0gKiBCbGl0IG9wZXJhdGlvbiBiaXRzIHRvIGJlIE9SJ2VkIHRvZ2V0aGVyIHRvIHNwZWNpZnkgdGhlIGRlc2lyZWQgb3BlcmF0aW9uLgotICovCi1zdGF0aWMgZmluYWwgaW50Ci0JQkxJVF9TUkMgPSAxLCAgICAgLy8gY29weSBzb3VyY2UgZGlyZWN0bHksIGVsc2UgYXBwbGllcyBsb2dpYyBvcGVyYXRpb25zCi0JQkxJVF9BTFBIQSA9IDIsICAgLy8gZW5hYmxlIGFscGhhIGJsZW5kaW5nCi0JQkxJVF9ESVRIRVIgPSA0OyAgLy8gZW5hYmxlIGRpdGhlcmluZyBpbiBsb3cgY29sb3IgbW9kZXMKLQotLyoqCi0gKiBBbHBoYSBtb2RlLCB2YWx1ZXMgMCAtIDI1NSBzcGVjaWZ5IGdsb2JhbCBhbHBoYSBsZXZlbAotICovCi1zdGF0aWMgZmluYWwgaW50Ci0JQUxQSEFfT1BBUVVFID0gMjU1LCAgICAgICAgICAgLy8gRnVsbHkgb3BhcXVlIChpZ25vcmVzIGFueSBhbHBoYSBkYXRhKQotCUFMUEhBX1RSQU5TUEFSRU5UID0gMCwgICAgICAgIC8vIEZ1bGx5IHRyYW5zcGFyZW50IChpZ25vcmVzIGFueSBhbHBoYSBkYXRhKQotCUFMUEhBX0NIQU5ORUxfU0VQQVJBVEUgPSAtMSwgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGZyb20gc2VwYXJhdGUgYWxwaGFEYXRhCi0JQUxQSEFfQ0hBTk5FTF9TT1VSQ0UgPSAtMiwgICAgLy8gVXNlIGFscGhhIGNoYW5uZWwgZW1iZWRkZWQgaW4gc291cmNlRGF0YQotCUFMUEhBX01BU0tfVU5QQUNLRUQgPSAtMywgICAgIC8vIFVzZSB0cmFuc3BhcmVuY3kgbWFzayBmb3JtZWQgYnkgYnl0ZXMgaW4gYWxwaGFEYXRhIChub24temVybyBpcyBvcGFxdWUpCi0JQUxQSEFfTUFTS19QQUNLRUQgPSAtNCwgICAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBwYWNrZWQgYml0cyBpbiBhbHBoYURhdGEKLQlBTFBIQV9NQVNLX0lOREVYID0gLTUsICAgICAgICAvLyBDb25zaWRlciBzb3VyY2UgcGFsZXR0ZSBpbmRpY2VzIHRyYW5zcGFyZW50IGlmIGluIGFscGhhRGF0YSBhcnJheQotCUFMUEhBX01BU0tfUkdCID0gLTY7ICAgICAgICAgIC8vIENvbnNpZGVyIHNvdXJjZSBSR0JzIHRyYW5zcGFyZW50IGlmIGluIFJHQjg4OCBmb3JtYXQgYWxwaGFEYXRhIGFycmF5Ci0KLS8qKgotICogQnl0ZSBhbmQgYml0IG9yZGVyIGNvbnN0YW50cy4KLSAqLwotc3RhdGljIGZpbmFsIGludCBMU0JfRklSU1QgPSAwOwotc3RhdGljIGZpbmFsIGludCBNU0JfRklSU1QgPSAxOwotCi0vKioKLSAqIERhdGEgdHlwZXMgKGludGVybmFsKQotICovCi0vL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludAotLy8JLy8gZGlyZWN0IC8gdHJ1ZSBjb2xvciBmb3JtYXRzIHdpdGggYXJiaXRyYXJ5IG1hc2tzICYgc2hpZnRzCi0vLwlUWVBFX0dFTkVSSUNfOCA9IDAsCi0vLwlUWVBFX0dFTkVSSUNfMTZfTVNCID0gMSwKLS8vCVRZUEVfR0VORVJJQ18xNl9MU0IgPSAyLAotLy8JVFlQRV9HRU5FUklDXzI0ID0gMywKLS8vCVRZUEVfR0VORVJJQ18zMl9NU0IgPSA0LAotLy8JVFlQRV9HRU5FUklDXzMyX0xTQiA9IDUsCi0vLwkvLyBwYWxldHRlIGluZGV4ZWQgY29sb3IgZm9ybWF0cwotLy8JVFlQRV9JTkRFWF84ID0gNiwKLS8vCVRZUEVfSU5ERVhfNCA9IDcsCi0vLwlUWVBFX0lOREVYXzIgPSA4LAotLy8JVFlQRV9JTkRFWF8xX01TQiA9IDksCi0vLwlUWVBFX0lOREVYXzFfTFNCID0gMTA7Ci0KLS8qKgotICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgc2hpZnQgZnJvbSBhIG1hc2suCi0gKi8KLXN0YXRpYyBpbnQgZ2V0Q2hhbm5lbFNoaWZ0KGludCBtYXNrKSB7Ci0JaWYgKG1hc2sgPT0gMCkgcmV0dXJuIDA7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgKChtYXNrICYgMSkgPT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQltYXNrID4+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+IChkZSAtIGRwKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJZGVzdFtkcF0gPSB0aGVCeXRlOwotCQkJCWRwKys7Ci0JCQl9Ci0JCQl4ICs9IGxlbjsKLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLWJvb2xlYW4gaXNGaWxlRm9ybWF0KExFRGF0YUlucHV0U3RyZWFtIHN0cmVhbSkgewotCXRyeSB7Ci0JCWJ5dGVbXSBoZWFkZXIgPSBuZXcgYnl0ZVsxOF07Ci0JCXN0cmVhbS5yZWFkKGhlYWRlcik7Ci0JCXN0cmVhbS51bnJlYWQoaGVhZGVyKTsKLQkJaW50IGluZm9IZWFkZXJTaXplID0gKGhlYWRlclsxNF0gJiAweEZGKSB8ICgoaGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpIHwgKChoZWFkZXJbMTZdICYgMHhGRikgPDwgMTYpIHwgKChoZWFkZXJbMTddICYgMHhGRikgPDwgMjQpOwotCQlyZXR1cm4gaGVhZGVyWzBdID09IDB4NDIgJiYgaGVhZGVyWzFdID09IDB4NEQgJiYgaW5mb0hlYWRlclNpemUgPj0gQk1QSGVhZGVyRml4ZWRTaXplOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci1ieXRlW10gbG9hZERhdGEoYnl0ZVtdIGluZm9IZWFkZXIpIHsKLQlpbnQgd2lkdGggPSAoaW5mb0hlYWRlcls0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzVdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbNl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbN10gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGhlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBiaXRDb3VudCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCWludCBzdHJpZGUgPSAod2lkdGggKiBiaXRDb3VudCArIDcpIC8gODsKLQlzdHJpZGUgPSAoc3RyaWRlICsgMykgLyA0ICogNDsgLy8gUm91bmQgdXAgdG8gNCBieXRlIG11bHRpcGxlCi0JYnl0ZVtdIGRhdGEgPSBsb2FkRGF0YShpbmZvSGVhZGVyLCBzdHJpZGUpOwotCWZsaXBTY2FuTGluZXMoZGF0YSwgc3RyaWRlLCBoZWlnaHQpOwotCXJldHVybiBkYXRhOwotfQotYnl0ZVtdIGxvYWREYXRhKGJ5dGVbXSBpbmZvSGVhZGVyLCBpbnQgc3RyaWRlKSB7Ci0JaW50IGhlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBkYXRhU2l6ZSA9IGhlaWdodCAqIHN0cmlkZTsKLQlieXRlW10gZGF0YSA9IG5ldyBieXRlW2RhdGFTaXplXTsKLQlpbnQgY21wID0gKGluZm9IZWFkZXJbMTZdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTddICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMThdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzE5XSAmIDB4RkYpIDw8IDI0KTsKLQlpZiAoY21wID09IDApIHsgLy8gQk1QX05PX0NPTVBSRVNTSU9OCi0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0ucmVhZChkYXRhKSAhPSBkYXRhU2l6ZSkKLQkJCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWludCBjb21wcmVzc2VkU2l6ZSA9IChpbmZvSGVhZGVyWzIwXSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzIxXSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzIyXSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsyM10gJiAweEZGKSA8PCAyNCk7Ci0JCWJ5dGVbXSBjb21wcmVzc2VkID0gbmV3IGJ5dGVbY29tcHJlc3NlZFNpemVdOwotCQl0cnkgewotCQkJaWYgKGlucHV0U3RyZWFtLnJlYWQoY29tcHJlc3NlZCkgIT0gY29tcHJlc3NlZFNpemUpCi0JCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCX0KLQkJZGVjb21wcmVzc0RhdGEoY29tcHJlc3NlZCwgZGF0YSwgc3RyaWRlLCBjbXApOwotCX0KLQlyZXR1cm4gZGF0YTsKLX0KLWludFtdIGxvYWRGaWxlSGVhZGVyKCkgewotCWludFtdIGhlYWRlciA9IG5ldyBpbnRbNV07Ci0JdHJ5IHsKLQkJaGVhZGVyWzBdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCWhlYWRlclsxXSA9IGlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJaGVhZGVyWzJdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCWhlYWRlclszXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQloZWFkZXJbNF0gPSBpbnB1dFN0cmVhbS5yZWFkSW50KCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaWYgKGhlYWRlclswXSAhPSAweDRENDIpCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JcmV0dXJuIGhlYWRlcjsKLX0KLUltYWdlRGF0YVtdIGxvYWRGcm9tQnl0ZVN0cmVhbSgpIHsKLQlpbnRbXSBmaWxlSGVhZGVyID0gbG9hZEZpbGVIZWFkZXIoKTsKLQlieXRlW10gaW5mb0hlYWRlciA9IG5ldyBieXRlW0JNUEhlYWRlckZpeGVkU2l6ZV07Ci0JdHJ5IHsKLQkJaW5wdXRTdHJlYW0ucmVhZChpbmZvSGVhZGVyKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaW50IHdpZHRoID0gKGluZm9IZWFkZXJbNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls1XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzZdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzddICYgMHhGRikgPDwgMjQpOwotCWludCBoZWlnaHQgPSAoaW5mb0hlYWRlcls4XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMTBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzExXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgYml0Q291bnQgPSAoaW5mb0hlYWRlclsxNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxNV0gJiAweEZGKSA8PCA4KTsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbG9hZFBhbGV0dGUoaW5mb0hlYWRlcik7Ci0JaWYgKGlucHV0U3RyZWFtLmdldFBvc2l0aW9uKCkgPCBmaWxlSGVhZGVyWzRdKSB7Ci0JCS8vIFNlZWsgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQKLQkJdHJ5IHsKLQkJCWlucHV0U3RyZWFtLnNraXAoZmlsZUhlYWRlcls0XSAtIGlucHV0U3RyZWFtLmdldFBvc2l0aW9uKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJfQotCX0KLQlieXRlW10gZGF0YSA9IGxvYWREYXRhKGluZm9IZWFkZXIpOwotCXRoaXMuY29tcHJlc3Npb24gPSAoaW5mb0hlYWRlclsxNl0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxN10gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxOF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTldICYgMHhGRikgPDwgMjQpOwotCXRoaXMuaW1wb3J0YW50Q29sb3JzID0gKGluZm9IZWFkZXJbMzZdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMzddICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMzhdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzM5XSAmIDB4RkYpIDw8IDI0KTsKLS8vCWludCB4UGVsc1Blck1ldGVyID0gKGluZm9IZWFkZXJbMjRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMjVdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMjZdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzI3XSAmIDB4RkYpIDw8IDI0KTsKLS8vCWludCB5UGVsc1Blck1ldGVyID0gKGluZm9IZWFkZXJbMjhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMjldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMzBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzMxXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgdHlwZSA9ICh0aGlzLmNvbXByZXNzaW9uID09IDEgLypCTVBfUkxFOF9DT01QUkVTU0lPTiovKSB8fCAodGhpcy5jb21wcmVzc2lvbiA9PSAyIAotCi0vKkJNUF9STEU0X0NPTVBSRVNTSU9OKi8pID8gU1dULklNQUdFX0JNUF9STEUgOiBTV1QuSU1BR0VfQk1QOwotCXJldHVybiBuZXcgSW1hZ2VEYXRhW10gewotCQlJbWFnZURhdGEuaW50ZXJuYWxfbmV3KAotCQkJd2lkdGgsCi0JCQloZWlnaHQsCi0JCQliaXRDb3VudCwKLQkJCXBhbGV0dGUsCi0JCQk0LAotCQkJZGF0YSwKLQkJCTAsCi0JCQludWxsLAotCQkJbnVsbCwKLQkJCS0xLAotCQkJLTEsCi0JCQl0eXBlLAotCQkJMCwKLQkJCTAsCi0JCQkwLAotCQkJMCkKLQl9OwotfQotUGFsZXR0ZURhdGEgbG9hZFBhbGV0dGUoYnl0ZVtdIGluZm9IZWFkZXIpIHsKLQlpbnQgZGVwdGggPSAoaW5mb0hlYWRlclsxNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxNV0gJiAweEZGKSA8PCA4KTsKLQlpZiAoZGVwdGggPD0gOCkgewotCQlpbnQgbnVtQ29sb3JzID0gKGluZm9IZWFkZXJbMzJdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMzNdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMzRdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzM1XSAmIDB4RkYpIDw8IDI0KTsKLQkJaWYgKG51bUNvbG9ycyA9PSAwKSB7Ci0JCQludW1Db2xvcnMgPSAxIDw8IGRlcHRoOwotCQl9IGVsc2UgewotCQkJaWYgKG51bUNvbG9ycyA+IDI1NikKLQkJCQludW1Db2xvcnMgPSAyNTY7Ci0JCX0KLQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW251bUNvbG9ycyAqIDRdOwotCQl0cnkgewotCQkJaWYgKGlucHV0U3RyZWFtLnJlYWQoYnVmKSAhPSBidWYubGVuZ3RoKQotCQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCQl9Ci0JCXJldHVybiBwYWxldHRlRnJvbUJ5dGVzKGJ1ZiwgbnVtQ29sb3JzKTsKLQl9Ci0JaWYgKGRlcHRoID09IDE2KSByZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4N0MwMCwgMHgzRTAsIDB4MUYpOwotCWlmIChkZXB0aCA9PSAyNCkgcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweEZGLCAweEZGMDAsIDB4RkYwMDAwKTsKLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4RkYwMCwgMHhGRjAwMDAsIDB4RkYwMDAwMDApOwotfQotUGFsZXR0ZURhdGEgcGFsZXR0ZUZyb21CeXRlcyhieXRlW10gYnl0ZXMsIGludCBudW1Db2xvcnMpIHsKLQlpbnQgYnl0ZXNPZmZzZXQgPSAwOwotCVJHQltdIGNvbG9ycyA9IG5ldyBSR0JbbnVtQ29sb3JzXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbG9yczsgaSsrKSB7Ci0JCWNvbG9yc1tpXSA9IG5ldyBSR0IoYnl0ZXNbYnl0ZXNPZmZzZXQgKyAyXSAmIDB4RkYsCi0JCQlieXRlc1tieXRlc09mZnNldCArIDFdICYgMHhGRiwKLQkJCWJ5dGVzW2J5dGVzT2Zmc2V0XSAmIDB4RkYpOwotCQlieXRlc09mZnNldCArPSA0OwotCX0KLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKGNvbG9ycyk7Ci19Ci0vKioKLSAqIEFuc3dlciBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgQk1QIHJlcHJlc2VudGF0aW9uIG9mCi0gKiB0aGUgZ2l2ZW4gZGV2aWNlIGluZGVwZW5kZW50IHBhbGV0dGUuCi0gKi8KLXN0YXRpYyBieXRlW10gcGFsZXR0ZVRvQnl0ZXMoUGFsZXR0ZURhdGEgcGFsKSB7Ci0JaW50IG4gPSBwYWwuY29sb3JzID09IG51bGwgPyAwIDogKHBhbC5jb2xvcnMubGVuZ3RoIDwgMjU2ID8gcGFsLmNvbG9ycy5sZW5ndGggOiAyNTYpOwotCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW24gKiA0XTsKLQlpbnQgb2Zmc2V0ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQlSR0IgY29sID0gcGFsLmNvbG9yc1tpXTsKLQkJYnl0ZXNbb2Zmc2V0XSA9IChieXRlKWNvbC5ibHVlOwotCQlieXRlc1tvZmZzZXQgKyAxXSA9IChieXRlKWNvbC5ncmVlbjsKLQkJYnl0ZXNbb2Zmc2V0ICsgMl0gPSAoYnl0ZSljb2wucmVkOwotCQlvZmZzZXQgKz0gNDsKLQl9Ci0JcmV0dXJuIGJ5dGVzOwotfQotCi12b2lkIGZsaXBTY2FuTGluZXMoYnl0ZVtdIGRhdGEsIGludCBzdHJpZGUsIGludCBoZWlnaHQpIHsKLQlpbnQgaTEgPSAwOwotCWludCBpMiA9IChoZWlnaHQgLSAxKSAqIHN0cmlkZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodCAvIDI7IGkrKykgewotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc3RyaWRlOyBpbmRleCsrKSB7Ci0JCQlieXRlIGIgPSBkYXRhW2luZGV4ICsgaTFdOwotCQkJZGF0YVtpbmRleCArIGkxXSA9IGRhdGFbaW5kZXggKyBpMl07Ci0JCQlkYXRhW2luZGV4ICsgaTJdID0gYjsKLQkJfQotCQlpMSArPSBzdHJpZGU7Ci0JCWkyIC09IHN0cmlkZTsKLQl9Ci19Ci0KLX0KLQotc3RhdGljIGNsYXNzIFdpbklDT0ZpbGVGb3JtYXQgZXh0ZW5kcyBGaWxlRm9ybWF0IHsKLQkKLXN0YXRpYyBmaW5hbCBieXRlW10gY29udmVydFBhZChieXRlW10gZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBwYWQsIGludCBuZXdQYWQpIHsKLQlpZiAocGFkID09IG5ld1BhZCkgcmV0dXJuIGRhdGE7Ci0JaW50IHN0cmlkZSA9ICh3aWR0aCAqIGRlcHRoICsgNykgLyA4OwotCWludCBicGwgPSAoc3RyaWRlICsgKHBhZCAtIDEpKSAvIHBhZCAqIHBhZDsKLQlpbnQgbmV3QnBsID0gKHN0cmlkZSArIChuZXdQYWQgLSAxKSkgLyBuZXdQYWQgKiBuZXdQYWQ7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtoZWlnaHQgKiBuZXdCcGxdOwotCWludCBzcmNJbmRleCA9IDAsIGRlc3RJbmRleCA9IDA7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIG5ld0JwbCk7Ci0JCXNyY0luZGV4ICs9IGJwbDsKLQkJZGVzdEluZGV4ICs9IG5ld0JwbDsKLQl9Ci0JcmV0dXJuIG5ld0RhdGE7Ci19Ci0vKioKLSAqIEFuc3dlciB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZmlsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4KLSAqIGljb24KLSAqLwotaW50IGljb25TaXplKEltYWdlRGF0YSBpKSB7Ci0JaW50IHNoYXBlRGF0YVN0cmlkZSA9IChpLndpZHRoICogaS5kZXB0aCArIDMxKSAvIDMyICogNDsKLQlpbnQgbWFza0RhdGFTdHJpZGUgPSAoaS53aWR0aCArIDMxKSAvIDMyICogNDsKLQlpbnQgZGF0YVNpemUgPSAoc2hhcGVEYXRhU3RyaWRlICsgbWFza0RhdGFTdHJpZGUpICogaS5oZWlnaHQ7Ci0JaW50IHBhbGV0dGVTaXplID0gaS5wYWxldHRlLmNvbG9ycyAhPSBudWxsID8gaS5wYWxldHRlLmNvbG9ycy5sZW5ndGggKiA0IDogMDsKLQlyZXR1cm4gV2luQk1QRmlsZUZvcm1hdC5CTVBIZWFkZXJGaXhlZFNpemUgKyBwYWxldHRlU2l6ZSArIGRhdGFTaXplOwotfQotYm9vbGVhbiBpc0ZpbGVGb3JtYXQoTEVEYXRhSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0JdHJ5IHsKLQkJYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlWzRdOwotCQlzdHJlYW0ucmVhZChoZWFkZXIpOwotCQlzdHJlYW0udW5yZWFkKGhlYWRlcik7Ci0JCXJldHVybiBoZWFkZXJbMF0gPT0gMCAmJiBoZWFkZXJbMV0gPT0gMCAmJiBoZWFkZXJbMl0gPT0gMSAmJiBoZWFkZXJbM10gPT0gMDsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotYm9vbGVhbiBpc1ZhbGlkSWNvbihJbWFnZURhdGEgaSkgewotCXN3aXRjaCAoaS5kZXB0aCkgewotCQljYXNlIDE6Ci0JCWNhc2UgNDoKLQkJY2FzZSA4OgotCQkJaWYgKGkucGFsZXR0ZS5pc0RpcmVjdCkgcmV0dXJuIGZhbHNlOwotCQkJaW50IHNpemUgPSBpLnBhbGV0dGUuY29sb3JzLmxlbmd0aDsKLQkJCXJldHVybiBzaXplID09IDIgfHwgc2l6ZSA9PSAxNiB8fCBzaXplID09IDMyIHx8IHNpemUgPT0gMjU2OwotCQljYXNlIDI0OgotCQljYXNlIDMyOgotCQkJcmV0dXJuIGkucGFsZXR0ZS5pc0RpcmVjdDsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotaW50IGxvYWRGaWxlSGVhZGVyKExFRGF0YUlucHV0U3RyZWFtIGJ5dGVTdHJlYW0pIHsKLQlpbnRbXSBmaWxlSGVhZGVyID0gbmV3IGludFszXTsKLQl0cnkgewotCQlmaWxlSGVhZGVyWzBdID0gYnl0ZVN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJZmlsZUhlYWRlclsxXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCWZpbGVIZWFkZXJbMl0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWlmICgoZmlsZUhlYWRlclswXSAhPSAwKSB8fCAoZmlsZUhlYWRlclsxXSAhPSAxKSkKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlpbnQgbnVtSWNvbnMgPSBmaWxlSGVhZGVyWzJdOwotCWlmIChudW1JY29ucyA8PSAwKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCXJldHVybiBudW1JY29uczsKLX0KLWludCBsb2FkRmlsZUhlYWRlcihMRURhdGFJbnB1dFN0cmVhbSBieXRlU3RyZWFtLCBib29sZWFuIGhhc0hlYWRlcikgewotCWludFtdIGZpbGVIZWFkZXIgPSBuZXcgaW50WzNdOwotCXRyeSB7Ci0JCWlmIChoYXNIZWFkZXIpIHsKLQkJCWZpbGVIZWFkZXJbMF0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJZmlsZUhlYWRlclsxXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlmaWxlSGVhZGVyWzBdID0gMDsKLQkJCWZpbGVIZWFkZXJbMV0gPSAxOwotCQl9Ci0JCWZpbGVIZWFkZXJbMl0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWlmICgoZmlsZUhlYWRlclswXSAhPSAwKSB8fCAoZmlsZUhlYWRlclsxXSAhPSAxKSkKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlpbnQgbnVtSWNvbnMgPSBmaWxlSGVhZGVyWzJdOwotCWlmIChudW1JY29ucyA8PSAwKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCXJldHVybiBudW1JY29uczsKLX0KLUltYWdlRGF0YVtdIGxvYWRGcm9tQnl0ZVN0cmVhbSgpIHsKLQlpbnQgbnVtSWNvbnMgPSBsb2FkRmlsZUhlYWRlcihpbnB1dFN0cmVhbSk7Ci0JaW50W11bXSBoZWFkZXJzID0gbG9hZEljb25IZWFkZXJzKG51bUljb25zKTsKLQlJbWFnZURhdGFbXSBpY29ucyA9IG5ldyBJbWFnZURhdGFbaGVhZGVycy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaWNvbnMubGVuZ3RoOyBpKyspIHsKLQkJaWNvbnNbaV0gPSBsb2FkSWNvbihoZWFkZXJzW2ldKTsKLQl9Ci0JcmV0dXJuIGljb25zOwotfQotLyoqCi0gKiBMb2FkIG9uZSBpY29uIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgotICovCi1JbWFnZURhdGEgbG9hZEljb24oaW50W10gaWNvbkhlYWRlcikgewotCWJ5dGVbXSBpbmZvSGVhZGVyID0gbG9hZEluZm9IZWFkZXIoaWNvbkhlYWRlcik7Ci0JV2luQk1QRmlsZUZvcm1hdCBibXBGb3JtYXQgPSBuZXcgV2luQk1QRmlsZUZvcm1hdCgpOwotCWJtcEZvcm1hdC5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBibXBGb3JtYXQubG9hZFBhbGV0dGUoaW5mb0hlYWRlcik7Ci0JYnl0ZVtdIHNoYXBlRGF0YSA9IGJtcEZvcm1hdC5sb2FkRGF0YShpbmZvSGVhZGVyKTsKLQlpbnQgd2lkdGggPSAoaW5mb0hlYWRlcls0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzVdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbNl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbN10gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGhlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBkZXB0aCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCWluZm9IZWFkZXJbMTRdID0gMTsKLQlpbmZvSGVhZGVyWzE1XSA9IDA7Ci0JYnl0ZVtdIG1hc2tEYXRhID0gYm1wRm9ybWF0LmxvYWREYXRhKGluZm9IZWFkZXIpOwotCW1hc2tEYXRhID0gY29udmVydFBhZChtYXNrRGF0YSwgd2lkdGgsIGhlaWdodCwgMSwgNCwgMik7Ci0JYml0SW52ZXJ0RGF0YShtYXNrRGF0YSwgMCwgbWFza0RhdGEubGVuZ3RoKTsKLQlyZXR1cm4gSW1hZ2VEYXRhLmludGVybmFsX25ldygKLQkJd2lkdGgsCi0JCWhlaWdodCwKLQkJZGVwdGgsCi0JCXBhbGV0dGUsCi0JCTQsCi0JCXNoYXBlRGF0YSwKLQkJMiwKLQkJbWFza0RhdGEsCi0JCW51bGwsCi0JCS0xLAotCQktMSwKLQkJU1dULklNQUdFX0lDTywKLQkJMCwKLQkJMCwKLQkJMCwKLQkJMCk7Ci19Ci1pbnRbXVtdIGxvYWRJY29uSGVhZGVycyhpbnQgbnVtSWNvbnMpIHsKLQlpbnRbXVtdIGhlYWRlcnMgPSBuZXcgaW50W251bUljb25zXVs3XTsKLQl0cnkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUljb25zOyBpKyspIHsKLQkJCWhlYWRlcnNbaV1bMF0gPSBpbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCQloZWFkZXJzW2ldWzFdID0gaW5wdXRTdHJlYW0ucmVhZCgpOwotCQkJaGVhZGVyc1tpXVsyXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJaGVhZGVyc1tpXVszXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJaGVhZGVyc1tpXVs0XSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQkJaGVhZGVyc1tpXVs1XSA9IGlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJCWhlYWRlcnNbaV1bNl0gPSBpbnB1dFN0cmVhbS5yZWFkSW50KCk7Ci0JCX0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLQlyZXR1cm4gaGVhZGVyczsKLX0KLWJ5dGVbXSBsb2FkSW5mb0hlYWRlcihpbnRbXSBpY29uSGVhZGVyKSB7Ci0JaW50IHdpZHRoID0gaWNvbkhlYWRlclswXTsKLQlpbnQgaGVpZ2h0ID0gaWNvbkhlYWRlclsxXTsKLQlpbnQgbnVtQ29sb3JzID0gaWNvbkhlYWRlclsyXTsgLy8gdGhlIG51bWJlciBvZiBjb2xvcnMgaXMgaW4gdGhlIGxvdyBieXRlLCBidXQgdGhlIGhpZ2ggYnl0ZSBtdXN0IGJlIDAKLQlpZiAobnVtQ29sb3JzID09IDApIG51bUNvbG9ycyA9IDI1NjsgLy8gdGhpcyBpcyBzcGVjaWZpZWQ6ICcwMCcgcmVwcmVzZW50cyAnMjU2JyAoMHgxMDApIGNvbG9ycwotCWlmICgobnVtQ29sb3JzICE9IDIpICYmIChudW1Db2xvcnMgIT0gOCkgJiYgKG51bUNvbG9ycyAhPSAxNikgJiYKLQkJKG51bUNvbG9ycyAhPSAzMikgJiYgKG51bUNvbG9ycyAhPSAyNTYpKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCWlmIChpbnB1dFN0cmVhbS5nZXRQb3NpdGlvbigpIDwgaWNvbkhlYWRlcls2XSkgewotCQkvLyBTZWVrIHRvIHRoZSBzcGVjaWZpZWQgb2Zmc2V0Ci0JCXRyeSB7Ci0JCQlpbnB1dFN0cmVhbS5za2lwKGljb25IZWFkZXJbNl0gLSBpbnB1dFN0cmVhbS5nZXRQb3NpdGlvbigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQlieXRlW10gaW5mb0hlYWRlciA9IG5ldyBieXRlW1dpbkJNUEZpbGVGb3JtYXQuQk1QSGVhZGVyRml4ZWRTaXplXTsKLQl0cnkgewotCQlpbnB1dFN0cmVhbS5yZWFkKGluZm9IZWFkZXIpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCWlmICgoKGluZm9IZWFkZXJbMTJdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTNdICYgMHhGRikgPDwgOCkpICE9IDEpCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JaW50IGluZm9XaWR0aCA9IChpbmZvSGVhZGVyWzRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbNV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlcls2XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlcls3XSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgaW5mb0hlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBiaXRDb3VudCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCWlmIChoZWlnaHQgPT0gaW5mb0hlaWdodCAmJiBiaXRDb3VudCA9PSAxKSBoZWlnaHQgLz0gMjsKLQlpZiAoISgod2lkdGggPT0gaW5mb1dpZHRoKSAmJiAoaGVpZ2h0ICogMiA9PSBpbmZvSGVpZ2h0KSAmJgotCQkoYml0Q291bnQgPT0gMSB8fCBiaXRDb3VudCA9PSA0IHx8IGJpdENvdW50ID09IDggfHwgYml0Q291bnQgPT0gMjQgfHwgYml0Q291bnQgPT0gMzIpKSkKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JaW5mb0hlYWRlcls4XSA9IChieXRlKShoZWlnaHQgJiAweEZGKTsKLQlpbmZvSGVhZGVyWzldID0gKGJ5dGUpKChoZWlnaHQgPj4gOCkgJiAweEZGKTsKLQlpbmZvSGVhZGVyWzEwXSA9IChieXRlKSgoaGVpZ2h0ID4+IDE2KSAmIDB4RkYpOwotCWluZm9IZWFkZXJbMTFdID0gKGJ5dGUpKChoZWlnaHQgPj4gMjQpICYgMHhGRik7Ci0JcmV0dXJuIGluZm9IZWFkZXI7Ci19Ci19Ci1zdGF0aWMgY2xhc3MgU1dUIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9JQ08gPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lPID0gMzk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU5WQUxJRF9JTUFHRSA9IDQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX05VTExfQVJHVU1FTlQgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfQVJHVU1FTlQgPSA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0NBTk5PVF9CRV9aRVJPID0gNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9VTkRFRklORUQgPSAtMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCA9IDM4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5DWV9NQVNLID0gMSA8PCAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCA9IDQyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5DWV9BTFBIQSA9IDEgPDwgMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU1BBUkVOQ1lfTk9ORSA9IDB4MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU1BBUkVOQ1lfUElYRUwgPSAxIDw8IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfQk1QID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9CTVBfUkxFID0gMTsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoaW50IGNvZGUpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yICIrY29kZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihpbnQgY29kZSwgVGhyb3dhYmxlIHQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMTZfNC5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8xNl80LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhM2Q1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8xNl80LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzE2XzguYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMTZfOC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YTUxZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMTZfOC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8zMl80LmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzMyXzQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWZlYjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzMyXzQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMzJfOC5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8zMl84LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5NDA2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8zMl84LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzQ4XzQuYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfNDhfNC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGFiYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfNDhfNC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF80OF84LmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzQ4XzguYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDY2NzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzQ4XzguYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0FTVENsYXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQVNUQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5ZGExOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQVNUQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkltcG9ydERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5KYXZhZG9jOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGFnRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsLkFTVFR5cGUuVHlwZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgQVNUQ2xhc3MgZXh0ZW5kcyBBU1RJdGVtIGltcGxlbWVudHMgSk5JQ2xhc3MgewotCVN0cmluZyBzb3VyY2VQYXRoOwotCU1ldGFEYXRhIG1ldGFEYXRhOwotCi0JQVNUQ2xhc3Mgc3VwZXJjbGFzczsKLQlBU1RGaWVsZFtdIGZpZWxkczsKLQlBU1RNZXRob2RbXSBtZXRob2RzOwotCVN0cmluZyBuYW1lLCBzaW1wbGVOYW1lLCBzdXBlcmNsYXNzTmFtZSwgcGFja2FnZU5hbWU7Ci0JU3RyaW5nW10gaW1wb3J0czsKLQlTdHJpbmcgZGF0YTsKLQlpbnQgc3RhcnQ7Ci0JCi0JVHlwZVJlc29sdmVyIHJlc29sdmVyID0gbmV3IFR5cGVSZXNvbHZlcigpIHsKLQkJcHVibGljIFN0cmluZyBmaW5kUGF0aChTdHJpbmcgc2ltcGxlTmFtZSkgewotCQkJaWYgKHNpbXBsZU5hbWUuZXF1YWxzKEFTVENsYXNzLnRoaXMuc2ltcGxlTmFtZSkpIHJldHVybiBzb3VyY2VQYXRoOwotCQkJU3RyaW5nIGJhc2VQYXRoID0gc291cmNlUGF0aC5zdWJzdHJpbmcoMCwgc291cmNlUGF0aC5sZW5ndGgoKSAtIG5hbWUubGVuZ3RoKCkgLSAiLmphdmEiLmxlbmd0aCgpKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoICsgcGFja2FnZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLyIgKyBzaW1wbGVOYW1lICsgIi5qYXZhIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoICsgaW1wb3J0c1tpXS5yZXBsYWNlKCcuJywgJy8nKSArICIvIiArIHNpbXBsZU5hbWUgKyAiLmphdmEiKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQlyZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsJCQkJCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShTdHJpbmcgc2ltcGxlTmFtZSkgewotCQkJaWYgKHNpbXBsZU5hbWUuZXF1YWxzKEFTVENsYXNzLnRoaXMuc2ltcGxlTmFtZSkpIHJldHVybiBwYWNrYWdlTmFtZSArICIuIiArIHNpbXBsZU5hbWU7Ci0JCQlTdHJpbmcgYmFzZVBhdGggPSBzb3VyY2VQYXRoLnN1YnN0cmluZygwLCBzb3VyY2VQYXRoLmxlbmd0aCgpIC0gbmFtZS5sZW5ndGgoKSAtICIuamF2YSIubGVuZ3RoKCkpOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoYmFzZVBhdGggKyBwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIvIiArIHNpbXBsZU5hbWUgKyAiLmphdmEiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHBhY2thZ2VOYW1lICsgIi4iICsgc2ltcGxlTmFtZTsJCQkJCi0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaWxlID0gbmV3IEZpbGUoYmFzZVBhdGggKyBpbXBvcnRzW2ldLnJlcGxhY2UoJy4nLCAnLycpICsgIi8iICsgc2ltcGxlTmFtZSArICIuamF2YSIpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXJldHVybiBpbXBvcnRzW2ldICsgIi4iICsgc2ltcGxlTmFtZTsJCQkJCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNpbXBsZU5hbWU7Ci0JCX0KLQl9OwotCi1wdWJsaWMgQVNUQ2xhc3MoU3RyaW5nIHNvdXJjZVBhdGgsIE1ldGFEYXRhIG1ldGFEYXRhKSB7Ci0JdGhpcy5zb3VyY2VQYXRoID0gc291cmNlUGF0aDsKLQl0aGlzLm1ldGFEYXRhID0gbWV0YURhdGE7Ci0JCi0JU3RyaW5nIHNvdXJjZSA9IEpOSUdlbmVyYXRvci5sb2FkRmlsZShzb3VyY2VQYXRoKTsKLQlBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7Ci0JcGFyc2VyLnNldFNvdXJjZShzb3VyY2UudG9DaGFyQXJyYXkoKSk7Ci0JQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KXBhcnNlci5jcmVhdGVBU1QobnVsbCk7Ci0JVHlwZURlY2xhcmF0aW9uIHR5cGUgPSAoVHlwZURlY2xhcmF0aW9uKXVuaXQudHlwZXMoKS5nZXQoMCk7Ci0Jc2ltcGxlTmFtZSA9IHR5cGUuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKTsKLQlwYWNrYWdlTmFtZSA9IHVuaXQuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQluYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyBzaW1wbGVOYW1lOwotCXN1cGVyY2xhc3NOYW1lID0gdHlwZS5nZXRTdXBlcmNsYXNzVHlwZSgpICE9IG51bGwgPyB0eXBlLmdldFN1cGVyY2xhc3NUeXBlKCkudG9TdHJpbmcoKSA6IG51bGw7Ci0JTGlzdCBpbXBvcnRzID0gdW5pdC5pbXBvcnRzKCk7Ci0JdGhpcy5pbXBvcnRzID0gbmV3IFN0cmluZ1tpbXBvcnRzLnNpemUoKV07Ci0JaW50IGNvdW50ID0gMDsKLQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW1wb3J0cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCUltcG9ydERlY2xhcmF0aW9uIGltcCA9IChJbXBvcnREZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQl0aGlzLmltcG9ydHNbY291bnQrK10gPSBpbXAuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCX0KLQlzdGFydCA9IHR5cGUuZ2V0U3RhcnRQb3NpdGlvbigpOwotCQotCUphdmFkb2MgZG9jID0gdHlwZS5nZXRKYXZhZG9jKCk7Ci0JTGlzdCB0YWdzID0gbnVsbDsKLQlpZiAoZG9jICE9IG51bGwpIHsKLQkJdGFncyA9IGRvYy50YWdzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0YWdzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVRhZ0VsZW1lbnQgdGFnID0gKFRhZ0VsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICgiQGpuaWNsYXNzIi5lcXVhbHModGFnLmdldFRhZ05hbWUoKSkpIHsKLQkJCQlTdHJpbmcgZGF0YSA9IHRhZy5mcmFnbWVudHMoKS5nZXQoMCkudG9TdHJpbmcoKTsKLQkJCQlzZXRNZXRhRGF0YShkYXRhKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlLmdldEZpZWxkcygpOwotCUFycmF5TGlzdCBmaWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJTGlzdCBmcmFnbWVudHMgPSBmaWVsZC5mcmFnbWVudHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZyYWdtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmaWQuYWRkKG5ldyBBU1RGaWVsZCh0aGlzLCBzb3VyY2UsIGZpZWxkLCBmcmFnbWVudCkpOwotCQl9Ci0JfQotCXRoaXMuZmllbGRzID0gKEFTVEZpZWxkW10pZmlkLnRvQXJyYXkobmV3IEFTVEZpZWxkW2ZpZC5zaXplKCldKTsKLQlNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKLQlBcnJheUxpc3QgbWlkID0gbmV3IEFycmF5TGlzdCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlpZiAobWV0aG9kc1tpXS5nZXRSZXR1cm5UeXBlMigpID09IG51bGwpIGNvbnRpbnVlOwotCQltaWQuYWRkKG5ldyBBU1RNZXRob2QodGhpcywgc291cmNlLCBtZXRob2RzW2ldKSk7Ci0JfQotCXRoaXMubWV0aG9kcyA9IChBU1RNZXRob2RbXSltaWQudG9BcnJheShuZXcgQVNUTWV0aG9kW21pZC5zaXplKCldKTsKLX0KLQotcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQlyZXR1cm4gZ2V0TmFtZSgpLmhhc2hDb2RlKCk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JaWYgKHRoaXMgPT0gb2JqKSByZXR1cm4gdHJ1ZTsKLQlpZiAoIShvYmogaW5zdGFuY2VvZiBBU1RDbGFzcykpIHJldHVybiBmYWxzZTsKLQlyZXR1cm4gKChBU1RDbGFzcylvYmopLmdldE5hbWUoKS5lcXVhbHMoZ2V0TmFtZSgpKTsKLX0KLQotcHVibGljIEpOSUZpZWxkW10gZ2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0JSk5JRmllbGRbXSByZXN1bHQgPSBuZXcgSk5JRmllbGRbZmllbGRzLmxlbmd0aF07Ci0JU3lzdGVtLmFycmF5Y29weShmaWVsZHMsIDAsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotcHVibGljIEpOSU1ldGhvZFtdIGdldERlY2xhcmVkTWV0aG9kcygpIHsKLQlKTklNZXRob2RbXSByZXN1bHQgPSBuZXcgSk5JTWV0aG9kW21ldGhvZHMubGVuZ3RoXTsKLQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZHMsIDAsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCXJldHVybiBuYW1lOwotfQotCi1wdWJsaWMgSk5JQ2xhc3MgZ2V0U3VwZXJjbGFzcygpIHsKLQlpZiAoc3VwZXJjbGFzc05hbWUgPT0gbnVsbCkgcmV0dXJuIG5ldyBSZWZsZWN0Q2xhc3MoT2JqZWN0LmNsYXNzKTsKLQlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSByZXR1cm4gc3VwZXJjbGFzczsKLQlTdHJpbmcgc291cmNlUGF0aCA9IHJlc29sdmVyLmZpbmRQYXRoKHN1cGVyY2xhc3NOYW1lKTsKLQlyZXR1cm4gc3VwZXJjbGFzcyA9IG5ldyBBU1RDbGFzcyhzb3VyY2VQYXRoLCBtZXRhRGF0YSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpIHsKLQlyZXR1cm4gc2ltcGxlTmFtZTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRFeGNsdWRlKCkgewotCXJldHVybiAoU3RyaW5nKWdldFBhcmFtKCJleGNsdWRlIik7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGEoKSB7Ci0JaWYgKGRhdGEgIT0gbnVsbCkgcmV0dXJuIGRhdGE7Ci0JU3RyaW5nIGtleSA9IEpOSUdlbmVyYXRvci50b0MoZ2V0TmFtZSgpKTsKLQlyZXR1cm4gbWV0YURhdGEuZ2V0TWV0YURhdGEoa2V5LCAiIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGUoU3RyaW5nIHN0cikgeyAKLQlzZXRQYXJhbSgiZXhjbHVkZSIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKFN0cmluZyB2YWx1ZSkgewotCWRhdGEgPSB2YWx1ZTsKLX0KLQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gZ2V0TmFtZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQVNURmllbGQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9BU1RGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzJkY2UwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9BU1RGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSmF2YWRvYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGFnRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgQVNURmllbGQgZXh0ZW5kcyBBU1RJdGVtIGltcGxlbWVudHMgSk5JRmllbGQgewotCUFTVENsYXNzIGRlY2xhcmluZ0NsYXNzOwotCVN0cmluZyBuYW1lOwotCWludCBtb2RpZmllcnM7Ci0JQVNUVHlwZSB0eXBlLCB0eXBlNjQ7Ci0JU3RyaW5nIGRhdGE7Ci0JaW50IHN0YXJ0OwotCQotcHVibGljIEFTVEZpZWxkKEFTVENsYXNzIGRlY2xhcmluZ0NsYXNzLCBTdHJpbmcgc291cmNlLCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkLCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQpIHsKLQl0aGlzLmRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7CQotCW5hbWUgPSBmcmFnbWVudC5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpOwotCW1vZGlmaWVycyA9IGZpZWxkLmdldE1vZGlmaWVycygpOwotCXN0YXJ0ID0gZmllbGQuZ2V0U3RhcnRQb3NpdGlvbigpOwotCQotCUphdmFkb2MgZG9jID0gZmllbGQuZ2V0SmF2YWRvYygpOwotCUxpc3QgdGFncyA9IG51bGw7Ci0JaWYgKGRvYyAhPSBudWxsKSB7Ci0JCXRhZ3MgPSBkb2MudGFncygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFncy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlUYWdFbGVtZW50IHRhZyA9IChUYWdFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIkBmaWVsZCIuZXF1YWxzKHRhZy5nZXRUYWdOYW1lKCkpKSB7Ci0JCQkJU3RyaW5nIGRhdGEgPSB0YWcuZnJhZ21lbnRzKCkuZ2V0KDApLnRvU3RyaW5nKCk7Ci0JCQkJc2V0TWV0YURhdGEoZGF0YSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JdHlwZSA9IG5ldyBBU1RUeXBlKGRlY2xhcmluZ0NsYXNzLnJlc29sdmVyLCBmaWVsZC5nZXRUeXBlKCksIGZyYWdtZW50LmdldEV4dHJhRGltZW5zaW9ucygpKTsKLQl0eXBlNjQgPSAgdGhpcy50eXBlOwotCWlmIChHRU42NCkgewotCQlTdHJpbmcgcyA9IHNvdXJjZS5zdWJzdHJpbmcoZmllbGQuZ2V0U3RhcnRQb3NpdGlvbigpLCBmaWVsZC5nZXRTdGFydFBvc2l0aW9uKCkgKyBmaWVsZC5nZXRMZW5ndGgoKSk7Ci0JCWlmICh0eXBlLmlzVHlwZSgiaW50IikgJiYgcy5pbmRleE9mKCJpbnQgLypsb25nKi8iKSAhPSAtMSkgdHlwZTY0ID0gbmV3IEFTVFR5cGUoIkoiKTsKLQkJZWxzZSBpZiAodHlwZS5pc1R5cGUoImZsb2F0IikgJiYgcy5pbmRleE9mKCJmbG9hdCAvKmRvdWJsZSovIikgIT0gLTEpIHR5cGU2NCA9IG5ldyBBU1RUeXBlKCJEIik7Ci0JCWVsc2UgaWYgKHR5cGUuaXNUeXBlKCJbSSIpICYmIChzLmluZGV4T2YoImludCAvKmxvbmcqLyIpICE9IC0xIHx8IHMuaW5kZXhPZigiaW50W10gLypsb25nW10qLyIpICE9IC0xKSkgdHlwZTY0ID0gbmV3IEFTVFR5cGUoIltKIik7Ci0JCWVsc2UgaWYgKHR5cGUuaXNUeXBlKCJbRiIpICYmIChzLmluZGV4T2YoImZsb2F0IC8qZG91YmxlKi8iKSAhPSAtMXx8IHMuaW5kZXhPZigiZmxvYXRbXSAvKmRvdWJsZVtdKi8iKSAhPSAtMSkpIHR5cGU2NCA9IG5ldyBBU1RUeXBlKCJbRCIpOwotCQllbHNlIGlmICh0eXBlLmlzVHlwZSgibG9uZyIpICYmIHMuaW5kZXhPZigibG9uZyAvKmludCovIikgIT0gLTEpIHR5cGUgPSBuZXcgQVNUVHlwZSgiSSIpOwotCQllbHNlIGlmICh0eXBlLmlzVHlwZSgiZG91YmxlIikgJiYgcy5pbmRleE9mKCJkb3VibGUgLypmbG9hdCovIikgIT0gLTEpIHR5cGUgPSBuZXcgQVNUVHlwZSgiRiIpOwotCQllbHNlIGlmICh0eXBlLmlzVHlwZSgiW0oiKSAmJiAocy5pbmRleE9mKCJsb25nIC8qaW50Ki8iKSAhPSAtMXx8IHMuaW5kZXhPZigibG9uZ1tdIC8qaW50W10qLyIpICE9IC0xKSkgdHlwZSA9IG5ldyBBU1RUeXBlKCJbSSIpOwotCQllbHNlIGlmICh0eXBlLmlzVHlwZSgiW0QiKSAmJiAocy5pbmRleE9mKCJkb3VibGUgLypmbG9hdCovIikgIT0gLTF8fCBzLmluZGV4T2YoImRvdWJsZVtdIC8qZmxvYXRbXSovIikgIT0gLTEpKSB0eXBlID0gbmV3IEFTVFR5cGUoIltGIik7Ci0JfQotfQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCXJldHVybiBnZXROYW1lKCkuaGFzaENvZGUoKTsKLX0KLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQlpZiAodGhpcyA9PSBvYmopIHJldHVybiB0cnVlOwotCWlmICghKG9iaiBpbnN0YW5jZW9mIEFTVEZpZWxkKSkgcmV0dXJuIGZhbHNlOwotCXJldHVybiAoKEFTVEZpZWxkKW9iaikuZ2V0TmFtZSgpLmVxdWFscyhnZXROYW1lKCkpOwotfQotCi1wdWJsaWMgSk5JQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7Ci0JcmV0dXJuIGRlY2xhcmluZ0NsYXNzOwotfQotCi1wdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKLQlyZXR1cm4gbW9kaWZpZXJzOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JcmV0dXJuIG5hbWU7Ci19Ci0KLXB1YmxpYyBKTklUeXBlIGdldFR5cGUoKSB7Ci0JcmV0dXJuIHR5cGU7Ci19Ci0KLXB1YmxpYyBKTklUeXBlIGdldFR5cGU2NCgpIHsKLQlyZXR1cm4gdHlwZTY0OwotfQotCi1wdWJsaWMgU3RyaW5nIGdldEFjY2Vzc29yKCkgewotCXJldHVybiAoU3RyaW5nKWdldFBhcmFtKCJhY2Nlc3NvciIpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhc3QoKSB7Ci0JU3RyaW5nIGNhc3QgPSAoKFN0cmluZylnZXRQYXJhbSgiY2FzdCIpKS50cmltKCk7Ci0JaWYgKGNhc3QubGVuZ3RoKCkgPiAwKSB7Ci0JCWlmICghY2FzdC5zdGFydHNXaXRoKCIoIikpIGNhc3QgPSAiKCIgKyBjYXN0OwotCQlpZiAoIWNhc3QuZW5kc1dpdGgoIikiKSkgY2FzdCA9IGNhc3QgKyAiKSI7Ci0JfQotCXJldHVybiBjYXN0OwotfQotCi1wdWJsaWMgU3RyaW5nIGdldEV4Y2x1ZGUoKSB7Ci0JcmV0dXJuIChTdHJpbmcpZ2V0UGFyYW0oImV4Y2x1ZGUiKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YSgpIHsKLQlpZiAoZGF0YSAhPSBudWxsKSByZXR1cm4gZGF0YTsKLQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JU3RyaW5nIGtleSA9IGNsYXNzTmFtZSArICJfIiArIGdldE5hbWUoKTsKLQlyZXR1cm4gZGVjbGFyaW5nQ2xhc3MubWV0YURhdGEuZ2V0TWV0YURhdGEoa2V5LCAiIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEFjY2Vzc29yKFN0cmluZyBzdHIpIHsgCi0Jc2V0UGFyYW0oImFjY2Vzc29yIiwgc3RyKTsKLX0KLQotcHVibGljIHZvaWQgc2V0Q2FzdChTdHJpbmcgc3RyKSB7Ci0Jc2V0UGFyYW0oImNhc3QiLCBzdHIpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRFeGNsdWRlKFN0cmluZyBzdHIpIHsgCi0Jc2V0UGFyYW0oImV4Y2x1ZGUiLCBzdHIpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShTdHJpbmcgdmFsdWUpIHsKLQlkYXRhID0gdmFsdWU7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JcmV0dXJuIGdldE5hbWUoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0FTVEl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9BU1RJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOTY1YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0FTVEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVNUSXRlbSBleHRlbmRzIEFic3RyYWN0SXRlbSB7Ci0KLXB1YmxpYyBTdHJpbmcgZmxhdHRlbigpIHsKLQljaGVja1BhcmFtcygpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JU2V0IHNldCA9IHBhcmFtcy5rZXlTZXQoKTsKLQlTdHJpbmdbXSBrZXlzID0gKFN0cmluZ1tdKXNldC50b0FycmF5KG5ldyBTdHJpbmdbc2V0LnNpemUoKV0pOwotCUFycmF5cy5zb3J0KGtleXMpOwotCWZvciAoaW50IGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykgewotCQlTdHJpbmcga2V5ID0ga2V5c1tqXTsKLQkJT2JqZWN0IHZhbHVlID0gcGFyYW1zLmdldChrZXkpOwotCQlTdHJpbmcgdmFsdWVTdHIgPSAiIjsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl2YWx1ZVN0ciA9IChTdHJpbmcpdmFsdWU7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdbXSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gKFN0cmluZ1tdKXZhbHVlOwotCQkJU3RyaW5nQnVmZmVyIHZhbHVlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKSB2YWx1ZUJ1ZmZlci5hcHBlbmQoIiAiKTsKLQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQodmFsdWVzW2ldKTsKLQkJCX0KLQkJCXZhbHVlU3RyID0gdmFsdWVCdWZmZXIudG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCXZhbHVlU3RyID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAodmFsdWVTdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAoYnVmZmVyLmxlbmd0aCgpICE9IDApIGJ1ZmZlci5hcHBlbmQoIiwiKTsKLQkJCWJ1ZmZlci5hcHBlbmQoa2V5KTsKLQkJCWJ1ZmZlci5hcHBlbmQoIj0iKTsKLQkJCWJ1ZmZlci5hcHBlbmQodmFsdWVTdHIpOwotCQl9Ci0JfQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLQotcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHN0cikgewotCXRoaXMucGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQlpZiAoc3RyLmxlbmd0aCgpID09IDApIHJldHVybjsKLQlTdHJpbmdbXSBwYXJhbXMgPSBzcGxpdChzdHIsICIsIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIHBhcmFtID0gcGFyYW1zW2ldOwotCQlpbnQgZXF1YWxzID0gcGFyYW0uaW5kZXhPZignPScpOwotCQlpZiAoZXF1YWxzID09ICAtMSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogIiArIHN0ciArICIgcGFyYW0gIiArIHBhcmFtKTsKLQkJfQotCQlTdHJpbmcga2V5ID0gcGFyYW0uc3Vic3RyaW5nKDAsIGVxdWFscykudHJpbSgpOwotCQlTdHJpbmcgdmFsdWUgPSBwYXJhbS5zdWJzdHJpbmcoZXF1YWxzICsgMSkudHJpbSgpOwotCQlzZXRQYXJhbShrZXksIHZhbHVlKTsKLQl9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9BU1RNZXRob2QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9BU1RNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcwOGMxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQVNUTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5KYXZhZG9jOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGFnRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFTVE1ldGhvZCBleHRlbmRzIEFTVEl0ZW0gaW1wbGVtZW50cyBKTklNZXRob2QgewotCVN0cmluZyBuYW1lLCBxdWFsaWZpZWROYW1lOwotCWludCBtb2RpZmllcnM7Ci0JQVNUQ2xhc3MgZGVjbGFyaW5nQ2xhc3M7Ci0JQVNUVHlwZVtdIHBhcmFtVHlwZXMsIHBhcmFtVHlwZXM2NDsKLQlBU1RUeXBlIHJldHVyblR5cGUsIHJldHVyblR5cGU2NDsKLQlBU1RQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzOwotCUJvb2xlYW4gdW5pcXVlOwotCVN0cmluZyBkYXRhOwotCWludCBzdGFydDsKLQkKLXB1YmxpYyBBU1RNZXRob2QoQVNUQ2xhc3MgZGVjbGFyaW5nQ2xhc3MsIFN0cmluZyBzb3VyY2UsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCkgewotCXRoaXMuZGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKLQkKLQluYW1lID0gbWV0aG9kLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0JbW9kaWZpZXJzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCXN0YXJ0ID0gbWV0aG9kLmdldFN0YXJ0UG9zaXRpb24oKTsKLQkKLQlKYXZhZG9jIGRvYyA9IG1ldGhvZC5nZXRKYXZhZG9jKCk7Ci0JTGlzdCB0YWdzID0gbnVsbDsKLQlpZiAoZG9jICE9IG51bGwpIHsKLQkJdGFncyA9IGRvYy50YWdzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0YWdzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVRhZ0VsZW1lbnQgdGFnID0gKFRhZ0VsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICgiQG1ldGhvZCIuZXF1YWxzKHRhZy5nZXRUYWdOYW1lKCkpKSB7Ci0JCQkJU3RyaW5nIGRhdGEgPSB0YWcuZnJhZ21lbnRzKCkuZ2V0KDApLnRvU3RyaW5nKCk7Ci0JCQkJc2V0TWV0YURhdGEoZGF0YSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuVHlwZSA9IG5ldyBBU1RUeXBlKGRlY2xhcmluZ0NsYXNzLnJlc29sdmVyLCBtZXRob2QuZ2V0UmV0dXJuVHlwZTIoKSwgbWV0aG9kLmdldEV4dHJhRGltZW5zaW9ucygpKTsKLQlyZXR1cm5UeXBlNjQgPSByZXR1cm5UeXBlOwotCWlmIChHRU42NCkgewotCQlTdHJpbmcgcyA9IHNvdXJjZS5zdWJzdHJpbmcobWV0aG9kLmdldFJldHVyblR5cGUyKCkuZ2V0U3RhcnRQb3NpdGlvbigpLCBtZXRob2QuZ2V0TmFtZSgpLmdldFN0YXJ0UG9zaXRpb24oKSk7Ci0JCWlmIChyZXR1cm5UeXBlLmlzVHlwZSgiaW50IikgJiYgcy5pbmRleE9mKCJpbnQgLypsb25nKi8iKSAhPSAtMSkgcmV0dXJuVHlwZTY0ID0gbmV3IEFTVFR5cGUoIkoiKTsKLQkJZWxzZSBpZiAocmV0dXJuVHlwZS5pc1R5cGUoImZsb2F0IikgJiYgcy5pbmRleE9mKCJmbG9hdCAvKmRvdWJsZSovIikgIT0gLTEpIHJldHVyblR5cGU2NCA9IG5ldyBBU1RUeXBlKCJEIik7Ci0JCWVsc2UgaWYgKHJldHVyblR5cGUuaXNUeXBlKCJbSSIpICYmIChzLmluZGV4T2YoImludCAvKmxvbmcqLyIpICE9IC0xIHx8IHMuaW5kZXhPZigiaW50W10gLypsb25nW10qLyIpICE9IC0xKSkgcmV0dXJuVHlwZTY0ID0gbmV3IEFTVFR5cGUoIltKIik7Ci0JCWVsc2UgaWYgKHJldHVyblR5cGUuaXNUeXBlKCJbRiIpICYmIChzLmluZGV4T2YoImZsb2F0IC8qZG91YmxlKi8iKSAhPSAtMXx8IHMuaW5kZXhPZigiZmxvYXRbXSAvKmRvdWJsZVtdKi8iKSAhPSAtMSkpIHJldHVyblR5cGU2NCA9IG5ldyBBU1RUeXBlKCJbRCIpOwotCQllbHNlIGlmIChyZXR1cm5UeXBlLmlzVHlwZSgibG9uZyIpICYmIHMuaW5kZXhPZigibG9uZyAvKmludCovIikgIT0gLTEpIHJldHVyblR5cGUgPSBuZXcgQVNUVHlwZSgiSSIpOwotCQllbHNlIGlmIChyZXR1cm5UeXBlLmlzVHlwZSgiZG91YmxlIikgJiYgcy5pbmRleE9mKCJkb3VibGUgLypmbG9hdCovIikgIT0gLTEpIHJldHVyblR5cGUgPSBuZXcgQVNUVHlwZSgiRiIpOwotCQllbHNlIGlmIChyZXR1cm5UeXBlLmlzVHlwZSgiW0oiKSAmJiAocy5pbmRleE9mKCJsb25nIC8qaW50Ki8iKSAhPSAtMXx8IHMuaW5kZXhPZigibG9uZ1tdIC8qaW50W10qLyIpICE9IC0xKSkgcmV0dXJuVHlwZSA9IG5ldyBBU1RUeXBlKCJbSSIpOwotCQllbHNlIGlmIChyZXR1cm5UeXBlLmlzVHlwZSgiW0QiKSAmJiAocy5pbmRleE9mKCJkb3VibGUgLypmbG9hdCovIikgIT0gLTF8fCBzLmluZGV4T2YoImRvdWJsZVtdIC8qZmxvYXRbXSovIikgIT0gLTEpKSByZXR1cm5UeXBlID0gbmV3IEFTVFR5cGUoIltGIik7Ci0JfQotCQotCUxpc3QgcGFyYW1ldGVycyA9IG1ldGhvZC5wYXJhbWV0ZXJzKCk7Ci0JcGFyYW1UeXBlcyA9IG5ldyBBU1RUeXBlW3BhcmFtZXRlcnMuc2l6ZSgpXTsKLQlwYXJhbVR5cGVzNjQgPSBuZXcgQVNUVHlwZVtwYXJhbWV0ZXJzLnNpemUoKV07Ci0JdGhpcy5wYXJhbWV0ZXJzID0gbmV3IEFTVFBhcmFtZXRlcltwYXJhbVR5cGVzLmxlbmd0aF07Ci0JaW50IGkgPSAwOwotCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJhbWV0ZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgaSsrKSB7Ci0JCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW0gPSAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQlwYXJhbVR5cGVzW2ldID0gbmV3IEFTVFR5cGUoZGVjbGFyaW5nQ2xhc3MucmVzb2x2ZXIsIHBhcmFtLmdldFR5cGUoKSwgcGFyYW0uZ2V0RXh0cmFEaW1lbnNpb25zKCkpOwotCQlwYXJhbVR5cGVzNjRbaV0gPSBwYXJhbVR5cGVzW2ldOwotCQl0aGlzLnBhcmFtZXRlcnNbaV0gPSBuZXcgQVNUUGFyYW1ldGVyKHRoaXMsIGksIHBhcmFtLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkpOwotCQlpZiAoR0VONjQpIHsKLQkJCVN0cmluZyBzID0gc291cmNlLnN1YnN0cmluZyhwYXJhbS5nZXRTdGFydFBvc2l0aW9uKCksIHBhcmFtLmdldFN0YXJ0UG9zaXRpb24oKSArIHBhcmFtLmdldExlbmd0aCgpKTsKLQkJCWlmIChwYXJhbVR5cGVzW2ldLmlzVHlwZSgiaW50IikgJiYgcy5pbmRleE9mKCJpbnQgLypsb25nKi8iKSAhPSAtMSkgcGFyYW1UeXBlczY0W2ldID0gbmV3IEFTVFR5cGUoIkoiKTsKLQkJCWVsc2UgaWYgKHBhcmFtVHlwZXNbaV0uaXNUeXBlKCJmbG9hdCIpICYmIHMuaW5kZXhPZigiZmxvYXQgLypkb3VibGUqLyIpICE9IC0xKSBwYXJhbVR5cGVzNjRbaV0gPSBuZXcgQVNUVHlwZSgiRCIpOwotCQkJZWxzZSBpZiAocGFyYW1UeXBlc1tpXS5pc1R5cGUoIltJIikgJiYgKHMuaW5kZXhPZigiaW50IC8qbG9uZyovIikgIT0gLTEgfHwgcy5pbmRleE9mKCJpbnRbXSAvKmxvbmdbXSovIikgIT0gLTEpKSBwYXJhbVR5cGVzNjRbaV0gPSBuZXcgQVNUVHlwZSgiW0oiKTsKLQkJCWVsc2UgaWYgKHBhcmFtVHlwZXNbaV0uaXNUeXBlKCJbRiIpICYmIChzLmluZGV4T2YoImZsb2F0IC8qZG91YmxlKi8iKSAhPSAtMXx8IHMuaW5kZXhPZigiZmxvYXRbXSAvKmRvdWJsZVtdKi8iKSAhPSAtMSkpIHBhcmFtVHlwZXM2NFtpXSA9IG5ldyBBU1RUeXBlKCJbRCIpOwotCQkJZWxzZSBpZiAocGFyYW1UeXBlc1tpXS5pc1R5cGUoImxvbmciKSAmJiBzLmluZGV4T2YoImxvbmcgLyppbnQqLyIpICE9IC0xKSBwYXJhbVR5cGVzW2ldID0gbmV3IEFTVFR5cGUoIkkiKTsKLQkJCWVsc2UgaWYgKHBhcmFtVHlwZXNbaV0uaXNUeXBlKCJkb3VibGUiKSAmJiBzLmluZGV4T2YoImRvdWJsZSAvKmZsb2F0Ki8iKSAhPSAtMSkgcGFyYW1UeXBlc1tpXSA9IG5ldyBBU1RUeXBlKCJGIik7Ci0JCQllbHNlIGlmIChwYXJhbVR5cGVzW2ldLmlzVHlwZSgiW0oiKSAmJiAocy5pbmRleE9mKCJsb25nIC8qaW50Ki8iKSAhPSAtMXx8IHMuaW5kZXhPZigibG9uZ1tdIC8qaW50W10qLyIpICE9IC0xKSkgcGFyYW1UeXBlc1tpXSA9IG5ldyBBU1RUeXBlKCJbSSIpOwotCQkJZWxzZSBpZiAocGFyYW1UeXBlc1tpXS5pc1R5cGUoIltEIikgJiYgKHMuaW5kZXhPZigiZG91YmxlIC8qZmxvYXQqLyIpICE9IC0xfHwgcy5pbmRleE9mKCJkb3VibGVbXSAvKmZsb2F0W10qLyIpICE9IC0xKSkgcGFyYW1UeXBlc1tpXSA9IG5ldyBBU1RUeXBlKCJbRiIpOwotCQl9Ci0JCWlmICh0YWdzICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gcGFyYW0uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gdGFncy5pdGVyYXRvcigpOyBpdGVyYXRvcjEuaGFzTmV4dCgpOykgewotCQkJCVRhZ0VsZW1lbnQgdGFnID0gKFRhZ0VsZW1lbnQpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJaWYgKCJAcGFyYW0iLmVxdWFscyh0YWcuZ2V0VGFnTmFtZSgpKSkgewotCQkJCQlMaXN0IGZyYWdtZW50cyA9IHRhZy5mcmFnbWVudHMoKTsKLQkJCQkJaWYgKG5hbWUuZXF1YWxzKGZyYWdtZW50cy5nZXQoMCkudG9TdHJpbmcoKSkpIHsKLQkJCQkJCVN0cmluZyBkYXRhID0gZnJhZ21lbnRzLmdldCgxKS50b1N0cmluZygpOwotCQkJCQkJdGhpcy5wYXJhbWV0ZXJzW2ldLnNldE1ldGFEYXRhKGRhdGEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgSk5JQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7Ci0JcmV0dXJuIGRlY2xhcmluZ0NsYXNzOwotfQotCi1wdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKLQlyZXR1cm4gbW9kaWZpZXJzOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JcmV0dXJuIG5hbWU7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzTmF0aXZlVW5pcXVlKCkgewotCWlmICh1bmlxdWUgIT0gbnVsbCkgcmV0dXJuIHVuaXF1ZS5ib29sZWFuVmFsdWUoKTsKLQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JSk5JTWV0aG9kW10gbWV0aG9kcyA9IGRlY2xhcmluZ0NsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlKTklNZXRob2QgbXRoID0gbWV0aG9kc1tpXTsKLQkJaWYgKChtdGguZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpICE9IDAgJiYKLQkJCXRoaXMgIT0gbXRoICYmICF0aGlzLmVxdWFscyhtdGgpICYmCi0JCQluYW1lLmVxdWFscyhtdGguZ2V0TmFtZSgpKSkKLQkJCXsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQl9Ci0JdW5pcXVlID0gbmV3IEJvb2xlYW4ocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1wdWJsaWMgSk5JVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzKCkgewotCXJldHVybiBwYXJhbVR5cGVzOwotfQotCi1wdWJsaWMgSk5JVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzNjQoKSB7Ci0JcmV0dXJuIHBhcmFtVHlwZXM2NDsKLX0KLQotcHVibGljIEpOSVBhcmFtZXRlcltdIGdldFBhcmFtZXRlcnMoKSB7Ci0JcmV0dXJuIHRoaXMucGFyYW1ldGVyczsKLX0KLQotcHVibGljIEpOSVR5cGUgZ2V0UmV0dXJuVHlwZSgpIHsKLQlyZXR1cm4gcmV0dXJuVHlwZTsKLX0KLQotcHVibGljIEpOSVR5cGUgZ2V0UmV0dXJuVHlwZTY0KCkgewotCXJldHVybiByZXR1cm5UeXBlNjQ7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzb3IoKSB7Ci0JcmV0dXJuIChTdHJpbmcpZ2V0UGFyYW0oImFjY2Vzc29yIik7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXhjbHVkZSgpIHsKLQlyZXR1cm4gKFN0cmluZylnZXRQYXJhbSgiZXhjbHVkZSIpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhKCkgewotCWlmIChkYXRhICE9IG51bGwpIHJldHVybiBkYXRhOwotCVN0cmluZyBjbGFzc05hbWUgPSBnZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQlTdHJpbmcga2V5ID0gY2xhc3NOYW1lICsgIl8iICsgSk5JR2VuZXJhdG9yLmdldEZ1bmN0aW9uTmFtZSh0aGlzKTsKLQlNZXRhRGF0YSBtZXRhRGF0YSA9IGRlY2xhcmluZ0NsYXNzLm1ldGFEYXRhOwotCVN0cmluZyB2YWx1ZSA9IG1ldGFEYXRhLmdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JaWYgKHZhbHVlID09IG51bGwpIHsKLQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgZ2V0TmFtZSgpOwotCQl2YWx1ZSA9IG1ldGFEYXRhLmdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JfQotCS8qCi0JKiBTdXBwb3J0IGZvciBsb2NrLgotCSovCi0JaWYgKHZhbHVlID09IG51bGwgJiYgZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIl8iKSkgewotCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKHRoaXMpLnN1YnN0cmluZygyKTsKLQkJdmFsdWUgPSBtZXRhRGF0YS5nZXRNZXRhRGF0YShrZXksIG51bGwpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgZ2V0TmFtZSgpLnN1YnN0cmluZygxKTsKLQkJCXZhbHVlID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQkJfQotCX0KLQlpZiAodmFsdWUgPT0gbnVsbCkgdmFsdWUgPSAiIjsJCi0JcmV0dXJuIHZhbHVlOwotfQotCi1wdWJsaWMgdm9pZCBzZXRBY2Nlc3NvcihTdHJpbmcgc3RyKSB7IAotCXNldFBhcmFtKCJhY2Nlc3NvciIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGUoU3RyaW5nIHN0cikgeyAKLQlzZXRQYXJhbSgiZXhjbHVkZSIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKFN0cmluZyB2YWx1ZSkgewotCWRhdGEgPSB2YWx1ZTsKLX0KLQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gZ2V0TmFtZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQVNUUGFyYW1ldGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQVNUUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjE3YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0FTVFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotcHVibGljIGNsYXNzIEFTVFBhcmFtZXRlciBleHRlbmRzIEFTVEl0ZW0gaW1wbGVtZW50cyBKTklQYXJhbWV0ZXIgewotCUFTVE1ldGhvZCBtZXRob2Q7Ci0JaW50IHBhcmFtZXRlcjsKLQlTdHJpbmcgbmFtZTsKLQlTdHJpbmcgZGF0YTsKLQotcHVibGljIEFTVFBhcmFtZXRlcihBU1RNZXRob2QgbWV0aG9kLCBpbnQgcGFyYW1ldGVyLCBTdHJpbmcgbmFtZSkgewotCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCXRoaXMucGFyYW1ldGVyID0gcGFyYW1ldGVyOwotCXRoaXMubmFtZSA9IG5hbWU7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2FzdCgpIHsKLQlTdHJpbmcgY2FzdCA9ICgoU3RyaW5nKWdldFBhcmFtKCJjYXN0IikpLnRyaW0oKTsKLQlpZiAoY2FzdC5sZW5ndGgoKSA+IDApIHsKLQkJaWYgKCFjYXN0LnN0YXJ0c1dpdGgoIigiKSkgY2FzdCA9ICIoIiArIGNhc3Q7Ci0JCWlmICghY2FzdC5lbmRzV2l0aCgiKSIpKSBjYXN0ID0gY2FzdCArICIpIjsKLQl9Ci0JcmV0dXJuIGNhc3Q7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGEoKSB7Ci0JaWYgKGRhdGEgIT0gbnVsbCkgcmV0dXJuIGRhdGE7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQlTdHJpbmcga2V5ID0gY2xhc3NOYW1lICsgIl8iICsgSk5JR2VuZXJhdG9yLmdldEZ1bmN0aW9uTmFtZShtZXRob2QpICsgIl8iICsgcGFyYW1ldGVyOwotCU1ldGFEYXRhIG1ldGFEYXRhID0gbWV0aG9kLmRlY2xhcmluZ0NsYXNzLm1ldGFEYXRhOwotCVN0cmluZyB2YWx1ZSA9IG1ldGFEYXRhLmdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JaWYgKHZhbHVlID09IG51bGwpIHsKLQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgbWV0aG9kLmdldE5hbWUoKSArICJfIiArIHBhcmFtZXRlcjsKLQkJdmFsdWUgPSBtZXRhRGF0YS5nZXRNZXRhRGF0YShrZXksIG51bGwpOwotCX0KLQkvKgotCSogU3VwcG9ydCBmb3IgbG9jay4KLQkqLwotCWlmICh2YWx1ZSA9PSBudWxsICYmIG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgiXyIpKSB7Ci0JCWtleSA9IGNsYXNzTmFtZSArICJfIiArIEpOSUdlbmVyYXRvci5nZXRGdW5jdGlvbk5hbWUobWV0aG9kKS5zdWJzdHJpbmcoMikgKyAiXyIgKyBwYXJhbWV0ZXI7Ci0JCXZhbHVlID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWtleSA9IGNsYXNzTmFtZSArICJfIiArIG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDEpICsgIl8iICsgcGFyYW1ldGVyOwotCQkJdmFsdWUgPSBtZXRhRGF0YS5nZXRNZXRhRGF0YShrZXksIG51bGwpOwotCQl9Ci0JfQotCWlmICh2YWx1ZSA9PSBudWxsKSB2YWx1ZSA9ICIiOwkKLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLXB1YmxpYyBKTklNZXRob2QgZ2V0TWV0aG9kKCkgewotCXJldHVybiBtZXRob2Q7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQlyZXR1cm4gbmFtZTsKLX0KLQotcHVibGljIEpOSUNsYXNzIGdldFR5cGVDbGFzcygpIHsKLQlBU1RUeXBlIHR5cGUgPSAoQVNUVHlwZSlnZXRUeXBlKCk7Ci0JQVNUQ2xhc3MgZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2QuZGVjbGFyaW5nQ2xhc3M7Ci0JU3RyaW5nIHNvdXJjZVBhdGggPSBkZWNsYXJpbmdDbGFzcy5yZXNvbHZlci5maW5kUGF0aCh0eXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JcmV0dXJuIG5ldyBBU1RDbGFzcyhzb3VyY2VQYXRoLCBkZWNsYXJpbmdDbGFzcy5tZXRhRGF0YSk7Ci19Ci0KLXB1YmxpYyBKTklUeXBlIGdldFR5cGUoKSB7Ci0JcmV0dXJuIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpW3BhcmFtZXRlcl07Ci19Ci0KLXB1YmxpYyBKTklUeXBlIGdldFR5cGU2NCgpIHsKLQlyZXR1cm4gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzNjQoKVtwYXJhbWV0ZXJdOwotfQotCi1wdWJsaWMgaW50IGdldFBhcmFtZXRlcigpIHsKLQlyZXR1cm4gcGFyYW1ldGVyOwotfQotCi1wdWJsaWMgdm9pZCBzZXRDYXN0KFN0cmluZyBzdHIpIHsKLQlzZXRQYXJhbSgiY2FzdCIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKFN0cmluZyB2YWx1ZSkgewotCWRhdGEgPSB2YWx1ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9BU1RUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQVNUVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOThhYzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9BU1RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBBU1RUeXBlIGltcGxlbWVudHMgSk5JVHlwZSB7Ci0JCi0Jc3RhdGljIGludGVyZmFjZSBUeXBlUmVzb2x2ZXIgewotCQlwdWJsaWMgU3RyaW5nIGZpbmRQYXRoKFN0cmluZyBzaW1wbGVOYW1lKTsKLQkJcHVibGljIFN0cmluZyByZXNvbHZlKFN0cmluZyBzaW1wbGVOYW1lKTsKLQl9CQotCQotCVN0cmluZyBuYW1lOwotCi1wdWJsaWMgQVNUVHlwZShTdHJpbmcgbmFtZSkgewotCXRoaXMubmFtZSA9IG5hbWU7Ci19Ci0KLXB1YmxpYyBBU1RUeXBlKFR5cGVSZXNvbHZlciByZXNvbHZlciwgVHlwZSB0eXBlLCBpbnQgZXh0cmFEaW1lbnNpb25zKSB7Ci0JbmFtZSA9IGZyb20ocmVzb2x2ZXIsIHR5cGUsIGV4dHJhRGltZW5zaW9ucyk7Ci19Ci0KLVN0cmluZyBmcm9tKFR5cGVSZXNvbHZlciByZXNvbHZlciwgVHlwZSB0eXBlLCBpbnQgZXh0cmFEaW1lbnNpb25zKSB7Ci0JU3RyaW5nIG5hbWUgPSAiIjsKLQlTdHJpbmcgc3RyID0gdHlwZS50b1N0cmluZygpOwotCWlmICh0eXBlLmlzUHJpbWl0aXZlVHlwZSgpKSB7Ci0JCWlmIChzdHIuZXF1YWxzKCJ2b2lkIikpIG5hbWUgPSAiViI7Ci0JCWVsc2UgaWYgKHN0ci5lcXVhbHMoImludCIpKSBuYW1lID0gIkkiOwotCQllbHNlIGlmIChzdHIuZXF1YWxzKCJib29sZWFuIikpIG5hbWUgPSAiWiI7Ci0JCWVsc2UgaWYgKHN0ci5lcXVhbHMoImxvbmciKSkgbmFtZSA9ICJKIjsKLQkJZWxzZSBpZiAoc3RyLmVxdWFscygic2hvcnQiKSkgbmFtZSA9ICJTIjsKLQkJZWxzZSBpZiAoc3RyLmVxdWFscygiY2hhciIpKSBuYW1lID0gIkMiOwotCQllbHNlIGlmIChzdHIuZXF1YWxzKCJieXRlIikpIG5hbWUgPSAiQiI7Ci0JCWVsc2UgaWYgKHN0ci5lcXVhbHMoImZsb2F0IikpIG5hbWUgPSAiRiI7Ci0JCWVsc2UgaWYgKHN0ci5lcXVhbHMoImRvdWJsZSIpKSBuYW1lID0gIkQiOwotCX0gZWxzZSBpZiAodHlwZS5pc0FycmF5VHlwZSgpKSB7Ci0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKXR5cGU7Ci0JCW5hbWUgPSBmcm9tKHJlc29sdmVyLCBhcnJheVR5cGUuZ2V0RWxlbWVudFR5cGUoKSwgYXJyYXlUeXBlLmdldERpbWVuc2lvbnMoKSk7Ci0JfSBlbHNlIGlmIChzdHIuaW5kZXhPZignLicpICE9IC0xKSB7Ci0JCW5hbWUgPSAiTCIgKyB0eXBlLnRvU3RyaW5nKCkucmVwbGFjZSgnLicsICcvJykgKyAiOyI7Ci0JfSBlbHNlIGlmIChzdHIuZXF1YWxzKCJTdHJpbmciKSl7Ci0JCW5hbWUgPSAiTGphdmEvbGFuZy9TdHJpbmc7IjsKLQl9IGVsc2UgaWYgKHN0ci5lcXVhbHMoIkNsYXNzIikpewotCQluYW1lID0gIkxqYXZhL2xhbmcvQ2xhc3M7IjsKLQl9IGVsc2UgaWYgKHN0ci5lcXVhbHMoIk9iamVjdCIpKXsKLQkJbmFtZSA9ICJMamF2YS9sYW5nL09iamVjdDsiOwotCX0gZWxzZSB7Ci0JCVN0cmluZyBxdWFsaWZpZWROYW1lID0gcmVzb2x2ZXIgIT0gbnVsbCAgPyByZXNvbHZlci5yZXNvbHZlKHN0cikgOiBzdHI7Ci0JCW5hbWUgPSAiTCIgKyBxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIjsiOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhRGltZW5zaW9uczsgaSsrKSB7Ci0JCW5hbWUgPSAiWyIgKyBuYW1lOwotCX0KLQlyZXR1cm4gbmFtZTsKLX0KLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQlpZiAob2JqID09IHRoaXMpIHJldHVybiB0cnVlOwotCWlmICghKG9iaiBpbnN0YW5jZW9mIEFTVFR5cGUpKSByZXR1cm4gZmFsc2U7Ci0JcmV0dXJuICgoQVNUVHlwZSlvYmopLm5hbWUuZXF1YWxzKG5hbWUpOwotfQotCi1wdWJsaWMgSk5JVHlwZSBnZXRDb21wb25lbnRUeXBlKCkgewotCWlmICghbmFtZS5zdGFydHNXaXRoKCJbIikpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0JcmV0dXJuIG5ldyBBU1RUeXBlKG5hbWUuc3Vic3RyaW5nKDEpKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCWlmIChpc1ByaW1pdGl2ZSgpKSB7Ci0JCWlmIChuYW1lLmVxdWFscygiViIpKSByZXR1cm4gInZvaWQiOwotCQlpZiAobmFtZS5lcXVhbHMoIkkiKSkgcmV0dXJuICJpbnQiOwotCQlpZiAobmFtZS5lcXVhbHMoIloiKSkgcmV0dXJuICJib29sZWFuIjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJKIikpIHJldHVybiAibG9uZyI7Ci0JCWlmIChuYW1lLmVxdWFscygiUyIpKSByZXR1cm4gInNob3J0IjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJDIikpIHJldHVybiAiY2hhciI7Ci0JCWlmIChuYW1lLmVxdWFscygiQiIpKSByZXR1cm4gImJ5dGUiOwotCQlpZiAobmFtZS5lcXVhbHMoIkYiKSkgcmV0dXJuICJmbG9hdCI7Ci0JCWlmIChuYW1lLmVxdWFscygiRCIpKSByZXR1cm4gImRvdWJsZSI7Ci0JfQotCWlmIChpc0FycmF5KCkpIHJldHVybiBuYW1lOwotCXJldHVybiBuYW1lLnN1YnN0cmluZygxLCBuYW1lLmxlbmd0aCgpIC0gMSkucmVwbGFjZSgnLycsICcuJyk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpIHsKLQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQlpZiAoaXNBcnJheSgpIHx8IGlzUHJpbWl0aXZlKCkpIHJldHVybiBuYW1lOwotCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKSArIDE7Ci0JcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGluZGV4LCBuYW1lLmxlbmd0aCgpKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKGJvb2xlYW4gZGVmaW5lKSB7Ci0JaWYgKGlzUHJpbWl0aXZlKCkpIHsKLQkJaWYgKGRlZmluZSkgewotCQkJaWYgKG5hbWUuZXF1YWxzKCJJIikpIHJldHVybiAiSV9KIjsKLQkJCWlmIChuYW1lLmVxdWFscygiSiIpKSByZXR1cm4gIklfSiI7Ci0JCQlpZiAobmFtZS5lcXVhbHMoIkYiKSkgcmV0dXJuICJGX0QiOwotCQkJaWYgKG5hbWUuZXF1YWxzKCJEIikpIHJldHVybiAiRl9EIjsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JaWYgKGlzQXJyYXkoKSkgewotCQlpZiAoZGVmaW5lKSByZXR1cm4gZ2V0Q29tcG9uZW50VHlwZSgpLmdldFR5cGVTaWduYXR1cmUoZGVmaW5lKSArICJBcnJheSI7Ci0JCXJldHVybiAiWyIgKyBnZXRDb21wb25lbnRUeXBlKCkuZ2V0VHlwZVNpZ25hdHVyZShkZWZpbmUpOwotCX0KLQlyZXR1cm4gbmFtZTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlMShib29sZWFuIGRlZmluZSkgewotCWlmIChpc1ByaW1pdGl2ZSgpKSB7Ci0JCWlmIChuYW1lLmVxdWFscygiViIpKSByZXR1cm4gIlZvaWQiOwotCQlpZiAobmFtZS5lcXVhbHMoIkkiKSkgcmV0dXJuIGRlZmluZSA/ICJJbnRMb25nIiA6ICJJbnQiOwotCQlpZiAobmFtZS5lcXVhbHMoIloiKSkgcmV0dXJuICJCb29sZWFuIjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJKIikpIHJldHVybiBkZWZpbmUgPyAiSW50TG9uZyIgOiAiTG9uZyI7Ci0JCWlmIChuYW1lLmVxdWFscygiUyIpKSByZXR1cm4gIlNob3J0IjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJDIikpIHJldHVybiAiQ2hhciI7Ci0JCWlmIChuYW1lLmVxdWFscygiQiIpKSByZXR1cm4gIkJ5dGUiOwotCQlpZiAobmFtZS5lcXVhbHMoIkYiKSkgcmV0dXJuIGRlZmluZSA/ICJGbG9hdERvdWJsZSIgOiAiRmxvYXQiOwotCQlpZiAobmFtZS5lcXVhbHMoIkQiKSkgcmV0dXJuIGRlZmluZSA/ICJGbG9hdERvdWJsZSIgOiAiRG91YmxlIjsKLQl9Ci0JaWYgKG5hbWUuZXF1YWxzKCJMamF2YS9sYW5nL1N0cmluZzsiKSkgcmV0dXJuICJTdHJpbmciOwotCXJldHVybiAiT2JqZWN0IjsKLX0KLQotcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlMihib29sZWFuIGRlZmluZSkgewotCWlmIChpc1ByaW1pdGl2ZSgpKSB7Ci0JCWlmIChuYW1lLmVxdWFscygiViIpKSByZXR1cm4gInZvaWQiOwotCQlpZiAobmFtZS5lcXVhbHMoIkkiKSkgcmV0dXJuIGRlZmluZSA/ICJqaW50TG9uZyIgOiAiamludCI7Ci0JCWlmIChuYW1lLmVxdWFscygiWiIpKSByZXR1cm4gImpib29sZWFuIjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJKIikpIHJldHVybiBkZWZpbmUgPyAiamludExvbmciIDogImpsb25nIjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJTIikpIHJldHVybiAianNob3J0IjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJDIikpIHJldHVybiAiamNoYXIiOwotCQlpZiAobmFtZS5lcXVhbHMoIkIiKSkgcmV0dXJuICJqYnl0ZSI7Ci0JCWlmIChuYW1lLmVxdWFscygiRiIpKSByZXR1cm4gZGVmaW5lID8gImpmbG9hdERvdWJsZSIgOiAiamZsb2F0IjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJEIikpIHJldHVybiBkZWZpbmUgPyAiamZsb2F0RG91YmxlIiA6ICJqZG91YmxlIjsKLQl9Ci0JaWYgKG5hbWUuZXF1YWxzKCJMamF2YS9sYW5nL1N0cmluZzsiKSkgcmV0dXJuICJqc3RyaW5nIjsKLQlpZiAobmFtZS5lcXVhbHMoIkxqYXZhL2xhbmcvQ2xhc3M7IikpIHJldHVybiAiamNsYXNzIjsKLQlpZiAoaXNBcnJheSgpKSB7Ci0JCXJldHVybiBnZXRDb21wb25lbnRUeXBlKCkuZ2V0VHlwZVNpZ25hdHVyZTIoZGVmaW5lKSArICJBcnJheSI7Ci0JfQotCXJldHVybiAiam9iamVjdCI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZTMoYm9vbGVhbiBkZWZpbmUpIHsKLQlpZiAoaXNQcmltaXRpdmUoKSkgewotCQlpZiAobmFtZS5lcXVhbHMoIlYiKSkgcmV0dXJuICJ2b2lkIjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJJIikpIHJldHVybiAiaW50IjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJaIikpIHJldHVybiAiYm9vbGVhbiI7Ci0JCWlmIChuYW1lLmVxdWFscygiSiIpKSByZXR1cm4gImxvbmciOwotCQlpZiAobmFtZS5lcXVhbHMoIlMiKSkgcmV0dXJuICJzaG9ydCI7Ci0JCWlmIChuYW1lLmVxdWFscygiQyIpKSByZXR1cm4gImNoYXIiOwotCQlpZiAobmFtZS5lcXVhbHMoIkIiKSkgcmV0dXJuICJieXRlIjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJGIikpIHJldHVybiAiZmxvYXQiOwotCQlpZiAobmFtZS5lcXVhbHMoIkQiKSkgcmV0dXJuICJkb3VibGUiOwotCX0KLQlpZiAobmFtZS5lcXVhbHMoIkxqYXZhL2xhbmcvU3RyaW5nOyIpKSByZXR1cm4gIlN0cmluZyI7Ci0JaWYgKGlzQXJyYXkoKSkgewotCQlyZXR1cm4gZ2V0Q29tcG9uZW50VHlwZSgpLmdldFR5cGVTaWduYXR1cmUzKGRlZmluZSkgKyAiW10iOwotCX0KLQlyZXR1cm4gZ2V0TmFtZSgpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmU0KGJvb2xlYW4gZGVmaW5lLCBib29sZWFuIHN0cnVjdCkgewotCWlmIChpc1ByaW1pdGl2ZSgpKSB7Ci0JCWlmIChuYW1lLmVxdWFscygiViIpKSByZXR1cm4gInZvaWQiOwotCQlpZiAobmFtZS5lcXVhbHMoIkkiKSkgcmV0dXJuIGRlZmluZSA/ICJqaW50TG9uZyIgOiAiamludCI7Ci0JCWlmIChuYW1lLmVxdWFscygiWiIpKSByZXR1cm4gImpib29sZWFuIjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJKIikpIHJldHVybiBkZWZpbmUgPyAiamludExvbmciIDogImpsb25nIjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJTIikpIHJldHVybiAianNob3J0IjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJDIikpIHJldHVybiAiamNoYXIiOwotCQlpZiAobmFtZS5lcXVhbHMoIkIiKSkgcmV0dXJuICJqYnl0ZSI7Ci0JCWlmIChuYW1lLmVxdWFscygiRiIpKSByZXR1cm4gZGVmaW5lID8gImpmbG9hdERvdWJsZSIgOiAiamZsb2F0IjsKLQkJaWYgKG5hbWUuZXF1YWxzKCJEIikpIHJldHVybiBkZWZpbmUgPyAiamZsb2F0RG91YmxlIiA6ICJqZG91YmxlIjsKLQl9Ci0JaWYgKG5hbWUuZXF1YWxzKCJMamF2YS9sYW5nL1N0cmluZzsiKSkgcmV0dXJuICJqc3RyaW5nIjsKLQlpZiAoaXNBcnJheSgpKSB7Ci0JCVN0cmluZyBzaWcgPSBnZXRDb21wb25lbnRUeXBlKCkuZ2V0VHlwZVNpZ25hdHVyZTQoZGVmaW5lLCBzdHJ1Y3QpOwotCQlyZXR1cm4gc3RydWN0ID8gc2lnIDogc2lnICsgIiAqIjsKLQl9Ci0JU3RyaW5nIHNpZyA9IGdldFNpbXBsZU5hbWUoKTsgCi0JcmV0dXJuIHN0cnVjdCA/IHNpZyA6IHNpZyArICIgKiI7Ci19Ci0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQlyZXR1cm4gbmFtZS5zdGFydHNXaXRoKCJbIik7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCXJldHVybiAhbmFtZS5zdGFydHNXaXRoKCJMIikgJiYgIW5hbWUuc3RhcnRzV2l0aCgiWyIpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc1R5cGUoU3RyaW5nIHR5cGUpIHsKLQlyZXR1cm4gZ2V0TmFtZSgpLmVxdWFscyh0eXBlKTsKLX0KLQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gbmFtZTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0Fic3RyYWN0SXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0Fic3RyYWN0SXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODNjODU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9BYnN0cmFjdEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SXRlbSBpbXBsZW1lbnRzIEpOSUl0ZW0gewotCi0JSGFzaE1hcCBwYXJhbXM7Ci0KLXN0YXRpYyBTdHJpbmdbXSBzcGxpdChTdHJpbmcgc3RyLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JcmV0dXJuIEpOSUdlbmVyYXRvci5zcGxpdChzdHIsIHNlcGFyYXRvcik7Ci19Ci0KLXZvaWQgY2hlY2tQYXJhbXMoKSB7Ci0JaWYgKHBhcmFtcyAhPSBudWxsKSByZXR1cm47Ci0JcGFyc2UoZ2V0TWV0YURhdGEoKSk7Ci19Ci0KLXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZmxhdHRlbigpOwotCi1wdWJsaWMgU3RyaW5nW10gZ2V0RmxhZ3MoKSB7Ci0JT2JqZWN0IGZsYWdzID0gZ2V0UGFyYW0oImZsYWdzIik7Ci0JaWYgKGZsYWdzID09IG51bGwpIHJldHVybiBuZXcgU3RyaW5nWzBdOwotCWlmIChmbGFncyBpbnN0YW5jZW9mIFN0cmluZ1tdKSByZXR1cm4gKFN0cmluZ1tdKWZsYWdzOwotCVN0cmluZ1tdIHJlc3VsdCA9IHNwbGl0KChTdHJpbmcpZmxhZ3MsICIgIik7Ci0Jc2V0UGFyYW0oImZsYWdzIiwgcmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1wdWJsaWMgYm9vbGVhbiBnZXRGbGFnKFN0cmluZyBmbGFnKSB7Ci0JU3RyaW5nW10gZmxhZ3MgPSBnZXRGbGFncygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGZsYWdzW2ldLmVxdWFscyhmbGFnKSkgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRNZXRhRGF0YSgpOwotCi1wdWJsaWMgT2JqZWN0IGdldFBhcmFtKFN0cmluZyBrZXkpIHsKLQljaGVja1BhcmFtcygpOwotCU9iamVjdCB2YWx1ZSA9IHBhcmFtcy5nZXQoa2V5KTsKLQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWU7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlKCkgewotCXJldHVybiAhZ2V0RmxhZyhGTEFHX05PX0dFTik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEZsYWdzKFN0cmluZ1tdIGZsYWdzKSB7IAotCXNldFBhcmFtKCJmbGFncyIsIGZsYWdzKTsKLX0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgcGFyc2UoU3RyaW5nIHN0cik7Ci0KLXB1YmxpYyB2b2lkIHNldEZsYWcoU3RyaW5nIGZsYWcsIGJvb2xlYW4gdmFsdWUpIHsKLQlTdHJpbmdbXSBmbGFncyA9IGdldEZsYWdzKCk7Ci0JSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGZsYWdzKSk7Ci0JaWYgKHZhbHVlKSB7Ci0JCXNldC5hZGQoZmxhZyk7Ci0JfSBlbHNlIHsKLQkJc2V0LnJlbW92ZShmbGFnKTsKLQl9Ci0Jc2V0RmxhZ3MoKFN0cmluZ1tdKXNldC50b0FycmF5KG5ldyBTdHJpbmdbc2V0LnNpemUoKV0pKTsKLX0KLQotcHVibGljIHZvaWQgc2V0R2VuZXJhdGUoYm9vbGVhbiB2YWx1ZSkgewotCXNldEZsYWcoRkxBR19OT19HRU4sICF2YWx1ZSk7Ci19Ci0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE1ldGFEYXRhKFN0cmluZyB2YWx1ZSk7Ci0KLXB1YmxpYyB2b2lkIHNldFBhcmFtKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCWNoZWNrUGFyYW1zKCk7Ci0JcGFyYW1zLnB1dChrZXksIHZhbHVlKTsKLQlzZXRNZXRhRGF0YShmbGF0dGVuKCkpOwotfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBDbGFzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTgxY2QyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGVhbnVwQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xlYW51cENsYXNzIGV4dGVuZHMgSk5JR2VuZXJhdG9yIHsKLQotU3RyaW5nIGNsYXNzU291cmNlUGF0aDsKLVN0cmluZ1tdIHNvdXJjZVBhdGg7Ci1TdHJpbmcgY2xhc3NTb3VyY2U7Ci1IYXNodGFibGUgZmlsZXM7Ci1pbnQgdXNlZENvdW50LCB1bnVzZWRDb3VudDsKLQotU3RyaW5nW10gZ2V0QXJnTmFtZXMoSk5JTWV0aG9kIG1ldGhvZCkgewotCWludCBuX2FyZ3MgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpLmxlbmd0aDsKLQlpZiAobl9hcmdzID09IDApIHJldHVybiBuZXcgU3RyaW5nWzBdOwotCVN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQlTdHJpbmcgcGFyYW1zID0gIiI7Ci0JaW50IGluZGV4ID0gMDsKLQl3aGlsZSAodHJ1ZSkgewotCQlpbmRleCA9IGNsYXNzU291cmNlLmluZGV4T2YobmFtZSwgaW5kZXggKyAxKTsKLQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNsYXNzU291cmNlLmNoYXJBdChpbmRleCAtIDEpKSkgY29udGludWU7Ci0JCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuIG51bGw7Ci0JCWludCBwYXJhbnRlc2VzU3RhcnQgPSBjbGFzc1NvdXJjZS5pbmRleE9mKCIoIiwgaW5kZXgpOwotCQlpZiAoY2xhc3NTb3VyY2Uuc3Vic3RyaW5nKGluZGV4ICsgbmFtZS5sZW5ndGgoKSwgcGFyYW50ZXNlc1N0YXJ0KS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJaW50IHBhcmFudGVzZXNFbmQgPSBjbGFzc1NvdXJjZS5pbmRleE9mKCIpIiwgcGFyYW50ZXNlc1N0YXJ0KTsKLSAJCQlwYXJhbXMgPSBjbGFzc1NvdXJjZS5zdWJzdHJpbmcocGFyYW50ZXNlc1N0YXJ0ICsgMSwgcGFyYW50ZXNlc0VuZCk7Ci0gCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW25fYXJnc107Ci0JU3RyaW5nVG9rZW5pemVyIHRrID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXJhbXMsICIsIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmcgcyA9IHRrLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRrMSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocywgIiAiKTsKLQkJU3RyaW5nIHMxID0gbnVsbDsKLQkJd2hpbGUgKHRrMS5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXMxID0gdGsxLm5leHRUb2tlbigpOwotCQl9Ci0JCW5hbWVzW2ldID0gczEudHJpbSgpOwotCX0KLQlyZXR1cm4gbmFtZXM7CQotfQotCi0KLXZvaWQgbG9hZENsYXNzU291cmNlKCkgewotCWlmIChjbGFzc1NvdXJjZVBhdGggPT0gbnVsbCkgcmV0dXJuOwotCUZpbGUgZiA9IG5ldyBGaWxlKGNsYXNzU291cmNlUGF0aCk7Ci0JY2xhc3NTb3VyY2UgPSBsb2FkRmlsZShmKTsKLX0KLQotdm9pZCBsb2FkRmlsZXMgKCkgewotCS8vIEJBRCAtIGhvbGRzIG9uIHRvIGEgbG90IG9mIG1lbW9yeQotCWlmIChzb3VyY2VQYXRoID09IG51bGwpIHJldHVybjsKLQlmaWxlcyA9IG5ldyBIYXNodGFibGUgKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VQYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHNvdXJjZVBhdGhbaV0pOwotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlpZiAoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aCgiLmphdmEiKSkgewotCQkJCQlmaWxlcy5wdXQoZmlsZSwgbG9hZEZpbGUoZmlsZSkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbG9hZERpcmVjdG9yeShmaWxlKTsKLQkJCX0JCQotCQl9Ci0JfQotfQotCi1TdHJpbmcgbG9hZEZpbGUgKEZpbGUgZmlsZSkgewotCXRyeSB7Ci0JCUZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihmaWxlKTsKLQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnIpOwotCQlTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07Ci0JCWludCByZWFkOwotCQl3aGlsZSAoKHJlYWQgPSBici5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7Ci0JCQlzdHIuYXBwZW5kKGJ1ZmZlciwgMCwgcmVhZCk7Ci0JCX0KLQkJZnIuY2xvc2UoKTsKLQkJcmV0dXJuIHN0ci50b1N0cmluZygpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotCXJldHVybiAiIjsKLX0KLQotdm9pZCBsb2FkRGlyZWN0b3J5KEZpbGUgZmlsZSkgewotCVN0cmluZ1tdIGVudHJpZXMgPSBmaWxlLmxpc3QoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIGVudHJ5ID0gZW50cmllc1tpXTsKLQkJRmlsZSBmID0gbmV3IEZpbGUoZmlsZSwgZW50cnkpOwotCQlpZiAoIWYuaXNEaXJlY3RvcnkoKSkgewotCQkJaWYgKGYuZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsKLQkJCQlmaWxlcy5wdXQoZiwgbG9hZEZpbGUoZikpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbG9hZERpcmVjdG9yeShmKTsKLQkJfQkJCQkJCi0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklDbGFzcyBjbGF6eikgewotCWxvYWRGaWxlcyAoKTsKLQlsb2FkQ2xhc3NTb3VyY2UoKTsKLX0KLQotcHVibGljIHZvaWQgc2V0U291cmNlUGF0aChTdHJpbmdbXSBzb3VyY2VQYXRoKSB7Ci0JdGhpcy5zb3VyY2VQYXRoID0gc291cmNlUGF0aDsKLQlmaWxlcyA9IG51bGw7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldENsYXNzU291cmNlUGF0aChTdHJpbmcgY2xhc3NTb3VyY2VQYXRoKSB7Ci0JdGhpcy5jbGFzc1NvdXJjZVBhdGggPSBjbGFzc1NvdXJjZVBhdGg7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGVhbnVwQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjBhZGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGVhbnVwQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwQ29uc3RhbnRzIGV4dGVuZHMgQ2xlYW51cENsYXNzIHsKLQotU3RyaW5nIGdldEZpZWxkVmFsdWUoSk5JRmllbGQgZmllbGQpIHsKLQlTdHJpbmcgbmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKLQlpbnQgaW5kZXggPSAwOwotCXdoaWxlICh0cnVlKSB7Ci0JCWluZGV4ID0gY2xhc3NTb3VyY2UuaW5kZXhPZihuYW1lLCBpbmRleCArIDEpOwotCQlpZiAoaW5kZXggPT0gLTEpIHJldHVybiBudWxsOwotCQlpbnQgZXF1YWxzSW5kZXggPSBjbGFzc1NvdXJjZS5pbmRleE9mKCI9IiwgaW5kZXgpOwotCQlpZiAoY2xhc3NTb3VyY2Uuc3Vic3RyaW5nKGluZGV4ICsgbmFtZS5sZW5ndGgoKSwgZXF1YWxzSW5kZXgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpbnQgc2VtaUluZGV4ID0gY2xhc3NTb3VyY2UuaW5kZXhPZigiOyIsIGVxdWFsc0luZGV4KTsKLSAJCQlyZXR1cm4gY2xhc3NTb3VyY2Uuc3Vic3RyaW5nKGVxdWFsc0luZGV4ICsgMSwgc2VtaUluZGV4KS50cmltKCk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEpOSUNsYXNzIGNsYXp6KSB7Ci0JdW51c2VkQ291bnQgPSB1c2VkQ291bnQgPSAwOwotCXN1cGVyLmdlbmVyYXRlKGNsYXp6KTsKLQlKTklGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZ2VuZXJhdGUoZmllbGRzKTsKLQlvdXRwdXQoInVzZWQ9IiArIHVzZWRDb3VudCArICIgdW51c2VkPSIgKyB1bnVzZWRDb3VudCArICIgdG90YWw9IiArICh1bnVzZWRDb3VudCArIHVzZWRDb3VudCkpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklGaWVsZFtdIGZpZWxkcykgewotCXNvcnQoZmllbGRzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlKTklGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaWYgKChmaWVsZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLkZJTkFMKSA9PSAwKSBjb250aW51ZTsKLQkJZ2VuZXJhdGUoZmllbGQpOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoSk5JRmllbGQgZmllbGQpIHsKLQlTdHJpbmcgbmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKLQlFbnVtZXJhdGlvbiBrZXlzID0gZmlsZXMua2V5cygpOwotCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCU9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKWZpbGVzLmdldChrZXkpOwotCQlpZiAoc3RyLmluZGV4T2YobmFtZSkgIT0gLTEpIHsKLQkJCWludCBtb2RpZmllcnMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJCVN0cmluZyBtb2RpZmllcnNTdHIgPSBNb2RpZmllci50b1N0cmluZyhtb2RpZmllcnMpOwotCQkJb3V0cHV0KCJcdCIpOwotCQkJb3V0cHV0KG1vZGlmaWVyc1N0cik7Ci0JCQlpZiAobW9kaWZpZXJzU3RyLmxlbmd0aCgpID4gMCkgb3V0cHV0KCIgIik7Ci0JCQlvdXRwdXQoZmllbGQuZ2V0VHlwZSgpLmdldFR5cGVTaWduYXR1cmUzKGZhbHNlKSk7Ci0JCQlvdXRwdXQoIiAiICk7Ci0JCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJCW91dHB1dCgiID0gIik7Ci0JCQlvdXRwdXQoZ2V0RmllbGRWYWx1ZShmaWVsZCkpOwotCQkJb3V0cHV0bG4oIjsiKTsKLQkJCXVzZWRDb3VudCsrOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCXVudXNlZENvdW50Kys7Ci0JLy9vdXRwdXQoIk5PVCBVU0VEPSIgKyBmaWVsZC50b1N0cmluZygpICsgIiBcbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JaWYgKGFyZ3MubGVuZ3RoIDwgMykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIENsZWFudXBDb25zdGFudHMgPE9TIGNsYXNzTmFtZT4gPGNsYXNzIHNvdXJjZT4gPHNyYyBwYXRoMT4gPHNyYyBwYXRoMj4iKTsKLQkJcmV0dXJuOwotCX0KLQl0cnkgewotCQlDbGVhbnVwQ29uc3RhbnRzIGdlbiA9IG5ldyBDbGVhbnVwQ29uc3RhbnRzKCk7Ci0JCVN0cmluZyBjbGF6ek5hbWUgPSBhcmdzWzBdOwotCQlTdHJpbmcgY2xhc3NTb3VyY2UgPSBhcmdzWzFdOwotCQlTdHJpbmdbXSBzb3VyY2VQYXRoID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIDJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDIsIHNvdXJjZVBhdGgsIDAsIHNvdXJjZVBhdGgubGVuZ3RoKTsKLQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXp6TmFtZSk7Ci0JCWdlbi5zZXRTb3VyY2VQYXRoKHNvdXJjZVBhdGgpOwotCQlnZW4uc2V0Q2xhc3NTb3VyY2VQYXRoKGNsYXNzU291cmNlKTsKLQkJZ2VuLmdlbmVyYXRlKG5ldyBSZWZsZWN0Q2xhc3MoY2xhenopKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cE5hdGl2ZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGVhbnVwTmF0aXZlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGM0ZTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGVhbnVwTmF0aXZlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwTmF0aXZlcyBleHRlbmRzIENsZWFudXBDbGFzcyB7Ci0JCi1wdWJsaWMgQ2xlYW51cE5hdGl2ZXMoKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEpOSUNsYXNzIGNsYXp6KSB7Ci0JdW51c2VkQ291bnQgPSB1c2VkQ291bnQgPSAwOwotCXN1cGVyLmdlbmVyYXRlKGNsYXp6KTsKLQlKTklNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JZ2VuZXJhdGUobWV0aG9kcyk7Ci0Jb3V0cHV0KCJ1c2VkPSIgKyB1c2VkQ291bnQgKyAiIHVudXNlZD0iICsgdW51c2VkQ291bnQgKyAiIHRvdGFsPSIgKyAodW51c2VkQ291bnQgKyB1c2VkQ291bnQpKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoSk5JTWV0aG9kW10gbWV0aG9kcykgewotCXNvcnQobWV0aG9kcyk7CQotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlKTklNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQlnZW5lcmF0ZShtZXRob2QpOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoSk5JTWV0aG9kIG1ldGhvZCkgewotCVN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQlFbnVtZXJhdGlvbiBrZXlzID0gZmlsZXMua2V5cygpOwotCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCU9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKWZpbGVzLmdldChrZXkpOwotCQlpZiAoc3RyLmluZGV4T2YobmFtZSkgIT0gLTEpIHsKLS8vCQkJaW50IG1vZGlmaWVycyA9IG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKLS8vCQkJQ2xhc3MgY2xhenogPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLS8vCQkJU3RyaW5nIG1vZGlmaWVyc1N0ciA9IE1vZGlmaWVyLnRvU3RyaW5nKG1vZGlmaWVycyk7Ci0vLwkJCW91dHB1dChtb2RpZmllcnNTdHIpOwotLy8JCQlpZiAobW9kaWZpZXJzU3RyLmxlbmd0aCgpID4gMCkgb3V0cHV0KCIgIik7Ci0vLwkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSk7Ci0vLwkJCW91dHB1dCgiICIgKTsKLS8vCQkJb3V0cHV0KG1ldGhvZC5nZXROYW1lKCkpOwotLy8JCQlvdXRwdXQoIigiKTsKLS8vCQkJQ2xhc3NbXSBwYXJhbVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0vLwkJCVN0cmluZ1tdIHBhcmFtTmFtZXMgPSBnZXRBcmdOYW1lcyhtZXRob2QpOwotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0vLwkJCQlpZiAoaSAhPSAwKSBvdXRwdXQoIiwgIik7Ci0vLwkJCQlTdHJpbmcgc2lnID0gZ2V0VHlwZVNpZ25hdHVyZTMocGFyYW1UeXBlKTsKLS8vCQkJCWlmIChjbGF6ei5nZXRQYWNrYWdlKCkuZXF1YWxzKHBhcmFtVHlwZS5nZXRQYWNrYWdlKCkpKSBzaWcgPSBnZXRDbGFzc05hbWUocGFyYW1UeXBlKTsKLS8vCQkJCW91dHB1dChzaWcpOwotLy8JCQkJb3V0cHV0KCIgIik7Ci0vLwkJCQlvdXRwdXQocGFyYW1OYW1lc1tpXSk7Ci0vLwkJCX0KLS8vCQkJb3V0cHV0bG4oIik7Iik7Ci0JCQl1c2VkQ291bnQrKzsKLQkJCXJldHVybjsKLQkJfQotCX0KLQl1bnVzZWRDb3VudCsrOwotCW91dHB1dCgiTk9UIFVTRUQ9IiArIG1ldGhvZC50b1N0cmluZygpICsgIlxuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlpZiAoYXJncy5sZW5ndGggPCAyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgQ2xlYW51cE5hdGl2ZXMgPE9TIGNsYXNzTmFtZT4gPE9TIGNsYXNzIHNvdXJjZT4gPHNyYyBwYXRoMD4gPHNyYyBwYXRoMT4iKTsKLQkJcmV0dXJuOwotCX0KLQl0cnkgewotCQlDbGVhbnVwTmF0aXZlcyBnZW4gPSBuZXcgQ2xlYW51cE5hdGl2ZXMoKTsKLQkJU3RyaW5nIGNsYXp6TmFtZSA9IGFyZ3NbMF07Ci0JCVN0cmluZyBjbGFzc1NvdXJjZSA9IGFyZ3NbMV07IAotCQlTdHJpbmdbXSBzb3VyY2VQYXRoID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIDJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDIsIHNvdXJjZVBhdGgsIDAsIHNvdXJjZVBhdGgubGVuZ3RoKTsKLQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXp6TmFtZSk7Ci0JCWdlbi5zZXRTb3VyY2VQYXRoKHNvdXJjZVBhdGgpOwotCQlnZW4uc2V0Q2xhc3NTb3VyY2VQYXRoKGNsYXNzU291cmNlKTsKLQkJZ2VuLmdlbmVyYXRlKG5ldyBSZWZsZWN0Q2xhc3MoY2xhenopKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ29uc3RhbnRzR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ29uc3RhbnRzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYmM5NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NvbnN0YW50c0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzR2VuZXJhdG9yIGV4dGVuZHMgSk5JR2VuZXJhdG9yIHsKLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoSk5JQ2xhc3MgY2xhenopIHsKLQlKTklGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZ2VuZXJhdGUoZmllbGRzKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoSk5JRmllbGRbXSBmaWVsZHMpIHsKLQlzb3J0KGZpZWxkcyk7Ci0Jb3V0cHV0bG4oImludCBtYWluKCkgeyIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCUpOSUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQlpZiAoKGZpZWxkLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuRklOQUwpID09IDApIGNvbnRpbnVlOwotCQlnZW5lcmF0ZShmaWVsZCk7Ci0JfQotCW91dHB1dGxuKCJ9Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEpOSUZpZWxkIGZpZWxkKSB7Ci0JSk5JVHlwZSB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOwotCW91dHB1dCgiXHRwcmludGYoXCJwdWJsaWMgc3RhdGljIGZpbmFsICIpOwotCW91dHB1dChmaWVsZC5nZXRUeXBlKCkuZ2V0VHlwZVNpZ25hdHVyZTMoZmFsc2UpKTsKLQlvdXRwdXQoIiAiKTsKLQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQlvdXRwdXQoIiA9ICIpOwotCWlmICh0eXBlLmlzVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpIHx8IHR5cGUuaXNUeXBlKCJbQiIpKSBvdXRwdXQoIlwiJXNcIiIpOwotCWVsc2Ugb3V0cHV0KCIweCV4Iik7Ci0Jb3V0cHV0KCI7XFxuXCIsICIpOwotCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCW91dHB1dGxuKCIpOyIpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JaWYgKGFyZ3MubGVuZ3RoIDwgMSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIENvbnN0YW50c0dlbmVyYXRvciA8Y2xhc3NOYW1lMT4gPGNsYXNzTmFtZTI+Iik7Ci0JCXJldHVybjsKLQl9Ci0JdHJ5IHsKLQkJQ29uc3RhbnRzR2VuZXJhdG9yIGdlbiA9IG5ldyBDb25zdGFudHNHZW5lcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgY2xhenpOYW1lID0gYXJnc1tpXTsKLQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGF6ek5hbWUpOwotCQkJZ2VuLmdlbmVyYXRlKG5ldyBSZWZsZWN0Q2xhc3MoY2xhenopKTsKLQkJfQotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSIpOwotCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9FbWJlZE1ldGFEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvRW1iZWRNZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDAxOGNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9FbWJlZE1ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZE1ldGFEYXRhIGV4dGVuZHMgSk5JR2VuZXJhdG9yIHsKLQlUcmVlTWFwIGluc2VydHM7Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEpOSUNsYXNzIGNsYXp6KSB7Ci0JaW5zZXJ0cyA9IG5ldyBUcmVlTWFwKCk7Ci0JU3RyaW5nIGRhdGEgPSAoKEFic3RyYWN0SXRlbSljbGF6eikuZmxhdHRlbigpOwotCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSAhPSAwKSB7Ci0JCVN0cmluZyBkb2MgPSAiLyoqIEBqbmljbGFzcyAiICsgZGF0YSArICIgKi8iICsgZGVsaW1pdGVyOwotCQlpbnNlcnRzLnB1dChuZXcgSW50ZWdlcigoKEFTVENsYXNzKWNsYXp6KS5zdGFydCksIGRvYyk7Ci0JfQotCUpOSUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQlnZW5lcmF0ZShmaWVsZHMpOwotCUpOSU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlnZW5lcmF0ZShtZXRob2RzKTsKLQlpZiAoaW5zZXJ0cy5zaXplKCkgPT0gMCkgcmV0dXJuOwotCVN0cmluZyBzb3VyY2VQYXRoID0gKChBU1RDbGFzcyljbGF6eikuc291cmNlUGF0aDsKLQlTdHJpbmcgc291cmNlID0gSk5JR2VuZXJhdG9yLmxvYWRGaWxlKHNvdXJjZVBhdGgpOwotCVNldCBzZXQgPSBpbnNlcnRzLmtleVNldCgpOwotCUFycmF5TGlzdCBrZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCWtleXMuYWRkQWxsKHNldCk7Ci0JQ29sbGVjdGlvbnMucmV2ZXJzZShrZXlzKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzb3VyY2UpOwotCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJSW50ZWdlciBpbmRleCA9IChJbnRlZ2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCVN0cmluZyBkb2MgPSAoU3RyaW5nKWluc2VydHMuZ2V0KGluZGV4KTsKLQkJYnVmZmVyLmluc2VydChpbmRleC5pbnRWYWx1ZSgpLCBkb2MpOwotCX0KLQl0cnkgewotCQlvdXRwdXQoYnVmZmVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSwgc291cmNlUGF0aCk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0JaW5zZXJ0cyA9IG51bGw7Ci19Ci0KLWJvb2xlYW4gY29tcGFyZShJbnB1dFN0cmVhbSBpczEsIElucHV0U3RyZWFtIGlzMikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQl3aGlsZSAodHJ1ZSkgewotCQlpbnQgYzEgPSBpczEucmVhZCgpOwotCQlpbnQgYzIgPSBpczIucmVhZCgpOwotCQlpZiAoYzEgIT0gYzIpIHJldHVybiBmYWxzZTsKLQkJaWYgKGMxID09IC0xKSBicmVhazsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgb3V0cHV0KGJ5dGVbXSBieXRlcywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCUZpbGVJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JdHJ5IHsKLQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJaWYgKGNvbXBhcmUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaXMpKSkgcmV0dXJuOwotCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCWlmIChpcyAhPSBudWxsKSBpcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCX0KLQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQlvdXQud3JpdGUoYnl0ZXMpOwotCW91dC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklGaWVsZFtdIGZpZWxkcykgewotCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCUpOSUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQlpbnQgbW9kcyA9IGZpZWxkLmdldE1vZGlmaWVycygpOwotCQlpZiAoKG1vZHMgJiBNb2RpZmllci5QVUJMSUMpID09IDApIGNvbnRpbnVlOwotCQlpZiAoKG1vZHMgJiBNb2RpZmllci5GSU5BTCkgIT0gMCkgY29udGludWU7Ci0JCWlmICgobW9kcyAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCkgY29udGludWU7Ci0JCWdlbmVyYXRlKGZpZWxkKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEpOSUZpZWxkIGZpZWxkKSB7Ci0JLy93cmFwIGNhc3Qgd2l0aCBwYXJlbnRoZXNlcwotCWZpZWxkLnNldENhc3QoZmllbGQuZ2V0Q2FzdCgpKTsKLQlTdHJpbmcgZGF0YSA9ICgoQWJzdHJhY3RJdGVtKWZpZWxkKS5mbGF0dGVuKCk7Ci0JaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpICE9IDApIHsKLQkJU3RyaW5nIGRvYyA9ICIvKiogQGZpZWxkICIgKyBkYXRhICsgIiAqLyIgKyBkZWxpbWl0ZXIgKyAiXHQiOwotCQlpbnNlcnRzLnB1dChuZXcgSW50ZWdlcigoKEFTVEZpZWxkKWZpZWxkKS5zdGFydCksIGRvYyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklNZXRob2RbXSBtZXRob2RzKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCUpOSU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCWdlbmVyYXRlKG1ldGhvZCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklNZXRob2QgbWV0aG9kKSB7Ci0JQXJyYXlMaXN0IHRhZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JU3RyaW5nIGRhdGEgPSAoKEFic3RyYWN0SXRlbSltZXRob2QpLmZsYXR0ZW4oKTsKLQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgIT0gMCkgewotCQl0YWdzLmFkZCgiQG1ldGhvZCAiICsgZGF0YSk7Ci0JfQotCUpOSVBhcmFtZXRlcltdIHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJQVNUUGFyYW1ldGVyIHBhcmFtID0gKEFTVFBhcmFtZXRlcilwYXJhbXNbaV07Ci0JCS8vd3JhcCBjYXN0IHdpdGggcGFyZW50aGVzZXMKLQkJcGFyYW0uc2V0Q2FzdChwYXJhbS5nZXRDYXN0KCkpOwotCQlkYXRhID0gKChBYnN0cmFjdEl0ZW0pcGFyYW0pLmZsYXR0ZW4oKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpICE9IDApIHsKLQkJCXRhZ3MuYWRkKCJAcGFyYW0gIiArIHBhcmFtLmdldE5hbWUoKSArICIgIiArIGRhdGEpOwotCQl9Ci0JfQotCWlmICh0YWdzLnNpemUoKSA9PSAwKSByZXR1cm47Ci0JaWYgKHRhZ3Muc2l6ZSgpID09IDEpIHsKLQkJU3RyaW5nIGRvYyA9ICIvKiogIiArIChTdHJpbmcpdGFncy5nZXQoMCkgKyAiICovIiArIGRlbGltaXRlcjsKLQkJaW5zZXJ0cy5wdXQobmV3IEludGVnZXIoKChBU1RNZXRob2QpbWV0aG9kKS5zdGFydCksIGRvYyk7Ci0JfSBlbHNlIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiLyoqIik7Ci0JCWJ1ZmZlci5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRhZ3MuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHRhZyA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIiAqICIpOwotCQkJYnVmZmVyLmFwcGVuZCh0YWcpOwotCQkJYnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIiAqLyIpOwotCQlidWZmZXIuYXBwZW5kKGRlbGltaXRlcik7Ci0JCWluc2VydHMucHV0KG5ldyBJbnRlZ2VyKCgoQVNUTWV0aG9kKW1ldGhvZCkuc3RhcnQpLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ZsYWdzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvRmxhZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwZjg2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvRmxhZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRmxhZ3MgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT19HRU4gPSAibm9fZ2VuIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PX0lOID0gIm5vX2luIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PX09VVCA9ICJub19vdXQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9fV0lOQ0UgPSAibm9fd2luY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ1JJVElDQUwgPSAiY3JpdGljYWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfSU5JVCA9ICJpbml0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1NUUlVDVCA9ICJzdHJ1Y3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVU5JQ09ERSA9ICJ1bmljb2RlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1NFTlRJTkVMID0gInNlbnRpbmVsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NQUCA9ICJjcHAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTkVXID0gIm5ldyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19ERUxFVEUgPSJkZWxldGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09OU1QgPSAiY29uc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ0FTVCA9ICJjYXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0RZTkFNSUMgPSAiZHluYW1pYyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19KTkkgPSAiam5pIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0FERFJFU1MgPSAiYWRkcmVzcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19HQ05FVyA9ICJnY25ldyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19HQ09CSkVDVCA9ICJnY29iamVjdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19TRVRURVIgPSAic2V0dGVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0dFVFRFUiA9ICJnZXR0ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQURERVIgPSAiYWRkZXIiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUNsYXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhZDE4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSk5JQ2xhc3MgZXh0ZW5kcyBKTklJdGVtIHsKLQkKLXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gRkxBR1MgPSB7RkxBR19OT19HRU4sIEZMQUdfQ1BQfTsKLQotcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpOwotCi1wdWJsaWMgSk5JQ2xhc3MgZ2V0U3VwZXJjbGFzcygpOwotCi1wdWJsaWMgSk5JRmllbGRbXSBnZXREZWNsYXJlZEZpZWxkcygpOwotCi1wdWJsaWMgSk5JTWV0aG9kW10gZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXhjbHVkZSgpOwotCi1wdWJsaWMgdm9pZCBzZXRFeGNsdWRlKFN0cmluZyBzdHIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUZpZWxkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzNjU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSk5JRmllbGQgZXh0ZW5kcyBKTklJdGVtIHsKLQkKLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRkxBR1MgPSB7RkxBR19OT19HRU4sIEZMQUdfTk9fV0lOQ0V9OwotCi1wdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQkKLXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCk7Ci0KLXB1YmxpYyBKTklUeXBlIGdldFR5cGUoKTsKLQotcHVibGljIEpOSVR5cGUgZ2V0VHlwZTY0KCk7Ci0KLXB1YmxpYyBKTklDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpOwotCi1wdWJsaWMgU3RyaW5nIGdldEFjY2Vzc29yKCk7Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2FzdCgpOwotCi1wdWJsaWMgU3RyaW5nIGdldEV4Y2x1ZGUoKTsKLQotcHVibGljIHZvaWQgc2V0QWNjZXNzb3IoU3RyaW5nIHN0cik7Ci0KLXB1YmxpYyB2b2lkIHNldENhc3QoU3RyaW5nIHN0cik7Ci0KLXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGUoU3RyaW5nIHN0cik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2Y2ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKTklHZW5lcmF0b3IgaW1wbGVtZW50cyBGbGFncyB7Ci0KLQlKTklDbGFzcyBtYWluQ2xhc3M7Ci0JSk5JQ2xhc3NbXSBjbGFzc2VzOwotCU1ldGFEYXRhIG1ldGFEYXRhOwotCWJvb2xlYW4gaXNDUFA7Ci0JU3RyaW5nIGRlbGltaXRlcjsKLQlQcmludFN0cmVhbSBvdXRwdXQ7Ci0JUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzOwotCQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSk5JNjQgPSAiSk5JNjQiOwotCi1wdWJsaWMgSk5JR2VuZXJhdG9yKCkgewotCWRlbGltaXRlciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQlvdXRwdXQgPSBTeXN0ZW0ub3V0OwotCW1ldGFEYXRhID0gbmV3IE1ldGFEYXRhKG5ldyBQcm9wZXJ0aWVzKCkpOwotfQotCi1TdHJpbmcgZml4RGVsaW1pdGVyKFN0cmluZyBzdHIpIHsKLQlpZiAoZGVsaW1pdGVyLmVxdWFscygiXG4iKSkgcmV0dXJuIHN0cjsKLQlpbnQgaW5kZXggPSAwLCBsZW5ndGggPSBzdHIubGVuZ3RoKCk7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJaW50IHN0YXJ0ID0gaW5kZXg7Ci0JCWluZGV4ID0gc3RyLmluZGV4T2YoJ1xuJywgc3RhcnQpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoc3RyLnN1YnN0cmluZyhzdGFydCwgbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KSk7Ci0JCQlidWZmZXIuYXBwZW5kKGRlbGltaXRlcik7Ci0JCQlpbmRleCsrOwotCQl9Ci0JfQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLQotc3RhdGljIFN0cmluZyBnZXRGdW5jdGlvbk5hbWUoSk5JTWV0aG9kIG1ldGhvZCkgewotCXJldHVybiBnZXRGdW5jdGlvbk5hbWUobWV0aG9kLCBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgZ2V0RnVuY3Rpb25OYW1lKEpOSU1ldGhvZCBtZXRob2QsIEpOSVR5cGVbXSBwYXJhbVR5cGVzKSB7Ci0JaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIHJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCVN0cmluZyBmdW5jdGlvbiA9IHRvQyhtZXRob2QuZ2V0TmFtZSgpKTsKLQlpZiAoIW1ldGhvZC5pc05hdGl2ZVVuaXF1ZSgpKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZnVuY3Rpb24pOwotCQlidWZmZXIuYXBwZW5kKCJfXyIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCUpOSVR5cGUgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCWJ1ZmZlci5hcHBlbmQodG9DKHBhcmFtVHlwZS5nZXRUeXBlU2lnbmF0dXJlKGZhbHNlKSkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JcmV0dXJuIGZ1bmN0aW9uOwotfQotCi1zdGF0aWMgU3RyaW5nIGxvYWRGaWxlIChTdHJpbmcgZmlsZSkgewotCXRyeSB7Ci0JCUZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihmaWxlKTsKLQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnIpOwotCQlTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07Ci0JCWludCByZWFkOwotCQl3aGlsZSAoKHJlYWQgPSBici5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7Ci0JCQlzdHIuYXBwZW5kKGJ1ZmZlciwgMCwgcmVhZCk7Ci0JCX0KLQkJZnIuY2xvc2UoKTsKLQkJcmV0dXJuIHN0ci50b1N0cmluZygpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZpbGUgbm90IGZvdW5kOiIgKyBmaWxlLCBlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNvcnQoSk5JTWV0aG9kW10gbWV0aG9kcykgewotCUFycmF5cy5zb3J0KG1ldGhvZHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlKTklNZXRob2QgbXRoMSA9IChKTklNZXRob2QpYTsKLQkJCUpOSU1ldGhvZCBtdGgyID0gKEpOSU1ldGhvZCliOwotCQkJaW50IHJlc3VsdCA9IG10aDEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhtdGgyLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gcmVzdWx0ICE9IDAgPyByZXN1bHQgOiBnZXRGdW5jdGlvbk5hbWUobXRoMSkuY29tcGFyZVRvKGdldEZ1bmN0aW9uTmFtZShtdGgyKSk7Ci0JCX0KLQl9KTsKLX0KLQotc3RhdGljIHZvaWQgc29ydChKTklGaWVsZFtdIGZpZWxkcykgewotCUFycmF5cy5zb3J0KGZpZWxkcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCXJldHVybiAoKEpOSUZpZWxkKWEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChKTklGaWVsZCliKS5nZXROYW1lKCkpOwotCQl9Ci0JfSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNvcnQoSk5JQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JQXJyYXlzLnNvcnQoY2xhc3NlcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCXJldHVybiAoKEpOSUNsYXNzKWEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChKTklDbGFzcyliKS5nZXROYW1lKCkpOwotCQl9Ci0JfSk7CQotfQotCi1zdGF0aWMgU3RyaW5nW10gc3BsaXQoU3RyaW5nIHN0ciwgU3RyaW5nIHNlcGFyYXRvcikgewotCVN0cmluZ1Rva2VuaXplciB0ayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCBzZXBhcmF0b3IpOwotCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jd2hpbGUgKHRrLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXJlc3VsdC5hZGQodGsubmV4dEVsZW1lbnQoKSk7Ci0JfQotCXJldHVybiAoU3RyaW5nW10pcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgdG9DKFN0cmluZyBzdHIpIHsKLQlpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCAqIDIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJY2hhciBjID0gc3RyLmNoYXJBdChpKTsKLQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICdfJzogYnVmZmVyLmFwcGVuZCgiXzEiKTsgYnJlYWs7Ci0JCQljYXNlICc7JzogYnVmZmVyLmFwcGVuZCgiXzIiKTsgYnJlYWs7Ci0JCQljYXNlICdbJzogYnVmZmVyLmFwcGVuZCgiXzMiKTsgYnJlYWs7Ci0JCQljYXNlICcuJzogYnVmZmVyLmFwcGVuZCgiXyIpOyBicmVhazsKLQkJCWNhc2UgJy8nOiBidWZmZXIuYXBwZW5kKCJfIik7IGJyZWFrOwotCQkJZGVmYXVsdDogYnVmZmVyLmFwcGVuZChjKTsKLQkJfQotCX0KLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlKEpOSUNsYXNzIGNsYXp6KTsKLQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb3B5cmlnaHQoKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlSW5jbHVkZXMoKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgewotCWlmIChjbGFzc2VzID09IG51bGwpIHJldHVybjsKLQlnZW5lcmF0ZUNvcHlyaWdodCgpOwotCWdlbmVyYXRlSW5jbHVkZXMoKTsKLQlzb3J0KGNsYXNzZXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQlKTklDbGFzcyBjbGF6eiA9IGNsYXNzZXNbaV07Ci0JCWlmIChjbGF6ei5nZXRGbGFnKEZMQUdfQ1BQKSkgewotCQkJaXNDUFAgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCUpOSUNsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsKLQkJaWYgKGdldEdlbmVyYXRlKGNsYXp6KSkgZ2VuZXJhdGUoY2xhenopOwotCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc3RlcCgpOwotCX0KLQlvdXRwdXQuZmx1c2goKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVNZXRhRGF0YShTdHJpbmcga2V5KSB7Ci0JTWV0YURhdGEgbXQgPSBnZXRNZXRhRGF0YSgpOwotCVN0cmluZyBkYXRhID0gbXQuZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JaWYgKGRhdGEubGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCW91dHB1dGxuKGZpeERlbGltaXRlcihkYXRhKSk7Ci19Ci0KLXB1YmxpYyBKTklDbGFzc1tdIGdldENsYXNzZXMoKSB7Ci0JcmV0dXJuIGNsYXNzZXM7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGdldENQUCgpIHsKLQlyZXR1cm4gaXNDUFA7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVsaW1pdGVyKCkgewotCXJldHVybiBkZWxpbWl0ZXI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCXJldHVybiBnZXRDUFAoKSA/ICIuY3BwIiA6ICIuYyI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JcmV0dXJuIGdldE91dHB1dE5hbWUoKSArIGdldFN1ZmZpeCgpICsgZ2V0RXh0ZW5zaW9uKCk7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIGdldEdlbmVyYXRlKEpOSUl0ZW0gaXRlbSkgewotCXJldHVybiBpdGVtLmdldEdlbmVyYXRlKCk7Ci19Ci0KLXB1YmxpYyBQcmludFN0cmVhbSBnZXRPdXRwdXQoKSB7Ci0JcmV0dXJuIG91dHB1dDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRPdXRwdXROYW1lKCkgewotCXJldHVybiBnZXRNYWluQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKTsKLX0KLQotcHVibGljIEpOSUNsYXNzIGdldE1haW5DbGFzcygpIHsKLQlyZXR1cm4gbWFpbkNsYXNzOwotfQotCi1wdWJsaWMgTWV0YURhdGEgZ2V0TWV0YURhdGEoKSB7Ci0JcmV0dXJuIG1ldGFEYXRhOwotfQotCi1wdWJsaWMgUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQlyZXR1cm4gcHJvZ3Jlc3M7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgewotCXJldHVybiAiIjsKLX0KLQotcHVibGljIHZvaWQgb3V0cHV0KFN0cmluZyBzdHIpIHsKLQlvdXRwdXQucHJpbnQoc3RyKTsKLX0KLQotcHVibGljIHZvaWQgb3V0cHV0bG4oKSB7Ci0Jb3V0cHV0KGdldERlbGltaXRlcigpKTsKLX0KLQotcHVibGljIHZvaWQgb3V0cHV0bG4oU3RyaW5nIHN0cikgewotCW91dHB1dChzdHIpOwotCW91dHB1dChnZXREZWxpbWl0ZXIoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldENsYXNzZXMoSk5JQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JdGhpcy5jbGFzc2VzID0gY2xhc3NlczsKLX0KLQotcHVibGljIHZvaWQgc2V0RGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpIHsKLQl0aGlzLmRlbGltaXRlciA9IGRlbGltaXRlcjsKLX0KLQotcHVibGljIHZvaWQgc2V0TWFpbkNsYXNzKEpOSUNsYXNzIG1haW5DbGFzcykgewotCXRoaXMubWFpbkNsYXNzID0gbWFpbkNsYXNzOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShNZXRhRGF0YSBkYXRhKSB7Ci0JbWV0YURhdGEgPSBkYXRhOwotfQotCi1wdWJsaWMgdm9pZCBzZXRPdXRwdXQoUHJpbnRTdHJlYW0gb3V0cHV0KSB7Ci0JdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKLQl0aGlzLnByb2dyZXNzID0gcHJvZ3Jlc3M7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3JBcHAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3JBcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5NDMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JR2VuZXJhdG9yQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotcHVibGljIGNsYXNzIEpOSUdlbmVyYXRvckFwcCB7Ci0KLQlKTklDbGFzcyBtYWluQ2xhc3M7Ci0JSk5JQ2xhc3NbXSBjbGFzc2VzOwotCVByb2dyZXNzTW9uaXRvciBwcm9ncmVzczsKLQlTdHJpbmcgbWFpbkNsYXNzTmFtZSwgb3V0cHV0RGlyLCBjbGFzc3BhdGg7Ci0JTWV0YURhdGEgbWV0YURhdGE7Ci0JCi0Jc3RhdGljIGJvb2xlYW4gVVNFX0FTVCA9IHRydWU7Ci0KLXB1YmxpYyBKTklHZW5lcmF0b3JBcHAoKSB7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoKCkgewotCXJldHVybiBjbGFzc3BhdGg7Ci19Ci0KLXB1YmxpYyBKTklDbGFzcyBnZXRNYWluQ2xhc3MoKSB7Ci0JcmV0dXJuIG1haW5DbGFzczsKLX0KLQotcHVibGljIFN0cmluZyBnZXRNYWluQ2xhc3NOYW1lKCkgewotCXJldHVybiBtYWluQ2xhc3NOYW1lOwotfQotCi1wdWJsaWMgTWV0YURhdGEgZ2V0TWV0YURhdGEoKSB7Ci0JcmV0dXJuIG1ldGFEYXRhOwotfQotCi1TdHJpbmcgZ2V0TWV0YURhdGFEaXIoKSB7Ci0JcmV0dXJuICIuL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC8iOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldE91dHB1dERpcigpIHsKLQlyZXR1cm4gb3V0cHV0RGlyOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUFsbCgpIHsKLQlTdHJpbmcgbWFpbkNsYXNzZXMgPSBuZXcgTWV0YURhdGEoZ2V0RGVmYXVsdE1haW5DbGFzcygpKS5nZXRNZXRhRGF0YSgic3d0X21haW5fY2xhc3NlcyIsIG51bGwpOwotCWlmIChtYWluQ2xhc3NlcyAhPSBudWxsKSB7Ci0JCVN0cmluZ1tdIGxpc3QgPSBKTklHZW5lcmF0b3Iuc3BsaXQobWFpbkNsYXNzZXMsICIsIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMikgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGxpc3RbaV0udHJpbSgpOwotCQkJaWYgKCFVU0VfQVNUKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGZhbHNlLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiR2VuZXJhdGluZyBcIiIgKyBjbGFzc05hbWUgKyAiXCIiKTsKLQkJCXNldE1haW5DbGFzc05hbWUoY2xhc3NOYW1lKTsKLQkJCWdlbmVyYXRlKCk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTVEFUU19DKEpOSUNsYXNzW10gY2xhc3NlcykgewotCXRyeSB7Ci0JCVN0YXRzR2VuZXJhdG9yIGdlbiA9IG5ldyBTdGF0c0dlbmVyYXRvcihmYWxzZSk7Ci0JCWdlbi5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZ2VuLnNldENsYXNzZXMoY2xhc3Nlcyk7Ci0JCWdlbi5zZXRNZXRhRGF0YShtZXRhRGF0YSk7Ci0JCWdlbi5zZXRQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3MpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlnZW4uc2V0T3V0cHV0KG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCWlmIChvdXQuc2l6ZSgpID4gMCkgb3V0cHV0KG91dC50b0J5dGVBcnJheSgpLCBvdXRwdXREaXIgKyBnZW4uZ2V0RmlsZU5hbWUoKSk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZVNUQVRTX0goSk5JQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JdHJ5IHsKLQkJU3RhdHNHZW5lcmF0b3IgZ2VuID0gbmV3IFN0YXRzR2VuZXJhdG9yKHRydWUpOwotCQlnZW4uc2V0TWFpbkNsYXNzKG1haW5DbGFzcyk7Ci0JCWdlbi5zZXRDbGFzc2VzKGNsYXNzZXMpOwotCQlnZW4uc2V0TWV0YURhdGEobWV0YURhdGEpOwotCQlnZW4uc2V0UHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJZ2VuLnNldE91dHB1dChuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JCWdlbi5nZW5lcmF0ZSgpOwotCQlpZiAob3V0LnNpemUoKSA+IDApIG91dHB1dChvdXQudG9CeXRlQXJyYXkoKSwgb3V0cHV0RGlyICsgZ2VuLmdldEZpbGVOYW1lKCkpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSIpOwotCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTVFJVQ1RTX0goSk5JQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JdHJ5IHsKLQkJU3RydWN0c0dlbmVyYXRvciBnZW4gPSBuZXcgU3RydWN0c0dlbmVyYXRvcih0cnVlKTsKLQkJZ2VuLnNldE1haW5DbGFzcyhtYWluQ2xhc3MpOwotCQlnZW4uc2V0Q2xhc3NlcyhjbGFzc2VzKTsKLQkJZ2VuLnNldE1ldGFEYXRhKG1ldGFEYXRhKTsKLQkJZ2VuLnNldFByb2dyZXNzTW9uaXRvcihwcm9ncmVzcyk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWdlbi5zZXRPdXRwdXQobmV3IFByaW50U3RyZWFtKG91dCkpOwotCQlnZW4uZ2VuZXJhdGUoKTsKLQkJaWYgKG91dC5zaXplKCkgPiAwKSBvdXRwdXQob3V0LnRvQnl0ZUFycmF5KCksIG91dHB1dERpciArIGdlbi5nZXRGaWxlTmFtZSgpKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotCi19Ci0KLXZvaWQgZ2VuZXJhdGVTVFJVQ1RTX0MoSk5JQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JdHJ5IHsKLQkJU3RydWN0c0dlbmVyYXRvciBnZW4gPSBuZXcgU3RydWN0c0dlbmVyYXRvcihmYWxzZSk7Ci0JCWdlbi5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZ2VuLnNldENsYXNzZXMoY2xhc3Nlcyk7Ci0JCWdlbi5zZXRNZXRhRGF0YShtZXRhRGF0YSk7Ci0JCWdlbi5zZXRQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3MpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlnZW4uc2V0T3V0cHV0KG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCWlmIChvdXQuc2l6ZSgpID4gMCkgb3V0cHV0KG91dC50b0J5dGVBcnJheSgpLCBvdXRwdXREaXIgKyBnZW4uZ2V0RmlsZU5hbWUoKSk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLQotfQotCi12b2lkIGdlbmVyYXRlU1dUX0MoSk5JQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JdHJ5IHsKLQkJTmF0aXZlc0dlbmVyYXRvciBnZW4gPSBuZXcgTmF0aXZlc0dlbmVyYXRvcigpOwotCQlnZW4uc2V0TWFpbkNsYXNzKG1haW5DbGFzcyk7Ci0JCWdlbi5zZXRDbGFzc2VzKGNsYXNzZXMpOwotCQlnZW4uc2V0TWV0YURhdGEobWV0YURhdGEpOwotCQlnZW4uc2V0UHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJZ2VuLnNldE91dHB1dChuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JCWdlbi5nZW5lcmF0ZSgpOwotCQlpZiAob3V0LnNpemUoKSA+IDApIG91dHB1dChvdXQudG9CeXRlQXJyYXkoKSwgb3V0cHV0RGlyICsgZ2VuLmdldEZpbGVOYW1lKCkpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSIpOwotCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci19Ci0KLQotdm9pZCBnZW5lcmF0ZU1ldGFEYXRhKEpOSUNsYXNzW10gY2xhc3NlcykgewotCXRyeSB7Ci0JCU1ldGFEYXRhR2VuZXJhdG9yIGdlbiA9IG5ldyBNZXRhRGF0YUdlbmVyYXRvcigpOwotCQlnZW4uc2V0TWFpbkNsYXNzKG1haW5DbGFzcyk7Ci0JCWdlbi5zZXRDbGFzc2VzKGNsYXNzZXMpOwotCQlnZW4uc2V0TWV0YURhdGEobWV0YURhdGEpOwotCQlnZW4uc2V0UHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJZ2VuLnNldE91dHB1dChuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JCWlmIChuZXcgRmlsZShnZXRNZXRhRGF0YURpcigpICsgZ2VuLmdldEZpbGVOYW1lKCkpLmV4aXN0cygpKSB7Ci0JCQlnZW4uZ2VuZXJhdGUoKTsKLQkJCWlmICghbmV3IEZpbGUoZ2V0TWV0YURhdGFEaXIoKSkuZXhpc3RzKCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IE1ldGEgZGF0YSBvdXRwdXQgZGlyIGRvZXMgbm90IGV4aXN0Iik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKG91dC5zaXplKCkgPiAwKSBvdXRwdXQob3V0LnRvQnl0ZUFycmF5KCksIGdldE1ldGFEYXRhRGlyKCkgKyBnZW4uZ2V0RmlsZU5hbWUoKSk7Ci0JCX0KLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlRW1iZWRlZE1ldGFEYXRhKEpOSUNsYXNzW10gY2xhc3NlcykgewotCXRyeSB7Ci0JCUVtYmVkTWV0YURhdGEgZ2VuID0gbmV3IEVtYmVkTWV0YURhdGEoKTsKLQkJZ2VuLnNldE1haW5DbGFzcyhtYWluQ2xhc3MpOwotCQlnZW4uc2V0Q2xhc3NlcyhjbGFzc2VzKTsKLQkJZ2VuLnNldE1ldGFEYXRhKG1ldGFEYXRhKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoKSB7Ci0JZ2VuZXJhdGUobnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKFByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgewotCWlmIChtYWluQ2xhc3MgPT0gbnVsbCkgcmV0dXJuOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zZXRNZXNzYWdlKCJJbml0aWFsaXppbmcuLi4iKTsKLQlKTklDbGFzc1tdIGNsYXNzZXMgPSBnZXRDbGFzc2VzKCk7Ci0JSk5JQ2xhc3NbXSBuYXRpdmVzID0gZ2V0TmF0aXZlc0NsYXNzZXMoY2xhc3Nlcyk7Ci0JSk5JQ2xhc3NbXSBzdHJ1Y3RzID0gZ2V0U3RydWN0dXJlQ2xhc3NlcyhjbGFzc2VzKTsKLQl0aGlzLnByb2dyZXNzID0gcHJvZ3Jlc3M7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHsKLQkJaW50IG5hdGl2ZUNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYXRpdmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlKTklDbGFzcyBjbGF6eiA9IG5hdGl2ZXNbaV07Ci0JCQlKTklNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZHMubGVuZ3RoOyBqKyspIHsKLQkJCQlKTklNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tqXTsKLQkJCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCQkJbmF0aXZlQ291bnQrKzsKLQkJCX0KLQkJfQotCQlpbnQgdG90YWwgPSBuYXRpdmVDb3VudCAqIDQ7Ci0JCXRvdGFsICs9IGNsYXNzZXMubGVuZ3RoOwotCQl0b3RhbCArPSBuYXRpdmVzLmxlbmd0aCAqICgzKTsKLQkJdG90YWwgKz0gc3RydWN0cy5sZW5ndGggKiAyOwotCQlwcm9ncmVzcy5zZXRUb3RhbCh0b3RhbCk7Ci0JCXByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgc3RydWN0cy5oIC4uLiIpOwotCX0KLQlnZW5lcmF0ZVNUUlVDVFNfSChzdHJ1Y3RzKTsKLQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc2V0TWVzc2FnZSgiR2VuZXJhdGluZyBzdHJ1Y3RzLmMgLi4uIik7Ci0JZ2VuZXJhdGVTVFJVQ1RTX0Moc3RydWN0cyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgbmF0aXZlcyAuLi4iKTsKLQlnZW5lcmF0ZVNXVF9DKG5hdGl2ZXMpOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zZXRNZXNzYWdlKCJHZW5lcmF0aW5nIHN0YXRzLmggLi4uIik7Ci0JZ2VuZXJhdGVTVEFUU19IKG5hdGl2ZXMpOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zZXRNZXNzYWdlKCJHZW5lcmF0aW5nIHN0YXRzLmMgLi4uIik7Ci0JZ2VuZXJhdGVTVEFUU19DKG5hdGl2ZXMpOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zZXRNZXNzYWdlKCJHZW5lcmF0aW5nIG1ldGEgZGF0YSAuLi4iKTsKLQlnZW5lcmF0ZU1ldGFEYXRhKGNsYXNzZXMpOwotLy8JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgZW1iZWRlZCBtZXRhIGRhdGEgLi4uIik7Ci0vLwlnZW5lcmF0ZUVtYmVkZWRNZXRhRGF0YShjbGFzc2VzKTsKLQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc2V0TWVzc2FnZSgiRG9uZS4iKTsKLQl0aGlzLnByb2dyZXNzID0gbnVsbDsKLX0KLQotYm9vbGVhbiBjb21wYXJlKElucHV0U3RyZWFtIGlzMSwgSW5wdXRTdHJlYW0gaXMyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXdoaWxlICh0cnVlKSB7Ci0JCWludCBjMSA9IGlzMS5yZWFkKCk7Ci0JCWludCBjMiA9IGlzMi5yZWFkKCk7Ci0JCWlmIChjMSAhPSBjMikgcmV0dXJuIGZhbHNlOwotCQlpZiAoYzEgPT0gLTEpIGJyZWFrOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBvdXRwdXQoYnl0ZVtdIGJ5dGVzLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JRmlsZUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQl0cnkgewotCQlpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQlpZiAoY29tcGFyZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpLCBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpcykpKSByZXR1cm47Ci0JfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJaWYgKGlzICE9IG51bGwpIGlzLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JfQotCUZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwotCW91dC53cml0ZShieXRlcyk7Ci0Jb3V0LmNsb3NlKCk7Ci19Ci0KLVN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JaW50IGRvdCA9IG1haW5DbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQlpZiAoZG90ID09IC0xKSByZXR1cm4gIiI7Ci0JcmV0dXJuIG1haW5DbGFzc05hbWUuc3Vic3RyaW5nKDAsIGRvdCk7Ci19Ci0KLVN0cmluZ1tdIGdldENsYXNzTmFtZXMoU3RyaW5nIG1haW5DbGFzc05hbWUpIHsKLQlTdHJpbmcgcGtnTmFtZSA9IGdldFBhY2thZ2VOYW1lKG1haW5DbGFzc05hbWUpOwotCVN0cmluZyBjbGFzc3BhdGggPSBnZXRDbGFzc3BhdGgoKTsKLQlpZiAoY2xhc3NwYXRoID09IG51bGwpIGNsYXNzcGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7Ci0JU3RyaW5nIHBrZ1BhdGggPSBwa2dOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCVN0cmluZyBwa2daaXBQYXRoID0gcGtnTmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKLQlBcnJheUxpc3QgY2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsJCi0JaW50IHN0YXJ0ID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCXdoaWxlIChpbmRleCA8IGNsYXNzcGF0aC5sZW5ndGgoKSkgewotCQlpbmRleCA9IGNsYXNzcGF0aC5pbmRleE9mKEZpbGUucGF0aFNlcGFyYXRvckNoYXIsIHN0YXJ0KTsKLQkJaWYgKGluZGV4ID09IC0xKSBpbmRleCA9IGNsYXNzcGF0aC5sZW5ndGgoKTsKLQkJU3RyaW5nIHBhdGggPSBjbGFzc3BhdGguc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCk7Ci0JCWlmIChwYXRoLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKSkgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHBhdGgpOwotCQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSB6aXBGaWxlLmVudHJpZXMoKTsKLQkJCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSllbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKHBrZ1ppcFBhdGgpICYmIG5hbWUuaW5kZXhPZignLycsIHBrZ1ppcFBhdGgubGVuZ3RoKCkgKyAxKSA9PSAtMSAmJiBuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IG5hbWUuc3Vic3RyaW5nKHBrZ1ppcFBhdGgubGVuZ3RoKCkgKyAxLCBuYW1lLmxlbmd0aCgpIC0gNik7Ci0JCQkJCQljbGFzc05hbWUucmVwbGFjZSgnLycsICcuJyk7Ci0JCQkJCQljbGFzc2VzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoemlwRmlsZSAhPSBudWxsKSB6aXBGaWxlLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHt9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBwa2dQYXRoKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nW10gZW50cmllcyA9IGZpbGUubGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShmaWxlLCBlbnRyeSk7Ci0JCQkJCWlmICghZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQlpZiAoZi5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gZW50cnkuc3Vic3RyaW5nKDAsIGVudHJ5Lmxlbmd0aCgpIC0gNik7Ci0JCQkJCQkJY2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJCX0KLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCXN0YXJ0ID0gaW5kZXggKyAxOwotCX0KLQlyZXR1cm4gKFN0cmluZ1tdKWNsYXNzZXMudG9BcnJheShuZXcgU3RyaW5nW2NsYXNzZXMuc2l6ZSgpXSk7Ci19Ci0KLXB1YmxpYyBKTklDbGFzc1tdIGdldENsYXNzZXMoKSB7Ci0JaWYgKGNsYXNzZXMgIT0gbnVsbCkgcmV0dXJuIGNsYXNzZXM7Ci0JaWYgKG1haW5DbGFzc05hbWUgPT0gbnVsbCkgcmV0dXJuIG5ldyBKTklDbGFzc1swXTsKLQlpZiAoVVNFX0FTVCkgcmV0dXJuIGdldEFTVENsYXNzZXMoKTsKLQlTdHJpbmdbXSBjbGFzc05hbWVzID0gZ2V0Q2xhc3NOYW1lcyhtYWluQ2xhc3NOYW1lKTsKLQlBcnJheXMuc29ydChjbGFzc05hbWVzKTsKLQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShtYWluQ2xhc3NOYW1lKTsKLQlKTklDbGFzc1tdIGNsYXNzZXMgPSBuZXcgSk5JQ2xhc3NbY2xhc3NOYW1lcy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NOYW1lc1tpXTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBxdWFsaWZpZWROYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyBjbGFzc05hbWU7Ci0JCQlpZiAocXVhbGlmaWVkTmFtZS5lcXVhbHMobWFpbkNsYXNzTmFtZSkpIHsKLQkJCQljbGFzc2VzW2ldID0gbWFpbkNsYXNzOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgc291cmNlUGF0aCA9IG5ldyBGaWxlKG91dHB1dERpcikuZ2V0UGFyZW50KCkgKyAiLyIgKyBxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5qYXZhIjsKLQkJCQljbGFzc2VzW2ldID0gbmV3IFJlZmxlY3RDbGFzcyhDbGFzcy5mb3JOYW1lKHF1YWxpZmllZE5hbWUsIGZhbHNlLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLCBtZXRhRGF0YSwgc291cmNlUGF0aCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCXJldHVybiBjbGFzc2VzOwotfQotCi1wdWJsaWMgSk5JQ2xhc3NbXSBnZXRBU1RDbGFzc2VzKCkgewotCWlmIChjbGFzc2VzICE9IG51bGwpIHJldHVybiBjbGFzc2VzOwotCWlmIChtYWluQ2xhc3NOYW1lID09IG51bGwpIHJldHVybiBuZXcgSk5JQ2xhc3NbMF07Ci0JU3RyaW5nIHJvb3QgPSBuZXcgRmlsZShvdXRwdXREaXIpLmdldFBhcmVudCgpOwotCVN0cmluZyBtYWluUGF0aCA9IG5ldyBGaWxlKHJvb3QgKyAiLyIgKyBtYWluQ2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5qYXZhIikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JQXJyYXlMaXN0IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUobWFpbkNsYXNzTmFtZSk7Ci0JRmlsZSBkaXIgPSBuZXcgRmlsZShyb290ICsgIi8iICsgcGFja2FnZU5hbWUucmVwbGFjZSgnLicsICcvJykpOwotCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQl0cnkgewotCQkJU3RyaW5nIHBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCWlmIChwYXRoLmVuZHNXaXRoKCIuamF2YSIpKSB7Ci0JCQkJaWYgKG1haW5QYXRoLmVxdWFscyhwYXRoKSl7Ci0JCQkJCWNsYXNzZXMuYWRkKG1haW5DbGFzcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2xhc3Nlcy5hZGQobmV3IEFTVENsYXNzKHBhdGgsIG1ldGFEYXRhKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQlyZXR1cm4gKEpOSUNsYXNzW10pY2xhc3Nlcy50b0FycmF5KG5ldyBKTklDbGFzc1tjbGFzc2VzLnNpemUoKV0pOwotfQotCi1wdWJsaWMgSk5JQ2xhc3NbXSBnZXROYXRpdmVzQ2xhc3NlcyhKTklDbGFzc1tdIGNsYXNzZXMpIHsKLQlpZiAobWFpbkNsYXNzID09IG51bGwpIHJldHVybiBuZXcgSk5JQ2xhc3NbMF07Ci0JQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJSk5JQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQlKTklNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgbWV0aG9kcy5sZW5ndGg7IGorKykgewotCQkJSk5JTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbal07Ci0JCQlpbnQgbW9kcyA9IG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKLQkJCWlmICgobW9kcyAmIE1vZGlmaWVyLk5BVElWRSkgIT0gMCkgewotCQkJCXJlc3VsdC5hZGQoY2xhenopOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAoSk5JQ2xhc3NbXSlyZXN1bHQudG9BcnJheShuZXcgSk5JQ2xhc3NbcmVzdWx0LnNpemUoKV0pOwotfQotCi1wdWJsaWMgSk5JQ2xhc3NbXSBnZXRTdHJ1Y3R1cmVDbGFzc2VzKEpOSUNsYXNzW10gY2xhc3NlcykgewotCWlmIChtYWluQ2xhc3MgPT0gbnVsbCkgcmV0dXJuIG5ldyBKTklDbGFzc1swXTsKLQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCW91dGVyOgotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQlKTklDbGFzcyBjbGF6eiA9IGNsYXNzZXNbaV07Ci0JCUpOSU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RzLmxlbmd0aDsgaisrKSB7Ci0JCQlKTklNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tqXTsKLQkJCWludCBtb2RzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCQkJaWYgKChtb2RzICYgTW9kaWZpZXIuTkFUSVZFKSAhPSAwKSBjb250aW51ZSBvdXRlcjsKLQkJfQotCQlKTklGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWJvb2xlYW4gaGFzUHVibGljRmllbGRzID0gZmFsc2U7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZmllbGRzLmxlbmd0aDsgaisrKSB7Ci0JCQlKTklGaWVsZCBmaWVsZCA9IGZpZWxkc1tqXTsKLQkJCWludCBtb2RzID0gZmllbGQuZ2V0TW9kaWZpZXJzKCk7Ci0JCQlpZiAoKG1vZHMgJiBNb2RpZmllci5QVUJMSUMpICE9IDAgJiYgKG1vZHMgJiBNb2RpZmllci5TVEFUSUMpID09IDApIHsKLQkJCQloYXNQdWJsaWNGaWVsZHMgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghaGFzUHVibGljRmllbGRzKSBjb250aW51ZTsKLQkJcmVzdWx0LmFkZChjbGF6eik7Ci0JfQotCXJldHVybiAoSk5JQ2xhc3NbXSlyZXN1bHQudG9BcnJheShuZXcgSk5JQ2xhc3NbcmVzdWx0LnNpemUoKV0pOwotfQotCi1wdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoU3RyaW5nIGNsYXNzcGF0aCkgewotCXRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoSk5JQ2xhc3MgbWFpbkNsYXNzKSB7Ci0JdGhpcy5tYWluQ2xhc3MgPSBtYWluQ2xhc3M7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKE1ldGFEYXRhIGRhdGEpIHsKLQl0aGlzLm1ldGFEYXRhID0gZGF0YTsKLX0KLQotcHVibGljIHZvaWQgc2V0Q2xhc3NlcyhKTklDbGFzc1tdIGNsYXNzZXMpIHsKLQl0aGlzLmNsYXNzZXMgPSBjbGFzc2VzOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3NOYW1lKFN0cmluZyBzdHIpIHsKLQltYWluQ2xhc3NOYW1lID0gc3RyOwotCW1ldGFEYXRhID0gbmV3IE1ldGFEYXRhKG1haW5DbGFzc05hbWUpOwotCVN0cmluZyBtYWluQ2xhc3NlcyA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEoInN3dF9tYWluX2NsYXNzZXMiLCBudWxsKTsKLQlpZiAobWFpbkNsYXNzZXMgIT0gbnVsbCkgewotCQlTdHJpbmdbXSBsaXN0ID0gSk5JR2VuZXJhdG9yLnNwbGl0KG1haW5DbGFzc2VzLCAiLCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDIpIHsKLQkJCWlmIChtYWluQ2xhc3NOYW1lLmVxdWFscyhsaXN0W2ldLnRyaW0oKSkpIHsKLQkJCQlzZXRPdXRwdXREaXIobGlzdFtpICsgMV0udHJpbSgpKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobWFpbkNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlUGF0aCA9IG5ldyBGaWxlKG91dHB1dERpcikuZ2V0UGFyZW50KCkgKyAiLyIgKyBtYWluQ2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5qYXZhIjsKLQkJCWlmIChVU0VfQVNUKSB7Ci0JCQkJbWFpbkNsYXNzID0gbmV3IEFTVENsYXNzKHNvdXJjZVBhdGgsIG1ldGFEYXRhKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWFpbkNsYXNzID0gbmV3IFJlZmxlY3RDbGFzcyhDbGFzcy5mb3JOYW1lKG1haW5DbGFzc05hbWUsIGZhbHNlLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLCBtZXRhRGF0YSwgc291cmNlUGF0aCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQotcHVibGljIHZvaWQgc2V0TWFpbkNsYXNzTmFtZShTdHJpbmcgc3RyLCBTdHJpbmcgb3V0cHV0RGlyKSB7Ci0JbWFpbkNsYXNzTmFtZSA9IHN0cjsKLQlzZXRPdXRwdXREaXIob3V0cHV0RGlyKTsKLQltZXRhRGF0YSA9IG5ldyBNZXRhRGF0YShtYWluQ2xhc3NOYW1lKTsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlUGF0aCA9IG5ldyBGaWxlKHRoaXMub3V0cHV0RGlyKS5nZXRQYXJlbnQoKSArICIvIiArIG1haW5DbGFzc05hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmphdmEiOwotCQlpZiAoVVNFX0FTVCkgewotCQkJbWFpbkNsYXNzID0gbmV3IEFTVENsYXNzKHNvdXJjZVBhdGgsIG1ldGFEYXRhKTsKLQkJfSBlbHNlIHsKLQkJCW1haW5DbGFzcyA9IG5ldyBSZWZsZWN0Q2xhc3MoQ2xhc3MuZm9yTmFtZShtYWluQ2xhc3NOYW1lLCBmYWxzZSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSwgbWV0YURhdGEsIHNvdXJjZVBhdGgpOwotCQl9Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE91dHB1dERpcihTdHJpbmcgc3RyKSB7Ci0JaWYgKHN0ciAhPSBudWxsKSB7Ci0JCWlmICghc3RyLmVuZHNXaXRoKCJcXCIpICYmICFzdHIuZW5kc1dpdGgoIi8iKSApIHsKLQkJCXN0ciArPSBGaWxlLnNlcGFyYXRvcjsKLQkJfQotCX0KLQlvdXRwdXREaXIgPSBzdHIucmVwbGFjZSgnXFwnLCAnLycpOwotfQotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0TWFpbkNsYXNzKCkgewotCXJldHVybiAib3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLiIgKyBnZXREZWZhdWx0UGxhdGZvcm0oKSArICIuT1MiOwotfQotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UGxhdGZvcm0oKSB7Ci0JcmV0dXJuIFNXVC5nZXRQbGF0Zm9ybSgpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JSk5JR2VuZXJhdG9yQXBwIGdlbiA9IG5ldyBKTklHZW5lcmF0b3JBcHAgKCk7Ci0JaWYgKGFyZ3MubGVuZ3RoID09IDEgJiYgKGFyZ3NbMF0uZXF1YWxzKCIqIikgfHwgYXJnc1swXS5lcXVhbHMoImFsbCIpKSkgewotCQlnZW4uZ2VuZXJhdGVBbGwoKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoYXJncy5sZW5ndGggPiAwKSB7Ci0JCWdlbi5zZXRNYWluQ2xhc3NOYW1lKGFyZ3NbMF0pOwotCQlpZiAoYXJncy5sZW5ndGggPiAxKSBnZW4uc2V0T3V0cHV0RGlyKGFyZ3NbMV0pOwotCQlpZiAoYXJncy5sZW5ndGggPiAyKSBnZW4uc2V0Q2xhc3NwYXRoKGFyZ3NbMl0pOwotCX0gZWxzZSB7Ci0JCWdlbi5zZXRNYWluQ2xhc3NOYW1lKGdldERlZmF1bHRNYWluQ2xhc3MoKSk7Ci0JfQotCWdlbi5nZW5lcmF0ZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JR2VuZXJhdG9yQXBwVUkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3JBcHBVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjU0OGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3JBcHBVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBKTklHZW5lcmF0b3JBcHBVSSB7Ci0KLQlEaXNwbGF5IGRpc3BsYXk7Ci0JU2hlbGwgc2hlbGw7Ci0JCi0JQ29tcG9zaXRlIGFjdGlvbnNQYW5lbDsKLQlDb21ibyBtYWluQ2xhc3NDYiwgb3V0cHV0RGlyQ2I7Ci0JVGFibGUgY2xhc3Nlc0x0LCBtZW1iZXJzTHQsIHBhcmFtc0x0OwotCVByb2dyZXNzQmFyIHByb2dyZXNzQmFyOwotCUxhYmVsIHByb2dyZXNzTGFiZWw7Ci0JRmlsZURpYWxvZyBmaWxlRGlhbG9nOwotCQotCVRhYmxlRWRpdG9yIHBhcmFtVGV4dEVkaXRvciwgbWVtYmVyVGV4dEVkaXRvciwgY2xhc3NUZXh0RWRpdG9yOwotCUZsYWdzRWRpdG9yIHBhcmFtTGlzdEVkaXRvciwgbWVtYmVyTGlzdEVkaXRvciwgY2xhc3NMaXN0RWRpdG9yOwotCVRleHQgcGFyYW1FZGl0b3JUeCwgbWVtYmVyRWRpdG9yVHgsIGNsYXNzRWRpdG9yVHg7Ci0JTGlzdCBwYXJhbUVkaXRvckx0LCBtZW1iZXJFZGl0b3JMdCwgY2xhc3NFZGl0b3JMdDsKLQkKLQlzdGF0aWMgY2xhc3MgRmxhZ3NFZGl0b3IgewotCQlUYWJsZSBwYXJlbnQ7Ci0JCWludCBjb2x1bW4gPSAtMTsKLQkJVGFibGVJdGVtIGl0ZW07Ci0JCQotCQlwdWJsaWMgRmxhZ3NFZGl0b3IoVGFibGUgcGFyZW50KSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJfQotCQkKLQkJcHVibGljIGludCBnZXRDb2x1bW4oKSB7Ci0JCQlyZXR1cm4gY29sdW1uOwotCQl9Ci0JCQotCQlwdWJsaWMgVGFibGVJdGVtIGdldEl0ZW0oKSB7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0Q29sdW1uKGludCBjb2x1bW4pIHsKLQkJCXRoaXMuY29sdW1uID0gY29sdW1uOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRJdGVtKFRhYmxlSXRlbSBpdGVtKSB7Ci0JCQl0aGlzLml0ZW0gPSBpdGVtOwotCQl9Ci0JfQotCQotCUpOSUdlbmVyYXRvckFwcCBhcHA7Ci0KLQlzdGF0aWMgZmluYWwgaW50IENMQVNTX05BTUVfQ09MVU1OID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IENMQVNTX0ZMQUdTX0NPTFVNTiA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBDTEFTU19FWENMVURFX0NPTFVNTiA9IDI7Ci0JCi0Jc3RhdGljIGZpbmFsIGludCBGSUVMRF9OQU1FX0NPTFVNTiA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBGSUVMRF9GTEFHU19DT0xVTU4gPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgRklFTERfQ0FTVF9DT0xVTU4gPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgRklFTERfQUNDRVNTT1JfQ09MVU1OID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IEZJRUxEX0VYQ0xVREVfQ09MVU1OID0gNDsKLQkKLQlzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9OQU1FX0NPTFVNTiA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBNRVRIT0RfRkxBR1NfQ09MVU1OID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9BQ0NFU1NPUl9DT0xVTU4gPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0VYQ0xVREVfQ09MVU1OID0gMzsKLQkKLQlzdGF0aWMgZmluYWwgaW50IFBBUkFNX0lOREVYX0NPTFVNTiA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBQQVJBTV9UWVBFX0NPTFVNTiA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBQQVJBTV9GTEFHU19DT0xVTU4gPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fQ0FTVF9DT0xVTU4gPSAzOwotCQotcHVibGljIEpOSUdlbmVyYXRvckFwcFVJKCkgewotCXRoaXMgKG5ldyBKTklHZW5lcmF0b3JBcHAoKSk7Ci19Ci0KLXB1YmxpYyBKTklHZW5lcmF0b3JBcHBVSShKTklHZW5lcmF0b3JBcHAgYXBwKSB7Ci0JdGhpcy5hcHAgPSBhcHA7Ci19Ci0KLXZvaWQgY2xlYW51cCgpIHsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVN0cnVjdHNIZWFkZXIgKCkgewotCVN0cnVjdHNHZW5lcmF0b3IgZ2VuID0gbmV3IFN0cnVjdHNHZW5lcmF0b3IodHJ1ZSk7Ci0JZ2VuLnNldE1haW5DbGFzcyhhcHAuZ2V0TWFpbkNsYXNzKCkpOwotCWdlbi5zZXRNZXRhRGF0YShhcHAuZ2V0TWV0YURhdGEoKSk7Ci0JZ2VuLnNldENsYXNzZXMoZ2V0U2VsZWN0ZWRDbGFzc2VzKCkpOwotCWdlbi5nZW5lcmF0ZSgpOwotfQotCi12b2lkIGdlbmVyYXRlU3RydWN0cyAoKSB7Ci0JU3RydWN0c0dlbmVyYXRvciBnZW4gPSBuZXcgU3RydWN0c0dlbmVyYXRvcihmYWxzZSk7Ci0JZ2VuLnNldE1haW5DbGFzcyhhcHAuZ2V0TWFpbkNsYXNzKCkpOwotCWdlbi5zZXRNZXRhRGF0YShhcHAuZ2V0TWV0YURhdGEoKSk7Ci0JZ2VuLnNldENsYXNzZXMoZ2V0U2VsZWN0ZWRDbGFzc2VzKCkpOwotCWdlbi5nZW5lcmF0ZSgpOwotfQotCi12b2lkIGdlbmVyYXRlU2l6ZW9mICgpIHsKLQlTaXplb2ZHZW5lcmF0b3IgZ2VuID0gbmV3IFNpemVvZkdlbmVyYXRvcigpOwotCWdlbi5zZXRNYWluQ2xhc3MoYXBwLmdldE1haW5DbGFzcygpKTsKLQlnZW4uc2V0TWV0YURhdGEoYXBwLmdldE1ldGFEYXRhKCkpOwotCWdlbi5zZXRDbGFzc2VzKGdldFNlbGVjdGVkQ2xhc3NlcygpKTsKLQlnZW4uZ2VuZXJhdGUoKTsKLX0KLQotdm9pZCBnZW5lcmF0ZU1ldGFEYXRhICgpIHsKLQlNZXRhRGF0YUdlbmVyYXRvciBnZW4gPSBuZXcgTWV0YURhdGFHZW5lcmF0b3IoKTsKLQlnZW4uc2V0TWFpbkNsYXNzKGFwcC5nZXRNYWluQ2xhc3MoKSk7Ci0JZ2VuLnNldE1ldGFEYXRhKGFwcC5nZXRNZXRhRGF0YSgpKTsKLQlKTklNZXRob2RbXSBtZXRob2RzID0gZ2V0U2VsZWN0ZWRNZXRob2RzKCk7Ci0JaWYgKG1ldGhvZHMubGVuZ3RoICE9IDApIHsKLQkJZ2VuLmdlbmVyYXRlKG1ldGhvZHMpOwotCX0gZWxzZSB7Ci0JCWdlbi5zZXRDbGFzc2VzKGdldFNlbGVjdGVkQ2xhc3NlcygpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlTmF0aXZlcyAoKSB7Ci0JTmF0aXZlc0dlbmVyYXRvciBnZW4gPSBuZXcgTmF0aXZlc0dlbmVyYXRvcigpOwotCWdlbi5zZXRNYWluQ2xhc3MoYXBwLmdldE1haW5DbGFzcygpKTsKLQlnZW4uc2V0TWV0YURhdGEoYXBwLmdldE1ldGFEYXRhKCkpOwotCUpOSU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRTZWxlY3RlZE1ldGhvZHMoKTsKLQlpZiAobWV0aG9kcy5sZW5ndGggIT0gMCkgewotCQlnZW4uZ2VuZXJhdGUobWV0aG9kcyk7Ci0JfSBlbHNlIHsKLQkJZ2VuLnNldENsYXNzZXMoZ2V0U2VsZWN0ZWRDbGFzc2VzKCkpOwotCQlnZW4uZ2VuZXJhdGUoKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVBbGwoKSB7Ci0JaWYgKCF1cGRhdGVPdXRwdXREaXIoKSkgcmV0dXJuOwotCUN1cnNvciBjdXJzb3IgPSBkaXNwbGF5LmdldFN5c3RlbUN1cnNvcihTV1QuQ1VSU09SX1dBSVQpOwotCXNoZWxsLnNldEN1cnNvcihjdXJzb3IpOwotCXNoZWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGFjdGlvbnNQYW5lbC5nZXRDaGlsZHJlbigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24pIGNoaWxkLnNldEVuYWJsZWQoZmFsc2UpOwkJCQkKLQl9Ci0JYm9vbGVhbiBzaG93UHJvZ3Jlc3MgPSB0cnVlOwotCWZpbmFsIGJvb2xlYW4gZmluYWxTaG93UHJvZ3Jlc3MgPSBzaG93UHJvZ3Jlc3M7IC8qIGF2b2lkIGRlYWQgY29kZSB3YXJuaW5nIGJlbG93ICovCi0JaWYgKHNob3dQcm9ncmVzcykgewotCQlwcm9ncmVzc0xhYmVsLnNldFRleHQoIiIpOwotCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oMCk7Ci0JCXByb2dyZXNzTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJcHJvZ3Jlc3NCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JZmluYWwgYm9vbGVhbltdIGRvbmUgPSBuZXcgYm9vbGVhblsxXTsKLQluZXcgVGhyZWFkKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCWFwcC5nZW5lcmF0ZSghZmluYWxTaG93UHJvZ3Jlc3MgPyBudWxsIDogbmV3IFByb2dyZXNzTW9uaXRvcigpIHsKLQkJCQkJaW50IHRvdGFsLCBzdGVwLCBtYXhpbXVtID0gMTAwOwotCQkJCQlwdWJsaWMgdm9pZCBzZXRUb3RhbChmaW5hbCBpbnQgdG90YWwpIHsKLQkJCQkJCXRoaXMudG90YWwgPSB0b3RhbDsKLQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJcHJvZ3Jlc3NCYXIuc2V0TWF4aW11bShtYXhpbXVtKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCBzdGVwKCkgewotCQkJCQkJaW50IG9sZFZhbHVlID0gc3RlcCAqIG1heGltdW0gLyB0b3RhbDsKLQkJCQkJCXN0ZXArKzsKLQkJCQkJCWZpbmFsIGludCBuZXdWYWx1ZSA9IHN0ZXAgKiBtYXhpbXVtIC8gdG90YWw7Ci0JCQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUpIHJldHVybjsKLQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJcHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKG5ld1ZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsJCQkJCQotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJcHJvZ3Jlc3NMYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJCQkJCQlwcm9ncmVzc0xhYmVsLnVwZGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWRvbmVbMF0gPSB0cnVlOwotCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJfQotCQl9Ci0JfS5zdGFydCgpOwotCXdoaWxlICghZG9uZVswXSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJ1dHRvbikgY2hpbGQuc2V0RW5hYmxlZCh0cnVlKTsJCQkJCi0JfQotCWlmIChzaG93UHJvZ3Jlc3MpIHsKLQkJcHJvZ3Jlc3NCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXByb2dyZXNzTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCXNoZWxsLnNldEVuYWJsZWQodHJ1ZSk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotfQotCi12b2lkIGdlbmVyYXRlQ29uc3RhbnRzICgpIHsKLQlDb25zdGFudHNHZW5lcmF0b3IgZ2VuID0gbmV3IENvbnN0YW50c0dlbmVyYXRvcigpOwotCWdlbi5zZXRNYWluQ2xhc3MoYXBwLmdldE1haW5DbGFzcygpKTsKLQlnZW4uc2V0TWV0YURhdGEoYXBwLmdldE1ldGFEYXRhKCkpOwotCUpOSUZpZWxkW10gZmllbGRzID0gZ2V0U2VsZWN0ZWRGaWVsZHMoKTsKLQlpZiAoZmllbGRzLmxlbmd0aCAhPSAwKSB7Ci0JCWdlbi5nZW5lcmF0ZShmaWVsZHMpOwotCX0gZWxzZSB7Ci0JCWdlbi5zZXRDbGFzc2VzKGdldFNlbGVjdGVkQ2xhc3NlcygpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JfQotfQotCi1KTklDbGFzc1tdIGdldFNlbGVjdGVkQ2xhc3NlcygpIHsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGNsYXNzZXNMdC5nZXRTZWxlY3Rpb24oKTsKLQlKTklDbGFzc1tdIGNsYXNzZXMgPSBuZXcgSk5JQ2xhc3NbaXRlbXMubGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCWNsYXNzZXNbaV0gPSAoSk5JQ2xhc3MpaXRlbS5nZXREYXRhKCk7Ci0JfQotCXJldHVybiBjbGFzc2VzOwotfQotCi1KTklNZXRob2RbXSBnZXRTZWxlY3RlZE1ldGhvZHMoKSB7Ci0JVGFibGVJdGVtW10gc2VsZWN0aW9uID0gbWVtYmVyc0x0LmdldFNlbGVjdGlvbigpOwotCUpOSU1ldGhvZFtdIG1ldGhvZHMgPSBuZXcgSk5JTWV0aG9kW3NlbGVjdGlvbi5sZW5ndGhdOwotCWludCBjb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBzZWxlY3Rpb24gW2ldOwotCQlPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIEpOSU1ldGhvZCkgewotCQkJbWV0aG9kc1tjb3VudCsrXSA9IChKTklNZXRob2QpZGF0YTsKLQkJfQotCX0KLQlpZiAoY291bnQgIT0gbWV0aG9kcy5sZW5ndGgpIHsKLQkJSk5JTWV0aG9kW10gcmVzdWx0ID0gbmV3IEpOSU1ldGhvZFtjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkobWV0aG9kcywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCW1ldGhvZHMgPSByZXN1bHQ7Ci0JfQotCXJldHVybiBtZXRob2RzOwotfQotCi1KTklGaWVsZFtdIGdldFNlbGVjdGVkRmllbGRzKCkgewotCVRhYmxlSXRlbVtdIHNlbGVjdGlvbiA9IG1lbWJlcnNMdC5nZXRTZWxlY3Rpb24oKTsKLQlKTklGaWVsZFtdIGZpZWxkcyA9IG5ldyBKTklGaWVsZFtzZWxlY3Rpb24ubGVuZ3RoXTsKLQlpbnQgY291bnQgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gc2VsZWN0aW9uIFtpXTsKLQkJT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBKTklGaWVsZCkgewotCQkJZmllbGRzW2NvdW50KytdID0gKEpOSUZpZWxkKWRhdGE7Ci0JCX0KLQl9Ci0JaWYgKGNvdW50ICE9IGZpZWxkcy5sZW5ndGgpIHsKLQkJSk5JRmllbGRbXSByZXN1bHQgPSBuZXcgSk5JRmllbGRbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGZpZWxkcywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCWZpZWxkcyA9IHJlc3VsdDsKLQl9Ci0JcmV0dXJuIGZpZWxkczsKLX0KLQotcHVibGljIHZvaWQgb3BlbiAoKSB7Ci0JZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiSk5JIEdlbmVyYXRvciIpOwotCi0JR3JpZERhdGEgZGF0YTsKLQlHcmlkTGF5b3V0IHNoZWxsTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlzaGVsbExheW91dC5udW1Db2x1bW5zID0gMjsKLQlzaGVsbC5zZXRMYXlvdXQoc2hlbGxMYXlvdXQpOwotCQotCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JcGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlHcmlkTGF5b3V0IHBhbmVsTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlwYW5lbExheW91dC5udW1Db2x1bW5zID0gMTsKLQlwYW5lbC5zZXRMYXlvdXQocGFuZWxMYXlvdXQpOwotCQotCUxpc3RlbmVyIHVwZGF0ZU1haW5DbGFzc0xpc3RlbmVyID0gIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJdXBkYXRlTWFpbkNsYXNzKCk7Ci0JCQlpZiAoIXVwZGF0ZU91dHB1dERpcigpKSByZXR1cm47Ci0JCQl1cGRhdGVDbGFzc2VzKCk7Ci0JCQl1cGRhdGVNZW1iZXJzKCk7Ci0JCQl1cGRhdGVQYXJhbWV0ZXJzKCk7Ci0JCX0KLQl9OwkKLQljcmVhdGVNYWluQ2xhc3NQYW5lbChwYW5lbCwgdXBkYXRlTWFpbkNsYXNzTGlzdGVuZXIpOwotCWNyZWF0ZUNsYXNzZXNQYW5lbChwYW5lbCk7Ci0JY3JlYXRlTWVtYmVyc1BhbmVsKHBhbmVsKTsKLQljcmVhdGVQYXJhbWV0ZXJzUGFuZWwocGFuZWwpOwotCWNyZWF0ZUFjdGlvbkJ1dHRvbnMoc2hlbGwpOwotCi0JUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0Jc2hlbGwuc2V0U2l6ZShzaGVsbC5nZXRTaXplKCkueCwgcHJlZmVycmVkU2l6ZS55KTsKLQkKLQl1cGRhdGVNYWluQ2xhc3MoKTsKLQl1cGRhdGVDbGFzc2VzKCk7Ci0JdXBkYXRlTWVtYmVycygpOwotCXVwZGF0ZVBhcmFtZXRlcnMoKTsKLX0KLQotdm9pZCBjcmVhdGVNYWluQ2xhc3NQYW5lbChDb21wb3NpdGUgcGFuZWwsIExpc3RlbmVyIHVwZGF0ZUxpc3RlbmVyKSB7Ci0JTGFiZWwgbWFpbkNsYXNzTGIgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQltYWluQ2xhc3NMYi5zZXRUZXh0KCImTWFpbiBDbGFzczoiKTsKLQotCUdyaWREYXRhIGRhdGE7Ci0JbWFpbkNsYXNzQ2IgPSBuZXcgQ29tYm8ocGFuZWwsIFNXVC5EUk9QX0RPV04pOwotCVN0cmluZyBtYWluQ2xhc3MgPSBhcHAuZ2V0TWFpbkNsYXNzTmFtZSgpOwotCW1haW5DbGFzc0NiLnNldFRleHQobWFpbkNsYXNzID09IG51bGwgPyAiIiA6IG1haW5DbGFzcyk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCW1haW5DbGFzc0NiLnNldExheW91dERhdGEoZGF0YSk7Ci0JbWFpbkNsYXNzQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdXBkYXRlTGlzdGVuZXIpOwotCW1haW5DbGFzc0NiLmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCB1cGRhdGVMaXN0ZW5lcik7Ci0KLQlMYWJlbCBvdXRwdXREaXJMYiA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5PTkUpOwotCW91dHB1dERpckxiLnNldFRleHQoIiZPdXRwdXQgRGlyOiIpOwotCQotCW91dHB1dERpckNiID0gbmV3IENvbWJvKHBhbmVsLCBTV1QuRFJPUF9ET1dOKTsKLQlTdHJpbmcgb3V0cHV0RGlyID0gYXBwLmdldE91dHB1dERpcigpOwotCW91dHB1dERpckNiLnNldFRleHQob3V0cHV0RGlyID09IG51bGwgPyAiIiA6IG91dHB1dERpcik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCW91dHB1dERpckNiLnNldExheW91dERhdGEoZGF0YSk7Ci0Jb3V0cHV0RGlyQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdXBkYXRlTGlzdGVuZXIpOwotCW91dHB1dERpckNiLmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCB1cGRhdGVMaXN0ZW5lcik7Ci0KLQlTdHJpbmcgbWFpbkNsYXNzZXMgPSBhcHAuZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YSgic3d0X21haW5fY2xhc3NlcyIsIG51bGwpOwotCWlmIChtYWluQ2xhc3NlcyAhPSBudWxsKSB7Ci0JCVN0cmluZ1tdIGxpc3QgPSBKTklHZW5lcmF0b3Iuc3BsaXQobWFpbkNsYXNzZXMsICIsIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMikgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGxpc3RbaV0udHJpbSgpOwotCQkJdHJ5IHsKLQkJCQlDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCQkJbWFpbkNsYXNzQ2IuYWRkKGNsYXNzTmFtZSk7Ci0JCQkJb3V0cHV0RGlyQ2IuYWRkKGxpc3RbaSArIDFdLnRyaW0oKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJfQotCX0KLX0KLQotdm9pZCBjcmVhdGVDbGFzc2VzUGFuZWwoQ29tcG9zaXRlIHBhbmVsKSB7Ci0JTGFiZWwgY2xhc3Nlc0xiID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JY2xhc3Nlc0xiLnNldFRleHQoIiZDbGFzc2VzOiIpOwotCi0JR3JpZERhdGEgZGF0YTsKLQljbGFzc2VzTHQgPSBuZXcgVGFibGUocGFuZWwsIFNXVC5DSEVDSyB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBjbGFzc2VzTHQuZ2V0SXRlbUhlaWdodCgpICogNjsKLQljbGFzc2VzTHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQljbGFzc2VzTHQuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQljbGFzc2VzTHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JCQkJdXBkYXRlR2VuZXJhdGUoKFRhYmxlSXRlbSllLml0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl1cGRhdGVNZW1iZXJzKCk7Ci0JCQkJdXBkYXRlUGFyYW1ldGVycygpOwotCQkJfQotCQl9Ci0JfSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihjbGFzc2VzTHQsIFNXVC5OT05FLCBDTEFTU19OQU1FX0NPTFVNTik7Ci0JY29sdW1uLnNldFRleHQoIkNsYXNzIik7Ci0JY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGNsYXNzZXNMdCwgU1dULk5PTkUsIENMQVNTX0ZMQUdTX0NPTFVNTik7Ci0JY29sdW1uLnNldFRleHQoIkZsYWdzIik7Ci0JLyoKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oY2xhc3Nlc0x0LCBTV1QuTk9ORSwgQ0xBU1NfRVhDTFVERV9DT0xVTU4pOwotCWNvbHVtbi5zZXRUZXh0KCJFeGNsdWRlIik7Ci0JKi8KLQkKLQljbGFzc1RleHRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IoY2xhc3Nlc0x0KTsKLQljbGFzc1RleHRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCWNsYXNzRWRpdG9yVHggPSBuZXcgVGV4dChjbGFzc2VzTHQsIFNXVC5TSU5HTEUpOwotCWNsYXNzVGV4dEVkaXRvci5zZXRFZGl0b3IoY2xhc3NFZGl0b3JUeCk7Ci0JTGlzdGVuZXIgY2xhc3NUZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQljbGFzc1RleHRFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWNsYXNzRWRpdG9yVHguc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGNsYXNzVGV4dEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gY2xhc3NUZXh0RWRpdG9yLmdldENvbHVtbigpOwotCQkJSk5JQ2xhc3MgY2xhenogPSAoSk5JQ2xhc3MpaXRlbS5nZXREYXRhKCk7Ci0JCQlpZiAoY29sdW1uID09IENMQVNTX0VYQ0xVREVfQ09MVU1OKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBjbGFzc0VkaXRvclR4LmdldFRleHQoKTsKLQkJCQljbGF6ei5zZXRFeGNsdWRlKHRleHQpOwotCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIGNsYXp6LmdldEV4Y2x1ZGUoKSk7Ci0JCQkJY2xhc3Nlc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0KLQkJfQotCX07Ci0JY2xhc3NFZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgY2xhc3NUZXh0TGlzdGVuZXIpOwotCWNsYXNzRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBjbGFzc1RleHRMaXN0ZW5lcik7Ci0JY2xhc3NFZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIGNsYXNzVGV4dExpc3RlbmVyKTsKLQkKLQlmaW5hbCBTaGVsbCBmbG9hdGVyID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuTk9fVFJJTSk7Ci0JZmxvYXRlci5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JY2xhc3NMaXN0RWRpdG9yID0gbmV3IEZsYWdzRWRpdG9yKGNsYXNzZXNMdCk7Ci0JY2xhc3NFZGl0b3JMdCA9IG5ldyBMaXN0KGZsb2F0ZXIsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCWNsYXNzRWRpdG9yTHQuc2V0SXRlbXMoSk5JQ2xhc3MuRkxBR1MpOwotCWZsb2F0ZXIucGFjaygpOwotCWZsb2F0ZXIuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWNsYXNzTGlzdEVkaXRvci5zZXRJdGVtKG51bGwpOwotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQlmbG9hdGVyLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfSk7Ci0JTGlzdGVuZXIgY2xhc3Nlc0xpc3RMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWZsb2F0ZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGNsYXNzTGlzdEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gY2xhc3NMaXN0RWRpdG9yLmdldENvbHVtbigpOwotCQkJSk5JQ2xhc3MgY2xhenogPSAoSk5JQ2xhc3MpaXRlbS5nZXREYXRhKCk7Ci0JCQlpZiAoY29sdW1uID09IENMQVNTX0ZMQUdTX0NPTFVNTikgewotCQkJCVN0cmluZ1tdIGZsYWdzID0gY2xhc3NFZGl0b3JMdC5nZXRTZWxlY3Rpb24oKTsKLQkJCQljbGF6ei5zZXRGbGFncyhmbGFncyk7Ci0JCQkJaXRlbS5zZXRUZXh0KGNvbHVtbiwgZ2V0RmxhZ3NTdHJpbmcoY2xhenouZ2V0RmxhZ3MoKSkpOwotCQkJCWl0ZW0uc2V0Q2hlY2tlZChjbGF6ei5nZXRHZW5lcmF0ZSgpKTsKLQkJCQljbGFzc2VzTHQuZ2V0Q29sdW1uKGNvbHVtbikucGFjaygpOwotCQkJfQotCQl9Ci0JfTsKLQljbGFzc0VkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBjbGFzc2VzTGlzdExpc3RlbmVyKTsKLQljbGFzc0VkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgY2xhc3Nlc0xpc3RMaXN0ZW5lcik7Ci0JY2xhc3NFZGl0b3JMdC5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIGNsYXNzZXNMaXN0TGlzdGVuZXIpOwotCi0JY2xhc3Nlc0x0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoZmluYWwgRXZlbnQgZSkgewotCQkJZS5kaXNwbGF5LmFzeW5jRXhlYyAobmV3IFJ1bm5hYmxlICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJCQlpZiAoY2xhc3Nlc0x0LmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQkJaWYgKGUuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQoZS54LCBlLnkpOwotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGNsYXNzZXNMdC5nZXRJdGVtKHB0KTsKLQkJCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlpbnQgY29sdW1uID0gLTE7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlc0x0LmdldENvbHVtbkNvdW50KCk7IGkrKykgewotCQkJCQkJaWYgKGl0ZW0uZ2V0Qm91bmRzKGkpLmNvbnRhaW5zKHB0KSkgewotCQkJCQkJCWNvbHVtbiA9IGk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9CQkJCQotCQkJCQl9Ci0JCQkJCWlmIChjb2x1bW4gPT0gLTEpIHJldHVybjsKLQkJCQkJSk5JQ2xhc3MgZGF0YSA9IChKTklDbGFzcylpdGVtLmdldERhdGEoKTsKLQkJCQkJaWYgKGNvbHVtbiA9PSBDTEFTU19FWENMVURFX0NPTFVNTikgewotCQkJCQkJY2xhc3NUZXh0RWRpdG9yLnNldENvbHVtbihjb2x1bW4pOwotCQkJCQkJY2xhc3NUZXh0RWRpdG9yLnNldEl0ZW0oaXRlbSk7Ci0JCQkJCQljbGFzc0VkaXRvclR4LnNldFRleHQoZGF0YS5nZXRFeGNsdWRlKCkpOwotCQkJCQkJY2xhc3NFZGl0b3JUeC5zZWxlY3RBbGwoKTsKLQkJCQkJCWNsYXNzRWRpdG9yVHguc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCWNsYXNzRWRpdG9yVHguc2V0Rm9jdXMoKTsKLQkJCQkJfSBlbHNlIGlmIChjb2x1bW4gPT0gQ0xBU1NfRkxBR1NfQ09MVU1OKSB7Ci0JCQkJCQljbGFzc0xpc3RFZGl0b3Iuc2V0Q29sdW1uKGNvbHVtbik7Ci0JCQkJCQljbGFzc0xpc3RFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQkJCWNsYXNzRWRpdG9yTHQuc2V0U2VsZWN0aW9uKGRhdGEuZ2V0RmxhZ3MoKSk7Ci0JCQkJCQlmbG9hdGVyLnNldExvY2F0aW9uKGNsYXNzZXNMdC50b0Rpc3BsYXkoZS54LCBlLnkpKTsKLQkJCQkJCWZsb2F0ZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCWNsYXNzRWRpdG9yTHQuc2V0Rm9jdXMoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfSk7Ci19Ci0KLXZvaWQgY3JlYXRlTWVtYmVyc1BhbmVsKENvbXBvc2l0ZSBwYW5lbCkgewotCUdyaWREYXRhIGRhdGE7Ci0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhbmVsLCBTV1QuTk9ORSk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsJCi0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQlMYWJlbCBtZW1iZXJzTGIgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCW1lbWJlcnNMYi5zZXRUZXh0KCJNZW0mYmVycyBbcmVnZXhdOiIpOwotCWZpbmFsIFRleHQgc2VhcmNoVGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuU0VBUkNIKTsKLQlzZWFyY2hUZXh0LnNldFRleHQoIi4qIik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCXNlYXJjaFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlzZWFyY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gbWF0Y2ggKGludCBpbmRleCwgU3RyaW5nIHBhdHRlcm4pIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbWVtYmVyc0x0LmdldEl0ZW0oaW5kZXgpOwotCQkJU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQoKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRleHQubWF0Y2hlcyhwYXR0ZXJuKSkgewotCQkJCQltZW1iZXJzTHQuc2V0U2VsZWN0aW9uKGluZGV4KTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7fQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCVN0cmluZyBwYXR0ZXJuID0gc2VhcmNoVGV4dC5nZXRUZXh0KCk7Ci0JCQlpbnQgc2VsZWN0aW9uID0gbWVtYmVyc0x0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlpbnQgY291bnQgPSBtZW1iZXJzTHQuZ2V0SXRlbUNvdW50KCk7Ci0JCQlzZWxlY3Rpb24rKzsKLQkJCWZvciAoaW50IGkgPSBzZWxlY3Rpb247IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJaWYgKG1hdGNoIChpLCBwYXR0ZXJuKSkgcmV0dXJuOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb247IGkrKykgewotCQkJCWlmIChtYXRjaCAoaSwgcGF0dGVybikpIHJldHVybjsKLQkJCX0KLQkJfQotCX0pOwotCi0JbWVtYmVyc0x0ID0gbmV3IFRhYmxlKHBhbmVsLCBTV1QuQ0hFQ0sgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gbWVtYmVyc0x0LmdldEl0ZW1IZWlnaHQoKSAqIDY7Ci0JbWVtYmVyc0x0LnNldExheW91dERhdGEoZGF0YSk7Ci0JbWVtYmVyc0x0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUuZGV0YWlsID09IFNXVC5DSEVDSykgewotCQkJCXVwZGF0ZUdlbmVyYXRlKChUYWJsZUl0ZW0pZS5pdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXBkYXRlUGFyYW1ldGVycygpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JbWVtYmVyVGV4dEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvcihtZW1iZXJzTHQpOwotCW1lbWJlclRleHRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCW1lbWJlckVkaXRvclR4ID0gbmV3IFRleHQobWVtYmVyc0x0LCBTV1QuU0lOR0xFKTsKLQltZW1iZXJUZXh0RWRpdG9yLnNldEVkaXRvcihtZW1iZXJFZGl0b3JUeCk7Ci0JTGlzdGVuZXIgbWVtYmVyVGV4dExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS50eXBlID09IFNXVC5UcmF2ZXJzZSkgewotCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQkJCQkJbWVtYmVyVGV4dEVkaXRvci5zZXRJdGVtKG51bGwpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJbWVtYmVyRWRpdG9yVHguc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG1lbWJlclRleHRFZGl0b3IuZ2V0SXRlbSgpOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJaW50IGNvbHVtbiA9IG1lbWJlclRleHRFZGl0b3IuZ2V0Q29sdW1uKCk7Ci0JCQlKTklJdGVtIG1lbWJlckRhdGEgPSAoSk5JSXRlbSlpdGVtLmdldERhdGEoKTsKLQkJCVN0cmluZyB0ZXh0ID0gbWVtYmVyRWRpdG9yVHguZ2V0VGV4dCgpOwotCQkJaWYgKG1lbWJlckRhdGEgaW5zdGFuY2VvZiBKTklGaWVsZCkgewotCQkJCUpOSUZpZWxkIGZpZWxkID0gKEpOSUZpZWxkKW1lbWJlckRhdGE7Ci0JCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJY2FzZSBGSUVMRF9DQVNUX0NPTFVNTjogewotCQkJCQkJZmllbGQuc2V0Q2FzdCh0ZXh0KTsKLQkJCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIGZpZWxkLmdldENhc3QoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIEZJRUxEX0FDQ0VTU09SX0NPTFVNTjogewotCQkJCQkJZmllbGQuc2V0QWNjZXNzb3IodGV4dC5lcXVhbHMoZmllbGQuZ2V0TmFtZSgpKSA/ICIiIDogdGV4dCk7Ci0JCQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBmaWVsZC5nZXRBY2Nlc3NvcigpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgRklFTERfRVhDTFVERV9DT0xVTU46IHsKLQkJCQkJCWZpZWxkLnNldEV4Y2x1ZGUodGV4dCk7Ci0JCQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBmaWVsZC5nZXRFeGNsdWRlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbWVtYmVyc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0gZWxzZSBpZiAobWVtYmVyRGF0YSBpbnN0YW5jZW9mIEpOSU1ldGhvZCkgewotCQkJCUpOSU1ldGhvZCBtZXRob2QgPSAoSk5JTWV0aG9kKW1lbWJlckRhdGE7Ci0JCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJY2FzZSBNRVRIT0RfQUNDRVNTT1JfQ09MVU1OOiB7Ci0JCQkJCQltZXRob2Quc2V0QWNjZXNzb3IodGV4dC5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkgPyAiIiA6IHRleHQpOwotCQkJCQkJaXRlbS5zZXRUZXh0KGNvbHVtbiwgbWV0aG9kLmdldEFjY2Vzc29yKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBNRVRIT0RfRVhDTFVERV9DT0xVTU46IHsKLQkJCQkJCW1ldGhvZC5zZXRFeGNsdWRlKHRleHQpOwotCQkJCQkJaXRlbS5zZXRUZXh0KGNvbHVtbiwgbWV0aG9kLmdldEV4Y2x1ZGUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQltZW1iZXJzTHQuZ2V0Q29sdW1uKGNvbHVtbikucGFjaygpOwotCQkJfQotCQl9Ci0JfTsKLQltZW1iZXJFZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbWVtYmVyVGV4dExpc3RlbmVyKTsKLQltZW1iZXJFZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIG1lbWJlclRleHRMaXN0ZW5lcik7Ci0JbWVtYmVyRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBtZW1iZXJUZXh0TGlzdGVuZXIpOwotCQotCWZpbmFsIFNoZWxsIGZsb2F0ZXIgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5OT19UUklNKTsKLQlmbG9hdGVyLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQltZW1iZXJMaXN0RWRpdG9yID0gbmV3IEZsYWdzRWRpdG9yKG1lbWJlcnNMdCk7Ci0JbWVtYmVyRWRpdG9yTHQgPSBuZXcgTGlzdChmbG9hdGVyLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQlmbG9hdGVyLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQltZW1iZXJMaXN0RWRpdG9yLnNldEl0ZW0obnVsbCk7Ci0JCQllLmRvaXQgPSBmYWxzZTsKLQkJCWZsb2F0ZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQl9KTsKLQlMaXN0ZW5lciBtZW1iZXJMaXN0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlmbG9hdGVyLnNldFZpc2libGUoZmFsc2UpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBtZW1iZXJMaXN0RWRpdG9yLmdldEl0ZW0oKTsKLQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCWludCBjb2x1bW4gPSBtZW1iZXJMaXN0RWRpdG9yLmdldENvbHVtbigpOwotCQkJSk5JSXRlbSBkYXRhID0gKEpOSUl0ZW0paXRlbS5nZXREYXRhKCk7Ci0JCQlTdHJpbmdbXSBmbGFncyA9IG1lbWJlckVkaXRvckx0LmdldFNlbGVjdGlvbigpOwotCQkJZGF0YS5zZXRGbGFncyhmbGFncyk7Ci0JCQlpdGVtLnNldFRleHQoY29sdW1uLCBnZXRGbGFnc1N0cmluZyhkYXRhLmdldEZsYWdzKCkpKTsKLQkJCWl0ZW0uc2V0Q2hlY2tlZChkYXRhLmdldEdlbmVyYXRlKCkpOwotCQkJbWVtYmVyc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJfQotCX07Ci0JbWVtYmVyRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG1lbWJlckxpc3RMaXN0ZW5lcik7Ci0JbWVtYmVyRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBtZW1iZXJMaXN0TGlzdGVuZXIpOwotCW1lbWJlckVkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgbWVtYmVyTGlzdExpc3RlbmVyKTsKLQkKLQltZW1iZXJzTHQuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChmaW5hbCBFdmVudCBlKSB7Ci0JCQllLmRpc3BsYXkuYXN5bmNFeGVjIChuZXcgUnVubmFibGUgKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQkJCWlmIChtZW1iZXJzTHQuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCQlpZiAoZS5idXR0b24gIT0gMSkgcmV0dXJuOwotCQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludChlLngsIGUueSk7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gbWVtYmVyc0x0LmdldEl0ZW0ocHQpOwotCQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJCWludCBjb2x1bW4gPSAtMTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzTHQuZ2V0Q29sdW1uQ291bnQoKTsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbS5nZXRCb3VuZHMoaSkuY29udGFpbnMocHQpKSB7Ci0JCQkJCQkJY29sdW1uID0gaTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0JCQkJCi0JCQkJCX0KLQkJCQkJaWYgKGNvbHVtbiA9PSAtMSkgcmV0dXJuOwotCQkJCQlPYmplY3QgaXRlbURhdGEgPSBpdGVtLmdldERhdGEoKTsKLQkJCQkJaWYgKGl0ZW1EYXRhIGluc3RhbmNlb2YgSk5JRmllbGQpIHsKLQkJCQkJCUpOSUZpZWxkIGZpZWxkID0gKEpOSUZpZWxkKWl0ZW1EYXRhOwotCQkJCQkJaWYgKGNvbHVtbiA9PSBGSUVMRF9DQVNUX0NPTFVNTiB8fCBjb2x1bW4gPT0gRklFTERfQUNDRVNTT1JfQ09MVU1OIHx8IGNvbHVtbiA9PSBGSUVMRF9FWENMVURFX0NPTFVNTikgewotCQkJCQkJCW1lbWJlclRleHRFZGl0b3Iuc2V0Q29sdW1uKGNvbHVtbik7Ci0JCQkJCQkJbWVtYmVyVGV4dEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQkJCVN0cmluZyB0ZXh0ID0gIiI7Ci0JCQkJCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJCQkJY2FzZSBGSUVMRF9DQVNUX0NPTFVNTjogdGV4dCA9IGZpZWxkLmdldENhc3QoKTsgYnJlYWs7Ci0JCQkJCQkJCWNhc2UgRklFTERfQUNDRVNTT1JfQ09MVU1OOiB7Ci0JCQkJCQkJCQl0ZXh0ID0gZmllbGQuZ2V0QWNjZXNzb3IoKTsgCi0JCQkJCQkJCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJCQkJdGV4dCA9IGZpZWxkLmdldE5hbWUoKTsKLQkJCQkJCQkJCQlpbnQgaW5kZXggPSB0ZXh0Lmxhc3RJbmRleE9mKCdfJyk7Ci0JCQkJCQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJCQkJCWNoYXJbXSBjaGFycyA9IHRleHQudG9DaGFyQXJyYXkoKTsKLQkJCQkJCQkJCQkJY2hhcnNbaW5kZXhdID0gJy4nOwotCQkJCQkJCQkJCQl0ZXh0ID0gbmV3IFN0cmluZyhjaGFycyk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2FzZSBGSUVMRF9FWENMVURFX0NPTFVNTjogdGV4dCA9IGZpZWxkLmdldEV4Y2x1ZGUoKTsgYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCW1lbWJlckVkaXRvclR4LnNldFRleHQodGV4dCk7Ci0JCQkJCQkJbWVtYmVyRWRpdG9yVHguc2VsZWN0QWxsKCk7Ci0JCQkJCQkJbWVtYmVyRWRpdG9yVHguc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRGb2N1cygpOwotCQkJCQkJfSBlbHNlIGlmIChjb2x1bW4gPT0gRklFTERfRkxBR1NfQ09MVU1OKSB7Ci0JCQkJCQkJbWVtYmVyTGlzdEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQkJCQltZW1iZXJMaXN0RWRpdG9yLnNldEl0ZW0oaXRlbSk7Ci0JCQkJCQkJbWVtYmVyRWRpdG9yTHQuc2V0SXRlbXMoSk5JRmllbGQuRkxBR1MpOwotCQkJCQkJCW1lbWJlckVkaXRvckx0LnNldFNlbGVjdGlvbihmaWVsZC5nZXRGbGFncygpKTsKLQkJCQkJCQlmbG9hdGVyLnNldExvY2F0aW9uKG1lbWJlcnNMdC50b0Rpc3BsYXkoZS54LCBlLnkpKTsKLQkJCQkJCQlmbG9hdGVyLnBhY2soKTsKLQkJCQkJCQlmbG9hdGVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQkJbWVtYmVyRWRpdG9yTHQuc2V0Rm9jdXMoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChpdGVtRGF0YSBpbnN0YW5jZW9mIEpOSU1ldGhvZCkgewotCQkJCQkJSk5JTWV0aG9kIG1ldGhvZCA9IChKTklNZXRob2QpaXRlbURhdGE7Ci0JCQkJCQlpZiAoY29sdW1uID09IE1FVEhPRF9FWENMVURFX0NPTFVNTiB8fCBjb2x1bW4gPT0gTUVUSE9EX0FDQ0VTU09SX0NPTFVNTikgewotCQkJCQkJCW1lbWJlclRleHRFZGl0b3Iuc2V0Q29sdW1uKGNvbHVtbik7Ci0JCQkJCQkJbWVtYmVyVGV4dEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQkJCVN0cmluZyB0ZXh0ID0gIiI7Ci0JCQkJCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJCQkJY2FzZSBNRVRIT0RfQUNDRVNTT1JfQ09MVU1OOiB7Ci0JCQkJCQkJCQl0ZXh0ID0gbWV0aG9kLmdldEFjY2Vzc29yKCk7Ci0JCQkJCQkJCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB0ZXh0ID0gbWV0aG9kLmdldE5hbWUoKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhc2UgTUVUSE9EX0VYQ0xVREVfQ09MVU1OOiB0ZXh0ID0gbWV0aG9kLmdldEV4Y2x1ZGUoKTsgYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCW1lbWJlckVkaXRvclR4LnNldFRleHQodGV4dCk7Ci0JCQkJCQkJbWVtYmVyRWRpdG9yVHguc2VsZWN0QWxsKCk7Ci0JCQkJCQkJbWVtYmVyRWRpdG9yVHguc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRGb2N1cygpOwotCQkJCQkJfSBlbHNlIGlmIChjb2x1bW4gPT0gTUVUSE9EX0ZMQUdTX0NPTFVNTikgewotCQkJCQkJCW1lbWJlckxpc3RFZGl0b3Iuc2V0Q29sdW1uKGNvbHVtbik7Ci0JCQkJCQkJbWVtYmVyTGlzdEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQkJCW1lbWJlckVkaXRvckx0LnNldEl0ZW1zKEpOSU1ldGhvZC5GTEFHUyk7Ci0JCQkJCQkJbWVtYmVyRWRpdG9yTHQuc2V0U2VsZWN0aW9uKG1ldGhvZC5nZXRGbGFncygpKTsKLQkJCQkJCQlmbG9hdGVyLnNldExvY2F0aW9uKG1lbWJlcnNMdC50b0Rpc3BsYXkoZS54LCBlLnkpKTsKLQkJCQkJCQlmbG9hdGVyLnBhY2soKTsKLQkJCQkJCQlmbG9hdGVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQkJbWVtYmVyRWRpdG9yTHQuc2V0Rm9jdXMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfSk7Ci19Ci0KLXZvaWQgY3JlYXRlUGFyYW1ldGVyc1BhbmVsKENvbXBvc2l0ZSBwYW5lbCkgewotCUxhYmVsIHBhcmFtc0xiID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JcGFyYW1zTGIuc2V0VGV4dCgiJlBhcmFtZXRlcnM6Iik7Ci0JCi0JR3JpZERhdGEgZGF0YTsKLQlwYXJhbXNMdCA9IG5ldyBUYWJsZShwYW5lbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWludCBpdGVtSGVpZ2h0ID0gcGFyYW1zTHQuZ2V0SXRlbUhlaWdodCgpOwotCWRhdGEuaGVpZ2h0SGludCA9IGl0ZW1IZWlnaHQgKiA2OwotCXBhcmFtc0x0LnNldExheW91dERhdGEoZGF0YSk7Ci0JcGFyYW1zTHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0JCQkJdXBkYXRlR2VuZXJhdGUoKFRhYmxlSXRlbSllLml0ZW0pOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlUYWJsZUNvbHVtbiBjb2x1bW47Ci0JY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHBhcmFtc0x0LCBTV1QuTk9ORSwgUEFSQU1fSU5ERVhfQ09MVU1OKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4ocGFyYW1zTHQsIFNXVC5OT05FLCBQQVJBTV9UWVBFX0NPTFVNTik7Ci0JY29sdW1uLnNldFRleHQoIlR5cGUiKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4ocGFyYW1zTHQsIFNXVC5OT05FLCBQQVJBTV9GTEFHU19DT0xVTU4pOwotCWNvbHVtbi5zZXRUZXh0KCJGbGFncyIpOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihwYXJhbXNMdCwgU1dULk5PTkUsIFBBUkFNX0NBU1RfQ09MVU1OKTsKLQljb2x1bW4uc2V0VGV4dCgiQ2FzdCIpOwotCQotCXBhcmFtVGV4dEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvcihwYXJhbXNMdCk7Ci0JcGFyYW1UZXh0RWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQlwYXJhbUVkaXRvclR4ID0gbmV3IFRleHQocGFyYW1zTHQsIFNXVC5TSU5HTEUpOwotCXBhcmFtVGV4dEVkaXRvci5zZXRFZGl0b3IocGFyYW1FZGl0b3JUeCk7Ci0JTGlzdGVuZXIgcGFyYW1UZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQlwYXJhbVRleHRFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXBhcmFtRWRpdG9yVHguc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IHBhcmFtVGV4dEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gcGFyYW1UZXh0RWRpdG9yLmdldENvbHVtbigpOwotCQkJSk5JUGFyYW1ldGVyIHBhcmFtID0gKEpOSVBhcmFtZXRlcilpdGVtLmdldERhdGEoKTsKLQkJCWlmIChjb2x1bW4gPT0gUEFSQU1fQ0FTVF9DT0xVTU4pIHsKLQkJCQlTdHJpbmcgdGV4dCA9IHBhcmFtRWRpdG9yVHguZ2V0VGV4dCgpOwotCQkJCXBhcmFtLnNldENhc3QodGV4dCk7Ci0JCQkJaXRlbS5zZXRUZXh0KGNvbHVtbiwgcGFyYW0uZ2V0Q2FzdCgpKTsKLQkJCQlwYXJhbXNMdC5nZXRDb2x1bW4oY29sdW1uKS5wYWNrKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCXBhcmFtRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIHBhcmFtVGV4dExpc3RlbmVyKTsKLQlwYXJhbUVkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgcGFyYW1UZXh0TGlzdGVuZXIpOwotCXBhcmFtRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBwYXJhbVRleHRMaXN0ZW5lcik7Ci0JCi0JZmluYWwgU2hlbGwgZmxvYXRlciA9IG5ldyBTaGVsbChzaGVsbCwgU1dULk5PX1RSSU0pOwotCWZsb2F0ZXIuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCXBhcmFtTGlzdEVkaXRvciA9IG5ldyBGbGFnc0VkaXRvcihwYXJhbXNMdCk7Ci0JcGFyYW1FZGl0b3JMdCA9IG5ldyBMaXN0KGZsb2F0ZXIsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCXBhcmFtRWRpdG9yTHQuc2V0SXRlbXMoSk5JUGFyYW1ldGVyLkZMQUdTKTsKLQlmbG9hdGVyLnBhY2soKTsKLQlmbG9hdGVyLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlwYXJhbUxpc3RFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJZmxvYXRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0pOwotCUxpc3RlbmVyIHBhcmFtTGlzdExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS50eXBlID09IFNXVC5UcmF2ZXJzZSkgewotCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZmxvYXRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gcGFyYW1MaXN0RWRpdG9yLmdldEl0ZW0oKTsKLQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCWludCBjb2x1bW4gPSBwYXJhbUxpc3RFZGl0b3IuZ2V0Q29sdW1uKCk7Ci0JCQlKTklQYXJhbWV0ZXIgcGFyYW0gPSAoSk5JUGFyYW1ldGVyKWl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGNvbHVtbiA9PSBQQVJBTV9GTEFHU19DT0xVTU4pIHsKLQkJCQlTdHJpbmdbXSBmbGFncyA9IHBhcmFtRWRpdG9yTHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJcGFyYW0uc2V0RmxhZ3MoZmxhZ3MpOwotCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIGdldEZsYWdzU3RyaW5nKHBhcmFtLmdldEZsYWdzKCkpKTsKLQkJCQlwYXJhbXNMdC5nZXRDb2x1bW4oY29sdW1uKS5wYWNrKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCXBhcmFtRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIHBhcmFtTGlzdExpc3RlbmVyKTsKLQlwYXJhbUVkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgcGFyYW1MaXN0TGlzdGVuZXIpOwotCXBhcmFtRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBwYXJhbUxpc3RMaXN0ZW5lcik7Ci0KLQlwYXJhbXNMdC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIEV2ZW50IGUpIHsKLQkJCWUuZGlzcGxheS5hc3luY0V4ZWMgKG5ldyBSdW5uYWJsZSAoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCQkJaWYgKHBhcmFtc0x0LmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQkJaWYgKGUuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQoZS54LCBlLnkpOwotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHBhcmFtc0x0LmdldEl0ZW0ocHQpOwotCQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJCWludCBjb2x1bW4gPSAtMTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXNMdC5nZXRDb2x1bW5Db3VudCgpOyBpKyspIHsKLQkJCQkJCWlmIChpdGVtLmdldEJvdW5kcyhpKS5jb250YWlucyhwdCkpIHsKLQkJCQkJCQljb2x1bW4gPSBpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQkJCQkKLQkJCQkJfQotCQkJCQlpZiAoY29sdW1uID09IC0xKSByZXR1cm47Ci0JCQkJCUpOSVBhcmFtZXRlciBwYXJhbSA9IChKTklQYXJhbWV0ZXIpaXRlbS5nZXREYXRhKCk7Ci0JCQkJCWlmIChjb2x1bW4gPT0gUEFSQU1fQ0FTVF9DT0xVTU4pIHsKLQkJCQkJCXBhcmFtVGV4dEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQkJCXBhcmFtVGV4dEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQkJcGFyYW1FZGl0b3JUeC5zZXRUZXh0KHBhcmFtLmdldENhc3QoKSk7Ci0JCQkJCQlwYXJhbUVkaXRvclR4LnNlbGVjdEFsbCgpOwotCQkJCQkJcGFyYW1FZGl0b3JUeC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQkJcGFyYW1FZGl0b3JUeC5zZXRGb2N1cygpOwotCQkJCQl9IGVsc2UgaWYgKGNvbHVtbiA9PSBQQVJBTV9GTEFHU19DT0xVTU4pIHsKLQkJCQkJCXBhcmFtTGlzdEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQkJCXBhcmFtTGlzdEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQkJcGFyYW1FZGl0b3JMdC5zZXRTZWxlY3Rpb24ocGFyYW0uZ2V0RmxhZ3MoKSk7Ci0JCQkJCQlmbG9hdGVyLnNldExvY2F0aW9uKHBhcmFtc0x0LnRvRGlzcGxheShlLngsIGUueSkpOwotCQkJCQkJZmxvYXRlci5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQkJcGFyYW1FZGl0b3JMdC5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9KTsKLX0KLQotQnV0dG9uIGNyZWF0ZUFjdGlvbkJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQlCdXR0b24gYWN0aW9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQlhY3Rpb24uc2V0VGV4dCh0ZXh0KTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JYWN0aW9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JYWN0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQlyZXR1cm4gYWN0aW9uOwotfQotCi12b2lkIGNyZWF0ZUFjdGlvbkJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkgewkJCi0JYWN0aW9uc1BhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JYWN0aW9uc1BhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCUdyaWRMYXlvdXQgYWN0aW9uc0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JYWN0aW9uc0xheW91dC5udW1Db2x1bW5zID0gMTsKLQlhY3Rpb25zUGFuZWwuc2V0TGF5b3V0KGFjdGlvbnNMYXlvdXQpOwotCQotCWNyZWF0ZUFjdGlvbkJ1dHRvbihhY3Rpb25zUGFuZWwsICJHZW5lcmF0ZSAmQWxsIiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlnZW5lcmF0ZUFsbCgpOwotCQl9Ci0JfSk7Ci0JCi0JTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGFjdGlvbnNQYW5lbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0Jc2VwYXJhdG9yLnNldExheW91dERhdGEoZGF0YSk7Ci0Jc2VwYXJhdG9yID0gbmV3IExhYmVsKGFjdGlvbnNQYW5lbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0Jc2VwYXJhdG9yLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JY3JlYXRlQWN0aW9uQnV0dG9uKGFjdGlvbnNQYW5lbCwgIkdlbmVyYXRlIFN0cnVjdHMgJkhlYWRlciIsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZ2VuZXJhdGVTdHJ1Y3RzSGVhZGVyKCk7Ci0JCX0KLQl9KTsKLQljcmVhdGVBY3Rpb25CdXR0b24oYWN0aW9uc1BhbmVsLCAiR2VuZXJhdGUgJlN0cnVjdHMiLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWdlbmVyYXRlU3RydWN0cygpOwotCQl9Ci0JfSk7Ci0JY3JlYXRlQWN0aW9uQnV0dG9uKGFjdGlvbnNQYW5lbCwgIkdlbmVyYXRlICZOYXRpdmVzIiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlnZW5lcmF0ZU5hdGl2ZXMoKTsKLQkJfQotCX0pOwotCWNyZWF0ZUFjdGlvbkJ1dHRvbihhY3Rpb25zUGFuZWwsICJHZW5lcmF0ZSBNZXRhICZEYXRhIiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlnZW5lcmF0ZU1ldGFEYXRhKCk7Ci0JCX0KLQl9KTsKLQljcmVhdGVBY3Rpb25CdXR0b24oYWN0aW9uc1BhbmVsLCAiR2VuZXJhdGUgQ29ucyZ0YW50cyIsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZ2VuZXJhdGVDb25zdGFudHMoKTsKLQkJfQotCX0pOwkKLQljcmVhdGVBY3Rpb25CdXR0b24oYWN0aW9uc1BhbmVsLCAiR2VuZXJhdGUgU2kmemVvZiIsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZ2VuZXJhdGVTaXplb2YoKTsKLQkJfQotCX0pOwotCi0JQ29tcG9zaXRlIGZpbGxlciA9IG5ldyBDb21wb3NpdGUoYWN0aW9uc1BhbmVsLCBTV1QuTk9ORSk7Ci0JZmlsbGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQotCXByb2dyZXNzTGFiZWwgPSBuZXcgTGFiZWwoYWN0aW9uc1BhbmVsLCBTV1QuTk9ORSk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCXByb2dyZXNzTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlwcm9ncmVzc0xhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQotCXByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKGFjdGlvbnNQYW5lbCwgU1dULk5PTkUpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlwcm9ncmVzc0Jhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCXByb2dyZXNzQmFyLnNldFZpc2libGUoZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCBydW4oKSB7Ci0Jc2hlbGwub3BlbigpOwotCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5ZRVMgfCBTV1QuTk8pOwotCWJveC5zZXRUZXh0KCJXYXJuaW5nIik7Ci0JYm94LnNldE1lc3NhZ2UoIlRoaXMgdG9vbCBpcyBvYnNvbGV0ZSBhcyBvZiBFY2xpcHNlIDMuNSBNMi5cblRoZSBtZXRhIGRhdGEgaGFzIGJlZW4gZW1iZWRkZWQgaW4gamF2YSBzb3VyY2UgZmlsZXMuXG5UaGVyZSBpcyBhIG5ldyBwbHVnaW4gdG9vbCB0aGF0IHJlcGxhY2VzIHRoaXMgdG9vbC5cblNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9qbmlnZW4ucGhwLlxuXG4gQ29udGludWU/Iik7Ci0JaW50IHJlc3VsdCA9IGJveC5vcGVuKCk7Ci0JaWYgKHJlc3VsdCA9PSBTV1QuTk8pIHsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0KLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWNsZWFudXAoKTsKLX0KLQotU3RyaW5nIGdldFBhY2thZ2VTdHJpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCWludCBkb3QgPSBhcHAuZ2V0TWFpbkNsYXNzTmFtZSgpLmxhc3RJbmRleE9mKCcuJyk7Ci0JaWYgKGRvdCA9PSAtMSkgcmV0dXJuICIiOwotCXJldHVybiBhcHAuZ2V0TWFpbkNsYXNzTmFtZSgpLnN1YnN0cmluZygwLCBkb3QpOwotfQotCi1TdHJpbmcgZ2V0Q2xhc3NTdHJpbmcoSk5JVHlwZSB0eXBlKSB7Ci0JU3RyaW5nIG5hbWUgPSB0eXBlLmdldFR5cGVTaWduYXR1cmUzKGZhbHNlKTsKLQlpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JaWYgKGluZGV4ID09IC0xKSByZXR1cm4gbmFtZTsKLQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBuYW1lLmxlbmd0aCgpKTsKLX0KLQotU3RyaW5nIGdldEZsYWdzU3RyaW5nKFN0cmluZ1tdIGZsYWdzKSB7Ci0JaWYgKGZsYWdzLmxlbmd0aCA9PSAwKSByZXR1cm4gIiI7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGZsYWdzLmxlbmd0aDsgaisrKSB7Ci0JCVN0cmluZyBmbGFnID0gZmxhZ3Nbal07Ci0JCWlmIChidWZmZXIubGVuZ3RoKCkgIT0gMCkgYnVmZmVyLmFwcGVuZCgiLCAiKTsKLQkJYnVmZmVyLmFwcGVuZChmbGFnKTsKLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi1TdHJpbmcgZ2V0TWV0aG9kU3RyaW5nKEpOSU1ldGhvZCBtZXRob2QpIHsKLQlTdHJpbmcgcGtnTmFtZSA9IGdldFBhY2thZ2VTdHJpbmcobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKSk7Ci0JYnVmZmVyLmFwcGVuZCgiKCIpOwotCUpOSVBhcmFtZXRlcltdIHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJSk5JUGFyYW1ldGVyIHBhcmFtID0gcGFyYW1zW2ldOwotCQlpZiAoaSAhPSAwKSBidWZmZXIuYXBwZW5kKCIsIik7Ci0JCVN0cmluZyBzdHJpbmcgPSBwYXJhbS5nZXRUeXBlKCkuZ2V0VHlwZVNpZ25hdHVyZTMoZmFsc2UpOwotCQlpZiAoc3RyaW5nLnN0YXJ0c1dpdGgocGtnTmFtZSkpIHN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcocGtnTmFtZS5sZW5ndGgoKSArIDEpOwotCQlidWZmZXIuYXBwZW5kKHN0cmluZyk7Ci0JfQotCWJ1ZmZlci5hcHBlbmQoIikiKTsKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0KLVN0cmluZyBnZXRGaWVsZFN0cmluZyhKTklGaWVsZCBmaWVsZCkgewotCXJldHVybiBmaWVsZC5nZXROYW1lKCk7Ci19Ci0KLXZvaWQgdXBkYXRlQ2xhc3NlcygpIHsKLQljbGFzc2VzTHQucmVtb3ZlQWxsKCk7Ci0JSk5JQ2xhc3NbXSBjbGFzc2VzID0gYXBwLmdldENsYXNzZXMoKTsKLQlpbnQgbWFpbkluZGV4ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJSk5JQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQlpZiAoY2xhenouZXF1YWxzKGFwcC5nZXRNYWluQ2xhc3MoKSkpIG1haW5JbmRleCA9IGk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjbGFzc2VzTHQsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXREYXRhKGNsYXp6KTsKLQkJaXRlbS5zZXRUZXh0KENMQVNTX05BTUVfQ09MVU1OLCBjbGF6ei5nZXRTaW1wbGVOYW1lKCkpOwotCQlpdGVtLnNldFRleHQoQ0xBU1NfRkxBR1NfQ09MVU1OLCBnZXRGbGFnc1N0cmluZyhjbGF6ei5nZXRGbGFncygpKSk7Ci0JCWl0ZW0uc2V0Q2hlY2tlZChjbGF6ei5nZXRHZW5lcmF0ZSgpKTsKLQl9Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gY2xhc3Nlc0x0LmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gY29sdW1uc1tpXTsKLQkJY29sdW1uLnBhY2soKTsKLQl9Ci0JY2xhc3Nlc0x0LnNldFNlbGVjdGlvbihtYWluSW5kZXgpOwotfQotCi12b2lkIHVwZGF0ZU1lbWJlcnMoKSB7Ci0JbWVtYmVyc0x0LnJlbW92ZUFsbCgpOwotCW1lbWJlcnNMdC5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSBtZW1iZXJzTHQuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zW2ldOwotCQljb2x1bW4uZGlzcG9zZSgpOwotCX0KLQlpbnRbXSBpbmRpY2VzID0gY2xhc3Nlc0x0LmdldFNlbGVjdGlvbkluZGljZXMoKTsKLQlpZiAoaW5kaWNlcy5sZW5ndGggIT0gMSkgcmV0dXJuOwotCVRhYmxlSXRlbSBjbGFzc0l0ZW0gPSBjbGFzc2VzTHQuZ2V0SXRlbShpbmRpY2VzWzBdKTsKLQlKTklDbGFzcyBjbGF6eiA9IChKTklDbGFzcyljbGFzc0l0ZW0uZ2V0RGF0YSgpOwotCWJvb2xlYW4gaGFzTmF0aXZlcyA9IGZhbHNlOwotCUpOSU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJSk5JTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWludCBtb2RzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCQlpZiAoaGFzTmF0aXZlcyA9KChtb2RzICYgTW9kaWZpZXIuTkFUSVZFKSAhPSAwKSkgYnJlYWs7Ci0JfQotCW1lbWJlcnNMdC5zZXRSZWRyYXcoZmFsc2UpOwotCWlmIChoYXNOYXRpdmVzKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbjsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIE1FVEhPRF9OQU1FX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJNZXRob2QiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIE1FVEhPRF9GTEFHU19DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiRmxhZ3MiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIE1FVEhPRF9BQ0NFU1NPUl9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiQWNjZXNzb3IiKTsKLQkJLyoKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIE1FVEhPRF9FWENMVURFX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJFeGNsdWRlIik7Ci0JCSovCi0JCUpOSUdlbmVyYXRvci5zb3J0KG1ldGhvZHMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCUpOSU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKG1lbWJlcnNMdCwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXREYXRhKG1ldGhvZCk7Ci0JCQlpdGVtLnNldFRleHQoTUVUSE9EX05BTUVfQ09MVU1OLCBnZXRNZXRob2RTdHJpbmcobWV0aG9kKSk7Ci0JCQlpdGVtLnNldENoZWNrZWQobWV0aG9kLmdldEdlbmVyYXRlKCkpOwotCQkJaXRlbS5zZXRUZXh0KE1FVEhPRF9GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKG1ldGhvZC5nZXRGbGFncygpKSk7Ci0JCQlpdGVtLnNldFRleHQoTUVUSE9EX0FDQ0VTU09SX0NPTFVNTiwgbWV0aG9kLmdldEFjY2Vzc29yKCkpOwotCQkJLyoKLQkJCWl0ZW0uc2V0VGV4dChNRVRIT0RfRVhDTFVERV9DT0xVTU4sIG1ldGhvZERhdGEuZ2V0RXhjbHVkZSgpKTsKLQkJCSovCi0JCX0KLQl9IGVsc2UgewotCQlUYWJsZUNvbHVtbiBjb2x1bW47Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBGSUVMRF9OQU1FX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJGaWVsZCIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obWVtYmVyc0x0LCBTV1QuTk9ORSwgRklFTERfRkxBR1NfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoIkZsYWdzIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBGSUVMRF9DQVNUX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDYXN0Iik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBGSUVMRF9BQ0NFU1NPUl9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiQWNjZXNzb3IiKTsKLQkJLyoKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIEZJRUxEX0VYQ0xVREVfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoIkV4Y2x1ZGUiKTsKLQkJKi8KLQkJSk5JRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCUpOSUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQkJaW50IG1vZHMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsgCi0JCQlpZiAoKChtb2RzICYgTW9kaWZpZXIuUFVCTElDKSA9PSAwKSB8fAotCQkJCSgobW9kcyAmIE1vZGlmaWVyLkZJTkFMKSAhPSAwKSB8fAotCQkJCSgobW9kcyAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCkpIGNvbnRpbnVlOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKG1lbWJlcnNMdCwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXREYXRhKGZpZWxkKTsKLQkJCWl0ZW0uc2V0VGV4dChGSUVMRF9OQU1FX0NPTFVNTiwgZ2V0RmllbGRTdHJpbmcoZmllbGQpKTsKLQkJCWl0ZW0uc2V0Q2hlY2tlZChmaWVsZC5nZXRHZW5lcmF0ZSgpKTsKLQkJCWl0ZW0uc2V0VGV4dChGSUVMRF9DQVNUX0NPTFVNTiwgZmllbGQuZ2V0Q2FzdCgpKTsKLQkJCWl0ZW0uc2V0VGV4dChGSUVMRF9GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKGZpZWxkLmdldEZsYWdzKCkpKTsKLQkJCWl0ZW0uc2V0VGV4dChGSUVMRF9BQ0NFU1NPUl9DT0xVTU4sIGZpZWxkLmdldEFjY2Vzc29yKCkpOwotCQkJLyoKLQkJCWl0ZW0uc2V0VGV4dChGSUVMRF9FWENMVURFX0NPTFVNTiwgZmllbGREYXRhLmdldEV4Y2x1ZGUoKSk7Ci0JCQkqLwotCQl9Ci0JfQotCWNvbHVtbnMgPSBtZW1iZXJzTHQuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zW2ldOwotCQljb2x1bW4ucGFjaygpOwotCX0KLQltZW1iZXJzTHQuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQltZW1iZXJzTHQuc2V0UmVkcmF3KHRydWUpOwotfQotCi12b2lkIHVwZGF0ZVBhcmFtZXRlcnMoKSB7Ci0JcGFyYW1zTHQucmVtb3ZlQWxsKCk7Ci0JaW50W10gaW5kaWNlcyA9IG1lbWJlcnNMdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JaWYgKGluZGljZXMubGVuZ3RoICE9IDEpIHsKLQkJcGFyYW1zTHQuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCXJldHVybjsKLQl9Ci0JVGFibGVJdGVtIG1lbWJlckl0ZW0gPSBtZW1iZXJzTHQuZ2V0SXRlbShpbmRpY2VzWzBdKTsKLQlPYmplY3QgZGF0YSA9IG1lbWJlckl0ZW0uZ2V0RGF0YSgpOwotCWlmICghKGRhdGEgaW5zdGFuY2VvZiBKTklNZXRob2QpKSByZXR1cm47Ci0JcGFyYW1zTHQuc2V0UmVkcmF3KGZhbHNlKTsKLQlKTklNZXRob2QgbWV0aG9kID0gKEpOSU1ldGhvZClkYXRhOwotCUpOSVBhcmFtZXRlcltdIHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJSk5JUGFyYW1ldGVyIHBhcmFtID0gcGFyYW1zW2ldOwotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0ocGFyYW1zTHQsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXREYXRhKHBhcmFtKTsKLQkJaXRlbS5zZXRUZXh0KFBBUkFNX0lOREVYX0NPTFVNTiwgU3RyaW5nLnZhbHVlT2YoaSkpOwotCQlpdGVtLnNldFRleHQoUEFSQU1fVFlQRV9DT0xVTU4sIGdldENsYXNzU3RyaW5nKHBhcmFtLmdldFR5cGUoKSkpOwotCQlpdGVtLnNldFRleHQoUEFSQU1fQ0FTVF9DT0xVTU4sIHBhcmFtLmdldENhc3QoKSk7Ci0JCWl0ZW0uc2V0VGV4dChQQVJBTV9GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKHBhcmFtLmdldEZsYWdzKCkpKTsKLQl9Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gcGFyYW1zTHQuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zW2ldOwotCQljb2x1bW4ucGFjaygpOwotCX0KLQlwYXJhbXNMdC5zZXRSZWRyYXcodHJ1ZSk7Ci0JcGFyYW1zTHQuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLX0KLQotdm9pZCB1cGRhdGVHZW5lcmF0ZShUYWJsZUl0ZW0gaXRlbSkgewotCUpOSUl0ZW0gaXRlbURhdGEgPSAoSk5JSXRlbSlpdGVtLmdldERhdGEoKTsKLQlpdGVtRGF0YS5zZXRHZW5lcmF0ZShpdGVtLmdldENoZWNrZWQoKSk7Ci0vLwlNZXRhRGF0YSBtZXRhRGF0YSA9IGFwcC5nZXRNZXRhRGF0YSgpOwotLy8JaWYgKGl0ZW1EYXRhIGluc3RhbmNlb2YgSk5JQ2xhc3MpIHsKLS8vCQlDbGFzc0RhdGEgZGF0YSA9IChDbGFzc0RhdGEpaXRlbURhdGE7Ci0vLwkJbWV0YURhdGEuc2V0TWV0YURhdGEoZGF0YS5nZXRDbGF6eigpLCBkYXRhKTsKLS8vCX0gZWxzZSBpZiAoaXRlbURhdGEgaW5zdGFuY2VvZiBGaWVsZERhdGEpIHsKLS8vCQlGaWVsZERhdGEgZGF0YSA9IChGaWVsZERhdGEpaXRlbURhdGE7Ci0vLwkJaXRlbS5zZXRUZXh0KEZJRUxEX0ZMQUdTX0NPTFVNTiwgZ2V0RmxhZ3NTdHJpbmcoZGF0YS5nZXRGbGFncygpKSk7Ci0vLwkJbWV0YURhdGEuc2V0TWV0YURhdGEoZGF0YS5nZXRGaWVsZCgpLCBkYXRhKTsKLS8vCX0gZWxzZSBpZiAoaXRlbURhdGEgaW5zdGFuY2VvZiBNZXRob2REYXRhKSB7Ci0vLwkJTWV0aG9kRGF0YSBkYXRhID0gKE1ldGhvZERhdGEpaXRlbURhdGE7Ci0vLwkJaXRlbS5zZXRUZXh0KE1FVEhPRF9GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKGRhdGEuZ2V0RmxhZ3MoKSkpOwotLy8JCW1ldGFEYXRhLnNldE1ldGFEYXRhKGRhdGEuZ2V0TWV0aG9kKCksIGRhdGEpOwotLy8JfSBlbHNlIGlmIChpdGVtRGF0YSBpbnN0YW5jZW9mIFBhcmFtZXRlckRhdGEpIHsKLS8vCQlQYXJhbWV0ZXJEYXRhIGRhdGEgPSAoUGFyYW1ldGVyRGF0YSlpdGVtRGF0YTsKLS8vCQlpdGVtLnNldFRleHQoUEFSQU1fRkxBR1NfQ09MVU1OLCBnZXRGbGFnc1N0cmluZyhkYXRhLmdldEZsYWdzKCkpKTsKLS8vCQltZXRhRGF0YS5zZXRNZXRhRGF0YShkYXRhLmdldE1ldGhvZCgpLCBkYXRhLmdldFBhcmFtZXRlcigpLCBkYXRhKTsKLS8vCX0KLX0KLQotYm9vbGVhbiB1cGRhdGVPdXRwdXREaXIoKSB7Ci0JU3RyaW5nIG91dHB1dERpclN0ciA9IG91dHB1dERpckNiLmdldFRleHQoKTsKLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShvdXRwdXREaXJTdHIpOwotCWlmICghZmlsZS5leGlzdHMoKSkgewotCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuT0sgfCBTV1QuSUNPTl9FUlJPUik7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKCJPdXRwdXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiIpOwotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCWlmICghZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5JQ09OX0VSUk9SKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoIk91dHB1dCBkaXJlY3RvcnkgaXMgbm90IGEgZGlyZWN0b3J5LiIpOwotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCWlmIChvdXRwdXREaXJTdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCWlmICghb3V0cHV0RGlyU3RyLmVxdWFscyhhcHAuZ2V0T3V0cHV0RGlyKCkpKSB7Ci0JCQlhcHAuc2V0T3V0cHV0RGlyKG91dHB1dERpclN0cik7Ci0JCX0KLQkJaWYgKG91dHB1dERpckNiLmluZGV4T2Yob3V0cHV0RGlyU3RyKSA9PSAtMSkgewotCQkJb3V0cHV0RGlyQ2IuYWRkKG91dHB1dERpclN0cik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgdXBkYXRlTWFpbkNsYXNzKCkgewotCVN0cmluZyBtYWluQ2xhc3NTdHIgPSBtYWluQ2xhc3NDYi5nZXRUZXh0KCk7Ci0JaWYgKG1haW5DbGFzc1N0ci5sZW5ndGgoKSA+IDApIHsKLQkJaWYgKCFtYWluQ2xhc3NTdHIuZXF1YWxzKGFwcC5nZXRNYWluQ2xhc3NOYW1lKCkpKSB7Ci0JCQlhcHAuc2V0TWFpbkNsYXNzTmFtZShtYWluQ2xhc3NTdHIpOwotCQl9Ci0JCWlmIChtYWluQ2xhc3NDYi5pbmRleE9mKG1haW5DbGFzc1N0cikgPT0gLTEpIHsKLQkJCW1haW5DbGFzc0NiLmFkZChtYWluQ2xhc3NTdHIpOwotCQl9Ci0JCWlmIChhcHAuZ2V0T3V0cHV0RGlyKCkgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gb3V0cHV0RGlyQ2IuaW5kZXhPZihhcHAuZ2V0T3V0cHV0RGlyKCkpOwotCQkJaWYgKGluZGV4ICE9IC0xKSBvdXRwdXREaXJDYi5zZWxlY3QoaW5kZXgpOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JSk5JR2VuZXJhdG9yQXBwIGdlbiA9IG5ldyBKTklHZW5lcmF0b3JBcHAgKCk7Ci0JaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotCQlnZW4uc2V0TWFpbkNsYXNzTmFtZShhcmdzWzBdKTsKLQkJaWYgKGFyZ3MubGVuZ3RoID4gMSkgZ2VuLnNldE91dHB1dERpcihhcmdzWzFdKTsKLQl9IGVsc2UgewotCQlnZW4uc2V0TWFpbkNsYXNzTmFtZShKTklHZW5lcmF0b3JBcHAuZ2V0RGVmYXVsdE1haW5DbGFzcygpKTsKLQl9Ci0JSk5JR2VuZXJhdG9yQXBwVUkgdWkgPSBuZXcgSk5JR2VuZXJhdG9yQXBwVUkoZ2VuKTsKLQl1aS5vcGVuKCk7Ci0JdWkucnVuKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzliYWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBKTklJdGVtIGV4dGVuZHMgRmxhZ3MgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU42NCA9IHRydWU7Ci0KLXB1YmxpYyBTdHJpbmdbXSBnZXRGbGFncygpOwotCi1wdWJsaWMgYm9vbGVhbiBnZXRGbGFnKFN0cmluZyBmbGFnKTsKLQotcHVibGljIE9iamVjdCBnZXRQYXJhbShTdHJpbmcga2V5KTsKLQotcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGUoKTsKLQotcHVibGljIHZvaWQgc2V0RmxhZ3MoU3RyaW5nW10gZmxhZ3MpOwotCi1wdWJsaWMgdm9pZCBzZXRGbGFnKFN0cmluZyBmbGFnLCBib29sZWFuIHZhbHVlKTsKLQotcHVibGljIHZvaWQgc2V0R2VuZXJhdGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLXB1YmxpYyB2b2lkIHNldFBhcmFtKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0JCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSU1ldGhvZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSU1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjQxYzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSk5JTWV0aG9kIGV4dGVuZHMgSk5JSXRlbSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZMQUdTID0ge0ZMQUdfTk9fR0VOLCBGTEFHX0FERFJFU1MsIEZMQUdfQ09OU1QsIEZMQUdfRFlOQU1JQywgRkxBR19KTkksIEZMQUdfQ0FTVCwgRkxBR19DUFAsIEZMQUdfTkVXLCBGTEFHX0RFTEVURSwgRkxBR19HQ05FVywgRkxBR19HQ09CSkVDVCwgRkxBR19TRVRURVIsIEZMQUdfR0VUVEVSLCBGTEFHX0FEREVSfTsKLQkKLXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi1wdWJsaWMgaW50IGdldE1vZGlmaWVycygpOwotCi1wdWJsaWMgYm9vbGVhbiBpc05hdGl2ZVVuaXF1ZSgpOwotCi1wdWJsaWMgSk5JUGFyYW1ldGVyW10gZ2V0UGFyYW1ldGVycygpOwotCi1wdWJsaWMgSk5JVHlwZSBnZXRSZXR1cm5UeXBlKCk7Ci0KLXB1YmxpYyBKTklUeXBlIGdldFJldHVyblR5cGU2NCgpOwotCi1wdWJsaWMgSk5JVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzKCk7Ci0KLXB1YmxpYyBKTklUeXBlW10gZ2V0UGFyYW1ldGVyVHlwZXM2NCgpOwotCi1wdWJsaWMgSk5JQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQotcHVibGljIFN0cmluZyBnZXRBY2Nlc3NvcigpOwotCi1wdWJsaWMgU3RyaW5nIGdldEV4Y2x1ZGUoKTsKLQotcHVibGljIHZvaWQgc2V0QWNjZXNzb3IoU3RyaW5nIHN0cik7Ci0KLXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGUoU3RyaW5nIHN0cik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JUGFyYW1ldGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NGE3MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSVBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSk5JUGFyYW1ldGVyIGV4dGVuZHMgSk5JSXRlbSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZMQUdTID0ge0ZMQUdfTk9fSU4sIEZMQUdfTk9fT1VULCBGTEFHX0NSSVRJQ0FMLCBGTEFHX0lOSVQsIEZMQUdfU1RSVUNULCBGTEFHX1VOSUNPREUsIEZMQUdfU0VOVElORUwsIEZMQUdfR0NPQkpFQ1R9OwotCi1wdWJsaWMgU3RyaW5nIGdldENhc3QoKTsKLQotcHVibGljIEpOSU1ldGhvZCBnZXRNZXRob2QoKTsKLQotcHVibGljIGludCBnZXRQYXJhbWV0ZXIoKTsKLQotcHVibGljIEpOSUNsYXNzIGdldFR5cGVDbGFzcygpOwotCi1wdWJsaWMgSk5JVHlwZSBnZXRUeXBlKCk7Ci0KLXB1YmxpYyBKTklUeXBlIGdldFR5cGU2NCgpOwotCi1wdWJsaWMgdm9pZCBzZXRDYXN0KFN0cmluZyBzdHIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZDI5ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpOSVR5cGUgewotCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOwotCi1wdWJsaWMgYm9vbGVhbiBpc0FycmF5KCk7Ci0KLXB1YmxpYyBKTklUeXBlIGdldENvbXBvbmVudFR5cGUoKTsKLQotcHVibGljIGJvb2xlYW4gaXNUeXBlKFN0cmluZyB0eXBlKTsKLQotcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpOwotCi1wdWJsaWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoYm9vbGVhbiBkZWZpbmUpOwotCi1wdWJsaWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUxKGJvb2xlYW4gZGVmaW5lKTsKLQotcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlMihib29sZWFuIGRlZmluZSk7Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZTMoYm9vbGVhbiBkZWZpbmUpOwotCi1wdWJsaWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmU0KGJvb2xlYW4gZGVmaW5lLCBib29sZWFuIHN0cnVjdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Mb2NrR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTG9ja0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWFmZmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Mb2NrR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgTG9ja0dlbmVyYXRvciBleHRlbmRzIENsZWFudXBDbGFzcyB7Ci0JCi1wdWJsaWMgTG9ja0dlbmVyYXRvcigpIHsKLX0KLQotU3RyaW5nIGdldFBhcmFtcyhKTklNZXRob2QgbWV0aG9kKSB7Ci0JaW50IG5fYXJncyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkubGVuZ3RoOwotCWlmIChuX2FyZ3MgPT0gMCkgcmV0dXJuICIiOwotCVN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQlTdHJpbmcgcGFyYW1zID0gIiI7Ci0JaW50IGluZGV4ID0gMDsKLQl3aGlsZSAodHJ1ZSkgewotCQlpbmRleCA9IGNsYXNzU291cmNlLmluZGV4T2YobmFtZSwgaW5kZXggKyAxKTsKLQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNsYXNzU291cmNlLmNoYXJBdChpbmRleCAtIDEpKSkgY29udGludWU7Ci0JCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuIG51bGw7Ci0JCWludCBwYXJhbnRlc2VzU3RhcnQgPSBjbGFzc1NvdXJjZS5pbmRleE9mKCIoIiwgaW5kZXgpOwotCQlpZiAoY2xhc3NTb3VyY2Uuc3Vic3RyaW5nKGluZGV4ICsgbmFtZS5sZW5ndGgoKSwgcGFyYW50ZXNlc1N0YXJ0KS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJaW50IHBhcmFudGVzZXNFbmQgPSBjbGFzc1NvdXJjZS5pbmRleE9mKCIpIiwgcGFyYW50ZXNlc1N0YXJ0KTsKLSAJCQlwYXJhbXMgPSBjbGFzc1NvdXJjZS5zdWJzdHJpbmcocGFyYW50ZXNlc1N0YXJ0ICsgMSwgcGFyYW50ZXNlc0VuZCk7Ci0gCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIHBhcmFtczsKLX0KLQotU3RyaW5nIGdldFJldHVybihKTklNZXRob2QgbWV0aG9kKSB7Ci0JSk5JVHlwZSByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQlpZiAoIXJldHVyblR5cGUuaXNUeXBlKCJpbnQiKSkgcmV0dXJuIHJldHVyblR5cGUuZ2V0VHlwZVNpZ25hdHVyZTMoZmFsc2UpOwotCVN0cmluZyBtb2RpZmllclN0ciA9IE1vZGlmaWVyLnRvU3RyaW5nKG1ldGhvZC5nZXRNb2RpZmllcnMoKSk7Ci0JU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCVBhdHRlcm4gcCA9IFBhdHRlcm4uY29tcGlsZShtb2RpZmllclN0ciArICIuKiIgKyBuYW1lICsgIi4qKC4qKSIpOwotCU1hdGNoZXIgbSA9IHAubWF0Y2hlcihjbGFzc1NvdXJjZSk7Ci0JaWYgKG0uZmluZCgpKSB7Ci0JCVN0cmluZyBtZXRob2RTdHIgPSBjbGFzc1NvdXJjZS5zdWJzdHJpbmcobS5zdGFydCgpLCBtLmVuZCgpKTsKLQkJaW50IGluZGV4ID0gbWV0aG9kU3RyLmluZGV4T2YoIi8qbG9uZyovIik7Ci0JCWlmIChpbmRleCAhPSAtMSAmJiBpbmRleCA8IG1ldGhvZFN0ci5pbmRleE9mKG5hbWUpKSB7Ci0JCQlyZXR1cm4gbmV3IFJlZmxlY3RUeXBlKEludGVnZXIuVFlQRSkuZ2V0VHlwZVNpZ25hdHVyZTMoZmFsc2UpICsgIiAvKmxvbmcqLyI7Ci0JCX0JCQotCX0KLQlyZXR1cm4gbmV3IFJlZmxlY3RUeXBlKEludGVnZXIuVFlQRSkuZ2V0VHlwZVNpZ25hdHVyZTMoZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklDbGFzcyBjbGF6eikgewotCXN1cGVyLmdlbmVyYXRlKGNsYXp6KTsKLQlKTklNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JZ2VuZXJhdGUobWV0aG9kcyk7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEpOSU1ldGhvZFtdIG1ldGhvZHMpIHsKLQlzb3J0KG1ldGhvZHMpOwkKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJSk5JTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJZ2VuZXJhdGUobWV0aG9kKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEpOSU1ldGhvZCBtZXRob2QpIHsKLQlpbnQgbW9kaWZpZXJzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCWJvb2xlYW4gbG9jayA9IChtb2RpZmllcnMgJiBNb2RpZmllci5TWU5DSFJPTklaRUQpICE9IDA7Ci0JU3RyaW5nIHJldHVyblN0ciA9IGdldFJldHVybihtZXRob2QpOwotCVN0cmluZyBwYXJhbXNTdHIgPSBnZXRQYXJhbXMobWV0aG9kKTsKLQlpZiAobG9jaykgewotCQlTdHJpbmcgbW9kaWZpZXJzU3RyID0gTW9kaWZpZXIudG9TdHJpbmcobW9kaWZpZXJzICYgfk1vZGlmaWVyLlNZTkNIUk9OSVpFRCk7Ci0JCW91dHB1dChtb2RpZmllcnNTdHIpOwotCQlpZiAobW9kaWZpZXJzU3RyLmxlbmd0aCgpID4gMCkgb3V0cHV0KCIgIik7Ci0JCW91dHB1dChyZXR1cm5TdHIpOwotCQlvdXRwdXQoIiBfIik7Ci0JCW91dHB1dChtZXRob2QuZ2V0TmFtZSgpKTsKLQkJb3V0cHV0KCIoIik7Ci0JCW91dHB1dChwYXJhbXNTdHIpOwotCQlvdXRwdXRsbigiKTsiKTsKLQl9Ci0JU3RyaW5nIG1vZGlmaWVyc1N0ciA9IE1vZGlmaWVyLnRvU3RyaW5nKG1vZGlmaWVycyAmIH4oTW9kaWZpZXIuU1lOQ0hST05JWkVEIHwgKGxvY2sgPyBNb2RpZmllci5OQVRJVkUgOiAwKSkpOwotCW91dHB1dChtb2RpZmllcnNTdHIpOwotCWlmIChtb2RpZmllcnNTdHIubGVuZ3RoKCkgPiAwKSBvdXRwdXQoIiAiKTsKLQlvdXRwdXQocmV0dXJuU3RyKTsKLQlvdXRwdXQoIiAiKTsKLQlvdXRwdXQobWV0aG9kLmdldE5hbWUoKSk7Ci0Jb3V0cHV0KCIoIik7Ci0Jb3V0cHV0KHBhcmFtc1N0cik7Ci0Jb3V0cHV0KCIpIik7Ci0JaWYgKGxvY2spIHsKLQkJb3V0cHV0bG4oIiB7Iik7Ci0JCW91dHB1dGxuKCJcdGxvY2subG9jaygpOyIpOwotCQlvdXRwdXRsbigiXHR0cnkgeyIpOwotCQlvdXRwdXQoIlx0XHQiKTsKLQkJaWYgKCFtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmlzVHlwZSgidm9pZCIpKSB7Ci0JCQlvdXRwdXQoInJldHVybiAiKTsKLQkJfQotCQlvdXRwdXQoIl8iKTsKLQkJb3V0cHV0KG1ldGhvZC5nZXROYW1lKCkpOwotCQlvdXRwdXQoIigiKTsKLQkJU3RyaW5nW10gcGFyYW1OYW1lcyA9IGdldEFyZ05hbWVzKG1ldGhvZCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkgb3V0cHV0KCIsICIpOwotCQkJb3V0cHV0KHBhcmFtTmFtZXNbaV0pOwotCQl9Ci0JCW91dHB1dGxuKCIpOyIpOwotCQlvdXRwdXRsbigiXHR9IGZpbmFsbHkgeyIpOwotCQlvdXRwdXRsbigiXHRcdGxvY2sudW5sb2NrKCk7Iik7Ci0JCW91dHB1dGxuKCJcdH0iKTsKLQkJb3V0cHV0bG4oIn0iKTsKLQl9IGVsc2UgewotCQlvdXRwdXRsbigiOyIpOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWlmIChhcmdzLmxlbmd0aCA8IDIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YSBMb2NrR2VuZXJhdG9yIDxPUyBjbGFzc05hbWU+IDxPUyBjbGFzcyBzb3VyY2U+Iik7Ci0JCXJldHVybjsKLQl9Ci0JdHJ5IHsKLQkJTG9ja0dlbmVyYXRvciBnZW4gPSBuZXcgTG9ja0dlbmVyYXRvcigpOwotCQlTdHJpbmcgY2xhenpOYW1lID0gYXJnc1swXTsKLQkJU3RyaW5nIGNsYXNzU291cmNlID0gYXJnc1sxXTsgCi0JCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGF6ek5hbWUpOwotCQlnZW4uc2V0Q2xhc3NTb3VyY2VQYXRoKGNsYXNzU291cmNlKTsKLQkJZ2VuLmdlbmVyYXRlKG5ldyBSZWZsZWN0Q2xhc3MoY2xhenopKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWV0YURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQ0NjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRhRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotcHVibGljIGNsYXNzIE1ldGFEYXRhIHsKLQkKLQlQcm9wZXJ0aWVzIGRhdGE7Ci0KLXB1YmxpYyBNZXRhRGF0YShTdHJpbmcgbWFpbkNsYXNzKSB7Ci0JZGF0YSA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JaW50IGluZGV4ID0gMDsKLQlDbGFzcyBjbGF6eiA9IGdldENsYXNzKCk7Ci0JaW50IGxlbmd0aCA9IG1haW5DbGFzcy5sZW5ndGgoKTsKLQl3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHsKLQkJaW5kZXggPSBtYWluQ2xhc3MuaW5kZXhPZignLicsIGluZGV4KTsKLQkJaWYgKGluZGV4ID09IC0xKSBpbmRleCA9IGxlbmd0aDsKLQkJSW5wdXRTdHJlYW0gaXMgPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKG1haW5DbGFzcy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIi5wcm9wZXJ0aWVzIik7Ci0JCWlmIChpcyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRhdGEubG9hZChpcyk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCX0KLQkJCQotCQl9Ci0JCWluZGV4Kys7Ci0JfQotfQotCi1wdWJsaWMgTWV0YURhdGEoUHJvcGVydGllcyBkYXRhKSB7Ci0JdGhpcy5kYXRhID0gZGF0YTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YShTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JcmV0dXJuIGRhdGEuZ2V0UHJvcGVydHkoa2V5LCBkZWZhdWx0VmFsdWUpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQlkYXRhLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWV0YURhdGFHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRhRGF0YUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTBjNjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRhRGF0YUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLQotcHVibGljIGNsYXNzIE1ldGFEYXRhR2VuZXJhdG9yIGV4dGVuZHMgSk5JR2VuZXJhdG9yIHsKLQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb3B5cmlnaHQoKSB7Ci0JZ2VuZXJhdGVNZXRhRGF0YSgic3d0X3Byb3BlcnRpZXNfY29weXJpZ2h0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEpOSUNsYXNzIGNsYXp6KSB7Ci0Jb3V0cHV0KHRvQyhjbGF6ei5nZXROYW1lKCkpKTsKLQlvdXRwdXQoIj0iKTsKLQlvdXRwdXQoKChBYnN0cmFjdEl0ZW0pY2xhenopLmZsYXR0ZW4oKSk7Ci0Jb3V0cHV0bG4oKTsKLQlKTklGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZ2VuZXJhdGUoZmllbGRzKTsKLQlKTklNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JZ2VuZXJhdGUobWV0aG9kcyk7Ci0Jb3V0cHV0bG4oKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoSk5JRmllbGRbXSBmaWVsZHMpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlKTklGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaW50IG1vZHMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJaWYgKChtb2RzICYgTW9kaWZpZXIuUFVCTElDKSA9PSAwKSBjb250aW51ZTsKLQkJaWYgKChtb2RzICYgTW9kaWZpZXIuRklOQUwpICE9IDApIGNvbnRpbnVlOwotCQlpZiAoKG1vZHMgJiBNb2RpZmllci5TVEFUSUMpICE9IDApIGNvbnRpbnVlOwotCQlnZW5lcmF0ZShmaWVsZCk7Ci0JCW91dHB1dGxuKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklGaWVsZCBmaWVsZCkgewotCW91dHB1dChmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0Jb3V0cHV0KCJfIik7Ci0Jb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0Jb3V0cHV0KCI9Iik7Ci0Jb3V0cHV0KCgoQWJzdHJhY3RJdGVtKWZpZWxkKS5mbGF0dGVuKCkpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklNZXRob2RbXSBtZXRob2RzKSB7Ci0Jc29ydChtZXRob2RzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJSk5JTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJZ2VuZXJhdGUobWV0aG9kKTsKLQkJb3V0cHV0bG4oKTsKLQkJaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnN0ZXAoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEpOSU1ldGhvZCBtZXRob2QpIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQlidWZmZXIuYXBwZW5kKCJfIik7Ci0JaWYgKG1ldGhvZC5pc05hdGl2ZVVuaXF1ZSgpKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKSk7Ci0JfSBlbHNlIHsKLQkJYnVmZmVyLmFwcGVuZChnZXRGdW5jdGlvbk5hbWUobWV0aG9kKSk7Ci0JfQotCVN0cmluZyBrZXkgPSBidWZmZXIudG9TdHJpbmcoKTsKLQlvdXRwdXQoa2V5KTsKLQlvdXRwdXQoIj0iKTsKLQlvdXRwdXQoKChBYnN0cmFjdEl0ZW0pbWV0aG9kKS5mbGF0dGVuKCkpOwotCW91dHB1dGxuKCk7Ci0JSk5JUGFyYW1ldGVyW10gcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQlvdXRwdXQoa2V5KTsKLQkJb3V0cHV0KCJfIik7Ci0JCW91dHB1dChpICsgIj0iKTsKLQkJb3V0cHV0KCgoQWJzdHJhY3RJdGVtKXBhcmFtc1tpXSkuZmxhdHRlbigpKTsKLQkJb3V0cHV0bG4oKTsJCQotCX0KLX0KLQotcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JcmV0dXJuICIucHJvcGVydGllcyI7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIGdldEdlbmVyYXRlKEpOSUl0ZW0gaXRlbSkgewotCXJldHVybiB0cnVlOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldE91dHB1dE5hbWUoKSB7Ci0JcmV0dXJuIGdldE1haW5DbGFzcygpLmdldE5hbWUoKTsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gZ2V0R2VuZXJhdGUoSk5JQ2xhc3MgY2xhenopIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL05hdGl2ZXNHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9OYXRpdmVzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZDdiYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL05hdGl2ZXNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgTmF0aXZlc0dlbmVyYXRvciBleHRlbmRzIEpOSUdlbmVyYXRvciB7Ci0KLWJvb2xlYW4gZW50ZXJFeGl0TWFjcm87Ci0KLXB1YmxpYyBOYXRpdmVzR2VuZXJhdG9yKCkgewotCWVudGVyRXhpdE1hY3JvID0gdHJ1ZTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb3B5cmlnaHQoKSB7Ci0JZ2VuZXJhdGVNZXRhRGF0YSgic3d0X2NvcHlyaWdodCIpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUluY2x1ZGVzKCkgewotCVN0cmluZyBvdXRwdXROYW1lID0gZ2V0T3V0cHV0TmFtZSgpOwotCW91dHB1dGxuKCIjaW5jbHVkZSBcInN3dC5oXCIiKTsKLQlvdXRwdXQoIiNpbmNsdWRlIFwiIik7Ci0Jb3V0cHV0KG91dHB1dE5hbWUpOwotCW91dHB1dGxuKCJfc3RydWN0cy5oXCIiKTsKLQlvdXRwdXQoIiNpbmNsdWRlIFwiIik7Ci0Jb3V0cHV0KG91dHB1dE5hbWUpOwotCW91dHB1dGxuKCJfc3RhdHMuaFwiIik7Ci0Jb3V0cHV0bG4oKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoSk5JQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JSk5JTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCWludCBjb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKG1ldGhvZE5hbWUpKSBjb3VudCsrOwotCX0KLQlKTklNZXRob2RbXSByZXN1bHQgPSBuZXcgSk5JTWV0aG9kW2NvdW50XTsKLQljb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKG1ldGhvZE5hbWUpKSByZXN1bHRbY291bnQrK10gPSBtZXRob2RzW2ldOwotCX0KLQlnZW5lcmF0ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklDbGFzcyBjbGF6eikgewotCUpOSU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlpbnQgaSA9IDA7Ci0JZm9yICg7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCUpOSU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgIT0gMCkgYnJlYWs7Ci0JfQotCWlmIChpID09IG1ldGhvZHMubGVuZ3RoKSByZXR1cm47Ci0Jc29ydChtZXRob2RzKTsKLQlnZW5lcmF0ZU5hdGl2ZU1hY3JvKGNsYXp6KTsKLQlnZW5lcmF0ZUV4Y2x1ZGVzKG1ldGhvZHMpOwotCWdlbmVyYXRlKG1ldGhvZHMpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklNZXRob2RbXSBtZXRob2RzKSB7Ci0Jc29ydChtZXRob2RzKTsJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCUpOSU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCWdlbmVyYXRlKG1ldGhvZCk7Ci0JCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zdGVwKCk7Ci0JfQotfQotCi1ib29sZWFuIGlzU3RydWN0KFN0cmluZyBmbGFnc1N0cikgewotCVN0cmluZ1tdIGZsYWdzID0gc3BsaXQoZmxhZ3NTdHIsICIgIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgewotCQlpZiAoZmxhZ3NbaV0uZXF1YWxzKEZsYWdzLkZMQUdfU1RSVUNUKSkgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBnZW5lcmF0ZUNhbGxiYWNrKEpOSU1ldGhvZCBtZXRob2QsIFN0cmluZyBmdW5jdGlvbiwgSk5JUGFyYW1ldGVyW10gcGFyYW1zLCBKTklUeXBlIHJldHVyblR5cGUpIHsKLQlvdXRwdXQoInN0YXRpYyBqaW50TG9uZyAiKTsKLQlvdXRwdXQoZnVuY3Rpb24pOwotCW91dHB1dGxuKCI7Iik7Ci0Jb3V0cHV0KCJzdGF0aWMgIik7Ci0JU3RyaW5nW10gdHlwZXMgPSBzcGxpdCgoU3RyaW5nKW1ldGhvZC5nZXRQYXJhbSgiY2FsbGJhY2tfdHlwZXMiKSwgIjsiKTsKLQlTdHJpbmdbXSBmbGFncyA9IHNwbGl0KChTdHJpbmcpbWV0aG9kLmdldFBhcmFtKCJjYWxsYmFja19mbGFncyIpLCAiOyIpOwotCW91dHB1dCh0eXBlc1swXSk7Ci0Jb3V0cHV0KCIgIik7Ci0Jb3V0cHV0KCJwcm9jXyIpOwotCW91dHB1dChmdW5jdGlvbik7Ci0Jb3V0cHV0KCIoIik7Ci0JYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JZm9yIChpbnQgaSA9IDE7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQlpZiAoIWZpcnN0KSBvdXRwdXQoIiwgIik7Ci0JCW91dHB1dCh0eXBlc1tpXSk7Ci0JCW91dHB1dCgiICIpOwotCQlvdXRwdXQoImFyZyIpOwotCQlvdXRwdXQoU3RyaW5nLnZhbHVlT2YoaSAtIDEpKTsKLQkJZmlyc3QgPSBmYWxzZTsKLQl9Ci0Jb3V0cHV0bG4oIikgeyIpOwotCQotCW91dHB1dCgiXHQiKTsKLQlpZiAoaXNTdHJ1Y3QoZmxhZ3NbMF0pKSB7Ci0JCW91dHB1dCh0eXBlc1swXSk7Ci0JCW91dHB1dCgiKiBscHJjID0gIik7Ci0JfSBlbHNlIGlmICghdHlwZXNbMF0uZXF1YWxzKCJ2b2lkIikpIHsKLQkJb3V0cHV0KCJyZXR1cm4gIik7Ci0JfQotCW91dHB1dCgiKCgiKTsKLQlvdXRwdXQodHlwZXNbMF0pOwotCWlmIChpc1N0cnVjdChmbGFnc1swXSkpIG91dHB1dCgiKiIpOwotCW91dHB1dCgiICgqKSgiKTsKLQlmaXJzdCA9IHRydWU7Ci0JZm9yIChpbnQgaSA9IDE7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQlpZiAoIWZpcnN0KSBvdXRwdXQoIiwgIik7Ci0JCWZpcnN0ID0gZmFsc2U7Ci0JCW91dHB1dCh0eXBlc1tpXSk7Ci0JCWlmIChpc1N0cnVjdChmbGFnc1tpXSkpIG91dHB1dCgiKiIpOwotCX0KLQlvdXRwdXQoIikpIik7Ci0Jb3V0cHV0KGZ1bmN0aW9uKTsKLQlvdXRwdXQoIikoIik7Ci0JZmlyc3QgPSB0cnVlOwotCWZvciAoaW50IGkgPSAxOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKCFmaXJzdCkgb3V0cHV0KCIsICIpOwotCQlmaXJzdCA9IGZhbHNlOwotCQlpZiAoaXNTdHJ1Y3QoZmxhZ3NbaV0pKSBvdXRwdXQoIiYiKTsKLQkJb3V0cHV0KCJhcmciKTsKLQkJb3V0cHV0KFN0cmluZy52YWx1ZU9mKGkgLTEpKTsKLQl9Ci0Jb3V0cHV0bG4oIik7Iik7Ci0JaWYgKGlzU3RydWN0KGZsYWdzWzBdKSkgewotCQlvdXRwdXQoIlx0Iik7Ci0JCW91dHB1dCh0eXBlc1swXSk7Ci0JCW91dHB1dGxuKCIgcmM7Iik7Ci0JCW91dHB1dGxuKCJcdGlmIChscHJjKSB7Iik7Ci0JCW91dHB1dGxuKCJcdFx0cmMgPSAqbHByYzsiKTsKLQkJb3V0cHV0bG4oIlx0XHRmcmVlKGxwcmMpOyIpOwotCQlvdXRwdXRsbigiXHR9IGVsc2UgeyIpOwotCQlvdXRwdXQoIlx0XHRtZW1zZXQoJnJjLCAwLCBzaXplb2YoIik7Ci0JCW91dHB1dCh0eXBlc1swXSk7Ci0JCW91dHB1dGxuKCIpKTsiKTsKLQkJb3V0cHV0bG4oIlx0fSIpOwotCQlvdXRwdXRsbigiXHRyZXR1cm4gcmM7Iik7Ci0JfQotCW91dHB1dGxuKCJ9Iik7Ci0JCi0Jb3V0cHV0KCJzdGF0aWMgamludExvbmcgIik7Ci0Jb3V0cHV0KG1ldGhvZC5nZXROYW1lKCkpOwotCW91dHB1dGxuKCIoamludExvbmcgZnVuYykgeyIpOwotCW91dHB1dCgiXHQiKTsKLQlvdXRwdXQoZnVuY3Rpb24pOwotCW91dHB1dGxuKCIgPSBmdW5jOyIpOwotCW91dHB1dCgiXHRyZXR1cm4gKGppbnRMb25nKXByb2NfIik7Ci0Jb3V0cHV0KGZ1bmN0aW9uKTsKLQlvdXRwdXRsbigiOyIpOwotCW91dHB1dGxuKCJ9Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEpOSU1ldGhvZCBtZXRob2QpIHsKLQlpZiAobWV0aG9kLmdldEZsYWcoRkxBR19OT19HRU4pKSByZXR1cm47Ci0JSk5JVHlwZSByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKSwgcmV0dXJuVHlwZTY0ID0gbWV0aG9kLmdldFJldHVyblR5cGU2NCgpOwkKLQlpZiAoIShyZXR1cm5UeXBlLmlzVHlwZSgidm9pZCIpIHx8IHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSB8fCBpc1N5c3RlbUNsYXNzKHJldHVyblR5cGUpIHx8IHJldHVyblR5cGUuaXNUeXBlKCJqYXZhLmxhbmcuU3RyaW5nIikpKSB7Ci0JCW91dHB1dCgiV2FybmluZzogYmFkIHJldHVybiB0eXBlLiA6Iik7Ci0JCW91dHB1dGxuKG1ldGhvZC50b1N0cmluZygpKTsKLQkJcmV0dXJuOwotCX0KLQlKTklQYXJhbWV0ZXJbXSBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCVN0cmluZyBmdW5jdGlvbiA9IGdldEZ1bmN0aW9uTmFtZShtZXRob2QpLCBmdW5jdGlvbjY0ID0gZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCwgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzNjQoKSk7CQotCWdlbmVyYXRlU291cmNlU3RhcnQoZnVuY3Rpb24sIGZ1bmN0aW9uNjQpOwotCWJvb2xlYW4gc2FtZUZ1bmN0aW9uID0gZnVuY3Rpb24uZXF1YWxzKGZ1bmN0aW9uNjQpOwotCWlmICghc2FtZUZ1bmN0aW9uKSB7Ci0JCW91dHB1dCgiI2lmbmRlZiAiKTsKLQkJb3V0cHV0KEpOSTY0KTsKLQkJb3V0cHV0bG4oKTsKLQl9Ci0JaWYgKGlzQ1BQKSB7Ci0JCW91dHB1dCgiZXh0ZXJuIFwiQ1wiICIpOwotCQlnZW5lcmF0ZUZ1bmN0aW9uUHJvdG90eXBlKG1ldGhvZCwgZnVuY3Rpb24sIHBhcmFtcywgcmV0dXJuVHlwZSwgcmV0dXJuVHlwZTY0LCB0cnVlKTsKLQkJb3V0cHV0bG4oIjsiKTsKLQl9Ci0JaWYgKGZ1bmN0aW9uLnN0YXJ0c1dpdGgoIkNBTExCQUNLXyIpKSB7Ci0JCWdlbmVyYXRlQ2FsbGJhY2sobWV0aG9kLCBmdW5jdGlvbiwgcGFyYW1zLCByZXR1cm5UeXBlKTsKLQl9Ci0JZ2VuZXJhdGVGdW5jdGlvblByb3RvdHlwZShtZXRob2QsIGZ1bmN0aW9uLCBwYXJhbXMsIHJldHVyblR5cGUsIHJldHVyblR5cGU2NCwgIXNhbWVGdW5jdGlvbik7Ci0JaWYgKCFmdW5jdGlvbi5lcXVhbHMoZnVuY3Rpb242NCkpIHsKLQkJb3V0cHV0bG4oKTsKLQkJb3V0cHV0bG4oIiNlbHNlIik7Ci0JCWlmIChpc0NQUCkgewotCQkJb3V0cHV0KCJleHRlcm4gXCJDXCIgIik7Ci0JCQlnZW5lcmF0ZUZ1bmN0aW9uUHJvdG90eXBlKG1ldGhvZCwgZnVuY3Rpb242NCwgcGFyYW1zLCByZXR1cm5UeXBlLCByZXR1cm5UeXBlNjQsIHRydWUpOwotCQkJb3V0cHV0bG4oIjsiKTsKLQkJfQotCQlnZW5lcmF0ZUZ1bmN0aW9uUHJvdG90eXBlKG1ldGhvZCwgZnVuY3Rpb242NCwgcGFyYW1zLCByZXR1cm5UeXBlLCByZXR1cm5UeXBlNjQsICFzYW1lRnVuY3Rpb24pOwotCQlvdXRwdXRsbigpOwotCQlvdXRwdXRsbigiI2VuZGlmIik7Ci0JfQotCWdlbmVyYXRlRnVuY3Rpb25Cb2R5KG1ldGhvZCwgZnVuY3Rpb24sIGZ1bmN0aW9uNjQsIHBhcmFtcywgcmV0dXJuVHlwZSwgcmV0dXJuVHlwZTY0KTsKLQlnZW5lcmF0ZVNvdXJjZUVuZChmdW5jdGlvbik7Ci0Jb3V0cHV0bG4oKTsKLX0KLQotcHVibGljIHZvaWQgc2V0RW50ZXJFeGl0TWFjcm8oYm9vbGVhbiBlbnRlckV4aXRNYWNybykgewotCXRoaXMuZW50ZXJFeGl0TWFjcm8gPSBlbnRlckV4aXRNYWNybzsKLX0KLQotdm9pZCBnZW5lcmF0ZUV4Y2x1ZGVzKEpOSU1ldGhvZFtdIG1ldGhvZHMpIHsKLQlIYXNoU2V0IGV4Y2x1ZGVzID0gbmV3IEhhc2hTZXQoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJSk5JTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJU3RyaW5nIGV4Y2x1ZGUgPSBtZXRob2QuZ2V0RXhjbHVkZSgpOwotCQlpZiAoZXhjbHVkZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlleGNsdWRlcy5hZGQoZXhjbHVkZSk7Ci0JCX0KLQl9Ci0JZm9yIChJdGVyYXRvciBpdGVyID0gZXhjbHVkZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCVN0cmluZyBleGNsdWRlID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJb3V0cHV0bG4oZXhjbHVkZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJSk5JTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCQlTdHJpbmcgbWV0aG9kRXhjbHVkZSA9IG1ldGhvZC5nZXRFeGNsdWRlKCk7Ci0JCQlpZiAoZXhjbHVkZS5lcXVhbHMobWV0aG9kRXhjbHVkZSkpIHsKLQkJCQlvdXRwdXQoIiNkZWZpbmUgTk9fIik7Ci0JCQkJb3V0cHV0bG4oZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCkpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJb3V0cHV0bG4oKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVOYXRpdmVNYWNybyhKTklDbGFzcyBjbGF6eikgewotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoY2xhenouZ2V0U2ltcGxlTmFtZSgpKTsKLQlvdXRwdXQoIl9OQVRJVkUoZnVuYykgSmF2YV8iKTsKLQlvdXRwdXQodG9DKGNsYXp6LmdldE5hbWUoKSkpOwotCW91dHB1dGxuKCJfIyNmdW5jIik7Ci0Jb3V0cHV0bG4oKTsKLX0KLQotYm9vbGVhbiBnZW5lcmF0ZUdldFBhcmFtZXRlcihKTklNZXRob2QgbWV0aG9kLCBKTklQYXJhbWV0ZXIgcGFyYW0sIGJvb2xlYW4gY3JpdGljYWwsIGludCBpbmRlbnQpIHsKLQlKTklUeXBlIHBhcmFtVHlwZSA9IHBhcmFtLmdldFR5cGUoKSwgcGFyYW1UeXBlNjQgPSBwYXJhbS5nZXRUeXBlNjQoKTsKLQlpZiAocGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgfHwgaXNTeXN0ZW1DbGFzcyhwYXJhbVR5cGUpKSByZXR1cm4gZmFsc2U7Ci0JU3RyaW5nIGlTdHIgPSBTdHJpbmcudmFsdWVPZihwYXJhbS5nZXRQYXJhbWV0ZXIoKSk7Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBpbmRlbnQ7IGorKykgb3V0cHV0KCJcdCIpOwotCW91dHB1dCgiaWYgKGFyZyIpOwotCW91dHB1dChpU3RyKTsKLQlvdXRwdXQoIikgaWYgKChscGFyZyIpOwotCW91dHB1dChpU3RyKTsKLQlvdXRwdXQoIiA9ICIpOwotCWlmIChwYXJhbVR5cGUuaXNBcnJheSgpKSB7Ci0JCUpOSVR5cGUgY29tcG9uZW50VHlwZSA9IHBhcmFtVHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCWlmIChjb21wb25lbnRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCWlmIChjcml0aWNhbCkgewotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIigiKTsKLQkJCQkJb3V0cHV0KGNvbXBvbmVudFR5cGUuZ2V0VHlwZVNpZ25hdHVyZTIoIXBhcmFtVHlwZS5lcXVhbHMocGFyYW1UeXBlNjQpKSk7Ci0JCQkJCW91dHB1dCgiKikiKTsKLQkJCQkJb3V0cHV0KCJlbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoYXJnIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCIoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmciKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGlTdHIpOwotCQkJCW91dHB1dCgiLCBOVUxMKSIpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaXNDUFApIHsKLQkJCQkJb3V0cHV0KCJlbnYtPkdldCIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiKCplbnYpLT5HZXQiKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGNvbXBvbmVudFR5cGUuZ2V0VHlwZVNpZ25hdHVyZTEoIXBhcmFtVHlwZS5lcXVhbHMocGFyYW1UeXBlNjQpKSk7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiQXJyYXlFbGVtZW50cyhhcmciKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIkFycmF5RWxlbWVudHMoZW52LCBhcmciKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGlTdHIpOwotCQkJCW91dHB1dCgiLCBOVUxMKSIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IEVycm9yKCJub3QgZG9uZSIpOwotCQl9Ci0JfSBlbHNlIGlmIChwYXJhbVR5cGUuaXNUeXBlKCJqYXZhLmxhbmcuU3RyaW5nIikpIHsKLQkJaWYgKHBhcmFtLmdldEZsYWcoRkxBR19VTklDT0RFKSkgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPkdldFN0cmluZ0NoYXJzKGFyZyIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIigqZW52KS0+R2V0U3RyaW5nQ2hhcnMoZW52LCBhcmciKTsKLQkJCX0KLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiLCBOVUxMKSIpOwotCQl9IGVsc2UgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPkdldFN0cmluZ1VURkNoYXJzKGFyZyIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIigqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBhcmciKTsKLQkJCX0KLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiLCBOVUxMKSIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHBhcmFtLmdldEZsYWcoRkxBR19OT19JTikpIHsKLQkJCW91dHB1dCgiJl9hcmciKTsKLQkJCW91dHB1dChpU3RyKTsKLQkJfSBlbHNlIHsKLQkJCW91dHB1dCgiZ2V0Iik7Ci0JCQlvdXRwdXQocGFyYW1UeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQlvdXRwdXQoIkZpZWxkcyhlbnYsIGFyZyIpOwotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0KCIsICZfYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCQlvdXRwdXQoIikiKTsKLQkJfQotCX0JCi0Jb3V0cHV0bG4oIikgPT0gTlVMTCkgZ290byBmYWlsOyIpOwotCXJldHVybiB0cnVlOwotfQotCi12b2lkIGdlbmVyYXRlU2V0UGFyYW1ldGVyKEpOSVBhcmFtZXRlciBwYXJhbSwgYm9vbGVhbiBjcml0aWNhbCkgewotCUpOSVR5cGUgcGFyYW1UeXBlID0gcGFyYW0uZ2V0VHlwZSgpLCBwYXJhbVR5cGU2NCA9IHBhcmFtLmdldFR5cGU2NCgpOwotCWlmIChwYXJhbVR5cGUuaXNQcmltaXRpdmUoKSB8fCBpc1N5c3RlbUNsYXNzKHBhcmFtVHlwZSkpIHJldHVybjsKLQlTdHJpbmcgaVN0ciA9IFN0cmluZy52YWx1ZU9mKHBhcmFtLmdldFBhcmFtZXRlcigpKTsKLQlpZiAocGFyYW1UeXBlLmlzQXJyYXkoKSkgewotCQlvdXRwdXQoIlx0aWYgKGFyZyIpOwotCQlvdXRwdXQoaVN0cik7Ci0JCW91dHB1dCgiICYmIGxwYXJnIik7Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0KCIpICIpOwotCQlKTklUeXBlIGNvbXBvbmVudFR5cGUgPSBwYXJhbVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlpZiAoY29tcG9uZW50VHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlpZiAoY3JpdGljYWwpIHsKLQkJCQlpZiAoaXNDUFApIHsKLQkJCQkJb3V0cHV0KCJlbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGFyZyIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZyIpOwotCQkJCX0KLQkJCQlvdXRwdXQoaVN0cik7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoImVudi0+UmVsZWFzZSIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiKCplbnYpLT5SZWxlYXNlIik7Ci0JCQkJfQotCQkJCW91dHB1dChjb21wb25lbnRUeXBlLmdldFR5cGVTaWduYXR1cmUxKCFwYXJhbVR5cGUuZXF1YWxzKHBhcmFtVHlwZTY0KSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIkFycmF5RWxlbWVudHMoYXJnIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCJBcnJheUVsZW1lbnRzKGVudiwgYXJnIik7Ci0JCQkJfQotCQkJCW91dHB1dChpU3RyKTsKLQkJCX0KLQkJCW91dHB1dCgiLCBscGFyZyIpOwotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0KCIsICIpOwotCQkJaWYgKHBhcmFtLmdldEZsYWcoRkxBR19OT19PVVQpKSB7Ci0JCQkJb3V0cHV0KCJKTklfQUJPUlQiKTsKLQkJCX0gZWxzZSB7CQkJCQotCQkJCW91dHB1dCgiMCIpOwotCQkJfQotCQkJb3V0cHV0KCIpOyIpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IEVycm9yKCJub3QgZG9uZSIpOwotCQl9Ci0JCW91dHB1dGxuKCk7Ci0JfSBlbHNlIGlmIChwYXJhbVR5cGUuaXNUeXBlKCJqYXZhLmxhbmcuU3RyaW5nIikpIHsKLQkJb3V0cHV0KCJcdGlmIChhcmciKTsKLQkJb3V0cHV0KGlTdHIpOwotCQlvdXRwdXQoIiAmJiBscGFyZyIpOwotCQlvdXRwdXQoaVN0cik7Ci0JCW91dHB1dCgiKSAiKTsKLQkJaWYgKHBhcmFtLmdldEZsYWcoRkxBR19VTklDT0RFKSkgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyhhcmciKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCIoKmVudiktPlJlbGVhc2VTdHJpbmdDaGFycyhlbnYsIGFyZyIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhhcmciKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCIoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIGFyZyIpOwotCQkJfQotCQl9Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0KCIsIGxwYXJnIik7Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0bG4oIik7Iik7Ci0JfSBlbHNlIHsKLQkJaWYgKCFwYXJhbS5nZXRGbGFnKEZMQUdfTk9fT1VUKSkgewotCQkJb3V0cHV0KCJcdGlmIChhcmciKTsKLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiICYmIGxwYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCQlvdXRwdXQoIikgIik7Ci0JCQlvdXRwdXQoInNldCIpOwotCQkJb3V0cHV0KHBhcmFtVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCQkJb3V0cHV0KCJGaWVsZHMoZW52LCBhcmciKTsKLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiLCBscGFyZyIpOwotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0bG4oIik7Iik7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVFbnRlckV4aXRNYWNybyhKTklNZXRob2QgbWV0aG9kLCBTdHJpbmcgZnVuY3Rpb24sIFN0cmluZyBmdW5jdGlvbjY0LCBib29sZWFuIGVudGVyKSB7Ci0JaWYgKCFlbnRlckV4aXRNYWNybykgcmV0dXJuOwotCWlmICghZnVuY3Rpb24uZXF1YWxzKGZ1bmN0aW9uNjQpKSB7Ci0JCW91dHB1dCgiI2lmbmRlZiAiKTsKLQkJb3V0cHV0KEpOSTY0KTsKLQkJb3V0cHV0bG4oKTsKLQl9Ci0Jb3V0cHV0KCJcdCIpOwotCW91dHB1dChtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCW91dHB1dCgiX05BVElWRV8iKTsKLQlvdXRwdXQoZW50ZXIgPyAiRU5URVIiIDogIkVYSVQiKTsKLQlvdXRwdXQoIihlbnYsIHRoYXQsICIpOwotCW91dHB1dChmdW5jdGlvbik7Ci0Jb3V0cHV0bG4oIl9GVU5DKTsiKTsKLQlpZiAoIWZ1bmN0aW9uLmVxdWFscyhmdW5jdGlvbjY0KSkgewotCQlvdXRwdXRsbigiI2Vsc2UiKTsKLQkJb3V0cHV0KCJcdCIpOwotCQlvdXRwdXQobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJb3V0cHV0KCJfTkFUSVZFXyIpOwotCQlvdXRwdXQoZW50ZXIgPyAiRU5URVIiIDogIkVYSVQiKTsKLQkJb3V0cHV0KCIoZW52LCB0aGF0LCAiKTsKLQkJb3V0cHV0KGZ1bmN0aW9uNjQpOwotCQlvdXRwdXRsbigiX0ZVTkMpOyIpOwotCQlvdXRwdXRsbigiI2VuZGlmIik7Ci0JfQotfQotCi1ib29sZWFuIGdlbmVyYXRlTG9jYWxWYXJzKEpOSU1ldGhvZCBtZXRob2QsIEpOSVBhcmFtZXRlcltdIHBhcmFtcywgSk5JVHlwZSByZXR1cm5UeXBlLCBKTklUeXBlIHJldHVyblR5cGU2NCkgewotCWJvb2xlYW4gbmVlZHNSZXR1cm4gPSBlbnRlckV4aXRNYWNybzsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQlKTklQYXJhbWV0ZXIgcGFyYW0gPSBwYXJhbXNbaV07Ci0JCUpOSVR5cGUgcGFyYW1UeXBlID0gcGFyYW0uZ2V0VHlwZSgpLCBwYXJhbVR5cGU2NCA9IHBhcmFtLmdldFR5cGU2NCgpOwotCQlpZiAocGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgfHwgaXNTeXN0ZW1DbGFzcyhwYXJhbVR5cGUpKSBjb250aW51ZTsKLQkJb3V0cHV0KCJcdCIpOwotCQlpZiAocGFyYW1UeXBlLmlzQXJyYXkoKSkgewotCQkJSk5JVHlwZSBjb21wb25lbnRUeXBlID0gcGFyYW1UeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCWlmIChjb21wb25lbnRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQlvdXRwdXQoY29tcG9uZW50VHlwZS5nZXRUeXBlU2lnbmF0dXJlMighcGFyYW1UeXBlLmVxdWFscyhwYXJhbVR5cGU2NCkpKTsKLQkJCQlvdXRwdXQoIiAqbHBhcmciICsgaSk7Ci0JCQkJb3V0cHV0KCI9TlVMTDsiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IEVycm9yKCJub3QgZG9uZSIpOwotCQkJfQotCQl9IGVsc2UgaWYgKHBhcmFtVHlwZS5pc1R5cGUoImphdmEubGFuZy5TdHJpbmciKSkgewotCQkJaWYgKHBhcmFtLmdldEZsYWcoRkxBR19VTklDT0RFKSkgewotCQkJCW91dHB1dCgiY29uc3QgamNoYXIgKmxwYXJnIiArIGkpOwkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCJjb25zdCBjaGFyICpscGFyZyIgKyBpKTsKLQkJCX0KLQkJCW91dHB1dCgiPSBOVUxMOyIpOwotCQl9IGVsc2UgewotCQkJaWYgKHBhcmFtLmdldFR5cGVDbGFzcygpLmdldEZsYWcoRmxhZ3MuRkxBR19TVFJVQ1QpKSB7Ci0JCQkJb3V0cHV0KCJzdHJ1Y3QgIik7Ci0JCQl9Ci0JCQlvdXRwdXQocGFyYW1UeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQlvdXRwdXQoIiBfYXJnIiArIGkpOwotCQkJaWYgKHBhcmFtLmdldEZsYWcoRkxBR19JTklUKSkgb3V0cHV0KCI9ezB9Iik7Ci0JCQlvdXRwdXQoIiwgKmxwYXJnIiArIGkpOwotCQkJb3V0cHV0KCI9TlVMTDsiKTsKLQkJfQotCQlvdXRwdXRsbigpOwotCQluZWVkc1JldHVybiA9IHRydWU7Ci0JfQotCWlmIChuZWVkc1JldHVybikgewotCQlpZiAoIXJldHVyblR5cGUuaXNUeXBlKCJ2b2lkIikpIHsKLQkJCW91dHB1dCgiXHQiKTsKLQkJCW91dHB1dChyZXR1cm5UeXBlLmdldFR5cGVTaWduYXR1cmUyKCFyZXR1cm5UeXBlLmVxdWFscyhyZXR1cm5UeXBlNjQpKSk7Ci0JCQlvdXRwdXRsbigiIHJjID0gMDsiKTsKLQkJfQotCX0KLQlyZXR1cm4gbmVlZHNSZXR1cm47Ci19Ci0KLWJvb2xlYW4gZ2VuZXJhdGVHZXR0ZXJzKEpOSU1ldGhvZCBtZXRob2QsIEpOSVBhcmFtZXRlcltdIHBhcmFtcykgewotCWJvb2xlYW4gZ2VuRmFpbFRhZyA9IGZhbHNlOwotCWludCBjcml0aWNhbENvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQlKTklQYXJhbWV0ZXIgcGFyYW0gPSBwYXJhbXNbaV07Ci0JCWlmICghaXNDcml0aWNhbChwYXJhbSkpIHsKLQkJCWdlbkZhaWxUYWcgfD0gZ2VuZXJhdGVHZXRQYXJhbWV0ZXIobWV0aG9kLCBwYXJhbSwgZmFsc2UsIDEpOwotCQl9IGVsc2UgewotCQkJY3JpdGljYWxDb3VudCsrOwotCQl9Ci0JfQotCWlmIChjcml0aWNhbENvdW50ICE9IDApIHsKLQkJb3V0cHV0bG4oIiNpZmRlZiBKTklfVkVSU0lPTl8xXzIiKTsKLQkJb3V0cHV0bG4oIlx0aWYgKElTX0pOSV8xXzIpIHsiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJCUpOSVBhcmFtZXRlciBwYXJhbSA9IHBhcmFtc1tpXTsKLQkJCWlmIChpc0NyaXRpY2FsKHBhcmFtKSkgewotCQkJCWdlbkZhaWxUYWcgfD0gZ2VuZXJhdGVHZXRQYXJhbWV0ZXIobWV0aG9kLCBwYXJhbSwgdHJ1ZSwgMik7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIlx0fSBlbHNlIik7Ci0JCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJb3V0cHV0bG4oIlx0eyIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQkJSk5JUGFyYW1ldGVyIHBhcmFtID0gcGFyYW1zW2ldOwotCQkJaWYgKGlzQ3JpdGljYWwocGFyYW0pKSB7Ci0JCQkJZ2VuRmFpbFRhZyB8PSBnZW5lcmF0ZUdldFBhcmFtZXRlcihtZXRob2QsIHBhcmFtLCBmYWxzZSwgMik7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIlx0fSIpOwotCX0KLQlyZXR1cm4gZ2VuRmFpbFRhZzsKLX0KLQotdm9pZCBnZW5lcmF0ZVNldHRlcnMoSk5JTWV0aG9kIG1ldGhvZCwgSk5JUGFyYW1ldGVyW10gcGFyYW1zKSB7Ci0JaW50IGNyaXRpY2FsQ291bnQgPSAwOwotCWZvciAoaW50IGkgPSBwYXJhbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJSk5JUGFyYW1ldGVyIHBhcmFtID0gcGFyYW1zW2ldOwotCQlpZiAoaXNDcml0aWNhbChwYXJhbSkpIHsKLQkJCWNyaXRpY2FsQ291bnQrKzsKLQkJfQotCX0KLQlpZiAoY3JpdGljYWxDb3VudCAhPSAwKSB7Ci0JCW91dHB1dGxuKCIjaWZkZWYgSk5JX1ZFUlNJT05fMV8yIik7Ci0JCW91dHB1dGxuKCJcdGlmIChJU19KTklfMV8yKSB7Iik7Ci0JCWZvciAoaW50IGkgPSBwYXJhbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCUpOSVBhcmFtZXRlciBwYXJhbSA9IHBhcmFtc1tpXTsKLQkJCWlmIChpc0NyaXRpY2FsKHBhcmFtKSkgewotCQkJCW91dHB1dCgiXHQiKTsKLQkJCQlnZW5lcmF0ZVNldFBhcmFtZXRlcihwYXJhbSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIlx0fSBlbHNlIik7Ci0JCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJb3V0cHV0bG4oIlx0eyIpOwotCQlmb3IgKGludCBpID0gcGFyYW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlKTklQYXJhbWV0ZXIgcGFyYW0gPSBwYXJhbXNbaV07Ci0JCQlpZiAoaXNDcml0aWNhbChwYXJhbSkpIHsKLQkJCQlvdXRwdXQoIlx0Iik7Ci0JCQkJZ2VuZXJhdGVTZXRQYXJhbWV0ZXIocGFyYW0sIGZhbHNlKTsKLQkJCX0KLQkJfQotCQlvdXRwdXRsbigiXHR9Iik7Ci0JfQotCWZvciAoaW50IGkgPSBwYXJhbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJSk5JUGFyYW1ldGVyIHBhcmFtID0gcGFyYW1zW2ldOwotCQlpZiAoIWlzQ3JpdGljYWwocGFyYW0pKSB7Ci0JCQlnZW5lcmF0ZVNldFBhcmFtZXRlcihwYXJhbSwgZmFsc2UpOwotCQl9Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlRHluYW1pY0Z1bmN0aW9uQ2FsbChKTklNZXRob2QgbWV0aG9kLCBKTklQYXJhbWV0ZXJbXSBwYXJhbXMsIEpOSVR5cGUgcmV0dXJuVHlwZSwgSk5JVHlwZSByZXR1cm5UeXBlNjQsIGJvb2xlYW4gbmVlZHNSZXR1cm4pIHsKLQlvdXRwdXRsbigiLyoiKTsKLQlnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChtZXRob2QsIHBhcmFtcywgcmV0dXJuVHlwZSwgcmV0dXJuVHlwZTY0LCBuZWVkc1JldHVybik7Ci0Jb3V0cHV0bG4oIiovIik7Ci0Jb3V0cHV0bG4oIlx0eyIpOwotCi0JU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCWlmIChuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOwotCW91dHB1dCgiXHRcdExPQURfRlVOQ1RJT04oZnAsICIpOwotCW91dHB1dChuYW1lKTsKLQlvdXRwdXRsbigiKSIpOwotCW91dHB1dGxuKCJcdFx0aWYgKGZwKSB7Iik7Ci0Jb3V0cHV0KCJcdFx0Iik7Ci0JZ2VuZXJhdGVGdW5jdGlvbkNhbGxMZWZ0U2lkZShtZXRob2QsIHJldHVyblR5cGUsIHJldHVyblR5cGU2NCwgbmVlZHNSZXR1cm4pOwotCW91dHB1dCgiKCgiKTsKLQlvdXRwdXQocmV0dXJuVHlwZS5nZXRUeXBlU2lnbmF0dXJlMighcmV0dXJuVHlwZS5lcXVhbHMocmV0dXJuVHlwZTY0KSkpOwotCW91dHB1dCgiIChDQUxMSU5HX0NPTlZFTlRJT04qKSgiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQlpZiAoaSAhPSAwKSBvdXRwdXQoIiwgIik7Ci0JCUpOSVBhcmFtZXRlciBwYXJhbSA9IHBhcmFtc1tpXTsKLQkJU3RyaW5nIGNhc3QgPSBwYXJhbS5nZXRDYXN0KCk7Ci0JCWJvb2xlYW4gaXNTdHJ1Y3QgPSBwYXJhbS5nZXRGbGFnKEZMQUdfU1RSVUNUKTsKLQkJaWYgKGNhc3QubGVuZ3RoKCkgPiAyKSB7Ci0JCQljYXN0ID0gY2FzdC5zdWJzdHJpbmcoMSwgY2FzdC5sZW5ndGgoKSAtIDEpOwotCQkJaWYgKGlzU3RydWN0KSB7Ci0JCQkJaW50IGluZGV4ID0gY2FzdC5sYXN0SW5kZXhPZignKicpOwotCQkJCWlmIChpbmRleCAhPSAtMSkgY2FzdCA9IGNhc3Quc3Vic3RyaW5nKDAsIGluZGV4KS50cmltKCk7Ci0JCQl9Ci0JCQlvdXRwdXQoY2FzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlKTklUeXBlIHBhcmFtVHlwZSA9IHBhcmFtLmdldFR5cGUoKSwgcGFyYW1UeXBlNjQgPSBwYXJhbS5nZXRUeXBlNjQoKTsKLQkJCW91dHB1dChwYXJhbVR5cGUuZ2V0VHlwZVNpZ25hdHVyZTQoIXBhcmFtVHlwZS5lcXVhbHMocGFyYW1UeXBlNjQpLCBpc1N0cnVjdCkpOwotCQl9Ci0JfQotCW91dHB1dCgiKSkiKTsKLQlvdXRwdXQoImZwIik7Ci0Jb3V0cHV0KCIpIik7Ci0JZ2VuZXJhdGVGdW5jdGlvbkNhbGxSaWdodFNpZGUobWV0aG9kLCBwYXJhbXMsIDApOwotCW91dHB1dCgiOyIpOwotCW91dHB1dGxuKCk7Ci0Jb3V0cHV0bG4oIlx0XHR9Iik7Ci0Jb3V0cHV0bG4oIlx0fSIpOwotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25DYWxsTGVmdFNpZGUoSk5JTWV0aG9kIG1ldGhvZCwgSk5JVHlwZSByZXR1cm5UeXBlLCBKTklUeXBlIHJldHVyblR5cGU2NCwgYm9vbGVhbiBuZWVkc1JldHVybikgewotCW91dHB1dCgiXHQiKTsKLQlpZiAoIXJldHVyblR5cGUuaXNUeXBlKCJ2b2lkIikpIHsKLQkJaWYgKG5lZWRzUmV0dXJuKSB7Ci0JCQlvdXRwdXQoInJjID0gIik7Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXQoInJldHVybiAiKTsKLQkJfQotCQlvdXRwdXQoIigiKTsKLQkJb3V0cHV0KHJldHVyblR5cGUuZ2V0VHlwZVNpZ25hdHVyZTIoIXJldHVyblR5cGUuZXF1YWxzKHJldHVyblR5cGU2NCkpKTsKLQkJb3V0cHV0KCIpIik7Ci0JfQotCWlmIChtZXRob2QuZ2V0RmxhZyhGTEFHX0FERFJFU1MpKSB7Ci0JCW91dHB1dCgiJiIpOwotCX0JCi0JaWYgKG1ldGhvZC5nZXRGbGFnKEZMQUdfSk5JKSkgewotCQlvdXRwdXQoaXNDUFAgPyAiZW52LT4iIDogIigqZW52KS0+Iik7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25DYWxsUmlnaHRTaWRlKEpOSU1ldGhvZCBtZXRob2QsIEpOSVBhcmFtZXRlcltdIHBhcmFtcywgaW50IHBhcmFtU3RhcnQpIHsKLQlpZiAoIW1ldGhvZC5nZXRGbGFnKEZMQUdfQ09OU1QpKSB7Ci0JCW91dHB1dCgiKCIpOwotCQlpZiAobWV0aG9kLmdldEZsYWcoRkxBR19KTkkpKSB7Ci0JCQlpZiAoIWlzQ1BQKSBvdXRwdXQoImVudiwgIik7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IHBhcmFtU3RhcnQ7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJCUpOSVBhcmFtZXRlciBwYXJhbSA9IHBhcmFtc1tpXTsKLQkJCWlmIChpICE9IHBhcmFtU3RhcnQpIG91dHB1dCgiLCAiKTsKLQkJCWlmIChwYXJhbS5nZXRGbGFnKEZMQUdfU1RSVUNUKSkgb3V0cHV0KCIqIik7Ci0JCQlvdXRwdXQocGFyYW0uZ2V0Q2FzdCgpKTsKLQkJCWlmIChwYXJhbS5nZXRGbGFnKEZMQUdfR0NPQkpFQ1QpKSBvdXRwdXQoIlRPX09CSkVDVCgiKTsKLQkJCWlmIChpID09IHBhcmFtcy5sZW5ndGggLSAxICYmIHBhcmFtLmdldEZsYWcoRkxBR19TRU5USU5FTCkpIHsKLQkJCQlvdXRwdXQoIk5VTEwiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSk5JVHlwZSBwYXJhbVR5cGUgPSBwYXJhbS5nZXRUeXBlKCk7Ci0JCQkJaWYgKCFwYXJhbVR5cGUuaXNQcmltaXRpdmUoKSAmJiAhaXNTeXN0ZW1DbGFzcyhwYXJhbVR5cGUpKSBvdXRwdXQoImxwIik7Ci0JCQkJb3V0cHV0KCJhcmciICsgaSk7Ci0JCQl9Ci0JCQlpZiAocGFyYW0uZ2V0RmxhZyhGTEFHX0dDT0JKRUNUKSkgb3V0cHV0KCIpIik7Ci0JCX0KLQkJb3V0cHV0KCIpIik7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25DYWxsKEpOSU1ldGhvZCBtZXRob2QsIEpOSVBhcmFtZXRlcltdIHBhcmFtcywgSk5JVHlwZSByZXR1cm5UeXBlLCBKTklUeXBlIHJldHVyblR5cGU2NCwgYm9vbGVhbiBuZWVkc1JldHVybikgewotCVN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQlTdHJpbmcgY29weSA9IChTdHJpbmcpbWV0aG9kLmdldFBhcmFtKCJjb3B5Iik7Ci0JYm9vbGVhbiBtYWtlQ29weSA9IGNvcHkubGVuZ3RoKCkgIT0gMCAmJiBpc0NQUCAmJiAhcmV0dXJuVHlwZS5pc1R5cGUoInZvaWQiKTsKLQlpZiAobWFrZUNvcHkpIHsKLQkJb3V0cHV0KCJcdCIpOwotCQlvdXRwdXQoY29weSk7Ci0JCW91dHB1dCgiIHRlbXAgPSAiKTsKLQl9IGVsc2UgewotCQlnZW5lcmF0ZUZ1bmN0aW9uQ2FsbExlZnRTaWRlKG1ldGhvZCwgcmV0dXJuVHlwZSwgcmV0dXJuVHlwZTY0LCBuZWVkc1JldHVybik7Ci0JfQotCWludCBwYXJhbVN0YXJ0ID0gMDsKLQlpZiAobmFtZS5zdGFydHNXaXRoKCJfIikpIG5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKLQotCWJvb2xlYW4gb2JqY19zdHJ1Y3QgPSBmYWxzZTsKLQlpZiAobmFtZS5lcXVhbHMoIm9iamNfbXNnU2VuZF9zdHJldCIpIHx8IG5hbWUuZXF1YWxzKCJvYmpjX21zZ1NlbmRTdXBlcl9zdHJldCIpKSBvYmpjX3N0cnVjdCA9IHRydWU7Ci0JaWYgKG9iamNfc3RydWN0KSB7Ci0JCW91dHB1dGxuKCJpZiAoc2l6ZW9mKF9hcmcwKSA+IFNUUlVDVF9TSVpFX0xJTUlUKSB7Iik7Ci0JCWdlbmVyYXRlX29iamNfbXNnU2VuZF9zdHJldCAobWV0aG9kLCBwYXJhbXMsIG5hbWUpOwotCQlwYXJhbVN0YXJ0ID0gMTsKLQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiY2FsbCIpKSB7Ci0JCW91dHB1dCgiKCIpOwotCQlTdHJpbmcgY2FzdCA9IHBhcmFtc1swXS5nZXRDYXN0KCk7IAotCQlpZiAoY2FzdC5sZW5ndGgoKSAhPSAwICYmICFjYXN0LmVxdWFscygiKCkiKSkgewotCQkJb3V0cHV0KGNhc3QpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KCIoIik7Ci0JCQlvdXRwdXQocmV0dXJuVHlwZS5nZXRUeXBlU2lnbmF0dXJlMighcmV0dXJuVHlwZS5lcXVhbHMocmV0dXJuVHlwZTY0KSkpOwotCQkJb3V0cHV0KCIgKCopKCkpIik7Ci0JCX0KLQkJb3V0cHV0KCJhcmcwKSIpOwotCQlwYXJhbVN0YXJ0ID0gMTsKLQl9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiVnRibENhbGwiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoIl9WdGJsQ2FsbCIpKSB7Ci0JCW91dHB1dCgiKCgiKTsKLQkJb3V0cHV0KHJldHVyblR5cGUuZ2V0VHlwZVNpZ25hdHVyZTIoIXJldHVyblR5cGUuZXF1YWxzKHJldHVyblR5cGU2NCkpKTsKLQkJb3V0cHV0KCIgKFNURE1FVEhPRENBTExUWVBFICopKCIpOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMSkgb3V0cHV0KCIsICIpOwotCQkJSk5JUGFyYW1ldGVyIHBhcmFtID0gcGFyYW1zW2ldOwotCQkJSk5JVHlwZSBwYXJhbVR5cGUgPSBwYXJhbS5nZXRUeXBlKCksIHBhcmFtVHlwZTY0ID0gcGFyYW0uZ2V0VHlwZTY0KCk7Ci0JCQlvdXRwdXQocGFyYW1UeXBlLmdldFR5cGVTaWduYXR1cmU0KCFwYXJhbVR5cGUuZXF1YWxzKHBhcmFtVHlwZTY0KSwgZmFsc2UpKTsKLQkJfQotCQlvdXRwdXQoIikpKCooIik7Ci0JCUpOSVR5cGUgcGFyYW1UeXBlID0gcGFyYW1zWzFdLmdldFR5cGUoKSwgcGFyYW1UeXBlNjQgPSBwYXJhbXNbMV0uZ2V0VHlwZTY0KCk7Ci0JCW91dHB1dChwYXJhbVR5cGUuZ2V0VHlwZVNpZ25hdHVyZTQoIXBhcmFtVHlwZS5lcXVhbHMocGFyYW1UeXBlNjQpLCBmYWxzZSkpOwotCQlvdXRwdXQoIiAqKilhcmcxKVthcmcwXSkiKTsKLQkJcGFyYW1TdGFydCA9IDE7Ci0JfSBlbHNlIGlmIChtZXRob2QuZ2V0RmxhZyhGTEFHX0NQUCkgfHwgbWV0aG9kLmdldEZsYWcoRkxBR19TRVRURVIpIHx8IG1ldGhvZC5nZXRGbGFnKEZMQUdfR0VUVEVSKSB8fCBtZXRob2QuZ2V0RmxhZyhGTEFHX0FEREVSKSkgewotCQlpZiAobWV0aG9kLmdldEZsYWcoRkxBR19HQ09CSkVDVCkpIHsKLQkJCW91dHB1dCgiVE9fSEFORExFKCIpOwotCQl9Ci0JCW91dHB1dCgiKCIpOwotCQlKTklQYXJhbWV0ZXIgcGFyYW0gPSBwYXJhbXNbMF07Ci0JCWlmIChwYXJhbS5nZXRGbGFnKEZMQUdfU1RSVUNUKSkgb3V0cHV0KCIqIik7Ci0JCVN0cmluZyBjYXN0ID0gcGFyYW0uZ2V0Q2FzdCgpOyAKLQkJaWYgKGNhc3QubGVuZ3RoKCkgIT0gMCAmJiAhY2FzdC5lcXVhbHMoIigpIikpIHsKLQkJCW91dHB1dChjYXN0KTsKLQkJfQotCQlpZiAocGFyYW0uZ2V0RmxhZyhGTEFHX0dDT0JKRUNUKSkgewotCQkJb3V0cHV0KCJUT19PQkpFQ1QoIik7Ci0JCX0KLQkJb3V0cHV0KCJhcmcwIik7Ci0JCWlmIChwYXJhbS5nZXRGbGFnKEZMQUdfR0NPQkpFQ1QpKSB7Ci0JCQlvdXRwdXQoIikiKTsKLQkJfQotCQlvdXRwdXQoIiktPiIpOwotCQlTdHJpbmcgYWNjZXNzb3IgPSBtZXRob2QuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yLmxlbmd0aCgpICE9IDApIHsKLQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgaW5kZXggPSAtMTsKLQkJCWlmICgoaW5kZXggPSBuYW1lLmluZGV4T2YoJ18nKSkgIT0gLTEpIHsKLQkJCQlvdXRwdXQobmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBuYW1lLmxlbmd0aCgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dChuYW1lKTsKLQkJCX0KLQkJfQotCQlwYXJhbVN0YXJ0ID0gMTsKLQl9IGVsc2UgaWYgKG1ldGhvZC5nZXRGbGFnKEZMQUdfR0NORVcpKSB7Ci0JCW91dHB1dCgiVE9fSEFORExFKGdjbmV3ICIpOwotCQlTdHJpbmcgYWNjZXNzb3IgPSBtZXRob2QuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yLmxlbmd0aCgpICE9IDApIHsKLQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgaW5kZXggPSAtMTsKLQkJCWlmICgoaW5kZXggPSBuYW1lLmluZGV4T2YoJ18nKSkgIT0gLTEpIHsKLQkJCQlvdXRwdXQobmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dChuYW1lKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAobWV0aG9kLmdldEZsYWcoRkxBR19ORVcpKSB7Ci0JCW91dHB1dCgibmV3ICIpOwotCQlTdHJpbmcgYWNjZXNzb3IgPSBtZXRob2QuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yLmxlbmd0aCgpICE9IDApIHsKLQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgaW5kZXggPSAtMTsKLQkJCWlmICgoaW5kZXggPSBuYW1lLmluZGV4T2YoJ18nKSkgIT0gLTEpIHsKLQkJCQlvdXRwdXQobmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KG5hbWUpOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChtZXRob2QuZ2V0RmxhZyhGTEFHX0RFTEVURSkpIHsKLQkJb3V0cHV0KCJkZWxldGUgIik7Ci0JCUpOSVBhcmFtZXRlciBwYXJhbSA9IHBhcmFtc1swXTsKLQkJU3RyaW5nIGNhc3QgPSBwYXJhbS5nZXRDYXN0KCk7IAotCQlpZiAoY2FzdC5sZW5ndGgoKSAhPSAwICYmICFjYXN0LmVxdWFscygiKCkiKSkgewotCQkJb3V0cHV0KGNhc3QpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KCIoIik7Ci0JCQlvdXRwdXQobmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5pbmRleE9mKCJfIikpKTsKLQkJCW91dHB1dCgiICopIik7Ci0JCX0KLQkJb3V0cHV0bG4oImFyZzA7Iik7Ci0JCXJldHVybjsKLQl9IGVsc2UgewotCQlpZiAobWV0aG9kLmdldEZsYWcoRkxBR19HQ09CSkVDVCkpIHsKLQkJCW91dHB1dCgiVE9fSEFORExFKCIpOwkJCQkKLQkJfQotCQlpZiAobWV0aG9kLmdldEZsYWcoRmxhZ3MuRkxBR19DQVNUKSkgewotCQkJb3V0cHV0KCIoKCIpOwotCQkJU3RyaW5nIHJldHVybkNhc3QgPSByZXR1cm5UeXBlLmdldFR5cGVTaWduYXR1cmUyKCFyZXR1cm5UeXBlLmVxdWFscyhyZXR1cm5UeXBlNjQpKTsKLQkJCWlmIChuYW1lLmVxdWFscygib2JqY19tc2dTZW5kX2Jvb2wiKSAmJiByZXR1cm5DYXN0LmVxdWFscygiamJvb2xlYW4iKSkgewotCQkJCXJldHVybkNhc3QgPSAiQk9PTCI7Ci0JCQl9Ci0JCQlvdXRwdXQocmV0dXJuQ2FzdCk7Ci0JCQlvdXRwdXQoIiAoKikoIik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApIG91dHB1dCgiLCAiKTsKLQkJCQlKTklQYXJhbWV0ZXIgcGFyYW0gPSBwYXJhbXNbaV07Ci0JCQkJU3RyaW5nIGNhc3QgPSBwYXJhbS5nZXRDYXN0KCk7Ci0JCQkJaWYgKGNhc3QgIT0gbnVsbCAmJiBjYXN0Lmxlbmd0aCgpICE9IDApIHsKLQkJCQkJaWYgKGNhc3Quc3RhcnRzV2l0aCgiKCIpKSBjYXN0ID0gY2FzdC5zdWJzdHJpbmcoMSk7Ci0JCQkJCWlmIChjYXN0LmVuZHNXaXRoKCIpIikpIGNhc3QgPSBjYXN0LnN1YnN0cmluZygwLCBjYXN0Lmxlbmd0aCgpIC0gMSk7Ci0JCQkJCW91dHB1dChjYXN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlKTklUeXBlIHBhcmFtVHlwZSA9IHBhcmFtLmdldFR5cGUoKSwgcGFyYW1UeXBlNjQgPSBwYXJhbS5nZXRUeXBlNjQoKTsKLQkJCQkJaWYgKCEocGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgfHwgcGFyYW1UeXBlLmlzQXJyYXkoKSkpIHsKLQkJCQkJCWlmIChwYXJhbS5nZXRUeXBlQ2xhc3MoKS5nZXRGbGFnKEZMQUdfU1RSVUNUKSkgewotCQkJCQkJCW91dHB1dCgic3RydWN0ICIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW91dHB1dChwYXJhbVR5cGUuZ2V0VHlwZVNpZ25hdHVyZTQoIXBhcmFtVHlwZS5lcXVhbHMocGFyYW1UeXBlNjQpLCBwYXJhbS5nZXRGbGFnKEZMQUdfU1RSVUNUKSkpOwotCQkJCX0KLQkJCX0KLQkJCW91dHB1dCgiKSkiKTsKLQkJfQotCQlTdHJpbmcgYWNjZXNzb3IgPSBtZXRob2QuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yLmxlbmd0aCgpICE9IDApIHsKLQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXQobmFtZSk7Ci0JCX0KLQkJaWYgKG1ldGhvZC5nZXRGbGFnKEZsYWdzLkZMQUdfQ0FTVCkpIHsKLQkJCW91dHB1dCgiKSIpOwotCQl9Ci0JfQotCWlmICgobWV0aG9kLmdldEZsYWcoRkxBR19TRVRURVIpICYmIHBhcmFtcy5sZW5ndGggPT0gMykgfHwgKG1ldGhvZC5nZXRGbGFnKEZMQUdfR0VUVEVSKSAmJiBwYXJhbXMubGVuZ3RoID09IDIpKSB7Ci0JCW91dHB1dCgiW2FyZzFdIik7Ci0JCXBhcmFtU3RhcnQrKzsKLQl9Ci0JaWYgKG1ldGhvZC5nZXRGbGFnKEZMQUdfU0VUVEVSKSkgb3V0cHV0KCIgPSAiKTsKLQlpZiAobWV0aG9kLmdldEZsYWcoRkxBR19BRERFUikpIG91dHB1dCgiICs9ICIpOwotCWlmICghbWV0aG9kLmdldEZsYWcoRkxBR19HRVRURVIpKSB7Ci0JCWdlbmVyYXRlRnVuY3Rpb25DYWxsUmlnaHRTaWRlKG1ldGhvZCwgcGFyYW1zLCBwYXJhbVN0YXJ0KTsKLQl9Ci0JaWYgKG1ldGhvZC5nZXRGbGFnKEZMQUdfR0NORVcpIHx8IG1ldGhvZC5nZXRGbGFnKEZMQUdfR0NPQkpFQ1QpKSB7Ci0JCW91dHB1dCgiKSIpOwotCX0KLQlvdXRwdXQoIjsiKTsKLQlvdXRwdXRsbigpOwotCWlmIChtYWtlQ29weSkgewotCQlvdXRwdXRsbigiXHR7Iik7Ci0JCW91dHB1dCgiXHRcdCIpOwotCQlvdXRwdXQoY29weSk7Ci0JCW91dHB1dCgiKiBjb3B5ID0gbmV3ICIpOwotCQlvdXRwdXQoY29weSk7Ci0JCW91dHB1dGxuKCIoKTsiKTsKLQkJb3V0cHV0bG4oIlx0XHQqY29weSA9IHRlbXA7Iik7Ci0JCW91dHB1dCgiXHRcdHJjID0gIik7Ci0JCW91dHB1dCgiKCIpOwotCQlvdXRwdXQocmV0dXJuVHlwZS5nZXRUeXBlU2lnbmF0dXJlMighcmV0dXJuVHlwZS5lcXVhbHMocmV0dXJuVHlwZTY0KSkpOwotCQlvdXRwdXQoIikiKTsKLQkJb3V0cHV0bG4oImNvcHk7Iik7Ci0JCW91dHB1dGxuKCJcdH0iKTsKLQl9Ci0JaWYgKG9iamNfc3RydWN0KSB7Ci0JCW91dHB1dGxuKCJcdH0gZWxzZSB7Iik7Ci0JCWdlbmVyYXRlX29iamNfbXNnU2VuZF9zdHJldCAobWV0aG9kLCBwYXJhbXMsIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAiX3N0cmV0Ii5sZW5ndGgoKSkpOwotCQlnZW5lcmF0ZUZ1bmN0aW9uQ2FsbFJpZ2h0U2lkZShtZXRob2QsIHBhcmFtcywgMSk7Ci0JCW91dHB1dGxuKCI7Iik7Ci0JCW91dHB1dGxuKCJcdH0iKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVfb2JqY19tc2dTZW5kX3N0cmV0IChKTklNZXRob2QgbWV0aG9kLCBKTklQYXJhbWV0ZXJbXSBwYXJhbXMsIFN0cmluZyBmdW5jKSB7Ci0Jb3V0cHV0KCJcdFx0KmxwYXJnMCA9ICgqKCIpOwotCUpOSVR5cGUgcGFyYW1UeXBlID0gcGFyYW1zWzBdLmdldFR5cGUoKSwgcGFyYW1UeXBlNjQgPSBwYXJhbXNbMF0uZ2V0VHlwZTY0KCk7Ci0Jb3V0cHV0KHBhcmFtVHlwZS5nZXRUeXBlU2lnbmF0dXJlNCghcGFyYW1UeXBlLmVxdWFscyhwYXJhbVR5cGU2NCksIHRydWUpKTsKLQlvdXRwdXQoIiAoKikoIik7Ci0JZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgIT0gMSkgb3V0cHV0KCIsICIpOwotCQlKTklQYXJhbWV0ZXIgcGFyYW0gPSBwYXJhbXNbaV07Ci0JCVN0cmluZyBjYXN0ID0gcGFyYW0uZ2V0Q2FzdCgpOwotCQlpZiAoY2FzdCAhPSBudWxsICYmIGNhc3QubGVuZ3RoKCkgIT0gMCkgewotCQkJaWYgKGNhc3Quc3RhcnRzV2l0aCgiKCIpKSBjYXN0ID0gY2FzdC5zdWJzdHJpbmcoMSk7Ci0JCQlpZiAoY2FzdC5lbmRzV2l0aCgiKSIpKSBjYXN0ID0gY2FzdC5zdWJzdHJpbmcoMCwgY2FzdC5sZW5ndGgoKSAtIDEpOwotCQkJb3V0cHV0KGNhc3QpOwotCQl9IGVsc2UgewotCQkJcGFyYW1UeXBlID0gcGFyYW0uZ2V0VHlwZSgpOyBwYXJhbVR5cGU2NCA9IHBhcmFtLmdldFR5cGU2NCgpOwotCQkJaWYgKCEocGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgfHwgcGFyYW1UeXBlLmlzQXJyYXkoKSkpIHsKLQkJCQlpZiAocGFyYW0uZ2V0VHlwZUNsYXNzKCkuZ2V0RmxhZyhGTEFHX1NUUlVDVCkpIHsKLQkJCQkJb3V0cHV0KCJzdHJ1Y3QgIik7Ci0JCQkJfQotCQkJfQotCQkJb3V0cHV0KHBhcmFtVHlwZS5nZXRUeXBlU2lnbmF0dXJlNCghcGFyYW1UeXBlLmVxdWFscyhwYXJhbVR5cGU2NCksIHBhcmFtLmdldEZsYWcoRkxBR19TVFJVQ1QpKSk7Ci0JCX0KLQl9Ci0Jb3V0cHV0KCIpKSIpOwotCW91dHB1dChmdW5jKTsKLQlvdXRwdXQoIikiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVJldHVybihKTklNZXRob2QgbWV0aG9kLCBKTklUeXBlIHJldHVyblR5cGUsIGJvb2xlYW4gbmVlZHNSZXR1cm4pIHsKLQlpZiAobmVlZHNSZXR1cm4gJiYgIXJldHVyblR5cGUuaXNUeXBlKCJ2b2lkIikpIHsKLQkJb3V0cHV0bG4oIlx0cmV0dXJuIHJjOyIpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZU1lbW1vdmUoSk5JTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGZ1bmN0aW9uLCBTdHJpbmcgZnVuY3Rpb242NCwgSk5JUGFyYW1ldGVyW10gcGFyYW1zKSB7Ci0JZ2VuZXJhdGVFbnRlckV4aXRNYWNybyhtZXRob2QsIGZ1bmN0aW9uLCBmdW5jdGlvbjY0LCB0cnVlKTsKLQlvdXRwdXQoIlx0Iik7Ci0JYm9vbGVhbiBnZXQgPSBwYXJhbXNbMF0uZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCk7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IHBhcmFtc1tnZXQgPyAxIDogMF0uZ2V0VHlwZSgpLmdldFNpbXBsZU5hbWUoKTsKLQlvdXRwdXQoZ2V0ID8gImlmIChhcmcxKSBnZXQiIDogImlmIChhcmcwKSBzZXQiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXQoZ2V0ID8gIkZpZWxkcyhlbnYsIGFyZzEsICgiIDogIkZpZWxkcyhlbnYsIGFyZzAsICgiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXQoZ2V0ID8gIiAqKWFyZzApIiA6ICIgKilhcmcxKSIpOwotCW91dHB1dGxuKCI7Iik7Ci0JZ2VuZXJhdGVFbnRlckV4aXRNYWNybyhtZXRob2QsIGZ1bmN0aW9uLCBmdW5jdGlvbjY0LCBmYWxzZSk7CQotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25Cb2R5KEpOSU1ldGhvZCBtZXRob2QsIFN0cmluZyBmdW5jdGlvbiwgU3RyaW5nIGZ1bmN0aW9uNjQsIEpOSVBhcmFtZXRlcltdIHBhcmFtcywgSk5JVHlwZSByZXR1cm5UeXBlLCBKTklUeXBlIHJldHVyblR5cGU2NCkgewotCW91dHB1dGxuKCJ7Iik7Ci0JCi0JLyogQ3VzdG9tIEdUSyBtZW1tb3Zlcy4gKi8KLQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JaWYgKG5hbWUuc3RhcnRzV2l0aCgiXyIpKSBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JYm9vbGVhbiBpc01lbW92ZSA9IChuYW1lLmVxdWFscygibWVtbW92ZSIpIHx8IG5hbWUuZXF1YWxzKCJNb3ZlTWVtb3J5IikpICYmIHBhcmFtcy5sZW5ndGggPT0gMiAmJiByZXR1cm5UeXBlLmlzVHlwZSgidm9pZCIpOwotCWlmIChpc01lbW92ZSkgewotCQlnZW5lcmF0ZU1lbW1vdmUobWV0aG9kLCBmdW5jdGlvbiwgZnVuY3Rpb242NCwgcGFyYW1zKTsKLQl9IGVsc2UgewotCQlib29sZWFuIG5lZWRzUmV0dXJuID0gZ2VuZXJhdGVMb2NhbFZhcnMobWV0aG9kLCBwYXJhbXMsIHJldHVyblR5cGUsIHJldHVyblR5cGU2NCk7Ci0JCWdlbmVyYXRlRW50ZXJFeGl0TWFjcm8obWV0aG9kLCBmdW5jdGlvbiwgZnVuY3Rpb242NCwgdHJ1ZSk7Ci0JCWJvb2xlYW4gZ2VuRmFpbFRhZyA9IGdlbmVyYXRlR2V0dGVycyhtZXRob2QsIHBhcmFtcyk7Ci0JCWlmIChtZXRob2QuZ2V0RmxhZyhGTEFHX0RZTkFNSUMpKSB7Ci0JCQlnZW5lcmF0ZUR5bmFtaWNGdW5jdGlvbkNhbGwobWV0aG9kLCBwYXJhbXMsIHJldHVyblR5cGUsIHJldHVyblR5cGU2NCwgbmVlZHNSZXR1cm4pOwotCQl9IGVsc2UgewotCQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGwobWV0aG9kLCBwYXJhbXMsIHJldHVyblR5cGUsIHJldHVyblR5cGU2NCwgbmVlZHNSZXR1cm4pOwotCQl9Ci0JCWlmIChnZW5GYWlsVGFnKSBvdXRwdXRsbigiZmFpbDoiKTsKLQkJZ2VuZXJhdGVTZXR0ZXJzKG1ldGhvZCwgcGFyYW1zKTsKLQkJZ2VuZXJhdGVFbnRlckV4aXRNYWNybyhtZXRob2QsIGZ1bmN0aW9uLCBmdW5jdGlvbjY0LCBmYWxzZSk7Ci0JCWdlbmVyYXRlUmV0dXJuKG1ldGhvZCwgcmV0dXJuVHlwZSwgbmVlZHNSZXR1cm4pOwotCX0KLQkKLQlvdXRwdXRsbigifSIpOwotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25Qcm90b3R5cGUoSk5JTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGZ1bmN0aW9uLCBKTklQYXJhbWV0ZXJbXSBwYXJhbXMsIEpOSVR5cGUgcmV0dXJuVHlwZSwgSk5JVHlwZSByZXR1cm5UeXBlNjQsIGJvb2xlYW4gc2luZ2xlTGluZSkgewotCW91dHB1dCgiSk5JRVhQT1JUICIpOwotCW91dHB1dChyZXR1cm5UeXBlLmdldFR5cGVTaWduYXR1cmUyKCFyZXR1cm5UeXBlLmVxdWFscyhyZXR1cm5UeXBlNjQpKSk7Ci0Jb3V0cHV0KCIgSk5JQ0FMTCAiKTsKLQlvdXRwdXQobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQlvdXRwdXQoIl9OQVRJVkUoIik7Ci0Jb3V0cHV0KGZ1bmN0aW9uKTsKLQlpZiAoc2luZ2xlTGluZSkgewotCQlvdXRwdXQoIikiKTsKLQkJb3V0cHV0KCIoSk5JRW52ICplbnYsICIpOwotCX0gZWxzZSB7Ci0JCW91dHB1dGxuKCIpIik7Ci0JCW91dHB1dCgiXHQoSk5JRW52ICplbnYsICIpOwotCX0KLQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCkgewotCQlvdXRwdXQoImpjbGFzcyIpOwotCX0gZWxzZSB7Ci0JCW91dHB1dCgiam9iamVjdCIpOwotCX0KLQlvdXRwdXQoIiB0aGF0Iik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJb3V0cHV0KCIsICIpOwotCQlKTklUeXBlIHBhcmFtVHlwZSA9IHBhcmFtc1tpXS5nZXRUeXBlKCksIHBhcmFtVHlwZTY0ID0gcGFyYW1zW2ldLmdldFR5cGU2NCgpOwotCQlvdXRwdXQocGFyYW1UeXBlLmdldFR5cGVTaWduYXR1cmUyKCFwYXJhbVR5cGUuZXF1YWxzKHBhcmFtVHlwZTY0KSkpOwotCQlvdXRwdXQoIiBhcmciICsgaSk7Ci0JfQotCW91dHB1dCgiKSIpOwotCWlmICghc2luZ2xlTGluZSkgb3V0cHV0bG4oKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVNvdXJjZVN0YXJ0KFN0cmluZyBmdW5jdGlvbiwgU3RyaW5nIGZ1bmN0aW9uNjQpIHsKLQlpZiAoZnVuY3Rpb24uZXF1YWxzKGZ1bmN0aW9uNjQpKSB7Ci0JCW91dHB1dCgiI2lmbmRlZiBOT18iKTsKLQkJb3V0cHV0bG4oZnVuY3Rpb24pOwotCX0gZWxzZSB7Ci0JCW91dHB1dCgiI2lmICghZGVmaW5lZChOT18iKTsKLQkJb3V0cHV0KGZ1bmN0aW9uKTsKLQkJb3V0cHV0KCIpICYmICFkZWZpbmVkKCIpOwotCQlvdXRwdXQoSk5JNjQpOwotCQlvdXRwdXQoIikpIHx8ICghZGVmaW5lZChOT18iKTsKLQkJb3V0cHV0KGZ1bmN0aW9uNjQpOwotCQlvdXRwdXQoIikgJiYgZGVmaW5lZCgiKTsKLQkJb3V0cHV0KEpOSTY0KTsKLQkJb3V0cHV0bG4oIikpIik7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlU291cmNlRW5kKFN0cmluZyBmdW5jdGlvbikgewotCW91dHB1dGxuKCIjZW5kaWYiKTsKLX0KLQotYm9vbGVhbiBpc0NyaXRpY2FsKEpOSVBhcmFtZXRlciBwYXJhbSkgewotCUpOSVR5cGUgcGFyYW1UeXBlID0gcGFyYW0uZ2V0VHlwZSgpOwotCXJldHVybiBwYXJhbVR5cGUuaXNBcnJheSgpICYmIHBhcmFtVHlwZS5nZXRDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKSAmJiBwYXJhbS5nZXRGbGFnKEZMQUdfQ1JJVElDQUwpOwotfQotCi1ib29sZWFuIGlzU3lzdGVtQ2xhc3MoSk5JVHlwZSB0eXBlKSB7Ci0JcmV0dXJuIHR5cGUuaXNUeXBlKCJqYXZhLmxhbmcuT2JqZWN0IikgfHwgdHlwZS5pc1R5cGUoImphdmEubGFuZy5DbGFzcyIpIDsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1Byb2dyZXNzTW9uaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1Byb2dyZXNzTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzRjZjc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Qcm9ncmVzc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvZ3Jlc3NNb25pdG9yIHsKLQotcHVibGljIHZvaWQgc2V0VG90YWwoaW50IHRvdGFsKTsKLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpOwotcHVibGljIHZvaWQgc3RlcCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUmVmbGVjdENsYXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUmVmbGVjdENsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MzIxZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1JlZmxlY3RDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci0KLXB1YmxpYyBjbGFzcyBSZWZsZWN0Q2xhc3MgZXh0ZW5kcyBSZWZsZWN0SXRlbSBpbXBsZW1lbnRzIEpOSUNsYXNzIHsKLQlDbGFzcyBjbGF6ejsKLQlSZWZsZWN0RmllbGRbXSBmaWVsZHM7Ci0JUmVmbGVjdE1ldGhvZFtdIG1ldGhvZHM7Ci0JTWV0YURhdGEgbWV0YURhdGE7Ci0JU3RyaW5nIHNvdXJjZVBhdGg7Ci0KLXB1YmxpYyBSZWZsZWN0Q2xhc3MoQ2xhc3MgY2xhenopIHsKLQl0aGlzKGNsYXp6LCBudWxsLCBudWxsKTsKLX0KLQotcHVibGljIFJlZmxlY3RDbGFzcyhDbGFzcyBjbGF6eiwgTWV0YURhdGEgZGF0YSwgU3RyaW5nIHNvdXJjZVBhdGgpIHsKLQl0aGlzLmNsYXp6ID0gY2xheno7Ci0JdGhpcy5tZXRhRGF0YSA9IGRhdGE7Ci0JdGhpcy5zb3VyY2VQYXRoID0gc291cmNlUGF0aDsKLX0KLQotdm9pZCBjaGVja01lbWJlcnMoKSB7Ci0JaWYgKGZpZWxkcyAhPSBudWxsKSByZXR1cm47Ci0JU3RyaW5nIHNvdXJjZSA9IG51bGw7Ci0JQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBudWxsOwotCWlmIChKTklJdGVtLkdFTjY0KSB7Ci0JCXNvdXJjZSA9IEpOSUdlbmVyYXRvci5sb2FkRmlsZShzb3VyY2VQYXRoKTsKLQkJQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotCQlwYXJzZXIuc2V0U291cmNlKHNvdXJjZS50b0NoYXJBcnJheSgpKTsKLQkJdW5pdCA9IChDb21waWxhdGlvblVuaXQpcGFyc2VyLmNyZWF0ZUFTVChudWxsKTsKLQl9Ci0JRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwotCXRoaXMuZmllbGRzID0gbmV3IFJlZmxlY3RGaWVsZFtmaWVsZHMubGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQl0aGlzLmZpZWxkc1tpXSA9IG5ldyBSZWZsZWN0RmllbGQodGhpcywgZmllbGRzW2ldLCBzb3VyY2UsIHVuaXQpOwotCX0KLQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JdGhpcy5tZXRob2RzID0gbmV3IFJlZmxlY3RNZXRob2RbbWV0aG9kcy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQl0aGlzLm1ldGhvZHNbaV0gPSBuZXcgUmVmbGVjdE1ldGhvZCh0aGlzLCBtZXRob2RzW2ldLCBzb3VyY2UsIHVuaXQpOwotCX0KLX0KLQotcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQlyZXR1cm4gY2xhenouaGFzaENvZGUoKTsKLX0KLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQlpZiAoIShvYmogaW5zdGFuY2VvZiBSZWZsZWN0Q2xhc3MpKSByZXR1cm4gZmFsc2U7Ci0JcmV0dXJuICgoUmVmbGVjdENsYXNzKW9iaikuY2xhenouZXF1YWxzKGNsYXp6KTsKLX0KLQotcHVibGljIEpOSUZpZWxkW10gZ2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0JY2hlY2tNZW1iZXJzKCk7Ci0JSk5JRmllbGRbXSByZXN1bHQgPSBuZXcgSk5JRmllbGRbZmllbGRzLmxlbmd0aF07Ci0JU3lzdGVtLmFycmF5Y29weShmaWVsZHMsIDAsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotcHVibGljIEpOSU1ldGhvZFtdIGdldERlY2xhcmVkTWV0aG9kcygpIHsKLQljaGVja01lbWJlcnMoKTsKLQlKTklNZXRob2RbXSByZXN1bHQgPSBuZXcgSk5JTWV0aG9kW21ldGhvZHMubGVuZ3RoXTsKLQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZHMsIDAsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCXJldHVybiBjbGF6ei5nZXROYW1lKCk7Ci19Ci0KLXB1YmxpYyBKTklDbGFzcyBnZXRTdXBlcmNsYXNzKCkgewotCUNsYXNzIHN1cGVyY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JU3RyaW5nIHBhdGggPSBuZXcgRmlsZShzb3VyY2VQYXRoKS5nZXRQYXJlbnQoKSArICIvIiArIGdldFNpbXBsZU5hbWUoc3VwZXJjbGF6eikgKyAiLmphdmEiOwotCXJldHVybiBuZXcgUmVmbGVjdENsYXNzKHN1cGVyY2xhenosIG1ldGFEYXRhLCBwYXRoKTsKLX0KLQotU3RyaW5nIGdldFNpbXBsZU5hbWUoQ2xhc3MgdHlwZSkgewotCVN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0JaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpICsgMTsKLQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoaW5kZXgsIG5hbWUubGVuZ3RoKCkpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoKSB7Ci0JcmV0dXJuIGdldFNpbXBsZU5hbWUoY2xhenopOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldEV4Y2x1ZGUoKSB7Ci0JcmV0dXJuIChTdHJpbmcpZ2V0UGFyYW0oImV4Y2x1ZGUiKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YSgpIHsKLQlTdHJpbmcga2V5ID0gSk5JR2VuZXJhdG9yLnRvQyhjbGF6ei5nZXROYW1lKCkpOwotCXJldHVybiBtZXRhRGF0YS5nZXRNZXRhRGF0YShrZXksICIiKTsKLX0KLQotcHVibGljIHZvaWQgc2V0RXhjbHVkZShTdHJpbmcgc3RyKSB7IAotCXNldFBhcmFtKCJleGNsdWRlIiwgc3RyKTsKLX0KLQotcHVibGljIHZvaWQgc2V0TWV0YURhdGEoU3RyaW5nIHZhbHVlKSB7Ci0JU3RyaW5nIGtleSA9IEpOSUdlbmVyYXRvci50b0MoY2xhenouZ2V0TmFtZSgpKTsKLQltZXRhRGF0YS5zZXRNZXRhRGF0YShrZXksIHZhbHVlKTsKLX0KLQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gY2xhenoudG9TdHJpbmcoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1JlZmxlY3RGaWVsZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1JlZmxlY3RGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTA2NjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9SZWZsZWN0RmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgUmVmbGVjdEZpZWxkIGV4dGVuZHMgUmVmbGVjdEl0ZW0gaW1wbGVtZW50cyBKTklGaWVsZCB7Ci0JRmllbGQgZmllbGQ7Ci0JUmVmbGVjdFR5cGUgdHlwZSwgdHlwZTY0OwotCVJlZmxlY3RDbGFzcyBkZWNsYXJpbmdDbGFzczsKLQkKLXB1YmxpYyBSZWZsZWN0RmllbGQoUmVmbGVjdENsYXNzIGRlY2xhcmluZ0NsYXNzLCBGaWVsZCBmaWVsZCwgU3RyaW5nIHNvdXJjZSwgQ29tcGlsYXRpb25Vbml0IHVuaXQpIHsKLQl0aGlzLmRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7Ci0JdGhpcy5maWVsZCA9IGZpZWxkOwotCUNsYXNzIGNsYXp6ID0gZmllbGQuZ2V0VHlwZSgpOwotCXR5cGUgPSBuZXcgUmVmbGVjdFR5cGUoY2xhenopOwotCXR5cGU2NCA9IHR5cGU7Ci0JYm9vbGVhbiBjaGFuZ2VzID0gY2FuQ2hhbmdlNjQoY2xhenopOwotCWlmIChjaGFuZ2VzICYmIG5ldyBGaWxlKGRlY2xhcmluZ0NsYXNzLnNvdXJjZVBhdGgpLmV4aXN0cygpKSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlMSA9IChUeXBlRGVjbGFyYXRpb24pdW5pdC50eXBlcygpLmdldCgwKTsKLQkJQ2xhc3MgcmVzdWx0ID0gbnVsbDsKLQkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHR5cGUxLmdldEZpZWxkcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGggJiYgcmVzdWx0ID09IG51bGw7IGkrKykgewotCQkJRmllbGREZWNsYXJhdGlvbiBub2RlID0gZmllbGRzW2ldOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vZGUuZnJhZ21lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBkZWNsID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChkZWNsLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGZpZWxkLmdldE5hbWUoKSkpIHsKLQkJCQkJU3RyaW5nIHMgPSBzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpLCBub2RlLmdldFN0YXJ0UG9zaXRpb24oKSArIG5vZGUuZ2V0TGVuZ3RoKCkpOwotCQkJCQlpZiAoY2xhenogPT0gaW50LmNsYXNzICYmIHMuaW5kZXhPZigiaW50IC8qbG9uZyovIikgIT0gLTEpIHR5cGU2NCA9IG5ldyBSZWZsZWN0VHlwZShsb25nLmNsYXNzKTsKLQkJCQkJZWxzZSBpZiAoY2xhenogPT0gZmxvYXQuY2xhc3MgJiYgcy5pbmRleE9mKCJmbG9hdCAvKmRvdWJsZSovIikgIT0gLTEpIHR5cGU2NCA9IG5ldyBSZWZsZWN0VHlwZShkb3VibGUuY2xhc3MpOwotCQkJCQllbHNlIGlmIChjbGF6eiA9PSBpbnRbXS5jbGFzcyAmJiAocy5pbmRleE9mKCJpbnQgLypsb25nKi8iKSAhPSAtMSB8fCBzLmluZGV4T2YoImludFtdIC8qbG9uZ1tdKi8iKSAhPSAtMSkpIHR5cGU2NCA9IG5ldyBSZWZsZWN0VHlwZShsb25nW10uY2xhc3MpOwotCQkJCQllbHNlIGlmIChjbGF6eiA9PSBmbG9hdFtdLmNsYXNzICYmIChzLmluZGV4T2YoImZsb2F0IC8qZG91YmxlKi8iKSAhPSAtMXx8IHMuaW5kZXhPZigiZmxvYXRbXSAvKmRvdWJsZVtdKi8iKSAhPSAtMSkpIHR5cGUgPSBuZXcgUmVmbGVjdFR5cGUoZG91YmxlW10uY2xhc3MpOwotCQkJCQllbHNlIGlmIChjbGF6eiA9PSBsb25nLmNsYXNzICYmIHMuaW5kZXhPZigibG9uZyAvKmludCovIikgIT0gLTEpIHR5cGUgPSBuZXcgUmVmbGVjdFR5cGUoaW50LmNsYXNzKTsKLQkJCQkJZWxzZSBpZiAoY2xhenogPT0gZG91YmxlLmNsYXNzICYmIHMuaW5kZXhPZigiZG91YmxlIC8qZmxvYXQqLyIpICE9IC0xKSB0eXBlID0gbmV3IFJlZmxlY3RUeXBlKGZsb2F0LmNsYXNzKTsKLQkJCQkJZWxzZSBpZiAoY2xhenogPT0gbG9uZ1tdLmNsYXNzICYmIChzLmluZGV4T2YoImxvbmcgLyppbnQqLyIpICE9IC0xfHwgcy5pbmRleE9mKCJsb25nW10gLyppbnRbXSovIikgIT0gLTEpKSB0eXBlID0gbmV3IFJlZmxlY3RUeXBlKGludFtdLmNsYXNzKTsKLQkJCQkJZWxzZSBpZiAoY2xhenogPT0gZG91YmxlW10uY2xhc3MgJiYgKHMuaW5kZXhPZigiZG91YmxlIC8qZmxvYXQqLyIpICE9IC0xfHwgcy5pbmRleE9mKCJkb3VibGVbXSAvKmZsb2F0W10qLyIpICE9IC0xKSkgdHlwZSA9IG5ldyBSZWZsZWN0VHlwZShmbG9hdFtdLmNsYXNzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQkKLX0KLQotcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQlyZXR1cm4gZmllbGQuaGFzaENvZGUoKTsKLX0KLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQlpZiAoIShvYmogaW5zdGFuY2VvZiBSZWZsZWN0RmllbGQpKSByZXR1cm4gZmFsc2U7Ci0JcmV0dXJuICgoUmVmbGVjdEZpZWxkKW9iaikuZmllbGQuZXF1YWxzKGZpZWxkKTsKLX0KLQotcHVibGljIEpOSUNsYXNzIGdldERlY2xhcmluZ0NsYXNzKCkgewotCXJldHVybiBkZWNsYXJpbmdDbGFzczsKLX0KLQotcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7Ci0JcmV0dXJuIGZpZWxkLmdldE1vZGlmaWVycygpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JcmV0dXJuIGZpZWxkLmdldE5hbWUoKTsKLX0KLQotcHVibGljIEpOSVR5cGUgZ2V0VHlwZSgpIHsKLQlyZXR1cm4gdHlwZTsKLX0KLQotcHVibGljIEpOSVR5cGUgZ2V0VHlwZTY0KCkgewotCXJldHVybiB0eXBlNjQ7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzb3IoKSB7Ci0JcmV0dXJuIChTdHJpbmcpZ2V0UGFyYW0oImFjY2Vzc29yIik7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2FzdCgpIHsKLQlTdHJpbmcgY2FzdCA9ICgoU3RyaW5nKWdldFBhcmFtKCJjYXN0IikpLnRyaW0oKTsKLQlpZiAoY2FzdC5sZW5ndGgoKSA+IDApIHsKLQkJaWYgKCFjYXN0LnN0YXJ0c1dpdGgoIigiKSkgY2FzdCA9ICIoIiArIGNhc3Q7Ci0JCWlmICghY2FzdC5lbmRzV2l0aCgiKSIpKSBjYXN0ID0gY2FzdCArICIpIjsKLQl9Ci0JcmV0dXJuIGNhc3Q7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXhjbHVkZSgpIHsKLQlyZXR1cm4gKFN0cmluZylnZXRQYXJhbSgiZXhjbHVkZSIpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhKCkgewotCVN0cmluZyBjbGFzc05hbWUgPSBnZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQlTdHJpbmcga2V5ID0gY2xhc3NOYW1lICsgIl8iICsgZmllbGQuZ2V0TmFtZSgpOwotCXJldHVybiBkZWNsYXJpbmdDbGFzcy5tZXRhRGF0YS5nZXRNZXRhRGF0YShrZXksICIiKTsKLX0KLQotcHVibGljIHZvaWQgc2V0QWNjZXNzb3IoU3RyaW5nIHN0cikgeyAKLQlzZXRQYXJhbSgiYWNjZXNzb3IiLCBzdHIpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRDYXN0KFN0cmluZyBzdHIpIHsKLQlzZXRQYXJhbSgiY2FzdCIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGUoU3RyaW5nIHN0cikgeyAKLQlzZXRQYXJhbSgiZXhjbHVkZSIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKFN0cmluZyB2YWx1ZSkgewotCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdDbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0JU3RyaW5nIGtleSA9IGNsYXNzTmFtZSArICJfIiArIGZpZWxkLmdldE5hbWUoKTsKLQlkZWNsYXJpbmdDbGFzcy5tZXRhRGF0YS5zZXRNZXRhRGF0YShrZXksIHZhbHVlKTsKLX0KLQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gZmllbGQudG9TdHJpbmcoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1JlZmxlY3RJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUmVmbGVjdEl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5ZGUzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUmVmbGVjdEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmbGVjdEl0ZW0gZXh0ZW5kcyBBYnN0cmFjdEl0ZW0gewotCi1zdGF0aWMgYm9vbGVhbiBjb252ZXJ0VG8zMkJpdChKTklUeXBlW10gcGFyYW1UeXBlcywgYm9vbGVhbiBmbG9hdGluZ1BvaW50VHlwZXMpIHsKLQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJSk5JVHlwZSBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQlpZiAocGFyYW1UeXBlLmlzVHlwZSgibG9uZyIpKSB7Ci0JCQlwYXJhbVR5cGVzW2ldID0gbmV3IFJlZmxlY3RUeXBlKEludGVnZXIuVFlQRSk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlpZiAocGFyYW1UeXBlLmlzVHlwZSgiW0oiKSkgewotCQkJcGFyYW1UeXBlc1tpXSA9IG5ldyBSZWZsZWN0VHlwZShpbnRbXS5jbGFzcyk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlpZiAoZmxvYXRpbmdQb2ludFR5cGVzKSB7Ci0JCQlpZiAocGFyYW1UeXBlLmlzVHlwZSgiZG91YmxlIikpIHsKLQkJCQlwYXJhbVR5cGVzW2ldID0gbmV3IFJlZmxlY3RUeXBlKEZsb2F0LlRZUEUpOwotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJfQotCQkJaWYgKHBhcmFtVHlwZS5pc1R5cGUoIltEIikpIHsKLQkJCQlwYXJhbVR5cGVzW2ldID0gbmV3IFJlZmxlY3RUeXBlKGZsb2F0W10uY2xhc3MpOwotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBjaGFuZ2VkOwkKLX0KLQotYm9vbGVhbiBjYW5DaGFuZ2U2NChDbGFzcyBjbGF6eikgewotCWlmICghR0VONjQpIHJldHVybiBmYWxzZTsKLQlyZXR1cm4gY2xhenogPT0gSW50ZWdlci5UWVBFIHx8Ci0JCWNsYXp6ID09IExvbmcuVFlQRSB8fAotCQljbGF6eiA9PSBGbG9hdC5UWVBFIHx8Ci0JCWNsYXp6ID09IERvdWJsZS5UWVBFIHx8Ci0JCWNsYXp6ID09IGludFtdLmNsYXNzIHx8Ci0JCWNsYXp6ID09IGxvbmdbXS5jbGFzcyB8fAotCQljbGF6eiA9PSBmbG9hdFtdLmNsYXNzIHx8Ci0JCWNsYXp6ID09IGRvdWJsZVtdLmNsYXNzOwotfQotCi1wdWJsaWMgU3RyaW5nIGZsYXR0ZW4oKSB7Ci0JY2hlY2tQYXJhbXMoKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCVNldCBzZXQgPSBwYXJhbXMua2V5U2V0KCk7Ci0JU3RyaW5nW10ga2V5cyA9IChTdHJpbmdbXSlzZXQudG9BcnJheShuZXcgU3RyaW5nW3NldC5zaXplKCldKTsKLQlBcnJheXMuc29ydChrZXlzKTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyBqKyspIHsKLQkJU3RyaW5nIGtleSA9IGtleXNbal07Ci0JCU9iamVjdCB2YWx1ZSA9IHBhcmFtcy5nZXQoa2V5KTsKLQkJU3RyaW5nIHZhbHVlU3RyID0gIiI7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdmFsdWVTdHIgPSAoU3RyaW5nKXZhbHVlOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nW10pIHsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IChTdHJpbmdbXSl2YWx1ZTsKLQkJCVN0cmluZ0J1ZmZlciB2YWx1ZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkgdmFsdWVCdWZmZXIuYXBwZW5kKCIgIik7Ci0JCQkJdmFsdWVCdWZmZXIuYXBwZW5kKHZhbHVlc1tpXSk7Ci0JCQl9Ci0JCQl2YWx1ZVN0ciA9IHZhbHVlQnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSB7Ci0JCQl2YWx1ZVN0ciA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKHZhbHVlU3RyLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSAhPSAwKSBidWZmZXIuYXBwZW5kKCIsIik7Ci0JCQlidWZmZXIuYXBwZW5kKGtleSk7Ci0JCQlidWZmZXIuYXBwZW5kKCI9Iik7Ci0JCQlidWZmZXIuYXBwZW5kKHZhbHVlU3RyKTsKLQkJfQotCX0KLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBzdHIpIHsKLQl0aGlzLnBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JaWYgKHN0ci5sZW5ndGgoKSA9PSAwKSByZXR1cm47Ci0JU3RyaW5nW10gcGFyYW1zID0gc3BsaXQoc3RyLCAiLCIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZyBwYXJhbSA9IHBhcmFtc1tpXTsKLQkJaW50IGVxdWFscyA9IHBhcmFtLmluZGV4T2YoJz0nKTsKLQkJaWYgKGVxdWFscyA9PSAgLTEpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6ICIgKyBzdHIgKyAiIHBhcmFtICIgKyBwYXJhbSk7Ci0JCX0KLQkJU3RyaW5nIGtleSA9IHBhcmFtLnN1YnN0cmluZygwLCBlcXVhbHMpLnRyaW0oKTsKLQkJU3RyaW5nIHZhbHVlID0gcGFyYW0uc3Vic3RyaW5nKGVxdWFscyArIDEpLnRyaW0oKTsKLQkJc2V0UGFyYW0oa2V5LCB2YWx1ZSk7Ci0JfQotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUmVmbGVjdE1ldGhvZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1JlZmxlY3RNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyMGEyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUmVmbGVjdE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZWZsZWN0TWV0aG9kIGV4dGVuZHMgUmVmbGVjdEl0ZW0gaW1wbGVtZW50cyBKTklNZXRob2QgewotCU1ldGhvZCBtZXRob2Q7Ci0JUmVmbGVjdFR5cGUgcmV0dXJuVHlwZSwgcmV0dXJuVHlwZTY0OwotCVJlZmxlY3RUeXBlW10gcGFyYW1UeXBlcywgcGFyYW1UeXBlczY0OwotCVJlZmxlY3RDbGFzcyBkZWNsYXJpbmdDbGFzczsKLQlCb29sZWFuIHVuaXF1ZTsKLQkKLXB1YmxpYyBSZWZsZWN0TWV0aG9kKFJlZmxlY3RDbGFzcyBkZWNsYXJpbmdDbGFzcywgTWV0aG9kIG1ldGhvZCwgU3RyaW5nIHNvdXJjZSwgQ29tcGlsYXRpb25Vbml0IHVuaXQpIHsKLQl0aGlzLm1ldGhvZCA9IG1ldGhvZDsKLQl0aGlzLmRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7CQotCUNsYXNzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCUNsYXNzW10gcGFyYW1UeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCXRoaXMucmV0dXJuVHlwZSA9IG5ldyBSZWZsZWN0VHlwZShyZXR1cm5UeXBlKTsKLQl0aGlzLnJldHVyblR5cGU2NCA9IHRoaXMucmV0dXJuVHlwZTsKLQl0aGlzLnBhcmFtVHlwZXMgPSBuZXcgUmVmbGVjdFR5cGVbcGFyYW1UeXBlcy5sZW5ndGhdOwotCXRoaXMucGFyYW1UeXBlczY0ID0gbmV3IFJlZmxlY3RUeXBlW3BhcmFtVHlwZXMubGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQl0aGlzLnBhcmFtVHlwZXNbaV0gPSB0aGlzLnBhcmFtVHlwZXM2NFtpXSA9IG5ldyBSZWZsZWN0VHlwZShwYXJhbVR5cGVzW2ldKTsKLQl9Ci0JYm9vbGVhbiBjaGFuZ2VzID0gZmFsc2U7Ci0JaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpICE9IDApIHsKLQkJY2hhbmdlcyA9IGNhbkNoYW5nZTY0KHJldHVyblR5cGUpOwotCQlpZiAoIWNoYW5nZXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGggJiYgIWNoYW5nZXM7IGkrKykgewotCQkJCWNoYW5nZXMgfD0gY2FuQ2hhbmdlNjQocGFyYW1UeXBlc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGNoYW5nZXMgJiYgbmV3IEZpbGUoZGVjbGFyaW5nQ2xhc3Muc291cmNlUGF0aCkuZXhpc3RzKCkpIHsKLQkJU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IChUeXBlRGVjbGFyYXRpb24pdW5pdC50eXBlcygpLmdldCgwKTsKLQkJTWV0aG9kRGVjbGFyYXRpb24gZGVjbCA9IG51bGw7Ci0JCU1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoICYmIGRlY2wgPT0gbnVsbDsgaSsrKSB7Ci0JCQlNZXRob2REZWNsYXJhdGlvbiBub2RlID0gbWV0aG9kc1tpXTsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJaWYgKCFkZWNsYXJpbmdDbGFzcy5nZXRTaW1wbGVOYW1lKHJldHVyblR5cGUpLmVxdWFscyhub2RlLmdldFJldHVyblR5cGUyKCkudG9TdHJpbmcoKSkpIGNvbnRpbnVlOwotCQkJCUxpc3QgcGFyYW1ldGVycyA9IG5vZGUucGFyYW1ldGVycygpOwotCQkJCWlmIChwYXJhbWV0ZXJzLnNpemUoKSAhPSBwYXJhbVR5cGVzLmxlbmd0aCkgY29udGludWU7Ci0JCQkJZGVjbCA9IG5vZGU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbVR5cGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmICghZGVjbGFyaW5nQ2xhc3MuZ2V0U2ltcGxlTmFtZShwYXJhbVR5cGVzW2pdKS5lcXVhbHMoKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKXBhcmFtZXRlcnMuZ2V0KGopKS5nZXRUeXBlKCkudG9TdHJpbmcoKSkpIHsKLQkJCQkJCWRlY2wgPSBudWxsOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2FuQ2hhbmdlNjQocGFyYW1UeXBlc1tpXSkpIHsKLQkJCQlDbGFzcyBjbGF6eiA9IHBhcmFtVHlwZXNbaV07Ci0JCQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlID0gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pZGVjbC5wYXJhbWV0ZXJzKCkuZ2V0KGkpOwotCQkJCVN0cmluZyBzID0gc291cmNlLnN1YnN0cmluZyhub2RlLmdldFN0YXJ0UG9zaXRpb24oKSwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkgKyBub2RlLmdldExlbmd0aCgpKTsKLQkJCQlpZiAoY2xhenogPT0gaW50LmNsYXNzICYmIHMuaW5kZXhPZigiaW50IC8qbG9uZyovIikgIT0gLTEpIHRoaXMucGFyYW1UeXBlczY0W2ldID0gbmV3IFJlZmxlY3RUeXBlKGxvbmcuY2xhc3MpOwotCQkJCWVsc2UgaWYgKGNsYXp6ID09IGludFtdLmNsYXNzICYmIChzLmluZGV4T2YoImludCAvKmxvbmcqLyIpICE9IC0xIHx8IHMuaW5kZXhPZigiaW50W10gLypsb25nW10qLyIpICE9IC0xKSkgdGhpcy5wYXJhbVR5cGVzNjRbaV0gPSBuZXcgUmVmbGVjdFR5cGUobG9uZ1tdLmNsYXNzKTsKLQkJCQllbHNlIGlmIChjbGF6eiA9PSBmbG9hdC5jbGFzcyAmJiBzLmluZGV4T2YoImZsb2F0IC8qZG91YmxlKi8iKSAhPSAtMSkgdGhpcy5wYXJhbVR5cGVzNjRbaV0gPSBuZXcgUmVmbGVjdFR5cGUoZG91YmxlLmNsYXNzKTsKLQkJCQllbHNlIGlmIChjbGF6eiA9PSBmbG9hdFtdLmNsYXNzICYmIChzLmluZGV4T2YoImZsb2F0IC8qZG91YmxlKi8iKSAhPSAtMXx8IHMuaW5kZXhPZigiZmxvYXRbXSAvKmRvdWJsZVtdKi8iKSAhPSAtMSkpIHRoaXMucGFyYW1UeXBlczY0W2ldID0gbmV3IFJlZmxlY3RUeXBlKGRvdWJsZVtdLmNsYXNzKTsKLQkJCQllbHNlIGlmIChjbGF6eiA9PSBsb25nLmNsYXNzICYmIHMuaW5kZXhPZigibG9uZyAvKmludCovIikgIT0gLTEpIHRoaXMucGFyYW1UeXBlc1tpXSA9IG5ldyBSZWZsZWN0VHlwZShpbnQuY2xhc3MpOwotCQkJCWVsc2UgaWYgKGNsYXp6ID09IGxvbmdbXS5jbGFzcyAmJiAocy5pbmRleE9mKCJsb25nIC8qaW50Ki8iKSAhPSAtMXx8IHMuaW5kZXhPZigibG9uZ1tdIC8qaW50W10qLyIpICE9IC0xKSkgdGhpcy5wYXJhbVR5cGVzW2ldID0gbmV3IFJlZmxlY3RUeXBlKGludFtdLmNsYXNzKTsKLQkJCQllbHNlIGlmIChjbGF6eiA9PSBkb3VibGUuY2xhc3MgJiYgcy5pbmRleE9mKCJkb3VibGUgLypmbG9hdCovIikgIT0gLTEpIHRoaXMucGFyYW1UeXBlc1tpXSA9IG5ldyBSZWZsZWN0VHlwZShmbG9hdC5jbGFzcyk7Ci0JCQkJZWxzZSBpZiAoY2xhenogPT0gZG91YmxlW10uY2xhc3MgJiYgKHMuaW5kZXhPZigiZG91YmxlIC8qZmxvYXQqLyIpICE9IC0xfHwgcy5pbmRleE9mKCJkb3VibGVbXSAvKmZsb2F0W10qLyIpICE9IC0xKSkgdGhpcy5wYXJhbVR5cGVzW2ldID0gbmV3IFJlZmxlY3RUeXBlKGZsb2F0W10uY2xhc3MpOwotCQkJfQotCQl9Ci0JCWlmIChjYW5DaGFuZ2U2NChyZXR1cm5UeXBlKSkgewotCQkJQ2xhc3MgY2xhenogPSByZXR1cm5UeXBlOwotCQkJQVNUTm9kZSBub2RlID0gZGVjbC5nZXRSZXR1cm5UeXBlMigpOwotCQkJU3RyaW5nIHMgPSBzb3VyY2Uuc3Vic3RyaW5nKG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpLCBkZWNsLmdldE5hbWUoKS5nZXRTdGFydFBvc2l0aW9uKCkpOwotCQkJaWYgKGNsYXp6ID09IGludC5jbGFzcyAmJiBzLmluZGV4T2YoImludCAvKmxvbmcqLyIpICE9IC0xKSB0aGlzLnJldHVyblR5cGU2NCA9IG5ldyBSZWZsZWN0VHlwZShsb25nLmNsYXNzKTsKLQkJCWVsc2UgaWYgKGNsYXp6ID09IGludFtdLmNsYXNzICYmIChzLmluZGV4T2YoImludCAvKmxvbmcqLyIpICE9IC0xIHx8IHMuaW5kZXhPZigiaW50W10gLypsb25nW10qLyIpICE9IC0xKSkgdGhpcy5yZXR1cm5UeXBlNjQgPSBuZXcgUmVmbGVjdFR5cGUobG9uZ1tdLmNsYXNzKTsKLQkJCWVsc2UgaWYgKGNsYXp6ID09IGZsb2F0LmNsYXNzICYmIHMuaW5kZXhPZigiZmxvYXQgLypkb3VibGUqLyIpICE9IC0xKSB0aGlzLnJldHVyblR5cGU2NCA9IG5ldyBSZWZsZWN0VHlwZShkb3VibGUuY2xhc3MpOwotCQkJZWxzZSBpZiAoY2xhenogPT0gZmxvYXRbXS5jbGFzcyAmJiAocy5pbmRleE9mKCJmbG9hdCAvKmRvdWJsZSovIikgIT0gLTF8fCBzLmluZGV4T2YoImZsb2F0W10gLypkb3VibGVbXSovIikgIT0gLTEpKSB0aGlzLnJldHVyblR5cGU2NCA9IG5ldyBSZWZsZWN0VHlwZShkb3VibGVbXS5jbGFzcyk7Ci0JCQllbHNlIGlmIChjbGF6eiA9PSBsb25nLmNsYXNzICYmIHMuaW5kZXhPZigibG9uZyAvKmludCovIikgIT0gLTEpIHRoaXMucmV0dXJuVHlwZSA9IG5ldyBSZWZsZWN0VHlwZShpbnQuY2xhc3MpOwotCQkJZWxzZSBpZiAoY2xhenogPT0gbG9uZ1tdLmNsYXNzICYmIChzLmluZGV4T2YoImxvbmcgLyppbnQqLyIpICE9IC0xfHwgcy5pbmRleE9mKCJsb25nW10gLyppbnRbXSovIikgIT0gLTEpKSB0aGlzLnJldHVyblR5cGUgPSBuZXcgUmVmbGVjdFR5cGUoaW50W10uY2xhc3MpOwotCQkJZWxzZSBpZiAoY2xhenogPT0gZG91YmxlLmNsYXNzICYmIHMuaW5kZXhPZigiZG91YmxlIC8qZmxvYXQqLyIpICE9IC0xKSB0aGlzLnJldHVyblR5cGUgPSBuZXcgUmVmbGVjdFR5cGUoZmxvYXQuY2xhc3MpOwotCQkJZWxzZSBpZiAoY2xhenogPT0gZG91YmxlW10uY2xhc3MgJiYgKHMuaW5kZXhPZigiZG91YmxlIC8qZmxvYXQqLyIpICE9IC0xfHwgcy5pbmRleE9mKCJkb3VibGVbXSAvKmZsb2F0W10qLyIpICE9IC0xKSkgdGhpcy5yZXR1cm5UeXBlID0gbmV3IFJlZmxlY3RUeXBlKGZsb2F0W10uY2xhc3MpOwotCQl9CQkKLQl9Ci19Ci0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JcmV0dXJuIG1ldGhvZC5oYXNoQ29kZSgpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCWlmICghKG9iaiBpbnN0YW5jZW9mIFJlZmxlY3RNZXRob2QpKSByZXR1cm4gZmFsc2U7Ci0JcmV0dXJuICgoUmVmbGVjdE1ldGhvZClvYmopLm1ldGhvZC5lcXVhbHMobWV0aG9kKTsKLX0KLQotcHVibGljIEpOSUNsYXNzIGdldERlY2xhcmluZ0NsYXNzKCkgewotCXJldHVybiBkZWNsYXJpbmdDbGFzczsKLX0KLQotcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7Ci0JcmV0dXJuIG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc05hdGl2ZVVuaXF1ZSgpIHsKLQlpZiAodW5pcXVlICE9IG51bGwpIHJldHVybiB1bmlxdWUuYm9vbGVhblZhbHVlKCk7Ci0JYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCUpOSU1ldGhvZFtdIG1ldGhvZHMgPSBkZWNsYXJpbmdDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJSk5JTWV0aG9kIG10aCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobXRoLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSAhPSAwICYmCi0JCQl0aGlzICE9IG10aCAmJiAhdGhpcy5lcXVhbHMobXRoKSAmJgotCQkJbmFtZS5lcXVhbHMobXRoLmdldE5hbWUoKSkpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCXVuaXF1ZSA9IG5ldyBCb29sZWFuKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotcHVibGljIEpOSVR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKLQlyZXR1cm4gcGFyYW1UeXBlczsKLX0KLQotcHVibGljIEpOSVR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlczY0KCkgewotCXJldHVybiBwYXJhbVR5cGVzNjQ7Ci19Ci0KLXB1YmxpYyBKTklQYXJhbWV0ZXJbXSBnZXRQYXJhbWV0ZXJzKCkgewotCUNsYXNzW10gcGFyYW1UeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCVJlZmxlY3RQYXJhbWV0ZXJbXSByZXN1bHQgPSBuZXcgUmVmbGVjdFBhcmFtZXRlcltwYXJhbVR5cGVzLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCXJlc3VsdFtpXSA9IG5ldyBSZWZsZWN0UGFyYW1ldGVyKHRoaXMsIGkpOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1wdWJsaWMgSk5JVHlwZSBnZXRSZXR1cm5UeXBlKCkgewotCXJldHVybiByZXR1cm5UeXBlOwotfQotCi1wdWJsaWMgSk5JVHlwZSBnZXRSZXR1cm5UeXBlNjQoKSB7Ci0JcmV0dXJuIHJldHVyblR5cGU2NDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRBY2Nlc3NvcigpIHsKLQlyZXR1cm4gKFN0cmluZylnZXRQYXJhbSgiYWNjZXNzb3IiKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRFeGNsdWRlKCkgewotCXJldHVybiAoU3RyaW5nKWdldFBhcmFtKCJleGNsdWRlIik7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGEoKSB7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IGdldERlY2xhcmluZ0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCVN0cmluZyBrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKHRoaXMpOwotCU1ldGFEYXRhIG1ldGFEYXRhID0gZGVjbGFyaW5nQ2xhc3MubWV0YURhdGE7Ci0JU3RyaW5nIHZhbHVlID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBtZXRob2QuZ2V0TmFtZSgpOwotCQl2YWx1ZSA9IG1ldGFEYXRhLmdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JfQotCS8qCi0JKiBTdXBwb3J0IGZvciA2NCBiaXQgcG9ydC4KLQkqLwotCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCUpOSVR5cGVbXSBwYXJhbVR5cGVzID0gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJaWYgKGNvbnZlcnRUbzMyQml0KHBhcmFtVHlwZXMsIHRydWUpKSB7Ci0JCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKHRoaXMsIHBhcmFtVHlwZXMpOwotCQkJdmFsdWUgPSBtZXRhRGF0YS5nZXRNZXRhRGF0YShrZXksIG51bGwpOwotCQl9Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlwYXJhbVR5cGVzID0gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCWlmIChjb252ZXJ0VG8zMkJpdChwYXJhbVR5cGVzLCBmYWxzZSkpIHsKLQkJCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKHRoaXMsIHBhcmFtVHlwZXMpOwotCQkJCXZhbHVlID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQkvKgotCSogU3VwcG9ydCBmb3IgbG9jay4KLQkqLwotCWlmICh2YWx1ZSA9PSBudWxsICYmIG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgiXyIpKSB7Ci0JCWtleSA9IGNsYXNzTmFtZSArICJfIiArIEpOSUdlbmVyYXRvci5nZXRGdW5jdGlvbk5hbWUodGhpcykuc3Vic3RyaW5nKDIpOwotCQl2YWx1ZSA9IG1ldGFEYXRhLmdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZygxKTsKLQkJCXZhbHVlID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQkJfQotCX0KLQlpZiAodmFsdWUgPT0gbnVsbCkgdmFsdWUgPSAiIjsJCi0JcmV0dXJuIHZhbHVlOwotfQotCi1wdWJsaWMgdm9pZCBzZXRBY2Nlc3NvcihTdHJpbmcgc3RyKSB7IAotCXNldFBhcmFtKCJhY2Nlc3NvciIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGUoU3RyaW5nIHN0cikgeyAKLQlzZXRQYXJhbSgiZXhjbHVkZSIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKFN0cmluZyB2YWx1ZSkgewotCVN0cmluZyBrZXk7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ0NsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQlpZiAoaXNOYXRpdmVVbmlxdWUoKSkgewotCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBtZXRob2QuZ2V0TmFtZSAoKTsKLQl9IGVsc2UgewotCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKHRoaXMpOwotCX0KLQlkZWNsYXJpbmdDbGFzcy5tZXRhRGF0YS5zZXRNZXRhRGF0YShrZXksIHZhbHVlKTsKLX0KLQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gbWV0aG9kLnRvU3RyaW5nKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9SZWZsZWN0UGFyYW1ldGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUmVmbGVjdFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWM0NTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9SZWZsZWN0UGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBSZWZsZWN0UGFyYW1ldGVyIGV4dGVuZHMgUmVmbGVjdEl0ZW0gaW1wbGVtZW50cyBKTklQYXJhbWV0ZXIgewotCVJlZmxlY3RNZXRob2QgbWV0aG9kOwotCWludCBwYXJhbWV0ZXI7Ci0KLXB1YmxpYyBSZWZsZWN0UGFyYW1ldGVyKFJlZmxlY3RNZXRob2QgbWV0aG9kLCBpbnQgcGFyYW1ldGVyKSB7Ci0JdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0JdGhpcy5wYXJhbWV0ZXIgPSBwYXJhbWV0ZXI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2FzdCgpIHsKLQlTdHJpbmcgY2FzdCA9ICgoU3RyaW5nKWdldFBhcmFtKCJjYXN0IikpLnRyaW0oKTsKLQlpZiAoY2FzdC5sZW5ndGgoKSA+IDApIHsKLQkJaWYgKCFjYXN0LnN0YXJ0c1dpdGgoIigiKSkgY2FzdCA9ICIoIiArIGNhc3Q7Ci0JCWlmICghY2FzdC5lbmRzV2l0aCgiKSIpKSBjYXN0ID0gY2FzdCArICIpIjsKLQl9Ci0JcmV0dXJuIGNhc3Q7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGEoKSB7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQlTdHJpbmcga2V5ID0gY2xhc3NOYW1lICsgIl8iICsgSk5JR2VuZXJhdG9yLmdldEZ1bmN0aW9uTmFtZShtZXRob2QpICsgIl8iICsgcGFyYW1ldGVyOwotCU1ldGFEYXRhIG1ldGFEYXRhID0gbWV0aG9kLmRlY2xhcmluZ0NsYXNzLm1ldGFEYXRhOwotCVN0cmluZyB2YWx1ZSA9IG1ldGFEYXRhLmdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JaWYgKHZhbHVlID09IG51bGwpIHsKLQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgbWV0aG9kLmdldE5hbWUoKSArICJfIiArIHBhcmFtZXRlcjsKLQkJdmFsdWUgPSBtZXRhRGF0YS5nZXRNZXRhRGF0YShrZXksIG51bGwpOwotCX0KLQkvKgotCSogU3VwcG9ydCBmb3IgNjQgYml0IHBvcnQuCi0JKi8KLQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQlKTklUeXBlW10gcGFyYW1UeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlpZiAoUmVmbGVjdEl0ZW0uY29udmVydFRvMzJCaXQocGFyYW1UeXBlcywgdHJ1ZSkpIHsKLQkJCWtleSA9IGNsYXNzTmFtZSArICJfIiArIEpOSUdlbmVyYXRvci5nZXRGdW5jdGlvbk5hbWUobWV0aG9kLCBwYXJhbVR5cGVzKSArICJfIiArIHBhcmFtZXRlcjsKLQkJCXZhbHVlID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQkJfQotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcGFyYW1UeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJaWYgKFJlZmxlY3RJdGVtLmNvbnZlcnRUbzMyQml0KHBhcmFtVHlwZXMsIGZhbHNlKSkgewotCQkJCWtleSA9IGNsYXNzTmFtZSArICJfIiArIEpOSUdlbmVyYXRvci5nZXRGdW5jdGlvbk5hbWUobWV0aG9kLCBwYXJhbVR5cGVzKSArICJfIiArIHBhcmFtZXRlcjsKLQkJCQl2YWx1ZSA9IG1ldGFEYXRhLmdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoKLQkqIFN1cHBvcnQgZm9yIGxvY2suCi0JKi8KLQlpZiAodmFsdWUgPT0gbnVsbCAmJiBtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIl8iKSkgewotCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCkuc3Vic3RyaW5nKDIpICsgIl8iICsgcGFyYW1ldGVyOwotCQl2YWx1ZSA9IG1ldGFEYXRhLmdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZygxKSArICJfIiArIHBhcmFtZXRlcjsKLQkJCXZhbHVlID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQkJfQotCX0KLQlpZiAodmFsdWUgPT0gbnVsbCkgdmFsdWUgPSAiIjsJCi0JcmV0dXJuIHZhbHVlOwotfQotCi1wdWJsaWMgSk5JTWV0aG9kIGdldE1ldGhvZCgpIHsKLQlyZXR1cm4gbWV0aG9kOwotfQotCi1wdWJsaWMgSk5JQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgewotCVJlZmxlY3RUeXBlIHR5cGUgPSAoUmVmbGVjdFR5cGUpZ2V0VHlwZSgpOwotCVJlZmxlY3RDbGFzcyBkZWNsYXJpbmdDbGFzcyA9IG1ldGhvZC5kZWNsYXJpbmdDbGFzczsKLQlTdHJpbmcgc291cmNlUGF0aCAgPSBkZWNsYXJpbmdDbGFzcy5zb3VyY2VQYXRoOwotCXNvdXJjZVBhdGggPSBuZXcgRmlsZShzb3VyY2VQYXRoKS5nZXRQYXJlbnQoKSArICIvIiArIHR5cGUuZ2V0U2ltcGxlTmFtZSgpICsgIi5qYXZhIjsKLQlyZXR1cm4gbmV3IFJlZmxlY3RDbGFzcyh0eXBlLmNsYXp6LCBkZWNsYXJpbmdDbGFzcy5tZXRhRGF0YSwgc291cmNlUGF0aCk7Ci19Ci0KLXB1YmxpYyBKTklUeXBlIGdldFR5cGUoKSB7Ci0JcmV0dXJuIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpW3BhcmFtZXRlcl07Ci19Ci0KLXB1YmxpYyBKTklUeXBlIGdldFR5cGU2NCgpIHsKLQlyZXR1cm4gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzNjQoKVtwYXJhbWV0ZXJdOwotfQotCi1wdWJsaWMgaW50IGdldFBhcmFtZXRlcigpIHsKLQlyZXR1cm4gcGFyYW1ldGVyOwotfQotCi1wdWJsaWMgdm9pZCBzZXRDYXN0KFN0cmluZyBzdHIpIHsKLQlzZXRQYXJhbSgiY2FzdCIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKFN0cmluZyB2YWx1ZSkgewotCVN0cmluZyBrZXk7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQlpZiAobWV0aG9kLmlzTmF0aXZlVW5pcXVlKCkpIHsKLQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgbWV0aG9kLmdldE5hbWUgKCkgKyAiXyIgKyBwYXJhbWV0ZXI7Ci0JfSBlbHNlIHsKLQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgSk5JR2VuZXJhdG9yLmdldEZ1bmN0aW9uTmFtZShtZXRob2QpICsgIl8iICsgcGFyYW1ldGVyOwotCX0KLQltZXRob2QuZGVjbGFyaW5nQ2xhc3MubWV0YURhdGEuc2V0TWV0YURhdGEoa2V5LCB2YWx1ZSk7Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUmVmbGVjdFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9SZWZsZWN0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBhNTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9SZWZsZWN0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1wdWJsaWMgY2xhc3MgUmVmbGVjdFR5cGUgaW1wbGVtZW50cyBKTklUeXBlIHsKLQlDbGFzcyBjbGF6ejsKLQotcHVibGljIFJlZmxlY3RUeXBlKENsYXNzIGNsYXp6KSB7Ci0JdGhpcy5jbGF6eiA9IGNsYXp6OwotfQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCWlmIChvYmogPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0JaWYgKCEob2JqIGluc3RhbmNlb2YgUmVmbGVjdFR5cGUpKSByZXR1cm4gZmFsc2U7Ci0JcmV0dXJuICgoUmVmbGVjdFR5cGUpb2JqKS5jbGF6eiA9PSBjbGF6ejsKLX0KLQotcHVibGljIEpOSVR5cGUgZ2V0Q29tcG9uZW50VHlwZSgpIHsKLQlyZXR1cm4gbmV3IFJlZmxlY3RUeXBlKGNsYXp6LmdldENvbXBvbmVudFR5cGUoKSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQlyZXR1cm4gY2xhenouZ2V0TmFtZSgpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoKSB7Ci0JU3RyaW5nIG5hbWUgPSBjbGF6ei5nZXROYW1lKCk7Ci0JaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpICsgMTsKLQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoaW5kZXgsIG5hbWUubGVuZ3RoKCkpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoYm9vbGVhbiBkZWZpbmUpIHsKLQlpZiAoY2xhenogPT0gVm9pZC5UWVBFKSByZXR1cm4gIlYiOwotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiBkZWZpbmUgPyAiSV9KIiA6ICJJIjsKLQlpZiAoY2xhenogPT0gQm9vbGVhbi5UWVBFKSByZXR1cm4gIloiOwotCWlmIChjbGF6eiA9PSBMb25nLlRZUEUpIHJldHVybiBkZWZpbmUgPyAiSl9KIiA6ICJKIjsKLQlpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkgcmV0dXJuICJTIjsKLQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAiQyI7Ci0JaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkgcmV0dXJuICJCIjsKLQlpZiAoY2xhenogPT0gRmxvYXQuVFlQRSkgcmV0dXJuIGRlZmluZSA/ICJGX0QiIDogIkYiOwotCWlmIChjbGF6eiA9PSBEb3VibGUuVFlQRSkgcmV0dXJuIGRlZmluZSA/ICJGX0QiIDogIkQiOwotCWlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHJldHVybiAiTGphdmEvbGFuZy9TdHJpbmc7IjsKLQlpZiAoY2xhenouaXNBcnJheSgpKSB7Ci0JCWlmIChkZWZpbmUpIHJldHVybiBnZXRDb21wb25lbnRUeXBlKCkuZ2V0VHlwZVNpZ25hdHVyZShkZWZpbmUpICsgIkFycmF5IjsKLQkJcmV0dXJuICJbIiArIGdldENvbXBvbmVudFR5cGUoKS5nZXRUeXBlU2lnbmF0dXJlKGRlZmluZSk7Ci0JfQotCXJldHVybiAiTCIgKyBjbGF6ei5nZXROYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiOyI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZTEoYm9vbGVhbiBkZWZpbmUpIHsKLQlpZiAoY2xhenogPT0gVm9pZC5UWVBFKSByZXR1cm4gIlZvaWQiOwotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiBkZWZpbmUgPyAiSW50TG9uZyIgOiAiSW50IjsKLQlpZiAoY2xhenogPT0gQm9vbGVhbi5UWVBFKSByZXR1cm4gIkJvb2xlYW4iOwotCWlmIChjbGF6eiA9PSBMb25nLlRZUEUpIHJldHVybiBkZWZpbmUgPyAiSW50TG9uZyIgOiAiTG9uZyI7Ci0JaWYgKGNsYXp6ID09IFNob3J0LlRZUEUpIHJldHVybiAiU2hvcnQiOwotCWlmIChjbGF6eiA9PSBDaGFyYWN0ZXIuVFlQRSkgcmV0dXJuICJDaGFyIjsKLQlpZiAoY2xhenogPT0gQnl0ZS5UWVBFKSByZXR1cm4gIkJ5dGUiOwotCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gZGVmaW5lID8gIkZsb2F0RG91YmxlIiA6ICJGbG9hdCI7Ci0JaWYgKGNsYXp6ID09IERvdWJsZS5UWVBFKSByZXR1cm4gZGVmaW5lID8gIkZsb2F0RG91YmxlIiA6ICJEb3VibGUiOwotCWlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHJldHVybiAiU3RyaW5nIjsKLQlyZXR1cm4gIk9iamVjdCI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZTIoYm9vbGVhbiBkZWZpbmUpIHsKLQlpZiAoY2xhenogPT0gVm9pZC5UWVBFKSByZXR1cm4gInZvaWQiOwotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiBkZWZpbmUgPyAiamludExvbmciIDogImppbnQiOwotCWlmIChjbGF6eiA9PSBCb29sZWFuLlRZUEUpIHJldHVybiAiamJvb2xlYW4iOwotCWlmIChjbGF6eiA9PSBMb25nLlRZUEUpIHJldHVybiBkZWZpbmUgPyAiamludExvbmciIDogImpsb25nIjsKLQlpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkgcmV0dXJuICJqc2hvcnQiOwotCWlmIChjbGF6eiA9PSBDaGFyYWN0ZXIuVFlQRSkgcmV0dXJuICJqY2hhciI7Ci0JaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkgcmV0dXJuICJqYnl0ZSI7Ci0JaWYgKGNsYXp6ID09IEZsb2F0LlRZUEUpIHJldHVybiBkZWZpbmUgPyAiamZsb2F0RG91YmxlIiA6ICJqZmxvYXQiOwotCWlmIChjbGF6eiA9PSBEb3VibGUuVFlQRSkgcmV0dXJuIGRlZmluZSA/ICJqZmxvYXREb3VibGUiIDogImpkb3VibGUiOwotCWlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHJldHVybiAianN0cmluZyI7Ci0JaWYgKGNsYXp6ID09IENsYXNzLmNsYXNzKSByZXR1cm4gImpjbGFzcyI7Ci0JaWYgKGNsYXp6LmlzQXJyYXkoKSkgewotCQlyZXR1cm4gZ2V0Q29tcG9uZW50VHlwZSgpLmdldFR5cGVTaWduYXR1cmUyKGRlZmluZSkgKyAiQXJyYXkiOwotCX0KLQlyZXR1cm4gImpvYmplY3QiOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUzKGJvb2xlYW4gZGVmaW5lKSB7Ci0JaWYgKGNsYXp6ID09IFZvaWQuVFlQRSkgcmV0dXJuICJ2b2lkIjsKLQlpZiAoY2xhenogPT0gSW50ZWdlci5UWVBFKSByZXR1cm4gImludCI7Ci0JaWYgKGNsYXp6ID09IEJvb2xlYW4uVFlQRSkgcmV0dXJuICJib29sZWFuIjsKLQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gImxvbmciOwotCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gInNob3J0IjsKLQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAiY2hhciI7Ci0JaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkgcmV0dXJuICJieXRlIjsKLQlpZiAoY2xhenogPT0gRmxvYXQuVFlQRSkgcmV0dXJuICJmbG9hdCI7Ci0JaWYgKGNsYXp6ID09IERvdWJsZS5UWVBFKSByZXR1cm4gImRvdWJsZSI7Ci0JaWYgKGNsYXp6ID09IFN0cmluZy5jbGFzcykgcmV0dXJuICJTdHJpbmciOwotCWlmIChjbGF6ei5pc0FycmF5KCkpIHsKLQkJcmV0dXJuIGdldENvbXBvbmVudFR5cGUoKS5nZXRUeXBlU2lnbmF0dXJlMyhkZWZpbmUpICsgIltdIjsKLQl9Ci0JcmV0dXJuIGNsYXp6LmdldE5hbWUoKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlNChib29sZWFuIGRlZmluZSwgYm9vbGVhbiBzdHJ1Y3QpIHsKLQlpZiAoY2xhenogPT0gVm9pZC5UWVBFKSByZXR1cm4gInZvaWQiOwotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiBkZWZpbmUgPyAiamludExvbmciIDogImppbnQiOwotCWlmIChjbGF6eiA9PSBCb29sZWFuLlRZUEUpIHJldHVybiAiamJvb2xlYW4iOwotCWlmIChjbGF6eiA9PSBMb25nLlRZUEUpIHJldHVybiBkZWZpbmUgPyAiamludExvbmciIDogImpsb25nIjsKLQlpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkgcmV0dXJuICJqc2hvcnQiOwotCWlmIChjbGF6eiA9PSBDaGFyYWN0ZXIuVFlQRSkgcmV0dXJuICJqY2hhciI7Ci0JaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkgcmV0dXJuICJqYnl0ZSI7Ci0JaWYgKGNsYXp6ID09IEZsb2F0LlRZUEUpIHJldHVybiBkZWZpbmUgPyAiamZsb2F0RG91YmxlIiA6ICJqZmxvYXQiOwotCWlmIChjbGF6eiA9PSBEb3VibGUuVFlQRSkgcmV0dXJuIGRlZmluZSA/ICJqZmxvYXREb3VibGUiIDogImpkb3VibGUiOwotCWlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHJldHVybiAianN0cmluZyI7Ci0JaWYgKGNsYXp6LmlzQXJyYXkoKSkgewotCQlTdHJpbmcgc2lnID0gZ2V0Q29tcG9uZW50VHlwZSgpLmdldFR5cGVTaWduYXR1cmU0KGRlZmluZSwgc3RydWN0KTsKLQkJcmV0dXJuIHN0cnVjdCA/IHNpZyA6IHNpZyArICIgKiI7Ci0JfQotCVN0cmluZyBzaWcgPSBnZXRTaW1wbGVOYW1lKCk7IAotCXJldHVybiBzdHJ1Y3QgPyBzaWcgOiBzaWcgKyAiICoiOwotfQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCXJldHVybiBjbGF6ei5oYXNoQ29kZSgpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCXJldHVybiBjbGF6ei5pc0FycmF5KCk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCXJldHVybiBjbGF6ei5pc1ByaW1pdGl2ZSgpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc1R5cGUoU3RyaW5nIHR5cGUpIHsKLQlyZXR1cm4gY2xhenouZ2V0TmFtZSgpLmVxdWFscyh0eXBlKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1NpemVvZkdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1NpemVvZkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDhiMjIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TaXplb2ZHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLQotcHVibGljIGNsYXNzIFNpemVvZkdlbmVyYXRvciBleHRlbmRzIEpOSUdlbmVyYXRvciB7Ci0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoSk5JQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhenouZ2V0U2ltcGxlTmFtZSgpOwotCW91dHB1dCgiXHRwcmludGYoXCIiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXQoIj0lZFxcblwiLCBzaXplb2YoIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIikpOyIpOwotLy8JRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwotLy8JZ2VuZXJhdGUoZmllbGRzKTsJCi19Ci0JCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsKLQlvdXRwdXRsbigiaW50IG1haW4oKSB7Iik7Ci0Jc3VwZXIuZ2VuZXJhdGUoKTsKLQlvdXRwdXRsbigifSIpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklGaWVsZFtdIGZpZWxkcykgewotCXNvcnQoZmllbGRzKTsJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJSk5JRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWlmICgoZmllbGQuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5GSU5BTCkgPT0gMCkgY29udGludWU7Ci0JCWdlbmVyYXRlKGZpZWxkKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEpOSUZpZWxkIGZpZWxkKSB7Ci0Jb3V0cHV0KCJcdHByaW50ZihcIiIpOwotCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCW91dHB1dCgiPSVkXFxuXCIsIHNpemVvZigiKTsKLQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQlvdXRwdXRsbigiKSk7Iik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlpZiAoYXJncy5sZW5ndGggPCAxKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgU2l6ZW9mR2VuZXJhdG9yIDxjbGFzc05hbWUxPiA8Y2xhc3NOYW1lMj4iKTsKLQkJcmV0dXJuOwotCX0KLQl0cnkgewotCQlTaXplb2ZHZW5lcmF0b3IgZ2VuID0gbmV3IFNpemVvZkdlbmVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjbGF6ek5hbWUgPSBhcmdzW2ldOwotCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXp6TmFtZSk7Ci0JCQlnZW4uZ2VuZXJhdGUobmV3IFJlZmxlY3RDbGFzcyhjbGF6eikpOwotCQl9Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1N0YXRzR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU3RhdHNHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0ZjQwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU3RhdHNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0c0dlbmVyYXRvciBleHRlbmRzIEpOSUdlbmVyYXRvciB7Ci0KLQlib29sZWFuIGhlYWRlcjsKLQkKLXB1YmxpYyBTdGF0c0dlbmVyYXRvcihib29sZWFuIGhlYWRlcikgewotCXRoaXMuaGVhZGVyID0gaGVhZGVyOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUNvcHlyaWdodCgpIHsKLQlnZW5lcmF0ZU1ldGFEYXRhKCJzd3RfY29weXJpZ2h0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlSW5jbHVkZXMoKSB7Ci0JaWYgKCFoZWFkZXIpIHsKLQkJb3V0cHV0bG4oIiNpbmNsdWRlIFwic3d0LmhcIiIpOwotCQlvdXRwdXQoIiNpbmNsdWRlIFwiIik7Ci0JCW91dHB1dChnZXRPdXRwdXROYW1lKCkpOwotCQlvdXRwdXRsbigiX3N0YXRzLmhcIiIpOwotCQlvdXRwdXRsbigpOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoSk5JQ2xhc3MgY2xhenopIHsKLQlpZiAoaGVhZGVyKSB7Ci0JCWdlbmVyYXRlSGVhZGVyRmlsZShjbGF6eik7Ci0JfSBlbHNlIHsKLQkJZ2VuZXJhdGVTb3VyY2VGaWxlKGNsYXp6KTsKLQl9Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCXJldHVybiBoZWFkZXIgPyAiLmgiIDogc3VwZXIuZ2V0RXh0ZW5zaW9uKCk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgewotCXJldHVybiAiX3N0YXRzIjsKLX0KLQotdm9pZCBnZW5lcmF0ZUhlYWRlckZpbGUoSk5JQ2xhc3MgY2xhenopewotCWdlbmVyYXRlTkFUSVZFTWFjcm9zKGNsYXp6KTsKLQlKTklNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0Jc29ydChtZXRob2RzKTsKLQlnZW5lcmF0ZUZ1bmN0aW9uRW51bShtZXRob2RzKTsJCi19Ci0KLXZvaWQgZ2VuZXJhdGVOQVRJVkVNYWNyb3MoSk5JQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhenouZ2V0U2ltcGxlTmFtZSgpOwotCW91dHB1dGxuKCIjaWZkZWYgTkFUSVZFX1NUQVRTIik7Ci0Jb3V0cHV0KCJleHRlcm4gaW50ICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25Db3VudDsiKTsKLQlvdXRwdXQoImV4dGVybiBpbnQgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtdOyIpOwotCW91dHB1dCgiZXh0ZXJuIGNoYXIqICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25OYW1lc1tdOyIpOwotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXQoIl9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBmdW5jKSAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2Z1bmNdKys7Iik7Ci0Jb3V0cHV0KCIjZGVmaW5lICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAiKTsKLQlvdXRwdXRsbigiI2Vsc2UiKTsKLQlvdXRwdXQoIiNpZm5kZWYgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9OQVRJVkVfRU5URVIiKTsKLQlvdXRwdXQoIiNkZWZpbmUgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBmdW5jKSAiKTsKLQlvdXRwdXRsbigiI2VuZGlmIik7Ci0Jb3V0cHV0KCIjaWZuZGVmICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfTkFUSVZFX0VYSVQiKTsKLQlvdXRwdXQoIiNkZWZpbmUgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpICIpOwotCW91dHB1dGxuKCIjZW5kaWYiKTsKLQlvdXRwdXRsbigiI2VuZGlmIik7Ci0Jb3V0cHV0bG4oKTsJCi19Ci0KLXZvaWQgZ2VuZXJhdGVTb3VyY2VGaWxlKEpOSUNsYXNzIGNsYXp6KSB7Ci0Jb3V0cHV0bG4oIiNpZmRlZiBOQVRJVkVfU1RBVFMiKTsKLQlvdXRwdXRsbigpOwotCUpOSU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlpbnQgbWV0aG9kQ291bnQgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlKTklNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQltZXRob2RDb3VudCsrOwotCX0KLQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhenouZ2V0U2ltcGxlTmFtZSgpOwotCW91dHB1dCgiaW50ICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dCgiX25hdGl2ZUZ1bmN0aW9uQ291bnQgPSAiKTsKLQlvdXRwdXQoU3RyaW5nLnZhbHVlT2YobWV0aG9kQ291bnQpKTsKLQlvdXRwdXRsbigiOyIpOwotCW91dHB1dCgiaW50ICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dCgiX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50WyIpOwotCW91dHB1dChTdHJpbmcudmFsdWVPZihtZXRob2RDb3VudCkpOwotCW91dHB1dGxuKCJdOyIpOwotCW91dHB1dCgiY2hhciAqICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25OYW1lc1tdID0geyIpOwotCXNvcnQobWV0aG9kcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCUpOSU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCVN0cmluZyBmdW5jdGlvbiA9IGdldEZ1bmN0aW9uTmFtZShtZXRob2QpLCBmdW5jdGlvbjY0ID0gZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCwgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzNjQoKSk7Ci0JCWlmICghZnVuY3Rpb24uZXF1YWxzKGZ1bmN0aW9uNjQpKSB7Ci0JCQlvdXRwdXQoIiNpZm5kZWYgIik7Ci0JCQlvdXRwdXQoSk5JNjQpOwotCQkJb3V0cHV0bG4oKTsKLQkJfQotCQlvdXRwdXQoIlx0XCIiKTsKLQkJb3V0cHV0KGZ1bmN0aW9uKTsKLQkJb3V0cHV0bG4oIlwiLCIpOwotCQlpZiAoIWZ1bmN0aW9uLmVxdWFscyhmdW5jdGlvbjY0KSkgewotCQkJb3V0cHV0bG4oIiNlbHNlIik7Ci0JCQlvdXRwdXQoIlx0XCIiKTsKLQkJCW91dHB1dChmdW5jdGlvbjY0KTsKLQkJCW91dHB1dGxuKCJcIiwiKTsKLQkJCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJfQotCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc3RlcCgpOwotCX0KLQlvdXRwdXRsbigifTsiKTsKLQlvdXRwdXRsbigpOwotCWdlbmVyYXRlU3RhdHNOYXRpdmVzKGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oKTsKLQlvdXRwdXRsbigiI2VuZGlmIik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTdGF0c05hdGl2ZXMoU3RyaW5nIGNsYXNzTmFtZSkgewotCW91dHB1dGxuKCIjZGVmaW5lIFNUQVRTX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX3N3dF90b29sc19pbnRlcm5hbF9OYXRpdmVTdGF0c18jI2Z1bmMiKTsKLQlvdXRwdXRsbigpOwotCi0Jb3V0cHV0KCJKTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRSgiKTsKLQlvdXRwdXQodG9DKGNsYXNzTmFtZSArICJfR2V0RnVuY3Rpb25Db3VudCIpKTsKLQlvdXRwdXRsbigiKSIpOwotCW91dHB1dGxuKCJcdChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpIik7Ci0Jb3V0cHV0bG4oInsiKTsKLQlvdXRwdXQoIlx0cmV0dXJuICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25Db3VudDsiKTsKLQlvdXRwdXRsbigifSIpOwotCW91dHB1dGxuKCk7Ci0KLQlvdXRwdXQoIkpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgU1RBVFNfTkFUSVZFKCIpOwotCW91dHB1dCh0b0MoY2xhc3NOYW1lICsgIl9HZXRGdW5jdGlvbk5hbWUiKSk7Ci0Jb3V0cHV0bG4oIikiKTsKLQlvdXRwdXRsbigiXHQoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGluZGV4KSIpOwotCW91dHB1dGxuKCJ7Iik7Ci0Jb3V0cHV0KCJcdHJldHVybiAiKTsKLQlpZiAoaXNDUFApIHsKLQkJb3V0cHV0KCJlbnYtPk5ld1N0cmluZ1VURigiKTsKLQl9IGVsc2UgewotCQlvdXRwdXQoIigqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgIik7Ci0JfQotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25OYW1lc1tpbmRleF0pOyIpOwotCW91dHB1dGxuKCJ9Iik7Ci0Jb3V0cHV0bG4oKTsKLQotCW91dHB1dCgiSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBTVEFUU19OQVRJVkUoIik7Ci0Jb3V0cHV0KHRvQyhjbGFzc05hbWUgKyAiX0dldEZ1bmN0aW9uQ2FsbENvdW50IikpOwotCW91dHB1dGxuKCIpIik7Ci0Jb3V0cHV0bG4oIlx0KEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkiKTsKLQlvdXRwdXRsbigieyIpOwotCW91dHB1dCgiXHRyZXR1cm4gIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtpbmRleF07Iik7Ci0Jb3V0cHV0bG4oIn0iKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUZ1bmN0aW9uRW51bShKTklNZXRob2RbXSBtZXRob2RzKSB7Ci0JaWYgKG1ldGhvZHMubGVuZ3RoID09IDApIHJldHVybjsKLQlvdXRwdXRsbigidHlwZWRlZiBlbnVtIHsiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJSk5JTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJU3RyaW5nIGZ1bmN0aW9uID0gZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCksIGZ1bmN0aW9uNjQgPSBnZXRGdW5jdGlvbk5hbWUobWV0aG9kLCBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXM2NCgpKTsKLQkJaWYgKCFmdW5jdGlvbi5lcXVhbHMoZnVuY3Rpb242NCkpIHsKLQkJCW91dHB1dCgiI2lmbmRlZiAiKTsKLQkJCW91dHB1dChKTkk2NCk7Ci0JCQlvdXRwdXRsbigpOwotCQl9Ci0JCW91dHB1dCgiXHQiKTsKLQkJb3V0cHV0KGZ1bmN0aW9uKTsKLQkJb3V0cHV0bG4oIl9GVU5DLCIpOwotCQlpZiAoIWZ1bmN0aW9uLmVxdWFscyhmdW5jdGlvbjY0KSkgewotCQkJb3V0cHV0bG4oIiNlbHNlIik7Ci0JCQlvdXRwdXQoIlx0Iik7Ci0JCQlvdXRwdXQoZnVuY3Rpb242NCk7Ci0JCQlvdXRwdXRsbigiX0ZVTkMsIik7Ci0JCQlvdXRwdXRsbigiI2VuZGlmIik7Ci0JCX0KLQkJaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnN0ZXAoKTsKLQl9Ci0JSk5JQ2xhc3MgY2xhenogPSBtZXRob2RzWzBdLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0Jb3V0cHV0KCJ9ICIpOwotCW91dHB1dChjbGF6ei5nZXRTaW1wbGVOYW1lKCkpOwotCW91dHB1dGxuKCJfRlVOQ1M7Iik7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TdHJ1Y3RzR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU3RydWN0c0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWVmYjA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TdHJ1Y3RzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFN0cnVjdHNHZW5lcmF0b3IgZXh0ZW5kcyBKTklHZW5lcmF0b3IgewotCi1ib29sZWFuIGhlYWRlcjsKLQotc3RhdGljIGZpbmFsIGJvb2xlYW4gR0xPQkFMX1JFRiA9IGZhbHNlOwotCi1wdWJsaWMgU3RydWN0c0dlbmVyYXRvcihib29sZWFuIGhlYWRlcikgewotCXRoaXMuaGVhZGVyID0gaGVhZGVyOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUNvcHlyaWdodCgpIHsKLQlnZW5lcmF0ZU1ldGFEYXRhKCJzd3RfY29weXJpZ2h0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlSW5jbHVkZXMoKSB7Ci0JaWYgKGhlYWRlcikgewotCQlvdXRwdXQoIiNpbmNsdWRlIFwiIik7Ci0JCW91dHB1dChnZXRPdXRwdXROYW1lKCkpOwotCQlvdXRwdXRsbigiLmhcIiIpOwotCX0gZWxzZSB7Ci0JCW91dHB1dGxuKCIjaW5jbHVkZSBcInN3dC5oXCIiKTsKLQkJb3V0cHV0KCIjaW5jbHVkZSBcIiIpOwotCQlvdXRwdXQoZ2V0T3V0cHV0TmFtZSgpKTsKLQkJb3V0cHV0bG4oIl9zdHJ1Y3RzLmhcIiIpOwotCX0KLQlvdXRwdXRsbigpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShKTklDbGFzcyBjbGF6eikgewotCWludCBqID0gMDsKLQlKTklGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZm9yICg7IGogPCBmaWVsZHMubGVuZ3RoOyBqKyspIHsKLQkJSk5JRmllbGQgZmllbGQgPSBmaWVsZHNbal07Ci0JCWludCBtb2RzID0gZmllbGQuZ2V0TW9kaWZpZXJzKCk7Ci0JCWlmICgobW9kcyAmIE1vZGlmaWVyLlBVQkxJQykgIT0gMCAmJiAobW9kcyAmIE1vZGlmaWVyLlNUQVRJQykgPT0gMCkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGogPT0gZmllbGRzLmxlbmd0aCkgcmV0dXJuOwotCWlmIChoZWFkZXIpIHsKLQkJZ2VuZXJhdGVIZWFkZXJGaWxlKGNsYXp6KTsKLQl9IGVsc2UgewotCQlnZW5lcmF0ZVNvdXJjZUZpbGUoY2xhenopOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoKSB7Ci0JaWYgKCFoZWFkZXIgJiYgZ2V0Q2xhc3NlcygpLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0Jc3VwZXIuZ2VuZXJhdGUoKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JcmV0dXJuIGhlYWRlciA/ICIuaCIgOiBzdXBlci5nZXRFeHRlbnNpb24oKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRTdWZmaXgoKSB7Ci0JcmV0dXJuICJfc3RydWN0cyI7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVFeGNsdWRlcyhKTklDbGFzc1tdIGNsYXNzZXMpIHsKLQlIYXNoU2V0IGV4Y2x1ZGVzID0gbmV3IEhhc2hTZXQoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJSk5JQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQlTdHJpbmcgZXhjbHVkZSA9IGNsYXp6LmdldEV4Y2x1ZGUoKTsKLQkJaWYgKGV4Y2x1ZGUubGVuZ3RoKCkgIT0gMCkgewotCQkJZXhjbHVkZXMuYWRkKGV4Y2x1ZGUpOwotCQl9Ci0JfQotCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4Y2x1ZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQlTdHJpbmcgZXhjbHVkZSA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCW91dHB1dGxuKGV4Y2x1ZGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCUpOSUNsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsKLQkJCVN0cmluZyBjbGFzc0V4Y2x1ZGUgPSBjbGF6ei5nZXRFeGNsdWRlKCk7Ci0JCQlpZiAoZXhjbHVkZS5lcXVhbHMoY2xhc3NFeGNsdWRlKSkgewotCQkJCW91dHB1dCgiI2RlZmluZSBOT18iKTsKLQkJCQlvdXRwdXRsbihjbGF6ei5nZXRTaW1wbGVOYW1lKCkpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJb3V0cHV0bG4oKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVIZWFkZXJGaWxlKEpOSUNsYXNzIGNsYXp6KSB7Ci0JZ2VuZXJhdGVTb3VyY2VTdGFydChjbGF6eik7Ci0JZ2VuZXJhdGVQcm90b3R5cGVzKGNsYXp6KTsKLQlnZW5lcmF0ZUJsYW5rTWFjcm9zKGNsYXp6KTsKLQlnZW5lcmF0ZVNvdXJjZUVuZChjbGF6eik7CQotCW91dHB1dGxuKCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTb3VyY2VGaWxlKEpOSUNsYXNzIGNsYXp6KSB7Ci0JZ2VuZXJhdGVTb3VyY2VTdGFydChjbGF6eik7Ci0JZ2VuZXJhdGVGSURzU3RydWN0dXJlKGNsYXp6KTsKLQlvdXRwdXRsbigpOwotCWdlbmVyYXRlR2xvYmFsVmFyKGNsYXp6KTsKLQlvdXRwdXRsbigpOwotCWdlbmVyYXRlRnVuY3Rpb25zKGNsYXp6KTsKLQlnZW5lcmF0ZVNvdXJjZUVuZChjbGF6eik7Ci0Jb3V0cHV0bG4oKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVNvdXJjZVN0YXJ0KEpOSUNsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGNsYXp6LmdldFNpbXBsZU5hbWUoKTsKLQlvdXRwdXQoIiNpZm5kZWYgTk9fIik7Ci0Jb3V0cHV0bG4oY2xhenpOYW1lKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVNvdXJjZUVuZChKTklDbGFzcyBjbGF6eikgewotCW91dHB1dGxuKCIjZW5kaWYiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUdsb2JhbFZhcihKTklDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGF6ek5hbWUgPSBjbGF6ei5nZXRTaW1wbGVOYW1lKCk7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCJfRklEX0NBQ0hFICIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGYzsiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUJsYW5rTWFjcm9zKEpOSUNsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGNsYXp6LmdldFNpbXBsZU5hbWUoKTsKLQlvdXRwdXRsbigiI2Vsc2UiKTsKLQlvdXRwdXQoIiNkZWZpbmUgY2FjaGUiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmllbGRzKGEsYikiKTsKLQlvdXRwdXQoIiNkZWZpbmUgZ2V0Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZpZWxkcyhhLGIsYykgTlVMTCIpOwotCW91dHB1dCgiI2RlZmluZSBzZXQiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmllbGRzKGEsYixjKSIpOwotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiX3NpemVvZigpIDAiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVByb3RvdHlwZXMoSk5JQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhenpOYW1lID0gY2xhenouZ2V0U2ltcGxlTmFtZSgpOwotCW91dHB1dCgidm9pZCBjYWNoZSIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QpOyIpOwotCWlmIChjbGF6ei5nZXRGbGFnKEZsYWdzLkZMQUdfU1RSVUNUKSkgewotCQlvdXRwdXQoInN0cnVjdCAiKTsKLQl9Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCIgKmdldCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCAiKTsKLQlpZiAoY2xhenouZ2V0RmxhZyhGbGFncy5GTEFHX1NUUlVDVCkpIHsKLQkJb3V0cHV0KCJzdHJ1Y3QgIik7Ci0JfQotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCIgKmxwU3RydWN0KTsiKTsKLQlvdXRwdXQoInZvaWQgc2V0Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCJGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsICIpOwotCWlmIChjbGF6ei5nZXRGbGFnKEZsYWdzLkZMQUdfU1RSVUNUKSkgewotCQlvdXRwdXQoInN0cnVjdCAiKTsKLQl9Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIiAqbHBTdHJ1Y3QpOyIpOwotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXQoIl9zaXplb2YoKSBzaXplb2YoIik7Ci0JaWYgKGNsYXp6LmdldEZsYWcoRmxhZ3MuRkxBR19TVFJVQ1QpKSB7Ci0JCW91dHB1dCgic3RydWN0ICIpOwotCX0KLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiKSIpOwotfQotCi12b2lkIGdlbmVyYXRlRklEc1N0cnVjdHVyZShKTklDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGF6ek5hbWUgPSBjbGF6ei5nZXRTaW1wbGVOYW1lKCk7Ci0Jb3V0cHV0KCJ0eXBlZGVmIHN0cnVjdCAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiX0ZJRF9DQUNIRSB7Iik7Ci0Jb3V0cHV0bG4oIlx0aW50IGNhY2hlZDsiKTsKLQlvdXRwdXRsbigiXHRqY2xhc3MgY2xheno7Iik7Ci0Jb3V0cHV0KCJcdGpmaWVsZElEICIpOwotCUpOSUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlKTklGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaWYgKGlnbm9yZUZpZWxkKGZpZWxkKSkgY29udGludWU7Ci0JCWlmICghZmlyc3QpIG91dHB1dCgiLCAiKTsKLQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCWZpcnN0ID0gZmFsc2U7Ci0JfQotCW91dHB1dGxuKCI7Iik7Ci0Jb3V0cHV0KCJ9ICIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJfRklEX0NBQ0hFOyIpOwotfQotCi12b2lkIGdlbmVyYXRlQ2FjaGVGdW5jdGlvbihKTklDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGF6ek5hbWUgPSBjbGF6ei5nZXRTaW1wbGVOYW1lKCk7Ci0Jb3V0cHV0KCJ2b2lkIGNhY2hlIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCkiKTsKLQlvdXRwdXRsbigieyIpOwotCW91dHB1dCgiXHRpZiAoIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZjLmNhY2hlZCkgcmV0dXJuOyIpOwotCUpOSUNsYXNzIHN1cGVyY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JaWYgKCFzdXBlcmNsYXp6LmdldE5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5PYmplY3QiKSkgewotCQlTdHJpbmcgc3VwZXJOYW1lID0gc3VwZXJjbGF6ei5nZXRTaW1wbGVOYW1lKCk7Ci0JCW91dHB1dCgiXHRjYWNoZSIpOwotCQlvdXRwdXQoc3VwZXJOYW1lKTsKLQkJb3V0cHV0bG4oIkZpZWxkcyhlbnYsIGxwT2JqZWN0KTsiKTsKLQl9Ci0Jb3V0cHV0KCJcdCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCWlmIChpc0NQUCkgewotCQlpZiAoR0xPQkFMX1JFRikgewotCQkJb3V0cHV0KCJGYy5jbGF6eiA9IChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoZW52LT5HZXRPYmplY3RDbGFzcyhscE9iamVjdCkpOyIpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KCJGYy5jbGF6eiA9IGVudi0+R2V0T2JqZWN0Q2xhc3MobHBPYmplY3QpOyIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKEdMT0JBTF9SRUYpIHsKLQkJCW91dHB1dCgiRmMuY2xhenogPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCkpOyIpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KCJGYy5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Iik7Ci0JCX0KLQl9Ci0Jb3V0cHV0bG4oKTsKLQlKTklGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJSk5JRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWlmIChpZ25vcmVGaWVsZChmaWVsZCkpIGNvbnRpbnVlOwotCQlvdXRwdXQoIlx0Iik7Ci0JCW91dHB1dChjbGF6ek5hbWUpOwotCQlvdXRwdXQoIkZjLiIpOwotCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJaWYgKGlzQ1BQKSB7Ci0JCQlvdXRwdXQoIiA9IGVudi0+R2V0RmllbGRJRCgiKTsKLQkJfSBlbHNlIHsKLQkJCW91dHB1dCgiID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgIik7Ci0JCX0KLQkJb3V0cHV0KGNsYXp6TmFtZSk7Ci0JCW91dHB1dCgiRmMuY2xhenosIFwiIik7Ci0JCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQlKTklUeXBlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCksIHR5cGU2NCA9IGZpZWxkLmdldFR5cGU2NCgpOwotCQlvdXRwdXQoIlwiLCAiKTsKLQkJaWYgKHR5cGUuZXF1YWxzKHR5cGU2NCkpIG91dHB1dCgiXCIiKTsKLQkJb3V0cHV0KHR5cGUuZ2V0VHlwZVNpZ25hdHVyZSghdHlwZS5lcXVhbHModHlwZTY0KSkpOwotCQlpZiAodHlwZS5lcXVhbHModHlwZTY0KSkgb3V0cHV0KCJcIiIpOwotCQlvdXRwdXRsbigiKTsiKTsKLQl9Ci0Jb3V0cHV0KCJcdCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGYy5jYWNoZWQgPSAxOyIpOwotCW91dHB1dGxuKCJ9Iik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVHZXRGaWVsZHMoSk5JQ2xhc3MgY2xhenopIHsKLQlKTklDbGFzcyBzdXBlcmNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotCVN0cmluZyBjbGF6ek5hbWUgPSBjbGF6ei5nZXRTaW1wbGVOYW1lKCk7Ci0JU3RyaW5nIHN1cGVyTmFtZSA9IHN1cGVyY2xhenouZ2V0U2ltcGxlTmFtZSgpOwotCWlmICghc3VwZXJjbGF6ei5nZXROYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IikpIHsKLQkJLyogV2luZG93cyBleGNlcHRpb24gLSBjYW5ub3QgY2FsbCBnZXQvc2V0IGZ1bmN0aW9uIG9mIHN1cGVyIGNsYXNzIGluIHRoaXMgY2FzZSAqLwotCQlpZiAoIShjbGF6ek5hbWUuZXF1YWxzKHN1cGVyTmFtZSArICJBIikgfHwgY2xhenpOYW1lLmVxdWFscyhzdXBlck5hbWUgKyAiVyIpKSkgewotCQkJb3V0cHV0KCJcdGdldCIpOwotCQkJb3V0cHV0KHN1cGVyTmFtZSk7Ci0JCQlvdXRwdXQoIkZpZWxkcyhlbnYsIGxwT2JqZWN0LCAoIik7Ci0JCQlvdXRwdXQoc3VwZXJOYW1lKTsKLQkJCW91dHB1dGxuKCIgKilscFN0cnVjdCk7Iik7Ci0JCX0gZWxzZSB7Ci0JCQlnZW5lcmF0ZUdldEZpZWxkcyhzdXBlcmNsYXp6KTsKLQkJfQotCX0KLQlKTklGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJSk5JRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWlmIChpZ25vcmVGaWVsZChmaWVsZCkpIGNvbnRpbnVlOwotCQlTdHJpbmcgZXhjbHVkZSA9IGZpZWxkLmdldEV4Y2x1ZGUoKTsKLQkJaWYgKGV4Y2x1ZGUubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0bG4oZXhjbHVkZSk7Ci0JCX0KLQkJYm9vbGVhbiBub1dpbkNFID0gZmllbGQuZ2V0RmxhZyhGTEFHX05PX1dJTkNFKTsKLQkJaWYgKG5vV2luQ0UpIHsKLQkJCW91dHB1dGxuKCIjaWZuZGVmIF9XSU4zMl9XQ0UiKTsKLQkJfQotCQlKTklUeXBlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCksIHR5cGU2NCA9IGZpZWxkLmdldFR5cGU2NCgpOwotCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlLmdldFNpbXBsZU5hbWUoKTsKLQkJU3RyaW5nIGFjY2Vzc29yID0gZmllbGQuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yID09IG51bGwgfHwgYWNjZXNzb3IubGVuZ3RoKCkgPT0gMCkgYWNjZXNzb3IgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCWlmICh0eXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCW91dHB1dCgiXHRscFN0cnVjdC0+Iik7Ci0JCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJb3V0cHV0KCIgPSAiKTsKLQkJCW91dHB1dChmaWVsZC5nZXRDYXN0KCkpOwotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPkdldCIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIigqZW52KS0+R2V0Iik7Ci0JCQl9Ci0JCQlvdXRwdXQodHlwZS5nZXRUeXBlU2lnbmF0dXJlMSghdHlwZS5lcXVhbHModHlwZTY0KSkpOwotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJGaWVsZChscE9iamVjdCwgIik7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dCgiRmllbGQoZW52LCBscE9iamVjdCwgIik7Ci0JCQl9Ci0JCQlvdXRwdXQoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQkJb3V0cHV0KCJGYy4iKTsKLQkJCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQkJb3V0cHV0KCIpOyIpOwotCQl9IGVsc2UgaWYgKHR5cGUuaXNBcnJheSgpKSB7Ci0JCQlKTklUeXBlIGNvbXBvbmVudFR5cGUgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKSwgY29tcG9uZW50VHlwZTY0ID0gdHlwZTY0LmdldENvbXBvbmVudFR5cGUoKTsKLQkJCWlmIChjb21wb25lbnRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQlvdXRwdXRsbigiXHR7Iik7Ci0JCQkJb3V0cHV0KCJcdCIpOwkJCQkKLQkJCQlvdXRwdXQodHlwZS5nZXRUeXBlU2lnbmF0dXJlMighdHlwZS5lcXVhbHModHlwZTY0KSkpOwotCQkJCW91dHB1dCgiIGxwT2JqZWN0MSA9ICgiKTsKLQkJCQlvdXRwdXQodHlwZS5nZXRUeXBlU2lnbmF0dXJlMighdHlwZS5lcXVhbHModHlwZTY0KSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIillbnYtPkdldE9iamVjdEZpZWxkKGxwT2JqZWN0LCAiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIikoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgbHBPYmplY3QsICIpOwotCQkJCX0KLQkJCQlvdXRwdXQoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQkJCW91dHB1dCgiRmMuIik7Ci0JCQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCQkJb3V0cHV0bG4oIik7Iik7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiXHRlbnYtPkdldCIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiXHQoKmVudiktPkdldCIpOwotCQkJCX0KLQkJCQlvdXRwdXQoY29tcG9uZW50VHlwZS5nZXRUeXBlU2lnbmF0dXJlMSghY29tcG9uZW50VHlwZS5lcXVhbHMoY29tcG9uZW50VHlwZTY0KSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIkFycmF5UmVnaW9uKGxwT2JqZWN0MSwgMCwgc2l6ZW9mKGxwU3RydWN0LT4iKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIkFycmF5UmVnaW9uKGVudiwgbHBPYmplY3QxLCAwLCBzaXplb2YobHBTdHJ1Y3QtPiIpOwotCQkJCX0KLQkJCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJCW91dHB1dCgiKSIpOwotCQkJCWlmICghY29tcG9uZW50VHlwZS5pc1R5cGUoImJ5dGUiKSkgewotCQkJCQlvdXRwdXQoIiAvIHNpemVvZigiKTsKLQkJCQkJb3V0cHV0KGNvbXBvbmVudFR5cGUuZ2V0VHlwZVNpZ25hdHVyZTIoIWNvbXBvbmVudFR5cGUuZXF1YWxzKGNvbXBvbmVudFR5cGU2NCkpKTsKLQkJCQkJb3V0cHV0KCIpIik7Ci0JCQkJfQotCQkJCW91dHB1dCgiLCAoIik7Ci0JCQkJb3V0cHV0KHR5cGUuZ2V0VHlwZVNpZ25hdHVyZTQoIXR5cGUuZXF1YWxzKHR5cGU2NCksIGZhbHNlKSk7CQkJCQotCQkJCW91dHB1dCgiKWxwU3RydWN0LT4iKTsKLQkJCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJCW91dHB1dGxuKCIpOyIpOwotCQkJCW91dHB1dCgiXHR9Iik7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBFcnJvcigibm90IGRvbmUiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW91dHB1dGxuKCJcdHsiKTsKLQkJCWlmIChpc0NQUCkgewotCQkJCW91dHB1dCgiXHRqb2JqZWN0IGxwT2JqZWN0MSA9IGVudi0+R2V0T2JqZWN0RmllbGQobHBPYmplY3QsICIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIlx0am9iamVjdCBscE9iamVjdDEgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgbHBPYmplY3QsICIpOwotCQkJfQotCQkJb3V0cHV0KGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJCW91dHB1dCgiRmMuIik7Ci0JCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJCW91dHB1dGxuKCIpOyIpOwotCQkJb3V0cHV0KCJcdGlmIChscE9iamVjdDEgIT0gTlVMTCkgZ2V0Iik7Ci0JCQlvdXRwdXQodHlwZU5hbWUpOwotCQkJb3V0cHV0KCJGaWVsZHMoZW52LCBscE9iamVjdDEsICZscFN0cnVjdC0+Iik7Ci0JCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJb3V0cHV0bG4oIik7Iik7Ci0JCQlvdXRwdXQoIlx0fSIpOwotCQl9Ci0JCW91dHB1dGxuKCk7Ci0JCWlmIChub1dpbkNFKSB7Ci0JCQlvdXRwdXRsbigiI2VuZGlmIik7Ci0JCX0KLQkJaWYgKGV4Y2x1ZGUubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0bG4oIiNlbmRpZiIpOwotCQl9Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlR2V0RnVuY3Rpb24oSk5JQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhenpOYW1lID0gY2xhenouZ2V0U2ltcGxlTmFtZSgpOwotCWlmIChjbGF6ei5nZXRGbGFnKEZsYWdzLkZMQUdfU1RSVUNUKSkgewotCQlvdXRwdXQoInN0cnVjdCAiKTsKLQl9Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCIgKmdldCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCAiKTsKLQlpZiAoY2xhenouZ2V0RmxhZyhGbGFncy5GTEFHX1NUUlVDVCkpIHsKLQkJb3V0cHV0KCJzdHJ1Y3QgIik7Ci0JfQotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCIgKmxwU3RydWN0KSIpOwotCW91dHB1dGxuKCJ7Iik7Ci0Jb3V0cHV0KCJcdGlmICghIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCJGYy5jYWNoZWQpIGNhY2hlIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZpZWxkcyhlbnYsIGxwT2JqZWN0KTsiKTsKLQlnZW5lcmF0ZUdldEZpZWxkcyhjbGF6eik7Ci0Jb3V0cHV0bG4oIlx0cmV0dXJuIGxwU3RydWN0OyIpOwotCW91dHB1dGxuKCJ9Iik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTZXRGaWVsZHMoSk5JQ2xhc3MgY2xhenopIHsKLQlKTklDbGFzcyBzdXBlcmNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotCVN0cmluZyBjbGF6ek5hbWUgPSBjbGF6ei5nZXRTaW1wbGVOYW1lKCk7Ci0JU3RyaW5nIHN1cGVyTmFtZSA9IHN1cGVyY2xhenouZ2V0U2ltcGxlTmFtZSgpOwotCWlmICghc3VwZXJjbGF6ei5nZXROYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IikpIHsKLQkJLyogV2luZG93cyBleGNlcHRpb24gLSBjYW5ub3QgY2FsbCBnZXQvc2V0IGZ1bmN0aW9uIG9mIHN1cGVyIGNsYXNzIGluIHRoaXMgY2FzZSAqLwotCQlpZiAoIShjbGF6ek5hbWUuZXF1YWxzKHN1cGVyTmFtZSArICJBIikgfHwgY2xhenpOYW1lLmVxdWFscyhzdXBlck5hbWUgKyAiVyIpKSkgewotCQkJb3V0cHV0KCJcdHNldCIpOwotCQkJb3V0cHV0KHN1cGVyTmFtZSk7Ci0JCQlvdXRwdXQoIkZpZWxkcyhlbnYsIGxwT2JqZWN0LCAoIik7Ci0JCQlvdXRwdXQoc3VwZXJOYW1lKTsKLQkJCW91dHB1dGxuKCIgKilscFN0cnVjdCk7Iik7Ci0JCX0gZWxzZSB7Ci0JCQlnZW5lcmF0ZVNldEZpZWxkcyhzdXBlcmNsYXp6KTsKLQkJfQotCX0KLQlKTklGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJSk5JRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWlmIChpZ25vcmVGaWVsZChmaWVsZCkpIGNvbnRpbnVlOwotCQlTdHJpbmcgZXhjbHVkZSA9IGZpZWxkLmdldEV4Y2x1ZGUoKTsKLQkJaWYgKGV4Y2x1ZGUubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0bG4oZXhjbHVkZSk7Ci0JCX0KLQkJYm9vbGVhbiBub1dpbkNFID0gZmllbGQuZ2V0RmxhZyhGTEFHX05PX1dJTkNFKTsKLQkJaWYgKG5vV2luQ0UpIHsKLQkJCW91dHB1dGxuKCIjaWZuZGVmIF9XSU4zMl9XQ0UiKTsKLQkJfQotCQlKTklUeXBlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCksIHR5cGU2NCA9IGZpZWxkLmdldFR5cGU2NCgpOwotCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlLmdldFNpbXBsZU5hbWUoKTsKLQkJU3RyaW5nIGFjY2Vzc29yID0gZmllbGQuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yID09IG51bGwgfHwgYWNjZXNzb3IubGVuZ3RoKCkgPT0gMCkgYWNjZXNzb3IgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCWlmICh0eXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCWlmIChpc0NQUCkgewotCQkJCW91dHB1dCgiXHRlbnYtPlNldCIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIlx0KCplbnYpLT5TZXQiKTsKLQkJCX0KLQkJCW91dHB1dCh0eXBlLmdldFR5cGVTaWduYXR1cmUxKCF0eXBlLmVxdWFscyh0eXBlNjQpKSk7Ci0JCQlpZiAoaXNDUFApIHsKLQkJCQlvdXRwdXQoIkZpZWxkKGxwT2JqZWN0LCAiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCJGaWVsZChlbnYsIGxwT2JqZWN0LCAiKTsKLQkJCX0KLQkJCW91dHB1dChmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQlvdXRwdXQoIkZjLiIpOwotCQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCQlvdXRwdXQoIiwgKCIpOwotCQkJb3V0cHV0KHR5cGUuZ2V0VHlwZVNpZ25hdHVyZTIoIXR5cGUuZXF1YWxzKHR5cGU2NCkpKTsKLQkJCW91dHB1dCgiKWxwU3RydWN0LT4iKTsKLQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCQlvdXRwdXQoIik7Iik7Ci0JCX0gZWxzZSBpZiAodHlwZS5pc0FycmF5KCkpIHsKLQkJCUpOSVR5cGUgY29tcG9uZW50VHlwZSA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLCBjb21wb25lbnRUeXBlNjQgPSB0eXBlNjQuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCW91dHB1dGxuKCJcdHsiKTsKLQkJCQlvdXRwdXQoIlx0Iik7CQkJCQotCQkJCW91dHB1dCh0eXBlLmdldFR5cGVTaWduYXR1cmUyKCF0eXBlLmVxdWFscyh0eXBlNjQpKSk7Ci0JCQkJb3V0cHV0KCIgbHBPYmplY3QxID0gKCIpOwotCQkJCW91dHB1dCh0eXBlLmdldFR5cGVTaWduYXR1cmUyKCF0eXBlLmVxdWFscyh0eXBlNjQpKSk7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiKWVudi0+R2V0T2JqZWN0RmllbGQobHBPYmplY3QsICIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiKSgqZW52KS0+R2V0T2JqZWN0RmllbGQoZW52LCBscE9iamVjdCwgIik7Ci0JCQkJfQotCQkJCW91dHB1dChmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQkJb3V0cHV0KCJGYy4iKTsKLQkJCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJCQlvdXRwdXRsbigiKTsiKTsKLQkJCQlpZiAoaXNDUFApIHsKLQkJCQkJb3V0cHV0KCJcdGVudi0+U2V0Iik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCJcdCgqZW52KS0+U2V0Iik7Ci0JCQkJfQotCQkJCW91dHB1dChjb21wb25lbnRUeXBlLmdldFR5cGVTaWduYXR1cmUxKCFjb21wb25lbnRUeXBlLmVxdWFscyhjb21wb25lbnRUeXBlNjQpKSk7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiQXJyYXlSZWdpb24obHBPYmplY3QxLCAwLCBzaXplb2YobHBTdHJ1Y3QtPiIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dHB1dCgiQXJyYXlSZWdpb24oZW52LCBscE9iamVjdDEsIDAsIHNpemVvZihscFN0cnVjdC0+Iik7Ci0JCQkJfQotCQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCQkJb3V0cHV0KCIpIik7Ci0JCQkJaWYgKCFjb21wb25lbnRUeXBlLmlzVHlwZSgiYnl0ZSIpKSB7Ci0JCQkJCW91dHB1dCgiIC8gc2l6ZW9mKCIpOwotCQkJCQlvdXRwdXQoY29tcG9uZW50VHlwZS5nZXRUeXBlU2lnbmF0dXJlMighY29tcG9uZW50VHlwZS5lcXVhbHMoY29tcG9uZW50VHlwZTY0KSkpOwotCQkJCQlvdXRwdXQoIikiKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KCIsICgiKTsKLQkJCQlvdXRwdXQodHlwZS5nZXRUeXBlU2lnbmF0dXJlNCghdHlwZS5lcXVhbHModHlwZTY0KSwgZmFsc2UpKTsJCQkJCi0JCQkJb3V0cHV0KCIpbHBTdHJ1Y3QtPiIpOwotCQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCQkJb3V0cHV0bG4oIik7Iik7Ci0JCQkJb3V0cHV0KCJcdH0iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IEVycm9yKCJub3QgZG9uZSIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJb3V0cHV0bG4oIlx0eyIpOwotCQkJb3V0cHV0KCJcdGpvYmplY3QgbHBPYmplY3QxID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGxwT2JqZWN0LCAiKTsKLQkJCW91dHB1dChmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQlvdXRwdXQoIkZjLiIpOwotCQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCQlvdXRwdXRsbigiKTsiKTsKLQkJCW91dHB1dCgiXHRpZiAobHBPYmplY3QxICE9IE5VTEwpIHNldCIpOwotCQkJb3V0cHV0KHR5cGVOYW1lKTsKLQkJCW91dHB1dCgiRmllbGRzKGVudiwgbHBPYmplY3QxLCAmbHBTdHJ1Y3QtPiIpOwotCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCW91dHB1dGxuKCIpOyIpOwotCQkJb3V0cHV0KCJcdH0iKTsKLQkJfQotCQlvdXRwdXRsbigpOwotCQlpZiAobm9XaW5DRSkgewotCQkJb3V0cHV0bG4oIiNlbmRpZiIpOwotCQl9Ci0JCWlmIChleGNsdWRlLmxlbmd0aCgpICE9IDApIHsKLQkJCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJfQotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZVNldEZ1bmN0aW9uKEpOSUNsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGNsYXp6LmdldFNpbXBsZU5hbWUoKTsKLQlvdXRwdXQoInZvaWQgc2V0Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCJGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsICIpOwotCWlmIChjbGF6ei5nZXRGbGFnKEZsYWdzLkZMQUdfU1RSVUNUKSkgewotCQlvdXRwdXQoInN0cnVjdCAiKTsKLQl9Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIiAqbHBTdHJ1Y3QpIik7Ci0Jb3V0cHV0bG4oInsiKTsKLQlvdXRwdXQoIlx0aWYgKCEiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXQoIkZjLmNhY2hlZCkgY2FjaGUiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmllbGRzKGVudiwgbHBPYmplY3QpOyIpOwotCWdlbmVyYXRlU2V0RmllbGRzKGNsYXp6KTsKLQlvdXRwdXRsbigifSIpOwotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25zKEpOSUNsYXNzIGNsYXp6KSB7Ci0JZ2VuZXJhdGVDYWNoZUZ1bmN0aW9uKGNsYXp6KTsKLQlvdXRwdXRsbigpOwotCWdlbmVyYXRlR2V0RnVuY3Rpb24oY2xhenopOwotCW91dHB1dGxuKCk7Ci0JZ2VuZXJhdGVTZXRGdW5jdGlvbihjbGF6eik7Ci19Ci0KLWJvb2xlYW4gaWdub3JlRmllbGQoSk5JRmllbGQgZmllbGQpIHsKLQlpbnQgbW9kcyA9IGZpZWxkLmdldE1vZGlmaWVycygpOwotCXJldHVybgotCQkoKG1vZHMgJiBNb2RpZmllci5QVUJMSUMpID09IDApIHx8Ci0JCSgobW9kcyAmIE1vZGlmaWVyLkZJTkFMKSAhPSAwKSB8fAotCQkoKG1vZHMgJiBNb2RpZmllci5TVEFUSUMpICE9IDApOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmFjY2Vzc2liaWxpdHkuZ3RrLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmFjY2Vzc2liaWxpdHkuZ3RrLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjFiZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5hY2Nlc3NpYmlsaXR5Lmd0ay5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3d0X2NvcHlyaWdodD0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIFwKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiBcCi0gKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXNcbiBcCi0gKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKSBWZXJzaW9uIDIuMSB0aGF0XG4gXAotICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gKGxncGwtdjIxLnR4dCkuICBUaGUgTEdQTCBpcyBhbHNvXG4gXAotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLmh0bWwuICBJZiB0aGUgdmVyc2lvblxuIFwKLSAqIG9mIHRoZSBMR1BMIGF0IGh0dHA6Ly93d3cuZ251Lm9yZyBpcyBkaWZmZXJlbnQgdG8gdGhlIHZlcnNpb24gb2ZcbiBcCi0gKiB0aGUgTEdQTCBhY2NvbXBhbnlpbmcgdGhpcyBkaXN0cmlidXRpb24gYW5kIHRoZXJlIGlzIGFueSBjb25mbGljdFxuIFwKLSAqIGJldHdlZW4gdGhlIHR3byBsaWNlbnNlIHZlcnNpb25zLCB0aGUgdGVybXMgb2YgdGhlIExHUEwgYWNjb21wYW55aW5nXG4gXAotICogdGhpcyBkaXN0cmlidXRpb24gc2hhbGwgZ292ZXJuLlxuIFwKLSAqIFxuIFwKLSAqIENvbnRyaWJ1dG9yczpcbiBcCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4gXAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4KLSAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2Fpcm8ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2Fpcm8ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMTRlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhaXJvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zd3RfY29weXJpZ2h0PS8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKipcbiBcCi0gKiBWZXJzaW9uOiBNUEwgMS4xXG4gXAotICpcbiBcCi0gKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb25cbiBcCi0gKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiBcCi0gKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gXAotICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvXG4gXAotICpcbiBcCi0gKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLFxuIFwKLSAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZVxuIFwKLSAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlXG4gXAotICogTGljZW5zZS5cbiBcCi0gKlxuIFwKLSAqIENvbnRyaWJ1dG9yKHMpOlxuIFwKLSAqXG4gXAotICogSUJNXG4gXAotICogLSAgQmluZGluZyB0byBwZXJtaXQgaW50ZXJmYWNpbmcgYmV0d2VlbiBDYWlybyBhbmQgU1dUXG4gXAotICogLSAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA4IElCTSBDb3JwLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiBcCi0gKlxuIFwKLSAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovXG4KLSAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ25vbWUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ25vbWUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxOGM1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdub21lLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zd3RfY29weXJpZ2h0PS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gXAotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIFwKLSAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtc1xuIFwKLSAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpIFZlcnNpb24gMi4xIHRoYXRcbiBcCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiAobGdwbC12MjEudHh0KS4gIFRoZSBMR1BMIGlzIGFsc29cbiBcCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwuaHRtbC4gIElmIHRoZSB2ZXJzaW9uXG4gXAotICogb2YgdGhlIExHUEwgYXQgaHR0cDovL3d3dy5nbnUub3JnIGlzIGRpZmZlcmVudCB0byB0aGUgdmVyc2lvbiBvZlxuIFwKLSAqIHRoZSBMR1BMIGFjY29tcGFueWluZyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgdGhlcmUgaXMgYW55IGNvbmZsaWN0XG4gXAotICogYmV0d2VlbiB0aGUgdHdvIGxpY2Vuc2UgdmVyc2lvbnMsIHRoZSB0ZXJtcyBvZiB0aGUgTEdQTCBhY2NvbXBhbnlpbmdcbiBcCi0gKiB0aGlzIGRpc3RyaWJ1dGlvbiBzaGFsbCBnb3Zlcm4uXG4gXAotICogXG4gXAotICogQ29udHJpYnV0b3JzOlxuIFwKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiBcCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbgotIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ3RrLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZmE2NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXN3dF9jb3B5cmlnaHQ9LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiBcCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiBcCi0qIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtc1xuIFwKLSogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkgVmVyc2lvbiAyLjEgdGhhdFxuIFwKLSogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gKGxncGwtdjIxLnR4dCkuICBUaGUgTEdQTCBpcyBhbHNvXG4gXAotKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwuaHRtbC4gIElmIHRoZSB2ZXJzaW9uXG4gXAotKiBvZiB0aGUgTEdQTCBhdCBodHRwOi8vd3d3LmdudS5vcmcgaXMgZGlmZmVyZW50IHRvIHRoZSB2ZXJzaW9uIG9mXG4gXAotKiB0aGUgTEdQTCBhY2NvbXBhbnlpbmcgdGhpcyBkaXN0cmlidXRpb24gYW5kIHRoZXJlIGlzIGFueSBjb25mbGljdFxuIFwKLSogYmV0d2VlbiB0aGUgdHdvIGxpY2Vuc2UgdmVyc2lvbnMsIHRoZSB0ZXJtcyBvZiB0aGUgTEdQTCBhY2NvbXBhbnlpbmdcbiBcCi0qIHRoaXMgZGlzdHJpYnV0aW9uIHNoYWxsIGdvdmVybi5cbiBcCi0qIFxuIFwKLSogQ29udHJpYnV0b3JzOlxuIFwKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuIFwKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4KLSAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxYzI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zd3RfY29weXJpZ2h0PS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gXAotKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG4gXAotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG4gXAotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcbiBcCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gXAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuIFwKLSpcbiBcCi0qIENvbnRyaWJ1dG9yczpcbiBcCi0qICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuIFwKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4KLXN3dF9wcm9wZXJ0aWVzX2NvcHlyaWdodD0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLSNcblwKLSMgQ29udHJpYnV0b3JzOlxuXAotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG5cCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zd3RfbWFpbl9jbGFzc2VzPVwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5hY2Nlc3NpYmlsaXR5Lmd0ay5BVEssLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL2d0ay9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLk9TLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS9jYXJib24vbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNkZS5DREUsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFByb2dyYW0vY2RlL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nbm9tZS5HTk9NRSwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUHJvZ3JhbS9nbm9tZS9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ3RrLkdUSywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvbW90aWZfZ3RrL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuT1MsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL2d0ay9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuT1MsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL21vdGlmL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3ppbGxhLlhQQ09NLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBNb3ppbGxhL2NvbW1vbi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW96aWxsYS5pbml0LlhQQ09NSW5pdCwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgTW96aWxsYS9jb21tb24vbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5DT00sLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL3dpbjMyL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5waG90b24uT1MsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL3Bob3Rvbi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1MsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL3dpbjMyL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nZGlwLkdkaXAsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL3dpbjMyL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYWlyby5DYWlybywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvY2Fpcm8vbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5nbHguR0xYLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBPcGVuR0wvZ2x4L2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wud2luMzIuV0dMLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBPcGVuR0wvd2luMzIvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5jYXJib24uQUdMLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBPcGVuR0wvY2FyYm9uL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5DLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS9jb21tb24vbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndwZi5PUywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvd3BmL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5XaW4zMiwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvd3BmX3dpbjMyL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jb2NvYS5Db2NvYSwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvY2FyYm9uL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jb2NvYS5PUywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvY29jb2EvbGlicmFyeS8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1NjljNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3d0LnRvb2xzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN3dC50b29scy5BY3RpdmF0b3IKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zd3QudG9vbHMsCi0gb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOyB4LWludGVybmFsOj10cnVlCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5zd3Q7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL01hYyBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9ET01Xcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL01hYyBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9ET01Xcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4MTNiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9NYWMgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvRE9NV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9NYWMgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWFjR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9NYWMgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWFjR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGQxOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTWFjIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01hY0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1wdWJsaWMgY2xhc3MgTWFjR2VuZXJhdG9yIHsKLQlTdHJpbmdbXSB4bWxzOwotCURvY3VtZW50W10gZG9jdW1lbnRzOwotCVN0cmluZyBvdXRwdXREaXIsIG1haW5DbGFzc05hbWU7Ci0JU3RyaW5nIGRlbGltaXRlciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCVByaW50U3RyZWFtIG91dDsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQlVJTERfQ19TT1VSQ0UgPSB0cnVlOwotCi1wdWJsaWMgTWFjR2VuZXJhdG9yKCkgewotfQotCi1zdGF0aWMgdm9pZCBsaXN0KEZpbGUgcGF0aCwgQXJyYXlMaXN0IGxpc3QpIHsKLQlpZiAocGF0aCA9PSBudWxsKSByZXR1cm47Ci0JRmlsZVtdIGZyYW1ld29ya3MgPSBwYXRoLmxpc3RGaWxlcygpOwotCWlmIChmcmFtZXdvcmtzID09IG51bGwpIHJldHVybjsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZyYW1ld29ya3MubGVuZ3RoOyBpKyspIHsKLQkJRmlsZSBmaWxlID0gZnJhbWV3b3Jrc1tpXTsKLQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZigiLiIpOwotCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCVN0cmluZyB4bWwgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIi9SZXNvdXJjZXMvQnJpZGdlU3VwcG9ydC8iICsgbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIkZ1bGwuYnJpZGdlc3VwcG9ydCI7Ci0JCQlpZiAobmV3IEZpbGUoeG1sKS5leGlzdHMoKSkgewotCQkJCWxpc3QuYWRkKHhtbCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLWludCBnZXRMZXZlbChOb2RlIG5vZGUpIHsKLQlpbnQgbGV2ZWwgPSAwOwotCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJbGV2ZWwrKzsKLQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCX0KLQlyZXR1cm4gbGV2ZWw7Ci19Ci0KLXZvaWQgbWVyZ2UoRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50IGV4dHJhRG9jdW1lbnQpIHsKLQlpZiAoZXh0cmFEb2N1bWVudCA9PSBudWxsKSByZXR1cm47Ci0JCi0JLyogQnVpbGQgYSBsb29rdXAgdGFibGUgZm9yIGV4dHJhRG9jdW1lbnQgKi8KLQlIYXNoTWFwIGV4dHJhcyA9IG5ldyBIYXNoTWFwKCk7Ci0JYnVpbGRMb29rdXAoZXh0cmFEb2N1bWVudCwgZXh0cmFzKTsKLQotCS8qIE1lcmdlIGF0dHJpYnV0ZXMgb24gZXhpc3RpbmcgZWxlbWVudHMgYnVpbGRpbmcgYSBsb29rdXAgdGFibGUgZm9yIGRvY3VtZW50ICovCi0JSGFzaE1hcCBsb29rdXAgPSBuZXcgSGFzaE1hcCgpOwotCW1lcmdlKGRvY3VtZW50LCBleHRyYXMsIGxvb2t1cCk7Ci0JCi0JLyogCi0JICogTWVyZ2UgbmV3IGVsZW1lbnRzLiBFeHRyYXMgYXQgdGhpcyBwb2ludCBjb250YWlucyBvbmx5IGVsZW1lbnRzIHRoYXQgd2VyZQotCSAqIG5vdCBmb3VuZCBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JQXJyYXlMaXN0IHNvcnRlZE5vZGVzID0gQ29sbGVjdGlvbnMubGlzdChDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihleHRyYXMudmFsdWVzKCkpKTsKLQlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZE5vZGVzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJaW50IGNvbXBhcmUgPSBnZXRMZXZlbCgoTm9kZSlhcmcwKSAtIGdldExldmVsKChOb2RlKWFyZzEpOwotCQkJaWYgKGNvbXBhcmUgPT0gMCkgewotCQkJCXJldHVybiAoKE5vZGUpYXJnMCkuZ2V0Tm9kZU5hbWUoKS5jb21wYXJlVG8oKChOb2RlKWFyZzEpLmdldE5vZGVOYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIGNvbXBhcmU7Ci0JCX0KLQl9KTsKLQlTdHJpbmcgZGVsaW1pdGVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzb3J0ZWROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCVN0cmluZyBuYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlpZiAoImFyZyIuZXF1YWxzKG5hbWUpIHx8ICJyZXR2YWwiLmVxdWFscyhuYW1lKSkgewotCQkJaWYgKCFzb3J0ZWROb2Rlcy5jb250YWlucyhub2RlLmdldFBhcmVudE5vZGUoKSkpIGNvbnRpbnVlOwotCQl9Ci0JCU5vZGUgcGFyZW50ID0gKE5vZGUpbG9va3VwLmdldChnZXRLZXkobm9kZS5nZXRQYXJlbnROb2RlKCkpKTsKLQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlLmdldE5vZGVOYW1lKCkpOwotCQlTdHJpbmcgdGV4dCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMCA/IGRlbGltaXRlciA6ICIiOwotCQlmb3IgKGludCBpID0gMCwgbGV2ZWwgPSBnZXRMZXZlbChwYXJlbnQpIC0gMTsgaSA8IGxldmVsOyBpKyspIHsKLQkJCXRleHQgKz0gIiAgIjsKLQkJfQotCQlwYXJlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCkpOwotCQlwYXJlbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCXBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkZWxpbWl0ZXIpKTsKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGogPCBsZW5ndGg7IGorKykgewotCQkJTm9kZSBhdHRyID0gKE5vZGUpYXR0cmlidXRlcy5pdGVtKGopOwotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ci5nZXROb2RlTmFtZSgpLCBhdHRyLmdldE5vZGVWYWx1ZSgpKTsKLQkJfQotCQlsb29rdXAucHV0KGdldEtleShlbGVtZW50KSwgZWxlbWVudCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKLQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgewotCQlwcm9ncmVzcy5zZXRUb3RhbChCVUlMRF9DX1NPVVJDRSA/IDQgOiAzKTsKLQkJcHJvZ3Jlc3Muc2V0TWVzc2FnZSgiZXh0cmEgYXR0cmlidXRlcy4uLiIpOwotCX0KLQlnZW5lcmF0ZUV4dHJhQXR0cmlidXRlcygpOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSB7Ci0JCXByb2dyZXNzLnN0ZXAoKTsKLQkJcHJvZ3Jlc3Muc2V0TWVzc2FnZShtYWluQ2xhc3NOYW1lKTsKLQl9Ci0JZ2VuZXJhdGVNYWluQ2xhc3MoKTsKLQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgewotCQlwcm9ncmVzcy5zdGVwKCk7Ci0JCXByb2dyZXNzLnNldE1lc3NhZ2UoImNsYXNzZXMuLi4iKTsKLQl9Ci0JZ2VuZXJhdGVDbGFzc2VzKCk7Ci0JaWYgKEJVSUxEX0NfU09VUkNFKSB7Ci0JCWlmIChwcm9ncmVzcyAhPSBudWxsKSB7Ci0JCQlwcm9ncmVzcy5zdGVwKCk7Ci0JCQlwcm9ncmVzcy5zZXRNZXNzYWdlKCJDIHNvdXJjZS4uLiIpOwotCQl9Ci0JCWdlbmVyYXRlQ1NvdXJjZSgpOwotCX0KLQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgewotCQlwcm9ncmVzcy5zdGVwKCk7Ci0JCXByb2dyZXNzLnNldE1lc3NhZ2UoIkRvbmUuIik7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlQ1NvdXJjZSgpIHsKLQlKTklHZW5lcmF0b3JBcHAgYXBwID0gbmV3IEpOSUdlbmVyYXRvckFwcCgpOwotCWFwcC5zZXRNYWluQ2xhc3NOYW1lKG1haW5DbGFzc05hbWUsIG91dHB1dERpciArICIvbGlicmFyeSIpOwotCWFwcC5nZW5lcmF0ZSgpOwotfQotCi1TdHJpbmcgZml4RGVsaW1pdGVyKFN0cmluZyBzdHIpIHsKLQlpZiAoZGVsaW1pdGVyLmVxdWFscygiXG4iKSkgcmV0dXJuIHN0cjsKLQlpbnQgaW5kZXggPSAwLCBsZW5ndGggPSBzdHIubGVuZ3RoKCk7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJaW50IHN0YXJ0ID0gaW5kZXg7Ci0JCWluZGV4ID0gc3RyLmluZGV4T2YoJ1xuJywgc3RhcnQpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoc3RyLnN1YnN0cmluZyhzdGFydCwgbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KSk7Ci0JCQlidWZmZXIuYXBwZW5kKGRlbGltaXRlcik7Ci0JCQlpbmRleCsrOwotCQl9Ci0JfQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLQotdm9pZCBnZW5lcmF0ZU1ldGhvZHMoU3RyaW5nIGNsYXNzTmFtZSwgQXJyYXlMaXN0IG1ldGhvZHMpIHsKLQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWV0aG9kcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCU5vZGUgbWV0aG9kID0gKE5vZGUpaXRlcmF0b3IubmV4dCgpOwotCQlOYW1lZE5vZGVNYXAgbXRoQXR0cmlidXRlcyA9IG1ldGhvZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCVN0cmluZyBzZWwgPSBtdGhBdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgic2VsZWN0b3IiKS5nZXROb2RlVmFsdWUoKTsKLQkJb3V0KCJwdWJsaWMgIik7Ci0JCWJvb2xlYW4gaXNTdGF0aWMgPSBpc1N0YXRpYyhtZXRob2QpOyAKLQkJaWYgKGlzU3RhdGljKSBvdXQoInN0YXRpYyAiKTsKLQkJTm9kZSByZXR1cm5Ob2RlID0gZ2V0UmV0dXJuTm9kZShtZXRob2QuZ2V0Q2hpbGROb2RlcygpKTsKLQkJaWYgKGdldFR5cGUocmV0dXJuTm9kZSkuZXF1YWxzKCJ2b2lkIikpIHJldHVybk5vZGUgPSBudWxsOwotCQlTdHJpbmcgcmV0dXJuVHlwZSA9ICIiLCByZXR1cm5UeXBlNjQgPSAiIjsKLQkJaWYgKHJldHVybk5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSByZXR1cm5UeXBlID0gZ2V0SmF2YVR5cGUocmV0dXJuTm9kZSksIHR5cGU2NCA9IHJldHVyblR5cGU2NCA9IGdldEphdmFUeXBlNjQocmV0dXJuTm9kZSk7Ci0JCQlvdXQodHlwZSk7Ci0JCQlpZiAoIXR5cGUuZXF1YWxzKHR5cGU2NCkpIHsKLQkJCQlvdXQoIiAvKiIpOwotCQkJCW91dCh0eXBlNjQpOwotCQkJCW91dCgiKi8iKTsKLQkJCX0KLQkJCW91dCgiICIpOwotCQl9IGVsc2UgewotCQkJb3V0KCJ2b2lkICIpOwotCQl9Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gc2VsOwotCQlpZiAoaXNVbmlxdWUobWV0aG9kLCBtZXRob2RzKSkgewotCQkJaW50IGluZGV4ID0gbWV0aG9kTmFtZS5pbmRleE9mKCI6Iik7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQkvL1RPRE8gaW1wcm92ZSB0aGlzIHNlbGVjdG9yCi0JCQltZXRob2ROYW1lID0gbWV0aG9kTmFtZS5yZXBsYWNlQWxsKCI6IiwgIl8iKTsKLQkJCWlmIChpc1N0YXRpYykgbWV0aG9kTmFtZSA9ICJzdGF0aWNfIiArIG1ldGhvZE5hbWU7Ci0JCX0KLQkJb3V0KG1ldGhvZE5hbWUpOwotCQlvdXQoIigiKTsKLQkJTm9kZUxpc3QgcGFyYW1zID0gbWV0aG9kLmdldENoaWxkTm9kZXMoKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGsgPSAwOyBrIDwgcGFyYW1zLmdldExlbmd0aCgpOyBrKyspIHsKLQkJCU5vZGUgcGFyYW0gPSBwYXJhbXMuaXRlbShrKTsKLQkJCWlmICgiYXJnIi5lcXVhbHMocGFyYW0uZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlOYW1lZE5vZGVNYXAgcGFyYW1BdHRyaWJ1dGVzID0gcGFyYW0uZ2V0QXR0cmlidXRlcygpOwotCQkJCWlmICghZmlyc3QpIG91dCgiLCAiKTsKLQkJCQlTdHJpbmcgdHlwZSA9IGdldEphdmFUeXBlKHBhcmFtKSwgdHlwZTY0ID0gZ2V0SmF2YVR5cGU2NChwYXJhbSk7Ci0JCQkJb3V0KCB0eXBlKTsKLQkJCQlpZiAoIXR5cGUuZXF1YWxzKHR5cGU2NCkpIHsKLQkJCQkJb3V0KCIgLyoiKTsKLQkJCQkJb3V0KHR5cGU2NCk7Ci0JCQkJCW91dCgiKi8iKTsKLQkJCQl9Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlvdXQoIiAiKTsKLQkJCQlTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW1BdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgibmFtZSIpLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChwYXJhbU5hbWUubGVuZ3RoKCkgPT0gMCkgcGFyYW1OYW1lID0gImFyZyIgKyBwYXJhbUF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJpbmRleCIpLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChwYXJhbU5hbWUuZXF1YWxzKCJib29sZWFuIikpIHBhcmFtTmFtZSA9ICJiIjsKLQkJCQlvdXQocGFyYW1OYW1lKTsKLQkJCX0KLQkJfQotCQlvdXQoIikgeyIpOwotCQlvdXRsbigpOwotCQlpZiAocmV0dXJuTm9kZSAhPSBudWxsICYmIGlzU3RydWN0KHJldHVybk5vZGUpKSB7Ci0JCQlvdXQoIlx0Iik7Ci0JCQlvdXQocmV0dXJuVHlwZSk7Ci0JCQlvdXQoIiByZXN1bHQgPSBuZXcgIik7Ci0JCQlvdXQocmV0dXJuVHlwZSk7Ci0JCQlvdXQoIigpOyIpOwotCQkJb3V0bG4oKTsKLQkJCW91dCgiXHRPUy5vYmpjX21zZ1NlbmRfc3RyZXQocmVzdWx0LCAiKTsKLQkJfSBlbHNlIGlmIChyZXR1cm5Ob2RlICE9IG51bGwgJiYgaXNCb29sZWFuKHJldHVybk5vZGUpKSB7Ci0JCQlvdXQoIlx0cmV0dXJuICIpOwotCQkJb3V0KCJPUy5vYmpjX21zZ1NlbmRfYm9vbCgiKTsKLQkJfSBlbHNlIGlmIChyZXR1cm5Ob2RlICE9IG51bGwgJiYgaXNGbG9hdGluZ1BvaW50KHJldHVybk5vZGUpKSB7Ci0JCQlvdXQoIlx0cmV0dXJuICIpOwotCQkJaWYgKHJldHVyblR5cGUuZXF1YWxzKCJmbG9hdCIpKSBvdXQoIihmbG9hdCkiKTsKLQkJCW91dCgiT1Mub2JqY19tc2dTZW5kX2ZwcmV0KCIpOwotCQl9IGVsc2UgaWYgKHJldHVybk5vZGUgIT0gbnVsbCAmJiBpc09iamVjdChyZXR1cm5Ob2RlKSkgewotCQkJb3V0KCJcdGludCAvKmxvbmcqLyByZXN1bHQgPSBPUy5vYmpjX21zZ1NlbmQoIik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocmV0dXJuTm9kZSAhPSBudWxsKSB7Ci0JCQkJb3V0KCJcdHJldHVybiAiKTsKLQkJCQlpZiAoKHJldHVyblR5cGUuZXF1YWxzKCJpbnQiKSAmJiByZXR1cm5UeXBlNjQuZXF1YWxzKCJpbnQiKSkgfHwgIXJldHVyblR5cGUuZXF1YWxzKCJpbnQiKSkgewotCQkJCQlvdXQoIigiKTsKLQkJCQkJb3V0KHJldHVyblR5cGUpOwotCQkJCQlvdXQoIikiKTsKLQkJCQl9Ci0JCQkJaWYgKHJldHVyblR5cGUuZXF1YWxzKCJpbnQiKSAmJiByZXR1cm5UeXBlNjQuZXF1YWxzKCJpbnQiKSkgewotCQkJCQlvdXQoIi8qNjQqLyIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJb3V0KCJcdCIpOwotCQkJfQotCQkJb3V0KCJPUy5vYmpjX21zZ1NlbmQoIik7Ci0JCX0KLQkJaWYgKGlzU3RhdGljKSB7Ci0JCQlvdXQoIk9TLmNsYXNzXyIpOwotCQkJb3V0KGNsYXNzTmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlvdXQoInRoaXMuaWQiKTsKLQkJfQotCQlvdXQoIiwgT1MuIik7Ci0JCW91dChnZXRTZWxDb25zdChzZWwpKTsKLQkJZmlyc3QgPSBmYWxzZTsKLQkJZm9yIChpbnQgayA9IDA7IGsgPCBwYXJhbXMuZ2V0TGVuZ3RoKCk7IGsrKykgewotCQkJTm9kZSBwYXJhbSA9IHBhcmFtcy5pdGVtKGspOwotCQkJaWYgKCJhcmciLmVxdWFscyhwYXJhbS5nZXROb2RlTmFtZSgpKSkgewotCQkJCU5hbWVkTm9kZU1hcCBwYXJhbUF0dHJpYnV0ZXMgPSBwYXJhbS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJaWYgKCFmaXJzdCkgb3V0KCIsICIpOwotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJU3RyaW5nIHBhcmFtTmFtZSA9IHBhcmFtQXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAocGFyYW1OYW1lLmxlbmd0aCgpID09IDApIHBhcmFtTmFtZSA9ICJhcmciICsgcGFyYW1BdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiaW5kZXgiKS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAocGFyYW1OYW1lLmVxdWFscygiYm9vbGVhbiIpKSBwYXJhbU5hbWUgPSAiYiI7Ci0JCQkJaWYgKGlzT2JqZWN0KHBhcmFtKSkgewotCQkJCQlvdXQocGFyYW1OYW1lKTsKLQkJCQkJb3V0KCIgIT0gbnVsbCA/ICIpOwotCQkJCQlvdXQocGFyYW1OYW1lKTsKLQkJCQkJb3V0KCIuaWQgOiAwIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0KHBhcmFtTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW91dCgiKSIpOwotCQlvdXQoIjsiKTsKLQkJb3V0bG4oKTsKLQkJaWYgKHJldHVybk5vZGUgIT0gbnVsbCAmJiBpc09iamVjdChyZXR1cm5Ob2RlKSkgewotCQkJaWYgKCFpc1N0YXRpYyAmJiByZXR1cm5UeXBlLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJb3V0KCJcdHJldHVybiByZXN1bHQgPT0gdGhpcy5pZCA/IHRoaXMgOiAocmVzdWx0ICE9IDAgPyBuZXcgIik7Ci0JCQkJb3V0KHJldHVyblR5cGUpOwotCQkJCW91dCgiKHJlc3VsdCkgOiBudWxsKTsiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0KCJcdHJldHVybiByZXN1bHQgIT0gMCA/IG5ldyAiKTsKLQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IHJldHVybk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCU5vZGUgc3d0X2FsbG9jID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInN3dF9hbGxvYyIpOwotCQkJCWlmIChzd3RfYWxsb2MgIT0gbnVsbCAmJiBzd3RfYWxsb2MuZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzKCJ0cnVlIikpIHsKLQkJCQkJb3V0KGNsYXNzTmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0KHJldHVyblR5cGUpOwotCQkJCX0KLQkJCQlvdXQoIihyZXN1bHQpIDogbnVsbDsiKTsKLQkJCX0KLQkJCW91dGxuKCk7Ci0JCX0gZWxzZSBpZiAocmV0dXJuTm9kZSAhPSBudWxsICYmIGlzU3RydWN0KHJldHVybk5vZGUpKSB7Ci0JCQlvdXQoIlx0cmV0dXJuIHJlc3VsdDsiKTsKLQkJCW91dGxuKCk7Ci0JCX0KLQkJb3V0KCJ9Iik7Ci0JCW91dGxuKCk7Ci0JCW91dGxuKCk7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlRXh0cmFNZXRob2RzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkvKiBFbXB0eSBjb25zdHJ1Y3RvciAqLwotCW91dCgicHVibGljICIpOwotCW91dChjbGFzc05hbWUpOwotCW91dCgiKCkgeyIpOwotCW91dGxuKCk7Ci0Jb3V0KCJcdHN1cGVyKCk7Iik7Ci0Jb3V0bG4oKTsKLQlvdXQoIn0iKTsKLQlvdXRsbigpOwotCW91dGxuKCk7Ci0JLyogcG9pbnRlciBjb25zdHJ1Y3RvciAqLwotCW91dCgicHVibGljICIpOwotCW91dChjbGFzc05hbWUpOwotCW91dCgiKGludCAvKmxvbmcqLyBpZCkgeyIpOwotCW91dGxuKCk7Ci0Jb3V0KCJcdHN1cGVyKGlkKTsiKTsKLQlvdXRsbigpOwotCW91dCgifSIpOwotCW91dGxuKCk7Ci0Jb3V0bG4oKTsKLQkvKiBvYmplY3QgY29uc3RydWN0b3IgKi8KLQlvdXQoInB1YmxpYyAiKTsKLQlvdXQoY2xhc3NOYW1lKTsKLQlvdXQoIihpZCBpZCkgeyIpOwotCW91dGxuKCk7Ci0Jb3V0KCJcdHN1cGVyKGlkKTsiKTsKLQlvdXRsbigpOwotCW91dCgifSIpOwotCW91dGxuKCk7Ci0Jb3V0bG4oKTsKLQkvKiBOU09iamVjdCBoZWxwZXJzICovCi0JaWYgKGNsYXNzTmFtZS5lcXVhbHMoIk5TT2JqZWN0IikpIHsKLQkJb3V0KCJwdWJsaWMgTlNPYmplY3QgYWxsb2MoKSB7Iik7Ci0JCW91dGxuKCk7Ci0JCW91dCgiXHR0aGlzLmlkID0gT1Mub2JqY19tc2dTZW5kKG9iamNfZ2V0Q2xhc3MoKSwgT1Muc2VsX2FsbG9jKTsiKTsKLQkJb3V0bG4oKTsKLQkJb3V0KCJcdHJldHVybiB0aGlzOyIpOwotCQlvdXRsbigpOwotCQlvdXQoIn0iKTsKLQkJb3V0bG4oKTsKLQkJb3V0bG4oKTsKLQl9Ci0JLyogTlNTdHJpbmcgaGVscGVycyAqLwotCWlmIChjbGFzc05hbWUuZXF1YWxzKCJOU1N0cmluZyIpKSB7Ci0JCS8qIEdldCBqYXZhIHN0cmluZyAqLwotCQlvdXQoInB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgeyIpOwotCQlvdXRsbigpOwotCQlvdXQoIlx0Y2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWyhpbnQpLyo2NCovbGVuZ3RoKCldOyIpOwotCQlvdXRsbigpOwotCQlvdXQoIlx0Z2V0Q2hhcmFjdGVycyhidWZmZXIpOyIpOwotCQlvdXRsbigpOwotCQlvdXQoIlx0cmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyKTsiKTsKLQkJb3V0bG4oKTsKLQkJb3V0KCJ9Iik7Ci0JCW91dGxuKCk7Ci0JCW91dGxuKCk7Ci0JCS8qIGNyZWF0ZSBOU1N0cmluZyAqLwotCQlvdXQoInB1YmxpYyBzdGF0aWMgTlNTdHJpbmcgc3RyaW5nV2l0aChTdHJpbmcgc3RyKSB7Iik7Ci0JCW91dGxuKCk7Ci0JCW91dCgiXHRjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbc3RyLmxlbmd0aCgpXTsiKTsKLQkJb3V0bG4oKTsKLQkJb3V0KCJcdHN0ci5nZXRDaGFycygwLCBidWZmZXIubGVuZ3RoLCBidWZmZXIsIDApOyIpOwotCQlvdXRsbigpOwotCQlvdXQoIlx0cmV0dXJuIHN0cmluZ1dpdGhDaGFyYWN0ZXJzKGJ1ZmZlciwgYnVmZmVyLmxlbmd0aCk7Iik7Ci0JCW91dGxuKCk7Ci0JCW91dCgifSIpOwotCQlvdXRsbigpOwotCQlvdXRsbigpOwotCX0JCi19Ci0KLVRyZWVNYXAgZ2V0R2VuZXJhdGVkQ2xhc3NlcygpIHsKLQlUcmVlTWFwIGNsYXNzZXMgPSBuZXcgVHJlZU1hcCgpOwotCWZvciAoaW50IHggPSAwOyB4IDwgeG1scy5sZW5ndGg7IHgrKykgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50c1t4XTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIGNvbnRpbnVlOwotCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJaWYgKCJjbGFzcyIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkgJiYgZ2V0R2VuKG5vZGUpKSB7Ci0JCQkJQXJyYXlMaXN0IG1ldGhvZHM7Ci0JCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKTsKLQkJCQlPYmplY3RbXSBjbGF6eiA9IChPYmplY3RbXSljbGFzc2VzLmdldChuYW1lKTsKLQkJCQlpZiAoY2xhenogPT0gbnVsbCkgewotCQkJCQltZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQljbGFzc2VzLnB1dChuYW1lLCBuZXcgT2JqZWN0W117bm9kZSwgbWV0aG9kc30pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1ldGhvZHMgPSAoQXJyYXlMaXN0KWNsYXp6WzFdOwotCQkJCX0KLQkJCQlOb2RlTGlzdCBtZXRob2RMaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RMaXN0LmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJTm9kZSBtZXRob2QgPSBtZXRob2RMaXN0Lml0ZW0oaik7Ci0JCQkJCWlmICgibWV0aG9kIi5lcXVhbHMobWV0aG9kLmdldE5vZGVOYW1lKCkpICYmIGdldEdlbihtZXRob2QpKSB7Ci0JCQkJCQltZXRob2RzLmFkZChtZXRob2QpOwotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGNsYXNzZXM7Ci19Ci0KLXZvaWQgY29weUNsYXNzTWV0aG9kc0Rvd24oZmluYWwgTWFwIGNsYXNzZXMpIHsKLQlBcnJheUxpc3Qgc29ydGVkQ2xhc3NlcyA9IENvbGxlY3Rpb25zLmxpc3QoQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oY2xhc3Nlcy52YWx1ZXMoKSkpOwotCUNvbGxlY3Rpb25zLnNvcnQoc29ydGVkQ2xhc3NlcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCWludCBnZXRIaWVyYXJjaHlMZXZlbChOb2RlIG5vZGUpIHsKLQkJCVN0cmluZyBzdXBlcmNsYXNzID0gZ2V0U3VwZXJjbGFzc05hbWUobm9kZSk7Ci0JCQlpbnQgbGV2ZWwgPSAwOwotCQkJd2hpbGUgKCFzdXBlcmNsYXNzLmVxdWFscygiaWQiKSkgewotCQkJCWxldmVsKys7Ci0JCQkJc3VwZXJjbGFzcyA9IGdldFN1cGVyY2xhc3NOYW1lKChOb2RlKSgoT2JqZWN0W10pY2xhc3Nlcy5nZXQoc3VwZXJjbGFzcykpWzBdKTsKLQkJCX0KLQkJCXJldHVybiBsZXZlbDsJCQkKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQlyZXR1cm4gZ2V0SGllcmFyY2h5TGV2ZWwoKE5vZGUpKChPYmplY3RbXSlhcmcwKVswXSkgLSBnZXRIaWVyYXJjaHlMZXZlbCgoTm9kZSkoKE9iamVjdFtdKWFyZzEpWzBdKTsgIAotCQl9Ci0JfSk7Ci0JZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNvcnRlZENsYXNzZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQlPYmplY3RbXSBjbGF6eiA9IChPYmplY3RbXSkgaXRlcmF0b3IubmV4dCgpOwotCQlOb2RlIG5vZGUgPSAoTm9kZSljbGF6elswXTsKLQkJQXJyYXlMaXN0IG1ldGhvZHMgPSAoQXJyYXlMaXN0KWNsYXp6WzFdOwotCQlPYmplY3RbXSBzdXBlcmNsYXNzID0gKE9iamVjdFtdKWNsYXNzZXMuZ2V0KGdldFN1cGVyY2xhc3NOYW1lKG5vZGUpKTsKLQkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjIgPSAoKEFycmF5TGlzdClzdXBlcmNsYXNzWzFdKS5pdGVyYXRvcigpOyBpdGVyYXRvcjIuaGFzTmV4dCgpOykgewotCQkJCU5vZGUgbWV0aG9kID0gKE5vZGUpIGl0ZXJhdG9yMi5uZXh0KCk7Ci0JCQkJaWYgKGlzU3RhdGljKG1ldGhvZCkpIHsKLQkJCQkJbWV0aG9kcy5hZGQobWV0aG9kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLVN0cmluZyBnZXRTdXBlcmNsYXNzTmFtZSAoTm9kZSBub2RlKSB7Ci0JTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQlOb2RlIHN1cGVyY2xhc3MgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgic3d0X3N1cGVyY2xhc3MiKTsKLQlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7Ci0JCXJldHVybiBzdXBlcmNsYXNzLmdldE5vZGVWYWx1ZSgpOwotCX0gZWxzZSB7Ci0JCU5vZGUgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJuYW1lIik7Ci0JCWlmIChuYW1lLmdldE5vZGVWYWx1ZSgpLmVxdWFscygiTlNPYmplY3QiKSkgewotCQkJcmV0dXJuICJpZCI7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIk5TT2JqZWN0IjsKLQkJfQotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUNsYXNzZXMoKSB7Ci0JTWV0YURhdGEgbWV0YURhdGEgPSBuZXcgTWV0YURhdGEobWFpbkNsYXNzTmFtZSk7CQotCVRyZWVNYXAgY2xhc3NlcyA9IGdldEdlbmVyYXRlZENsYXNzZXMoKTsKLQljb3B5Q2xhc3NNZXRob2RzRG93bihjbGFzc2VzKTsKLQkKLQlTZXQgY2xhc3NOYW1lcyA9IGNsYXNzZXMua2V5U2V0KCk7Ci0JZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNsYXNzTmFtZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQl0aGlzLm91dCA9IG5ldyBQcmludFN0cmVhbShvdXQpOwotCi0JCVN0cmluZyBkYXRhID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoInN3dF9jb3B5cmlnaHQiLCBudWxsKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpICE9IDApIHsKLQkJCW91dChmaXhEZWxpbWl0ZXIoZGF0YSkpOwotCQl9Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJT2JqZWN0W10gY2xhenogPSAoT2JqZWN0W10pY2xhc3Nlcy5nZXQoY2xhc3NOYW1lKTsKLQkJTm9kZSBub2RlID0gKE5vZGUpY2xhenpbMF07Ci0JCUFycmF5TGlzdCBtZXRob2RzID0gKEFycmF5TGlzdCljbGF6elsxXTsKLQkJb3V0KCJwYWNrYWdlICIpOwotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShtYWluQ2xhc3NOYW1lKTsKLQkJb3V0KHBhY2thZ2VOYW1lKTsKLQkJb3V0KCI7Iik7Ci0JCW91dGxuKCk7Ci0JCW91dGxuKCk7Ci0JCW91dCgicHVibGljIGNsYXNzICIpOwotCQlvdXQoY2xhc3NOYW1lKTsKLQkJb3V0KCIgZXh0ZW5kcyAiKTsKLQkJb3V0KGdldFN1cGVyY2xhc3NOYW1lKG5vZGUpKTsKLQkJb3V0KCIgeyIpOwotCQlvdXRsbigpOwotCQlvdXRsbigpOwkJCi0JCWdlbmVyYXRlRXh0cmFNZXRob2RzKGNsYXNzTmFtZSk7Ci0JCWdlbmVyYXRlTWV0aG9kcyhjbGFzc05hbWUsIG1ldGhvZHMpOwkJCi0JCW91dCgifSIpOwotCQlvdXRsbigpOwotCQkKLQkJU3RyaW5nIGZpbGVOYW1lID0gb3V0cHV0RGlyICsgcGFja2FnZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLyIgKyBjbGFzc05hbWUgKyAiLmphdmEiOwotCQl0cnkgewotCQkJb3V0LmZsdXNoKCk7Ci0JCQlpZiAob3V0LnNpemUoKSA+IDApIG91dHB1dChvdXQudG9CeXRlQXJyYXkoKSwgZmlsZU5hbWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQkJfQotCQlvdXQgPSBudWxsOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUV4dHJhQXR0cmlidXRlcygpIHsKLQlEb2N1bWVudFtdIGRvY3VtZW50cyA9IGdldERvY3VtZW50cygpOwotCWZvciAoaW50IHggPSAwOyB4IDwgeG1scy5sZW5ndGg7IHgrKykgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50c1t4XTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwgfHwgIWdldEdlbihkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSkpIGNvbnRpbnVlOwotCQlzYXZlRXh0cmFBdHRyaWJ1dGVzKHhtbHNbeF0sIGRvY3VtZW50KTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVNYWluQ2xhc3MoKSB7Ci0JQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQl0aGlzLm91dCA9IG5ldyBQcmludFN0cmVhbShvdXQpOwotCi0JU3RyaW5nIGhlYWRlciA9ICIiLCBmb290ZXIgPSAiIjsKLQlTdHJpbmcgZmlsZU5hbWUgPSBvdXRwdXREaXIgKyBtYWluQ2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5qYXZhIjsKLQlGaWxlSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCXRyeSB7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIGlucHV0ID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSkpKTsKLQkJU3RyaW5nQnVmZmVyIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzQwOTZdOwotCQlpbnQgcmVhZDsKLQkJd2hpbGUgKChyZWFkID0gaW5wdXQucmVhZChidWZmZXIpKSAhPSAtMSkgewotCQkJc3RyLmFwcGVuZChidWZmZXIsIDAsIHJlYWQpOwotCQl9Ci0JCVN0cmluZyBzZWN0aW9uID0gIi8qKiBUaGlzIHNlY3Rpb24gaXMgYXV0byBnZW5lcmF0ZWQgKi8iOwotCQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZihzZWN0aW9uKSArIHNlY3Rpb24ubGVuZ3RoKCk7Ci0JCWludCBlbmQgPSBzdHIuaW5kZXhPZihzZWN0aW9uLCBzdGFydCk7Ci0JCWhlYWRlciA9IHN0ci5zdWJzdHJpbmcoMCwgc3RhcnQpOwotCQlmb290ZXIgPSBzdHIuc3Vic3RyaW5nKGVuZCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaXMgIT0gbnVsbCkgaXMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQl9Ci0JCi0Jb3V0KGhlYWRlcik7Ci0Jb3V0bG4oKTsKLQlvdXRsbigpOwotCi0Jb3V0KCIvKiogQ3VzdG9tIGNhbGxiYWNrcyAqLyIpOwotCW91dGxuKCk7Ci0JZ2VuZXJhdGVDdXN0b21DYWxsYmFja3MoKTsKLQlvdXRsbigpOwkKLQlvdXQoIi8qKiBDbGFzc2VzICovIik7Ci0Jb3V0bG4oKTsKLQlnZW5lcmF0ZUNsYXNzZXNDb25zdCgpOwotCW91dGxuKCk7Ci0Jb3V0KCIvKiogUHJvdG9jb2xzICovIik7Ci0Jb3V0bG4oKTsKLQlnZW5lcmF0ZVByb3RvY29sc0NvbnN0KCk7Ci0Jb3V0bG4oKTsKLQlvdXQoIi8qKiBTZWxlY3RvcnMgKi8iKTsKLQlvdXRsbigpOwotCWdlbmVyYXRlU2VsZWN0b3JzQ29uc3QoKTsKLQlvdXRsbigpOwotCW91dCgiLyoqIENvbnN0YW50cyAqLyIpOwotCW91dGxuKCk7Ci0JZ2VuZXJhdGVFbnVtcygpOwotCW91dGxuKCk7Ci0Jb3V0KCIvKiogR2xvYmFscyAqLyIpOwotCW91dGxuKCk7Ci0JZ2VuZXJhdGVDb25zdGFudHMoKTsKLQlvdXRsbigpOwotCW91dCgiLyoqIEZ1bmN0aW9ucyAqLyIpOwotCW91dGxuKCk7Ci0Jb3V0bG4oKTsKLQlnZW5lcmF0ZUZ1bmN0aW9ucygpOwotCW91dGxuKCk7Ci0Jb3V0KCIvKiogU3VwZXIgU2VuZHMgKi8iKTsKLQlvdXRsbigpOwotCWdlbmVyYXRlU2VuZHModHJ1ZSk7Ci0Jb3V0bG4oKTsKLQlvdXQoIi8qKiBTZW5kcyAqLyIpOwotCW91dGxuKCk7Ci0JZ2VuZXJhdGVTZW5kcyhmYWxzZSk7Ci0Jb3V0bG4oKTsKLQlnZW5lcmF0ZVN0cnVjdE5hdGl2ZXMoKTsKLQkKLQlvdXRsbigpOwotCW91dChmb290ZXIpOwotCXRyeSB7Ci0JCW91dC5mbHVzaCgpOwotCQlpZiAob3V0LnNpemUoKSA+IDApIG91dHB1dChvdXQudG9CeXRlQXJyYXkoKSwgZmlsZU5hbWUpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSIpOwotCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci19Ci0KLXB1YmxpYyBEb2N1bWVudFtdIGdldERvY3VtZW50cygpIHsKLQlpZiAoZG9jdW1lbnRzID09IG51bGwpIHsKLQkJU3RyaW5nW10geG1scyA9IGdldFhtbHMoKTsKLQkJZG9jdW1lbnRzID0gbmV3IERvY3VtZW50W3htbHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB4bWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgeG1sUGF0aCA9IHhtbHNbaV07Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50c1tpXSA9IGdldERvY3VtZW50KHhtbFBhdGgpOwotCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIGNvbnRpbnVlOwotCQkJaWYgKG1haW5DbGFzc05hbWUgIT0gbnVsbCAmJiBvdXRwdXREaXIgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKG1haW5DbGFzc05hbWUpOwotCQkJCVN0cmluZyBleHRyYXNQYXRoID0gb3V0cHV0RGlyICsgcGFja2FnZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLyIgKyBnZXRGaWxlTmFtZSh4bWxQYXRoKSArICIuZXh0cmFzIjsKLQkJCQltZXJnZShkb2N1bWVudCwgZ2V0RG9jdW1lbnQoZXh0cmFzUGF0aCkpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBkb2N1bWVudHM7Ci19Ci0KLXB1YmxpYyBTdHJpbmdbXSBnZXRYbWxzKCkgewotCWlmICh4bWxzID09IG51bGwgfHwgeG1scy5sZW5ndGggPT0gMCkgewotCQlBcnJheUxpc3QgYXJyYXkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QobmV3IEZpbGUoIi9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzIiksIGFycmF5KTsKLQkJbGlzdChuZXcgRmlsZSgiL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29yZVNlcnZpY2VzLmZyYW1ld29yay9GcmFtZXdvcmtzIiksIGFycmF5KTsKLQkJbGlzdChuZXcgRmlsZSgiL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwbGljYXRpb25TZXJ2aWNlcy5mcmFtZXdvcmsvRnJhbWV3b3JrcyIpLCBhcnJheSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoYXJyYXksIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJcmV0dXJuIG5ldyBGaWxlKChTdHJpbmcpbzEpLmdldE5hbWUoKS5jb21wYXJlVG8obmV3IEZpbGUoKFN0cmluZylvMikuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbHMgPSAoU3RyaW5nW10pYXJyYXkudG9BcnJheShuZXcgU3RyaW5nW2FycmF5LnNpemUoKV0pOwotCX0KLQlyZXR1cm4geG1sczsKLX0KLQotdm9pZCBzYXZlRXh0cmFBdHRyaWJ1dGVzKFN0cmluZyB4bWxQYXRoLCBEb2N1bWVudCBkb2N1bWVudCkgewotCXRyeSB7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKG1haW5DbGFzc05hbWUpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBvdXRwdXREaXIgKyBwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIvIiArIGdldEZpbGVOYW1lKHhtbFBhdGgpICsgIi5leHRyYXMiOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlET01Xcml0ZXIgd3JpdGVyID0gbmV3IERPTVdyaXRlcihuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0gZ2V0SURBdHRyaWJ1dGVOYW1lcygpOwotCQlTdHJpbmdbXSBmaWx0ZXIgPSBuZXcgU3RyaW5nW25hbWVzLmxlbmd0aCArIDJdOwotCQlmaWx0ZXJbMF0gPSAiY2xhc3NfbWV0aG9kIjsKLQkJZmlsdGVyWzFdID0gInN3dF8uKiI7Ci0JCVN5c3RlbS5hcnJheWNvcHkobmFtZXMsIDAsIGZpbHRlciwgMiwgbmFtZXMubGVuZ3RoKTsKLQkJd3JpdGVyLnNldEF0dHJpYnV0ZUZpbHRlcihmaWx0ZXIpOwotCQl3cml0ZXIuc2V0Tm9kZUZpbHRlcigic3d0XyIpOwotCQl3cml0ZXIucHJpbnQoZG9jdW1lbnQpOwotCQlpZiAob3V0LnNpemUoKSA+IDApIG91dHB1dChvdXQudG9CeXRlQXJyYXkoKSwgZmlsZU5hbWUpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSIpOwotCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE91dHB1dERpcihTdHJpbmcgZGlyKSB7Ci0JaWYgKGRpciAhPSBudWxsKSB7Ci0JCWlmICghZGlyLmVuZHNXaXRoKCJcXCIpICYmICFkaXIuZW5kc1dpdGgoIi8iKSApIHsKLQkJCWRpciArPSAiLyI7Ci0JCX0KLQl9Ci0JdGhpcy5vdXRwdXREaXIgPSBkaXI7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFhtbHMoU3RyaW5nW10geG1scykgewotCXRoaXMueG1scyA9IHhtbHM7Ci0JdGhpcy5kb2N1bWVudHMgPSBudWxsOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoU3RyaW5nIG1haW5DbGFzc05hbWUpIHsKLQl0aGlzLm1haW5DbGFzc05hbWUgPSBtYWluQ2xhc3NOYW1lOwotfQotCi1Eb2N1bWVudCBnZXREb2N1bWVudChTdHJpbmcgeG1sUGF0aCkgewotCXRyeSB7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJaWYgKHhtbFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpID09IC0xKSBpcyA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh4bWxQYXRoKTsKLQkJaWYgKGlzID09IG51bGwpIGlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSh4bWxQYXRoKSk7Ci0JCWlmIChpcyAhPSBudWxsKSByZXR1cm4gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpcykpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXB1YmxpYyBTdHJpbmdbXSBnZXRFeHRyYUF0dHJpYnV0ZU5hbWVzKE5vZGUgbm9kZSkgewotCVN0cmluZyBuYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCWlmIChuYW1lLmVxdWFscygibWV0aG9kIikpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsic3d0X2dlbl9zdXBlcl9tc2dTZW5kIiwgInN3dF9nZW5fY3VzdG9tX2NhbGxiYWNrIn07Ci0JfSBlbHNlIGlmIChuYW1lLmVxdWFscygiZnVuY3Rpb24iKSkgewotCQlOYW1lZE5vZGVNYXAgYXR0cmlicyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlicyAhPSBudWxsICYmIGF0dHJpYnMuZ2V0TmFtZWRJdGVtKCJ2YXJpYWRpYyIpICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW117InN3dF92YXJpYWRpY19jb3VudCIsInN3dF92YXJpYWRpY19qYXZhX3R5cGVzIn07Ci0JCX0KLQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJjbGFzcyIpKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117InN3dF9zdXBlcmNsYXNzIn07Ci0JfSBlbHNlIGlmIChuYW1lLmVxdWFscygicmV0dmFsIikpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsic3d0X2phdmFfdHlwZSIsICJzd3RfamF2YV90eXBlNjQiLCAic3d0X2FsbG9jIn07Ci0JfSBlbHNlIGlmIChuYW1lLmVxdWFscygiYXJnIikpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsic3d0X2phdmFfdHlwZSIsICJzd3RfamF2YV90eXBlNjQifTsKLQl9Ci0JcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoU3RyaW5nIHhtbFBhdGgpIHsKLQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh4bWxQYXRoKTsKLQlyZXR1cm4gZmlsZS5nZXROYW1lKCk7Ci19Ci0KLVN0cmluZyBnZXRLZXkgKE5vZGUgbm9kZSkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0Jd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgYnVmZmVyLmFwcGVuZCgiXyIpOwotCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIGtleSA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZSk7Ci0JCU5vZGUgbmFtZUF0dHJpYiA9IGdldElEQXR0cmlidXRlKG5vZGUpOwotCQlpZiAobmFtZUF0dHJpYiAhPSBudWxsKSB7Ci0JCQlrZXkuYXBwZW5kKCItIik7Ci0JCQlrZXkuYXBwZW5kKG5hbWVBdHRyaWIuZ2V0Tm9kZVZhbHVlKCkpOwotCQl9Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gaXNTdGF0aWMgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiY2xhc3NfbWV0aG9kIikgIT0gbnVsbDsKLQkJCWlmIChpc1N0YXRpYykga2V5LmFwcGVuZCgiLXN0YXRpYyIpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoa2V5LnJldmVyc2UoKSk7Ci0JCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQl9Ci0JYnVmZmVyLnJldmVyc2UoKTsKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0KLXB1YmxpYyBOb2RlIGdldElEQXR0cmlidXRlKE5vZGUgbm9kZSkgewotCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JU3RyaW5nW10gbmFtZXMgPSBnZXRJREF0dHJpYnV0ZU5hbWVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQlOb2RlIG5hbWVBdHRyaWIgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShuYW1lc1tpXSk7Ci0JCWlmIChuYW1lQXR0cmliICE9IG51bGwpIHJldHVybiBuYW1lQXR0cmliOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotcHVibGljIFN0cmluZ1tdIGdldElEQXR0cmlidXRlTmFtZXMoKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmdbXXsKLQkJIm5hbWUiLAotCQkic2VsZWN0b3IiLAotCQkicGF0aCIsCi0JfTsKLX0KLQotdm9pZCBtZXJnZShOb2RlIG5vZGUsIEhhc2hNYXAgZXh0cmFzLCBIYXNoTWFwIGRvY0xvb2t1cCkgewotCU5vZGVMaXN0IGxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQlOb2RlIGNoaWxkTm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlTdHJpbmcga2V5ID0gZ2V0S2V5KGNoaWxkTm9kZSk7Ci0JCQlpZiAoZG9jTG9va3VwICE9IG51bGwgJiYgZG9jTG9va3VwLmdldChrZXkpID09IG51bGwpIHsKLQkJCQlkb2NMb29rdXAucHV0KGtleSwgY2hpbGROb2RlKTsKLQkJCX0KLQkJCU5vZGUgZXh0cmEgPSAoTm9kZSlleHRyYXMucmVtb3ZlKGtleSk7Ci0JCQlpZiAoZXh0cmEgIT0gbnVsbCkgewotCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZXh0cmEuZ2V0QXR0cmlidXRlcygpOwotCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBqIDwgbGVuZ3RoOyBqKyspIHsKLQkJCQkJTm9kZSBhdHRyID0gKE5vZGUpYXR0cmlidXRlcy5pdGVtKGopOwotCQkJCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgic3d0XyIpKSB7Ci0JCQkJCQkoKEVsZW1lbnQpY2hpbGROb2RlKS5zZXRBdHRyaWJ1dGUobmFtZSwgYXR0ci5nZXROb2RlVmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbWVyZ2UoY2hpbGROb2RlLCBleHRyYXMsIGRvY0xvb2t1cCk7Ci0JfQotfQotCi0JCi12b2lkIG91dChTdHJpbmcgc3RyKSB7Ci0JUHJpbnRTdHJlYW0gb3V0ID0gdGhpcy5vdXQ7Ci0JaWYgKG91dCA9PSBudWxsKSBvdXQgPSBTeXN0ZW0ub3V0OwotCW91dC5wcmludChzdHIpOwotfQotCi12b2lkIG91dGxuKCkgewotCVByaW50U3RyZWFtIG91dCA9IHRoaXMub3V0OwotCWlmIChvdXQgPT0gbnVsbCkgb3V0ID0gU3lzdGVtLm91dDsKLQlvdXQucHJpbnRsbigpOwotfQotCi12b2lkIGdlbmVyYXRlQ29uc3RhbnRzKCkgewotCWZvciAoaW50IHggPSAwOyB4IDwgeG1scy5sZW5ndGg7IHgrKykgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50c1t4XTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIGNvbnRpbnVlOwotCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJaWYgKCJjb25zdGFudCIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlpZiAoZ2V0R2VuKG5vZGUpKSB7Ci0JCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCVN0cmluZyBjb25zdE5hbWUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgibmFtZSIpLmdldE5vZGVWYWx1ZSgpOwotCQkJCQlvdXQoIi8qKiBAbWV0aG9kIGZsYWdzPWNvbnN0ICovIik7Ci0JCQkJCW91dGxuKCk7Ci0JCQkJCW91dCgicHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgIik7Ci0JCQkJCVN0cmluZyB0eXBlID0gZ2V0VHlwZShub2RlKSwgdHlwZTY0ID0gZ2V0VHlwZTY0KG5vZGUpOwotCQkJCQlvdXQodHlwZSk7Ci0JCQkJCWlmICghdHlwZS5lcXVhbHModHlwZTY0KSkgewotCQkJCQkJb3V0KCIgLyoiKTsKLQkJCQkJCW91dCh0eXBlNjQpOwotCQkJCQkJb3V0KCIqLyIpOwotCQkJCQl9Ci0JCQkJCW91dCgiICIpOwotCQkJCQlvdXQoY29uc3ROYW1lKTsKLQkJCQkJb3V0KCIoKTsiKTsKLQkJCQkJb3V0bG4oKTsKLQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJkZWNsYXJlZF90eXBlIikuZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzKCJOU1N0cmluZyoiKSkgewotCQkJCQkJb3V0KCJwdWJsaWMgc3RhdGljIGZpbmFsIE5TU3RyaW5nICIpOwotCQkJCQkJb3V0KGNvbnN0TmFtZSk7Ci0JCQkJCQlvdXQoIiA9IG5ldyBOU1N0cmluZygiKTsKLQkJCQkJCW91dChjb25zdE5hbWUpOwotCQkJCQkJb3V0KCIoKSk7Iik7Ci0JCQkJCQlvdXRsbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVFbnVtcygpIHsKLQlmb3IgKGludCB4ID0gMDsgeCA8IHhtbHMubGVuZ3RoOyB4KyspIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudHNbeF07Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKSBjb250aW51ZTsKLQkJTm9kZUxpc3QgbGlzdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCWlmICgiZW51bSIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlpZiAoZ2V0R2VuKG5vZGUpKSB7Ci0JCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCU5vZGUgdmFsdWVOb2RlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInZhbHVlIik7Ci0JCQkJCWlmICh2YWx1ZU5vZGUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHZhbHVlID0gdmFsdWVOb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJb3V0KCJwdWJsaWMgc3RhdGljIGZpbmFsICIpOwotCQkJCQkJYm9vbGVhbiBpc0xvbmcgPSBmYWxzZTsKLQkJCQkJCWlmICh2YWx1ZS5pbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCQkJCQlvdXQoImRvdWJsZSAiKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCQkJCQkJCW91dCgiaW50ICIpOwotCQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWlzTG9uZyA9IHRydWU7Ci0JCQkJCQkJCW91dCgibG9uZyAiKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlvdXQoYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKSk7Ci0JCQkJCQlvdXQoIiA9ICIpOwotCQkJCQkJb3V0KHZhbHVlKTsKLQkJCQkJCWlmIChpc0xvbmcgJiYgIXZhbHVlLmVuZHNXaXRoKCJMIikpIG91dCgiTCIpOwotCQkJCQkJb3V0KCI7Iik7Ci0JCQkJCQlvdXRsbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi1ib29sZWFuIGdldEdlbihOb2RlIG5vZGUpIHsKLQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCWlmIChhdHRyaWJ1dGVzID09IG51bGwpIHJldHVybiBmYWxzZTsKLQlOb2RlIGdlbiA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJzd3RfZ2VuIik7Ci0JcmV0dXJuIGdlbiAhPSBudWxsICYmICFnZW4uZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzKCJmYWxzZSIpOwotfQotCi1ib29sZWFuIGdldEdlblN1cGVyKE5vZGUgbm9kZSkgewotCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCU5vZGUgZ2VuID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInN3dF9nZW5fc3VwZXJfbXNnU2VuZCIpOwotCXJldHVybiBnZW4gIT0gbnVsbCAmJiAhZ2VuLmdldE5vZGVWYWx1ZSgpLmVxdWFscygiZmFsc2UiKTsKLX0KLQotYm9vbGVhbiBnZXRHZW5DYWxsYmFjayhOb2RlIG5vZGUpIHsKLQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCWlmIChhdHRyaWJ1dGVzID09IG51bGwpIHJldHVybiBmYWxzZTsKLQlOb2RlIGdlbiA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJzd3RfZ2VuX2N1c3RvbV9jYWxsYmFjayIpOwotCXJldHVybiBnZW4gIT0gbnVsbCAmJiAhZ2VuLmdldE5vZGVWYWx1ZSgpLmVxdWFscygiZmFsc2UiKTsKLX0KLQotYm9vbGVhbiBpc1N0YXRpYyhOb2RlIG5vZGUpIHsKLQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCU5vZGUgaXNTdGF0aWMgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiY2xhc3NfbWV0aG9kIik7Ci0JcmV0dXJuIGlzU3RhdGljICE9IG51bGwgJiYgaXNTdGF0aWMuZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzKCJ0cnVlIik7Ci19Ci0KLWJvb2xlYW4gaXNTdHJ1Y3QoTm9kZSBub2RlKSB7Ci0JTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQlTdHJpbmcgY29kZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJ0eXBlIikuZ2V0Tm9kZVZhbHVlKCk7Ci0JcmV0dXJuIGNvZGUuc3RhcnRzV2l0aCgieyIpOwotfQotCi1ib29sZWFuIGlzRmxvYXRpbmdQb2ludChOb2RlIG5vZGUpIHsKLQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCVN0cmluZyBjb2RlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInR5cGUiKS5nZXROb2RlVmFsdWUoKTsKLQlyZXR1cm4gY29kZS5lcXVhbHMoImYiKSB8fCBjb2RlLmVxdWFscygiZCIpOwotfQotCi1ib29sZWFuIGlzT2JqZWN0KE5vZGUgbm9kZSkgewotCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JU3RyaW5nIGNvZGUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgidHlwZSIpLmdldE5vZGVWYWx1ZSgpOwotCXJldHVybiBjb2RlLmVxdWFscygiQCIpOwotfQotCi1ib29sZWFuIGlzQm9vbGVhbihOb2RlIG5vZGUpIHsKLQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCVN0cmluZyBjb2RlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInR5cGUiKS5nZXROb2RlVmFsdWUoKTsKLQlyZXR1cm4gY29kZS5lcXVhbHMoIkIiKTsKLX0KLQotdm9pZCBidWlsZExvb2t1cChOb2RlIG5vZGUsIEhhc2hNYXAgdGFibGUpIHsKLQlOb2RlTGlzdCBsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJTm9kZSBjaGlsZE5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJU3RyaW5nIGtleSA9IGdldEtleShjaGlsZE5vZGUpOwotCQkJaWYgKHRhYmxlLmdldChrZXkpID09IG51bGwpIHRhYmxlLnB1dChrZXksIGNoaWxkTm9kZSk7Ci0JCQlidWlsZExvb2t1cChjaGlsZE5vZGUsIHRhYmxlKTsKLQkJfQotCX0KLX0KLQotYm9vbGVhbiBpc1VuaXF1ZShOb2RlIG1ldGhvZCwgQXJyYXlMaXN0IG1ldGhvZHMpIHsKLQlTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJzZWxlY3RvciIpLmdldE5vZGVWYWx1ZSgpOwotCVN0cmluZyBzaWduYXR1cmUgPSAiIjsKLQlOb2RlTGlzdCBwYXJhbXMgPSBtZXRob2QuZ2V0Q2hpbGROb2RlcygpOwotCWZvciAoaW50IGsgPSAwOyBrIDwgcGFyYW1zLmdldExlbmd0aCgpOyBrKyspIHsKLQkJTm9kZSBwYXJhbSA9IHBhcmFtcy5pdGVtKGspOwotCQlpZiAoImFyZyIuZXF1YWxzKHBhcmFtLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQlzaWduYXR1cmUgKz0gZ2V0SmF2YVR5cGUocGFyYW0pOwotCQl9Ci0JfQotCWludCBpbmRleCA9IG1ldGhvZE5hbWUuaW5kZXhPZigiOiIpOwotCWlmIChpbmRleCAhPSAtMSkgbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWV0aG9kcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCU5vZGUgb3RoZXIgPSAoTm9kZSkgaXRlcmF0b3IubmV4dCgpOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG90aGVyLmdldEF0dHJpYnV0ZXMoKTsKLQkJTm9kZSBvdGhlclNlbCA9IG51bGw7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIG90aGVyU2VsID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInNlbGVjdG9yIik7Ci0JCWlmIChvdGhlciAhPSBtZXRob2QgJiYgb3RoZXJTZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG90aGVyTmFtZSA9IG90aGVyU2VsLmdldE5vZGVWYWx1ZSgpOwotCQkJaW5kZXggPSBvdGhlck5hbWUuaW5kZXhPZigiOiIpOwotCQkJaWYgKGluZGV4ICE9IC0xKSBvdGhlck5hbWUgPSBvdGhlck5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCWlmIChtZXRob2ROYW1lLmVxdWFscyhvdGhlck5hbWUpKSB7Ci0JCQkJTm9kZUxpc3Qgb3RoZXJQYXJhbXMgPSBvdGhlci5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJU3RyaW5nIG90aGVyU2lnbmF0dXJlID0gIiI7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBvdGhlclBhcmFtcy5nZXRMZW5ndGgoKTsgaysrKSB7Ci0JCQkJCU5vZGUgcGFyYW0gPSBvdGhlclBhcmFtcy5pdGVtKGspOwotCQkJCQlpZiAoImFyZyIuZXF1YWxzKHBhcmFtLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCQlvdGhlclNpZ25hdHVyZSArPSBnZXRKYXZhVHlwZShwYXJhbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHNpZ25hdHVyZS5lcXVhbHMob3RoZXJTaWduYXR1cmUpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTZWxlY3RvcnNDb25zdCgpIHsKLQlUcmVlU2V0IHNldCA9IG5ldyBUcmVlU2V0KCk7Ci0JZm9yIChpbnQgeCA9IDA7IHggPCB4bWxzLmxlbmd0aDsgeCsrKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRzW3hdOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgY29udGludWU7Ci0JCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoImNsYXNzIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSB8fCAiaW5mb3JtYWxfcHJvdG9jb2wiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJaWYgKGdldEdlbihub2RlKSkgewotCQkJCQlOb2RlTGlzdCBtZXRob2RzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWV0aG9kcy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQlOb2RlIG1ldGhvZCA9IG1ldGhvZHMuaXRlbShqKTsKLQkJCQkJCWlmIChnZXRHZW4obWV0aG9kKSkgewotCQkJCQkJCU5hbWVkTm9kZU1hcCBtdGhBdHRyaWJ1dGVzID0gbWV0aG9kLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCQlTdHJpbmcgc2VsID0gbXRoQXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInNlbGVjdG9yIikuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJc2V0LmFkZChzZWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXNldC5hZGQoImFsbG9jIik7Ci0JZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCVN0cmluZyBzZWwgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCVN0cmluZyBzZWxDb25zdCA9IGdldFNlbENvbnN0KHNlbCk7Ci0JCW91dCgicHVibGljIHN0YXRpYyBmaW5hbCBpbnQgLypsb25nKi8gIik7Ci0JCW91dChzZWxDb25zdCk7Ci0JCW91dCgiID0gIik7Ci0JCW91dCgic2VsX3JlZ2lzdGVyTmFtZShcIiIpOwotCQlvdXQoc2VsKTsKLQkJb3V0KCJcIik7Iik7Ci0JCW91dGxuKCk7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlU3RydWN0TmF0aXZlcygpIHsKLQlUcmVlU2V0IHNldCA9IG5ldyBUcmVlU2V0KCk7Ci0JZm9yIChpbnQgeCA9IDA7IHggPCB4bWxzLmxlbmd0aDsgeCsrKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRzW3hdOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgY29udGludWU7Ci0JCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoInN0cnVjdCIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkgJiYgZ2V0R2VuKG5vZGUpKSB7Ci0JCQkJc2V0LmFkZChnZXRJREF0dHJpYnV0ZShub2RlKS5nZXROb2RlVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0Jb3V0KCIvKiogU2l6ZW9mIG5hdGl2ZXMgKi8iKTsKLQlvdXRsbigpOwotCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXQuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQlTdHJpbmcgc3RydWN0ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQlvdXQoInB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCAiKTsKLQkJb3V0KHN0cnVjdCk7Ci0JCW91dCgiX3NpemVvZigpOyIpOwotCQlvdXRsbigpOwotCX0KLQlvdXRsbigpOwotCW91dCgiLyoqIE1lbW1vdmUgbmF0aXZlcyAqLyIpOwotCW91dGxuKCk7Ci0Jb3V0bG4oKTsKLQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2V0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJU3RyaW5nIHN0cnVjdCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJb3V0KCIvKioiKTsKLQkJb3V0bG4oKTsKLQkJb3V0KCIgKiBAcGFyYW0gZGVzdCBjYXN0PSh2b2lkICopLGZsYWdzPW5vX2luIGNyaXRpY2FsIik7Ci0JCW91dGxuKCk7Ci0JCW91dCgiICogQHBhcmFtIHNyYyBjYXN0PSh2b2lkICopLGZsYWdzPWNyaXRpY2FsIik7Ci0vLwkJb3V0KCIgKiBAcGFyYW0gc3JjIGNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsIik7Ci0JCW91dGxuKCk7Ci0JCW91dCgiICovIik7Ci0JCW91dGxuKCk7Ci0JCW91dCgicHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBtZW1tb3ZlKCIpOwotCQlvdXQoImludCAvKmxvbmcqLyBkZXN0LCAiKTsKLQkJb3V0KHN0cnVjdCk7Ci0JCW91dCgiIHNyYywgaW50IC8qbG9uZyovIHNpemUpOyIpOwotCQlvdXRsbigpOwotCQlvdXQoIi8qKiIpOwotCQlvdXRsbigpOwotCQlvdXQoIiAqIEBwYXJhbSBkZXN0IGNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4gY3JpdGljYWwiKTsKLQkJb3V0bG4oKTsKLQkJb3V0KCIgKiBAcGFyYW0gc3JjIGNhc3Q9KHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwiKTsKLS8vCQlvdXQoIiAqIEBwYXJhbSBzcmMgY2FzdD0odm9pZCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwiKTsKLQkJb3V0bG4oKTsKLQkJb3V0KCIgKi8iKTsKLQkJb3V0bG4oKTsKLQkJb3V0KCJwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIG1lbW1vdmUoIik7Ci0JCW91dChzdHJ1Y3QpOwotCQlvdXQoIiBkZXN0LCBpbnQgLypsb25nKi8gc3JjLCBpbnQgLypsb25nKi8gc2l6ZSk7Iik7Ci0JCW91dGxuKCk7Ci0JfQotfQotCi1TdHJpbmcgYnVpbGRTZW5kKE5vZGUgbWV0aG9kLCBib29sZWFuIHRhZ3MsIGJvb2xlYW4gb25seTY0LCBib29sZWFuIHN1cGVyQ2FsbCkgewotCU5vZGUgcmV0dXJuTm9kZSA9IGdldFJldHVybk5vZGUobWV0aG9kLmdldENoaWxkTm9kZXMoKSk7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlidWZmZXIuYXBwZW5kKCJwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSAiKTsgCi0JaWYgKHJldHVybk5vZGUgIT0gbnVsbCAmJiBpc1N0cnVjdChyZXR1cm5Ob2RlKSkgewotCQlidWZmZXIuYXBwZW5kKCJ2b2lkICIpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyQ2FsbCA/ICJvYmpjX21zZ1NlbmRTdXBlcl9zdHJldCIgOiAib2JqY19tc2dTZW5kX3N0cmV0Iik7Ci0JCWJ1ZmZlci5hcHBlbmQoIigiKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRKYXZhVHlwZShyZXR1cm5Ob2RlKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiByZXN1bHQsICIpOwotCX0gZWxzZSBpZiAocmV0dXJuTm9kZSAhPSBudWxsICYmIGlzRmxvYXRpbmdQb2ludChyZXR1cm5Ob2RlKSkgewotCQlidWZmZXIuYXBwZW5kKCJkb3VibGUgIik7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXJDYWxsID8gIm9iamNfbXNnU2VuZFN1cGVyX2ZwcmV0IiA6ICJvYmpjX21zZ1NlbmRfZnByZXQiKTsKLQkJYnVmZmVyLmFwcGVuZCgiKCIpOwotCX0gZWxzZSBpZiAocmV0dXJuTm9kZSAhPSBudWxsICYmIGlzQm9vbGVhbihyZXR1cm5Ob2RlKSkgewotCQlidWZmZXIuYXBwZW5kKCJib29sZWFuICIpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyQ2FsbCA/ICJvYmpjX21zZ1NlbmRTdXBlcl9ib29sIiA6ICJvYmpjX21zZ1NlbmRfYm9vbCIpOwotCQlidWZmZXIuYXBwZW5kKCIoIik7Ci0JfSBlbHNlIHsKLQkJaWYgKG9ubHk2NCkgewotCQkJYnVmZmVyLmFwcGVuZCgibG9uZyIpOwotCQl9IGVsc2UgewkJCi0JCQlpZiAodGFncykgewotCQkJCWJ1ZmZlci5hcHBlbmQoImludCAvKmxvbmcqLyIpOwotCQkJfSBlbHNlIHsKLQkJCQlidWZmZXIuYXBwZW5kKCJpbnQiKTsKLQkJCX0KLQkJfQotCQlidWZmZXIuYXBwZW5kKCIgIik7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXJDYWxsID8gIm9iamNfbXNnU2VuZFN1cGVyIiA6ICJvYmpjX21zZ1NlbmQiKTsKLQkJYnVmZmVyLmFwcGVuZCgiKCIpOwotCX0KLQlpZiAoc3VwZXJDYWxsKSB7Ci0JCWlmIChvbmx5NjQpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIm9iamNfc3VwZXIgc3VwZXJJZCwgbG9uZyBzZWwiKTsKLQkJfSBlbHNlIHsKLQkJCWlmICh0YWdzKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgib2JqY19zdXBlciBzdXBlcklkLCBpbnQgLypsb25nKi8gc2VsIik7Ci0JCQl9IGVsc2UgewotCQkJCWJ1ZmZlci5hcHBlbmQoIm9iamNfc3VwZXIgc3VwZXJJZCwgaW50IHNlbCIpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKG9ubHk2NCkgewotCQkJYnVmZmVyLmFwcGVuZCgibG9uZyBpZCwgbG9uZyBzZWwiKTsKLQkJfSBlbHNlIHsKLQkJCWlmICh0YWdzKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiaW50IC8qbG9uZyovIGlkLCBpbnQgLypsb25nKi8gc2VsIik7Ci0JCQl9IGVsc2UgewotCQkJCWJ1ZmZlci5hcHBlbmQoImludCBpZCwgaW50IHNlbCIpOwotCQkJfQotCQl9Ci0JfQotCU5vZGVMaXN0IHBhcmFtcyA9IG1ldGhvZC5nZXRDaGlsZE5vZGVzKCk7Ci0JYm9vbGVhbiBmaXJzdCA9IGZhbHNlOwotCWludCBjb3VudCA9IDA7Ci0JZm9yIChpbnQgayA9IDA7IGsgPCBwYXJhbXMuZ2V0TGVuZ3RoKCk7IGsrKykgewotCQlOb2RlIHBhcmFtID0gcGFyYW1zLml0ZW0oayk7Ci0JCWlmICgiYXJnIi5lcXVhbHMocGFyYW0uZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCWlmICghZmlyc3QpIGJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0JCQlpZiAoaXNTdHJ1Y3QocGFyYW0pKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChnZXRKYXZhVHlwZShwYXJhbSkpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgdHlwZSA9IGdldFR5cGUocGFyYW0pLCB0eXBlNjQgPSBnZXRUeXBlNjQocGFyYW0pOwotCQkJCWJ1ZmZlci5hcHBlbmQob25seTY0ID8gdHlwZTY0IDogdHlwZSk7Ci0JCQkJaWYgKCFvbmx5NjQgJiYgdGFncyAmJiAhdHlwZS5lcXVhbHModHlwZTY0KSkgewotCQkJCQlidWZmZXIuYXBwZW5kKCIgLyoiKTsKLQkJCQkJYnVmZmVyLmFwcGVuZCh0eXBlNjQpOwotCQkJCQlidWZmZXIuYXBwZW5kKCIqLyIpOwotCQkJCX0KLQkJCX0KLQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQlidWZmZXIuYXBwZW5kKCIgYXJnIik7Ci0JCQlidWZmZXIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGNvdW50KyspKTsKLQkJfQotCX0KLQlidWZmZXIuYXBwZW5kKCIpOyIpOwotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLQotU3RyaW5nIGdldENUeXBlIChOb2RlIG5vZGUpIHsKLQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCXJldHVybiBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiZGVjbGFyZWRfdHlwZSIpLmdldE5vZGVWYWx1ZSgpOwotfQotCi1Ob2RlIGZpbmROU09iamVjdE1ldGhvZChOb2RlIG1ldGhvZCkgewotCU5hbWVkTm9kZU1hcCBtZXRob2RBdHRyaWJ1dGVzID0gbWV0aG9kLmdldEF0dHJpYnV0ZXMoKTsKLQlTdHJpbmcgc2VsZWN0b3IgPSBtZXRob2RBdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgic2VsZWN0b3IiKS5nZXROb2RlVmFsdWUoKTsKLQlOb2RlTGlzdCBsaXN0ID0gbWV0aG9kLmdldFBhcmVudE5vZGUoKS5nZXRQYXJlbnROb2RlKCkuZ2V0Q2hpbGROb2RlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCU5vZGUgY2xzID0gbGlzdC5pdGVtKGkpOwotCQlpZiAoImNsYXNzIi5lcXVhbHMoY2xzLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQlOYW1lZE5vZGVNYXAgY2xhc3NBdHRyaWJ1dGVzID0gY2xzLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmICgiTlNPYmplY3QiLmVxdWFscyhjbGFzc0F0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCkpKSB7Ci0JCQkJTm9kZUxpc3QgbWV0aG9kcyA9IGNscy5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJTm9kZSBtdGggPSBtZXRob2RzLml0ZW0oaik7Ci0JCQkJCWlmICgibWV0aG9kIi5lcXVhbHMobXRoLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCQlOYW1lZE5vZGVNYXAgbXRoQXR0cmlidXRlcyA9IG10aC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlpZiAoc2VsZWN0b3IuZXF1YWxzKG10aEF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJzZWxlY3RvciIpLmdldE5vZGVWYWx1ZSgpKSkgewotCQkJCQkJCXJldHVybiBtdGg7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVDdXN0b21DYWxsYmFja3MoKSB7Ci0JVHJlZU1hcCBzZXQgPSBuZXcgVHJlZU1hcCgpOwotCWZvciAoaW50IHggPSAwOyB4IDwgeG1scy5sZW5ndGg7IHgrKykgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50c1t4XTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIGNvbnRpbnVlOwotCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJaWYgKCgiY2xhc3MiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpIHx8ICJpbmZvcm1hbF9wcm90b2NvbCIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpICYmIGdldEdlbihub2RlKSkgewotCQkJCU5vZGVMaXN0IG1ldGhvZHMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZHMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQlOb2RlIG1ldGhvZCA9IG1ldGhvZHMuaXRlbShqKTsKLQkJCQkJaWYgKCJtZXRob2QiLmVxdWFscyhtZXRob2QuZ2V0Tm9kZU5hbWUoKSkgJiYgZ2V0R2VuKG1ldGhvZCkgJiYgZ2V0R2VuQ2FsbGJhY2sobWV0aG9kKSkgewotCQkJCQkJTmFtZWROb2RlTWFwIG10aEF0dHJpYnV0ZXMgPSBtZXRob2QuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJU3RyaW5nIHNlbCA9IG10aEF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJzZWxlY3RvciIpLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJc2V0LnB1dChzZWwsIG1ldGhvZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNldC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCVN0cmluZyBrZXkgPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQkJTm9kZSBtZXRob2QgPSAoTm9kZSlzZXQuZ2V0KGtleSk7Ci0JCWlmICgiaW5mb3JtYWxfcHJvdG9jb2wiLmVxdWFscyhtZXRob2QuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQltZXRob2QgPSBmaW5kTlNPYmplY3RNZXRob2QobWV0aG9kKTsKLQkJCWlmIChtZXRob2QgPT0gbnVsbCkgY29udGludWU7Ci0JCX0JCQotCQlTdHJpbmcgbmF0aXZlTXRoID0ga2V5LnJlcGxhY2VBbGwoIjoiLCAiXyIpOwotCQlvdXQoIi8qKiBAbWV0aG9kIGNhbGxiYWNrX3R5cGVzPSIpOwotCQlOb2RlIHJldHVybk5vZGUgPSBnZXRSZXR1cm5Ob2RlKG1ldGhvZC5nZXRDaGlsZE5vZGVzKCkpOwotCQlvdXQocmV0dXJuTm9kZSA9PSBudWxsID8gInZvaWQiIDogZ2V0Q1R5cGUocmV0dXJuTm9kZSkpOwotCQlvdXQoIjtpZDtTRUw7Iik7Ci0JCU5vZGVMaXN0IHBhcmFtcyA9IG1ldGhvZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGsgPSAwOyBrIDwgcGFyYW1zLmdldExlbmd0aCgpOyBrKyspIHsKLQkJCU5vZGUgcGFyYW0gPSBwYXJhbXMuaXRlbShrKTsKLQkJCWlmICgiYXJnIi5lcXVhbHMocGFyYW0uZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlvdXQoZ2V0Q1R5cGUocGFyYW0pKTsKLQkJCQlvdXQoIjsiKTsKLQkJCX0KLQkJfQotCQlvdXQoIixjYWxsYmFja19mbGFncz0iKTsKLQkJb3V0KHJldHVybk5vZGUgIT0gbnVsbCAmJiBpc1N0cnVjdChyZXR1cm5Ob2RlKSA/ICJzdHJ1Y3QiIDogIm5vbmUiKTsKLQkJb3V0KCI7bm9uZTtub25lOyIpOwotCQlmb3IgKGludCBrID0gMDsgayA8IHBhcmFtcy5nZXRMZW5ndGgoKTsgaysrKSB7Ci0JCQlOb2RlIHBhcmFtID0gcGFyYW1zLml0ZW0oayk7Ci0JCQlpZiAoImFyZyIuZXF1YWxzKHBhcmFtLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJb3V0IChpc1N0cnVjdChwYXJhbSkgPyAic3RydWN0IiA6ICJub25lIik7Ci0JCQkJb3V0KCI7Iik7Ci0JCQl9Ci0JCX0KLQkJb3V0KCIgKi8iKTsKLQkJb3V0bG4oKTsKLQkJb3V0KCJwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgLypsb25nKi8gQ0FMTEJBQ0tfIik7Ci0JCW91dChuYXRpdmVNdGgpOwotCQlvdXQoIihpbnQgLypsb25nKi8gZnVuYyk7Iik7Ci0JCW91dGxuKCk7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlU2VuZHMoYm9vbGVhbiBzdXBlckNhbGwpIHsKLQlUcmVlTWFwIHNldCA9IG5ldyBUcmVlTWFwKCk7Ci0JVHJlZU1hcCBzZXQ2NCA9IG5ldyBUcmVlTWFwKCk7Ci0JZm9yIChpbnQgeCA9IDA7IHggPCB4bWxzLmxlbmd0aDsgeCsrKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRzW3hdOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgY29udGludWU7Ci0JCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoImNsYXNzIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSAmJiBnZXRHZW4obm9kZSkpIHsKLQkJCQlOb2RlTGlzdCBtZXRob2RzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJTm9kZSBtZXRob2QgPSBtZXRob2RzLml0ZW0oaik7Ci0JCQkJCWlmICgibWV0aG9kIi5lcXVhbHMobWV0aG9kLmdldE5vZGVOYW1lKCkpICYmIGdldEdlbihtZXRob2QpICYmICghc3VwZXJDYWxsIHx8IGdldEdlblN1cGVyKG1ldGhvZCkpKSB7Ci0JCQkJCQlTdHJpbmcgY29kZSA9IGJ1aWxkU2VuZChtZXRob2QsIGZhbHNlLCBmYWxzZSwgc3VwZXJDYWxsKTsKLQkJCQkJCVN0cmluZyBjb2RlNjQgPSBidWlsZFNlbmQobWV0aG9kLCBmYWxzZSwgdHJ1ZSwgc3VwZXJDYWxsKTsKLQkJCQkJCWlmIChzZXQuZ2V0KGNvZGUpID09IG51bGwpIHsKLQkJCQkJCQlzZXQucHV0KGNvZGUsIG1ldGhvZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoc2V0NjQuZ2V0KGNvZGU2NCkgPT0gbnVsbCkgewotCQkJCQkJCXNldDY0LnB1dChjb2RlNjQsIG1ldGhvZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0Jb3V0bG4oKTsKLQlUcmVlTWFwIHRhZ3NTZXQgPSBuZXcgVHJlZU1hcCgpOwotCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXQua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQlTdHJpbmcga2V5ID0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0JCU5vZGUgbWV0aG9kID0gKE5vZGUpc2V0LmdldChrZXkpOwotCQlTdHJpbmcgdGFnQ29kZSA9IGJ1aWxkU2VuZChtZXRob2QsIGZhbHNlLCB0cnVlLCBzdXBlckNhbGwpOwotCQlpZiAoc2V0NjQuZ2V0KHRhZ0NvZGUpICE9IG51bGwpIHsKLQkJCXRhZ3NTZXQucHV0KGtleSwgbWV0aG9kKTsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJc2V0NjQucmVtb3ZlKHRhZ0NvZGUpOwotCQl9Ci0JfQotCVRyZWVNYXAgYWxsID0gbmV3IFRyZWVNYXAoKTsKLQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFnc1NldC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCU5vZGUgbWV0aG9kID0gKE5vZGUpdGFnc1NldC5nZXQoa2V5KTsKLQkJYWxsLnB1dChidWlsZFNlbmQobWV0aG9kLCB0cnVlLCBmYWxzZSwgc3VwZXJDYWxsKSwgbWV0aG9kKTsKLQl9Ci0JZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNldC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCWFsbC5wdXQoa2V5LCBzZXQuZ2V0KGtleSkpOwotCX0KLQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2V0NjQua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQlhbGwucHV0KGtleSwgc2V0NjQuZ2V0KGtleSkpOwotCX0KLQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJU3RyaW5nIGtleSA9IChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotCQlOb2RlIG1ldGhvZCA9IChOb2RlKWFsbC5nZXQoa2V5KTsKLQkJTm9kZUxpc3QgcGFyYW1zID0gbWV0aG9kLmdldENoaWxkTm9kZXMoKTsKLQkJQXJyYXlMaXN0IHRhZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGsgPSAwOyBrIDwgcGFyYW1zLmdldExlbmd0aCgpOyBrKyspIHsKLQkJCU5vZGUgcGFyYW0gPSBwYXJhbXMuaXRlbShrKTsKLQkJCWlmICgiYXJnIi5lcXVhbHMocGFyYW0uZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlpZiAoaXNTdHJ1Y3QocGFyYW0pKSB7Ci0JCQkJCXRhZ3MuYWRkKCIgKiBAcGFyYW0gYXJnIiArIGNvdW50ICsgIiBmbGFncz1zdHJ1Y3QiKTsKLQkJCQl9Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCQlvdXQoIi8qKiIpOwotCQlpZiAodGFncy5zaXplKCkgPiAwKSB7Ci0JCQlvdXRsbigpOwotCQkJb3V0KCIgKiIpOwotCQl9Ci0JCW91dCgiIEBtZXRob2QgZmxhZ3M9Y2FzdCIpOwotCQlpZiAodGFncy5zaXplKCkgPiAwKSBvdXRsbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMiA9IHRhZ3MuaXRlcmF0b3IoKTsgaXRlcmF0b3IyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB0YWcgPSAoU3RyaW5nKSBpdGVyYXRvcjIubmV4dCgpOwotCQkJb3V0KHRhZyk7Ci0JCQlvdXRsbigpOwotCQl9Ci0JCW91dCgiICovIik7Ci0JCW91dGxuKCk7Ci0JCW91dChrZXkudG9TdHJpbmcoKSk7Ci0JCW91dGxuKCk7Ci0JfQotfQotCi1TdHJpbmcgZ2V0U2VsQ29uc3QoU3RyaW5nIHNlbCkgewotCXJldHVybiAic2VsXyIgKyBzZWwucmVwbGFjZUFsbCgiOiIsICJfIik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVDbGFzc2VzQ29uc3QoKSB7Ci0JVHJlZVNldCBzZXQgPSBuZXcgVHJlZVNldCgpOwotCWZvciAoaW50IHggPSAwOyB4IDwgeG1scy5sZW5ndGg7IHgrKykgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50c1t4XTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIGNvbnRpbnVlOwotCQlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJaWYgKCJjbGFzcyIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlpZiAoZ2V0R2VuKG5vZGUpKSB7Ci0JCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJc2V0LmFkZChuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCVN0cmluZyBjbHMgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCVN0cmluZyBjbHNDb25zdCA9ICJjbGFzc18iICsgY2xzOwotCQlvdXQoInB1YmxpYyBzdGF0aWMgZmluYWwgaW50IC8qbG9uZyovICIpOwotCQlvdXQoY2xzQ29uc3QpOwotCQlvdXQoIiA9ICIpOwotCQlvdXQoIm9iamNfZ2V0Q2xhc3MoXCIiKTsKLQkJb3V0KGNscyk7Ci0JCW91dCgiXCIpOyIpOwotCQlvdXRsbigpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZVByb3RvY29sc0NvbnN0KCkgewotCVRyZWVTZXQgc2V0ID0gbmV3IFRyZWVTZXQoKTsKLQlmb3IgKGludCB4ID0gMDsgeCA8IHhtbHMubGVuZ3RoOyB4KyspIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudHNbeF07Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKSBjb250aW51ZTsKLQkJTm9kZUxpc3QgbGlzdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCWlmICgiaW5mb3JtYWxfcHJvdG9jb2wiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJaWYgKGdldEdlbihub2RlKSkgewotCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCXNldC5hZGQobmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXQuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQlTdHJpbmcgY2xzID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQlTdHJpbmcgY2xzQ29uc3QgPSAicHJvdG9jb2xfIiArIGNsczsKLQkJb3V0KCJwdWJsaWMgc3RhdGljIGZpbmFsIGludCAvKmxvbmcqLyAiKTsKLQkJb3V0KGNsc0NvbnN0KTsKLQkJb3V0KCIgPSAiKTsKLQkJb3V0KCJvYmpjX2dldFByb3RvY29sKFwiIik7Ci0JCW91dChjbHMpOwotCQlvdXQoIlwiKTsiKTsKLQkJb3V0bG4oKTsKLQl9Ci19Ci0KLVN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JaW50IGRvdCA9IG1haW5DbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQlpZiAoZG90ID09IC0xKSByZXR1cm4gIiI7Ci0JcmV0dXJuIG1haW5DbGFzc05hbWUuc3Vic3RyaW5nKDAsIGRvdCk7Ci19Ci0KLVN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCWludCBkb3QgPSBtYWluQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JaWYgKGRvdCA9PSAtMSkgcmV0dXJuIG1haW5DbGFzc05hbWU7Ci0JcmV0dXJuIG1haW5DbGFzc05hbWUuc3Vic3RyaW5nKGRvdCArIDEpOwotfQotCi1Ob2RlIGdldFJldHVybk5vZGUoTm9kZUxpc3QgbGlzdCkgewotCWZvciAoaW50IGogPSAwOyBqIDwgbGlzdC5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCU5vZGUgbm9kZSA9IGxpc3QuaXRlbShqKTsKLQkJaWYgKCJyZXR2YWwiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotU3RyaW5nIGdldFR5cGUoTm9kZSBub2RlKSB7Ci0JTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQlOb2RlIGphdmFUeXBlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInN3dF9qYXZhX3R5cGUiKTsKLQlpZiAoamF2YVR5cGUgIT0gbnVsbCkgcmV0dXJuIGphdmFUeXBlLmdldE5vZGVWYWx1ZSgpOwotCVN0cmluZyBjb2RlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInR5cGUiKS5nZXROb2RlVmFsdWUoKTsKLQlyZXR1cm4gZ2V0VHlwZShjb2RlLCBhdHRyaWJ1dGVzLCBmYWxzZSk7Ci19Ci0KLVN0cmluZyBnZXRUeXBlNjQoTm9kZSBub2RlKSB7Ci0JTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQlOb2RlIGphdmFUeXBlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInN3dF9qYXZhX3R5cGUiKTsKLQlpZiAoamF2YVR5cGUgIT0gbnVsbCkgewotCQlOb2RlIGphdmFUeXBlNjQgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgic3d0X2phdmFfdHlwZTY0Iik7Ci0JCXJldHVybiBqYXZhVHlwZTY0ICE9IG51bGwgPyBqYXZhVHlwZTY0LmdldE5vZGVWYWx1ZSgpIDogamF2YVR5cGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JfQotCU5vZGUgYXR0cmliID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInR5cGUiKTsKLQlTdHJpbmcgY29kZSA9IGF0dHJpYi5nZXROb2RlVmFsdWUoKTsKLQlOb2RlIGF0dHJpYjY0ID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInR5cGU2NCIpOwotCWlmIChhdHRyaWI2NCAhPSBudWxsKSBjb2RlID0gYXR0cmliNjQuZ2V0Tm9kZVZhbHVlKCk7Ci0JcmV0dXJuIGdldFR5cGUoY29kZSwgYXR0cmlidXRlcywgdHJ1ZSk7Ci19Ci0KLVN0cmluZyBnZXRUeXBlKFN0cmluZyBjb2RlLCBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcywgYm9vbGVhbiBpczY0KSB7Ci0JaWYgKGNvZGUuZXF1YWxzKCJjIikpIHJldHVybiAiYnl0ZSI7Ci0JaWYgKGNvZGUuZXF1YWxzKCJpIikpIHJldHVybiAiaW50IjsKLQlpZiAoY29kZS5lcXVhbHMoInMiKSkgcmV0dXJuICJzaG9ydCI7Ci0JaWYgKGNvZGUuZXF1YWxzKCJsIikpIHJldHVybiAiaW50IjsKLQlpZiAoY29kZS5lcXVhbHMoInEiKSkgcmV0dXJuICJsb25nIjsKLQlpZiAoY29kZS5lcXVhbHMoIkMiKSkgcmV0dXJuICJieXRlIjsKLQlpZiAoY29kZS5lcXVhbHMoIkkiKSkgcmV0dXJuICJpbnQiOwotCWlmIChjb2RlLmVxdWFscygiUyIpKSByZXR1cm4gInNob3J0IjsKLQlpZiAoY29kZS5lcXVhbHMoIkwiKSkgcmV0dXJuICJpbnQiOwotCWlmIChjb2RlLmVxdWFscygiUSIpKSByZXR1cm4gImxvbmciOwotCWlmIChjb2RlLmVxdWFscygiZiIpKSByZXR1cm4gImZsb2F0IjsKLQlpZiAoY29kZS5lcXVhbHMoImQiKSkgcmV0dXJuICJkb3VibGUiOwotCWlmIChjb2RlLmVxdWFscygiQiIpKSByZXR1cm4gImJvb2xlYW4iOwotCWlmIChjb2RlLmVxdWFscygidiIpKSByZXR1cm4gInZvaWQiOwotCWlmIChjb2RlLmVxdWFscygiKiIpKSByZXR1cm4gaXM2NCA/ICJsb25nIiA6ICJpbnQiOwotCWlmIChjb2RlLmVxdWFscygiQCIpKSByZXR1cm4gaXM2NCA/ICJsb25nIiA6ICJpbnQiOwotCWlmIChjb2RlLmVxdWFscygiIyIpKSByZXR1cm4gaXM2NCA/ICJsb25nIiA6ICJpbnQiOwotCWlmIChjb2RlLmVxdWFscygiOiIpKSByZXR1cm4gaXM2NCA/ICJsb25nIiA6ICJpbnQiOwotCWlmIChjb2RlLnN0YXJ0c1dpdGgoIl4iKSkgcmV0dXJuIGlzNjQgPyAibG9uZyIgOiAiaW50IjsKLQlpZiAoY29kZS5zdGFydHNXaXRoKCJ7IikpIHsJCQotCQlyZXR1cm4gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oImRlY2xhcmVkX3R5cGUiKS5nZXROb2RlVmFsdWUoKTsKLQl9Ci0JcmV0dXJuICJCQUQgIiArIGNvZGU7Ci19Ci0KLVN0cmluZyBnZXRKTklUeXBlKE5vZGUgbm9kZSkgewotCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JU3RyaW5nIGNvZGUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgidHlwZSIpLmdldE5vZGVWYWx1ZSgpOwotCWlmIChjb2RlLmVxdWFscygiYyIpKSByZXR1cm4gIkIiOwotCWlmIChjb2RlLmVxdWFscygiaSIpKSByZXR1cm4gIkkiOwotCWlmIChjb2RlLmVxdWFscygicyIpKSByZXR1cm4gIlMiOwotCWlmIChjb2RlLmVxdWFscygibCIpKSByZXR1cm4gIkkiOwotCWlmIChjb2RlLmVxdWFscygicSIpKSByZXR1cm4gIkoiOwotCWlmIChjb2RlLmVxdWFscygiQyIpKSByZXR1cm4gIkIiOwotCWlmIChjb2RlLmVxdWFscygiSSIpKSByZXR1cm4gIkkiOwotCWlmIChjb2RlLmVxdWFscygiUyIpKSByZXR1cm4gIlMiOwotCWlmIChjb2RlLmVxdWFscygiTCIpKSByZXR1cm4gIkkiOwotCWlmIChjb2RlLmVxdWFscygiUSIpKSByZXR1cm4gIkoiOwotCWlmIChjb2RlLmVxdWFscygiZiIpKSByZXR1cm4gIkYiOwotCWlmIChjb2RlLmVxdWFscygiZCIpKSByZXR1cm4gIkQiOwotCWlmIChjb2RlLmVxdWFscygiQiIpKSByZXR1cm4gIloiOwotCWlmIChjb2RlLmVxdWFscygidiIpKSByZXR1cm4gIlYiOwotCWlmIChjb2RlLmVxdWFscygiKiIpKSByZXR1cm4gIkkiOwotCWlmIChjb2RlLmVxdWFscygiQCIpKSByZXR1cm4gIkkiOwotCWlmIChjb2RlLmVxdWFscygiIyIpKSByZXR1cm4gIkkiOwotCWlmIChjb2RlLmVxdWFscygiOiIpKSByZXR1cm4gIkkiOwotCWlmIChjb2RlLnN0YXJ0c1dpdGgoIl4iKSkgcmV0dXJuICJJIjsKLQlpZiAoY29kZS5zdGFydHNXaXRoKCJbIikpIHJldHVybiAiQkFEICIgKyBjb2RlOwotCWlmIChjb2RlLnN0YXJ0c1dpdGgoInsiKSkgewkJCi0JCXJldHVybiAiQkFEICIgKyBjb2RlOwotCX0KLQlpZiAoY29kZS5zdGFydHNXaXRoKCIoIikpIHJldHVybiAiQkFEICIgKyBjb2RlOwotCXJldHVybiAiQkFEICIgKyBjb2RlOwotfQotCi1TdHJpbmcgZ2V0SmF2YVR5cGUoTm9kZSBub2RlKSB7Ci0JTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQlOb2RlIGphdmFUeXBlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInN3dF9qYXZhX3R5cGUiKTsKLQlpZiAoamF2YVR5cGUgIT0gbnVsbCkgcmV0dXJuIGphdmFUeXBlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLQlTdHJpbmcgY29kZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJ0eXBlIikuZ2V0Tm9kZVZhbHVlKCk7Ci0JcmV0dXJuIGdldEphdmFUeXBlKGNvZGUsIGF0dHJpYnV0ZXMsIGZhbHNlKTsKLX0KLQotU3RyaW5nIGdldEphdmFUeXBlNjQoTm9kZSBub2RlKSB7Ci0JTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQlOb2RlIGphdmFUeXBlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInN3dF9qYXZhX3R5cGUiKTsKLQlpZiAoamF2YVR5cGUgIT0gbnVsbCkgewotCQlOb2RlIGphdmFUeXBlNjQgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgic3d0X2phdmFfdHlwZTY0Iik7Ci0JCXJldHVybiBqYXZhVHlwZTY0ICE9IG51bGwgPyBqYXZhVHlwZTY0LmdldE5vZGVWYWx1ZSgpIDogamF2YVR5cGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JfQotCU5vZGUgYXR0cmliID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInR5cGUiKTsKLQlTdHJpbmcgY29kZSA9IGF0dHJpYi5nZXROb2RlVmFsdWUoKTsKLQlOb2RlIGF0dHJpYjY0ID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInR5cGU2NCIpOwotCWlmIChhdHRyaWI2NCAhPSBudWxsKSBjb2RlID0gYXR0cmliNjQuZ2V0Tm9kZVZhbHVlKCk7Ci0JcmV0dXJuIGdldEphdmFUeXBlKGNvZGUsIGF0dHJpYnV0ZXMsIHRydWUpOwotfQotCQotU3RyaW5nIGdldEphdmFUeXBlKFN0cmluZyBjb2RlLCBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcywgYm9vbGVhbiBpczY0KSB7Ci0JaWYgKGNvZGUuZXF1YWxzKCJjIikpIHJldHVybiAiYnl0ZSI7Ci0JaWYgKGNvZGUuZXF1YWxzKCJpIikpIHJldHVybiAiaW50IjsKLQlpZiAoY29kZS5lcXVhbHMoInMiKSkgcmV0dXJuICJzaG9ydCI7Ci0JaWYgKGNvZGUuZXF1YWxzKCJsIikpIHJldHVybiAiaW50IjsKLQlpZiAoY29kZS5lcXVhbHMoInEiKSkgcmV0dXJuICJsb25nIjsKLQlpZiAoY29kZS5lcXVhbHMoIkMiKSkgcmV0dXJuICJieXRlIjsKLQlpZiAoY29kZS5lcXVhbHMoIkkiKSkgcmV0dXJuICJpbnQiOwotCWlmIChjb2RlLmVxdWFscygiUyIpKSByZXR1cm4gInNob3J0IjsKLQlpZiAoY29kZS5lcXVhbHMoIkwiKSkgcmV0dXJuICJpbnQiOwotCWlmIChjb2RlLmVxdWFscygiUSIpKSByZXR1cm4gImxvbmciOwotCWlmIChjb2RlLmVxdWFscygiZiIpKSByZXR1cm4gImZsb2F0IjsKLQlpZiAoY29kZS5lcXVhbHMoImQiKSkgcmV0dXJuICJkb3VibGUiOwotCWlmIChjb2RlLmVxdWFscygiQiIpKSByZXR1cm4gImJvb2xlYW4iOwotCWlmIChjb2RlLmVxdWFscygidiIpKSByZXR1cm4gInZvaWQiOwotCWlmIChjb2RlLmVxdWFscygiKiIpKSByZXR1cm4gaXM2NCA/ICJsb25nIiA6ICJpbnQiOwotCWlmIChjb2RlLmVxdWFscygiIyIpKSByZXR1cm4gaXM2NCA/ICJsb25nIiA6ICJpbnQiOwotCWlmIChjb2RlLmVxdWFscygiOiIpKSByZXR1cm4gaXM2NCA/ICJsb25nIiA6ICJpbnQiOwotCWlmIChjb2RlLnN0YXJ0c1dpdGgoIl4iKSkgcmV0dXJuIGlzNjQgPyAibG9uZyIgOiAiaW50IjsKLQlpZiAoY29kZS5lcXVhbHMoIkAiKSkgewotCQlTdHJpbmcgdHlwZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJkZWNsYXJlZF90eXBlIikuZ2V0Tm9kZVZhbHVlKCk7Ci0JCWludCBpbmRleCA9IHR5cGUuaW5kZXhPZignKicpOwotCQlpZiAoaW5kZXggIT0gLTEpIHR5cGUgPSB0eXBlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCWluZGV4ID0gdHlwZS5pbmRleE9mKCc8Jyk7Ci0JCWlmIChpbmRleCAhPSAtMSkgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJcmV0dXJuIHR5cGUudHJpbSgpOwotCX0KLQlpZiAoY29kZS5zdGFydHNXaXRoKCJ7IikpIHsJCQotCQlyZXR1cm4gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oImRlY2xhcmVkX3R5cGUiKS5nZXROb2RlVmFsdWUoKS50cmltKCk7Ci0JfQotCXJldHVybiAiQkFEICIgKyBjb2RlOwotfQotCi1zdGF0aWMgU3RyaW5nW10gc3BsaXQoU3RyaW5nIHN0ciwgU3RyaW5nIHNlcGFyYXRvcikgewotCVN0cmluZ1Rva2VuaXplciB0ayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCBzZXBhcmF0b3IpOwotCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jd2hpbGUgKHRrLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXJlc3VsdC5hZGQodGsubmV4dEVsZW1lbnQoKSk7Ci0JfQotCXJldHVybiAoU3RyaW5nW10pcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVGdW5jdGlvbnMoKSB7Ci0JZm9yIChpbnQgeCA9IDA7IHggPCB4bWxzLmxlbmd0aDsgeCsrKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRzW3hdOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgY29udGludWU7Ci0JCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoImZ1bmN0aW9uIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkgewotCQkJCWlmIChnZXRHZW4obm9kZSkpIHsKLQkJCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgibmFtZSIpLmdldE5vZGVWYWx1ZSgpOwotCQkJCQlOb2RlTGlzdCBwYXJhbXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaW50IGNvdW50ID0gMDsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbXMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJTm9kZSBwYXJhbSA9IHBhcmFtcy5pdGVtKGopOwotCQkJCQkJaWYgKCJhcmciLmVxdWFscyhwYXJhbS5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJCWNvdW50Kys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCQkJb3V0KCIvKioiKTsKLQkJCQkJCW91dGxuKCk7Ci0JCQkJCX0KLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbXMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJTm9kZSBwYXJhbSA9IHBhcmFtcy5pdGVtKGopOwotCQkJCQkJaWYgKCJhcmciLmVxdWFscyhwYXJhbS5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJCU5hbWVkTm9kZU1hcCBwYXJhbUF0dHJpYnV0ZXMgPSBwYXJhbS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQkJb3V0KCIgKiBAcGFyYW0gIik7Ci0JCQkJCQkJb3V0KHBhcmFtQXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKSk7Ci0JCQkJCQkJaWYgKGlzU3RydWN0KHBhcmFtKSkgewotCQkJCQkJCQlvdXQoIiBmbGFncz1zdHJ1Y3QiKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlvdXQoIiBjYXN0PSIpOwotCQkJCQkJCQlOb2RlIGRlY2xhcmVkVHlwZSA9IHBhcmFtQXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oImRlY2xhcmVkX3R5cGUiKTsKLQkJCQkJCQkJU3RyaW5nIGNhc3QgPSBkZWNsYXJlZFR5cGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJCWlmICghY2FzdC5zdGFydHNXaXRoKCIoIikpIG91dCgiKCIpOwotCQkJCQkJCQlvdXQoY2FzdCk7Ci0JCQkJCQkJCWlmICghY2FzdC5lbmRzV2l0aCgiKSIpKSBvdXQoIikiKTsKLQkJCQkJCQl9Ci0JCQkJCQkJb3V0bG4oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJCQlvdXQoIiAqLyIpOwotCQkJCQkJb3V0bG4oKTsKLQkJCQkJfQotCQkJCQlvdXQoInB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlICIpOwotCQkJCQlOb2RlIHJldHVybk5vZGUgPSBnZXRSZXR1cm5Ob2RlKG5vZGUuZ2V0Q2hpbGROb2RlcygpKTsKLQkJCQkJaWYgKHJldHVybk5vZGUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHR5cGUgPSBnZXRUeXBlKHJldHVybk5vZGUpLCB0eXBlNjQgPSBnZXRUeXBlNjQocmV0dXJuTm9kZSk7Ci0JCQkJCQlvdXQodHlwZSk7Ci0JCQkJCQlpZiAoIXR5cGUuZXF1YWxzKHR5cGU2NCkpIHsKLQkJCQkJCQlvdXQoIiAvKiIpOwotCQkJCQkJCW91dCh0eXBlNjQpOwotCQkJCQkJCW91dCgiKi8iKTsKLQkJCQkJCX0KLQkJCQkJCW91dCgiICIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJb3V0KCJ2b2lkICIpOwotCQkJCQl9Ci0JCQkJCW91dChuYW1lKTsKLQkJCQkJb3V0KCIoIik7Ci0JCQkJCXBhcmFtcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbXMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJTm9kZSBwYXJhbSA9IHBhcmFtcy5pdGVtKGopOwotCQkJCQkJaWYgKCJhcmciLmVxdWFscyhwYXJhbS5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJCU5hbWVkTm9kZU1hcCBwYXJhbUF0dHJpYnV0ZXMgPSBwYXJhbS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQkJaWYgKCFmaXJzdCkgb3V0KCIsICIpOwotCQkJCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCQkJU3RyaW5nIHR5cGUgPSBnZXRUeXBlKHBhcmFtKSwgdHlwZTY0ID0gZ2V0VHlwZTY0KHBhcmFtKTsKLQkJCQkJCQlvdXQodHlwZSk7Ci0JCQkJCQkJaWYgKCF0eXBlLmVxdWFscyh0eXBlNjQpKSB7Ci0JCQkJCQkJCW91dCgiIC8qIik7Ci0JCQkJCQkJCW91dCh0eXBlNjQpOwotCQkJCQkJCQlvdXQoIiovIik7Ci0JCQkJCQkJfQotCQkJCQkJCW91dCgiICIpOwotCQkJCQkJCW91dChwYXJhbUF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWdlbmVyYXRlVmFyaWFkaWNzKG5vZGUpOwotCQkJCQlvdXQoIik7Iik7Ci0JCQkJCW91dGxuKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlVmFyaWFkaWNzKE5vZGUgbm9kZSkgewotCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JTm9kZSB2YXJpYWRpY0NvdW50ID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInN3dF92YXJpYWRpY19jb3VudCIpOwotCWlmICh2YXJpYWRpY0NvdW50ICE9IG51bGwpIHsKLQkJTm9kZSB2YXJpYWRpY1R5cGVzID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInN3dF92YXJpYWRpY19qYXZhX3R5cGVzIik7Ci0JCVN0cmluZ1tdIHR5cGVzID0gbnVsbDsKLQkJaWYgKHZhcmlhZGljVHlwZXMgIT0gbnVsbCkgewotCQkJdHlwZXMgPSBzcGxpdCh2YXJpYWRpY1R5cGVzLmdldE5vZGVWYWx1ZSgpLCAiLCIpOwotCQl9Ci0JCWludCB2YXJDb3VudCA9IDA7Ci0JCXRyeSB7Ci0JCQl2YXJDb3VudCA9IEludGVnZXIucGFyc2VJbnQodmFyaWFkaWNDb3VudC5nZXROb2RlVmFsdWUoKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7fQotCQlmb3IgKGludCBqID0gMDsgaiA8IHZhckNvdW50OyBqKyspIHsKLQkJCW91dCgiLCAiKTsKLQkJCWlmICh0eXBlcyAhPSBudWxsICYmIHR5cGVzLmxlbmd0aCA+IGogJiYgIXR5cGVzW2pdLmVxdWFscygiKiIpKSB7Ci0JCQkJb3V0KHR5cGVzW2pdKTsKLQkJCX0gZWxzZSBpZiAodHlwZXMgIT0gbnVsbCAmJiB0eXBlc1t0eXBlcy5sZW5ndGggLSAxXS5lcXVhbHMoIioiKSkgewotCQkJCW91dCh0eXBlc1t0eXBlcy5sZW5ndGggLSAyXSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dCgiaW50IC8qbG9uZyovIik7Ci0JCQl9Ci0JCQlvdXQoIiB2YXJBcmciKTsKLQkJCW91dCgiIiArIGopOwotCQl9Ci0JfQotfQotCi1ib29sZWFuIGNvbXBhcmUoSW5wdXRTdHJlYW0gaXMxLCBJbnB1dFN0cmVhbSBpczIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0Jd2hpbGUgKHRydWUpIHsKLQkJaW50IGMxID0gaXMxLnJlYWQoKTsKLQkJaW50IGMyID0gaXMyLnJlYWQoKTsKLQkJaWYgKGMxICE9IGMyKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChjMSA9PSAtMSkgYnJlYWs7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi12b2lkIG91dHB1dChieXRlW10gYnl0ZXMsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlGaWxlSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCXRyeSB7Ci0JCWlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCWlmIChjb21wYXJlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyksIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzKSkpIHJldHVybjsKLQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaXMgIT0gbnVsbCkgaXMuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQl9Ci0JRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0Jb3V0LndyaXRlKGJ5dGVzKTsKLQlvdXQuY2xvc2UoKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotLy8JYXJncyA9IG5ldyBTdHJpbmdbXXsKLS8vCQkiLi9NYWMgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQXBwS2l0RnVsbC5icmlkZ2VzdXBwb3J0IiwKLS8vCQkiLi9NYWMgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvRm91bmRhdGlvbkZ1bGwuYnJpZGdlc3VwcG9ydCIsCi0vLwkJIi4vTWFjIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1dlYktpdEZ1bGwuYnJpZGdlc3VwcG9ydCIsCi0vLwl9OwotCXRyeSB7Ci0JCU1hY0dlbmVyYXRvciBnZW4gPSBuZXcgTWFjR2VuZXJhdG9yKCk7Ci0JCWdlbi5zZXRYbWxzKGFyZ3MpOwotCQlnZW4uc2V0T3V0cHV0RGlyKCIuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvY29jb2EvIik7Ci0JCWdlbi5zZXRNYWluQ2xhc3MoIm9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jb2NvYS5PUyIpOwotCQlnZW4uZ2VuZXJhdGUobnVsbCk7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9NYWMgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWFjR2VuZXJhdG9yVUkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL01hYyBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NYWNHZW5lcmF0b3JVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDA5ODZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL01hYyBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NYWNHZW5lcmF0b3JVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBNYWNHZW5lcmF0b3JVSSB7Ci0JTWFjR2VuZXJhdG9yIGdlbjsKLQlib29sZWFuIGFjdGlvbnMgPSB0cnVlOwotCi0JVHJlZSBub2Rlc1RyZWU7Ci0JVGFibGUgYXR0cmliVGFibGU7Ci0KLQlwdWJsaWMgTWFjR2VuZXJhdG9yVUkoTWFjR2VuZXJhdG9yIGdlbikgewotCQl0aGlzLmdlbiA9IGdlbjsKLQl9Ci0KLQlUcmVlSXRlbSBsYXN0UGFyZW50OwotCVRyZWVJdGVtIGFkZENoaWxkIChOb2RlIG5vZGUsIFRyZWVJdGVtIHN1cGVySXRlbSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSByZXR1cm4gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCVRyZWVJdGVtIHBhcmVudEl0ZW0gPSBudWxsOwotCQlpZiAobGFzdFBhcmVudCAhPSBudWxsICYmICFsYXN0UGFyZW50LmlzRGlzcG9zZWQoKSAmJiBsYXN0UGFyZW50LmdldFBhcmVudEl0ZW0oKSA9PSBzdXBlckl0ZW0gJiYgbmFtZS5lcXVhbHMobGFzdFBhcmVudC5nZXREYXRhKCkpKSB7Ci0JCQlwYXJlbnRJdGVtID0gbGFzdFBhcmVudDsKLQkJfSBlbHNlIHsKLQkJCVRyZWVJdGVtW10gaXRlbXMgPSBzdXBlckl0ZW0uZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobmFtZS5lcXVhbHMoaXRlbXNbaV0uZ2V0RGF0YSgpKSkgewotCQkJCQlwYXJlbnRJdGVtID0gaXRlbXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwYXJlbnRJdGVtID09IG51bGwpIHsKLQkJCQlwYXJlbnRJdGVtID0gbmV3IFRyZWVJdGVtKHN1cGVySXRlbSwgU1dULk5PTkUpOwotCQkJCXBhcmVudEl0ZW0uc2V0RGF0YShuYW1lKTsKLQkJCQlwYXJlbnRJdGVtLnNldFRleHQoZ2V0UHJldHR5VGV4dChuYW1lKSk7Ci0JCQl9Ci0JCQlsYXN0UGFyZW50ID0gcGFyZW50SXRlbTsKLQkJfQotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHBhcmVudEl0ZW0sIFNXVC5OT05FKTsKLQkJTm9kZSBpZEF0dHJpYiA9IGdlbi5nZXRJREF0dHJpYnV0ZShub2RlKTsKLQkJaXRlbS5zZXRUZXh0KGlkQXR0cmliICE9IG51bGwgPyBpZEF0dHJpYi5nZXROb2RlVmFsdWUoKSA6IG5hbWUpOwotCQlpdGVtLnNldERhdGEobm9kZSk7Ci0JCWNoZWNrSXRlbShub2RlLCBpdGVtKTsKLQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApIG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCXJldHVybiBpdGVtOwotCX0KLQkKLQl2b2lkIGNoZWNrUGF0aChUcmVlSXRlbSBpdGVtLCBib29sZWFuIGNoZWNrZWQsIGJvb2xlYW4gZ3JheWVkKSB7Ci0JICAgIGlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkgICAgaWYgKGdyYXllZCkgewotCSAgICAgICAgY2hlY2tlZCA9IHRydWU7Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgICBpbnQgaW5kZXggPSAwOwotCSAgICAgICAgVHJlZUl0ZW1bXSBpdGVtcyA9IGl0ZW0uZ2V0SXRlbXMoKTsKLQkgICAgICAgIHdoaWxlIChpbmRleCA8IGl0ZW1zLmxlbmd0aCkgewotCSAgICAgICAgICAgIFRyZWVJdGVtIGNoaWxkID0gaXRlbXNbaW5kZXhdOwotCSAgICAgICAgICAgIGlmIChjaGlsZC5nZXRHcmF5ZWQoKSB8fCBjaGVja2VkICE9IGNoaWxkLmdldENoZWNrZWQoKSkgewotCSAgICAgICAgICAgICAgICBjaGVja2VkID0gZ3JheWVkID0gdHJ1ZTsKLQkgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGluZGV4Kys7Ci0JICAgICAgICB9Ci0JICAgIH0KLQkgICAgaXRlbS5zZXRDaGVja2VkKGNoZWNrZWQpOwotCSAgICBpdGVtLnNldEdyYXllZChncmF5ZWQpOwotCSAgICB1cGRhdGVHZW5BdHRyaWJ1dGUoaXRlbSk7Ci0JICAgIGNoZWNrUGF0aChpdGVtLmdldFBhcmVudEl0ZW0oKSwgY2hlY2tlZCwgZ3JheWVkKTsKLQl9Ci0JCi0Jdm9pZCBjaGVja0l0ZW0oTm9kZSBub2RlLCBUcmVlSXRlbSBpdGVtKSB7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCU5vZGUgZ2VuID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oInN3dF9nZW4iKTsKLQkJaWYgKGdlbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBnZW4uZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlib29sZWFuIGdyYXllZCA9IHZhbHVlLmVxdWFscygibWl4ZWQiKTsKLQkJCWJvb2xlYW4gY2hlY2tlZCA9IGdyYXllZCB8fCB2YWx1ZS5lcXVhbHMoInRydWUiKTsKLQkJCWl0ZW0uc2V0Q2hlY2tlZChjaGVja2VkKTsKLQkJCWl0ZW0uc2V0R3JheWVkKGdyYXllZCk7Ci0JCX0KLQl9Ci0JCi0JYm9vbGVhbiBnZXRFZGl0YWJsZShUYWJsZUl0ZW0gaXRlbSwgaW50IGNvbHVtbikgewotCQlpZiAoIShpdGVtLmdldERhdGEoKSBpbnN0YW5jZW9mIE5vZGUpKSByZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBhdHRyaWJOYW1lID0gaXRlbS5nZXRUZXh0KCk7Ci0JCXJldHVybiBhdHRyaWJOYW1lLnN0YXJ0c1dpdGgoInN3dF8iKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0UHJldHR5VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dC5lcXVhbHMoImNsYXNzIikpIHJldHVybiAiQ2xhc3NlcyI7Ci0JCWlmICh0ZXh0LmVxdWFscygiZGVwZW5kc19vbiIpKSByZXR1cm4gIkRlcGVuZHNfb24iOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHRleHQuc3Vic3RyaW5nKDEpICsgInMiOwotCX0KLQotCXZvaWQgY2hlY2tDaGlsZHJlbihUcmVlSXRlbSBpdGVtKSB7Ci0JCVRyZWVJdGVtIGR1bW15OwotCQlpZiAoaXRlbS5nZXRJdGVtQ291bnQoKSA9PSAxICYmIChkdW1teSA9IGl0ZW0uZ2V0SXRlbSgwKSkuZ2V0RGF0YSgpID09IG51bGwpIHsKLQkJCWR1bW15LmRpc3Bvc2UoKTsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKWl0ZW0uZ2V0RGF0YSgpOwotCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCWFkZENoaWxkKGNoaWxkTm9kZXMuaXRlbShpKSwgaXRlbSk7Ci0JCQl9Ci0JCQkvKiBGaWd1cmUgb3V0IGNhdGVnb3JpZXMgc3RhdGUgKi8KLQkJCVRyZWVJdGVtW10gaXRlbXMgPSBpdGVtLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUl0ZW1bXSBjaGlsZHJlbiA9IGl0ZW1zW2ldLmdldEl0ZW1zKCk7Ci0JCQkJaW50IGNoZWNrZWRDb3VudCA9IDA7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQlpZiAoY2hpbGRyZW5bal0uZ2V0Q2hlY2tlZCgpKSBjaGVja2VkQ291bnQrKzsKLQkJCQkJaWYgKGNoaWxkcmVuW2pdLmdldEdyYXllZCgpKSBicmVhazsKLQkJCQl9Ci0JCQkJaXRlbXNbaV0uc2V0Q2hlY2tlZChjaGVja2VkQ291bnQgIT0gMCk7Ci0JCQkJaXRlbXNbaV0uc2V0R3JheWVkKGNoZWNrZWRDb3VudCAhPSBjaGlsZHJlbi5sZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCQotCXZvaWQgY2hlY2tJdGVtcyhUcmVlSXRlbSBpdGVtLCBib29sZWFuIGNoZWNrZWQpIHsKLQkgICAgaXRlbS5zZXRHcmF5ZWQoZmFsc2UpOwotCSAgICBpdGVtLnNldENoZWNrZWQoY2hlY2tlZCk7Ci0JICAgIHVwZGF0ZUdlbkF0dHJpYnV0ZShpdGVtKTsKLQkgICAgVHJlZUl0ZW1bXSBpdGVtcyA9IGl0ZW0uZ2V0SXRlbXMoKTsKLQkgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PSAxICYmIGl0ZW1zWzBdLmdldERhdGEoKSA9PSBudWxsKSB7Ci0JICAgIAkvKiBVcGRhdGUgbW9kZWwgb25seSBpZiB2aWV3IGlzIG5vdCBjcmVhdGVkICovCi0JCQlOb2RlIG5vZGUgPSAoTm9kZSlpdGVtLmdldERhdGEoKTsKLQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQljaGVja05vZGVzKGNoaWxkTm9kZXMuaXRlbShpKSwgY2hlY2tlZCk7Ci0JCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICAgICAgY2hlY2tJdGVtcyhpdGVtc1tpXSwgY2hlY2tlZCk7Ci0JCSAgICB9Ci0JICAgIH0KLQl9Ci0JCi0Jdm9pZCBjaGVja05vZGVzKE5vZGUgbm9kZSwgYm9vbGVhbiBjaGVja2VkKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJaWYgKGNoZWNrZWQpIHsKLQkJCQkoKEVsZW1lbnQpbm9kZSkuc2V0QXR0cmlidXRlKCJzd3RfZ2VuIiwgInRydWUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJKChFbGVtZW50KW5vZGUpLnJlbW92ZUF0dHJpYnV0ZSgic3d0X2dlbiIpOwotCQkJfQotCQl9Ci0JCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJY2hlY2tOb2RlcyhjaGlsZE5vZGVzLml0ZW0oaSksIGNoZWNrZWQpOwotCQl9Ci0JfQotCQotCXZvaWQgY2xlYW51cCgpIHsKLQl9Ci0KLQlDb21wb3NpdGUgY3JlYXRlU2lnbmF0dXJlc1BhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCJTaWduYXR1cmVzOiIpOwotCQkKLQkJZmluYWwgVGV4dCBzZWFyY2ggPSBuZXcgVGV4dChjb21wLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5TRUFSQ0gpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXNlYXJjaC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzZWFyY2guc2V0VGV4dCgiLioiKTsKLQkJc2VhcmNoLmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBhcmcwKSB7Ci0JCQkJc2VhcmNoRm9yKHNlYXJjaC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJc2VhcmNoLmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5rZXlDb2RlID09IFNXVC5GNikgewotCQkJCQlzZWFyY2hGb3Ioc2VhcmNoLmdldFRleHQoKSk7CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbm9kZXNUcmVlID0gbmV3IFRyZWUoY29tcCwgU1dULlNJTkdMRSB8IFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlub2Rlc1RyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCW5vZGVzVHJlZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBTV1QuQ0hFQ0spIHsKLQkJCQkJc2VsZWN0Q2hpbGQoaXRlbSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYm9vbGVhbiBjaGVja2VkID0gaXRlbS5nZXRDaGVja2VkKCk7Ci0JCQkJaXRlbS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotICAgICAgICAgICAgICAgIGNoZWNrSXRlbXMoaXRlbSwgY2hlY2tlZCk7Ci0gICAgICAgICAgICAgICAgY2hlY2tQYXRoKGl0ZW0uZ2V0UGFyZW50SXRlbSgpLCBjaGVja2VkLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaXRlbS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQlub2Rlc1RyZWUuYWRkTGlzdGVuZXIoU1dULkV4cGFuZCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQljaGVja0NoaWxkcmVuKChUcmVlSXRlbSlldmVudC5pdGVtKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCQotCUNvbXBvc2l0ZSBjcmVhdGVQcm9wZXJ0aWVzUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpZiAoIWFjdGlvbnMpIGxheW91dC5tYXJnaW5SaWdodCA9IDU7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIlByb3BlcnRpZXM6Iik7Ci0JCQotCQlhdHRyaWJUYWJsZSA9IG5ldyBUYWJsZShjb21wLCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlhdHRyaWJUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlhdHRyaWJUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCWF0dHJpYlRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRhYmxlQ29sdW1uIG5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oYXR0cmliVGFibGUsIFNXVC5OT05FKTsKLQkJbmFtZUNvbHVtbi5zZXRUZXh0KCJOYW1lIik7Ci0JCW5hbWVDb2x1bW4ucGFjaygpOwotCQlUYWJsZUNvbHVtbiB2YWx1ZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihhdHRyaWJUYWJsZSwgU1dULk5PTkUpOwotCQl2YWx1ZUNvbHVtbi5zZXRUZXh0KCJWYWx1ZSIpOwotCQl2YWx1ZUNvbHVtbi5wYWNrKCk7Ci0JCQotCQlmaW5hbCBUZXh0IGVkaXRvclR4ID0gbmV3IFRleHQoYXR0cmliVGFibGUsIFNXVC5TSU5HTEUpOwotCQlmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IoYXR0cmliVGFibGUpOwotCQllZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQllZGl0b3Iuc2V0RWRpdG9yKGVkaXRvclR4KTsKLQkJTGlzdGVuZXIgdGV4dExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChlLnR5cGUgPT0gU1dULktleURvd24pIHsKLQkJCQkJaWYgKGUua2V5Q29kZSAhPSBTV1QuRjYpIHJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLQkJCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQkJCQkJCWVkaXRvci5zZXRJdGVtKG51bGwpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWRpdG9yVHguc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBlZGl0b3IuZ2V0SXRlbSgpOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlpbnQgY29sdW1uID0gZWRpdG9yLmdldENvbHVtbigpOwotCQkJCVN0cmluZyB2YWx1ZSA9IGVkaXRvclR4LmdldFRleHQoKTsKLQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCB2YWx1ZSk7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpaXRlbS5nZXREYXRhKCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpdGVtLmdldFRleHQoKTsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlub2RlLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQllZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgdGV4dExpc3RlbmVyKTsKLS8vCQllZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHRleHRMaXN0ZW5lcik7Ci0JCWVkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCB0ZXh0TGlzdGVuZXIpOwotCQllZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIHRleHRMaXN0ZW5lcik7Ci0JCWF0dHJpYlRhYmxlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIEV2ZW50IGUpIHsKLQkJCQllLmRpc3BsYXkuYXN5bmNFeGVjIChuZXcgUnVubmFibGUgKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJCQkJaWYgKGF0dHJpYlRhYmxlLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQkJCWlmIChlLmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0JCQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludChlLngsIGUueSk7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGF0dHJpYlRhYmxlLmdldEl0ZW0ocHQpOwotCQkJCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJCQkJaW50IGNvbHVtbiA9IC0xOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJUYWJsZS5nZXRDb2x1bW5Db3VudCgpOyBpKyspIHsKLQkJCQkJCQlpZiAoaXRlbS5nZXRCb3VuZHMoaSkuY29udGFpbnMocHQpKSB7Ci0JCQkJCQkJCWNvbHVtbiA9IGk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0JCQkJCi0JCQkJCQl9Ci0JCQkJCQlpZiAoY29sdW1uID09IC0xKSByZXR1cm47Ci0JCQkJCQlpZiAoIWdldEVkaXRhYmxlKGl0ZW0sIGNvbHVtbikpIHJldHVybjsKLQkJCQkJCWVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQkJCWVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQkJZWRpdG9yVHguc2V0VGV4dChpdGVtLmdldFRleHQoY29sdW1uKSk7Ci0JCQkJCQllZGl0b3JUeC5zZWxlY3RBbGwoKTsKLQkJCQkJCWVkaXRvclR4LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQllZGl0b3JUeC5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCQotCUNvbXBvc2l0ZSBjcmVhdGVBY3Rpb25zUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJcGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlCdXR0b24gZ2VuZXJhdGUgPSBuZXcgQnV0dG9uKHBhbmVsLCBTV1QuUFVTSCk7Ci0JCWdlbmVyYXRlLnNldFRleHQoIkdlbmVyYXRlIik7Ci0JCWdlbmVyYXRlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZ2VuZXJhdGUobnVsbCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlKFByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgewotCQlnZW4uZ2VuZXJhdGUocHJvZ3Jlc3MpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRBY3Rpb25zVmlzaWJsZSgpIHsKLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9wZW4oQ29tcG9zaXRlIHBhcmVudCkgewotCQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUNvbXBvc2l0ZSBzaWduYXR1cmVQYW5lbCA9IGNyZWF0ZVNpZ25hdHVyZXNQYW5lbChwYXJlbnQpOwotCQlmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaChwYXJlbnQsIFNXVC5TTU9PVEggfCBTV1QuVkVSVElDQUwpOwotCQlDb21wb3NpdGUgcHJvcGVydGllc1BhbmVsID0gY3JlYXRlUHJvcGVydGllc1BhbmVsKHBhcmVudCk7Ci0JCQotCQlDb21wb3NpdGUgYWN0aW9uc1BhbmVsID0gbnVsbDsKLQkJaWYgKGFjdGlvbnMpIHsKLQkJCWFjdGlvbnNQYW5lbCA9IGNyZWF0ZUFjdGlvbnNQYW5lbChwYXJlbnQpOwotCQl9Ci0KLQkJRm9ybURhdGEgZGF0YTsKLQkJCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsJCQotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlzaWduYXR1cmVQYW5lbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobnVsbCwgTWF0aC5tYXgoMjAwLCBwYXJlbnQuZ2V0U2l6ZSgpLnggLyAyKSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlzYXNoLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChzYXNoLCBzYXNoLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gYWN0aW9uc1BhbmVsICE9IG51bGwgPyBuZXcgRm9ybUF0dGFjaG1lbnQoYWN0aW9uc1BhbmVsLCAwKSA6IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlwcm9wZXJ0aWVzUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlpZiAoYWN0aW9uc1BhbmVsICE9IG51bGwpIHsKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJCWFjdGlvbnNQYW5lbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0JCQotCQlzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlIHBhcmVudCA9IHNhc2guZ2V0UGFyZW50KCk7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWV2ZW50LnggPSBNYXRoLm1pbiAoTWF0aC5tYXggKGV2ZW50LngsIDYwKSwgcmVjdC53aWR0aCAtIDYwKTsKLQkJCQlpZiAoZXZlbnQuZGV0YWlsICE9IFNXVC5EUkFHKSB7Ci0JCQkJCUZvcm1EYXRhIGRhdGEgPSAoRm9ybURhdGEpc2FzaC5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJCWRhdGEubGVmdC5vZmZzZXQgPSBldmVudC54OwotCQkJCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdXBkYXRlTm9kZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljbGVhbnVwKCk7Ci0JfQotCQotCUFycmF5TGlzdCBmbGF0Tm9kZXM7Ci0Jdm9pZCBzZWFyY2hGb3IoU3RyaW5nIG5hbWUpIHsKLQkJVHJlZUl0ZW1bXSBzZWxlY3Rpb24gPSBub2Rlc1RyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24ubGVuZ3RoICE9IDApIHsKLQkJCWlmIChzZWxlY3Rpb25bMF0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCW5vZGUgPSAoTm9kZSlzZWxlY3Rpb25bMF0uZ2V0RGF0YSgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoc2VsZWN0aW9uWzBdLmdldEl0ZW1Db3VudCgpID4gMCAmJiBzZWxlY3Rpb25bMF0uZ2V0SXRlbSgwKS5nZXREYXRhKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCW5vZGUgPSAoTm9kZSlzZWxlY3Rpb25bMF0uZ2V0SXRlbSgwKS5nZXREYXRhKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCURvY3VtZW50W10gZG9jdW1lbnRzID0gZ2VuLmdldERvY3VtZW50cygpOwotCQlpZiAobm9kZSA9PSBudWxsICYmIGRvY3VtZW50cy5sZW5ndGggPiAwKSBub2RlID0gZ2VuLmdldERvY3VtZW50cygpWzBdOwotCQlpZiAoZmxhdE5vZGVzID09IG51bGwpIHsKLQkJCWZsYXROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWRkTm9kZXMoZG9jdW1lbnRzW2ldLCBmbGF0Tm9kZXMpOwotCQkJfQotCQl9Ci0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlIChmbGF0Tm9kZXMuZ2V0KGluZGV4KyspICE9IG5vZGUpOwkJCi0JCWludCBzdGFydCA9IGluZGV4OwotCQl3aGlsZSAoaW5kZXggPCBmbGF0Tm9kZXMuc2l6ZSgpKSB7Ci0JCQlOb2RlIGNoaWxkID0gKE5vZGUpZmxhdE5vZGVzLmdldChpbmRleCk7Ci0JCQlOb2RlIGF0dHJpYk5hbWUgPSBnZW4uZ2V0SURBdHRyaWJ1dGUoY2hpbGQpOwotCQkJaWYgKGF0dHJpYk5hbWUgIT0gbnVsbCAmJiBhdHRyaWJOYW1lLmdldE5vZGVWYWx1ZSgpLm1hdGNoZXMobmFtZSkpIHsKLQkJCQlzZWxlY3ROb2RlKGNoaWxkKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpbmRleCsrOwotCQl9Ci0JCWluZGV4ID0gMDsKLQkJd2hpbGUgKGluZGV4IDwgc3RhcnQpIHsKLQkJCU5vZGUgY2hpbGQgPSAoTm9kZSlmbGF0Tm9kZXMuZ2V0KGluZGV4KTsKLQkJCU5vZGUgYXR0cmliTmFtZSA9IGdlbi5nZXRJREF0dHJpYnV0ZShjaGlsZCk7Ci0JCQlpZiAoYXR0cmliTmFtZSAhPSBudWxsICYmIGF0dHJpYk5hbWUuZ2V0Tm9kZVZhbHVlKCkubWF0Y2hlcyhuYW1lKSkgewotCQkJCXNlbGVjdE5vZGUoY2hpbGQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWluZGV4Kys7Ci0JCX0KLQkJbm9kZXNUcmVlLmdldERpc3BsYXkoKS5iZWVwKCk7Ci0JfQotCQotCXZvaWQgc2VsZWN0Tm9kZShOb2RlIG5vZGUpIHsKLQkJQXJyYXlMaXN0IHBhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRvIHsKLQkJCXBhdGguYWRkKG5vZGUpOwotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9IHdoaWxlIChub2RlICE9IG51bGwpOwotCQlUcmVlSXRlbVtdIGl0ZW1zID0gbm9kZXNUcmVlLmdldEl0ZW1zKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UocGF0aCk7Ci0JCXBhdGgucmVtb3ZlKDApOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJVHJlZUl0ZW0gaXRlbSA9IGZpbmRJdGVtKGl0ZW1zLCAoTm9kZSlwYXRoLnJlbW92ZSgwKSk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpZiAocGF0aC5pc0VtcHR5KCkpIHsKLQkJCQlub2Rlc1RyZWUuc2V0U2VsZWN0aW9uKGl0ZW0pOwotCQkJCXNlbGVjdENoaWxkKGl0ZW0pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWl0ZW1zID0gaXRlbS5nZXRJdGVtcygpOwotCQl9Ci0JfQotCQotCVRyZWVJdGVtIGZpbmRJdGVtKFRyZWVJdGVtW10gaXRlbXMsIE5vZGUgbm9kZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQljaGVja0NoaWxkcmVuKGl0ZW0pOwotCQkJaWYgKGl0ZW0uZ2V0RGF0YSgpID09IG5vZGUpIHJldHVybiBpdGVtOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVJdGVtIGNoaWxkID0gZmluZEl0ZW0oaXRlbXNbaV0uZ2V0SXRlbXMoKSwgbm9kZSk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkgcmV0dXJuIGNoaWxkOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQl2b2lkIGFkZE5vZGVzKE5vZGUgbm9kZSwgQXJyYXlMaXN0IGxpc3QpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuOwotCQlsaXN0LmFkZChub2RlKTsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJYWRkTm9kZXMoY2hpbGQsIGxpc3QpOwotCQl9CQotCX0KLQkKLQl2b2lkIHNlbGVjdENoaWxkKFRyZWVJdGVtIGl0ZW0pIHsKLQkJYXR0cmliVGFibGUucmVtb3ZlQWxsKCk7Ci0JCWlmICghKGl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgTm9kZSkpIHJldHVybjsKLQkJTm9kZSBub2RlID0gKE5vZGUpaXRlbS5nZXREYXRhKCk7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCVN0cmluZ1tdIGV4dHJhQXR0cmlicyA9IGdlbi5nZXRFeHRyYUF0dHJpYnV0ZU5hbWVzKG5vZGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhQXR0cmlicy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVJdGVtIGF0dHJpYkl0ZW0gPSBuZXcgVGFibGVJdGVtKGF0dHJpYlRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlhdHRyaWJJdGVtLnNldFRleHQoZXh0cmFBdHRyaWJzW2ldKTsKLQkJCWF0dHJpYkl0ZW0uc2V0RGF0YShub2RlKTsKLQkJCWF0dHJpYkl0ZW0uc2V0Rm9yZWdyb3VuZChpdGVtLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQkJTm9kZSBhdHRyaWIgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShleHRyYUF0dHJpYnNbaV0pOwotCQkJaWYgKGF0dHJpYiAhPSBudWxsKSB7Ci0JCQkJYXR0cmliSXRlbS5zZXRUZXh0KDEsIGF0dHJpYi5nZXROb2RlVmFsdWUoKSk7Ci0JCQl9Ci0JCQkKLQkJfQotCQljaGVja0l0ZW0obm9kZSwgaXRlbSk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgYXR0cmliID0gYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGF0dHJpYk5hbWUgPSBhdHRyaWIuZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmIChhdHRyaWJOYW1lLnN0YXJ0c1dpdGgoInN3dF8iKSkgY29udGludWU7Ci0JCQlUYWJsZUl0ZW0gYXR0cmliSXRlbSA9IG5ldyBUYWJsZUl0ZW0oYXR0cmliVGFibGUsIFNXVC5OT05FKTsKLQkJCWF0dHJpYkl0ZW0uc2V0VGV4dChhdHRyaWJOYW1lKTsKLQkJCWF0dHJpYkl0ZW0uc2V0VGV4dCgxLCBhdHRyaWIuZ2V0Tm9kZVZhbHVlKCkpOwotCQl9Ci0JCWF0dHJpYlRhYmxlLmdldENvbHVtbigwKS5wYWNrKCk7Ci0JCWF0dHJpYlRhYmxlLmdldENvbHVtbigxKS5zZXRXaWR0aCg1MDApOwotCX0KLQkKLQl2b2lkIHVwZGF0ZUdlbkF0dHJpYnV0ZSAoVHJlZUl0ZW0gaXRlbSkgewotCQlpZiAoaXRlbS5nZXREYXRhKCkgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudClpdGVtLmdldERhdGEoKTsKLQkJCWlmIChpdGVtLmdldENoZWNrZWQoKSkgewotCQkJCWlmIChpdGVtLmdldEdyYXllZCgpKSB7Ci0JCQkJCW5vZGUuc2V0QXR0cmlidXRlKCJzd3RfZ2VuIiwgIm1peGVkIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbm9kZS5zZXRBdHRyaWJ1dGUoInN3dF9nZW4iLCAidHJ1ZSIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoInN3dF9nZW4iKTsKLQkJCX0KLQkJfQotCX0KLQkKLQl2b2lkIHVwZGF0ZU5vZGVzKCkgewotCQlTdHJpbmdbXSB4bWxzID0gZ2VuLmdldFhtbHMoKTsKLQkJaWYgKHhtbHMgPT0gbnVsbCkgcmV0dXJuOwotCQlEb2N1bWVudFtdIGRvY3VtZW50cyA9IGdlbi5nZXREb2N1bWVudHMoKTsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCB4bWxzLmxlbmd0aDsgeCsrKSB7Ci0JCQlTdHJpbmcgeG1sUGF0aCA9IHhtbHNbeF07Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50c1t4XTsKLQkJCWlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgZmluZDogIiArIHhtbFBhdGgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbShub2Rlc1RyZWUsIFNXVC5OT05FKTsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGdlbi5nZXRGaWxlTmFtZSh4bWxQYXRoKTsKLQkJCWlmIChmaWxlTmFtZS5lbmRzV2l0aCgiRnVsbC5icmlkZ2VzdXBwb3J0IikpIHsKLQkJCQlmaWxlTmFtZSA9ICBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSAiRnVsbC5icmlkZ2VzdXBwb3J0Ii5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQlpdGVtLnNldFRleHQoZmlsZU5hbWUpOwotCQkJTm9kZSBub2RlID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQlpdGVtLnNldERhdGEobm9kZSk7Ci0JCQljaGVja0l0ZW0obm9kZSwgaXRlbSk7Ci0JCQluZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQl9Ci0JCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gbm9kZXNUcmVlLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zW2ldLnBhY2soKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoICgpIHsKLQkJaWYgKG5vZGVzVHJlZSA9PSBudWxsKSByZXR1cm47Ci0JCWdlbi5zZXRYbWxzKG51bGwpOwotCQlmbGF0Tm9kZXMgPSBudWxsOwotCQlub2Rlc1RyZWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkgcHVibGljIHZvaWQgcnVuKCkgewotCQkJCSBpZiAobm9kZXNUcmVlID09IG51bGwgfHwgbm9kZXNUcmVlLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCSBub2Rlc1RyZWUucmVtb3ZlQWxsKCk7Ci0JCQkJIGF0dHJpYlRhYmxlLnJlbW92ZUFsbCgpOwotCQkJCSB1cGRhdGVOb2RlcygpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uc1Zpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXRoaXMuYWN0aW9ucyA9IHZpc2libGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlub2Rlc1RyZWUuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0vLwkJYXJncyA9IG5ldyBTdHJpbmdbXXsKLS8vCQkJIi4vTWFjIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0FwcEtpdEZ1bGwuYnJpZGdlc3VwcG9ydCIsCi0vLwkJCSIuL01hYyBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Gb3VuZGF0aW9uRnVsbC5icmlkZ2VzdXBwb3J0IiwKLS8vCQkJIi4vTWFjIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1dlYktpdEZ1bGwuYnJpZGdlc3VwcG9ydCIsCi0vLwkJfTsKLQkJdHJ5IHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJCU1hY0dlbmVyYXRvciBnZW4gPSBuZXcgTWFjR2VuZXJhdG9yKCk7Ci0JCQlnZW4uc2V0WG1scyhhcmdzKTsKLQkJCWdlbi5zZXRPdXRwdXREaXIoIi4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS9jb2NvYS8iKTsKLQkJCWdlbi5zZXRNYWluQ2xhc3MoIm9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jb2NvYS5PUyIpOwotCQkJTWFjR2VuZXJhdG9yVUkgdWkgPSBuZXcgTWFjR2VuZXJhdG9yVUkoZ2VuKTsKLQkJCXVpLm9wZW4oc2hlbGwpOwotCQkJc2hlbGwub3BlbigpOwotCQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJCXVpLmRpc3Bvc2UoKTsKLQkJCWRpc3BsYXkuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL01vemlsbGEgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTW96aWxsYUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTW96aWxsYSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Nb3ppbGxhR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMDMwODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTW96aWxsYSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Nb3ppbGxhR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qIFByb2R1Y2VzIHRoZSBqYXZhIGNsYXNzZXMgbWFwcGluZyB0byBYUENPTSBNb3ppbGxhIG9iamVjdHMgKi8KLXB1YmxpYyBjbGFzcyBNb3ppbGxhR2VuZXJhdG9yIHsKLQlGaWxlUmVhZGVyIHIgPSBudWxsOwotCUZpbGVXcml0ZXIgdyA9IG51bGw7Ci0JaW50IG1heExpbmVzID0gMTAwMDsKLQlpbnQgY250TGluZXMgPSAwOwotCWludCBuID0gMDsKLQlTdHJpbmdbXSBiID0gbnVsbDsKLQlTdHJpbmcgYm9keSA9IG51bGw7Ci0JaW50IG5NZXRob2RzID0gMDsKLQlTdHJpbmcgdXVpZE5hbWU7Ci0JU3RyaW5nIHV1aWRWYWx1ZTsKLQlTdHJpbmcgY2xhc3NOYW1lOwotCVN0cmluZyBwYXJlbnROYW1lOwotCVN0cmluZ1tdIGNvbnN0YW50TmFtZXM7Ci0JU3RyaW5nW10gY29uc3RhbnRWYWx1ZXM7Ci0JU3RyaW5nW10gbWV0aG9kTmFtZXM7Ci0JU3RyaW5nW11bXSBhcmdUeXBlczsKLQlTdHJpbmdbXVtdIGFyZ05hbWVzOwotCVN0cmluZyBib2R5T3JkZXI7Ci0JSGFzaHRhYmxlIHZ0YmxzOwotCi0Jc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCS8vIENvbnRhaW5zIHRoZSBjaGFyYWN0ZXJzIGZvdW5kIGJlZm9yZSBhIG1ldGhvZCBuYW1lCi0JLy8gVXNlZnVsIHRvIGV4dHJhY3QgdGhlIG1ldGhvZCBuYW1lLiBlLmcuCi0JLy8gIE5TX0lNRVRIT0QgUXVlcnlJbnRlcmZhY2UoY29uc3QgbnNJSUQgJiB1dWlkLCB2b2lkICogKnJlc3VsdCkgPSAwOwotCS8vICBOU19JTUVUSE9EXyhuc3JlZmNudCkgQWRkUmVmKHZvaWQpID0gMDsKLQkvLyBtZXRob2QgbmFtZSBmb2xsb3dzOiBRdWVyeUludGVyZmFjZSwgQWRkUmVmIGV0Yy4KLQlzdGF0aWMgU3RyaW5nW10gQkVGT1JFX01FVEhPRF9OQU1FID0gewotCQkiICBOU19JTUVUSE9EICIsCi0JCSIgIE5TX0lNRVRIT0RfKG5zcmVmY250KSAiLAotCQkiICBOU19JTUVUSE9EXyh2b2lkICopICIsCi0JCSIgIE5TX0lNRVRIT0RfKHZvaWQpICIsCi0JCSIgIE5TX0lNRVRIT0RfKG5zcmVzdWx0KSAiLAotCQkiICBOU19TQ1JJUFRBQkxFIE5TX0lNRVRIT0QgIiwKLQkJIiAgTlNfU0NSSVBUQUJMRSBOU19JTUVUSE9EXyhuc3JlZmNudCkgIiwKLQkJIiAgTlNfU0NSSVBUQUJMRSBOU19JTUVUSE9EXyh2b2lkICopICIsCi0JCSIgIE5TX1NDUklQVEFCTEUgTlNfSU1FVEhPRF8odm9pZCkgIiwKLQkJIiAgTlNfU0NSSVBUQUJMRSBOU19JTUVUSE9EXyhuc3Jlc3VsdCkgIiwKLQl9OwotCXN0YXRpYyBTdHJpbmcgTk9fU1VQRVJfQ0xBU1MgPSAiU1dUX05PX1NVUEVSX0NMQVNTIjsKLQkKLQlzdGF0aWMgU3RyaW5nW11bXSBUWVBFU19DMkpBVkEgPSB7IAotCQl7ICJQUkJvb2wgKiIsICJpbnRbXSIgfSwKLQkJeyAibnNJSUQgJiIsICJuc0lEIiB9LAotCQl7ICJuc0NJRCAmIiwgIm5zSUQiIH0sCi0JCXsgIm5zQ0lEICogKiIsICJpbnQgLypsb25nKi8iIH0sIC8vIG5zSURbXSBub3Qgc3VwcG9ydGVkIGJ5IGpuaWdlbgotCQl7ICIqICoiLCAiaW50IC8qbG9uZyovW10iIH0sCi0JCXsgIioqIiwgImludCAvKmxvbmcqL1tdIiB9LAotCQl7ICIqICYiLCAiaW50IC8qbG9uZyovW10iIH0sCi0JCXsgIlBSVWludDMyICoiLCAiaW50W10iIH0sIAotCQl7ICJQUkludDMyICoiLCAiaW50W10iIH0sCi0JCXsgIlBSSW50NjQgKiIsICJsb25nW10iIH0sCi0JCXsgIlBSVW5pY2hhciAqIiwgImNoYXJbXSIgfSwKLQkJeyAiY2hhciAqIiwgImJ5dGVbXSIgfSwKLQkJeyAiZmxvYXQgKiIsICJmbG9hdFtdIiB9LAotCQl7ICJQUlVpbnQxNiAqIiwgInNob3J0W10iIH0sCi0JCXsgIm5hdGl2ZVdpbmRvdyAqIiwgImludCAvKmxvbmcqL1tdIiB9LAotCQl7ICJuc1dyaXRlU2VnbWVudEZ1biIsICJpbnQgLypsb25nKi8iIH0sCi0JCXsgIm5hdGl2ZVdpbmRvdyIsICJpbnQgLypsb25nKi8iIH0sCi0KLQkJeyAiKiIsICJpbnQgLypsb25nKi8iIH0sIC8vIGMgdHlwZSBjb250YWluaW5nIG9uZSBvciBtb3JlICogKGFuZCBhbnkgb3RoZXIgY2hhcmFjdGVyLCBhbmQgZGlkIG5vdCBtYXRjaCBwcmV2aW91cyBwYXR0ZXJucykgaXMgYSBzaW1wbGUgcG9pbnRlcgotCQl7ICImIiwgImludCAvKmxvbmcqLyIgfSwgCi0KLQkJeyAiUFJVaW50MzIiLCAiaW50IiB9LAotCQl7ICJQUkludDMyIiwgImludCIgfSwgCi0JCXsgIlBSSW50NjQiLCAibG9uZyIgfSwgCi0JCXsgIm5zcmVzdWx0IiwgImludCIgfSwKLQkJeyAiUFJCb29sIiwgImludCIgfSwKLQkJeyAiZmxvYXQiLCAiZmxvYXQiIH0sCi0JCXsgIlBSVWludDE2IiwgInNob3J0IiB9LAotCQl7ICJzaXplX3QiLCAiaW50IiB9LAotCQl9OwotCi0Jc3RhdGljIFN0cmluZyBHRUNLTyA9ICIvYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvbW96aWxsYS8xLjQvbGludXhfZ3RrMi9tb3ppbGxhL2Rpc3QvaW5jbHVkZS8iOwotCXN0YXRpYyBTdHJpbmcgVEFSR0VUX0ZPTERFUiA9ICIvYmx1ZWJpcmQvdGVhbXN3dC9jaHJpc3gvYW1kNjQvd29ya3NwYWNlL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBNb3ppbGxhL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvbW96aWxsYS8iOwotCXN0YXRpYyBTdHJpbmdbXSBYUENPTV9IRUFERVJTID0gewotCQkicHJvZmlsZS9uc0lQcm9maWxlLmgiLAotCQkid2lkZ2V0L25zSUFwcFNoZWxsLmgiLAotCQkid2lkZ2V0L25zSUJhc2VXaW5kb3cuaCIsCi0JCSJ4cGNvbS9uc0lDb21wb25lbnRNYW5hZ2VyLmgiLAotCQkieHBjb20vbnNJQ29tcG9uZW50UmVnaXN0cmFyLmgiLAotCQkid2ViYnJ3c3IvbnNJQ29udGV4dE1lbnVMaXN0ZW5lci5oIiwgCi0JCSJkb2NzaGVsbC9uc0lEb2NTaGVsbC5oIiwKLQkJImRvbS9uc0lET01FdmVudC5oIiwKLQkJImRvbS9uc0lET01Nb3VzZUV2ZW50LmgiLAotCQkiZG9tL25zSURPTVVJRXZlbnQuaCIsCi0JCSJkb20vbnNJRE9NV2luZG93LmgiLAotCQkidXJpbG9hZGVyL25zSURvd25sb2FkLmgiLCAKLQkJIndlYmJyd3NyL25zSUVtYmVkZGluZ1NpdGVXaW5kb3cuaCIsCi0JCSJ4cGNvbS9uc0lGYWN0b3J5LmgiLCAKLQkJInhwY29tL25zSUZpbGUuaCIsCi0JCSJoZWxwZXJBcHBEbGcvbnNJSGVscGVyQXBwTGF1bmNoZXJEaWFsb2cuaCIsCi0JCSJleHRoYW5kbGVyL25zSUV4dGVybmFsSGVscGVyQXBwU2VydmljZS5oIiwgLy8gY29udGFpbnMgbnNJSGVscGVyQXBwTGF1bmNoZXIKLQkJInhwY29tL25zSUlucHV0U3RyZWFtLmgiLCAKLQkJInhwY29tL25zSUludGVyZmFjZVJlcXVlc3Rvci5oIiwKLQkJIm5lY2tvL25zSUlPU2VydmljZS5oIiwgCi0JCSJ4cGNvbS9uc0lMb2NhbEZpbGUuaCIsIAotCQkieHBjb20vbnNJTWVtb3J5LmgiLAotCQkicHJvZ3Jlc3NEbGcvbnNJUHJvZ3Jlc3NEaWFsb2cuaCIsCi0JCSJ3aW5kb3d3YXRjaGVyL25zSVByb21wdFNlcnZpY2UuaCIsIAotCQkieHBjb20vbnNJU2VydmljZU1hbmFnZXIuaCIsCi0JCSJ4cGNvbS9uc0lTdXBwb3J0cy5oIiwgCi0JCSJ3ZWJicndzci9uc0lUb29sdGlwTGlzdGVuZXIuaCIsIAotCQkibmVja28vbnNJVVJJLmgiLAotCQkidXJpbG9hZGVyL25zSVVSSUNvbnRlbnRMaXN0ZW5lci5oIiwgCi0JCSJ4cGNvbS9uc0lXZWFrUmVmZXJlbmNlLmgiLAotCQkid2ViYnJ3c3IvbnNJV2ViQnJvd3Nlci5oIiwgCi0JCSJ3ZWJicndzci9uc0lXZWJCcm93c2VyQ2hyb21lLmgiLAotCQkid2ViYnJ3c3IvbnNJV2ViQnJvd3NlckNocm9tZUZvY3VzLmgiLAotCQkid2ViYnJ3c3IvbnNJV2ViQnJvd3NlckZvY3VzLmgiLCAKLQkJImRvY3NoZWxsL25zSVdlYk5hdmlnYXRpb24uaCIsCi0JCSJ1cmlsb2FkZXIvbnNJV2ViUHJvZ3Jlc3MuaCIsIAotCQkidXJpbG9hZGVyL25zSVdlYlByb2dyZXNzTGlzdGVuZXIuaCIsCi0JCSJlbWJlZF9iYXNlL25zSVdpbmRvd0NyZWF0b3IuaCIsIAotCQkid2luZG93d2F0Y2hlci9uc0lXaW5kb3dXYXRjaGVyLmgiIH07Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCU1vemlsbGFHZW5lcmF0b3IgeCA9IG5ldyBNb3ppbGxhR2VuZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgWFBDT01fSEVBREVSUy5sZW5ndGg7IGkrKykKLQkJCXgucGFyc2UoR0VDS08gKyBYUENPTV9IRUFERVJTW2ldLCBUQVJHRVRfRk9MREVSKTsKLQkJeC5vdXRwdXRWdGJsQ2FsbCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImRvbmUiKTsKLQl9Ci0KLQlwdWJsaWMgTW96aWxsYUdlbmVyYXRvcigpIHsKLQkJdnRibHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JfQotCi0JLyoqIFdyaXRlIGNhbGxiYWNrcyAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBkYXRhKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludChkYXRhKTsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJdy53cml0ZShkYXRhKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlTGluZSgpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCXJldHVybjsKLQkJfQotCQl3cml0ZSgiXHJcbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlTGluZShTdHJpbmcgZGF0YSkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihkYXRhKTsKLQkJCXJldHVybjsKLQkJfQotCQl3cml0ZShkYXRhICsgIlxyXG4iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUNvcHlyaWdodHMoKSB7Ci0JCXdyaXRlTGluZShDT1BZUklHSFRTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZVBhY2thZ2VEZWNsYXJhdGlvbigpIHsKLQkJd3JpdGVMaW5lKFBBQ0tBR0VfREVDTEFSQVRJT04pOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlQ2xhc3NEZWNsYXJhdGlvbihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcGFyZW50TmFtZSkgewotCQlTdHJpbmcgbGluZSA9ICJwdWJsaWMgY2xhc3MgIiArIGNsYXNzTmFtZTsKLQkJaWYgKCFwYXJlbnROYW1lLmVxdWFscyhOT19TVVBFUl9DTEFTUykpIGxpbmUgKz0gIiBleHRlbmRzICIgKyBwYXJlbnROYW1lOwotCQlsaW5lICs9ICIgeyI7Ci0JCXdyaXRlTGluZShsaW5lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUxhc3RNZXRob2RJZChTdHJpbmcgcGFyZW50TmFtZSwgaW50IG5NZXRob2RzKSB7Ci0JCVN0cmluZyBsaW5lID0gIlx0c3RhdGljIGZpbmFsIGludCBMQVNUX01FVEhPRF9JRCA9ICI7Ci0JCWlmICghcGFyZW50TmFtZS5lcXVhbHMoTk9fU1VQRVJfQ0xBU1MpKSBsaW5lICs9IHBhcmVudE5hbWUgKyAiLkxBU1RfTUVUSE9EX0lEICsgIiArIG5NZXRob2RzICsgIjsiOwotCQllbHNlIGxpbmUgKz0gIiIgKyAobk1ldGhvZHMgLSAxKSsgIjsiOyAvLyB6ZXJvIGluZGV4ZWQKLQkJd3JpdGVMaW5lKGxpbmUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlSUlEKFN0cmluZyB1dWlkTmFtZSwgU3RyaW5nIHV1aWRWYWx1ZSkgewotCQl3cml0ZUxpbmUoIlx0cHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgIiArIHV1aWROYW1lICsgIiA9Iik7Ci0JCXdyaXRlTGluZSgiXHRcdFwiIiArIHV1aWRWYWx1ZSArICJcIjsiKTsKLQkJd3JpdGVMaW5lKCk7Ci0JCVN0cmluZyBpaWQgPSB1dWlkTmFtZS5zdWJzdHJpbmcoMCwgdXVpZE5hbWUuaW5kZXhPZigiX1NUUiIpKTsKLQkJd3JpdGVMaW5lKCJcdHB1YmxpYyBzdGF0aWMgZmluYWwgbnNJRCAiICsgaWlkICsgIiA9Iik7Ci0JCXdyaXRlTGluZSgiXHRcdG5ldyBuc0lEKCIgKyB1dWlkTmFtZSArICIpOyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlQWRkcmVzc0ZpZWxkKCkgewotCQl3cml0ZUxpbmUoIlx0aW50IC8qbG9uZyovIGFkZHJlc3M7Iik7Ci0JfQotCXB1YmxpYyB2b2lkIHdyaXRlQ29uc3RydWN0b3IoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHBhcmVudE5hbWUpIHsKLQkJd3JpdGVMaW5lKCJcdHB1YmxpYyAiICsgY2xhc3NOYW1lICsgIihpbnQgLypsb25nKi8gYWRkcmVzcykgeyIpOwotCQlpZiAoIXBhcmVudE5hbWUuZXF1YWxzKE5PX1NVUEVSX0NMQVNTKSkgewotCQkJd3JpdGVMaW5lKCJcdFx0c3VwZXIoYWRkcmVzcyk7Iik7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZUxpbmUoIlx0XHR0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOyIpOwotCQl9Ci0JCXdyaXRlTGluZSgiXHR9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVBZGRyZXNzR2V0dGVyKCkgewotCQl3cml0ZUxpbmUoIlx0cHVibGljIGludCAvKmxvbmcqLyBnZXRBZGRyZXNzKCkgeyIpOwotCQl3cml0ZUxpbmUoIlx0XHRyZXR1cm4gdGhpcy5hZGRyZXNzOyIpOwotCQl3cml0ZUxpbmUoIlx0fSIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB3cml0ZUNvbnN0YW50KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJd3JpdGVMaW5lKCJcdHB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICIgKyBuYW1lICsgIiA9ICIgKyB2YWx1ZSArICI7Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVNZXRob2QoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJlbnROYW1lLCBpbnQgbWV0aG9kSW5kZXgsIFN0cmluZ1tdIGFyZ1R5cGVzLCBTdHJpbmdbXSBhcmdOYW1lcykgewotCQl3cml0ZSgiXHRwdWJsaWMgaW50ICIgKyBuYW1lICsgIigiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJd3JpdGUoYXJnVHlwZXNbaV0gKyAiICIgKyBhcmdOYW1lc1tpXSk7Ci0JCQlpZiAoaSA8IGFyZ1R5cGVzLmxlbmd0aCAtIDEpCi0JCQkJd3JpdGUoIiwgIik7Ci0JCX0KLQkJd3JpdGUoIikgeyIpOwotCQl3cml0ZUxpbmUoKTsKLQkJU3RyaW5nIGxpbmUgPSAiXHRcdHJldHVybiBYUENPTS5WdGJsQ2FsbCgiOwotCQlpZiAoIXBhcmVudE5hbWUuZXF1YWxzKE5PX1NVUEVSX0NMQVNTKSkgbGluZSArPSBwYXJlbnROYW1lICsgIi5MQVNUX01FVEhPRF9JRCArICIgKyAobWV0aG9kSW5kZXggKyAxKSArICIsIGdldEFkZHJlc3MoKSI7Ci0JCWVsc2UgbGluZSArPSBtZXRob2RJbmRleCArICIsIGdldEFkZHJlc3MoKSI7IC8vIHplcm8gaW5kZXhlZAotCQl3cml0ZShsaW5lKTsKLQkJaWYgKGFyZ1R5cGVzLmxlbmd0aCA+IDApCi0JCQl3cml0ZSgiLCAiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJd3JpdGUoYXJnTmFtZXNbaV0pOwotCQkJaWYgKGkgPCBhcmdUeXBlcy5sZW5ndGggLSAxKQotCQkJCXdyaXRlKCIsICIpOwotCQl9Ci0JCXdyaXRlTGluZSgiKTsiKTsKLQkJd3JpdGVMaW5lKCJcdH0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUNsYXNzRW5kKCkgewotCQl3cml0ZSgifSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ1Z0YmxDYWxsKFN0cmluZ1tdIGFyZ1R5cGVzKSB7Ci0JCVN0cmluZyB2dGJsID0gInN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IFZ0YmxDYWxsKGludCBmbk51bWJlciwgaW50IC8qbG9uZyovIHBwVnRibCI7Ci0JCWlmIChhcmdUeXBlcy5sZW5ndGggPiAwKQotCQkJdnRibCArPSAiLCAiOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2dGJsICs9IGFyZ1R5cGVzW2ldICsgIiBhcmciICsgaTsKLQkJCWlmIChpIDwgYXJnVHlwZXMubGVuZ3RoIC0gMSkKLQkJCQl2dGJsICs9ICIsICI7Ci0JCX0KLQkJdnRibCArPSAiKTsiOwotCQlJbnRlZ2VyIGtleSA9IG5ldyBJbnRlZ2VyKGFyZ1R5cGVzLmxlbmd0aCk7Ci0JCVZlY3RvciBsaXN0ID0gKFZlY3RvcikgdnRibHMuZ2V0KGtleSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCQl2dGJscy5wdXQoa2V5LCBsaXN0KTsKLQkJfQotCQlib29sZWFuIGR1cGxpY2F0ZSA9IGZhbHNlOwotCQlFbnVtZXJhdGlvbiBlID0gbGlzdC5lbGVtZW50cygpOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAodnRibC5lcXVhbHMocykpIHsKLQkJCQlkdXBsaWNhdGUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghZHVwbGljYXRlKQotCQkJbGlzdC5hZGQodnRibCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb3V0cHV0VnRibENhbGwoKSB7Ci0JCUVudW1lcmF0aW9uIGUgPSB2dGJscy5rZXlzKCk7Ci0JCWludCBuID0gMDsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWUubmV4dEVsZW1lbnQoKTsKLQkJCW4rKzsKLQkJfQotCQlJbnRlZ2VyW10ga2V5cyA9IG5ldyBJbnRlZ2VyW25dOwotCQllID0gdnRibHMua2V5cygpOwotCQluID0gMDsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWtleXNbbl0gPSAoSW50ZWdlcikgZS5uZXh0RWxlbWVudCgpOwotCQkJbisrOwotCQl9Ci0JCUFycmF5cy5zb3J0KGtleXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCVZlY3RvciBsaXN0ID0gKFZlY3RvcikgdnRibHMuZ2V0KGtleXNbaV0pOwotCQkJT2JqZWN0W10gZWx0cyA9IChPYmplY3RbXSkgbGlzdC50b0FycmF5KCk7Ci0JCQlBcnJheXMuc29ydChlbHRzKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWx0cy5sZW5ndGg7IGorKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlbHRzW2pdKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqIFBhcnNpbmcgaW52b2tpbmcgd3JpdGUgY2FsbGJhY2tzICovCi0KLQkvKgotCSAqIENvbnZlcnQgYSBDIGhlYWRlciBmaWxlIGludG8gYSBKYXZhIHNvdXJjZSBmaWxlIG1hdGNoaW5nIFNXVCBNb3ppbGxhCi0JIGJpbmRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHNyYywgU3RyaW5nIGRlc3RQYXRoKSB7Ci0JCWlmIChERUJVRykgd3JpdGVMaW5lKCIqKiogUEFSU0lORyA8IitzcmMrIj4gdG8gZm9sZGVyICIrZGVzdFBhdGgpOwotCQliID0gbmV3IFN0cmluZ1ttYXhMaW5lc107Ci0JCWNudExpbmVzID0gMDsKLQkJdHJ5IHsKLQkJCXIgPSBuZXcgRmlsZVJlYWRlcihzcmMpOwotCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocik7Ci0JCQl3aGlsZSAoKGJbY250TGluZXNdID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCWNudExpbmVzKys7Ci0JCQl9Ci0JCQlici5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCW4gPSAwOwotCQlib29sZWFuIGxvb2tGb3JDbGFzc2VzID0gdHJ1ZTsKLQkJd2hpbGUgKGxvb2tGb3JDbGFzc2VzKSB7CQotCQkJLyogcGFyc2luZyAqLwotCQkJbG9va0ZvckNsYXNzZXMgPSBwYXJzZSgpOwotCQotCQkJU3RyaW5nIGRlc3RGaWxlID0gZGVzdFBhdGggKyBjbGFzc05hbWUgKyAiLmphdmEiOwotCQkJdHJ5IHsKLQkJCQl3ID0gbmV3IEZpbGVXcml0ZXIoZGVzdEZpbGUpOwotCQkJCWlmIChERUJVRykgd3JpdGVMaW5lKCIqKiBDUkVBVEVEIEpBVkEgRklMRSA8IitkZXN0RmlsZSsiPiIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQotCQkJLyogd3JpdGluZyAqLwotCQkJd3JpdGVDb3B5cmlnaHRzKCk7Ci0JCQl3cml0ZVBhY2thZ2VEZWNsYXJhdGlvbigpOwotCQkJd3JpdGVMaW5lKCk7Ci0JCQl3cml0ZUNsYXNzRGVjbGFyYXRpb24oY2xhc3NOYW1lLCBwYXJlbnROYW1lKTsKLQkJCXdyaXRlTGluZSgpOwotCQkJd3JpdGVMYXN0TWV0aG9kSWQocGFyZW50TmFtZSwgbk1ldGhvZHMpOwotCQkJd3JpdGVMaW5lKCk7Ci0JCQl3cml0ZUlJRCh1dWlkTmFtZSwgdXVpZFZhbHVlKTsKLQkJCXdyaXRlTGluZSgpOwotCQkJaWYgKHBhcmVudE5hbWUuZXF1YWxzKE5PX1NVUEVSX0NMQVNTKSkgewotCQkJCXdyaXRlQWRkcmVzc0ZpZWxkKCk7Ci0JCQkJd3JpdGVMaW5lKCk7Ci0JCQl9Ci0JCQl3cml0ZUNvbnN0cnVjdG9yKGNsYXNzTmFtZSwgcGFyZW50TmFtZSk7Ci0JCQl3cml0ZUxpbmUoKTsKLQkJCQotCQkJaWYgKHBhcmVudE5hbWUuZXF1YWxzKE5PX1NVUEVSX0NMQVNTKSkgewotCQkJCXdyaXRlQWRkcmVzc0dldHRlcigpOwotCQkJCXdyaXRlTGluZSgpOwotCQkJfQotCQotCQkJaW50IGNvbnN0YW50SW5kZXggPSAwLCBtZXRob2RJbmRleCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJvZHlPcmRlci5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaWYgKGJvZHlPcmRlci5jaGFyQXQoaSkgPT0gJ0MnKSB7Ci0JCQkJCXdyaXRlQ29uc3RhbnQoY29uc3RhbnROYW1lc1tjb25zdGFudEluZGV4XSwKLQkJCQkJCQljb25zdGFudFZhbHVlc1tjb25zdGFudEluZGV4XSk7Ci0JCQkJCWlmIChpIDwgYm9keU9yZGVyLmxlbmd0aCgpIC0gMSkgd3JpdGVMaW5lKCk7Ci0JCQkJCWNvbnN0YW50SW5kZXgrKzsKLQkJCQl9IGVsc2UgaWYgKGJvZHlPcmRlci5jaGFyQXQoaSkgPT0gJ00nKSB7Ci0JCQkJCXdyaXRlTWV0aG9kKG1ldGhvZE5hbWVzW21ldGhvZEluZGV4XSwgcGFyZW50TmFtZSwgbWV0aG9kSW5kZXgsCi0JCQkJCQkJYXJnVHlwZXNbbWV0aG9kSW5kZXhdLCBhcmdOYW1lc1ttZXRob2RJbmRleF0pOwotCQkJCQlpZiAoaSA8IGJvZHlPcmRlci5sZW5ndGgoKSAtIDEpIHdyaXRlTGluZSgpOwotCQkJCQltZXRob2RJbmRleCsrOwotCQkJCX0KLQkJCX0KLQkKLQkJCXdyaXRlQ2xhc3NFbmQoKTsKLQkKLQkJCXRyeSB7Ci0JCQkJdy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VzKCkgewotCQlyZXR1cm4gInBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGE7IjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwYXJzZSgpIHsKLQkJaWYgKCFqdW1wVG9VdWlkRGVjbGFyYXRpb24oKSkgcmV0dXJuIGZhbHNlOwotCQl1dWlkTmFtZSA9IGdldFV1aWROYW1lKGJbbl0pOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVVSUQgbmFtZTogPCIgKyB1dWlkTmFtZSArICI+Iik7Ci0JCXV1aWRWYWx1ZSA9IGdldFV1aWRWYWx1ZShiW25dKTsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVVUlEIHZhbHVlOiA8IiArIHV1aWRWYWx1ZSArICI+Iik7Ci0JCWp1bXBUb0ludGVyZmFjZURlY2xhcmF0aW9uKCk7Ci0JCWNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShiW25dKTsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2UgbmFtZTogPCIgKyBjbGFzc05hbWUgKyAiPiIpOwotCQlwYXJlbnROYW1lID0gZ2V0UGFyZW50TmFtZShiW25dKTsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnROYW1lOiA8IiArIHBhcmVudE5hbWUgKyAiPiIpOwotCQlwYXJzZUJvZHkoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JYm9vbGVhbiBqdW1wVG9VdWlkRGVjbGFyYXRpb24oKSB7Ci0JCS8vIGp1bXAgdG8gbGluZSBtYXRjaGluZzogIiNkZWZpbmUgTlNfSVdFQkJST1dTRVJDSFJPTUVfSUlEX1NUUiAiYmE0MzRjNjAtOWQ1Mi0xMWQzLWFmYjAtMDBhMDI0ZmZjMDhjIiIKLQkJd2hpbGUgKCEoYltuXS5zdGFydHNXaXRoKCIjZGVmaW5lICIpICYmIGJbbl0uaW5kZXhPZigiX0lJRF9TVFIgXCIiKSAhPSAtMSkpIHsKLQkJCW4rKzsKLQkJCWlmIChuID49IGNudExpbmVzKSByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy9hc3N1bWUgYSBkZWNsYXJhdGlvbiBtYXRjaGluZzogIiNkZWZpbmUgTlNfSVdFQkJST1dTRVJDSFJPTUVfSUlEX1NUUiAiYmE0MzRjNjAtOWQ1Mi0xMWQzLWFmYjAtMDBhMDI0ZmZjMDhjIiIKLQkvL3JldHVybnMgTlNfSVdFQkJST1dTRVJDSFJPTUVfSUlEX1NUUgotCVN0cmluZyBnZXRVdWlkTmFtZShTdHJpbmcgZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLnN1YnN0cmluZyhkZWNsYXJhdGlvbi5pbmRleE9mKCIjZGVmaW5lICIpCi0JCQkJKyAiI2RlZmluZSAiLmxlbmd0aCgpLCBkZWNsYXJhdGlvbi5pbmRleE9mKCIgXCIiKSk7Ci0JfQotCi0JLy9hc3N1bWUgYSBkZWNsYXJhdGlvbiBtYXRjaGluZzogIiNkZWZpbmUgTlNfSVdFQkJST1dTRVJDSFJPTUVfSUlEX1NUUiAiYmE0MzRjNjAtOWQ1Mi0xMWQzLWFmYjAtMDBhMDI0ZmZjMDhjIiIKLQkvL3JldHVybnMgYmE0MzRjNjAtOWQ1Mi0xMWQzLWFmYjAtMDBhMDI0ZmZjMDhjCi0JU3RyaW5nIGdldFV1aWRWYWx1ZShTdHJpbmcgZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLnN1YnN0cmluZyhkZWNsYXJhdGlvbi5pbmRleE9mKCJfSUlEX1NUUiBcIiIpCi0JCQkJKyAiX0lJRF9TVFIgXCIiLmxlbmd0aCgpLCBkZWNsYXJhdGlvbi5sYXN0SW5kZXhPZignIicpKTsKLQl9Ci0KLQl2b2lkIGp1bXBUb0ludGVyZmFjZURlY2xhcmF0aW9uKCkgewotCQkvLyBqdW1wIHRvIGxpbmUgbWF0Y2hpbmc6ICJjbGFzcyBOU19OT19WVEFCTEUgbnNJV2ViQnJvd3NlckNocm9tZSA6IHB1YmxpYyBuc0lTdXBwb3J0cyB7IgotCQl3aGlsZSAoIShiW25dLnN0YXJ0c1dpdGgoImNsYXNzIE5TX05PX1ZUQUJMRSAiKSkpIHsKLQkJCW4rKzsKLQkJfQotCX0KLQotCS8vIEFzc3VtZSBhIGRlY2xhcmF0aW9uIG1hdGNoaW5nOiAiY2xhc3MgTlNfTk9fVlRBQkxFIG5zSVdlYkJyb3dzZXJDaHJvbWUgOiBwdWJsaWMgbnNJU3VwcG9ydHMgeyIKLQkvLyBvciAiY2xhc3MgTlNfTk9fVlRBQkxFIE5TX1NDUklQVEFCTEUgbnNJV2ViQnJvd3NlckNocm9tZSA6IHB1YmxpYyBuc0lTdXBwb3J0cyB7IiByZXR1cm5zIG5zSVdlYkJyb3dzZXJDaHJvbWUuCi0JLy8gU3BlY2lhbCBjYXNlIGZvciBuc0lTdXBwb3J0cyB0aGF0IGhhcyBubyBzdXBlciBjbGFzczogY2xhc3MgTlNfTk9fVlRBQkxFIG5zSVN1cHBvcnRzIHsKLQlTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBkZWNsYXJhdGlvbikgewotCQlpbnQgZW5kSW5kZXggPSBkZWNsYXJhdGlvbi5pbmRleE9mKCIgOiIpOwotCQkvLyBuc0lTdXBwb3J0cyBzcGVjaWFsIGNhc2UgKG5vIHN1cGVyIGNsYXNzKQotCQlpZiAoZW5kSW5kZXggPT0gLTEpIGVuZEluZGV4ID0gZGVjbGFyYXRpb24uaW5kZXhPZigiIHsiKTsKLQkJU3RyaW5nIHNlYXJjaFN0cmluZyA9ICJjbGFzcyBOU19OT19WVEFCTEUgTlNfU0NSSVBUQUJMRSI7Ci0JCWludCBzdGFydEluZGV4ID0gZGVjbGFyYXRpb24uaW5kZXhPZihzZWFyY2hTdHJpbmcpOwotCQlpZiAoc3RhcnRJbmRleCA9PSAtMSkgewotCQkJc2VhcmNoU3RyaW5nID0gImNsYXNzIE5TX05PX1ZUQUJMRSAiOwotCQkJc3RhcnRJbmRleCA9IGRlY2xhcmF0aW9uLmluZGV4T2Yoc2VhcmNoU3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gZGVjbGFyYXRpb24uc3Vic3RyaW5nKHN0YXJ0SW5kZXggKyBzZWFyY2hTdHJpbmcubGVuZ3RoKCksIGVuZEluZGV4KTsKLQl9Ci0KLQkvLyBhc3N1bWUgYSBkZWNsYXJhdGlvbiBtYXRjaGluZzogImNsYXNzIE5TX05PX1ZUQUJMRSBuc0lXZWJCcm93c2VyQ2hyb21lIDogcHVibGljIG5zSVN1cHBvcnRzIHsiCi0JLy8gcmV0dXJucyBuc0lTdXBwb3J0cwotCS8vIHNwZWNpYWwgY2FzZSBmb3IgbnNJU3VwcG9ydHMgdGhhdCBoYXMgbm8gc3VwZXIgY2xhc3M6IGNsYXNzIE5TX05PX1ZUQUJMRSBuc0lTdXBwb3J0cyB7Ci0JU3RyaW5nIGdldFBhcmVudE5hbWUoU3RyaW5nIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChkZWNsYXJhdGlvbi5pbmRleE9mKCIgOiIpID09IC0xKSByZXR1cm4gTk9fU1VQRVJfQ0xBU1M7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5zdWJzdHJpbmcoZGVjbGFyYXRpb24uaW5kZXhPZigiOiBwdWJsaWMgIikKLQkJCQkrICI6IHB1YmxpYyAiLmxlbmd0aCgpLCBkZWNsYXJhdGlvbi5pbmRleE9mKCIgeyIpKTsKLQl9Ci0KLQkvLyBwYXJzZSBtZXRob2RzIGFuZCBjb25zdGFudHMgZGVjbGFyYXRpb25zIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGluZGV4Ci0JLy8gb3V0OgotCS8vIC5TdHJpbmcgYm9keSAtIGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nIGphdmEgY29udGVudAotCS8vIC5uIC0gc2V0IHRvIHRoZSBlbmQgb2YgdGhlIGludGVyZmFjZSBib2R5IGRlY2xhcmF0aW9uICggbGluZSB3aXRoIHRoZSBlbmNsb3NpbmcgIn07IiApCi0JLy8gLm5NZXRob2RzICAgIC0gc2V0IHRvIHRoZSBudW1iZXIgb2YgbWV0aG9kcyBwYXJzZWQKLQl2b2lkIHBhcnNlQm9keSgpIHsKLQkJYm9keSA9ICIiOwotCQlib2R5T3JkZXIgPSAiIjsKLQkJaW50IG5Db25zdGFudHMgPSAwOwotCQluTWV0aG9kcyA9IDA7Ci0KLQkJaW50IHRtcF9uID0gbjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWludCB0eXBlID0ganVtcFRvTmV4dENvbnN0YW50T3JNZXRob2QoKTsKLQkJCWlmICh0eXBlID09IENPTlNUQU5UKQotCQkJCW5Db25zdGFudHMrKzsKLQkJCWlmICh0eXBlID09IE1FVEhPRCkKLQkJCQluTWV0aG9kcysrOwotCQkJaWYgKHR5cGUgPT0gRU5EX0JPRFkpCi0JCQkJYnJlYWs7Ci0JCQluKys7Ci0JCX0KLQkJbiA9IHRtcF9uOwotCQljb25zdGFudE5hbWVzID0gbmV3IFN0cmluZ1tuQ29uc3RhbnRzXTsKLQkJY29uc3RhbnRWYWx1ZXMgPSBuZXcgU3RyaW5nW25Db25zdGFudHNdOwotCQltZXRob2ROYW1lcyA9IG5ldyBTdHJpbmdbbk1ldGhvZHNdOwotCQlhcmdUeXBlcyA9IG5ldyBTdHJpbmdbbk1ldGhvZHNdW107Ci0JCWFyZ05hbWVzID0gbmV3IFN0cmluZ1tuTWV0aG9kc11bXTsKLQkJaW50IGNvbnN0YW50SW5kZXggPSAwLCBtZXRob2RJbmRleCA9IDA7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpbnQgdHlwZSA9IGp1bXBUb05leHRDb25zdGFudE9yTWV0aG9kKCk7Ci0JCQlpZiAodHlwZSA9PSBDT05TVEFOVCkgewotCQkJCXBhcnNlQ29uc3RhbnQoYltuXSwgY29uc3RhbnRJbmRleCk7Ci0JCQkJYm9keU9yZGVyICs9ICJDIjsKLQkJCQljb25zdGFudEluZGV4Kys7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBNRVRIT0QpIHsKLQkJCQlwYXJzZU1ldGhvZChiW25dLCBtZXRob2RJbmRleCk7Ci0JCQkJbG9nVnRibENhbGwoYXJnVHlwZXNbbWV0aG9kSW5kZXhdKTsKLQkJCQlib2R5T3JkZXIgKz0gIk0iOwotCQkJCW1ldGhvZEluZGV4Kys7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBFTkRfQk9EWSkKLQkJCQlyZXR1cm47Ci0JCQluKys7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgaW50IENPTlNUQU5UID0gMDsKLQotCXN0YXRpYyBpbnQgTUVUSE9EID0gMTsKLQotCXN0YXRpYyBpbnQgRU5EX0JPRFkgPSAyOwotCi0JYm9vbGVhbiBpc0VuZE9mSW50ZXJmYWNlQm9keSgpIHsKLQkJcmV0dXJuIGJbbl0uc3RhcnRzV2l0aCgifTsiKTsKLQl9Ci0KLQlpbnQganVtcFRvTmV4dENvbnN0YW50T3JNZXRob2QoKSB7Ci0JCXdoaWxlICghaXNFbmRPZkludGVyZmFjZUJvZHkoKSkgewotCQkJaWYgKGJbbl0uc3RhcnRzV2l0aCgiICBlbnVtIHsgIikpIHsKLQkJCQlyZXR1cm4gQ09OU1RBTlQ7Ci0JCQl9Ci0JCQlpZiAobWV0aG9kTmFtZVN0YXJ0SW5kZXhPZihiW25dKSAhPSAtMSkgewotCQkJCXJldHVybiBNRVRIT0Q7Ci0JCQl9Ci0JCQluKys7Ci0JCX0KLQkJcmV0dXJuIEVORF9CT0RZOwotCX0KLQotCXZvaWQgcGFyc2VDb25zdGFudChTdHJpbmcgY29uc3RhbnQsIGludCBjb25zdGFudEluZGV4KSB7Ci0JCVN0cmluZyBjb25zdGFudE5hbWUgPSBjb25zdGFudC5zdWJzdHJpbmcoY29uc3RhbnQuaW5kZXhPZigiIGVudW0geyAiKQotCQkJCSsgIiBlbnVtIHsgIi5sZW5ndGgoKSwgY29uc3RhbnQuaW5kZXhPZigiID0iKSk7Ci0JCWlmIChERUJVRykKLQkJCXdyaXRlTGluZSgiY29uc3RhbnROYW1lIDwiICsgY29uc3RhbnROYW1lICsgIj4iKTsKLQkJY29uc3RhbnROYW1lc1tjb25zdGFudEluZGV4XSA9IGNvbnN0YW50TmFtZTsKLQkJCi0JCS8vIG1vc3QgY29uc3RhbnRzIHZhbHVlcyBoYXZlIGEgdHJhaWxpbmcgVQotCQkvLyBlbnVtIHsgQVBQX1RZUEVfVU5LTk9XTiA9IDBVIH07Ci0JCWludCBlbmRJbmRleCA9IGNvbnN0YW50LmluZGV4T2YoIlUgfTsiKTsKLQkJLy8gYSBmZXcgb3RoZXJzIGRvbid0Ci0JCS8vIGVudW0geyBFTlVNRVJBVEVfRk9SV0FSRFMgPSAwIH07CQkKLQkJaWYgKGVuZEluZGV4ID09IC0xKSBlbmRJbmRleCA9IGNvbnN0YW50LmluZGV4T2YoIiB9OyIpOwotCQlTdHJpbmcgY29uc3RhbnRWYWx1ZSA9IGNvbnN0YW50LnN1YnN0cmluZyhjb25zdGFudC5pbmRleE9mKCIgPSAiKQotCQkJCSsgIiA9ICIubGVuZ3RoKCksIGVuZEluZGV4KTsKLQkJaWYgKERFQlVHKQotCQkJd3JpdGVMaW5lKCJjb25zdGFudFZhbHVlIDwiICsgY29uc3RhbnRWYWx1ZSArICI+Iik7Ci0JCWNvbnN0YW50VmFsdWVzW2NvbnN0YW50SW5kZXhdID0gY29uc3RhbnRWYWx1ZTsKLQl9Ci0KLQkvLyBOU19JTUVUSE9EIFNldFN0YXR1cyhQUlVpbnQzMiBzdGF0dXNUeXBlLCBjb25zdCBQUlVuaWNoYXIgKnN0YXR1cykgPSAwOwotCS8vIGlkZW50aWZ5OgotCS8vIG1ldGhvZCBuYW1lOiA8U2V0U3RhdHVzPgotCS8vIE5iciBvZiBhcmd1bWVudHM6IDIKLQkvLyBUeXBlIG9mIGFyZ3VtZW50IDA6IFBSVWludDMyCi0JLy8gTmFtZSBvZiBhcmd1bWVudCAwOiBzdGF0dXNUeXBlCi0JLy8gVHlwZSBvZiBhcmd1bWVudCAxOiBjb25zdCBQUlVuaWNoYXIgKgotCS8vIE5hbWUgb2YgYXJndW1lbnQgMTogc3RhdHVzCi0Jdm9pZCBwYXJzZU1ldGhvZChTdHJpbmcgbGluZSwgaW50IG1ldGhvZEluZGV4KSB7Ci0JCWludCBzdGFydCA9IG1ldGhvZE5hbWVTdGFydEluZGV4T2YobGluZSk7Ci0JCWludCBlbmQgPSBtZXRob2ROYW1lRW5kSW5kZXhPZihsaW5lKTsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBsaW5lLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJaWYgKERFQlVHKQotCQkJd3JpdGVMaW5lKCJtZXRob2QgbmFtZTogPCIgKyBtZXRob2ROYW1lICsgIj4iKTsKLQkJbWV0aG9kTmFtZXNbbWV0aG9kSW5kZXhdID0gbWV0aG9kTmFtZTsKLQkJaW50IGFyZ1N0YXJ0ID0gZW5kKyIoIi5sZW5ndGgoKTsKLQkJaW50IGFyZ0VuZCA9IGxpbmUuaW5kZXhPZigiKSIsIGFyZ1N0YXJ0KTsKLQkJcGFyc2VBcmdzKGxpbmUuc3Vic3RyaW5nKGFyZ1N0YXJ0LCBhcmdFbmQpLCBtZXRob2RJbmRleCk7Ci0JfQotCi0JLy8gR2l2ZW4gYSBsaW5lLCByZXR1cm5zIHRoZSBzdGFydCBvZiB0aGUgbWV0aG9kIG5hbWUgb3IgLTEKLQkvLyBpZiB0aGUgbGluZSBkb2VzIG5vdCBjb250YWluIGEgbWV0aG9kIGRlY2xhcmF0aW9uLgotCWludCBtZXRob2ROYW1lU3RhcnRJbmRleE9mKFN0cmluZyBsaW5lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgQkVGT1JFX01FVEhPRF9OQU1FLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoQkVGT1JFX01FVEhPRF9OQU1FW2ldKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgcmV0dXJuIGluZGV4ICsgQkVGT1JFX01FVEhPRF9OQU1FW2ldLmxlbmd0aCgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JaW50IG1ldGhvZE5hbWVFbmRJbmRleE9mKFN0cmluZyBsaW5lKSB7Ci0JCWludCBzdGFydEluZGV4ID0gbWV0aG9kTmFtZVN0YXJ0SW5kZXhPZihsaW5lKTsKLQkJcmV0dXJuIGxpbmUuaW5kZXhPZigiKCIsIHN0YXJ0SW5kZXgpOwotCX0KLQl2b2lkIHBhcnNlQXJncyhTdHJpbmcgYXJncywgaW50IG1ldGhvZEluZGV4KSB7Ci0JCWludCBuQXJncyA9IC0xOwotCQkvLyBtZXRob2RzIHdpdGggbm8gYXJncyBsb29rIGxpa2U6ICgpIG9yICh2b2lkKQotCQlTdHJpbmdbXSBub0FyZ3MgPSBuZXcgU3RyaW5nW10geyAiIiwgInZvaWQiIH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJncy5lcXVhbHMobm9BcmdzW2ldKSkgewotCQkJCW5BcmdzID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobkFyZ3MgPT0gLTEpCi0JCQluQXJncyA9IGNvdW50KGFyZ3MsICIsICIpICsgMTsKLQkJU3RyaW5nW10gYXJnVHlwZXMgPSBuZXcgU3RyaW5nW25BcmdzXTsKLQkJdGhpcy5hcmdUeXBlc1ttZXRob2RJbmRleF0gPSBhcmdUeXBlczsKLQkJU3RyaW5nW10gYXJnTmFtZXMgPSBuZXcgU3RyaW5nW25BcmdzXTsKLQkJdGhpcy5hcmdOYW1lc1ttZXRob2RJbmRleF0gPSBhcmdOYW1lczsKLQkJaW50IHR5cGVTdGFydCA9IDA7Ci0KLQkJLy8gbmFtZSBpcyBzZXBhcmF0ZWQgZnJvbSBpdHMgdHlwZSBieSBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyAoc29ydGVkIGJ5IGRlY3JlYXNpbmcgc2l6ZSB0byBmaW5kIHRoZSBtb3N0IGNvbXBsZXRlIHBhdHRlcm4gKi8KLQkJU3RyaW5nW10gdHlwZU5hbWVTZXAgPSBuZXcgU3RyaW5nW10geyAiICogKiIsICIgKioiLCAiICogJiAiLCAiICogIiwgIiAqIiwKLQkJCQkiICYgIiwgIiAiIH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkFyZ3M7IGkrKykgewotCQkJLyogZ2V0IHRoZSB0eXBlICovCi0JCQlpbnQgbmV4dFR5cGVTdGFydCA9IGkgPCBuQXJncyAtIDEgPyBhcmdzLmluZGV4T2YoIiwgIiwgdHlwZVN0YXJ0KQotCQkJCQkrICIsICIubGVuZ3RoKCkgOiBhcmdzLmxlbmd0aCgpOwotCQkJaW50IHR5cGVOYW1lU2VwSW5kZXggPSAwOwotCQkJaW50IHNlcGFyYXRvckluZGV4ID0gMDsKLQkJCWZvciAoOyB0eXBlTmFtZVNlcEluZGV4IDwgdHlwZU5hbWVTZXAubGVuZ3RoOyB0eXBlTmFtZVNlcEluZGV4KyspIHsKLQkJCQlzZXBhcmF0b3JJbmRleCA9IGFyZ3MuaW5kZXhPZih0eXBlTmFtZVNlcFt0eXBlTmFtZVNlcEluZGV4XSwKLQkJCQkJCXR5cGVTdGFydCk7Ci0JCQkJaWYgKHNlcGFyYXRvckluZGV4ICE9IC0xICYmIHNlcGFyYXRvckluZGV4IDwgbmV4dFR5cGVTdGFydCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlTdHJpbmcgc2VwYXJhdG9yID0gdHlwZU5hbWVTZXBbdHlwZU5hbWVTZXBJbmRleF07Ci0JCQlhcmdUeXBlc1tpXSA9IGdldEMySmF2YVR5cGUoYXJncy5zdWJzdHJpbmcodHlwZVN0YXJ0LAotCQkJCQlzZXBhcmF0b3JJbmRleCArIHNlcGFyYXRvci5sZW5ndGgoKSkpOwotCQkJaWYgKERFQlVHKQotCQkJCXdyaXRlTGluZSgiYXJnIHR5cGUiICsgaSArICI6IDwiICsgYXJnVHlwZXNbaV0gKyAiPiIpOwotCQkJLyogZ2V0IHRoZSBuYW1lICovCi0JCQlpbnQgbmFtZVN0YXJ0ID0gc2VwYXJhdG9ySW5kZXggKyBzZXBhcmF0b3IubGVuZ3RoKCk7Ci0JCQlpbnQgbmFtZUVuZCA9IGkgPCBuQXJncyAtIDEgPyBhcmdzLmluZGV4T2YoIiwgIiwgbmFtZVN0YXJ0KSA6IGFyZ3MKLQkJCQkJLmxlbmd0aCgpOwotCQkJYXJnTmFtZXNbaV0gPSBhcmdzLnN1YnN0cmluZyhuYW1lU3RhcnQsIG5hbWVFbmQpOwotCQkJaWYgKERFQlVHKQotCQkJCXdyaXRlTGluZSgiYXJnIG5hbWUiICsgaSArICI6IDwiICsgYXJnTmFtZXNbaV0gKyAiPiIpOwotCi0JCQl0eXBlU3RhcnQgPSBuZXh0VHlwZVN0YXJ0OwotCQl9Ci0JfQotCi0JU3RyaW5nIGdldEMySmF2YVR5cGUoU3RyaW5nIGNUeXBlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVFlQRVNfQzJKQVZBLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY1R5cGUuaW5kZXhPZihUWVBFU19DMkpBVkFbaV1bMF0pICE9IC0xKQotCQkJCXJldHVybiBUWVBFU19DMkpBVkFbaV1bMV07Ci0JCX0KLQkJcmV0dXJuICIhRVJST1IgVU5LTk9XTiBDIFRZUEUgPCIgKyBjVHlwZSArICI+ISI7Ci0JfQotCi0JLy8gaG93IG1hbnkgdGltZXMgcGFydCBjYW4gYmUgZm91bmQgaW4gcwotCXN0YXRpYyBpbnQgY291bnQoU3RyaW5nIHMsIFN0cmluZyBwYXJ0KSB7Ci0JCWludCBpbmRleCA9IC0xLCBjbnQgPSAwOwotCQl3aGlsZSAoKGluZGV4ID0gcy5pbmRleE9mKHBhcnQsIGluZGV4ICsgMSkpICE9IC0xKQotCQkJY250Kys7Ci0JCXJldHVybiBjbnQ7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBDT1BZUklHSFRTID0KLQkJIi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKipcclxuIgotCQkrICIgKiBWZXJzaW9uOiBNUEwgMS4xXHJcbiIKLQkJKyAiICpcclxuIgotCQkrICIgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb25cclxuIgotCQkrICIgKiAxLjEgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxyXG4iCi0JCSsgIiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuIgotCQkrICIgKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9cclxuIgotCQkrICIgKlxyXG4iCi0JCSsgIiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcclxuIgotCQkrICIgKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2VcclxuIgotCQkrICIgKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZVxyXG4iCi0JCSsgIiAqIExpY2Vuc2UuXHJcbiIKLQkJKyAiICpcclxuIgotCQkrICIgKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZSwgcmVsZWFzZWQgTWFyY2ggMzEsIDE5OTguXHJcbiIKLQkJKyAiICpcclxuIgotCQkrICIgKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXNcclxuIgotCQkrICIgKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi5cclxuIgotCQkrICIgKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IE5ldHNjYXBlIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OVxyXG4iCi0JCSsgIiAqIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuIgotCQkrICIgKlxyXG4iIAotCQkrICIgKiBDb250cmlidXRvcihzKTpcclxuIiAKLQkJKyAiICpcclxuIiAKLQkJKyAiICogSUJNXHJcbiIKLQkJKyAiICogLSAgQmluZGluZyB0byBwZXJtaXQgaW50ZXJmYWNpbmcgYmV0d2VlbiBNb3ppbGxhIGFuZCBTV1RcclxuIgotCQkrICIgKiAtICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDkgSUJNIENvcnAuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4iCi0JCSsgIiAqXHJcbiIgKyAiICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8iOwotCi0Jc3RhdGljIFN0cmluZyBQQUNLQUdFX0RFQ0xBUkFUSU9OID0gInBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGE7IjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTmF0aXZlU3RhdHMvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL05hdGl2ZVN0YXRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9OYXRpdmVTdGF0cy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTmF0aXZlU3RhdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyNTczZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9OYXRpdmVTdGF0cy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTmF0aXZlU3RhdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotLyoqCi0gKiBJbnN0cnVjdGlvbnMgb24gaG93IHRvIHVzZSB0aGUgTmF0aXZlU3RhdHMgdG9vbCB3aXRoIGEgc3RhbmRsYW9uZSBTV1QgZXhhbXBsZToKLSAqIAotICogMSkgQ29tcGlsZSB0aGUgU1dUIG5hdGl2ZSBsaWJyYXJpZXMgZGVmaW5pbmcgdGhlIE5BVElWRV9TVEFUUyBmbGFnIChpLmUuIHVuY29tbWVudCBsaW5lIGluIG1ha2VmaWxlKS4KLSAqIDIpIEFkZCB0aGUgZm9sbG93aW5nIGNvZGUgYXJvdW5kIHRoZSBzZWN0aW9ucyBvZiBpbnRlcmVzdCB0byBkdW1wIHRoZQotICogbmF0aXZlIGNhbGxzIGRvbmUgaW4gdGhhdCBzZWN0aW9uLgotICogCi0gKiAJCU5hdGl2ZVN0YXRzIHN0YXRzID0gbmV3IE5hdGl2ZVN0YXRzKCk7Ci0gKiAJCS4uLgotICogCQk8Y29kZSBzZWN0aW9uPgotICogCQkuLi4KLSAqIAkJc3RhdHMuZHVtcERpZmYoU3lzdGVtLm91dCk7Ci0gKiAKLSAqIDMpIE9yIGFkZCB0aGUgZm9sbG93aW5nIGNvZGUgYXQgYSBnaXZlbiBwb2ludCB0byBkdW1wIGEgc25hcHNob3Qgb2YKLSAqIHRoZSBuYXRpdmUgY2FsbHMgZG9uZSB1bnRpbCB0aGF0IHBvaW50LgotICogCi0gKiAJCW5ldyBOYXRpdmVTdGF0cygpLmR1bXBTbmFwc2hvdChTeXN0ZW0ub3V0KTsgCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXRpdmVTdGF0cyB7Ci0JCi0JSGFzaHRhYmxlIHNuYXBzaG90OwotCQotCWZpbmFsIHN0YXRpYyBTdHJpbmdbXSBjbGFzc2VzID0gbmV3IFN0cmluZ1tdeyJPUyIsICJBVEsiLCAiQ0RFIiwgIkdOT01FIiwgIkdUSyIsICJYUENPTSIsICJDT00iLCAiQUdMIiwgIkdkaXAiLCAiR0xYIiwgIkNhaXJvIiwgIldHTCJ9OwotCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOYXRpdmVGdW5jdGlvbiBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCQlTdHJpbmcgbmFtZTsKLQkJaW50IGNhbGxDb3VudDsKLQkJCi0JcHVibGljIE5hdGl2ZUZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgY2FsbENvdW50KSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuY2FsbENvdW50ID0gY2FsbENvdW50OwotCX0KLQotCXZvaWQgc3VidHJhY3QoTmF0aXZlRnVuY3Rpb24gZnVuYykgewotCQl0aGlzLmNhbGxDb3VudCAtPSBmdW5jLmNhbGxDb3VudDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENhbGxDb3VudCgpIHsKLQkJcmV0dXJuIGNhbGxDb3VudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgZnVuYykgewotCQlyZXR1cm4gKChOYXRpdmVGdW5jdGlvbilmdW5jKS5jYWxsQ291bnQgLSBjYWxsQ291bnQ7Ci0JfQotCX0KLQkKLXB1YmxpYyBOYXRpdmVTdGF0cygpIHsKLQlzbmFwc2hvdCA9IHNuYXBzaG90KCk7Ci19Ci0JCi1wdWJsaWMgSGFzaHRhYmxlIGRpZmYoKSB7Ci0JSGFzaHRhYmxlIG5ld1NuYXBzaG90ID0gc25hcHNob3QoKTsKLQlFbnVtZXJhdGlvbiBrZXlzID0gbmV3U25hcHNob3Qua2V5cygpOwotCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLQkJTmF0aXZlRnVuY3Rpb25bXSBuZXdGdW5jcyA9IChOYXRpdmVGdW5jdGlvbltdKW5ld1NuYXBzaG90LmdldChjbGFzc05hbWUpOwotCQlOYXRpdmVGdW5jdGlvbltdIGZ1bmNzID0gKE5hdGl2ZUZ1bmN0aW9uW10pc25hcHNob3QuZ2V0KGNsYXNzTmFtZSk7Ci0JCWlmIChmdW5jcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0Z1bmNzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbmV3RnVuY3NbaV0uc3VidHJhY3QoZnVuY3NbaV0pOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBuZXdTbmFwc2hvdDsKLX0KLQotcHVibGljIHZvaWQgZHVtcERpZmYoUHJpbnRTdHJlYW0gcHMpIHsKLQlkdW1wKGRpZmYoKSwgcHMpOwotfQotCi1wdWJsaWMgdm9pZCBkdW1wU25hcHNob3QoUHJpbnRTdHJlYW0gcHMpIHsKLQlkdW1wKHNuYXBzaG90KCksIHBzKTsKLX0KLQotcHVibGljIHZvaWQgZHVtcFNuYXBzaG90KFN0cmluZyBjbGFzc05hbWUsIFByaW50U3RyZWFtIHBzKSB7Ci0JSGFzaHRhYmxlIHNuYXBzaG90ID0gbmV3IEhhc2h0YWJsZSgpOwotCXNuYXBzaG90KGNsYXNzTmFtZSwgc25hcHNob3QpOwotCWR1bXAoY2xhc3NOYW1lLCAoTmF0aXZlRnVuY3Rpb25bXSlzbmFwc2hvdC5nZXQoY2xhc3NOYW1lKSwgcHMpOwotfQotCi1wdWJsaWMgdm9pZCBkdW1wKEhhc2h0YWJsZSBzbmFwc2hvdCwgUHJpbnRTdHJlYW0gcHMpIHsKLQlFbnVtZXJhdGlvbiBrZXlzID0gc25hcHNob3Qua2V5cygpOwotCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLQkJZHVtcChjbGFzc05hbWUsIChOYXRpdmVGdW5jdGlvbltdKXNuYXBzaG90LmdldChjbGFzc05hbWUpLCBwcyk7Ci0JfQotfQotCQotdm9pZCBkdW1wKFN0cmluZyBjbGFzc05hbWUsIE5hdGl2ZUZ1bmN0aW9uW10gZnVuY3MsIFByaW50U3RyZWFtIHBzKSB7Ci0JaWYgKGZ1bmNzID09IG51bGwpIHJldHVybjsKLQlBcnJheXMuc29ydChmdW5jcyk7Ci0JaW50IHRvdGFsID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bmNzLmxlbmd0aDsgaSsrKSB7Ci0JCU5hdGl2ZUZ1bmN0aW9uIGZ1bmMgPSBmdW5jc1tpXTsKLQkJdG90YWwgKz0gZnVuYy5nZXRDYWxsQ291bnQoKTsKLQl9Ci0JcHMucHJpbnQoY2xhc3NOYW1lKTsKLQlwcy5wcmludCgiPSIpOwotCXBzLnByaW50KHRvdGFsKTsKLQlwcy5wcmludGxuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmdW5jcy5sZW5ndGg7IGkrKykgewotCQlOYXRpdmVGdW5jdGlvbiBmdW5jID0gZnVuY3NbaV07Ci0JCWlmIChmdW5jLmdldENhbGxDb3VudCgpID4gMCkgewotCQkJcHMucHJpbnQoIlx0Iik7Ci0JCQlwcy5wcmludChmdW5jLmdldE5hbWUoKSk7Ci0JCQlwcy5wcmludCgiPSIpOwotCQkJcHMucHJpbnQoZnVuYy5nZXRDYWxsQ291bnQoKSk7Ci0JCQlwcy5wcmludGxuKCk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCXNuYXBzaG90ID0gc25hcHNob3QoKTsgCi19Ci0KLXB1YmxpYyBIYXNodGFibGUgc25hcHNob3QoKSB7Ci0JSGFzaHRhYmxlIHNuYXBzaG90ID0gbmV3IEhhc2h0YWJsZSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3Nlc1tpXTsKLQkJc25hcHNob3QoY2xhc3NOYW1lLCBzbmFwc2hvdCk7Ci0JfQotCXJldHVybiBzbmFwc2hvdDsKLX0KLQotcHVibGljIEhhc2h0YWJsZSBzbmFwc2hvdChTdHJpbmcgY2xhc3NOYW1lLCBIYXNodGFibGUgc25hcHNob3QpIHsKLQl0cnkgewotCQlDbGFzcyBjbGF6eiA9IGdldENsYXNzKCk7Ci0JCU1ldGhvZCBmdW5jdGlvbkNvdW50ID0gY2xhenouZ2V0TWV0aG9kKGNsYXNzTmFtZSArICJfR2V0RnVuY3Rpb25Db3VudCIsIG5ldyBDbGFzc1swXSk7Ci0JCU1ldGhvZCBmdW5jdGlvbkNhbGxDb3VudCA9IGNsYXp6LmdldE1ldGhvZChjbGFzc05hbWUgKyAiX0dldEZ1bmN0aW9uQ2FsbENvdW50IiwgbmV3IENsYXNzW117aW50LmNsYXNzfSk7Ci0JCU1ldGhvZCBmdW5jdGlvbk5hbWUgPSBjbGF6ei5nZXRNZXRob2QoY2xhc3NOYW1lICsgIl9HZXRGdW5jdGlvbk5hbWUiLCBuZXcgQ2xhc3NbXXtpbnQuY2xhc3N9KTsKLQkJaW50IGNvdW50ID0gKChJbnRlZ2VyKWZ1bmN0aW9uQ291bnQuaW52b2tlKGNsYXp6LCBuZXcgT2JqZWN0WzBdKSkuaW50VmFsdWUoKTsKLQkJTmF0aXZlRnVuY3Rpb25bXSBmdW5jcyA9IG5ldyBOYXRpdmVGdW5jdGlvbltjb3VudF07Ci0JCU9iamVjdFtdIGluZGV4ID0gbmV3IE9iamVjdFsxXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbmRleFswXSA9IG5ldyBJbnRlZ2VyKGkpOwotCQkJaW50IGNhbGxDb3VudCA9ICgoSW50ZWdlcilmdW5jdGlvbkNhbGxDb3VudC5pbnZva2UoY2xhenosIGluZGV4KSkuaW50VmFsdWUoKTsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZylmdW5jdGlvbk5hbWUuaW52b2tlKGNsYXp6LCBpbmRleCk7Ci0JCQlmdW5jc1tpXSA9IG5ldyBOYXRpdmVGdW5jdGlvbihuYW1lLCBjYWxsQ291bnQpOwotCQl9Ci0JCXNuYXBzaG90LnB1dChjbGFzc05hbWUsIGZ1bmNzKTsKLQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotLy8JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLQlyZXR1cm4gc25hcHNob3Q7Ci19Ci0JCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgT1NfR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIE9TX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IE9TX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBBVEtfR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIEFUS19HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBBVEtfR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEFHTF9HZXRGdW5jdGlvbkNvdW50KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgQUdMX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEFHTF9HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQ0RFX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBDREVfR2V0RnVuY3Rpb25OYW1lKGludCBpbmRleCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQ0RFX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBHZGlwX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBHZGlwX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEdkaXBfR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEdMWF9HZXRGdW5jdGlvbkNvdW50KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgR0xYX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEdMWF9HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR05PTUVfR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIEdOT01FX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEdOT01FX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBHVEtfR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIEdUS19HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBHVEtfR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IFhQQ09NX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBYUENPTV9HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBYUENPTV9HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQ09NX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBDT01fR2V0RnVuY3Rpb25OYW1lKGludCBpbmRleCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQ09NX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBXR0xfR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIFdHTF9HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBXR0xfR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IENhaXJvX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBDYWlyb19HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDYWlyb19HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9TbGVhay9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU2xlYWsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL1NsZWFrL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TbGVhay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWZlNWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL1NsZWFrL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TbGVhay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBJbnN0cnVjdGlvbnMgb24gaG93IHRvIHVzZSB0aGUgU2xlYWsgdG9vbCB3aXRoIGEgc3RhbmRsYW9uZSBTV1QgZXhhbXBsZToKLSAqIAotICogTW9kaWZ5IHRoZSBtYWluIG1ldGhvZCBiZWxvdyB0byBsYXVuY2ggeW91ciBhcHBsaWNhdGlvbi4KLSAqIFJ1biBTbGVhay4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2xlYWsgewotCURpc3BsYXkgZGlzcGxheTsKLQlTaGVsbCBzaGVsbDsKLQlMaXN0IGxpc3Q7Ci0JQ2FudmFzIGNhbnZhczsKLQlCdXR0b24gc3RhcnQsIHN0b3AsIGNoZWNrOwotCVRleHQgdGV4dDsKLQlMYWJlbCBsYWJlbDsKLQkKLQlPYmplY3QgW10gb2xkT2JqZWN0cyA9IG5ldyBPYmplY3QgWzBdOwotCUVycm9yIFtdIG9sZEVycm9ycyA9IG5ldyBFcnJvciBbMF07Ci0JT2JqZWN0IFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0IFswXTsKLQlFcnJvciBbXSBlcnJvcnMgPSBuZXcgRXJyb3IgWzBdOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEZXZpY2VEYXRhIGRhdGEgPSBuZXcgRGV2aWNlRGF0YSgpOwotCWRhdGEudHJhY2tpbmcgPSB0cnVlOwotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5IChkYXRhKTsKLQlTbGVhayBzbGVhayA9IG5ldyBTbGVhayAoKTsKLQlzbGVhay5vcGVuICgpOwotCQotCS8vIExhdW5jaCB5b3VyIGFwcGxpY2F0aW9uIGhlcmUKLQkvLyBlLmcuCQkKLS8vCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotLy8JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0vLwlidXR0b24xLnNldEJvdW5kcygxMCwgMTAsIDEwMCwgNTApOwotLy8JYnV0dG9uMS5zZXRUZXh0KCJIZWxsbyBXb3JsZCIpOwotLy8JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMjAsIDIwKTsKLS8vCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotLy8JYnV0dG9uMi5zZXRCb3VuZHMoMTAsIDcwLCAxMDAsIDUwKTsKLS8vCWJ1dHRvbjIuc2V0SW1hZ2UoaW1hZ2UpOwotLy8Jc2hlbGwub3BlbigpOwotCQotCXdoaWxlICghc2xlYWsuc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIG9wZW4gKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQgKCk7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKCJTLUxlYWsiKTsKLQlsaXN0ID0gbmV3IExpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQlsaXN0LmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXJlZnJlc2hPYmplY3QgKCk7Ci0JCX0KLQl9KTsKLQl0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQljYW52YXMgPSBuZXcgQ2FudmFzIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JY2FudmFzLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcGFpbnRDYW52YXMgKGV2ZW50KTsKLQkJfQotCX0pOwotCWNoZWNrID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JY2hlY2suc2V0VGV4dCAoIlN0YWNrIik7Ci0JY2hlY2suYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQl0b2dnbGVTdGFja1RyYWNlICgpOwotCQl9Ci0JfSk7Ci0Jc3RhcnQgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCXN0YXJ0LnNldFRleHQgKCJTbmFwIik7Ci0Jc3RhcnQuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcmVmcmVzaEFsbCAoKTsKLQkJfQotCX0pOwotCXN0b3AgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCXN0b3Auc2V0VGV4dCAoIkRpZmYiKTsKLQlzdG9wLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXJlZnJlc2hEaWZmZXJlbmNlICgpOwotCQl9Ci0JfSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRUZXh0ICgiMCBvYmplY3QocykiKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWxheW91dCAoKTsKLQkJfQotCX0pOwotCWNoZWNrLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCXRleHQuc2V0VmlzaWJsZSAoZmFsc2UpOwotCVBvaW50IHNpemUgPSBzaGVsbC5nZXRTaXplICgpOwotCXNoZWxsLnNldFNpemUgKHNpemUueCAvIDIsIHNpemUueSAvIDIpOwotCXNoZWxsLm9wZW4gKCk7Ci19Ci0KLXZvaWQgcmVmcmVzaExhYmVsICgpIHsKLQlpbnQgY29sb3JzID0gMCwgY3Vyc29ycyA9IDAsIGZvbnRzID0gMCwgZ2NzID0gMCwgaW1hZ2VzID0gMDsKLQlpbnQgcGF0aHMgPSAwLCBwYXR0ZXJucyA9IDAsIHJlZ2lvbnMgPSAwLCB0ZXh0TGF5b3V0cyA9IDAsIHRyYW5zZm9ybXM9IDA7Ci0JZm9yIChpbnQgaT0wOyBpPG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJT2JqZWN0IG9iamVjdCA9IG9iamVjdHMgW2ldOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29sb3IpIGNvbG9ycysrOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ3Vyc29yKSBjdXJzb3JzKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBGb250KSBmb250cysrOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgR0MpIGdjcysrOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSW1hZ2UpIGltYWdlcysrOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUGF0aCkgcGF0aHMrKzsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhdHRlcm4pIHBhdHRlcm5zKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBSZWdpb24pIHJlZ2lvbnMrKzsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRleHRMYXlvdXQpIHRleHRMYXlvdXRzKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pIHRyYW5zZm9ybXMrKzsKLQl9Ci0JU3RyaW5nIHN0cmluZyA9ICIiOwotCWlmIChjb2xvcnMgIT0gMCkgc3RyaW5nICs9IGNvbG9ycyArICIgQ29sb3IocylcbiI7Ci0JaWYgKGN1cnNvcnMgIT0gMCkgc3RyaW5nICs9IGN1cnNvcnMgKyAiIEN1cnNvcihzKVxuIjsKLQlpZiAoZm9udHMgIT0gMCkgc3RyaW5nICs9IGZvbnRzICsgIiBGb250KHMpXG4iOwotCWlmIChnY3MgIT0gMCkgc3RyaW5nICs9IGdjcyArICIgR0MocylcbiI7Ci0JaWYgKGltYWdlcyAhPSAwKSBzdHJpbmcgKz0gaW1hZ2VzICsgIiBJbWFnZShzKVxuIjsKLQlpZiAocGF0aHMgIT0gMCkgc3RyaW5nICs9IHBhdGhzICsgIiBQYXRocyhzKVxuIjsKLQlpZiAocGF0dGVybnMgIT0gMCkgc3RyaW5nICs9IHBhdHRlcm5zICsgIiBQYXR0ZXJuKHMpXG4iOwotCWlmIChyZWdpb25zICE9IDApIHN0cmluZyArPSByZWdpb25zICsgIiBSZWdpb24ocylcbiI7Ci0JaWYgKHRleHRMYXlvdXRzICE9IDApIHN0cmluZyArPSB0ZXh0TGF5b3V0cyArICIgVGV4dExheW91dChzKVxuIjsKLQlpZiAodHJhbnNmb3JtcyAhPSAwKSBzdHJpbmcgKz0gdHJhbnNmb3JtcyArICIgVHJhbnNmb3JtKHMpXG4iOwotCWlmIChzdHJpbmcubGVuZ3RoICgpICE9IDApIHsKLQkJc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyAoMCwgc3RyaW5nLmxlbmd0aCAoKSAtIDEpOwotCX0KLQlsYWJlbC5zZXRUZXh0IChzdHJpbmcpOwotfQotCi12b2lkIHJlZnJlc2hEaWZmZXJlbmNlICgpIHsKLQlEZXZpY2VEYXRhIGluZm8gPSBkaXNwbGF5LmdldERldmljZURhdGEgKCk7Ci0JaWYgKCFpbmZvLnRyYWNraW5nKSB7Ci0JCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3ggKHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULk9LKTsKLQkJZGlhbG9nLnNldFRleHQgKHNoZWxsLmdldFRleHQgKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZSAoIldhcm5pbmc6IERldmljZSBpcyBub3QgdHJhY2tpbmcgcmVzb3VyY2UgYWxsb2NhdGlvbiIpOwotCQlkaWFsb2cub3BlbiAoKTsKLQl9Ci0JT2JqZWN0IFtdIG5ld09iamVjdHMgPSBpbmZvLm9iamVjdHM7Ci0JRXJyb3IgW10gbmV3RXJyb3JzID0gaW5mby5lcnJvcnM7Ci0JT2JqZWN0IFtdIGRpZmZPYmplY3RzID0gbmV3IE9iamVjdCBbbmV3T2JqZWN0cy5sZW5ndGhdOwotCUVycm9yIFtdIGRpZmZFcnJvcnMgPSBuZXcgRXJyb3IgW25ld0Vycm9ycy5sZW5ndGhdOwotCWludCBjb3VudCA9IDA7Ci0JZm9yIChpbnQgaT0wOyBpPG5ld09iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJd2hpbGUgKGluZGV4IDwgb2xkT2JqZWN0cy5sZW5ndGgpIHsKLQkJCWlmIChuZXdPYmplY3RzIFtpXSA9PSBvbGRPYmplY3RzIFtpbmRleF0pIGJyZWFrOwotCQkJaW5kZXgrKzsKLQkJfQotCQlpZiAoaW5kZXggPT0gb2xkT2JqZWN0cy5sZW5ndGgpIHsKLQkJCWRpZmZPYmplY3RzIFtjb3VudF0gPSBuZXdPYmplY3RzIFtpXTsKLQkJCWRpZmZFcnJvcnMgW2NvdW50XSA9IG5ld0Vycm9ycyBbaV07Ci0JCQljb3VudCsrOwotCQl9Ci0JfQotCW9iamVjdHMgPSBuZXcgT2JqZWN0IFtjb3VudF07Ci0JZXJyb3JzID0gbmV3IEVycm9yIFtjb3VudF07Ci0JU3lzdGVtLmFycmF5Y29weSAoZGlmZk9iamVjdHMsIDAsIG9iamVjdHMsIDAsIGNvdW50KTsKLQlTeXN0ZW0uYXJyYXljb3B5IChkaWZmRXJyb3JzLCAwLCBlcnJvcnMsIDAsIGNvdW50KTsKLQlsaXN0LnJlbW92ZUFsbCAoKTsKLQl0ZXh0LnNldFRleHQgKCIiKTsKLQljYW52YXMucmVkcmF3ICgpOwotCWZvciAoaW50IGk9MDsgaTxvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3QuYWRkIChvYmplY3RzIFtpXS50b1N0cmluZygpKTsKLQl9Ci0JcmVmcmVzaExhYmVsICgpOwotCWxheW91dCAoKTsKLX0KLQotdm9pZCB0b2dnbGVTdGFja1RyYWNlICgpIHsKLQlyZWZyZXNoT2JqZWN0ICgpOwotCWxheW91dCAoKTsKLX0KLQotdm9pZCBwYWludENhbnZhcyAoRXZlbnQgZXZlbnQpIHsKLQljYW52YXMuc2V0Q3Vyc29yIChudWxsKTsKLQlpbnQgaW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotCUdDIGdjID0gZXZlbnQuZ2M7Ci0JT2JqZWN0IG9iamVjdCA9IG9iamVjdHMgW2luZGV4XTsKLQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29sb3IpIHsKLQkJaWYgKCgoQ29sb3Ipb2JqZWN0KS5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCWdjLnNldEJhY2tncm91bmQgKChDb2xvcikgb2JqZWN0KTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSAoY2FudmFzLmdldENsaWVudEFyZWEoKSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIEN1cnNvcikgewotCQlpZiAoKChDdXJzb3Ipb2JqZWN0KS5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCWNhbnZhcy5zZXRDdXJzb3IgKChDdXJzb3IpIG9iamVjdCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZvbnQpIHsKLQkJaWYgKCgoRm9udClvYmplY3QpLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJZ2Muc2V0Rm9udCAoKEZvbnQpIG9iamVjdCk7Ci0JCUZvbnREYXRhIFtdIGFycmF5ID0gZ2MuZ2V0Rm9udCAoKS5nZXRGb250RGF0YSAoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQlTdHJpbmcgbGYgPSB0ZXh0LmdldExpbmVEZWxpbWl0ZXIgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxhcnJheS5sZW5ndGg7IGkrKykgewotCQkJRm9udERhdGEgZGF0YSA9IGFycmF5IFtpXTsKLQkJCVN0cmluZyBzdHlsZSA9ICJOT1JNQUwiOwotCQkJaW50IGJpdHMgPSBkYXRhLmdldFN0eWxlICgpOwotCQkJaWYgKGJpdHMgIT0gMCkgewotCQkJCWlmICgoYml0cyAmIFNXVC5CT0xEKSAhPSAwKSBzdHlsZSA9ICJCT0xEICI7Ci0JCQkJaWYgKChiaXRzICYgU1dULklUQUxJQykgIT0gMCkgc3R5bGUgKz0gIklUQUxJQyI7Ci0JCQl9Ci0JCQlzdHJpbmcgKz0gZGF0YS5nZXROYW1lICgpICsgIiAiICsgZGF0YS5nZXRIZWlnaHQgKCkgKyAiICIgKyBzdHlsZSArIGxmOwotCQl9Ci0JCWdjLmRyYXdTdHJpbmcgKHN0cmluZywgMCwgMCk7Ci0JCXJldHVybjsKLQl9Ci0JLy9OT1RISU5HIFRPIERSQVcgRk9SIEdDCi0vLwlpZiAob2JqZWN0IGluc3RhbmNlb2YgR0MpIHsKLS8vCQlyZXR1cm47Ci0vLwl9Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIEltYWdlKSB7Ci0JCWlmICgoKEltYWdlKW9iamVjdCkuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQlnYy5kcmF3SW1hZ2UgKChJbWFnZSkgb2JqZWN0LCAwLCAwKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUGF0aCkgewotCQlpZiAoKChQYXRoKW9iamVjdCkuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQlnYy5kcmF3UGF0aCAoKFBhdGgpIG9iamVjdCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhdHRlcm4pIHsKLQkJaWYgKCgoUGF0dGVybilvYmplY3QpLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4gKChQYXR0ZXJuKW9iamVjdCk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUgKGNhbnZhcy5nZXRDbGllbnRBcmVhICgpKTsKLQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4gKG51bGwpOwotCQlyZXR1cm47Ci0JfQotCWlmIChvYmplY3QgaW5zdGFuY2VvZiBSZWdpb24pIHsKLQkJaWYgKCgoUmVnaW9uKW9iamVjdCkuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQlTdHJpbmcgc3RyaW5nID0gKChSZWdpb24pb2JqZWN0KS5nZXRCb3VuZHMoKS50b1N0cmluZygpOwotCQlnYy5kcmF3U3RyaW5nIChzdHJpbmcsIDAsIDApOwotCQlyZXR1cm47Ci0JfQotCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUZXh0TGF5b3V0KSB7Ci0JCWlmICgoKFRleHRMYXlvdXQpb2JqZWN0KS5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCSgoVGV4dExheW91dClvYmplY3QpLmRyYXcgKGdjLCAwLCAwKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVHJhbnNmb3JtKSB7Ci0JCWlmICgoKFRyYW5zZm9ybSlvYmplY3QpLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJU3RyaW5nIHN0cmluZyA9ICgoVHJhbnNmb3JtKW9iamVjdCkudG9TdHJpbmcoKTsKLQkJZ2MuZHJhd1N0cmluZyAoc3RyaW5nLCAwLCAwKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotdm9pZCByZWZyZXNoT2JqZWN0ICgpIHsKLQlpbnQgaW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotCWlmIChjaGVjay5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gKCk7Ci0JCVByaW50U3RyZWFtIHMgPSBuZXcgUHJpbnRTdHJlYW0gKHN0cmVhbSk7Ci0JCWVycm9ycyBbaW5kZXhdLnByaW50U3RhY2tUcmFjZSAocyk7Ci0JCXRleHQuc2V0VGV4dCAoc3RyZWFtLnRvU3RyaW5nICgpKTsKLQkJdGV4dC5zZXRWaXNpYmxlICh0cnVlKTsKLQkJY2FudmFzLnNldFZpc2libGUgKGZhbHNlKTsKLQl9IGVsc2UgewotCQljYW52YXMuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCXRleHQuc2V0VmlzaWJsZSAoZmFsc2UpOwotCQljYW52YXMucmVkcmF3ICgpOwotCX0KLX0KLQotdm9pZCByZWZyZXNoQWxsICgpIHsKLQlvbGRPYmplY3RzID0gbmV3IE9iamVjdCBbMF07Ci0Jb2xkRXJyb3JzID0gbmV3IEVycm9yIFswXTsKLQlyZWZyZXNoRGlmZmVyZW5jZSAoKTsKLQlvbGRPYmplY3RzID0gb2JqZWN0czsKLQlvbGRFcnJvcnMgPSBlcnJvcnM7Ci19Ci0KLXZvaWQgbGF5b3V0ICgpIHsKLQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JaW50IHdpZHRoID0gMDsKLQlTdHJpbmcgW10gaXRlbXMgPSBsaXN0LmdldEl0ZW1zICgpOwotCUdDIGdjID0gbmV3IEdDIChsaXN0KTsKLQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQl3aWR0aCA9IE1hdGgubWF4ICh3aWR0aCwgZ2Muc3RyaW5nRXh0ZW50IChpdGVtcyBbaV0pLngpOwotCX0KLQlnYy5kaXNwb3NlICgpOwotCVBvaW50IHNpemUxID0gc3RhcnQuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUG9pbnQgc2l6ZTIgPSBzdG9wLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVBvaW50IHNpemUzID0gY2hlY2suY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUG9pbnQgc2l6ZTQgPSBsYWJlbC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQl3aWR0aCA9IE1hdGgubWF4IChzaXplMS54LCBNYXRoLm1heCAoc2l6ZTIueCwgTWF0aC5tYXggKHNpemUzLngsIHdpZHRoKSkpOwotCXdpZHRoID0gTWF0aC5tYXggKDY0LCBNYXRoLm1heCAoc2l6ZTQueCwgbGlzdC5jb21wdXRlU2l6ZSAod2lkdGgsIFNXVC5ERUZBVUxUKS54KSk7Ci0Jc3RhcnQuc2V0Qm91bmRzICgwLCAwLCB3aWR0aCwgc2l6ZTEueSk7Ci0Jc3RvcC5zZXRCb3VuZHMgKDAsIHNpemUxLnksIHdpZHRoLCBzaXplMi55KTsKLQljaGVjay5zZXRCb3VuZHMgKDAsIHNpemUxLnkgKyBzaXplMi55LCB3aWR0aCwgc2l6ZTMueSk7Ci0JbGFiZWwuc2V0Qm91bmRzICgwLCByZWN0LmhlaWdodCAtIHNpemU0LnksIHdpZHRoLCBzaXplNC55KTsKLQlpbnQgaGVpZ2h0ID0gc2l6ZTEueSArIHNpemUyLnkgKyBzaXplMy55OwotCWxpc3Quc2V0Qm91bmRzICgwLCBoZWlnaHQsIHdpZHRoLCByZWN0LmhlaWdodCAtIGhlaWdodCAtIHNpemU0LnkpOwotCXRleHQuc2V0Qm91bmRzICh3aWR0aCwgMCwgcmVjdC53aWR0aCAtIHdpZHRoLCByZWN0LmhlaWdodCk7Ci0JY2FudmFzLnNldEJvdW5kcyAod2lkdGgsIDAsIHJlY3Qud2lkdGggLSB3aWR0aCwgcmVjdC5oZWlnaHQpOwotfQotCQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNmM3MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLgotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBKTkkgR2VuZXJhdGlvbi8sXAotICAgICAgICAgICBNYWMgR2VuZXJhdGlvbi8sXAotICAgICAgICAgICBJY29uIEV4ZS8sXAotICAgICAgICAgICBOYXRpdmVTdGF0cy8sXAotICAgICAgICAgICBTbGVhay8sXAotICAgICAgICAgICBNb3ppbGxhIEdlbmVyYXRpb24vCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9pY29ucy9tYWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvaWNvbnMvbWFjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxMDJmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9pY29ucy9tYWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4MmY3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBTV1QgVG9vbHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1tYWNWaWV3TmFtZSA9IE1hYyBHZW5lcmF0b3IKLWpuaUJ1aWxkZXJOYW1lID0gSk5JIEJ1aWxkZXIKLWVuYWJsZUNoZWNrNjROYW1lID0gUmVwb3J0IDY0LWJpdCBQcm9ibGVtcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTg0N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LnN3dC50b29scyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGFsbG93TXVsdGlwbGU9ImZhbHNlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5zd3QudG9vbHMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LnRvb2xzLnZpZXdzLk1hY0dlbmVyYXRvclZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9tYWMuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC50b29scy52aWV3cy5NYWNHZW5lcmF0b3JWaWV3IgotICAgICAgICAgICAgbmFtZT0iJW1hY1ZpZXdOYW1lIj4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRlbXBsYXRlcyI+Ci0gICAgICA8aW5jbHVkZQotICAgICAgICAgICAgZmlsZT0idGVtcGxhdGVzL2puaXRlbXBsYXRlcy54bWwiCi0gICAgICAgICAgICB0cmFuc2xhdGlvbnM9IiRubCQvdGVtcGxhdGVzL2puaXRlbXBsYXRlcy5wcm9wZXJ0aWVzIj4KLSAgICAgIDwvaW5jbHVkZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iam5pYnVpbGRlciIKLSAgICAgICAgIG5hbWU9IiVqbmlCdWlsZGVyTmFtZSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5idWlsZGVycyI+Ci0gICAgICA8YnVpbGRlciBoYXNOYXR1cmU9ImZhbHNlIj4KLQkJPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmJ1aWxkZXJzLkpOSUJ1aWxkZXIiLz4KLSAgICAgIDwvYnVpbGRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsYXRpb25QYXJ0aWNpcGFudCI+Ci0gICAgICA8Y29tcGlsYXRpb25QYXJ0aWNpcGFudAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC50b29scy5idWlsZGVycy5DaGVjazY0Q29tcGlsYXRpb25QYXJ0aWNpcGFudCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QudG9vbHMuQ2hlY2s2NENvbXBpbGF0aW9uUGFydGljaXBhbnQiPgotICAgICAgPC9jb21waWxhdGlvblBhcnRpY2lwYW50PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmNvbnRyaWJ1dGlvbiI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVwbHVnaW5OYW1lIgotICAgICAgICAgICAgICAgcGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC50b29scy5tZW51Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgIG5hbWU9Imdyb3VwMSI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlZW5hYmxlQ2hlY2s2NE5hbWUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmJ1aWxkZXJzLkNoZWNrNjRFbmFibGVBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uuc3d0LnRvb2xzLm1lbnUvZ3JvdXAxIgotICAgICAgICAgICAgICAgc3R5bGU9InRvZ2dsZSIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmNoZWNrNjRFbmFibGVBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTM5MjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29sczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uuc3d0LnRvb2xzIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aAotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvc3JjL29yZy9lY2xpcHNlL3N3dC90b29scy9idWlsZGVycy9DaGVjazY0Q29tcGlsYXRpb25QYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvc3JjL29yZy9lY2xpcHNlL3N3dC90b29scy9idWlsZGVycy9DaGVjazY0Q29tcGlsYXRpb25QYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTZhNDQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvYnVpbGRlcnMvQ2hlY2s2NENvbXBpbGF0aW9uUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5idWlsZGVyczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQnVpbGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ29tcGlsYXRpb25QYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5iYXRjaC5CYXRjaENvbXBpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC50b29scy5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotcHVibGljIGNsYXNzIENoZWNrNjRDb21waWxhdGlvblBhcnRpY2lwYW50IGV4dGVuZHMgQ29tcGlsYXRpb25QYXJ0aWNpcGFudCB7Ci0JSGFzaFNldCBzb3VyY2VzOwotCi0Jc3RhdGljIGZpbmFsIGNoYXJbXSBJTlRfTE9ORyA9ICJpbnQgLypsb25nKi8iLnRvQ2hhckFycmF5KCk7Ci0Jc3RhdGljIGZpbmFsIGNoYXJbXSBJTlRfTE9OR19BUlJBWSA9ICJpbnRbXSAvKmxvbmdbXSovIi50b0NoYXJBcnJheSgpOwotCXN0YXRpYyBmaW5hbCBjaGFyW10gRkxPQVRfRE9VQkxFID0gImZsb2F0IC8qZG91YmxlKi8iLnRvQ2hhckFycmF5KCk7Ci0Jc3RhdGljIGZpbmFsIGNoYXJbXSBGTE9BVF9ET1VCTEVfQVJSQVkgPSAiZmxvYXRbXSAvKmRvdWJsZVtdKi8iLnRvQ2hhckFycmF5KCk7Ci0Jc3RhdGljIGZpbmFsIGNoYXJbXSBMT05HX0lOVCA9ICJsb25nIC8qaW50Ki8iLnRvQ2hhckFycmF5KCk7Ci0Jc3RhdGljIGZpbmFsIGNoYXJbXSBMT05HX0lOVF9BUlJBWSA9ICJsb25nW10gLyppbnRbXSovIi50b0NoYXJBcnJheSgpOwotCXN0YXRpYyBmaW5hbCBjaGFyW10gRE9VQkxFX0ZMT0FUID0gImRvdWJsZSAvKmZsb2F0Ki8iLnRvQ2hhckFycmF5KCk7Ci0Jc3RhdGljIGZpbmFsIGNoYXJbXSBET1VCTEVfRkxPQVRfQVJSQVkgPSAiZG91YmxlW10gLypmbG9hdFtdKi8iLnRvQ2hhckFycmF5KCk7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBidWlsZERpciA9ICIvLmJ1aWxkNjQvIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIHBsdWdpbkRpciA9ICIvb3JnLmVjbGlwc2Uuc3d0LyI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBwbHVnaW4gPSAib3JnLmVjbGlwc2Uuc3d0IjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9JRCA9ICJKTkkiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfNjRfRU5BQkxFRCA9IEFjdGl2YXRvci5QTFVHSU5fSUQgKyAiQ0hFQ0tfNjRfRU5BQkxFRCI7Ci0JCi12b2lkIGJ1aWxkKElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcm9vdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCVByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JdHJ5IHsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZVBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCksIGNwID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOyAKLQkJCVN0cmluZyBwYXRoID0gZW50cnkuZ2V0UGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCWlmIChwYXRoLnN0YXJ0c1dpdGgocGx1Z2luRGlyKSkgewotCQkJCQlpZiAoc291cmNlUGF0aC5sZW5ndGgoKSA+IDApIHNvdXJjZVBhdGguYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwotCQkJCQlTdHJpbmcgZGlyID0gcm9vdCArIHBhdGguc3Vic3RyaW5nKHBsdWdpbkRpci5sZW5ndGgoKSk7Ci0JCQkJCXNvdXJjZVBhdGguYXBwZW5kKGRpcik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY3AubGVuZ3RoKCkgPiAwKSBjcC5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKLQkJCQljcC5hcHBlbmQocGF0aCk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGJpbiA9IHJvb3QgKyAiL2JpbiI7Ci0JCWlmIChjcC5sZW5ndGgoKSA+IDApIGNwLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3IpOwotCQljcC5hcHBlbmQoYmluKTsKLQkJQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFyZ3MuYWRkQWxsKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdewotCQkJIi1ub3dhcm4iLAotLy8JCQkiLXZlcmJvc2UiLAotCQkJIi1kIiwgYmluLAotCQkJIi1jcCIsIGNwLnRvU3RyaW5nKCksCi0JCQkiLWxvZyIsIHJvb3QgKyAiL2xvZy54bWwiLAotCQkJIi1zb3VyY2VwYXRoIiwgc291cmNlUGF0aC50b1N0cmluZygpLAotCQl9KSk7Ci0JCWFyZ3MuYWRkQWxsKHNvdXJjZXMpOwotCQlzb3VyY2VzID0gbnVsbDsKLQkJd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShyb290ICsgIi9vdXQudHh0IikpKTsKLQkJQmF0Y2hDb21waWxlci5jb21waWxlKChTdHJpbmdbXSlhcmdzLnRvQXJyYXkobmV3IFN0cmluZ1thcmdzLnNpemUoKV0pLCB3cml0ZXIsIHdyaXRlciwgbnVsbCk7Ci0JCXdyaXRlci5jbG9zZSgpOwotCQl3cml0ZXIgPSBudWxsOwotCQlwcm9qZWN0LmdldFByb2plY3QoKS5maW5kTWVtYmVyKG5ldyBQYXRoKGJ1aWxkRGlyKSkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuUExVR0lOX0lELCAiUHJvYmxlbSBidWlsZGluZyA2NC1iaXQgY29kZSIsIGUpKTsKLQl9IGZpbmFsbHkgewotCQlpZiAod3JpdGVyICE9IG51bGwpIHdyaXRlci5jbG9zZSgpOwotCX0KLX0KLQotdm9pZCBjcmVhdGUoSUNvbnRhaW5lciBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JaWYgKGZpbGUuZXhpc3RzKCkpIHJldHVybjsKLQlzd2l0Y2ggKGZpbGUuZ2V0VHlwZSgpKSB7Ci0JCWNhc2UgSVJlc291cmNlLkZPTERFUjoKLQkJCWNyZWF0ZShmaWxlLmdldFBhcmVudCgpKTsKLQkJCSgoSUZvbGRlcilmaWxlKS5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JfQotfQotCi12b2lkIGNyZWF0ZVByb2JsZW1zKElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcm9vdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlucHV0U3RyZWFtIGlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShyb290ICsgIi9sb2cueG1sIikpOwotCQlEb2N1bWVudCBkb2MgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKGlzKSk7Ci0JCWlzLmNsb3NlKCk7Ci0JCUlQcm9qZWN0IHByb2ogPSBwcm9qZWN0LmdldFByb2plY3QoKTsJCi0JCVN0cmluZyBwcm9qUGF0aCA9IHByb2ouZ2V0TG9jYXRpb24oKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCU5vZGVMaXN0IHNvdXJjZXMgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZXMiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGVMaXN0IHNyYyA9ICgoRWxlbWVudClzb3VyY2VzLml0ZW0oaSkpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3JjLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQlFbGVtZW50IHNvdXJjZSA9IChFbGVtZW50KXNyYy5pdGVtKGopOwotCQkJCVN0cmluZyBwYXRoID0gc291cmNlLmdldEF0dHJpYnV0ZSgicGF0aCIpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCQlwYXRoID0gcGF0aC5yZXBsYWNlQWxsKGJ1aWxkRGlyLCAiLyIpOwotCQkJCWlmIChwYXRoLnN0YXJ0c1dpdGgocHJvalBhdGgpKSB7Ci0JCQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhwcm9qUGF0aC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHByb2ouZmluZE1lbWJlcihuZXcgUGF0aChwYXRoKSk7Ci0JCQkJYm9vbGVhbiBoYXNQcm9ibGVtcyA9IGZhbHNlOwotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCWZvciAoaW50IG0gPSAwOyBtIDwgbWFya2Vycy5sZW5ndGg7IG0rKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbbV07Ci0JCQkJCWlmIChTT1VSQ0VfSUQuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TT1VSQ0VfSUQpKSkgewotCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJT2JqZWN0IHNldmVyaXR5ID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKTsKLQkJCQkJCWhhc1Byb2JsZW1zIHw9IHNldmVyaXR5ICE9IG51bGwgJiYgKChJbnRlZ2VyKXNldmVyaXR5KS5pbnRWYWx1ZSgpID09IElNYXJrZXIuU0VWRVJJVFlfRVJST1I7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFoYXNQcm9ibGVtcykgewotCQkJCQlOb2RlTGlzdCBwcm9ibGVtcyA9IHNvdXJjZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJvYmxlbXMiKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBwcm9ibGVtcy5nZXRMZW5ndGgoKTsgaysrKSB7Ci0JCQkJCQlOb2RlTGlzdCBwcm9ibGVtID0gKChFbGVtZW50KXByb2JsZW1zLml0ZW0oaykpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwcm9ibGVtIik7Ci0JCQkJCQlmb3IgKGludCBsID0gMDsgbCA8IHByb2JsZW0uZ2V0TGVuZ3RoKCk7IGwrKykgewotCQkJCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KXByb2JsZW0uaXRlbShsKTsKLQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQlpbnQgc3RhcnQgPSBJbnRlZ2VyLnBhcnNlSW50KG5vZGUuZ2V0QXR0cmlidXRlKCJjaGFyU3RhcnQiKSk7Ci0JCQkJCQkJCWludCBlbmQgPSBJbnRlZ2VyLnBhcnNlSW50KG5vZGUuZ2V0QXR0cmlidXRlKCJjaGFyRW5kIikpOwotCQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJbNjRdICIgKyAoKEVsZW1lbnQpbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibWVzc2FnZSIpLml0ZW0oMCkpLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKLQkJCQkJCQkJSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKLQkJCQkJCQkJaW50IHNldmVyaXR5ID0gSU1hcmtlci5TRVZFUklUWV9FUlJPUjsKLQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoCi0JCQkJCQkJCQluZXcgU3RyaW5nW10ge0lNYXJrZXIuTUVTU0FHRSwgSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5DSEFSX1NUQVJULCBJTWFya2VyLkNIQVJfRU5ELCBJTWFya2VyLlNPVVJDRV9JRH0sCi0JCQkJCQkJCQluZXcgT2JqZWN0W10ge21lc3NhZ2UsIG5ldyBJbnRlZ2VyKHNldmVyaXR5KSwgbmV3IEludGVnZXIoc3RhcnQpLCBuZXcgSW50ZWdlcihlbmQpLCBTT1VSQ0VfSUR9KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5QTFVHSU5fSUQsICJQcm9ibGVtIGNyZWF0aW5nIDY0LWJpdCBwcm9ibGVtcyIsIGUpKTsKLQl9Ci19Ci0KLWJvb2xlYW4gcmVwbGFjZShjaGFyW10gc291cmNlLCBjaGFyW10gc3JjLCBjaGFyW10gZGVzdCkgewotCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCWludCBzdGFydCA9IDA7Ci0Jd2hpbGUgKHN0YXJ0IDwgc291cmNlLmxlbmd0aCkgewotCQlpbnQgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2Yoc3JjLCBzb3VyY2UsIHRydWUsIHN0YXJ0KTsKLQkJaWYgKGluZGV4ID09IC0xKSBicmVhazsKLQkJY2hhbmdlZCB8PSB0cnVlOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRlc3QsIDAsIHNvdXJjZSwgaW5kZXgsIGRlc3QubGVuZ3RoKTsKLQkJc3RhcnQgPSBpbmRleCArIDE7Ci0JfQotCXJldHVybiBjaGFuZ2VkOwotfQotCi1ib29sZWFuIHJlcGxhY2UoY2hhcltdIHNvdXJjZSkgewotCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCWNoYW5nZWQgfD0gcmVwbGFjZShzb3VyY2UsIElOVF9MT05HLCBMT05HX0lOVCk7Ci0JY2hhbmdlZCB8PSByZXBsYWNlKHNvdXJjZSwgSU5UX0xPTkdfQVJSQVksIExPTkdfSU5UX0FSUkFZKTsKLQljaGFuZ2VkIHw9IHJlcGxhY2Uoc291cmNlLCBGTE9BVF9ET1VCTEUsIERPVUJMRV9GTE9BVCk7Ci0JY2hhbmdlZCB8PSByZXBsYWNlKHNvdXJjZSwgRkxPQVRfRE9VQkxFX0FSUkFZLCBET1VCTEVfRkxPQVRfQVJSQVkpOwotCWlmICghY2hhbmdlZCkgewotCQljaGFuZ2VkIHw9IHJlcGxhY2Uoc291cmNlLCBMT05HX0lOVCwgSU5UX0xPTkcpOwotCQljaGFuZ2VkIHw9IHJlcGxhY2Uoc291cmNlLCBMT05HX0lOVF9BUlJBWSwgSU5UX0xPTkdfQVJSQVkpOwotCQljaGFuZ2VkIHw9IHJlcGxhY2Uoc291cmNlLCBET1VCTEVfRkxPQVQsIEZMT0FUX0RPVUJMRSk7Ci0JCWNoYW5nZWQgfD0gcmVwbGFjZShzb3VyY2UsIERPVUJMRV9GTE9BVF9BUlJBWSwgRkxPQVRfRE9VQkxFX0FSUkFZKTsKLQl9Ci0JcmV0dXJuIGNoYW5nZWQ7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFbmFibGVkKCkgewotCXJldHVybiBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oQ0hFQ0tfNjRfRU5BQkxFRCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoQ0hFQ0tfNjRfRU5BQkxFRCwgZW5hYmxlZCk7Ci19Ci0KLWJvb2xlYW4gaXM2NGJpdChJSmF2YVByb2plY3QgcHJvamVjdCkgewotCXRyeSB7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlTdHJpbmcgcGF0aCA9IGVudHJ5LmdldFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHBhdGgpOwotCQkJCWlmIChwYXRoLmVxdWFscyhwbHVnaW5EaXIgKyAiRWNsaXBzZSBTV1QgUEkvd2luMzIiKSB8fCAKLQkJCQkJcGF0aC5lcXVhbHMocGx1Z2luRGlyICsgIkVjbGlwc2UgU1dUIFBJL2NvY29hIikgfHwgCi0JCQkJCXBhdGguZXF1YWxzKHBsdWdpbkRpciArICJFY2xpcHNlIFNXVCBQSS9ndGsiKQotCQkJCSkgCi0JCQkJewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkge30KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQl0cnkgewotCQlpZiAoc291cmNlcyA9PSBudWxsKSByZXR1cm47Ci0JCWlmICghZ2V0RW5hYmxlZCgpIHx8ICFpczY0Yml0KHByb2plY3QpKSByZXR1cm47Ci0vLwkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCVN0cmluZyByb290ID0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKS50b1BvcnRhYmxlU3RyaW5nKCkgKyBidWlsZERpcjsKLQkJYnVpbGQocHJvamVjdCwgcm9vdCk7CQkKLQkJY3JlYXRlUHJvYmxlbXMocHJvamVjdCwgcm9vdCk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJjb21waWxpbmcgdGltZT0iICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQotCQotcHVibGljIHZvaWQgYnVpbGRTdGFydGluZyhCdWlsZENvbnRleHRbXSBmaWxlcywgYm9vbGVhbiBpc0JhdGNoKSB7Ci0JaWYgKHNvdXJjZXMgPT0gbnVsbCkgc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0vLwlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCUJ1aWxkQ29udGV4dCBjb250ZXh0ID0gZmlsZXNbaV07Ci0JCUlGaWxlIGZpbGUgPSBjb250ZXh0LmdldEZpbGUoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChidWlsZERpciArIGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCUlGaWxlIG5ld0ZpbGUgPSBwcm9qZWN0LmdldEZpbGUocGF0aCk7Ci0JCXNvdXJjZXMuYWRkKG5ld0ZpbGUuZ2V0TG9jYXRpb24oKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQl0cnkgewotCQkJaWYgKG5ld0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQluZXdGaWxlLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQkJCX0KLQkJCWNyZWF0ZShuZXdGaWxlLmdldFBhcmVudCgpKTsKLQkJCWNoYXJbXSBzb3VyY2UgPSBjb250ZXh0LmdldENvbnRlbnRzKCk7Ci0JCQlyZXBsYWNlKHNvdXJjZSk7Ci0JCQluZXdGaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IFN0cmluZyhzb3VyY2UpLmdldEJ5dGVzKCkpLCB0cnVlLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotLy8JU3lzdGVtLm91dC5wcmludGxuKCJjb3B5aW5nIHRpbWU9IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIGNsZWFuU3RhcnRpbmcoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQlpZiAoIWlzQWN0aXZlKHByb2plY3QpKSByZXR1cm47Ci0Jc291cmNlcyA9IG51bGw7Ci0JSVJlc291cmNlIHJlc291cmNlID0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZmluZE1lbWJlcihuZXcgUGF0aChidWlsZERpcikpOwotCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KLQotcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQlpZiAocHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLmVxdWFscyhwbHVnaW4pKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gc3VwZXIuaXNBY3RpdmUocHJvamVjdCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvYnVpbGRlcnMvQ2hlY2s2NEVuYWJsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvc3JjL29yZy9lY2xpcHNlL3N3dC90b29scy9idWlsZGVycy9DaGVjazY0RW5hYmxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1N2JjZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvc3JjL29yZy9lY2xpcHNlL3N3dC90b29scy9idWlsZGVycy9DaGVjazY0RW5hYmxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5idWlsZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBDaGVjazY0RW5hYmxlQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXB1YmxpYyBDaGVjazY0RW5hYmxlQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJYWN0aW9uLnNldENoZWNrZWQoQ2hlY2s2NENvbXBpbGF0aW9uUGFydGljaXBhbnQuZ2V0RW5hYmxlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJQ2hlY2s2NENvbXBpbGF0aW9uUGFydGljaXBhbnQuc2V0RW5hYmxlZChhY3Rpb24uaXNDaGVja2VkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2J1aWxkZXJzL0pOSUJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvYnVpbGRlcnMvSk5JQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzE3NDE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvYnVpbGRlcnMvSk5JQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuYnVpbGRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWwuSk5JR2VuZXJhdG9yQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbC5NZXRhRGF0YTsKLQotcHVibGljIGNsYXNzIEpOSUJ1aWxkZXIgZXh0ZW5kcyBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyIHsKLQotCU1ldGFEYXRhIG1ldGFEYXRhOwotCU1haW5DbGFzc1tdIGNsYXNzZXM7Ci0JCi0Jc3RhdGljIGNsYXNzIE1haW5DbGFzcyB7Ci0JCXB1YmxpYyBTdHJpbmcgbWFpbkNsYXNzTmFtZTsKLQkJcHVibGljIFN0cmluZyBvdXRwdXREaXI7Ci0JCXB1YmxpYyBTdHJpbmcgc291cmNlRGlyOwotCQlwdWJsaWMgYm9vbGVhbiBidWlsZDsKLQkJCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gbWFpbkNsYXNzTmFtZSArICItPiIgKyBvdXRwdXREaXI7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEpOSUJ1aWxkZXIoKSB7Ci0JCW1ldGFEYXRhID0gbmV3IE1ldGFEYXRhKCJvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwiKTsKLQkJU3RyaW5nIG1haW5DbGFzc2VzID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoInN3dF9tYWluX2NsYXNzZXMiLCBudWxsKTsKLQkJaWYgKG1haW5DbGFzc2VzICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIGxpc3QgPSBtYWluQ2xhc3Nlcy5zcGxpdCgiLCIpOwotCQkJY2xhc3NlcyA9IG5ldyBNYWluQ2xhc3NbbGlzdC5sZW5ndGggLyAyXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMikgewotCQkJCU1haW5DbGFzcyBjbGF6eiA9IGNsYXNzZXNbaS8yXSA9IG5ldyBNYWluQ2xhc3MoKTsKLQkJCQljbGF6ei5tYWluQ2xhc3NOYW1lID0gbGlzdFtpXTsKLQkJCQljbGF6ei5vdXRwdXREaXIgPSBsaXN0W2krMV0uc3Vic3RyaW5nKDIsIGxpc3RbaSsxXS5sZW5ndGgoKSk7Ci0JCQkJY2xhenouc291cmNlRGlyID0gY2xhenoub3V0cHV0RGlyLnN1YnN0cmluZygwLCBjbGF6ei5vdXRwdXREaXIubGVuZ3RoKCkgLSAibGlicmFyeS8iLmxlbmd0aCgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSVByb2plY3RbXSBidWlsZChpbnQga2luZCwgTWFwIGFyZ3MsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGdldERlbHRhKGdldFByb2plY3QoKSk7Ci0JCWlmIChkZWx0YSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCUlQYXRoIGlwYXRoID0gZGVsdGEuZ2V0RnVsbFBhdGgoKTsKLQkJCQlpZiAoISJqYXZhIi5lcXVhbHMoaXBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSkgcmV0dXJuIHRydWU7Ci0JCQkJU3RyaW5nIHBhdGggPSBpcGF0aC50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjbGFzc2VzW2ldLmJ1aWxkKSBjb250aW51ZTsKLQkJCQkJaWYgKHBhdGguc3RhcnRzV2l0aChjbGFzc2VzW2ldLnNvdXJjZURpcikpIHsKLQkJCQkJCWNsYXNzZXNbaV0uYnVpbGQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQkJZmluYWwgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IGdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJTWFpbkNsYXNzIG1haW5DbGFzcyA9IGNsYXNzZXNbaV07Ci0JCQlpZiAobWFpbkNsYXNzLmJ1aWxkKSB7Ci0JCQkJbWFpbkNsYXNzLmJ1aWxkID0gZmFsc2U7Ci0JCQkJSVJlc291cmNlIGxpYnJhcnkgPSByb290LmZpbmRNZW1iZXIobWFpbkNsYXNzLm91dHB1dERpcik7Ci0JCQkJSk5JR2VuZXJhdG9yQXBwIGdlbiA9IG5ldyBKTklHZW5lcmF0b3JBcHAoKTsKLQkJCQlnZW4uc2V0TWFpbkNsYXNzTmFtZShtYWluQ2xhc3MubWFpbkNsYXNzTmFtZSwgbGlicmFyeS5nZXRMb2NhdGlvbigpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCQkJbGlicmFyeS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvdmlld3MvTWFjR2VuZXJhdG9yVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvc3JjL29yZy9lY2xpcHNlL3N3dC90b29scy92aWV3cy9NYWNHZW5lcmF0b3JWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWI2YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvc3JjL29yZy9lY2xpcHNlL3N3dC90b29scy92aWV3cy9NYWNHZW5lcmF0b3JWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotCi0KLS8qKgotICogVGhpcyBzYW1wbGUgY2xhc3MgZGVtb25zdHJhdGVzIGhvdyB0byBwbHVnLWluIGEgbmV3Ci0gKiB3b3JrYmVuY2ggdmlldy4gVGhlIHZpZXcgc2hvd3MgZGF0YSBvYnRhaW5lZCBmcm9tIHRoZQotICogbW9kZWwuIFRoZSBzYW1wbGUgY3JlYXRlcyBhIGR1bW15IG1vZGVsIG9uIHRoZSBmbHksCi0gKiBidXQgYSByZWFsIGltcGxlbWVudGF0aW9uIHdvdWxkIGNvbm5lY3QgdG8gdGhlIG1vZGVsCi0gKiBhdmFpbGFibGUgZWl0aGVyIGluIHRoaXMgb3IgYW5vdGhlciBwbHVnLWluIChlLmcuIHRoZSB3b3Jrc3BhY2UpLgotICogVGhlIHZpZXcgaXMgY29ubmVjdGVkIHRvIHRoZSBtb2RlbCB1c2luZyBhIGNvbnRlbnQgcHJvdmlkZXIuCi0gKiA8cD4KLSAqIFRoZSB2aWV3IHVzZXMgYSBsYWJlbCBwcm92aWRlciB0byBkZWZpbmUgaG93IG1vZGVsCi0gKiBvYmplY3RzIHNob3VsZCBiZSBwcmVzZW50ZWQgaW4gdGhlIHZpZXcuIEVhY2gKLSAqIHZpZXcgY2FuIHByZXNlbnQgdGhlIHNhbWUgbW9kZWwgb2JqZWN0cyB1c2luZwotICogZGlmZmVyZW50IGxhYmVscyBhbmQgaWNvbnMsIGlmIG5lZWRlZC4gQWx0ZXJuYXRpdmVseSwKLSAqIGEgc2luZ2xlIGxhYmVsIHByb3ZpZGVyIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiB2aWV3cwotICogaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGFyZQotICogcHJlc2VudGVkIGluIHRoZSBzYW1lIHdheSBldmVyeXdoZXJlLgotICogPHA+Ci0gKi8KLQotcHVibGljIGNsYXNzIE1hY0dlbmVyYXRvclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JcHJpdmF0ZSBBY3Rpb24gZ2VuZXJhdGVBY3Rpb247Ci0JcHJpdmF0ZSBNYWNHZW5lcmF0b3JVSSB1aTsKLQlwcml2YXRlIElSZXNvdXJjZSByb290OwotCUlSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCXByaXZhdGUgSm9iIGpvYjsKLQlwcml2YXRlIFN0cmluZyBtYWluQ2xhc3NOYW1lID0gIm9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jb2NvYS5PUyI7Ci0JCi0JY2xhc3MgR2VuSm9iIGV4dGVuZHMgSm9iIHsKLQkJcHVibGljIEdlbkpvYigpIHsKLQkJCXN1cGVyKCJNYWMgR2VuZXJhdG9yIik7Ci0JCX0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdHJ5IHsKLQkJCQl1aS5nZW5lcmF0ZShuZXcgUHJvZ3Jlc3NNb25pdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2sobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgc2V0VG90YWwoaW50IHRvdGFsKSB7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzaygiR2VuZXJhdGluZyIsIHRvdGFsKTsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCBzdGVwKCkgewotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZWZyZXNoKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCU1hY0dlbmVyYXRvclZpZXcudGhpcy5qb2IgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBNYWNHZW5lcmF0b3JWaWV3KCkgewotCQlNYWNHZW5lcmF0b3IuQlVJTERfQ19TT1VSQ0UgPSBmYWxzZTsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlyb290ID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKG5ldyBQYXRoKCJvcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvY29jb2EiKSk7CQkKLQkJbGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoam9iICE9IG51bGwpIHJldHVybjsKLQkJCQlpZiAoZXZlbnQuZ2V0VHlwZSgpICE9IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKSByZXR1cm47Ci0JCQkJSVJlc291cmNlRGVsdGEgcm9vdERlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCQlJUmVzb3VyY2VEZWx0YSBwaURlbHRhID0gcm9vdERlbHRhLmZpbmRNZW1iZXIocm9vdC5nZXRGdWxsUGF0aCgpKTsKLQkJCQlpZiAocGlEZWx0YSA9PSBudWxsKSByZXR1cm47Ci0JCQkJZmluYWwgQXJyYXlMaXN0IGNoYW5nZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSByZXR1cm4gdHJ1ZTsKLQkJCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID09IDApIHJldHVybiB0cnVlOwotCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgImV4dHJhcyIuZXF1YWxzSWdub3JlQ2FzZShyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0JCQkJCQkJY2hhbmdlZC5hZGQocmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXRyeSB7Ci0JCQkJCXBpRGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkge30KLQkJCQlpZiAoY2hhbmdlZC5zaXplKCkgPiAwKSB7Ci0JCQkJCXVpLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXdvcmtzcGFjZS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGFsbG93IHVzCi0JICogdG8gY3JlYXRlIHRoZSB2aWV3ZXIgYW5kIGluaXRpYWxpemUgaXQuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlNYWNHZW5lcmF0b3IgZ2VuID0gbmV3IE1hY0dlbmVyYXRvcigpOwotCQlnZW4uc2V0T3V0cHV0RGlyKHJvb3QuZ2V0TG9jYXRpb24oKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQlnZW4uc2V0TWFpbkNsYXNzKG1haW5DbGFzc05hbWUpOwotCQl1aSA9IG5ldyBNYWNHZW5lcmF0b3JVSShnZW4pOwotCQl1aS5zZXRBY3Rpb25zVmlzaWJsZShmYWxzZSk7Ci0JCXVpLm9wZW4ocGFyZW50KTsKLQotCQltYWtlQWN0aW9ucygpOwotCQljb250cmlidXRlVG9BY3Rpb25CYXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKSB7Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJZmlsbExvY2FsUHVsbERvd24oYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQkJZmlsbExvY2FsVG9vbEJhcihiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJd29ya3NwYWNlLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxMb2NhbFB1bGxEb3duKElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGdlbmVyYXRlQWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbExvY2FsVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgbWFuYWdlcikgewotCQltYW5hZ2VyLmFkZChnZW5lcmF0ZUFjdGlvbik7Ci0JfQotCQotCXZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCXJvb3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXZvaWQgZ2VuZXJhdGUoKSB7Ci0JCWlmIChqb2IgIT0gbnVsbCkgcmV0dXJuOwotCQlqb2IgPSBuZXcgR2VuSm9iKCk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJZ2VuZXJhdGVBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdlbmVyYXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCWdlbmVyYXRlQWN0aW9uLnNldFRleHQoIkdlbmVyYXRlIik7Ci0JCWdlbmVyYXRlQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJHZW5lcmF0ZSIpOwotCQlnZW5lcmF0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS4KLQkJCWdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19FVE9PTF9TQVZFX0VESVQpKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXNzaW5nIHRoZSBmb2N1cyByZXF1ZXN0IHRvIHRoZSB2aWV3ZXIncyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQl1aS5zZXRGb2N1cygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy90ZW1wbGF0ZXMvam5pdGVtcGxhdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy90ZW1wbGF0ZXMvam5pdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvdGVtcGxhdGVzL2puaXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3RlbXBsYXRlcy9qbml0ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvdGVtcGxhdGVzL2puaXRlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MmY0NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvdGVtcGxhdGVzL2puaXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPHRlbXBsYXRlcz4KLQk8dGVtcGxhdGUgaWQ9Im9yZy5lY2xpcHNlLnN3dC50b29scy50ZW1wbGF0ZXMuam5pY2xhc3MiIGF1dG9pbnNlcnQ9InRydWUiIGNvbnRleHQ9ImphdmEiIGRlbGV0ZWQ9ImZhbHNlIiBkZXNjcmlwdGlvbj0iIiBlbmFibGVkPSJ0cnVlIiBuYW1lPSJqbmljbGFzcyI+LyoqIEBqbmljbGFzcyBmbGFncz0ke2ZsYWdzOmxpbmsobm9fZ2VuLGNwcCl9ICovPC90ZW1wbGF0ZT4KLQk8dGVtcGxhdGUgaWQ9Im9yZy5lY2xpcHNlLnN3dC50b29scy50ZW1wbGF0ZXMuam5pZmllbGQiIGF1dG9pbnNlcnQ9InRydWUiIGNvbnRleHQ9ImphdmEiIGRlbGV0ZWQ9ImZhbHNlIiBkZXNjcmlwdGlvbj0iIiBlbmFibGVkPSJ0cnVlIiBuYW1lPSJqbmlmaWVsZCI+LyoqIEBmaWVsZCBhY2Nlc3Nvcj0ke30sZmxhZ3M9JHtmbGFnczpsaW5rKG5vX2dlbixub193aW5jZSl9ICovPC90ZW1wbGF0ZT4KLQk8dGVtcGxhdGUgaWQ9Im9yZy5lY2xpcHNlLnN3dC50b29scy50ZW1wbGF0ZXMuam5pbWV0aG9kIiBhdXRvaW5zZXJ0PSJ0cnVlIiBjb250ZXh0PSJqYXZhIiBkZWxldGVkPSJmYWxzZSIgZGVzY3JpcHRpb249IiIgZW5hYmxlZD0idHJ1ZSIgbmFtZT0iam5pbWV0aG9kIj4vKiogQG1ldGhvZCBhY2Nlc3Nvcj0ke30sZmxhZ3M9JHtmbGFnczpsaW5rKG5vX2dlbiwgYWRkcmVzcywgY29uc3QsICdjb25zdCBhZGRyZXNzJywgZHluYW1pYywgam5pLCBjYXN0LCBjcHAsICdub19nZW4gY3BwJywgbmV3LCAnbm9fZ2VuIG5ldycsIGRlbGV0ZSwgZ2NuZXcsIGdjb2JqZWN0LCBzZXR0ZXIsIGdldHRlciwgYWRkZXIpfSAqLzwvdGVtcGxhdGU+Ci0JPHRlbXBsYXRlIGlkPSJvcmcuZWNsaXBzZS5zd3QudG9vbHMudGVtcGxhdGVzLmpuaXBhcmFtIiBhdXRvaW5zZXJ0PSJ0cnVlIiBjb250ZXh0PSJqYXZhIiBkZWxldGVkPSJmYWxzZSIgZGVzY3JpcHRpb249IiIgZW5hYmxlZD0idHJ1ZSIgbmFtZT0iam5pcGFyYW0iPi8qKiBAcGFyYW0gJHt9IGNhc3Q9KCR7Y3Vyc29yfSksZmxhZ3M9JHtmbGFnczpsaW5rKG5vX2ludCxub19vdXQsY3JpdGljYWwsaW5pdCxzdHJ1Y3QsdW5pY29kZSxzZW50aW5lbCxnY29iamVjdCwnbm9faW4gY3JpdGljYWwnLCdub19vdXQgY3JpdGljYWwnKX0gKi88L3RlbXBsYXRlPgotPC90ZW1wbGF0ZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgT0xFIFdpbjMyL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vbGUvd2luMzIvT2xlQ2xpZW50U2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgT0xFIFdpbjMyL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vbGUvd2luMzIvT2xlQ2xpZW50U2l0ZS5qYXZhCmluZGV4IGEzNWY0YWQuLmNjOGI2ZTQgMTAwNzU1Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIE9MRSBXaW4zMi93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb2xlL3dpbjMyL09sZUNsaWVudFNpdGUuamF2YQorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBPTEUgV2luMzIvd2luMzIvb3JnL2VjbGlwc2Uvc3d0L29sZS93aW4zMi9PbGVDbGllbnRTaXRlLmphdmEKQEAgLTEyNDAsNyArMTI0MCw3IEBACiAJCQlpbnQgbGVuZ3RoID0gbmV3RmlsZS5sZW5ndGgoKTsKIAkJCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltsZW5ndGggKyAxXTsKIAkJCW5ld0ZpbGUuZ2V0Q2hhcnMoMCwgbGVuZ3RoLCBidWZmZXIsIDApOwotCQkJaW50IGxwc3pOZXdGaWxlID0gQ09NLkNvVGFza01lbUFsbG9jKGJ1ZmZlci5sZW5ndGggKiAyKTsKKwkJCWludCAvKmxvbmcqLyBscHN6TmV3RmlsZSA9IENPTS5Db1Rhc2tNZW1BbGxvYyhidWZmZXIubGVuZ3RoICogMik7CiAJCQlDT00uTW92ZU1lbW9yeShscHN6TmV3RmlsZSwgYnVmZmVyLCBidWZmZXIubGVuZ3RoICogMik7CiAJCQlyZXN1bHQgPSBwZXJzaXN0RmlsZS5TYXZlKGxwc3pOZXdGaWxlLCBmYWxzZSk7CiAJCQlDT00uQ29UYXNrTWVtRnJlZShscHN6TmV3RmlsZSk7CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwYjQ3ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5Ccm93c2VyRGVtbzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNGI4OGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTQ6MzEgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OGRkMDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS5Ccm93c2VyRGVtby5qYXIgPSBzcmMvCi1vdXRwdXQuQnJvd3NlckRlbW8uamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLQkJCSAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLQkJCSAgIHBsdWdpbi54bWwsXAotCQkJICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBCcm93c2VyRGVtby5qYXIsXAotICAgICAgICAgICAgICAgY3NzMS8sXAotICAgICAgICAgICAgICAgY3NzMi8sXAotICAgICAgICAgICAgICAgY3NzMy8sXAotICAgICAgICAgICAgICAgY3NzNC8sXAotICAgICAgICAgICAgICAgaWNvbnMvCi1zcmMuaW5jbHVkZXM9YWJvdXQuaHRtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazEuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9iYWNrMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYjlmMzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9iYWNrMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JhY2syLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Y2OGRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9ibGFjay5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JsYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2YzFlOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JsYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYm9hcmQxLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYm9hcmQxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjNGQ1ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JvYXJkMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2VtcHR5LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvZW1wdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJjZTRkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvZW1wdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9saW5lMS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2xpbmUxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhMGYzNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2xpbmUxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvc3R5bGUuY3NzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9zdHlsZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzZmYTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9zdHlsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1ib2R5IHtiYWNrZ3JvdW5kOiB1cmwoLi9iYWNrMi5qcGcpIGZpeGVkOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgxIHt0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgyIHtiYWNrZ3JvdW5kOiB1cmwoLi9saW5lMS5naWYpIG5vLXJlcGVhdCByaWdodCBib3R0b207IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDMge2ZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotDQotdWwge2xpc3Qtc3R5bGU6IG5vbmU7IHBhZGRpbmc6IDA7IG1hcmdpbjowOyBmb250OiAxMnB0IFRpbWVzO30NCi1saS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vd2hpdGUuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vYmxhY2suZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotDQotLmJvYXJkIHt0ZXh0LWFsaWduOiBjZW50ZXI7fQ0KLXRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgbWFyZ2luOiAwO30NCi10ciB7fQ0KLXRkIHtoZWlnaHQ6IDMycHg7IHdpZHRoOjMycHg7IHRhYmxlLWxheW91dDogZml4ZWQ7fQ0KLQ0KLS53aGl0ZWxpbmsgYSB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL2VtcHR5LmdpZikgbm8tcmVwZWF0OyB3aWR0aDozMnB4OyBoZWlnaHQ6MzJweDt9DQotLmJsYWNrbGluayBhIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vZW1wdHkuZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjMycHg7IGhlaWdodDozMnB4O30NCi0uZW1wdHkge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi9lbXB0eS5naWYpIG5vLXJlcGVhdDsgd2lkdGg6MzJweDsgaGVpZ2h0OjMycHg7fQ0KLQ0KLS53aGl0ZWxpbmsgYTpob3ZlciB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL3doaXRlLmdpZikgbm8tcmVwZWF0OyB3aWR0aDozMnB4OyBoZWlnaHQ6MzJweDt9DQotLmJsYWNrbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2suZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjMycHg7IGhlaWdodDozMnB4O30NCi0ud2hpdGUge2JhY2tncm91bmQ6IHVybCguL3doaXRlLmdpZikgbm8tcmVwZWF0O30NCi0uYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2JsYWNrLmdpZikgbm8tcmVwZWF0O30NCi0ud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbC5naWYpIG5vLXJlcGVhdDt9DQotDQotLnBsYXllcndoaXRlIHtmbG9hdDogbGVmdDsgbWFyZ2luOiAxZW0gMWVtOyBib3JkZXI6IDFweCBzb2xpZCBncmF5OyBiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZS5naWYpIG5vLXJlcGVhdDsgdGV4dC1hbGlnbjogcmlnaHQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6MzJweDt9DQotLnBsYXllcmJsYWNrIHtmbG9hdDogcmlnaHQ7IG1hcmdpbjogMWVtIDFlbTsgYm9yZGVyOiAxcHggc29saWQgZ3JheTsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2suZ2lmKSBuby1yZXBlYXQ7IHRleHQtYWxpZ246IHJpZ2h0OyB3aWR0aDoxMDBweDsgaGVpZ2h0OjMycHg7fQ0KLQ0KLS53aW5uZXIge2JvcmRlcjogNHB4IHNvbGlkIGJsdWU7IGZvbnQ6IGJvbGQgMTZwdCBUaW1lcywgc2VyaWY7fQ0KLS5sb3NlciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGZvbnQ6IDEycHQgVGltZXMsIHNlcmlmO30NCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dhbGwuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93YWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5N2ZjMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93ZWxjb21lLmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dlbGNvbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlOTJhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dlbGNvbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+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+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2ljb25zL3Bhd24uZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvaWNvbnMvcGF3bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTFmOGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvaWNvbnMvcGF3bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmEwZmVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RCcm93c2VyRGVtb3MubmFtZSA9IFNXVCBCcm93c2VyIERlbW9zIFBsdWdpbgotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5Ccm93c2VyRGVtb3MubmFtZSA9IEJyb3dzZXIgRGVtbwotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5uYW1lID0gQnJvd3NlciBEZW1vCi1sYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgZXhhbXBsZSBpbGx1c3RyYXRlcyBob3cgdG8gdXNlIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQgZm9yIEhUTUwgcmVuZGVyaW5nLlxuXG5cCi0JVGhlIFBhd25zIEdhbWUgaXMgYSBib2FyZCBnYW1lIHRoYXQgY2FuIGJlIHBsYXllZCBhZ2FpbnN0IHRoZSBjb21wdXRlciBvciBhZ2FpbnN0IGFub3RoZXIgcGxheWVyLlxuXG5cCi0JUmVuZGVyaW5nIGlzIGJhc2VkIG9uIEhUTUwgYW5kIENTUyB0ZWNobmlxdWVzLiBUaGUgYm9hcmQgaXMgYSB0YWJsZSBmaWxsZWQgd2l0aCBoeXBlcmxpbmtzLiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzIFwKLQlwcm92aWRlIHZhcmlvdXMgdGhlbWVzIGFuZCBjb250cm9sIHRoZSB0YWJsZSBhZXN0aGV0aWMgYXBwZWFyYW5jZS4gXG5cCi0JVGhlIEFQSSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyLnNldFRleHQoamF2YS5sYW5nLlN0cmluZykgZHJhd3MgdGhlIGJvYXJkIGdhbWUgZnJvbSBIVE1MIGdlbmVyYXRlZCBpbiBtZW1vcnkuXG5cCi0JUGxheWVyIG1vdmVzIGFyZSBjYXB0dXJlZCBieSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyLiBlLmcgdGhlIHBsYXllciBjbGlja3MgXAotCW9uIGEgY2VsbCB0aGF0IGRlZmluZXMgYW4gaHlwZXJsaW5rIHdpdGggYSBVUkwgaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy94eDF5eTIuXAotCVRoYXQgaHlwZXJsaW5rIGlkZW50aWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjZWxsIHNlbGVjdGVkIGJ5IHRoZSBwbGF5ZXIuIFRoZSBtb3ZlIGlzIGNvbXBsZXRlZCBieSBnZW5lcmF0aW5nIFwKLQluZXcgSFRNTCBjb250ZW50IGFuZCBpbnZva2luZyBCcm93c2VyLnNldFRleHQgdG8gdXBkYXRlIHRoZSBib2FyZCBnYW1lLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5N2NlNmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MiCi0gICBuYW1lPSIlcGx1Z2luLlNXVEJyb3dzZXJEZW1vcy5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjIwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJCcm93c2VyRGVtby5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJXZpZXcuQnJvd3NlckRlbW9zLm5hbWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MuQnJvd3NlckRlbW8iPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBhbGxvd011bHRpcGxlPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3cy5Ccm93c2VyRGVtb1ZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9wYXduLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJCcm93c2VyIERlbW8iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3MuQnJvd3NlckRlbW9WaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmRlbW9zLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3cy5Ccm93c2VyRGVtb1ZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9Ccm93c2VyRGVtb1BsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL0Jyb3dzZXJEZW1vUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyM2RiZGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL0Jyb3dzZXJEZW1vUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXJEZW1vUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQlwdWJsaWMgc3RhdGljIEJyb3dzZXJEZW1vUGx1Z2luIHBsdWdpbjsKLQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQTFVHSU5fUEFUSCA9IG51bGw7Ci0JCi0JcHVibGljIEJyb3dzZXJEZW1vUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJUExVR0lOX1BBVEggPSBQbGF0Zm9ybS5yZXNvbHZlKHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLiIpKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJyb3dzZXJEZW1vUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBCcm93c2VyRGVtb1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3MvUGF3bnMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9QYXducy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzJmMWU1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9QYXducy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vczsKLQotcHVibGljIGNsYXNzIFBhd25zIHsKLQotCS8qIEN1cnJlbnQgYm9hcmQgcmVwcmVzZW50YXRpb24gaW4gY29tcGFjdGVkIGZvcm0gKi8KLQlieXRlW10gZ2FtZSA9IG5ldyBieXRlWzY0XTsKLQkvKiBCZXN0IG1vdmUgKi8KLQlpbnQgYmVzdEluZGV4ID0gLTE7Ci0JLyogUmVsYXRlZCBiZXN0IHNjb3JlICovCi0JaW50IGJlc3RTY29yZSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCS8qIEVzdGltYXRlZCBzdHJhdGVnaWMgdmFsdWUgb2YgZWFjaCBjZWxsIGJhc2VkIG9uIHByb3hpbWl0eSB0byB3YWxscyAqLwotCXN0YXRpYyBpbnRbXSBnYW1lV2FsbFdlaWdodCA9IG5ldyBpbnRbNjRdOwotCVRocmVhZCB0aHJlYWQgPSBudWxsOwotCWJvb2xlYW4gdGhyZWFkU3RvcCA9IGZhbHNlOwotCQotCWZpbmFsIHN0YXRpYyBieXRlIEVNUFRZID0gMDsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBXSElURSA9IDE7Ci0JZmluYWwgc3RhdGljIGJ5dGUgQkxBQ0sgPSAyOwotCWZpbmFsIHN0YXRpYyBieXRlIFdBTEwgPSAzOwotCQotcHVibGljIFBhd25zKCkgewotfQotCi0vKiBQcm92aWRlIHRoZSBjdXJyZW50IGdhbWUgYW5kIGlnbml0aWF0ZSB0aGUgc2VhcmNoIG9mIHRoZSBiZXN0IG1vdmUgZm9yIHRoZSBnaXZlbiB0eXBlCi0gKiBNdXN0IHJldHVybiBpbW1lZGlhdGVseSBhcyBpdCB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gKiBUaGUgVUkgdGhyZWFkIHdpbGwgZmV0Y2ggdGhlIGJlc3QgbW92ZSBhbnkgdGltZSB0aGVyZWFmdGVyLgotICovCi1wdWJsaWMgdm9pZCBwbGF5UmVxdWVzdChieXRlW11bXSBnYW1lLCBpbnQgdHlwZSkgewotCXRocmVhZFN0b3AgPSB0cnVlOwotCXN5bmNocm9uaXplZCAodGhpcykgewotCQliZXN0SW5kZXggPSAtMTsKLQkJYmVzdFNjb3JlID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0JCWNvbnZlcnQoZ2FtZSwgdGhpcy5nYW1lKTsKLQkJaW5pdFBhd25Cb3JkZXJzKHRoaXMuZ2FtZSwgZ2FtZVdhbGxXZWlnaHQpOwotCQkvKiBRdWlja2x5IGNvbXB1dGUgYSBsZWdhbCBtb3ZlICovCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5nYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5nYW1lW2ldID09IEVNUFRZKSB7Ci0JCQkJYmVzdEluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN5bmNocm9uaXplZChQYXducy50aGlzKSB7Ci0JCQkJCXRocmVhZFN0b3AgPSBmYWxzZTsKLQkJCQkJaW50W10gcmVzdWx0ID0gbmV3IGludFsyXTsKLQkJCQkJLyogaWYgbG9uZyB0aW1lLCBtdXN0IGNoZWNrIGZvciB0aHJlYWRTdG9wIGFuZCBleGl0IGVhcmx5ICovIAotCQkJCQlldmFsQmVzdChQYXducy50aGlzLmdhbWUsIEJMQUNLLCAyLCByZXN1bHQpOwotCQkJCQliZXN0SW5kZXggPSByZXN1bHRbMF07Ci0JCQkJCWJlc3RTY29yZSA9IHJlc3VsdFsxXTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQl9Ci19Ci0KLS8qIEZldGNoIGJlc3QgbW92ZSBpbiBuYXR1cmFsIGNvb3JkaW5hdGVzIGZvciB0aGUgYm9hcmQgcHJldmlvdXNseSBnaXZlbiBpbgotICogdGhlIGNhbGwgdG8gcGxheVJlcXVlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIGdldEJlc3RNb3ZlKGludFtdIHBvaW50KSB7Ci0JY29udmVydChiZXN0SW5kZXgsIHBvaW50KTsKLQl0aHJlYWRTdG9wID0gdHJ1ZTsKLX0KLQotLyogR2l2ZW4gYW4gZXhwYW5kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJvYXJkLCBmb3JtYXQgaW50ZXJuYWwgY29tcGFjdCBtb2RlICovCi1zdGF0aWMgdm9pZCBjb252ZXJ0KGJ5dGVbXVtdIGJvYXJkLCBieXRlW10gZykgewotCWZvciAoaW50IGkgPSAwOyBpIDwgYm9hcmQubGVuZ3RoOyBpKyspIFN5c3RlbS5hcnJheWNvcHkoYm9hcmRbaV0sIDAsIGcsIGkgKiA4LCA4KTsKLX0KLS8qIFVwZGF0ZSBnaXZlbiBjb21wYWN0IG1vZGVsIGJhc2VkIG9uIHBsYXllciBtb3ZlIGluIG5hdHVyYWwgY29vcmRpbmF0ZXMgKi8KLXN0YXRpYyB2b2lkIHNldChieXRlW10gZywgaW50IHgsIGludCB5LCBieXRlIHR5cGUpIHsKLQlnW3gqOCt5XSA9IHR5cGU7Ci19Ci0vKiBHaXZlbiBhbiBpbmRleCBpbiBjb21wYWN0IHJlcHJlc2VudGF0aW9uLCByZXR1cm4gbmF0dXJhbCBjb29yZGluYXRlcyAqLwotc3RhdGljIHZvaWQgY29udmVydChpbnQgaW5kZXgsIC8qb3V0IFswXSB4IFsxXSB5ICovaW50W10gcG9pbnQpIHsKLQlwb2ludFswXSA9IGluZGV4IC8gODsKLQlwb2ludFsxXSA9IGluZGV4ICUgODsKLX0KLS8qIEdpdmVuIGFuIGluZGV4IGludG8gdGhlIGNvbXBhY3QgbW9kZWwgYW5kIHRoZSBuZWlnaGJvdXIgY29kZSwKLSAqIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmcgbmVpZ2hib3VyIGluZGV4LgotICogUmV0dXJucyAtMSBpZiB0aGVyZSBpcyBubyBuZWlnaGJvdXIuCi0gKiAKLSAqIE5laWdoYm91ciBjb2RlIGZvciB0aGUgaW5kZXggWAotICogMCAxIDIKLSAqIDMgWCA0Ci0gKiA1IDYgNyAKLSAqLwotc3RhdGljIGludCBnZXROZWlnaGJvdXJJbmRleChieXRlW10gZywgaW50IGluZGV4LCBpbnQgbmVpZ2hib3VyKSB7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBnLmxlbmd0aCkgcmV0dXJuIC0xOwotCWludCByZXN1bHQgPSAtMTsKLQlzd2l0Y2ggKG5laWdoYm91cikgewotCQljYXNlIDA6IHJlc3VsdCA9IGluZGV4IDwgOCB8fCBpbmRleCAlIDggPT0gMCA/IC0xIDogaW5kZXggLSA5OyBicmVhazsKLQkJY2FzZSAxOiByZXN1bHQgPSBpbmRleCA8IDggPyAtMSA6IGluZGV4IC0gODsgYnJlYWs7Ci0JCWNhc2UgMjogcmVzdWx0ID0gaW5kZXggPCA4IHx8IGluZGV4ICUgOCA9PSA3ID8gLTEgOiBpbmRleCAtIDc7IGJyZWFrOwotCQljYXNlIDM6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSAwID8gLTEgOiBpbmRleCAtIDE7IGJyZWFrOwotCQljYXNlIDQ6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSA3ID8gLTEgOiBpbmRleCArIDE7IGJyZWFrOwotCQljYXNlIDU6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSAwIHx8IGluZGV4ID49IDU2ID8gLTEgOiBpbmRleCArIDc7IGJyZWFrOwotCQljYXNlIDY6IHJlc3VsdCA9IGluZGV4ID49IDU2ID8gLTEgOiBpbmRleCArIDg7IGJyZWFrOwotCQljYXNlIDc6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSA3IHx8IGluZGV4ID49IDU2ID8gLTEgOiBpbmRleCArIDk7IGJyZWFrOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyogTWFrZSB0aGUgcGxheWVyIHR5cGUgcGxheSBhdCBpbmRleCBvbiBnaXZlbiBjb21wYWN0IGJvYXJkIAotICogQ29tcHV0ZSBhbGwgcGF3bnMgdGhhdCBtdXN0IGJlIHJldmVyc2VkLgotICovCi1zdGF0aWMgdm9pZCBwbGF5KGJ5dGVbXSBnLCBpbnQgaW5kZXgsIGJ5dGUgdHlwZSkgewotCWJ5dGUgb3Bwb25lbnRUeXBlID0gdHlwZSA9PSBXSElURSA/IEJMQUNLIDogV0hJVEU7Ci0JZm9yIChpbnQgbmVpZ2hib3VyID0gMDsgbmVpZ2hib3VyIDw9IDc7IG5laWdoYm91cisrKSB7Ci0JCWludCBuSW5kZXggPSBnZXROZWlnaGJvdXJJbmRleChnLCBpbmRleCwgbmVpZ2hib3VyKTsKLQkJaW50W10gcmV2ZXJzaUluZGVjZXMgPSBuZXcgaW50WzZdOwotCQlpbnQgblJldmVyc2kgPSAwOwotCQl3aGlsZSAobkluZGV4ICE9IC0xICYmIG5SZXZlcnNpIDwgNiAmJiBnW25JbmRleF0gPT0gb3Bwb25lbnRUeXBlKSB7Ci0JCQlyZXZlcnNpSW5kZWNlc1tuUmV2ZXJzaV0gPSBuSW5kZXg7Ci0JCQluUmV2ZXJzaSsrOwotCQkJbkluZGV4ID0gZ2V0TmVpZ2hib3VySW5kZXgoZywgbkluZGV4LCBuZWlnaGJvdXIpOwkJCQotCQl9Ci0JCWlmIChuUmV2ZXJzaSA+IDAgJiYgbkluZGV4ICE9IC0xICYmIGdbbkluZGV4XSA9PSB0eXBlKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZXZlcnNpOyBpKyspIGdbcmV2ZXJzaUluZGVjZXNbaV1dID0gdHlwZTsKLQkJfQotCX0KLQlnW2luZGV4XSA9IHR5cGU7Ci19Ci0vKiBFdmFsdWF0ZSB0aGUgZ2l2ZW4gY29tcGFjdCBtb2RlbCBiYXNlZCBvbiBwYXducyBkaXN0cmlidXRpb24gCi0gKiBIaWdoIG1lYW5zIHdoaXRlIGhhcyBhZHZhbnRhZ2UuIEJlbG93IHplcm8gbWVhbnMgYmxhY2sgaGFzIGFkdmFudGFnZS4KLSAqLwotc3RhdGljIGludCBldmFsKGJ5dGVbXSBnKSB7Ci0JaW50IGNudFdoaXRlID0gMCwgY250QmxhY2sgPSAwLCBjbnRFbXB0eSA9IDA7Ci0JaW50IGNudFdoaXRlV2FsbEFkdmFudGFnZSA9IDAsIGNudEJsYWNrV2FsbEFkdmFudGFnZSA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWlmIChnW2ldID09IFdISVRFKSB7Ci0JCQljbnRXaGl0ZSsrOwotCQkJY250V2hpdGVXYWxsQWR2YW50YWdlICs9IGdhbWVXYWxsV2VpZ2h0W2ldOwotCQl9Ci0JCWVsc2UgaWYgKGdbaV0gPT0gQkxBQ0spIHsKLQkJCWNudEJsYWNrKys7Ci0JCQljbnRCbGFja1dhbGxBZHZhbnRhZ2UgKz0gZ2FtZVdhbGxXZWlnaHRbaV07Ci0JCX0KLQkJZWxzZSBpZiAoZ1tpXSA9PSBFTVBUWSkgY250RW1wdHkrKzsKLQl9Ci0JaWYgKGNudEVtcHR5ID09IDApIHsKLQkJaWYgKGNudFdoaXRlID4gY250QmxhY2spIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsgLyogV2hpdGUgd2lucyAqLwotCQlpZiAoY250V2hpdGUgPCBjbnRCbGFjaykgcmV0dXJuIEludGVnZXIuTUlOX1ZBTFVFOyAvKiBCbGFjayB3aW5zICovCi0JCXJldHVybiAwOyAvKiBTdGFsZW1hdGUgKi8KLQl9Ci0JcmV0dXJuIGNudFdoaXRlICsgY250V2hpdGVXYWxsQWR2YW50YWdlIC0gY250QmxhY2sgLSBjbnRCbGFja1dhbGxBZHZhbnRhZ2U7Ci19Ci0KLS8qIFJlY29nbml6ZSBwYXducyBwcm90ZWN0ZWQgYnkgd2FsbHMgb3IgYm9yZGVycyAKLSAqIFRCRCAtIG5vdGUgdGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBmb3IgZWFjaCBjZWxsIGFuZCBzdG9yZWQKLSAqIGluIGEgc2VwYXJhdGUgYnl0ZVtdIGdXYWxsR2FpbgotICogKi8KLXN0YXRpYyB2b2lkIGluaXRQYXduQm9yZGVycyhieXRlW10gZywgaW50W10gZ2FtZVdhbGxXZWlnaHQpIHsKLQkvKiBBIHBhd24gaGFzIDggbmVpZ2hib3VycyBvbiA0IGF4ZXMuCi0JICogU3RyYXRlZ2ljIHBhd25zIGhhdmUgb25lIHNpZGUgb2YgZWFjaCBheGlzIHByb3RlY3RlZCBieSBhIHdhbGwgYW5kIHRoZSBvdGhlcgotCSAqIHNpZGUgbm90IGNsb3NlZCBieSBhIHdhbGwuCi0JICogQSBwYXduIGNhbm5vdCBiZSByZXZlcnNlZCB3aGVuIGVhY2ggb2YgaXRzIDQgYXhlcyBhcmUgcHJvdGVjdGVkIGJ5IGEgd2FsbCBvbgotCSAqIG9uZSBzaWRlLiBQYXducyB0aGF0IGhhdmUgbW9yZSB0aGFuIDQgd2FsbHMgYXJlIGxlc3MgaW50ZXJlc3Rpbmcgc2luY2UgdGhleQotCSAqIGFyZSBub3Qgb3BlbiBlbm91Z2ggdG8gdGhlIGJvYXJkLgotCSAqIAotCSAqIE5iciB3YWxscywgbmJyIGF4aXMgY292ZXJlZCwgZXN0aW1hdGVkIHZhbHVlCi0JICogMCBuL2EgMAotCSAqIDEgMSAyCi0JICogMiAxIDEKLQkgKiAyIDIgNgotCSAqIDMgMiA0Ci0JICogNCAyIDIKLQkgKiAzIDMgOQotCSAqIDQgMyA4Ci0JICogNCA0IDE2Ci0JICogNSA0IDE0Ci0JICogNiA0IDkKLQkgKiA3IDQgNgotCSAqIDggNCAwCi0JICovCi0JaW50W10gblR5cGVzID0gbmV3IGludFs4XTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDY0OyBpKyspIHsKLQkJaW50IG5XYWxscyA9IDA7Ci0JCWludCBuQXhpcyA9IDA7Ci0JCWZvciAoaW50IG4gPSAwOyBuIDwgODsgbisrKSB7Ci0JCQlpbnQgbkluZGV4ID0gZ2V0TmVpZ2hib3VySW5kZXgoZywgaSwgbik7Ci0JCQluVHlwZXNbbl0gPSBuSW5kZXggIT0gLTEgPyBnW25JbmRleF0gOiBXQUxMOwotCQkJaWYgKG5UeXBlc1tuXSA9PSBXQUxMKSBuV2FsbHMrKzsKLQkJfQotCQlpbnQgc2NvcmUgPSBuV2FsbHM7Ci0JCWlmIChuV2FsbHMgPiAwKSB7Ci0JCQlpZiAoblR5cGVzWzBdID09IFdBTEwgfHwgblR5cGVzWzddID09IFdBTEwpIG5BeGlzKys7Ci0JCQlpZiAoblR5cGVzWzFdID09IFdBTEwgfHwgblR5cGVzWzZdID09IFdBTEwpIG5BeGlzKys7Ci0JCQlpZiAoblR5cGVzWzJdID09IFdBTEwgfHwgblR5cGVzWzVdID09IFdBTEwpIG5BeGlzKys7Ci0JCQlpZiAoblR5cGVzWzRdID09IFdBTEwgfHwgblR5cGVzWzNdID09IFdBTEwpIG5BeGlzKys7Ci0JCQlzd2l0Y2ggKG5BeGlzKSB7Ci0JCQkJY2FzZSA0OiBzd2l0Y2ggKG5XYWxscykgeyBjYXNlIDQ6IHNjb3JlID0gMTY7IGJyZWFrOyBjYXNlIDU6IHNjb3JlID0gMTQ7IGJyZWFrOyBjYXNlIDY6IHNjb3JlID0gOTsgY2FzZSA3OiBzY29yZSA9IDY7IGJyZWFrOyBjYXNlIDg6IHNjb3JlID0gMDsgYnJlYWs7fSBicmVhazsKLQkJCQljYXNlIDM6IHN3aXRjaCAobldhbGxzKSB7IGNhc2UgMzogc2NvcmUgPSA5OyBicmVhazsgY2FzZSA0OiBzY29yZSA9IDg7fSBicmVhazsKLQkJCQljYXNlIDI6IHN3aXRjaCAobldhbGxzKSB7IGNhc2UgMjogc2NvcmUgPSA2OyBicmVhazsgY2FzZSAzOiBzY29yZSA9IDQ7IGJyZWFrOyBjYXNlIDQ6IHNjb3JlID0gMjsgfSBicmVhazsKLQkJCQljYXNlIDE6IHN3aXRjaCAobldhbGxzKSB7IGNhc2UgMTogc2NvcmUgPSAyOyBicmVhazsgY2FzZSAyOiBzY29yZSA9IDE7IGJyZWFrO30gYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZ2FtZVdhbGxXZWlnaHRbaV0gPSBzY29yZTsKLQl9Ci19Ci0KLS8qIEV2YWx1YXRlIHRoZSBiZXN0IG1vdmUgZm9yIHBsYXllciB0eXBlIGZvciB0aGUgZ2l2ZW4gYm9hcmQsIGRvaW5nIGEgZGVwdGggMSBzZWFyY2ggKi8KLXN0YXRpYyB2b2lkIGV2YWxCZXN0KGJ5dGVbXSBnLCBieXRlIHR5cGUsIGludCBkZXB0aCwgLyogb3V0IFswXSBiZXN0IG1vdmUsIFsxXSBtaW5pbWF4ICovaW50W10gcmVzdWx0KSB7Ci0JYnl0ZVtdIHRtcCA9IG5ldyBieXRlWzY0XTsKLQlieXRlIG9wcG9uZW50VHlwZSA9IHR5cGUgPT0gV0hJVEUgPyBCTEFDSyA6IFdISVRFOwotCXJlc3VsdFswXSA9IC0xOyByZXN1bHRbMV0gPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDY0OyBpKyspIHsKLQkJaWYgKGdbaV0gPT0gRU1QVFkpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZywgMCwgdG1wLCAwLCA2NCk7Ci0JCQlwbGF5KHRtcCwgaSwgdHlwZSk7Ci0JCQlpbnQgc2NvcmUgPSBldmFsKHRtcCk7Ci0JCQlpZiAoZGVwdGggPiAxKSB7Ci0JCQkJaW50W10gdG1wUmVzdWx0ID0gbmV3IGludFsyXTsKLQkJCQlldmFsQmVzdCh0bXAsIG9wcG9uZW50VHlwZSwgZGVwdGggLSAxLCB0bXBSZXN1bHQpOwotCQkJCXNjb3JlID0gdG1wUmVzdWx0WzFdOwotCQkJfQotCQkJaWYgKCh0eXBlID09IFdISVRFICYmIHNjb3JlID4gcmVzdWx0WzFdKSB8fCAodHlwZSA9PSBCTEFDSyAmJiBzY29yZSA8IHJlc3VsdFsxXSkgfHwgcmVzdWx0WzBdID09IC0xKSB7Ci0JCQkJcmVzdWx0WzBdID0gaTsKLQkJCQlyZXN1bHRbMV0gPSBzY29yZTsKLQkJCX0KLQkJfQotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9Ccm93c2VyRGVtb1ZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9Ccm93c2VyRGVtb1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5M2U3Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvQnJvd3NlckRlbW9WaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXJEZW1vVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlBY3Rpb24gcGF3bkFjdGlvbjsKLQlBY3Rpb24gZWRpdEFjdGlvbjsKLQlDb21wb3NpdGUgcGFyZW50OwotCQotCXB1YmxpYyBCcm93c2VyRGVtb1ZpZXcoKSB7Ci0JfQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRyeSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWJyb3dzZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkpOwotCQkJdGV4dC5zZXRUZXh0KCJCcm93c2VyIHdpZGdldCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiBUaGUgZXhhY3QgZXJyb3IgaXM6XHJcbiIrZSk7Ci0JCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVRhYkZvbGRlciBmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJbmV3IFBhd25UYWIoaXRlbSk7Ci0JCQotCQlpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCW5ldyBFZGl0b3JUYWIoaXRlbSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL0VkaXRvclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL0VkaXRvclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzMTY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9FZGl0b3JUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgRWRpdG9yVGFiIHsKLQlCcm93c2VyIGJyb3dzZXI7Ci0JVGV4dCBodG1sVGV4dCwgc2NyaXB0VGV4dDsKLQlCdXR0b24gaHRtbEJ1dHRvbiwgc2NyaXB0QnV0dG9uOwotCXN0YXRpYyBTdHJpbmcgaHRtbCA9IAotCQkiPGh0bWw+XHJcbiIrCi0JCSIJPGJvZHk+XHJcbiIrCi0JCSIJCTxoMSBpZD0nbXlpZCc+SFRNTCBEb2N1bWVudDwvaDE+XHJcbiIrCi0JCSIJCTxoMj5TZXQgSFRNTCBjb250ZW50PC9oMj5cclxuIisKLQkJIgkJPG9sPlxyXG4iKwotCQkiCQkJPGxpPkVudGVyIGh0bWwgZGF0YSBpbnRvIHRoZSAnc2V0VGV4dCcgcGFuZTwvbGk+XHJcbiIrCi0JCSIJCQk8bGk+Q2xpY2sgb24gJ3NldFRleHQnIHRvIHNldCB0aGUgbmV3IGNvbnRlbnQ8L2xpPlxyXG4iKwotCQkiCQk8L29sPlxyXG4iKwotCQkiCQk8aDI+UXVlcnkgb3IgbW9kaWZ5IEhUTUwgZG9jdW1lbnQ8L2gyPlxyXG4iKwotCQkiCQk8b2w+XHJcbiIrCi0JCSIJCTxsaT5FbnRlciBqYXZhc2NyaXB0IGNvbW1hbmRzIGludG8gdGhlICdleGVjdXRlJyBwYW5lPC9saT5cclxuIisKLQkJIgkJPGxpPkNsaWNrIG9uICdleGVjdXRlJyB0byBydW4gdGhlIGphdmFzY3JpcHQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQ8L2xpPlxyXG4iKwotCQkiCQk8L29sPlxyXG4iKwotCQkiCTwvYm9keT5cclxuIisKLQkJIjwvaHRtbD4iOwotCQotCXN0YXRpYyBTdHJpbmcgc2NyaXB0ID0gCi0JCSJ2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1AnKTtcclxuIisKLQkJInZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0NvbnRlbnQgaW5zZXJ0ZWQhJyk7XHJcbiIrCi0JCSJub2RlLmFwcGVuZENoaWxkKHRleHQpO1xyXG4iKwotCQkiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215aWQnKS5hcHBlbmRDaGlsZChub2RlKTtcclxuXHJcbiIrCi0JCSJkb2N1bWVudC5iZ0NvbG9yID0gJ3llbGxvdyc7IjsKLQkKLQlwdWJsaWMgRWRpdG9yVGFiKFRhYkl0ZW0gaXRlbSkgewotCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShpdGVtLmdldFBhcmVudCgpLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiRWRpdG9yIik7Ci0JCWl0ZW0uc2V0Q29udHJvbChwYXJlbnQpOwotCQkKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaChwYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWZpbmFsIEZvcm1MYXlvdXQgZm9ybSA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQoZm9ybSk7Ci0JCQotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChzYXNoLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWZpbmFsIEZvcm1EYXRhIHNhc2hEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDApOwotCQlzYXNoRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXNhc2hEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlzYXNoLnNldExheW91dERhdGEoc2FzaERhdGEpOwotCQlzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHNhc2guZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIHBhcmVudFJlY3QgPSBzYXNoLmdldFBhcmVudCgpLmdldENsaWVudEFyZWEoKTsKLQkJCQlpbnQgcmlnaHQgPSBwYXJlbnRSZWN0LndpZHRoIC0gcmVjdC53aWR0aCAtIDIwOwotCQkJCWUueCA9IE1hdGgubWF4KE1hdGgubWluKGUueCwgcmlnaHQpLCAyMCk7Ci0JCQkJaWYgKGUueCAhPSByZWN0LngpIHsKLQkJCQkJc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBlLngpOwotCQkJCQlwYXJlbnQubGF5b3V0KCk7Ci0JCQkJfQotCQkJfQkJCQotCQl9KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2FzaCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvKiBJbml0aWFsaXplIFBhbmVsICovCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJR3JvdXAgaHRtbEdyb3VwID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCWh0bWxHcm91cC5zZXRUZXh0KCJzZXRUZXh0Iik7Ci0JCWh0bWxUZXh0ID0gbmV3IFRleHQoaHRtbEdyb3VwLCBTV1QuTVVMVEkpOwotCQlodG1sQnV0dG9uID0gbmV3IEJ1dHRvbihodG1sR3JvdXAsIFNXVC5QVVNIKTsKLQkJaHRtbEJ1dHRvbi5zZXRUZXh0KCJzZXRUZXh0Iik7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWh0bWxHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWh0bWxUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQlodG1sQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlodG1sR3JvdXAubGF5b3V0KCk7Ci0JCQotCQlHcm91cCBzY3JpcHRHcm91cCA9IG5ldyBHcm91cChwYW5lbCwgU1dULk5PTkUpOwotCQlzY3JpcHRHcm91cC5zZXRUZXh0KCJleGVjdXRlIik7Ci0JCXNjcmlwdFRleHQgPSBuZXcgVGV4dChzY3JpcHRHcm91cCwgU1dULk1VTFRJKTsKLQkJc2NyaXB0QnV0dG9uID0gbmV3IEJ1dHRvbihzY3JpcHRHcm91cCwgU1dULlBVU0gpOwotCQlzY3JpcHRCdXR0b24uc2V0VGV4dCgiZXhlY3V0ZSIpOwotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJc2NyaXB0R3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlzY3JpcHRUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQlzY3JpcHRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXNjcmlwdEdyb3VwLmxheW91dCgpOwotCQkKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlodG1sVGV4dC5zZXRUZXh0KGh0bWwpOwotCQlzY3JpcHRUZXh0LnNldFRleHQoc2NyaXB0KTsKLQkJcGFyZW50LmxheW91dCgpOwotCQkKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJV2lkZ2V0IHcgPSBlLndpZGdldDsKLQkJCQlpZiAodyA9PSBodG1sQnV0dG9uKSBicm93c2VyLnNldFRleHQoaHRtbFRleHQuZ2V0VGV4dCgpKTsKLQkJCQlpZiAodyA9PSBzY3JpcHRCdXR0b24pIGJyb3dzZXIuZXhlY3V0ZShzY3JpcHRUZXh0LmdldFRleHQoKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlodG1sQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJc2NyaXB0QnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvUGF3blRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL1Bhd25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEzZjEyZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvUGF3blRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLlBhd25zOwotCi1wdWJsaWMgY2xhc3MgUGF3blRhYiB7Ci0KLQlBY3Rpb24gcGF3bkFjdGlvbjsKLQlBY3Rpb24gZWRpdEFjdGlvbjsKLQkKLQlCcm93c2VyIGJyb3dzZXIgPSBudWxsOwotCVJldmVyc2lMaXN0ZW5lciByZXZlcnNpTGlzdGVuZXI7Ci0KLQlmaW5hbCBzdGF0aWMgaW50IFRZUEVfV0VMQ09NRSA9IDE7Ci0JZmluYWwgc3RhdGljIGludCBUWVBFX1NUQVJUID0gMjsKLQlmaW5hbCBzdGF0aWMgaW50IFRZUEVfQk9BUkQgPSAzOwotCWZpbmFsIHN0YXRpYyBpbnQgVFlQRV9CT0FSRF9PVkVSID0gNDsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMID0gImh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvIjsKLQlzdGF0aWMgU3RyaW5nIFBMVUdJTl9QQVRIID0gQnJvd3NlckRlbW9QbHVnaW4uUExVR0lOX1BBVEg7Ci0Jc3RhdGljIFN0cmluZyBDU1NfRk9MREVSID0gImNzczIiOwotCXN0YXRpYyBTdHJpbmcgVVJMX0NTUyA9IFBMVUdJTl9QQVRIK0NTU19GT0xERVIrIi9zdHlsZS5jc3MiOwotCXN0YXRpYyBTdHJpbmcgVVJMX1dFTENPTUUgPVBMVUdJTl9QQVRIK0NTU19GT0xERVIrIi93ZWxjb21lLmh0bWwiOwotCi0JZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fU1RBUlRfMl9QTEFZRVJTID0gImFjdGlvbnN0YXJ0MnBsYXllcnMiOwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1NUQVJUXzFfUExBWUVSID0gImFjdGlvbnN0YXJ0MXBsYXllciI7Ci0JZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fV0hJVEUgPSAiYWN0aW9ud2hpdGUiOwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX0JMQUNLID0gImFjdGlvbmJsYWNrIjsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9USEVNRSA9ICJhY3Rpb250aGVtZSI7Ci0KLQlzdGF0aWMgYnl0ZVtdW10gZ2FtZSA9IG51bGw7Ci0Jc3RhdGljIGJvb2xlYW4gaXNXaGl0ZSA9IHRydWU7Ci0Jc3RhdGljIGludCBjbnRXaGl0ZSA9IDAsIGNudEJsYWNrID0gMDsKLQlzdGF0aWMgYm9vbGVhbiBjb21wdXRlciA9IGZhbHNlOwotCXN0YXRpYyBpbnQgY3gsIGN5OwotCWZpbmFsIHN0YXRpYyBieXRlIEVNUFRZID0gMDsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBXSElURSA9IDE7Ci0JZmluYWwgc3RhdGljIGJ5dGUgQkxBQ0sgPSAyOwotCWZpbmFsIHN0YXRpYyBieXRlIFdBTEwgPSAzOwotCQotCXN0YXRpYyBQYXducyB0dHIgPSBudWxsOwotCXN0YXRpYyBpbnRbXSBtb3ZlID0gbmV3IGludFsyXTsKLQlzdGF0aWMgTWVudSBtZW51ID0gbnVsbDsKLQkKLQlwdWJsaWMgUGF3blRhYihUYWJJdGVtIGl0ZW0pIHsJCQotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKGl0ZW0uZ2V0UGFyZW50KCksIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpdGVtLnNldFRleHQoIlBhd25zIik7Ci0JCWl0ZW0uc2V0Q29udHJvbChicm93c2VyKTsKLQotCQltZW51ID0gbmV3IE1lbnUoYnJvd3Nlci5nZXRTaGVsbCgpLCBTV1QuUE9QX1VQKTsKLQkJTWVudUl0ZW0gaXRlbTIgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQlpdGVtMi5zZXRUZXh0KCJFbmQgR2FtZSIpOwotCQlpdGVtMi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZ2FtZSA9IG51bGw7Ci0JCQkJaXNXaGl0ZSA9IHRydWU7Ci0JCQkJY250V2hpdGUgPSAwOyBjbnRCbGFjayA9IDA7Ci0JCQkJdHRyID0gbnVsbDsKLQkJCQlicm93c2VyLnNldFVybChVUkxfV0VMQ09NRSk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLnNldE1lbnUobWVudSk7Ci0JCQotCQlyZXZlcnNpTGlzdGVuZXIgPSBuZXcgUmV2ZXJzaUxpc3RlbmVyKCk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihyZXZlcnNpTGlzdGVuZXIpOwotCQlicm93c2VyLnNldFVybChVUkxfV0VMQ09NRSk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRIdG1sKGludCB0eXBlKSB7Ci0JCVN0cmluZyBodG1sID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgVFlQRV9CT0FSRDoKLQkJY2FzZSBUWVBFX0JPQVJEX09WRVI6IHsKLQkJCWh0bWwgPSAiPGh0bWw+PGhlYWRlcj48bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIiIrVVJMX0NTUysiXCI+PC9oZWFkZXI+PGJvZHk+PGRpdiBjbGFzcz1cImJvYXJkXCI+PHRhYmxlPjx0Ym9keT4iOwotCQkJU3RyaW5nIGNsYXNzUGxheWVyV2hpdGUgPSAicGxheWVyd2hpdGUiLCBjbGFzc1BsYXllckJsYWNrID0gInBsYXllcmJsYWNrIjsKLQkJCWlmICh0eXBlID09IFRZUEVfQk9BUkRfT1ZFUikgewotCQkJCWlmIChjbnRXaGl0ZSA+IGNudEJsYWNrKSB7Ci0JCQkJCWNsYXNzUGxheWVyV2hpdGUgKz0gIiB3aW5uZXIiOwotCQkJCQljbGFzc1BsYXllckJsYWNrICs9ICIgbG9zZXIiOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNsYXNzUGxheWVyV2hpdGUgKz0gIiBsb3NlciI7Ci0JCQkJCWNsYXNzUGxheWVyQmxhY2sgKz0gIiB3aW5uZXIiOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyB3aGl0ZSA9ICI8dGQgY2xhc3M9XCJ3aGl0ZVwiLz4iOwotCQkJU3RyaW5nIGJsYWNrID0gIjx0ZCBjbGFzcz1cImJsYWNrXCIvPiI7Ci0JCQlTdHJpbmcgd2FsbCA9ICI8dGQgY2xhc3M9XCJ3YWxsXCIvPiI7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdhbWUubGVuZ3RoOyBpKyspIHsKLQkJCQlodG1sICs9ICI8dHI+IjsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGdhbWVbMF0ubGVuZ3RoOyBqKyspIHsKLQkJCQkJc3dpdGNoIChnYW1lW2ldW2pdKSB7Ci0JCQkJCQljYXNlIEVNUFRZOiB7Ci0JCQkJCQkJU3RyaW5nIGVtcHR5ID0gIjx0ZCBjbGFzcz1cIiIrKGlzV2hpdGUgPyAid2hpdGVsaW5rIiA6ICJibGFja2xpbmsiKSsiXCI+IisgKGlzV2hpdGUgfHwgKCFpc1doaXRlICYmICFjb21wdXRlcikgPyAiPGEgaHJlZj1cIiIrVVJMKyhpc1doaXRlID8gQUNUSU9OX1dISVRFIDogQUNUSU9OX0JMQUNLKSsiL3h4IitpKyJ5eSIraisiXCIgY2xhc3M9XCJlbXB0eVwiLz4iIDogIjxkaXYgY2xhc3M9XCJlbXB0eVwiLz4iKSsiPC90ZD4iOwotCQkJCQkJCWh0bWwgKz0gZW1wdHk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSBXSElURTogaHRtbCArPSB3aGl0ZTsgYnJlYWs7Ci0JCQkJCQljYXNlIEJMQUNLOiBodG1sICs9IGJsYWNrOyBicmVhazsKLQkJCQkJCWNhc2UgV0FMTDogaHRtbCArPSB3YWxsOyBicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlodG1sICs9IjwvdHI+IjsKLQkJCX0KLQkJCWh0bWwgKz0gIjwvdGJvZHk+PC90YWJsZT48L2Rpdj4iOwotCQkJaHRtbCArPSAiPGRpdiBjbGFzcz1cIiIrY2xhc3NQbGF5ZXJXaGl0ZSsiXCI+IitjbnRXaGl0ZSsiPC9kaXY+IjsKLQkJCWh0bWwgKz0gIjxkaXYgY2xhc3M9XCIiK2NsYXNzUGxheWVyQmxhY2srIlwiPiIrY250QmxhY2srIjwvZGl2PiI7Ci0JCQlodG1sICs9ICI8L2JvZHk+PC9odG1sPiI7Ci0JCQlicmVhazsKLQkJfQotCQl9Ci0JCXJldHVybiBodG1sOwotCX0KLQotCXB1YmxpYyBjbGFzcyBSZXZlcnNpTGlzdGVuZXIgaW1wbGVtZW50cyBMb2NhdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGUpIHsKLQkJCXRyeSB7Ci0JCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcillLndpZGdldDsKLQkJCWlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1NUQVJUXzFfUExBWUVSKSAhPSAtMSB8fCBlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1NUQVJUXzJfUExBWUVSUykgIT0gLTEpIHsKLQkJCQljb21wdXRlciA9IGUubG9jYXRpb24uaW5kZXhPZihBQ1RJT05fU1RBUlRfMV9QTEFZRVIpICE9IC0xOwotCQkJCWdhbWUgPSBuZXcgYnl0ZVs4XVs4XTsKLQkJCQlpZiAoY29tcHV0ZXIpIHR0ciA9IG5ldyBQYXducygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSBnYW1lWyhpbnQpKE1hdGgucmFuZG9tKCkqZ2FtZS5sZW5ndGgpXVsoaW50KShNYXRoLnJhbmRvbSgpKmdhbWVbMF0ubGVuZ3RoKV0gPSBXQUxMOwotCQkJCWUuZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlicm93c2VyLnNldFRleHQoZ2V0SHRtbChUWVBFX0JPQVJEKSk7Ci0JCQkJfX0pOwotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1RIRU1FKSAhPSAtMSkgewotCQkJCWludCBpbmRleCA9IGUubG9jYXRpb24uaW5kZXhPZihBQ1RJT05fVEhFTUUpICsgQUNUSU9OX1RIRU1FLmxlbmd0aCgpICsgMTsKLQkJCQlDU1NfRk9MREVSID0gZS5sb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgNCk7Ci0JCQkJVVJMX0NTUyA9IFBMVUdJTl9QQVRIK0NTU19GT0xERVIrIi9zdHlsZS5jc3MiOwotCQkJCVVSTF9XRUxDT01FID0gUExVR0lOX1BBVEgrQ1NTX0ZPTERFUisiL3dlbGNvbWUuaHRtbCI7Ci0JCQkJZS5kaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWJyb3dzZXIuc2V0VXJsKFVSTF9XRUxDT01FKTsKLQkJCQl9fSk7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYnl0ZSBwbGF5ZXIgPSBFTVBUWTsKLQkJCWlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1dISVRFKSAhPSAtMSkgcGxheWVyID0gV0hJVEU7Ci0JCQllbHNlIGlmIChlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX0JMQUNLKSAhPSAtMSkgcGxheWVyID0gQkxBQ0s7Ci0JCQlpZiAocGxheWVyICE9IEVNUFRZKSB7Ci0JCQkJaW50IGluZGV4ID0gZS5sb2NhdGlvbi5pbmRleE9mKCJ4eCIpICsgMjsKLQkJCQlpbnQgeCA9IEludGVnZXIucGFyc2VJbnQoZS5sb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSkpOwotCQkJCWluZGV4ID0gZS5sb2NhdGlvbi5pbmRleE9mKCJ5eSIpICsgMjsKLQkJCQlpbnQgeSA9IEludGVnZXIucGFyc2VJbnQoZS5sb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSkpOwotCQkJCWJvb2xlYW4gaGFzTW9yZSA9IGFkZCh4LCB5LCBwbGF5ZXIpOwotCQkJCWlzV2hpdGUgPSBwbGF5ZXIgIT0gV0hJVEU7Ci0JCQkJYnJvd3Nlci5zZXRUZXh0KGdldEh0bWwoaGFzTW9yZSA/IFRZUEVfQk9BUkQgOiBUWVBFX0JPQVJEX09WRVIpKTsKLQkJCQlpZiAoY29tcHV0ZXIgJiYgaGFzTW9yZSAmJiAhaXNXaGl0ZSkgcGxheShlLmRpc3BsYXksIGJyb3dzZXIsIDUwMDApOwotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJfQotCQkJfWNhdGNoIChFeGNlcHRpb24gZTEgKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkKGludCB4LCBpbnQgeSwgYnl0ZSBjb2xvcikgewotCQlnYW1lW3hdW3ldID0gY29sb3I7Ci0JCWludCBjbnQgPSBNYXRoLm1pbih4LCB5KSwgbiA9IDA7Ci0JCWludCBvdGhlcl9jb2xvciA9IGNvbG9yID09IFdISVRFID8gQkxBQ0sgOiBXSElURTsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3gtZF1beS1kXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4LWRdW3ktZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeC1kXVt5LWRdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0gTWF0aC5taW4oZ2FtZS5sZW5ndGggLSAxIC0geCwgZ2FtZVswXS5sZW5ndGggLSAxIC0geSk7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeCtkXVt5K2RdID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3grZF1beStkXSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4K2RdW3krZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSBNYXRoLm1pbihnYW1lLmxlbmd0aCAtIDEgLSB4LCB5KTsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4K2RdW3ktZF0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeCtkXVt5LWRdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3grZF1beS1kXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IE1hdGgubWluKHgsIGdhbWVbMF0ubGVuZ3RoIC0gMSAtIHkpOyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3gtZF1beStkXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4LWRdW3krZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeC1kXVt5K2RdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0geTsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4XVt5LWRdID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3hdW3ktZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeF1beS1kXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IGdhbWVbMF0ubGVuZ3RoIC0gMSAtIHk7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeF1beStkXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4XVt5K2RdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3hdW3krZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSB4OyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3gtZF1beV0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeC1kXVt5XSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4LWRdW3ldID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0gZ2FtZS5sZW5ndGggLSAxIC0geDsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4K2RdW3ldID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3grZF1beV0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeCtkXVt5XSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0KLQkJYm9vbGVhbiBoYXNNb3JlID0gZmFsc2U7Ci0JCWNudFdoaXRlID0gMDsgY250QmxhY2sgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdhbWUubGVuZ3RoOyBpKyspCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGdhbWVbMF0ubGVuZ3RoOyBqKyspIHsKLQkJCQlzd2l0Y2ggKGdhbWVbaV1bal0pIHsKLQkJCQkJY2FzZSBFTVBUWTogaGFzTW9yZSA9IHRydWU7IGJyZWFrOwotCQkJCQljYXNlIFdISVRFOiBjbnRXaGl0ZSsrOyBicmVhazsKLQkJCQkJY2FzZSBCTEFDSzogY250QmxhY2srKzsgYnJlYWs7Ci0JCQkJfQotCQkJfQotCQlyZXR1cm4gaGFzTW9yZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHBsYXkoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBCcm93c2VyIGJyb3dzZXIsIGludCBkZWxheSkgewotCQl0dHIucGxheVJlcXVlc3QoZ2FtZSwgQkxBQ0spOwotCQlkaXNwbGF5LnRpbWVyRXhlYygzMDAwLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0dHIuZ2V0QmVzdE1vdmUobW92ZSk7Ci0JCQkJCWJvb2xlYW4gaGFzTW9yZSA9IGFkZChtb3ZlWzBdLCBtb3ZlWzFdLCBCTEFDSyk7Ci0JCQkJCWlzV2hpdGUgPSB0cnVlOwotCQkJCQlicm93c2VyLnNldFRleHQoZ2V0SHRtbChoYXNNb3JlID8gVFlQRV9CT0FSRCA6IFRZUEVfQk9BUkRfT1ZFUikpOwotCQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxNGUxNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmQ1ZWU1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzM3YTQ2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gRGVjIDExIDE1OjE0OjQwIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGU2NDRiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0JICAgICAgICAgICAqLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0JICAgICAgIAotc291cmNlLmJyb3dzZXJleGFtcGxlLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2RvYy1odG1sL3N3dF9icm93c2VyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjVlMTgxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2RvYy1odG1sL3N3dF9icm93c2VyX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBDb250cm9scyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gQnJvd3NlcjwvaDI+Ci0KLTxwPgotVGhlIEJyb3dzZXIgRXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuIAotSXQgY29uc2lzdHMgb2YgYSBjb21wb3NpdGUgY29udGFpbmluZyBhIEJyb3dzZXIgd2lkZ2V0IHRvIHJlbmRlciBIVE1MIGFuZCBzb21lCi1hZGRpdGlvbmFsIHdpZGdldHMgdG8gaW1wbGVtZW50IGFjdGlvbnMgY29tbW9ubHkgZm91bmQgb24gYnJvd3NlcnMgKHRvb2xiYXIKLXdpdGggYmFjaywgZm9yd2FyZCwgcmVmcmVzaCBhbmQgc3RvcCBidXR0b25zLCBzdGF0dXMgYmFyIGV0Yy4pLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS5Ccm93c2VyRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+QnJvd3Nlcjwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2ljb25zL2Jyb3dzZXJfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9pY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVlMjIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2ljb25zL2Jyb3dzZXJfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzk3Y2YyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RCcm93c2VyRXhhbXBsZS5uYW1lID0gU1dUIEJyb3dzZXIgRXhhbXBsZSBQbHVnaW4KLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuQnJvd3NlckV4YW1wbGUubmFtZSA9IFdlYiBCcm93c2VyCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUubmFtZSA9IFdlYiBCcm93c2VyCi1sYXVuY2hpdGVtLkJyb3dzZXJFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGludGVncmF0ZSBhIFdlYiBCcm93c2VyIHdpdGggdGhlIFNXVCBCcm93c2VyIHdpZGdldC5cblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgY29tcG9zaXRlIGNvbnRhaW5pbmcgYSBCcm93c2VyIHdpZGdldCB0byByZW5kZXIgSFRNTC4gXAotCUFkZGl0aW9uYWwgd2lkZ2V0cyBhbGxvdyB0aGUgdXNlciB0byBwZXJmb3JtIHR5cGljYWwgYnJvd3NlciBhY3Rpb25zIChmb3IgZXhhbXBsZSwgbmF2aWdhdGUgdG8gYSBwYXJ0aWN1bGFyIFVSTCwgZ28gYmFjaywgZm9yd2FyZCwgcmVmcmVzaCBhbmQgc3RvcCkuCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE1M2ViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyIgotICAgbmFtZT0iJXBsdWdpbi5TV1RCcm93c2VyRXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS5Ccm93c2VyUGx1Z2luIj4KLQotPCEtLSBSdW50aW1lIC0tPgotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJicm93c2VyZXhhbXBsZS5qYXIiPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuQnJvd3NlckV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Jyb3dzZXJfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS5Ccm93c2VyVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8aXRlbQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Jyb3dzZXJfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5Ccm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUudmlld2xhdW5jaGVyIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICB2aWV3SWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS52aWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBlcnNpc3QgcHJvamVjdCBzZXR0aW5ncyBmb3IgbGF0ZXIgaW1wb3J0IAotbmF0dXJlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU7IG9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUKLWJ1aWxkZXJzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyCi12YXIuRUNMSVBTRV9QTFVHSU5TID0gPDxFQ0xJUFNFX1BMVUdJTlM+PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2MTYwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQnJvd3NlclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjZjZTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotCi0vKioKLSAqIDxjb2RlPkJyb3dzZXJWaWV3PC9jb2RlPiBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uCi0gKiBvZiB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LiAgSXQgY29uc2lzdHMgb2YgYSB3b3JrYmVuY2gKLSAqIHZpZXcgYW5kIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgaW4gdGhlIGZvbGRlciBhbGxvd3MgdGhlCi0gKiB1c2VyIHRvIGludGVyYWN0IHdpdGggYSBjb250cm9sLgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2VyVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlCcm93c2VyRXhhbXBsZSBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBleGFtcGxlCi0JICogCi0JICogQHNlZSBWaWV3UGFydCNjcmVhdGVQYXJ0Q29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBmcmFtZSkgewotCQlpbnN0YW5jZSA9IG5ldyBCcm93c2VyRXhhbXBsZShmcmFtZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpbnN0YW5jZS5mb2N1cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBWaWV3IGlzIHRvIGJlIGRpc3Bvc2VkCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YzY4ZWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDdiM2EzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNToxNDoyMSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDVjNzZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotCSAgICAgICAgICAgKi5qYXIKLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotCSAgICAgICAKLXNvdXJjZS5jb250cm9scy5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2NvbnRyb2xzX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2NvbnRyb2xzX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5NDYzMDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIENvbnRyb2xzPC9oMj4KLQotPHA+Ci1UaGUgQ29udHJvbHMgRXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGNvbW1vbiBTV1QgY29udHJvbHMuIAotSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSB1c2VyIAotdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBjb250cm9sLgotVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgZWFjaCBjb250cm9sLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZS5Db250cm9sRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+Q29udHJvbHM8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9kb2MtaHRtbC9zd3RfY3VzdG9tY29udHJvbHNfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9kb2MtaHRtbC9zd3RfY3VzdG9tY29udHJvbHNfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiMGQyNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBDb250cm9scyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gQ3VzdG9tIENvbnRyb2xzPC9oMj4KLQotPHA+Ci1UaGUgQ3VzdG9tIENvbnRyb2xzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBlbXVsYXRlZCBTV1QgY29udHJvbHMuIAotSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSB1c2VyIAotdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBlbXVsYXRlZCBjb250cm9sLgotVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgZWFjaCBjb250cm9sLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZS5DdXN0b21Db250cm9sRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+Q3VzdG9tIENvbnRyb2xzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiZGVlOTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2ljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDdjMGNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBTV1QgQ29udHJvbHMgRXhhbXBsZSBQbHVnaW4KLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBTV1QgQ29udHJvbHMKLXZpZXcuQ3VzdG9tQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBTV1QgQ3VzdG9tIENvbnRyb2xzCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBDb250cm9scwotbGF1bmNoaXRlbS5Db250cm9sc0V4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgbmF0aXZlIFNXVCBjb250cm9scy5cblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBhbGxvd3MgdGhlIHVzZXIgXAotCXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgU1dUIGNvbnRyb2wuIFwKLQlUaGUgdXNlciBjYW4gY2hhbmdlIHN0eWxlcyBhbmQgc2V0dGluZ3MgYW5kIHZpZXcgaG93IHRoaXMgYWZmZWN0cyB0aGUgY29udHJvbC4KLQkKLWxhdW5jaGl0ZW0uQ3VzdG9tQ29udHJvbHNFeGFtcGxlLm5hbWUgPSBDdXN0b20gQ29udHJvbHMKLWxhdW5jaGl0ZW0uQ3VzdG9tQ29udHJvbHNFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGN1c3RvbSBTV1QgY29udHJvbHMuXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgYWxsb3dzIHRoZSB1c2VyIFwKLQl0byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IFNXVCBjdXN0b20gY29udHJvbC4gXAotCVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIHRoZSBjb250cm9sLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI3N2RlZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzIgotICAgbmFtZT0iJXBsdWdpbi5TV1RDb250cm9sc0V4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4xMDAucXVhbGlmaWVyIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMuQ29udHJvbFBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iY29udHJvbHMuamFyIj4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08IS0tIEV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkNvbnRyb2xzRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy5Db250cm9sVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuQ3VzdG9tQ29udHJvbHNFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9jb250cm9sc19leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLkN1c3RvbUNvbnRyb2xWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jdXN0b21jb250cm9scy52aWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5Db250cm9sc0V4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkNvbnRyb2xzRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLnZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQ3VzdG9tQ29udHJvbHNFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmN1c3RvbWNvbnRyb2xzLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY3VzdG9tY29udHJvbHMudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWViNmQ1NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvbnRyb2xQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ29udHJvbFZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhOTUzMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ29udHJvbFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHM7Ci0KLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiA8Y29kZT5Db250cm9sczwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIG5hdGl2ZSBjb250cm9scyBkZWZpbmVkIGJ5IFNXVC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgY29udHJvbC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbFZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgQ29udHJvbEV4YW1wbGUoZnJhbWUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2Uuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0N1c3RvbUNvbnRyb2xWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9DdXN0b21Db250cm9sVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQzMDJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0N1c3RvbUNvbnRyb2xWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIDxjb2RlPkN1c3RvbUNvbnRyb2xzPC9jb2RlPiBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uCi0gKiBvZiB0aGUgY3VzdG9tIGNvbnRyb2xzIGRlZmluZWQgYnkgU1dULiAgSXQgY29uc2lzdHMgb2YgYSB3b3JrYmVuY2gKLSAqIHZpZXcgYW5kIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgaW4gdGhlIGZvbGRlciBhbGxvd3MgdGhlCi0gKiB1c2VyIHRvIGludGVyYWN0IHdpdGggYSBjb250cm9sLgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21Db250cm9sVmlldyBleHRlbmRzIENvbnRyb2xWaWV3IHsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgQ3VzdG9tQ29udHJvbEV4YW1wbGUoZnJhbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGNjN2ZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlYWY4NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTQ6MTEgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjE5ZTQ5OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy8sXAotICAgICAgICAgICAgICAgZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0JICAgICAgICAgICAqLmphcgotCSAgICAgICAgICAgCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0KLXNvdXJjZS5sYXVuY2hlci5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1ZjRmOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gRXhhbXBsZSBMYXVuY2hlcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBFeGFtcGxlIExhdW5jaGVyPC9oMj4KLQotPHA+Ci1UaGUgRXhhbXBsZSBMYXVuY2hlciBpcyB1c2VkIHRvIGxhdW5jaCBTV1QgZXhhbXBsZXMsIHdoaWNoIGNhbiBlaXRoZXIgYmUgV29ya2JlbmNoIHZpZXdzIAotb3Igc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMuCi08L3A+Ci0KLTx1bD4KLTxsaT5Xb3JrYmVuY2ggdmlld3MgYXJlIGV4YW1wbGVzIHRoYXQgYXJlIGludGVncmF0ZWQgaW50byBFY2xpcHNlLiAgV2hlbiB0aGUgbGF1bmNoZXIKLXN0YXJ0cyBhIFdvcmtiZW5jaCB2aWV3LCBpdCBpcyBvcGVuZWQgaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgcGVyc3BlY3RpdmUuCi08bGk+U3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMgYXJlIGxhdW5jaGVkIGluIGEgc2VwYXJhdGUgd2luZG93LgotPC91bD4KLQotPHA+Ci1Gb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHJ1biB0aGUgc3RhbmRhbG9uZSBleGFtcGxlcyB3aXRob3V0IHRoZSBTV1QgRXhhbXBsZSBMYXVuY2hlciwgCi1yZWZlciB0byA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4uCi08L3A+Ci08cD4KLVRoZSBTV1QgV29ya2JlbmNoIHZpZXcgZXhhbXBsZXMgY2FuIGFsc28gYmUgbGF1bmNoZWQgZGlyZWN0bHkgd2l0aG91dCB1c2luZyB0aGUgU1dUIEV4YW1wbGUgCi1MYXVuY2hlci4gIFNXVCBXb3JrYmVuY2ggdmlldyBleGFtcGxlcyBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGNhdGVnb3J5IG9mIHRoZSAKLTxzdHJvbmc+U2hvdyBWaWV3czwvc3Ryb25nPiBkaWFsb2cuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBFeGFtcGxlIExhdW5jaGVyPC9oMz4KLQotPHA+Ci1Gcm9tIEVjbGlwc2UncyA8c3Ryb25nPldpbmRvdzwvc3Ryb25nPiBtZW51LCBzZWxlY3QgPHN0cm9uZz5TaG93IFZpZXcgJmd0OyBPdGhlcjwvc3Ryb25nPi4gCi1JbiB0aGUgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gZGlhbG9nLCBleHBhbmQgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdCB0aGUgPHN0cm9uZz5TV1QgRXhhbXBsZSBMYXVuY2hlcjwvc3Ryb25nPiB2aWV3LiAKLUEgdmlldyBjb250YWluaW5nIGEgbGlzdCBvZiBleGFtcGxlcyB3aWxsIGFwcGVhciBpbiB5b3VyIGN1cnJlbnQgcGVyc3BlY3RpdmUuCi1XaGVuIHlvdSBzZWxlY3QgYW4gZXhhbXBsZSBmcm9tIHRoZSBsaXN0IGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGV4YW1wbGUgaXMgZGlzcGxheWVkLgotQ2xpY2sgb24gdGhlIDxzdHJvbmc+UnVuPC9zdHJvbmc+IGJ1dHRvbiB0byBsYXVuY2ggdGhlIGV4YW1wbGUuCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2Mvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZWRmOTE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2Mvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhFQUQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLTxIVE1MPgotPEJPRFk+Ci08SDE+PENFTlRFUj5MYXVuY2ggSXRlbXM8L0NFTlRFUj48L0gxPgotPEgyPklkZW50aWZpZXI8L0gyPgotb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zPEgyPkRlc2NyaXB0aW9uPC9IMj4KLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gYWRkICdzdGFuZGFsb25lIHByb2dyYW0nIGFuZAotJ1dvcmtiZW5jaCB2aWV3JwotbGF1bmNoIGl0ZW1zIHRvIHRoZSBMYXVuY2hlciwgb3B0aW9uYWxseSBncm91cGluZyB0aGVtIGludG8KLWNhdGVnb3JpZXMgc28gYXMgdG8gZm9ybSBhIG11bHRpLXRpZXJlZCBoaWVyYXJjaHkuCi1TdGFuZGFsb25lIHByb2dyYW1zIGFyZSBleGVjdXRlZCB1c2luZyB0aGUgcGxhdGZvcm0ncyBldmVudCBsb29wLgotV29ya2JlbmNoIHZpZXdzIGFyZSBjcmVhdGVkIHdpdGhpbiB0aGUgYWN0aXZlIFdvcmtiZW5jaCBQZXJzcGVjdGl2ZS48SDI+TWFya3VwPC9IMj4KLTxwPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgZXh0ZW5zaW9uIEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGV4dGVuc2lvbjwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25hbWUmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj5wb2ludDwvYj4gLSA8L2xpPjxsaT48Yj5pZDwvYj4gLSA8L2xpPjxsaT48Yj5uYW1lPC9iPiAtIDwvbGk+PC91bD4KLTxwPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgcHJvZ3JhbSBFTVBUWSZndDs8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBwcm9ncmFtPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO21haW5DbGFzcyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwbHVnaW5JZCZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj5tYWluQ2xhc3M8L2I+IC0gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB3aG9zZSBtYWluKCkgbWV0aG9kIGlzIHRvIGJlIGxhdW5jaGVkLjwvbGk+PGxpPjxiPnBsdWdpbklkPC9iPiAtIFRoZSB1bmlxdWUgaWQgb2YgdGhlIEVjbGlwc2UgUGxhdGZvcm0gcGx1Z2luIGNvbnRhaW5pbmcgdGhlIHByb2dyYW0uPC9saT48L3VsPgotPHA+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCB2aWV3IEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIHZpZXc8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7dmlld0lkJm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmZ3Q7PC9zYW1wPgotPHVsPgotPGxpPjxiPnZpZXdJZDwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSBXb3JrYmVuY2ggVmlldyB0byBiZSBhY3RpdmF0ZWQgd2hlbiB0aGUgaXRlbSBpcyBsYXVuY2hlZC48L2xpPjwvdWw+Ci08cD48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIGNhdGVnb3J5IEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGNhdGVnb3J5PC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2F0ZWdvcnkmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj5uYW1lPC9iPiAtIFRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIGNhdGVnb3J5LjwvbGk+PGxpPjxiPmlkPC9iPiAtIFRoZSB1bmlxdWUgaWQgb2YgdGhpcyBjYXRlZ29yeS4gIENhdGVnb3JpZXMgd2l0aCBkdXBsaWNhdGUgaWQncyB3aWxsIGJlIGRpc2NhcmRlZC48L2xpPjxsaT48Yj5jYXRlZ29yeTwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSBwYXJlbnQgY2F0ZWdvcnkuPC9saT48L3VsPgotPHA+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCBpdGVtIEVNUFRZJmd0Ozwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGl0ZW08L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtjYXRlZ29yeSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ljb24mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtlbmFibGVkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KHRydWUgfCBmYWxzZSkgImZhbHNlIiJ0cnVlIjwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtkZXNjcmlwdGlvbiZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmZ3Q7PC9zYW1wPgotPHVsPgotPGxpPjxiPm5hbWU8L2I+IC0gVGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgbGF1bmNoIGl0ZW0uPC9saT48bGk+PGI+aWQ8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIGxhdW5jaCBpdGVtLiBMYXVuY2ggaXRlbXMgd2l0aCBkdXBsaWNhdGUgaWQncyB3aWxsIGJlIGRpc2NhcmRlZC48L2xpPjxsaT48Yj5jYXRlZ29yeTwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSBjYXRlZ29yeSB0aGlzIGxhdW5jaCBpdGVtIGJlbG9uZ3MgdG8uPC9saT48bGk+PGI+aWNvbjwvYj4gLSBUaGUgZGVjbGFyaW5nIHBsdWdpbiByZWxhdGl2ZSBwYXRoIG9mIGFuIGljb24gdG8gZGlzcGxheSB3aXRoIHRoaXMgbGF1bmNoIGl0ZW0gaW4gdGhlIExhdW5jaGVyLjwvbGk+PGxpPjxiPmVuYWJsZWQ8L2I+IC0gU2V0IHRvICJmYWxzZSIgdG8gZGlzYWJsZSB0aGlzIGxhdW5jaCBpdGVtLCBvciB0byAidHJ1ZSIgdG8gZW5hYmxlIGl0IChkZWZhdWx0KS48L2xpPjxsaT48Yj5kZXNjcmlwdGlvbjwvYj4gLSBUaGUgbG9jYWxpemVkIHBsYWluLXRleHQgZGVzY3JpcHRpb24gb2YgdGhpcyBsYXVuY2ggaXRlbS48L2xpPjwvdWw+Ci08SDI+RXhhbXBsZTwvSDI+Ci08SDI+QVBJIEluZm9ybWF0aW9uPC9IMj4KLTxIMj5TdXBwbGllZCBJbXBsZW1lbnRhdGlvbjwvSDI+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvY2xvc2VkRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9jbG9zZWRGb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWI2ZWQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9jbG9zZWRGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2dlbmVyaWNfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvZ2VuZXJpY19leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjlmYjZiMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvZ2VuZXJpY19leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9sYXVuY2hlcl9leGFtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9sYXVuY2hlcl9leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FiNGQzMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvbGF1bmNoZXJfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvb3BlbkZvbGRlci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvb3BlbkZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5Yzc3NzM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9vcGVuRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWEwM2FhMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVExhdW5jaGVyRXhhbXBsZS5uYW1lID0gU1dUIExhdW5jaGVyIEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkxhdW5jaGVyRXhhbXBsZS5uYW1lID0gU1dUIEV4YW1wbGUgTGF1bmNoZXIKLQotZXh0ZW5zaW9uLXBvaW50LmxhdW5jaEl0ZW1zLm5hbWUgPSBMYXVuY2ggSXRlbXMKLQotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUgPSBXb3JrYmVuY2ggVmlld3MKLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgdGhhdCBydW4gYXMgVmlld3MgaW5zaWRlIHRoZSBXb3JrYmVuY2guICBcCi0JVGhlc2UgZXhhbXBsZXMgd2lsbCBjcmVhdGUgYSBuZXcgVmlldyBpbiB0aGUgY3VycmVudCBQZXJzcGVjdGl2ZS4KLQotbGF1bmNoaXRlbS5MYXVuY2hlckV4YW1wbGUubmFtZSA9IExhdW5jaGVyCi1sYXVuY2hpdGVtLkxhdW5jaGVyRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgRXhhbXBsZSBMYXVuY2hlciBpcyB1c2VkIHRvIGxhdW5jaCBTV1QgZXhhbXBsZXMgd2hpY2ggY2FuIGVpdGhlciBiZSBcCi0JV29ya2JlbmNoIFZpZXdzLCBvciBTdGFuZGFsb25lIGFwcGxpY2F0aW9ucy5cblxuXAotCVdvcmtiZW5jaCBWaWV3cyBhcmUgZXhhbXBsZXMgdGhhdCBhcmUgaW50ZWdyYXRlZCBpbnRvIEVjbGlwc2UuICBXaGVuIHRoZSBMYXVuY2hlciBcCi0Jc3RhcnRzIGEgV29ya2JlbmNoIFZpZXcsIGl0IGlzIG9wZW5lZCBpbiB0aGUgY3VycmVudGx5IGFjdGl2ZSBwZXJzcGVjdGl2ZS5cblxuXAotCVN0YW5kYWxvbmUgYXBwbGljYXRpb25zIGFyZSBsYXVuY2hlZCBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KLQotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi1lcnJvci5Db3VsZE5vdEZpbmRSZWdpc3RlcmVkRXh0ZW5zaW9ucyA9IENvdWxkIE5vdCBGaW5kIFJlZ2lzdGVyZWQgRXh0ZW5zaW9ucwotZXJyb3IuSW5jb21wbGV0ZVByb2dyYW1MYXVuY2hJdGVtID0gSW5jb21wbGV0ZSBYTUwgUHJvZ3JhbUxhdW5jaEl0ZW0gZGVmaW5pdGlvbiwgaWQgPSB7MH0KLWVycm9yLkluY29tcGxldGVWaWV3TGF1bmNoSXRlbSA9IEluY29tcGxldGUgWE1MIFZpZXdMYXVuY2hJdGVtIGRlZmluaXRpb24sIGlkID0gezB9Ci1lcnJvci5JbmNvbXBsZXRlTGF1bmNoSXRlbSA9IEluY29tcGxldGUgb3IgdW5yZWNvZ25pemVkIFhNTCBMYXVuY2hJdGVtIGRlZmluaXRpb24sIGlkID0gezB9Ci0KLWxhdW5jaGl0ZW0uTnVsbC5kZXNjcmlwdGlvbiA9IDw8bm8gaXRlbSBzZWxlY3RlZD4+Ci0KLWxhdW5jaGl0ZW0uTWlzc2luZy5uYW1lID0gPDx1bm5hbWVkPj4KLWxhdW5jaGl0ZW0uTWlzc2luZy5kZXNjcmlwdGlvbiA9IDw8bm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlPj4KLQotdmlldy5sYXVuY2hHcm91cC50ZXh0ID0gRXhhbXBsZXMKLXZpZXcubGF1bmNoQnV0dG9uLnRleHQgPSBSdW4KLXZpZXcuZGVzY3JpcHRpb25Hcm91cC50ZXh0ID0gRGVzY3JpcHRpb24KLQotcnVuLmVycm9yLkludm9jYXRpb24gPSBBIGZhdGFsIGVycm9yIG9jY3VycmVkIHdoaWxlIGxhdW5jaGluZyB0aGUgcHJvZ3JhbS4KLXJ1bi5lcnJvci5Eb2VzTm90SW1wbGVtZW50TWV0aG9kID0gVGhlIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlbigpIG1ldGhvZC4KLXJ1bi5lcnJvci5Db3VsZE5vdEZpbmRDbGFzcyA9IENvdWxkIG5vdCBmaW5kIHRoZSBjbGFzcyB0byBydW4uCi1ydW4uZXJyb3IuQ291bGROb3RJbnN0YW50aWF0ZUNsYXNzID0gQ291bGQgbm90IGluc3RhbnRpYXRlIHRoZSBjbGFzcyB0byBydW4uCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjM2I4MmIyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIiCi0gICBuYW1lPSIlcGx1Z2luLlNXVExhdW5jaGVyRXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5MYXVuY2hlclBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGF1bmNoZXIuamFyIj4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmJvb3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJsYXVuY2hJdGVtcyIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5sYXVuY2hJdGVtcy5uYW1lIiBzY2hlbWE9InNjaGVtYS9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuZXhzZCIvPgotCi08IS0tIEV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5MYXVuY2hlckV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2xhdW5jaGVyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIuTGF1bmNoZXJWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci52aWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5MYXVuY2hlckV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGVuYWJsZWQ9ImZhbHNlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvbGF1bmNoZXJfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uTGF1bmNoZXJFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc2NoZW1hL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5leHNkIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NjaGVtYS9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiN2Q4Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc2NoZW1hL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyIiBpZD0ibGF1bmNoSXRlbXMiIG5hbWU9IkxhdW5jaCBJdGVtcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCAmYXBvcztzdGFuZGFsb25lIHByb2dyYW0mYXBvczsgYW5kCi0mYXBvcztXb3JrYmVuY2ggdmlldyZhcG9zOwotbGF1bmNoIGl0ZW1zIHRvIHRoZSBMYXVuY2hlciwgb3B0aW9uYWxseSBncm91cGluZyB0aGVtIGludG8KLWNhdGVnb3JpZXMgc28gYXMgdG8gZm9ybSBhIG11bHRpLXRpZXJlZCBoaWVyYXJjaHkuCi1TdGFuZGFsb25lIHByb2dyYW1zIGFyZSBleGVjdXRlZCB1c2luZyB0aGUgcGxhdGZvcm0mYXBvcztzIGV2ZW50IGxvb3AuCi1Xb3JrYmVuY2ggdmlld3MgYXJlIGNyZWF0ZWQgd2l0aGluIHRoZSBhY3RpdmUgV29ya2JlbmNoIFBlcnNwZWN0aXZlLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2F0ZWdvcnkiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaXRlbSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2dyYW0iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyBhICZxdW90O1N0YW5kYWxvbmUgUHJvZ3JhbSZxdW90OyBmb3IgYSBsYXVuY2ggaXRlbSB0byBydW4uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im1haW5DbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHdob3NlIG1haW4oKSBtZXRob2QgaXMgdG8gYmUgbGF1bmNoZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGx1Z2luSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgRWNsaXBzZSBQbGF0Zm9ybSBwbHVnaW4gY29udGFpbmluZyB0aGUgcHJvZ3JhbS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmlldyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3BlY2lmaWVzIGEgJnF1b3Q7V29ya2JlbmNoIFZpZXcmcXVvdDsgZm9yIGEgbGF1bmNoIGl0ZW0gdG8gYWN0aXZhdGUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXdJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBXb3JrYmVuY2ggVmlldyB0byBiZSBhY3RpdmF0ZWQgd2hlbiB0aGUgaXRlbSBpcyBsYXVuY2hlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2F0ZWdvcnkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyBhIGxhdW5jaCBpdGVtIGNhdGVnb3J5IGhlYWRpbmcuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgY2F0ZWdvcnkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIGNhdGVnb3J5LiAgQ2F0ZWdvcmllcyB3aXRoIGR1cGxpY2F0ZSBpZCZhcG9zO3Mgd2lsbCBiZSBkaXNjYXJkZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcGFyZW50IGNhdGVnb3J5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIGxhdW5jaCBpdGVtIGNhdGVnb3J5IGRlc2NyaXB0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpdGVtIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgYSBsYXVuY2ggaXRlbS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZpZXciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvZ3JhbSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgbGF1bmNoIGl0ZW0uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIGxhdW5jaCBpdGVtLiBMYXVuY2ggaXRlbXMgd2l0aCBkdXBsaWNhdGUgaWQmYXBvcztzIHdpbGwgYmUgZGlzY2FyZGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGNhdGVnb3J5IHRoaXMgbGF1bmNoIGl0ZW0gYmVsb25ncyB0by4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZWNsYXJpbmcgcGx1Z2luIHJlbGF0aXZlIHBhdGggb2YgYW4gaWNvbiB0byBkaXNwbGF5IHdpdGggdGhpcyBsYXVuY2ggaXRlbSBpbiB0aGUgTGF1bmNoZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU2V0IHRvICZxdW90O2ZhbHNlJnF1b3Q7IHRvIGRpc2FibGUgdGhpcyBsYXVuY2ggaXRlbSwgb3IgdG8gJnF1b3Q7dHJ1ZSZxdW90OyB0byBlbmFibGUgaXQgKGRlZmF1bHQpLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBsb2NhbGl6ZWQgcGxhaW4tdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGlzIGxhdW5jaCBpdGVtLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQxZGFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBlcnNpc3QgcHJvamVjdCBzZXR0aW5ncyBmb3IgbGF0ZXIgaW1wb3J0IAotbmF0dXJlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU7IG9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUKLWJ1aWxkZXJzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyCi12YXIuRUNMSVBTRV9QTFVHSU5TID0gPDxFQ0xJUFNFX1BMVUdJTlM+PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvSXRlbURlc2NyaXB0b3IuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0l0ZW1EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjMTA1ZjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvSXRlbURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBJdGVtRGVzY3JpcHRvciBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCBhIGxhdW5jaCBpdGVtLgotICovCi1jbGFzcyBJdGVtRGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIEltYWdlICBpY29uOwotCXByaXZhdGUgU3RyaW5nIHZpZXc7Ci0JcHJpdmF0ZSBTdHJpbmcgbWFpblR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQkKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuIEl0ZW1EZXNjcmlwdG9yLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBpZAotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIHRoZSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBpY29uIHRoZSBpY29uCi0JICogQHBhcmFtIHZpZXcgdGhlIGhvc3QgdmlldyBtYXkgYmUgbnVsbCBpZiBpdCBpcyBhIHN0YW5kYWxvbmUgYXBwbGljYXRpb24KLQkgKiBAcGFyYW0gbWFpblR5cGUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHRvIHJ1biBtYXkgYmUgbnVsbCBpZiBpdCBpcyBhIHZpZXcKLQkgKiBAcGFyYW0gcGx1Z2luSWQgdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB3aGljaCBjb250YWlucyB0aGUgbWFpbiBjbGFzcwotCSAqLwotCXB1YmxpYyBJdGVtRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCUltYWdlIGljb24sIFN0cmluZyB2aWV3LCBTdHJpbmcgbWFpblR5cGUsIFN0cmluZyBwbHVnaW5JZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCXRoaXMuaWNvbiA9IGljb247Ci0JCXRoaXMudmlldyA9IHZpZXc7Ci0JCXRoaXMubWFpblR5cGUgPSBtYWluVHlwZTsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGV4dGVuc2lvbidzIHNwZWNpZmllZCB0eXBlLAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHR5cGUgd2FzIHNwZWNpZmllZCBieSB0aGUgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGV4dGVuc2lvbidzIHNwZWNpZmllZCB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVJdGVtSW5zdGFuY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBudWxsOwotCQlyZXR1cm4gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKExhdW5jaGVyUGx1Z2luLkxBVU5DSF9JVEVNU19YTUxfUFJPR1JBTV9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgZm9yIHRoaXMgcHJvZ3JhbS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHVzZXItc3BlY2lmaWVkIElEIGZvciB0aGlzIHByb2dyYW0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRyYW5zbGF0ZWQgbmFtZSBmb3IgdGhlIHByb2dyYW0uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzaG9ydCBkZXNjcmlwdGlvbiBmb3IgdGhlIHByb2dyYW0uCi0JICogCi0JICogQHJldHVybiBhIG5ld2xpbmUtZGVsaW1pdGVkIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwcm9ncmFtLCBudWxsIGlmIG5vIGRlc2NyaXB0aW9uIGlzIGF2YWlsYWJsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGljb24gZm9yIHRoaXMgZGVzY3JpcHRvcgotCSAqIAotCSAqIEByZXR1cm5zIGFuIGljb24sIG51bGwgaWYgdGhlIGl0ZW0gaXMgYSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpIHsKLQkJcmV0dXJuIGljb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhvc3QgdmlldyBmb3IgdGhlIHByb2dyYW0uCi0JICogCi0JICogQHJldHVybiB0aGUgaG9zdCB2aWV3LCBudWxsIGlmIHRoZSBpdGVtIGlzIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmlldyAoKSB7Ci0JCXJldHVybiB2aWV3OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgdG8gcnVuCi0JICogZm9yIHRoZSBwcm9ncmFtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNsYXNzIHRvIHJ1biBmb3IgdGhlIHByb2dyYW0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYWluVHlwZSAoKSB7Ci0JCXJldHVybiBtYWluVHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luIHRoYXQgY29udGFpbnMgdGhlIHByb2dyYW0uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luIHRoYXQgY29udGFpbnMgdGhlIHByb2dyYW0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCAoKSB7Ci0JCXJldHVybiBwbHVnaW5JZDsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBhbiBpdGVtIGlzIGEgZm9sZGVyLgotCSAqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBpdGVtIGlzIGEgZm9sZGVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb2xkZXIoKSB7Ci0JCXJldHVybiAobWFpblR5cGUgPT0gbnVsbCAmJiB2aWV3ID09IG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHRoZSBlcXVhbGl0eSBvZiBkZXNjcmlwdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcy5nZXRJZCgpLmVxdWFsc0lnbm9yZUNhc2Uob3RoZXIuZ2V0SWQoKSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCWlmIChvdGhlciBpbnN0YW5jZW9mIEl0ZW1EZXNjcmlwdG9yKSB7Ci0JCQlJdGVtRGVzY3JpcHRvciBvdGhlckRlc2NyaXB0b3IgPSAoSXRlbURlc2NyaXB0b3IpIG90aGVyOwotCQkJcmV0dXJuIGdldElkKCkuZXF1YWxzSWdub3JlQ2FzZShvdGhlckRlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBQcm9kdWNlcyBhIGhhc2hjb2RlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhhc2hjb2RlCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGlkLnRvVXBwZXJDYXNlKCkuaGFzaENvZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9JdGVtVHJlZU5vZGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0l0ZW1UcmVlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjAzMGE1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0l0ZW1UcmVlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjsKLQotCi0vKioKLSAqIEludGVybmFsIGNsYXNzIHVzZWQgdG8gc3RvcmUgdHJlZSBzdHJ1Y3R1cmVzIG9mIEl0ZW1EZXNjcmlwdG9ycwotICovCi1jbGFzcyBJdGVtVHJlZU5vZGUgewotCXByaXZhdGUgSXRlbVRyZWVOb2RlIG5leHRTaWJsaW5nOwotCXByaXZhdGUgSXRlbVRyZWVOb2RlIGZpcnN0Q2hpbGQ7Ci0JcHJpdmF0ZSBJdGVtRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIGxlYWYgSXRlbVRyZWVOb2RlIHdpdGggYSBnaXZlbiBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yIHRoZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEl0ZW1UcmVlTm9kZShJdGVtRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5vZGUgdG8gdGhlIFRyZWUgaW4gc29ydGVkIG9yZGVyIGJ5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gYWRkLiBOb3RlIHRoYXQgbm9kZS5uZXh0U2libGluZyBtdXN0IGJlIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTb3J0ZWROb2RlKEl0ZW1UcmVlTm9kZSBub2RlKSB7Ci0JCWlmIChmaXJzdENoaWxkID09IG51bGwpIHsKLQkJCWZpcnN0Q2hpbGQgPSBub2RlOwotCQl9IGVsc2UgaWYgKGZpcnN0Q2hpbGQuZGVzY3JpcHRvci5nZXROYW1lKCkuY29tcGFyZVRvKG5vZGUuZGVzY3JpcHRvci5nZXROYW1lKCkpID4gMCkgewotCQkJbm9kZS5uZXh0U2libGluZyA9IGZpcnN0Q2hpbGQ7Ci0JCQlmaXJzdENoaWxkID0gbm9kZTsKLQkJfSBlbHNlIHsKLQkJCUl0ZW1UcmVlTm9kZSBjdXJzb3I7Ci0JCQlmb3IgKGN1cnNvciA9IGZpcnN0Q2hpbGQ7IGN1cnNvci5uZXh0U2libGluZyAhPSBudWxsOyBjdXJzb3IgPSBjdXJzb3IubmV4dFNpYmxpbmcpIHsKLQkJCQlJdGVtVHJlZU5vZGUgc2libGluZyA9IGN1cnNvci5uZXh0U2libGluZzsKLQkJCQlpZiAoc2libGluZy5kZXNjcmlwdG9yLmdldE5hbWUoKS5jb21wYXJlVG8obm9kZS5kZXNjcmlwdG9yLmdldE5hbWUoKSkgPiAwKSBicmVhazsKLQkJCX0KLQkJCW5vZGUubmV4dFNpYmxpbmcgPSBjdXJzb3IubmV4dFNpYmxpbmc7Ci0JCQljdXJzb3IubmV4dFNpYmxpbmcgPSBub2RlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEl0ZW1EZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgc2libGluZyBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV4dCBzaWJsaW5nLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgSXRlbVRyZWVOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gbmV4dFNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgSXRlbVRyZWVOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiBmaXJzdENoaWxkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjY0MWJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIExhdW5jaGVyUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExhdW5jaGVyUGx1Z2luIHBsdWdpbjsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCi0JCUxBVU5DSF9JVEVNU19QT0lOVF9JRCA9ICJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0NBVEVHT1JZID0gImNhdGVnb3J5IiwKLQkJTEFVTkNIX0lURU1TX1hNTF9JVEVNID0gIml0ZW0iLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0lURU1fSUNPTiA9ICJpY29uIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9JVEVNX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNID0gInByb2dyYW0iLAotCQlMQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU1fUExVR0lOID0gInBsdWdpbklkIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNX0NMQVNTID0gIm1haW5DbGFzcyIsCi0JCUxBVU5DSF9JVEVNU19YTUxfVklFVyA9ICJ2aWV3IiwKLQkJTEFVTkNIX0lURU1TX1hNTF9WSUVXX1ZJRVdJRCA9ICJ2aWV3SWQiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9JRCA9ICJpZCIsCi0JCUxBVU5DSF9JVEVNU19YTUxfQVRUUklCX05BTUUgPSAibmFtZSIsCi0JCUxBVU5DSF9JVEVNU19YTUxfQVRUUklCX0VOQUJMRUQgPSAiZW5hYmxlZCIsCi0JCUxBVU5DSF9JVEVNU19YTUxfQVRUUklCX0NBVEVHT1JZID0gImNhdGVnb3J5IiwKLQkJTEFVTkNIX0lURU1TX1hNTF9WQUxVRV9UUlVFID0gInRydWUiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX1ZBTFVFX0ZBTFNFID0gImZhbHNlIjsJCQotCi0Jc3RhdGljIGZpbmFsIGludAotCQlsaUNsb3NlZEZvbGRlciA9IDAsCi0JCWxpT3BlbkZvbGRlciA9IDEsCi0JCWxpR2VuZXJpY0V4YW1wbGUgPSAyOwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbWFnZUxvY2F0aW9ucyA9IHsKLQkJImljb25zL2Nsb3NlZEZvbGRlci5naWYiLAotCQkiaWNvbnMvb3BlbkZvbGRlci5naWYiLAotCQkiaWNvbnMvZ2VuZXJpY19leGFtcGxlLmdpZiIgfTsKLQlzdGF0aWMgSW1hZ2UgaW1hZ2VzW107Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIHRoZSBMYXVuY2hlclBsdWdpbi4KLQkgKi8KLQlwdWJsaWMgTGF1bmNoZXJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHJlc291cmNlQnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoZ2V0QnVuZGxlKCkpOwotICAgIH0KLSAgICAKLQkvKioKLQkgKiBDbGVhbiB1cAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZnJlZVJlc291cmNlcygpOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExhdW5jaGVyUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHJlc291cmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0UmVzb3VyY2VzKCkgewotCQlpZiAoaW1hZ2VzID09IG51bGwpIHsKLQkJCWltYWdlcyA9IG5ldyBJbWFnZVtpbWFnZUxvY2F0aW9ucy5sZW5ndGhdOwotCQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCWltYWdlc1tpXSA9IGdldEltYWdlRnJvbVBsdWdpbihwbHVnaW4uZ2V0QnVuZGxlKCksIGltYWdlTG9jYXRpb25zW2ldKTsKLQkJCQlpZiAoaW1hZ2VzW2ldID09IG51bGwpIHsKLQkJCQkJZnJlZVJlc291cmNlcygpOwotCQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzIiksIG51bGwpOwotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQotCS8qKgotCSAqIEZyZWVzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpbWFnZXMgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB0ZXh0Ci0JICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcGx1Z2luLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKAotCQkJSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci0KLQkvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbGlzdCBvZiBhdmFpbGFibGUgcHJvZ3JhbXMgZnJvbSByZWdpc3RlcmVkIGV4dGVuc2lvbnMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBJdGVtVHJlZU5vZGUgcmVwcmVzZW50aW5nIHRoZSByb290IG9mIGEgdHJlZSBvZiBpdGVtcyAodGhlIHJvb3QgaXMgbm90IHRvIGJlIGRpc3BsYXllZCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZW1UcmVlTm9kZSBnZXRMYXVuY2hJdGVtVHJlZSgpIHsKLQkJSXRlbVRyZWVOb2RlIGNhdGVnb3J5VHJlZSA9Ci0JCQluZXcgSXRlbVRyZWVOb2RlKG5ldyBJdGVtRGVzY3JpcHRvcigiPDxSb290Pj4iLCAiPDxSb290Pj4iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKSk7Ci0KLQkJLy8gZ2V0IHRoZSBwbGF0Zm9ybSdzIHB1YmxpYyBwbHVnaW4gcmVnaXN0cnkKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJLy8gcmV0cmlldmUgYWxsIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgcmVnaXN0ZXJlZCBhdCBvdXIgbGF1bmNoSXRlbXMgZXh0ZW5zaW9uLXBvaW50Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9Ci0JCQlleHRlbnNpb25SZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoTEFVTkNIX0lURU1TX1BPSU5UX0lEKTsKLQkJCQotCQlpZiAoY29uZmlndXJhdGlvbkVsZW1lbnRzID09IG51bGwgfHwgY29uZmlndXJhdGlvbkVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RGaW5kUmVnaXN0ZXJlZEV4dGVuc2lvbnMiKSwgbnVsbCk7Ci0JCQlyZXR1cm4gY2F0ZWdvcnlUcmVlOwotCQl9Ci0JCQotCQkvKiBDb2xsZWN0IGFsbCBsYXVuY2ggY2F0ZWdvcmllcyAtLSBjb2FsZXNjZSB0aG9zZSB3aXRoIHNhbWUgSUQgKi8KLQkJSGFzaE1hcCBpZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbkVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgPSBjb25maWd1cmF0aW9uRWxlbWVudHNbaV07Ci0JCQlmaW5hbCBTdHJpbmcgY2VOYW1lID0gY2UuZ2V0TmFtZSgpOwotCQkJZmluYWwgU3RyaW5nIGF0dHJpYklkID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfSUQsIG51bGwpOwotCQkJCi0JCQlpZiAoaWRNYXAuY29udGFpbnNLZXkoYXR0cmliSWQpKSBjb250aW51ZTsKLQkJCWlmIChjZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShMQVVOQ0hfSVRFTVNfWE1MX0NBVEVHT1JZKSkgewotCQkJCWZpbmFsIFN0cmluZyBhdHRyaWJOYW1lID0gZ2V0SXRlbU5hbWUoY2UpOyAKLQkJCQlJdGVtRGVzY3JpcHRvciB0aGVEZXNjcmlwdG9yID0gbmV3IEl0ZW1EZXNjcmlwdG9yKGF0dHJpYklkLCBhdHRyaWJOYW1lLAotCQkJCQlnZXRJdGVtRGVzY3JpcHRpb24oY2UpLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBjZSk7Ci0JCQkJaWRNYXAucHV0KGF0dHJpYklkLCBuZXcgSXRlbVRyZWVOb2RlKHRoZURlc2NyaXB0b3IpKTsKLQkJCX0KLQkJfQotCQkKLQkJLyogR2VuZXJhdGUgbGF1bmNoIGNhdGVnb3J5IGhpZXJhcmNoeSAqLwotCQlTZXQgdGVtcElkU2V0ID0gbmV3IEhhc2hTZXQoKTsgLy8gdXNlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZXMgZnJvbSBiZWluZyBlbnRlcmVkIGludG8gdGhlIHRyZWUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uRWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA9IGNvbmZpZ3VyYXRpb25FbGVtZW50c1tpXTsKLQkJCWZpbmFsIFN0cmluZyBjZU5hbWUgPSBjZS5nZXROYW1lKCk7Ci0JCQlmaW5hbCBTdHJpbmcgYXR0cmliSWQgPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9JRCwgbnVsbCk7Ci0JCQkKLQkJCWlmICh0ZW1wSWRTZXQuY29udGFpbnMoYXR0cmliSWQpKSBjb250aW51ZTsKLQkJCWlmIChjZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShMQVVOQ0hfSVRFTVNfWE1MX0NBVEVHT1JZKSkgewotCQkJCWZpbmFsIEl0ZW1UcmVlTm9kZSB0aGVOb2RlID0gKEl0ZW1UcmVlTm9kZSkgaWRNYXAuZ2V0KGF0dHJpYklkKTsKLQkJCQlhZGRJdGVtQnlDYXRlZ29yeShjZSwgY2F0ZWdvcnlUcmVlLCB0aGVOb2RlLCBpZE1hcCk7Ci0JCQkJdGVtcElkU2V0LmFkZChhdHRyaWJJZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIEdlbmVyYXRlIHByb2dyYW0gdHJlZSAqLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25FbGVtZW50cy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlID0gY29uZmlndXJhdGlvbkVsZW1lbnRzW2ldOwotCQkJZmluYWwgU3RyaW5nIGNlTmFtZSA9IGNlLmdldE5hbWUoKTsKLQkJCWZpbmFsIFN0cmluZyBhdHRyaWJJZCA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX0lELCBudWxsKTsKLQotCQkJaWYgKGlkTWFwLmNvbnRhaW5zS2V5KGF0dHJpYklkKSkgY29udGludWU7Ci0JCQlpZiAoY2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9DQVRFR09SWSkpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0gZWxzZSBpZiAoY2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9JVEVNKSkgewotCQkJCWZpbmFsIFN0cmluZyBlbmFibGVkID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfRU5BQkxFRCwgCi0JCQkJCUxBVU5DSF9JVEVNU19YTUxfVkFMVUVfVFJVRSk7Ci0JCQkJaWYgKGVuYWJsZWQuZXF1YWxzSWdub3JlQ2FzZShMQVVOQ0hfSVRFTVNfWE1MX1ZBTFVFX0ZBTFNFKSkgY29udGludWU7Ci0JCQkJSXRlbURlc2NyaXB0b3IgdGhlRGVzY3JpcHRvciA9IGNyZWF0ZUl0ZW1EZXNjcmlwdG9yKGNlLCBhdHRyaWJJZCk7CQkJCQotCQkJCi0JCQkJaWYgKHRoZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQlmaW5hbCBJdGVtVHJlZU5vZGUgdGhlTm9kZSA9IG5ldyBJdGVtVHJlZU5vZGUodGhlRGVzY3JpcHRvcik7Ci0JCQkJCWFkZEl0ZW1CeUNhdGVnb3J5KGNlLCBjYXRlZ29yeVRyZWUsIHRoZU5vZGUsIGlkTWFwKTsKLQkJCQkJaWRNYXAucHV0KGF0dHJpYklkLCB0aGVOb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGVnb3J5VHJlZTsKLQl9Ci0KLQkJCQkKLQkvKioKLQkgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGNhdGVnb3J5IHRyZWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRJdGVtQnlDYXRlZ29yeShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UsIEl0ZW1UcmVlTm9kZSByb290LAotCQlJdGVtVHJlZU5vZGUgdGhlTm9kZSwgSGFzaE1hcCBpZE1hcCkgewotCQlmaW5hbCBTdHJpbmcgYXR0cmliQ2F0ZWdvcnkgPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9DQVRFR09SWSwgbnVsbCk7Ci0JCQkJCi0JCS8vIGxvY2F0ZSB0aGUgcGFyZW50IG5vZGUKLQkJSXRlbVRyZWVOb2RlIHBhcmVudE5vZGUgPSBudWxsOwotCQlpZiAoYXR0cmliQ2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50Tm9kZSA9IChJdGVtVHJlZU5vZGUpIGlkTWFwLmdldChhdHRyaWJDYXRlZ29yeSk7Ci0JCX0KLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgcGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCQkJCi0JCS8vIGFkZCB0aGUgaXRlbQotCQlwYXJlbnROb2RlLmFkZFNvcnRlZE5vZGUodGhlTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJdGVtRGVzY3JpcHRvciBmcm9tIGFuIFhNTCBkZWZpbml0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlc2NyaWJpbmcgdGhlIGl0ZW0KLQkgKiBAcGFyYW0gYXR0cmliSWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEByZXR1cm4gYSBuZXcgSXRlbURlc2NyaXB0b3IsIG9yIG51bGwgaWYgYW4gZXJyb3Igb2NjdXJzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSXRlbURlc2NyaXB0b3IgY3JlYXRlSXRlbURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBTdHJpbmcgYXR0cmliSWQpIHsKLQkJZmluYWwgU3RyaW5nIGF0dHJpYk5hbWUgPSBnZXRJdGVtTmFtZShjZSk7Ci0JCWZpbmFsIEltYWdlICBhdHRyaWJJY29uID0gZ2V0SXRlbUljb24oY2UpOwotCQlmaW5hbCBTdHJpbmcgYXR0cmliRGVzY3JpcHRpb24gPSBnZXRJdGVtRGVzY3JpcHRpb24oY2UpOwotCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudCB2aWV3Q0UgPSBnZXRJdGVtRWxlbWVudChjZSwgTEFVTkNIX0lURU1TX1hNTF9WSUVXKTsKLQkJaWYgKHZpZXdDRSAhPSBudWxsKSB7Ci0JCQkvL0l0ZW0gaXMgYSB2aWV3Ci0JCQlmaW5hbCBTdHJpbmcgYXR0cmliVmlldyA9IGdldEl0ZW1BdHRyaWJ1dGUodmlld0NFLCBMQVVOQ0hfSVRFTVNfWE1MX1ZJRVdfVklFV0lELCBudWxsKTsJCQotCQkJaWYgKGF0dHJpYlZpZXcgPT0gbnVsbCkgewotCQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5JbmNvbXBsZXRlVmlld0xhdW5jaEl0ZW0iLAotCQkJCQluZXcgT2JqZWN0W10geyBhdHRyaWJJZCB9ICksIG51bGwpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIG5ldyBJdGVtRGVzY3JpcHRvcihhdHRyaWJJZCwgYXR0cmliTmFtZSwgYXR0cmliRGVzY3JpcHRpb24sCi0JCQkJCWF0dHJpYkljb24sIGF0dHJpYlZpZXcsIG51bGwsIG51bGwsIHZpZXdDRSk7Ci0JCX0gZWxzZSB7Ci0JCQkvL0l0ZW0gaXMgYSBzdGFuZGFsb25lCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcHJvZ3JhbUNFID0gZ2V0SXRlbUVsZW1lbnQoY2UsIExBVU5DSF9JVEVNU19YTUxfUFJPR1JBTSk7Ci0JCQlpZiAocHJvZ3JhbUNFICE9IG51bGwpIHsKLQkJCQlmaW5hbCBTdHJpbmcgYXR0cmliUGx1Z2luSWQgPSBnZXRJdGVtQXR0cmlidXRlKHByb2dyYW1DRSwgTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNX1BMVUdJTiwgbnVsbCk7Ci0JCQkJZmluYWwgU3RyaW5nIGF0dHJpYkNsYXNzICAgID0gZ2V0SXRlbUF0dHJpYnV0ZShwcm9ncmFtQ0UsIExBVU5DSF9JVEVNU19YTUxfUFJPR1JBTV9DTEFTUywgbnVsbCk7Ci0JCQkJaWYgKGF0dHJpYkNsYXNzID09IG51bGwgfHwgYXR0cmliUGx1Z2luSWQgPT0gbnVsbCkgewotCQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuSW5jb21wbGV0ZVByb2dyYW1MYXVuY2hJdGVtIiwKLQkJCQkJbmV3IE9iamVjdFtdIHsgYXR0cmliSWQgfSApLCBudWxsKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgSXRlbURlc2NyaXB0b3IoYXR0cmliSWQsIGF0dHJpYk5hbWUsIGF0dHJpYkRlc2NyaXB0aW9uLAotCQkJCQlhdHRyaWJJY29uLCBudWxsLCBhdHRyaWJDbGFzcywgYXR0cmliUGx1Z2luSWQsIHByb2dyYW1DRSk7Ci0JCQl9IGVsc2UgewotCQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5JbmNvbXBsZXRlTGF1bmNoSXRlbSIsCi0JCQkJCW5ldyBPYmplY3RbXSB7IGF0dHJpYklkIH0gKSwgbnVsbCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhIHBhcnRpY3VsYXIgY2hpbGQgWE1MIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgcGFyZW50Ci0JICogQHBhcmFtIGVsZW1lbnQgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gZmV0Y2gKLQkgKiBAcmV0dXJuIHRoZSBlbGVtZW50J3MgSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBvciBudWxsIGlmIG5vdCBmb3VuZAotCSAqLwotCXByaXZhdGUgc3RhdGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRJdGVtRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UsIFN0cmluZyBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRDRXMgPSBjZS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJcmV0dXJuIChlbGVtZW50Q0VzICE9IG51bGwgJiYgZWxlbWVudENFcy5sZW5ndGggIT0gMCkgPyBlbGVtZW50Q0VzWzBdIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhbiBYTUwgYXR0cmlidXRlIGZvciBhbiBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlc2NyaWJpbmcgdGhlIGl0ZW0KLQkgKiBAcGFyYW0gYXR0cmlidXRlIHRoZSBhdHRyaWJ1dGUgdG8gZmV0Y2gKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SXRlbUF0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIHZhbHVlID0gY2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0JCXJldHVybiAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgZ2l2ZW4gdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBmb3IgYW4gaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjcmliaW5nIHRoZSBpdGVtCi0JICogQHJldHVybiBhIG5ld2xpbmUtZGVsaW1pdGVkIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGlzIGl0ZW0sIG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJdGVtRGVzY3JpcHRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlKSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfSVRFTV9ERVNDUklQVElPTiwgIiIpOwotCQlyZXR1cm4gKGRlc2NyaXB0aW9uLmxlbmd0aCgpID09IDApID8gbnVsbCA6IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgYW4gaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjcmliaW5nIHRoZSBpdGVtCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEl0ZW1OYW1lKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSkgewotCQlyZXR1cm4gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfTkFNRSwKLQkJCWdldFJlc291cmNlU3RyaW5nKCJsYXVuY2hpdGVtLk1pc3NpbmcubmFtZSIpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGljb24gZm9yIGFuIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzY3JpYmluZyB0aGUgaXRlbQotCSAqIEByZXR1cm4gYW4gaWNvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlIGdldEl0ZW1JY29uKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSkgewotCQlTdHJpbmcgaWNvblBhdGggPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0lURU1fSUNPTiwgIiIpOwotCQlpZiAoaWNvblBhdGgubGVuZ3RoKCkgIT0gMCkgewotCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGNlLmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShzeW1ib2xpY05hbWUpOwotCQkJSW1hZ2UgaWNvbiA9IGdldEltYWdlRnJvbVBsdWdpbihidW5kbGUsIGljb25QYXRoKTsKLQkJCWlmIChpY29uICE9IG51bGwpIHsKLQkJCQlJbWFnZVtdIG5ld0ltYWdlcyA9IG5ldyBJbWFnZVtpbWFnZXMubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShpbWFnZXMsIDAsIG5ld0ltYWdlcywgMCwgaW1hZ2VzLmxlbmd0aCk7Ci0JCQkJbmV3SW1hZ2VzW2ltYWdlcy5sZW5ndGhdID0gaWNvbjsKLQkJCQlpbWFnZXMgPSBuZXdJbWFnZXM7Ci0JCQkJcmV0dXJuIGljb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlc1tsaUdlbmVyaWNFeGFtcGxlXTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFuIGltYWdlIGZyb20gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gYnVuZGxlIHRoZSBwbHVnaW4gZGVzY3JpcHRvciBmb3IgdGhlIHBsdWdpbiB3aXRoIHRoZSBpbWFnZQotCSAqIEBwYXJhbSBpY29uUGF0aCB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgaW5zdGFsbCBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSwgb3IgbnVsbCBpZiBub3QgZm91bmQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBnZXRJbWFnZUZyb21QbHVnaW4oQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGljb25QYXRoKSB7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVXJsID0gYnVuZGxlLmdldEVudHJ5KCIvIik7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChpbnN0YWxsVXJsLCBpY29uUGF0aCk7Ci0JCQlpcyA9IHVybC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCk7Ci0JCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YShpcyk7Ci0JCQlJbWFnZURhdGEgbWFzayA9IHNvdXJjZS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UsIG1hc2spOwotCQkJcmV0dXJuIGltYWdlOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaXMgIT0gbnVsbCkgaXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvTGF1bmNoZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyYzkzNGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvTGF1bmNoZXJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLS8qKgotICogTGF1bmNoZXIgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IAotICogdG8gbGF1bmNoIHRoZSBvdGhlciByZWdpc3RlcmVkIGV4YW1wbGVzLgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hlclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JcHJpdmF0ZSBTaGVsbCB3b3JrYmVuY2hTaGVsbDsKLQkKLQlwcml2YXRlIFRyZWUgbGF1bmNoVHJlZTsKLQlwcml2YXRlIFRleHQgZGVzY3JpcHRpb25UZXh0OwotCXByaXZhdGUgQnV0dG9uIHJ1bkJ1dHRvbjsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBMYXVuY2hlclZpZXcuCi0JICovCi0JcHVibGljIExhdW5jaGVyVmlldygpIHsKLQkJTGF1bmNoZXJQbHVnaW4uaW5pdFJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUuCi0JICogCi0JICogQHNlZSBWaWV3UGFydCNjcmVhdGVQYXJ0Q29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJd29ya2JlbmNoU2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgU3BsaXRMYXlvdXQoKSk7Ci0JCQkJCi0JCUdyb3VwIGxhdW5jaEdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYXVuY2hHcm91cC5zZXRUZXh0KExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJ2aWV3LmxhdW5jaEdyb3VwLnRleHQiKSk7Ci0JCQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXVuY2hHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJbGF1bmNoVHJlZSA9IG5ldyBUcmVlKGxhdW5jaEdyb3VwLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGF1bmNoVHJlZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJbGF1bmNoVHJlZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWZpbmFsIEl0ZW1EZXNjcmlwdG9yIGl0ZW0gPSBnZXRTZWxlY3RlZEl0ZW0oKTsKLQkJCQlzZXREZXNjcmlwdGlvbkJ5SXRlbShpdGVtKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWZpbmFsIEl0ZW1EZXNjcmlwdG9yIGl0ZW0gPSBnZXRTZWxlY3RlZEl0ZW0oKTsKLQkJCQlzZXREZXNjcmlwdGlvbkJ5SXRlbShpdGVtKTsKLQkJCQlpZiAoaXRlbS5nZXRNYWluVHlwZSgpID09IG51bGwgJiYgaXRlbS5nZXRWaWV3KCkgPT0gbnVsbCkgewotCQkJCQkvLyBDYXRlZ29yeSBzZWxlY3RlZCwgc28ganVzdCBleHBhbmQvY29sYXBzZSB0aGUgbm9kZQotCQkJCQlUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQkJYm9vbGVhbiBleHBhbmRlZCA9IHRyZWVJdGVtLmdldEV4cGFuZGVkKCk7Ci0JCQkJCWlmICh0cmVlSXRlbSAhPSBudWxsKSB0cmVlSXRlbS5zZXRFeHBhbmRlZCghZXhwYW5kZWQpOwotCQkJCQl0cmVlSXRlbS5zZXRJbWFnZShMYXVuY2hlclBsdWdpbi5pbWFnZXNbZXhwYW5kZWQgPyBMYXVuY2hlclBsdWdpbi5saUNsb3NlZEZvbGRlciA6IExhdW5jaGVyUGx1Z2luLmxpT3BlbkZvbGRlcl0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxhdW5jaEl0ZW0oZ2V0U2VsZWN0ZWRJdGVtKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWxhdW5jaFRyZWUuYWRkVHJlZUxpc3RlbmVyKG5ldyBUcmVlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJCWl0ZW0uc2V0SW1hZ2UoTGF1bmNoZXJQbHVnaW4uaW1hZ2VzW0xhdW5jaGVyUGx1Z2luLmxpQ2xvc2VkRm9sZGVyXSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJaXRlbS5zZXRJbWFnZShMYXVuY2hlclBsdWdpbi5pbWFnZXNbTGF1bmNoZXJQbHVnaW4ubGlPcGVuRm9sZGVyXSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJ1bkJ1dHRvbiA9IG5ldyBCdXR0b24obGF1bmNoR3JvdXAsIFNXVC5QVVNIKTsKLQkJcnVuQnV0dG9uLnNldFRleHQoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInZpZXcubGF1bmNoQnV0dG9uLnRleHQiKSk7Ci0JCXJ1bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWxhdW5jaEl0ZW0oZ2V0U2VsZWN0ZWRJdGVtKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIGRlc2NyaXB0aW9uR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWRlc2NyaXB0aW9uR3JvdXAuc2V0VGV4dChMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygidmlldy5kZXNjcmlwdGlvbkdyb3VwLnRleHQiKSk7Ci0JCWRlc2NyaXB0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkKLQkJZGVzY3JpcHRpb25UZXh0ID0gbmV3IFRleHQoZGVzY3JpcHRpb25Hcm91cCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8Ci0JCQlTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkpOwotCi0JCXNldERlc2NyaXB0aW9uQnlJdGVtKG51bGwpOwotCQlzZXRJdGVtRGVzY3JpcHRvcnMoTGF1bmNoZXJQbHVnaW4uZ2V0TGF1bmNoSXRlbVRyZWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgIHsKLQkJbGF1bmNoVHJlZS5zZXRGb2N1cygpOwotCQlydW5CdXR0b24uZ2V0U2hlbGwoKS5zZXREZWZhdWx0QnV0dG9uKHJ1bkJ1dHRvbik7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFZpZXcgaXMgdG8gYmUgZGlzcG9zZWQKLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJd29ya2JlbmNoU2hlbGwgPSBudWxsOwotCQlsYXVuY2hUcmVlID0gbnVsbDsKLQkJZGVzY3JpcHRpb25UZXh0ID0gbnVsbDsKLQkJcnVuQnV0dG9uID0gbnVsbDsJCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zdGFsbHMgYSBuZXcgbGF1bmNoIGxpc3QuCi0JICogCi0JICogQHBhcmFtIG5ld1Jvb3QgdGhlIG5ldyB0cmVlIG9mIGxhdW5jaCBpdGVtcyBmb3IgdGhlIFVJCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXRlbURlc2NyaXB0b3JzKGZpbmFsIEl0ZW1UcmVlTm9kZSBuZXdSb290KSB7Ci0JCWlmICh3b3JrYmVuY2hTaGVsbCA9PSBudWxsKSByZXR1cm47Ci0JCXdvcmtiZW5jaFNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKChsYXVuY2hUcmVlID09IG51bGwpIHx8IChsYXVuY2hUcmVlLmlzRGlzcG9zZWQoKSkpIHJldHVybjsKLQkJCQlsYXVuY2hUcmVlLnJlbW92ZUFsbCgpOwotCQkJCi0JCQkJZm9yIChJdGVtVHJlZU5vZGUgbm9kZSA9IG5ld1Jvb3QuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7Ci0JCQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJZG9Ob2RlKG5vZGUsIG5ldyBUcmVlSXRlbShsYXVuY2hUcmVlLCBTV1QuTk9ORSkpOyAvLyB0b3AtbGV2ZWwgVHJlZUl0ZW0KLQkJCQl9Ci0JCQl9Ci0JCQlwcml2YXRlIHZvaWQgYWRkR3JvdXAoVHJlZUl0ZW0gcGFyZW50LCBJdGVtVHJlZU5vZGUgbm9kZSkgewotCQkJCWZvciAoO25vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQlkb05vZGUobm9kZSwgbmV3IFRyZWVJdGVtKHBhcmVudCwgU1dULk5PTkUpKTsgLy8gVHJlZUl0ZW0gYXQgZGVwdGggPiAwCi0JCQkJfQotCQkJfQotCQkJcHJpdmF0ZSB2b2lkIGRvTm9kZShJdGVtVHJlZU5vZGUgbm9kZSwgVHJlZUl0ZW0gdHJlZUl0ZW0pIHsKLQkJCQlmaW5hbCBJdGVtRGVzY3JpcHRvciBpdGVtID0gbm9kZS5nZXREZXNjcmlwdG9yKCk7Ci0JCQkJdHJlZUl0ZW0uc2V0VGV4dChpdGVtLmdldE5hbWUoKSk7Ci0JCQkJdHJlZUl0ZW0uc2V0RGF0YShpdGVtKTsKLQkJCQlpZiAobm9kZS5nZXREZXNjcmlwdG9yKCkuaXNGb2xkZXIoKSkgewotCQkJCQl0cmVlSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCQkJCXRyZWVJdGVtLnNldEltYWdlKExhdW5jaGVyUGx1Z2luLmltYWdlc1tMYXVuY2hlclBsdWdpbi5saUNsb3NlZEZvbGRlcl0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRyZWVJdGVtLnNldEltYWdlKG5vZGUuZ2V0RGVzY3JpcHRvcigpLmdldEljb24oKSk7Ci0JCQkJfQotCQkJCWFkZEdyb3VwKHRyZWVJdGVtLCBub2RlLmdldEZpcnN0Q2hpbGQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIHNwZWNpZmllZCBsYXVuY2ggaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbURlc2NyaXB0b3IgdGhlIGxhdW5jaCBpdGVtIHRvIGV4ZWN1dGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgbGF1bmNoSXRlbShJdGVtRGVzY3JpcHRvciBpdGVtRGVzY3JpcHRvcikgewotCQkvKiBDYXNlIDE6IFRoZSBsYXVuY2ggaXRlbSBpcyBhIHZpZXcgKi8KLQkJU3RyaW5nIHBsdWdpblZpZXdJZCA9IGl0ZW1EZXNjcmlwdG9yLmdldFZpZXcgKCk7Ci0JCWlmIChwbHVnaW5WaWV3SWQgIT0gbnVsbCkgewotCQkJZmluYWwgSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCA9IHRoaXM7Ci0JCQlmaW5hbCBJV29ya2JlbmNoUGFydFNpdGUgd29ya2JlbmNoUGFydFNpdGUgPSB3b3JrYmVuY2hQYXJ0LmdldFNpdGUoKTsKLQkJCWZpbmFsIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hQYXJ0U2l0ZS5nZXRQYWdlKCk7Ci0JCQl0cnkgewotCQkJCXdvcmtiZW5jaFBhZ2Uuc2hvd1ZpZXcocGx1Z2luVmlld0lkKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlMYXVuY2hlclBsdWdpbi5sb2dFcnJvcihMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicnVuLmVycm9yLkludm9jYXRpb24iKSwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogQ2FzZSAyOiBUaGUgbGF1bmNoIGl0ZW0gaXMgYSBzdGFuZGFsb25lIHByb2dyYW0gKi8KLQkJaWYgKHdvcmtiZW5jaFNoZWxsID09IG51bGwpIHJldHVybjsKLQkJdHJ5IHsKLQkJCU9iamVjdCBpbnN0YW5jZSA9IGl0ZW1EZXNjcmlwdG9yLmNyZWF0ZUl0ZW1JbnN0YW5jZSgpOwotCQkJaWYgKGluc3RhbmNlICE9IG51bGwpIHsKLQkJCQlEaXNwbGF5IGRpc3BsYXkgPSB3b3JrYmVuY2hTaGVsbC5nZXREaXNwbGF5KCk7Ci0JCQkJTWV0aG9kIG9wZW5NZXRob2QgPSBpbnN0YW5jZS5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJvcGVuIiwgbmV3IENsYXNzW10ge0Rpc3BsYXkuY2xhc3N9KTsKLQkJCQlvcGVuTWV0aG9kLmludm9rZShpbnN0YW5jZSwgbmV3IE9iamVjdFtdIHtkaXNwbGF5fSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQlMYXVuY2hlclBsdWdpbi5sb2dFcnJvcihMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicnVuLmVycm9yLkRvZXNOb3RJbXBsZW1lbnRNZXRob2QiKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMYXVuY2hlclBsdWdpbi5sb2dFcnJvcihMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicnVuLmVycm9yLkNvdWxkTm90SW5zdGFudGlhdGVDbGFzcyIpLCBlKTsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogT2J0YWlucyB0aGUgc2VsZWN0ZWQgbGF1bmNoIGl0ZW0uCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEl0ZW1EZXNjcmlwdG9yCi0JICovCi0JcHJpdmF0ZSBJdGVtRGVzY3JpcHRvciBnZXRTZWxlY3RlZEl0ZW0oKSB7Ci0JCWZpbmFsIFRyZWVJdGVtW10gc2VsZWN0aW9ucyA9IGxhdW5jaFRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKLQkJZmluYWwgSXRlbURlc2NyaXB0b3IgaXRlbURlc2NyaXB0b3IgPSAoSXRlbURlc2NyaXB0b3IpIHNlbGVjdGlvbnNbMF0uZ2V0RGF0YSgpOwotCQlyZXR1cm4gaXRlbURlc2NyaXB0b3I7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnRseSB2aXNpYmxlIGRlc2NyaXB0aW9uIHRleHQgdG8gcmVmbGVjdCB0aGF0IG9mIGEgcGFydGljdWxhciBJdGVtRGVzY3JpcHRvci4KLQkgKgotCSAqIEBwYXJhbSBpdGVtRGVzY3JpcHRvciB0aGUgbGF1bmNoIGl0ZW0gd2hvc2UgZGVzY3JpcHRpb24gaXMgdG8gYmUgZGlzcGxheWVkLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RGVzY3JpcHRpb25CeUl0ZW0oSXRlbURlc2NyaXB0b3IgaXRlbURlc2NyaXB0b3IpIHsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uOwotCQlpZiAoaXRlbURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb24gPSBMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygibGF1bmNoaXRlbS5OdWxsLmRlc2NyaXB0aW9uIik7Ci0JCQlpZiAocnVuQnV0dG9uICE9IG51bGwpIHJ1bkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWRlc2NyaXB0aW9uID0gaXRlbURlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJCWRlc2NyaXB0aW9uID0gTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImxhdW5jaGl0ZW0uTWlzc2luZy5kZXNjcmlwdGlvbiIpOwotCQkJaWYgKHJ1bkJ1dHRvbiAhPSBudWxsKSB7Ci0JCQkJcnVuQnV0dG9uLnNldEVuYWJsZWQoaXRlbURlc2NyaXB0b3IuZ2V0VmlldygpICE9IG51bGwgfHwgaXRlbURlc2NyaXB0b3IuZ2V0TWFpblR5cGUoKSAhPSBudWxsKTsKLQkJCX0KLQkJfQotCQlkZXNjcmlwdGlvblRleHQuc2V0VGV4dChkZXNjcmlwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvU3BsaXRMYXlvdXQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL1NwbGl0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2MzdhZjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvU3BsaXRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBIExheW91dCBjbGFzcyB0aGF0IGF1dG9tYXRpY2FsbHkgc3dpdGNoZXMgZnJvbSBhIGhvcml6b250YWwgc3BsaXQgdG8gYSB2ZXJ0aWNhbAotICogc3BsaXQgbGF5b3V0IHRvIGFjY29tb2RhdGUgY2hhbmdpbmcgc2l6ZSBjb25kaXRpb25zLgotICogCi0gKiBMYXRlciBvbiB3ZSBtaWdodCBpbXByb3ZlIHRoaXMgY2xhc3MgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlICJwcmVmZXJyZWQiIHNpemUgb2YKLSAqIHRoZSB3aWRnZXRzLgotICovCi1wdWJsaWMgY2xhc3MgU3BsaXRMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludAotCQlzcGxpdEhvcml6b250YWxseSA9IDAsCi0JCXNwbGl0VmVydGljYWxseSA9IDE7Ci0JcHJpdmF0ZSBpbnQgc3BsaXREaXJlY3Rpb24gPSBzcGxpdEhvcml6b250YWxseTsKLQotCXB1YmxpYyBpbnQgc3BhY2luZyA9IDM7Ci0JcHVibGljIGludCBtYXJnaW5Ub3AgPSAzOwotCXB1YmxpYyBpbnQgbWFyZ2luTGVmdCA9IDM7Ci0JcHVibGljIGludCBtYXJnaW5SaWdodCA9IDM7Ci0JcHVibGljIGludCBtYXJnaW5Cb3R0b20gPSAzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYXlvdXQKLQkgKi8KLQlwdWJsaWMgU3BsaXRMYXlvdXQoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMYXlvdXQjY29tcHV0ZVNpemUoQ29tcG9zaXRlLCBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlpZiAod0hpbnQgPT0gU1dULkRFRkFVTFQpIHsKLQkJCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCkgewotCQkJCVBvaW50IGhTcGxpdFNpemUgPSBjb21wdXRlSFNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQkJUG9pbnQgdlNwbGl0U2l6ZSA9IGNvbXB1dGVWU3BsaXRTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBmYWxzZSk7Ci0JCQkJaW50IGhTcGxpdEFyZWEgPSBoU3BsaXRTaXplLnggKiBoU3BsaXRTaXplLnk7Ci0JCQkJaW50IHZTcGxpdEFyZWEgPSB2U3BsaXRTaXplLnggKiB2U3BsaXRTaXplLnk7Ci0JCQkJLy8gQ2hvb3NlIGRpcmVjdGlvbiBjb25zdW1pbmcgbGVhc3QgYXJlYQotCQkJCWlmIChoU3BsaXRBcmVhIDwgdlNwbGl0QXJlYSkgewotCQkJCQlzcGxpdERpcmVjdGlvbiA9IHNwbGl0SG9yaXpvbnRhbGx5OwotCQkJCQlyZXR1cm4gaFNwbGl0U2l6ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlzcGxpdERpcmVjdGlvbiA9IHNwbGl0VmVydGljYWxseTsKLQkJCQkJcmV0dXJuIHZTcGxpdFNpemU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBDb25zdHJhaW5lZCBpbiBoZWlnaHQ6IHNwbGl0IHZlcnRpY2FsbHkKLQkJCQlzcGxpdERpcmVjdGlvbiA9IHNwbGl0VmVydGljYWxseTsKLQkJCQlyZXR1cm4gY29tcHV0ZVZTcGxpdFNpemUoY29tcG9zaXRlLCB3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGhIaW50ID09IFNXVC5ERUZBVUxUKSB7Ci0JCQkJLy8gQ29uc3RyYWluZWQgaW4gd2lkdGg6IHNwbGl0IGhvcml6b250YWxseQotCQkJCXNwbGl0RGlyZWN0aW9uID0gc3BsaXRIb3Jpem9udGFsbHk7Ci0JCQkJcmV0dXJuIGNvbXB1dGVIU3BsaXRTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGhIaW50IDwgd0hpbnQpIHsKLQkJCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdFZlcnRpY2FsbHk7Ci0JCQkJCXJldHVybiBjb21wdXRlVlNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdEhvcml6b250YWxseTsKLQkJCQkJcmV0dXJuIGNvbXB1dGVIU3BsaXRTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCQl9CQkJCQkKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIExheW91dCNsYXlvdXQoQ29tcG9zaXRlLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotCQljb21wdXRlU2l6ZShjb21wb3NpdGUsIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0LCBmYWxzZSk7Ci0JCQotCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJY2xpZW50QXJlYS54ICs9IG1hcmdpbkxlZnQ7Ci0JCWNsaWVudEFyZWEueSArPSBtYXJnaW5Ub3A7Ci0JCWNsaWVudEFyZWEud2lkdGggLT0gbWFyZ2luUmlnaHQgKyBtYXJnaW5MZWZ0OwotCQljbGllbnRBcmVhLmhlaWdodCAtPSBtYXJnaW5Cb3R0b20gKyBtYXJnaW5Ub3A7Ci0JCVBvaW50IHBvc2l0aW9uID0gbmV3IFBvaW50KGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55KTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQlmaW5hbCBSZWN0YW5nbGUgYm91bmRzOwotCQkJaWYgKHNwbGl0RGlyZWN0aW9uID09IHNwbGl0SG9yaXpvbnRhbGx5KSB7Ci0JCQkJaW50IGhlaWdodCA9IGNsaWVudEFyZWEuaGVpZ2h0IC8gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgY2xpZW50QXJlYS53aWR0aCwgaGVpZ2h0KTsKLQkJCQlwb3NpdGlvbi55ICs9IGhlaWdodCArIHNwYWNpbmc7Ci0JCQl9IGVsc2UgewotCQkJCWludCB3aWR0aCA9IGNsaWVudEFyZWEud2lkdGggLyBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkJYm91bmRzID0gbmV3IFJlY3RhbmdsZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgY2xpZW50QXJlYS5oZWlnaHQpOwotCQkJCXBvc2l0aW9uLnggKz0gd2lkdGggKyBzcGFjaW5nOwotCQkJfQotCQkJYm91bmRzLndpZHRoID0gTWF0aC5tYXgoYm91bmRzLndpZHRoLCAwKTsKLQkJCWJvdW5kcy5oZWlnaHQgPSBNYXRoLm1heChib3VuZHMuaGVpZ2h0LCAwKTsKLQkJCWNoaWxkLnNldEJvdW5kcyhib3VuZHMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlSFNwbGl0U2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCVBvaW50IHNpemUgPSBuZXcgUG9pbnQobWFyZ2luTGVmdCArIG1hcmdpblJpZ2h0LCBtYXJnaW5Ub3AgKyBtYXJnaW5Cb3R0b20pOwotCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCi0JCQlQb2ludCBjaGlsZFNpemUgPSBjaGlsZC5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJc2l6ZS54ID0gTWF0aC5tYXgoc2l6ZS54LCBjaGlsZFNpemUueCk7Ci0JCQlzaXplLnkgKz0gY2hpbGRTaXplLnkgKyBzcGFjaW5nOwotCQl9Ci0JCXJldHVybiBzaXplOwotCX0KLQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZVZTcGxpdFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlQb2ludCBzaXplID0gbmV3IFBvaW50KG1hcmdpbkxlZnQgKyBtYXJnaW5SaWdodCwgbWFyZ2luVG9wICsgbWFyZ2luQm90dG9tKTsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIENvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQotCQkJUG9pbnQgY2hpbGRTaXplID0gY2hpbGQuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCXNpemUueCArPSBjaGlsZFNpemUueCArIHNwYWNpbmc7Ci0JCQlzaXplLnkgPSBNYXRoLm1heChzaXplLnksIGNoaWxkU2l6ZS55KTsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZmMyY2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NTM2MmUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTQ6MDMgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTU1ZDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQotc291cmNlLmxheW91dHMuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvZG9jLWh0bWwvc3d0X2xheW91dF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvZG9jLWh0bWwvc3d0X2xheW91dF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTgyOWZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2RvYy1odG1sL3N3dF9sYXlvdXRfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIExheW91dCBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBMYXlvdXRzPC9oMj4KLQotPHA+Ci1UaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGxheW91dHMuIAotSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZSAKLXVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgbGF5b3V0LgotVGhlIHVzZXIgY2FuIGluc2VydCB3aWRnZXRzIGludG8gYSBsYXlvdXQgYW5kIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBsYXlvdXQgZGF0YQotdXNpbmcgYSBwcm9wZXJ0eSBzaGVldC4gIFdoZW4gdGhlIHVzZXIgaGFzIGEgc3VpdGFibGUgYXJyYW5nZW1lbnQsIHRoZSB1bmRlcmx5aW5nCi1jb2RlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgY2xpY2tpbmcgb24gdGhlIDxzdHJvbmc+Q29kZTwvc3Ryb25nPiBidXR0b24uCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGUuTGF5b3V0RXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+TGF5b3V0czwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2ljb25zL2xheW91dHNfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9pY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ1ZGRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2ljb25zL2xheW91dHNfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBiZGIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RMYXlvdXRFeGFtcGxlLm5hbWUgPSBTV1QgTGF5b3V0IEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkxheW91dEV4YW1wbGUubmFtZSA9IFNXVCBMYXlvdXRzCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uTGF5b3V0RXhhbXBsZS5uYW1lID0gTGF5b3V0cwotbGF1bmNoaXRlbS5MYXlvdXRFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGNvbW1vbiBTV1QgbGF5b3V0cy4gXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgYWxsb3dzIHRoZSBcCi0JdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IFNXVCBsYXlvdXQuXAotCVRoZSB1c2VyIGNhbiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgbGF5b3V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGF5b3V0IGRhdGEgXAotCXVzaW5nIGEgcHJvcGVydHkgc2hlZXQuICBXaGVuIHRoZSB1c2VyIGhhcyBhIHN1aXRhYmxlIGFycmFuZ2VtZW50LCBjb2RlIGNhbiBiZSBcCi0JZ2VuZXJhdGVkIGJ5IGNsaWNraW5nIG9uIHRoZSBDb2RlIGJ1dHRvbi4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjUyM2I5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzIgotICAgbmFtZT0iJXBsdWdpbi5TV1RMYXlvdXRFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMTAwLnF1YWxpZmllciIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMuTGF5b3V0UGx1Z2luIj4KLQotPCEtLSBSdW50aW1lIC0tPgotPCEtLSBSdW50aW1lIC0tPgotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJsYXlvdXRzLmphciI+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPCEtLSBFeHRlbnNpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5MYXlvdXRFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy5MYXlvdXRWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLnZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkxheW91dEV4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2xheW91dHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uTGF5b3V0RXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy52aWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBlcnNpc3QgcHJvamVjdCBzZXR0aW5ncyBmb3IgbGF0ZXIgaW1wb3J0IAotbmF0dXJlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU7IG9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUKLWJ1aWxkZXJzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyCi12YXIuRUNMSVBTRV9QTFVHSU5TID0gPDxFQ0xJUFNFX1BMVUdJTlM+PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQyZGEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0czsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIExheW91dFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dHMvTGF5b3V0Vmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2OWIzZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dHMvTGF5b3V0Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiA8Y29kZT5MYXlvdXRzPC9jb2RlPiBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uCi0gKiBvZiB0aGUgbGF5b3V0cyBkZWZpbmVkIGJ5IFNXVC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgbGF5b3V0LgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCUxheW91dEV4YW1wbGUgaW5zdGFuY2UgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgTGF5b3V0RXhhbXBsZShmcmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpbnN0YW5jZS5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBWaWV3IGlzIHRvIGJlIGRpc3Bvc2VkCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwMGY2OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWFkODY5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTM6NTQgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZmU3NjA4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLSAgICAgICAgICAgIAotc291cmNlLm9sZXdpbjMyLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvZG9jLWh0bWwvc3d0X29sZV9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9kb2MtaHRtbC9zd3Rfb2xlX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyN2RhOGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9kb2MtaHRtbC9zd3Rfb2xlX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBPTEUgV2ViIEJyb3dzZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIE9MRSBXZWIgQnJvd3NlcjwvaDI+Ci0KLTxwPgotVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBlbWJlZCBhbiBBY3RpdmUgWCBjb250cm9sIGludG8gYW4gU1dUIGFwcGxpY2F0aW9uIG9yIGFuIEVjbGlwc2Ugdmlldy4KLTwvcD4KLTxwPgotV2hlbiB0aGUgdmlldyBpcyBvcGVuZWQsIGl0IHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBXaW5kb3dzIEludGVybmV0IEV4cGxvcmVyCi1jb250cm9sLiAgVGhlIE9MRSB3ZWIgYnJvd3NlciBoYXMKLTxzdHJvbmc+QmFjazwvc3Ryb25nPiBhbmQgPHN0cm9uZz5Gb3J3YXJkPC9zdHJvbmc+IGJ1dHRvbnMgdG8gdGFrZSB5b3UgdG8gcmVjZW50bHkgdmlzaXRlZCBwYWdlcy4gIFRoZSBicm93c2VyIGFsc28gY29udGFpbnMKLWEgPHN0cm9uZz5Ib21lPC9zdHJvbmc+IGJ1dHRvbiB0byB0YWtlIHlvdSB0byB0aGUgd2ViIGJyb3dzZXIncyBob21lIHBhZ2UsIGEgPHN0cm9uZz5TdG9wPC9zdHJvbmc+IGJ1dHRvbiB3aGljaCBzdG9wcyB0aGUgCi1jdXJyZW50IHRyYW5zZmVyLCBhIDxzdHJvbmc+U2VhcmNoPC9zdHJvbmc+IGJ1dHRvbiB3aGljaCB3aWxsIHNlYXJjaCBmb3IgdGV4dCB0eXBlZCBpbiB0aGUgPHN0cm9uZz5BZGRyZXNzPC9zdHJvbmc+IHRleHQgZmllbGQsIGFuZAotYSA8c3Ryb25nPlJlZnJlc2g8L3N0cm9uZz4gYnV0dG9uIHdoaWNoIHJlLWRyYXdzIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBwYWdlLiBUaGVyZSBpcyBhbHNvIGEKLTxzdHJvbmc+R288L3N0cm9uZz4gYnV0dG9uIHdoaWNoLCB3aGVuIGNsaWNrZWQsIHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSBwYWdlIHNwZWNpZmllZCBpbiB0aGUgPHN0cm9uZz5BZGRyZXNzPC9zdHJvbmc+IGZpZWxkLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci0KLTxwPgotRnJvbSBFY2xpcHNlJ3MgPHN0cm9uZz5XaW5kb3c8L3N0cm9uZz4gbWVudSBzZWxlY3QgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPk90aGVyPC9zdHJvbmc+LiAgCi1JbiB0aGUgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gZGlhbG9nLCBleHBhbmQgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdAotdGhlIHZpZXcgbmFtZWQgPHN0cm9uZz5PTEUgV2ViIEJyb3dzZXIgKHdpbjMyKTwvc3Ryb25nPi4gQSB2aWV3IGNvbnRhaW5pbmcgYSB3ZWIgYnJvd3NlciB3aWxsIGFwcGVhci4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5PTEUgV2ViIEJyb3dzZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldpbjMyIG9ubHk8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9iYWNrd2FyZF9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9iYWNrd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmNmNDFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvYmFja3dhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvZm9yd2FyZF9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9mb3J3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiOWI2YWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9mb3J3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2hvbWVfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvaG9tZV9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3N2EyMzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvaG9tZV9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9yZWZyZXNoX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3JlZnJlc2hfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI3MGUxOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3JlZnJlc2hfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc2VhcmNoX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3NlYXJjaF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3M2FjOTFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc2VhcmNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3N0b3BfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc3RvcF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NTNkMzQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvc3RvcF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy93ZWJicm93c2VyX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy93ZWJicm93c2VyX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OTVlMjIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNGMzNjJmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVE9MRUV4YW1wbGUubmFtZSA9IFNXVCBPTEUgRXhhbXBsZSBQbHVnaW4gKFdpbjMyKQotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5PTEVXZWJCcm93c2VyRXhhbXBsZS5uYW1lID0gT0xFIFdlYiBCcm93c2VyIChXaW4zMikKLQotbGF1bmNoY2F0ZWdvcnkuU1dUV2luMzJPbmx5RXhhbXBsZXMubmFtZSA9IFdpbjMyIG9ubHkKLWxhdW5jaGNhdGVnb3J5LlNXVFdpbjMyT25seUV4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyBmb3IgV2luZG93cyBzeXN0ZW1zIG9ubHkuCi0KLWxhdW5jaGl0ZW0uT0xFV2ViQnJvd3NlckV4YW1wbGUubmFtZSA9IE9MRSBXZWIgQnJvd3NlcgotbGF1bmNoaXRlbS5PTEVXZWJCcm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBlbWJlZCBhbiBBY3RpdmUgWCBjb250cm9sIGludG8gYW4gU1dUIGFwcGxpY2F0aW9uIG9yIGFuIEVjbGlwc2Ugdmlldy5cblxuXAotCVdoZW4gdGhlIHZpZXcgaXMgb3BlbmVkLCBpdCB3aWxsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgV2luZG93cyBJbnRlcm5ldCBFeHBsb3JlciBcCi0JY29udHJvbC4gIFRoZSBPTEUgV2ViIEJyb3dzZXIgaGFzIFwKLQlCYWNrIGFuZCBGb3J3YXJkIGJ1dHRvbnMgdG8gdGFrZSB5b3UgdG8gcmVjZW50bHkgdmlzaXRlZCBwYWdlcy4gIFRoZSBicm93c2VyIGFsc28gY29udGFpbnMgXAotCWEgSG9tZSBidXR0b24gdG8gdGFrZSB5b3UgdG8gdGhlIHdlYiBicm93c2VyJ3MgaG9tZSBwYWdlLCBhIFN0b3AgYnV0dG9uIHdoaWNoIHN0b3BzIHRoZSBcCi0JY3VycmVudCB0cmFuc2ZlciwgYSBTZWFyY2ggYnV0dG9uIHdoaWNoIHdpbGwgc2VhcmNoIGZvciB0ZXh0IHR5cGVkIGluIHRoZSBBZGRyZXNzIHRleHQgZmllbGQsIGFuZCBcCi0JYSBSZWZyZXNoIGJ1dHRvbiB3aGljaCByZS1kcmF3cyB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZS4gVGhlcmUgaXMgYWxzbyBhIFwKLQlHbyBidXR0b24gd2hpY2gsIHdoZW4gY2xpY2tlZCwgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIHBhZ2Ugc3BlY2lmaWVkIGluIHRoZSBBZGRyZXNzIGZpZWxkLgotCi1icm93c2VyLkJhY2sudGV4dCA9IEJhY2t3YXJkCi1icm93c2VyLkJhY2sudG9vbHRpcCA9IEdvIHRvIHByZXZpb3VzIFdlYiBzaXRlIGluIHRoZSBoaXN0b3J5IGxpc3QKLQotYnJvd3Nlci5Gb3J3YXJkLnRleHQgPSBGb3J3YXJkCi1icm93c2VyLkZvcndhcmQudG9vbHRpcCA9IEdvIHRvIG5leHQgV2ViIHNpdGUgaW4gdGhlIGhpc3RvcnkgbGlzdAotCi1icm93c2VyLkhvbWUudGV4dCA9IEhvbWUKLWJyb3dzZXIuSG9tZS50b29sdGlwID0gR28gdG8gaG9tZSBXZWIgc2l0ZQotCi1icm93c2VyLlN0b3AudGV4dCA9IFN0b3AKLWJyb3dzZXIuU3RvcC50b29sdGlwID0gU3RvcCBsb2FkaW5nIGN1cnJlbnQgV2ViIHNpdGUKLQotYnJvd3Nlci5SZWZyZXNoLnRleHQgPSBSZWZyZXNoCi1icm93c2VyLlJlZnJlc2gudG9vbHRpcCA9IFJlZnJlc2ggY3VycmVudCBXZWIgc2l0ZQotCi1icm93c2VyLlNlYXJjaC50ZXh0ID0gU2VhcmNoCi1icm93c2VyLlNlYXJjaC50b29sdGlwID0gU2VhcmNoIHRoZSBXZWIKLQotYnJvd3Nlci5BZGRyZXNzLmxhYmVsID0gQWRkcmVzcyA6Ci0KLWJyb3dzZXIuR28udGV4dCA9IEdvCi0KLWJyb3dzZXIuU3RhdGUuVW5pbml0aWFsaXplZC50ZXh0ID0gTm90IHJlYWR5LgotYnJvd3Nlci5TdGF0ZS5Mb2FkaW5nLnRleHQgPSBMb2FkaW5nIFdlYiBzaXRlLi4uCi1icm93c2VyLlN0YXRlLkxvYWRlZC50ZXh0ID0gUmVhZHkuCi1icm93c2VyLlN0YXRlLkludGVyYWN0aXZlLnRleHQgPSBMb2FkaW5nIFdlYiBzaXRlLi4uCi1icm93c2VyLlN0YXRlLkNvbXBsZXRlLnRleHQgPSBEb25lLgotCi1lcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMgPSBVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMKLWVycm9yLkNvdWxkTm90Q3JlYXRlQnJvd3NlckNvbnRyb2wgPSBVbmFibGUgdG8gY3JlYXRlIDw8QnJvd3NlciBDb250cm9sPj4KLQotbGF1bmNoaXRlbS5PTEVFeGFtcGxlLm5hbWU9T0xFIEV4YW1wbGUKLWxhdW5jaGl0ZW0uT0xFRXhhbXBsZS5kZXNjcmlwdGlvbj1cCi0JVGhlIE9MRSBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZW1iZWQgYW4gQWN0aXZlIFggY29udHJvbCBpbnRvIFwKLQlhbiBTV1QgYXBwbGljYXRpb24uXG5cblwKLQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDhlN2Y1ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSBGaWxlIHdyaXR0ZW4gYnkgUERFIDEuMCAtLT4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyIgotICAgbmFtZT0iJXBsdWdpbi5TV1RPTEVFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMTAwLnF1YWxpZmllciIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5PbGVQbHVnaW4iPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLTwvcmVxdWlyZXM+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLTxydW50aW1lPgotICAgPGxpYnJhcnkgbmFtZT0ib2xld2luMzIuamFyIj4KLSAgIDwvbGlicmFyeT4KLTwvcnVudGltZT4KLQotPCEtLSBFeHRlbnNpb25zIC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgIDx2aWV3Ci0gICAgICAgICBuYW1lPSIldmlldy5PTEVXZWJCcm93c2VyRXhhbXBsZS5uYW1lIgotICAgICAgICAgaWNvbj0iaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5PbGVCcm93c2VyVmlldyIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLmJyb3dzZXJWaWV3Ij4KLSAgIDwvdmlldz4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICA8Y2F0ZWdvcnkKLSAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RXaW4zMk9ubHlFeGFtcGxlcy5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RXaW4zMk9ubHlFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoV2luMzJPbmx5Q2F0ZWdvcnkiPgotICAgPC9jYXRlZ29yeT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5PTEVXZWJCcm93c2VyRXhhbXBsZS5uYW1lIgotICAgICAgICAgaWNvbj0iaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZiIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5PTEVXZWJCcm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoV2luMzJPbmx5Q2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi52aWV3bGF1bmNoZXIiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5icm93c2VyVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uT0xFRXhhbXBsZS5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLk9MRUV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFdpbjMyT25seUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMiIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5PTEVFeGFtcGxlIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQxZGFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT0xFRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PTEVFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNzI0YTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PTEVFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIE9MRUV4YW1wbGUgaXMgYW4gZXhhbXBsZSB0aGF0IHVzZXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0PC9jb2RlPiAKLSAqIGxpYnJhcmllcyB0byBpbXBsZW1lbnQgYSBzaW1wbGUgU1dUIHdpbmRvdyB0aGF0IGNhbiBob3N0IGRpZmZlcmVudCBBY3RpdmUgWAotICogY29udHJvbHMuCi0gKgotICogQHNpbmNlIDMuMwotICovIAotcHVibGljIGNsYXNzIE9MRUV4YW1wbGUgewotCi0JT2xlQ2xpZW50U2l0ZSBjbGllbnRTaXRlOwotCU9sZUZyYW1lIG9sZUZyYW1lOwotCUJ1dHRvbiBjbG9zZUJ1dHRvbjsKLQlib29sZWFuIGNyZWF0ZUNsaWVudFNpdGUgPSB0cnVlOyAvLyB0byBjcmVhdGUgT2xlQ29udHJvbFNpdGUsIHNldCB0byBmYWxzZS4KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCU9MRUV4YW1wbGUgZXhhbXBsZSA9IG5ldyBPTEVFeGFtcGxlKCk7Ci0JCWV4YW1wbGUub3BlbihkaXNwbGF5KTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqIAotCSAqIENyZWF0ZSBhIGZpbGUgRXhpdCBtZW51IGl0ZW0gCi0JICovCi0Jdm9pZCBhZGRGaWxlTWVudShPbGVGcmFtZSBmcmFtZSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGZyYW1lLmdldFNoZWxsKCk7Ci0JCU1lbnUgbWVudUJhciA9IHNoZWxsLmdldE1lbnVCYXIoKTsKLQkJaWYgKG1lbnVCYXIgPT0gbnVsbCkgewotCQkJbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCX0KLQkJTWVudUl0ZW0gZmlsZU1lbnUgPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlmaWxlTWVudS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IG1lbnVGaWxlID0gbmV3IE1lbnUoZmlsZU1lbnUpOwotCQlmaWxlTWVudS5zZXRNZW51KG1lbnVGaWxlKTsKLQkJZnJhbWUuc2V0RmlsZU1lbnVzKG5ldyBNZW51SXRlbVtdIHsgZmlsZU1lbnUgfSk7Ci0JCQotCQlNZW51SXRlbSBtZW51RmlsZUV4aXQgPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVFeGl0LnNldFRleHQoIkV4aXQiKTsKLQkJbWVudUZpbGVFeGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JT2xlQ2xpZW50U2l0ZSBjcmVhdGVTaXRlKE9sZUZyYW1lIGZyYW1lLCBTdHJpbmcgcHJvZ0lEKSB7Ci0JCWlmIChjcmVhdGVDbGllbnRTaXRlKSB7Ci0JCQlyZXR1cm4gbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCBwcm9nSUQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBPbGVDb250cm9sU2l0ZShmcmFtZSwgU1dULk5PTkUsIHByb2dJRCk7Ci0JCX0KLQl9Ci0JCi0JT2xlQ2xpZW50U2l0ZSBjcmVhdGVTaXRlKE9sZUZyYW1lIGZyYW1lLCBTdHJpbmcgcHJvZ0lELCBGaWxlIGZpbGUpIHsKLQkJaWYgKGNyZWF0ZUNsaWVudFNpdGUpIHsKLQkJCXJldHVybiBuZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsIHByb2dJRCwgZmlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IE9sZUNvbnRyb2xTaXRlKGZyYW1lLCBTV1QuTk9ORSwgcHJvZ0lELCBmaWxlKTsKLQkJfQotCX0KLQkKLQl2b2lkIGRpc3Bvc2VDbGllbnQoKSB7Ci0JCWlmIChjbGllbnRTaXRlICE9IG51bGwpCi0JCQljbGllbnRTaXRlLmRpc3Bvc2UoKTsKLQkJY2xpZW50U2l0ZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0IHRoZSB1c2VyIGZvciBhIGZpbGUgYW5kIHRyeSB0byBvcGVuIGl0IHdpdGggc29tZSBrbm93biBBY3RpdmVYIGNvbnRyb2xzLgotCSAqLwotCXZvaWQgZmlsZU9wZW4oKSB7Ci0JCVNoZWxsIHNoZWxsID0gb2xlRnJhbWUuZ2V0U2hlbGwoKTsKLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkgcmV0dXJuOwotCi0JCWRpc3Bvc2VDbGllbnQoKTsKLQotCQkvLyB0cnkgb3BlbmluZyBhIC5kb2MgZmlsZSB1c2luZyBXb3JkCi0JCWlmIChjbGllbnRTaXRlID09IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCWlmIChmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImRvYyIpIHx8IAotCQkJCQkJZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJydGYiKSB8fAotCQkJCQkJZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0eHQiKSkgewotCQkJCQl0cnkgewotCQkJCQkJY2xpZW50U2l0ZSA9IGNyZWF0ZVNpdGUob2xlRnJhbWUsICJXb3JkLkRvY3VtZW50IiwgbmV3IEZpbGUoZmlsZU5hbWUpKTsKLQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yMikgewotCQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gdHJ5IG9wZW5pbmcgYSB4bHMgZmlsZSB3aXRoIEV4Y2VsCi0JCWlmIChjbGllbnRTaXRlID09IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCWlmIChmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInhscyIpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGllbnRTaXRlID0gY3JlYXRlU2l0ZShvbGVGcmFtZSwgIkV4Y2VsLlNoZWV0IiwgbmV3IEZpbGUoZmlsZU5hbWUpKTsKLQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yMikgewotCQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gdHJ5IG9wZW5pbmcgYSBtZWRpYSBmaWxlIHdpdGggTVBsYXllcgotCQlpZiAoY2xpZW50U2l0ZSA9PSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJtcGEiKSkgewotCQkJCQl0cnkgewotCQkJCQkJY2xpZW50U2l0ZSA9IGNyZWF0ZVNpdGUob2xlRnJhbWUsICJNUGxheWVyIiwgbmV3IEZpbGUoZmlsZU5hbWUpKTsKLQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yMikgewotCQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gdHJ5IG9wZW5pbmcgd2l0aCB3bXYsIG1wZywgbXBlZywgYXZpLCBhc2YsIHdhdiB3aXRoIFdNUGxheWVyCi0JCWlmIChjbGllbnRTaXRlID09IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCWlmIChmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoIndtdiIpCi0JCQkJCQl8fCBmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoIm1wZyIpCi0JCQkJCQl8fCBmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoIm1wZWciKQotCQkJCQkJfHwgZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJhdmkiKQotCQkJCQkJfHwgZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJhc2YiKQotCQkJCQkJfHwgZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ3YXYiKSkgewotCQkJCQl0cnkgewotCQkJCQkJY2xpZW50U2l0ZSA9IGNyZWF0ZVNpdGUob2xlRnJhbWUsICJXTVBsYXllci5PQ1giKTsKLQkJCQkJCU9sZUF1dG9tYXRpb24gcGxheWVyID0gbmV3IE9sZUF1dG9tYXRpb24oY2xpZW50U2l0ZSk7Ci0JCQkJCQlpbnQgcGxheVVSTFtdID0gcGxheWVyLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIlVSTCIgfSk7Ci0JCQkJCQlpZiAocGxheVVSTCAhPSBudWxsKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdWNlZWRlZCA9IHBsYXllci5zZXRQcm9wZXJ0eShwbGF5VVJMWzBdLCBuZXcgVmFyaWFudChmaWxlTmFtZSkpOwotCQkJCQkJCWlmICghc3VjZWVkZWQpCi0JCQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCQkJfQotCQkJCQkJcGxheWVyLmRpc3Bvc2UoKTsKLQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yMikgewotCQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gdHJ5IG9wZW5pbmcgYSBQREYgZmlsZSB3aXRoIEFjcm9iYXQgcmVhZGVyCi0JCWlmIChjbGllbnRTaXRlID09IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCWlmIChmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInBkZiIpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGllbnRTaXRlID0gY3JlYXRlU2l0ZShvbGVGcmFtZSwgIlBERi5QZGZDdHJsLjUiKTsKLQkJCQkJCWNsaWVudFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCQkJCQkgICAgT2xlQXV0b21hdGlvbiBwZGYgPSBuZXcgT2xlQXV0b21hdGlvbiAoY2xpZW50U2l0ZSk7Ci0JCQkJCSAgICBpbnQgbG9hZEZpbGVbXSA9IHBkZi5nZXRJRHNPZk5hbWVzIChuZXcgU3RyaW5nIFtdIHsiTG9hZEZpbGUifSk7Ci0JCQkJCSAgICBpZiAobG9hZEZpbGUgIT0gbnVsbCkgewotCQkJCQkgICAgCVZhcmlhbnQgcmVzdWx0ID0gcGRmLmludm9rZShsb2FkRmlsZVswXSwgbmV3IFZhcmlhbnRbXSB7bmV3IFZhcmlhbnQoZmlsZU5hbWUpfSk7Ci0JCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlyZXN1bHQuZGlzcG9zZSgpOwotCQkJCQkgICAgfSBlbHNlIHsKLQkJCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCSAgICB9Ci0JCQkJCSAgICBwZGYuZGlzcG9zZSgpOwotCQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXJyb3IyKSB7Ci0JCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB0cnkgb3BlbmluZyB3aXRoIEV4cGxvcmVyCi0JCWlmIChjbGllbnRTaXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY2xpZW50U2l0ZSA9IGNyZWF0ZVNpdGUob2xlRnJhbWUsICJTaGVsbC5FeHBsb3JlciIpOwotCQkJCU9sZUF1dG9tYXRpb24gZXhwbG9yZXIgPSBuZXcgT2xlQXV0b21hdGlvbihjbGllbnRTaXRlKTsKLQkJCQlpbnRbXSBuYXZpZ2F0ZSA9IGV4cGxvcmVyLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSJ9KTsgCi0JCQkJCi0JCQkJaWYgKG5hdmlnYXRlICE9IG51bGwpIHsKLQkJCQkJVmFyaWFudCByZXN1bHQgPSBleHBsb3Jlci5pbnZva2UobmF2aWdhdGVbMF0sIG5ldyBWYXJpYW50W10ge25ldyBWYXJpYW50KGZpbGVOYW1lKX0pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlc3VsdC5kaXNwb3NlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCX0KLQkJCQlleHBsb3Jlci5kaXNwb3NlKCk7Ci0JCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXJyb3IyKSB7Ci0JCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNsaWVudFNpdGUgIT0gbnVsbCl7Ci0JCQljbGllbnRTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQkJfQotCX0KLQotCXZvaWQgbmV3Q2xpZW50U2l0ZShTdHJpbmcgcHJvZ0lEKSB7Ci0JCWRpc3Bvc2VDbGllbnQoKTsKLQkJdHJ5IHsKLQkJCWNsaWVudFNpdGUgPSBjcmVhdGVTaXRlKG9sZUZyYW1lLCBwcm9nSUQpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXJyb3IpIHsKLQotCQl9Ci0JCWlmIChjbGllbnRTaXRlICE9IG51bGwpCi0JCQljbGllbnRTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKERpc3BsYXkgZGlzcGxheSkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiT0xFIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNCwgdHJ1ZSkpOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlidXR0b25zLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlDb21wb3NpdGUgZGlzcGxheUFyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCWRpc3BsYXlBcmVhLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZGlzcGxheUFyZWEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAzLCAxKSk7Ci0KLQkJQnV0dG9uIGV4Y2VsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUkFESU8pOwotCQlleGNlbEJ1dHRvbi5zZXRUZXh0KCJOZXcgRXhjZWwgU2hlZXQiKTsKLQkJZXhjZWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCW5ld0NsaWVudFNpdGUoIkV4Y2VsLlNoZWV0Iik7Ci0JCQl9Ci0JCX0pOwotCQlCdXR0b24gbWVkaWFQbGF5ZXJCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5SQURJTyk7Ci0JCW1lZGlhUGxheWVyQnV0dG9uLnNldFRleHQoIk5ldyBNUGxheWVyIik7Ci0JCW1lZGlhUGxheWVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICgoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKQotCQkJCQluZXdDbGllbnRTaXRlKCJNUGxheWVyIik7Ci0JCQl9Ci0JCX0pOwotCQlCdXR0b24gcG93ZXJQb2ludEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlJBRElPKTsKLQkJcG93ZXJQb2ludEJ1dHRvbi5zZXRUZXh0KCJOZXcgUG93ZXJQb2ludCBTbGlkZSIpOwotCQlwb3dlclBvaW50QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICgoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKQotCQkJCQluZXdDbGllbnRTaXRlKCJQb3dlclBvaW50LlNsaWRlIik7Ci0JCQl9Ci0JCX0pOwotCQlCdXR0b24gd29yZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlJBRElPKTsKLQkJd29yZEJ1dHRvbi5zZXRUZXh0KCJOZXcgV29yZCBEb2N1bWVudCIpOwotCQl3b3JkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICgoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKQotCQkJCQluZXdDbGllbnRTaXRlKCJXb3JkLkRvY3VtZW50Iik7Ci0JCQl9Ci0JCX0pOwotCQluZXcgTGFiZWwoYnV0dG9ucywgU1dULk5PTkUpOwotCQlCdXR0b24gb3BlbkJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlJBRElPKTsKLQkJb3BlbkJ1dHRvbi5zZXRUZXh0KCJPcGVuIGZpbGUuLi4iKTsKLQkJb3BlbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJZmlsZU9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCW5ldyBMYWJlbChidXR0b25zLCBTV1QuTk9ORSk7Ci0JCWNsb3NlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUkFESU8pOwotCQljbG9zZUJ1dHRvbi5zZXRUZXh0KCJDbG9zZSBmaWxlIik7Ci0JCWNsb3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICgoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKQotCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQl9Ci0JCX0pOwkKLQkJY2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkKLQkJb2xlRnJhbWUgPSBuZXcgT2xlRnJhbWUoZGlzcGxheUFyZWEsIFNXVC5OT05FKTsKLQkJYWRkRmlsZU1lbnUob2xlRnJhbWUpOwotCi0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0KLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZUJyb3dzZXJWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZUJyb3dzZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5YmE1ZDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVCcm93c2VyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiBPbGUgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IHRvIGRlbW9uc3RyYXRlIFdpbjMyIE9MRSAvIEFjdGl2ZVgKLSAqIGludGVncmF0aW9uLgotICogCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBPbGVCcm93c2VyVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlICAgICAgZGlzcGxheUFyZWE7Ci0KLQlwcml2YXRlIE9sZUZyYW1lICAgICAgIHdlYkZyYW1lOwotCXByaXZhdGUgT2xlV2ViQnJvd3NlciAgd2ViQnJvd3NlcjsKLQlwcml2YXRlIFRleHQgICAgICAgICAgIHdlYlVybDsKLQlwcml2YXRlIE9sZUNvbnRyb2xTaXRlIHdlYkNvbnRyb2xTaXRlOwotCXByaXZhdGUgUHJvZ3Jlc3NCYXIgICAgd2ViUHJvZ3Jlc3M7Ci0JcHJpdmF0ZSBMYWJlbCAgICAgICAgICB3ZWJTdGF0dXM7Ci0JcHJpdmF0ZSBCdXR0b24gICAgICAgICB3ZWJOYXZpZ2F0ZUJ1dHRvbjsKLQkKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRCYWNrd2FyZDsKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRGb3J3YXJkOwotCXByaXZhdGUgVG9vbEl0ZW0gd2ViQ29tbWFuZEhvbWU7Ci0JcHJpdmF0ZSBUb29sSXRlbSB3ZWJDb21tYW5kU3RvcDsKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRSZWZyZXNoOwotCXByaXZhdGUgVG9vbEl0ZW0gd2ViQ29tbWFuZFNlYXJjaDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYWN0aXZhdGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUElEX0FNQklFTlRfRExDT05UUk9MID0gLTU1MTI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERMQ1RMX05PX1NDUklQVFMgPSAweDgwOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgdGhlIE9MRSBicm93c2VyIHZpZXcuCi0JICovCi0JcHVibGljIE9sZUJyb3dzZXJWaWV3KCkgewotCQlPbGVQbHVnaW4uaW5pdFJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUuCi0JICogCi0JICogQHNlZSBWaWV3UGFydCNjcmVhdGVQYXJ0Q29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZGlzcGxheUFyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWRpc3BsYXlBcmVhLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJCi0JCWNyZWF0ZVRvb2xiYXIoKTsKLQkJY3JlYXRlQnJvd3NlckZyYW1lKCk7CQkKLQkJY3JlYXRlU3RhdHVzQXJlYSgpOwotCQljcmVhdGVCcm93c2VyQ29udHJvbCgpOwkKLQl9Ci0JCi0JLyoqCi0JICogQ2xlYW51cAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChhY3RpdmF0ZWQpIHsKLQkJCXdlYkNvbnRyb2xTaXRlLmRlYWN0aXZhdGVJblBsYWNlQ2xpZW50KCk7Ci0JCQlhY3RpdmF0ZWQgPSBmYWxzZTsKLQkJfQotCQlpZiAod2ViQnJvd3NlciAhPSBudWxsKSB3ZWJCcm93c2VyLmRpc3Bvc2UoKTsKLQkJd2ViQnJvd3NlciA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgIHsKLQkJd2ViVXJsLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgV2ViIGJyb3dzZXIgdG9vbGJhci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVG9vbGJhcigpIHsKLQkJLy8gQWRkIGEgdG9vbGJhcgotCQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyKGRpc3BsYXlBcmVhLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYmFyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJLy8gQWRkIGEgYnV0dG9uIHRvIG5hdmlnYXRlIGJhY2t3YXJkcyB0aHJvdWdoIHByZXZpb3VzbHkgdmlzaXRlZCB3ZWIgc2l0ZXMKLQkJd2ViQ29tbWFuZEJhY2t3YXJkID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kQmFja3dhcmQuc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkJhY2sudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkJhY2sudGV4dCIpKTsKLQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpQmFja10pOwotCQl3ZWJDb21tYW5kQmFja3dhcmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRCYWNrd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuR29CYWNrKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQkvLyBBZGQgYSBidXR0b24gdG8gbmF2aWdhdGUgZm9yd2FyZCB0aHJvdWdoIHByZXZpb3VzbHkgdmlzaXRlZCB3ZWIgc2l0ZXMKLQkJd2ViQ29tbWFuZEZvcndhcmQgPSBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Gb3J3YXJkLnRvb2x0aXAiKSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkZvcndhcmQudGV4dCIpKTsKLQkJd2ViQ29tbWFuZEZvcndhcmQuc2V0SW1hZ2UoT2xlUGx1Z2luLmltYWdlc1tPbGVQbHVnaW4uYmlGb3J3YXJkXSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kRm9yd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuR29Gb3J3YXJkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCBhIHNlcGFyYXRvcgotCQluZXcgVG9vbEl0ZW0oYmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byBuYXZpZ2F0ZSB0byB0aGUgSG9tZSBwYWdlCi0JCXdlYkNvbW1hbmRIb21lID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kSG9tZS5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuSG9tZS50b29sdGlwIikpOwotCQl3ZWJDb21tYW5kSG9tZS5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Ib21lLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRIb21lLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpSG9tZV0pOwotCQl3ZWJDb21tYW5kSG9tZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZEhvbWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLkdvSG9tZSgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgYSBidXR0b24gdG8gYWJvcnQgd2ViIHBhZ2UgbG9hZGluZwotCQl3ZWJDb21tYW5kU3RvcCA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZFN0b3Auc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0b3AudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZFN0b3Auc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RvcC50ZXh0IikpOwotCQl3ZWJDb21tYW5kU3RvcC5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaVN0b3BdKTsKLQkJd2ViQ29tbWFuZFN0b3Auc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRTdG9wLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5TdG9wKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byByZWZyZXNoIHRoZSBjdXJyZW50IHdlYiBwYWdlCi0JCXdlYkNvbW1hbmRSZWZyZXNoID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuUmVmcmVzaC50b29sdGlwIikpOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5SZWZyZXNoLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRSZWZyZXNoLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpUmVmcmVzaF0pOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZFJlZnJlc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLlJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWRkIGEgc2VwYXJhdG9yCi0JCW5ldyBUb29sSXRlbShiYXIsIFNXVC5TRVBBUkFUT1IpOwotCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byBzZWFyY2ggdGhlIHdlYgotCQl3ZWJDb21tYW5kU2VhcmNoID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kU2VhcmNoLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TZWFyY2gudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TZWFyY2gudGV4dCIpKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaVNlYXJjaF0pOwotCQl3ZWJDb21tYW5kU2VhcmNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kU2VhcmNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5Hb1NlYXJjaCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgYSB0ZXh0IGFyZWEgZm9yIFVzZXJzIHRvIGVudGVyIGEgdXJsCi0JCUNvbXBvc2l0ZSBhZGRyZXNzQmFyID0gbmV3IENvbXBvc2l0ZShkaXNwbGF5QXJlYSwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlhZGRyZXNzQmFyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlhZGRyZXNzQmFyLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlMYWJlbCBhZGRyZXNzTGFiZWwgPSBuZXcgTGFiZWwoYWRkcmVzc0JhciwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJYWRkcmVzc0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlhZGRyZXNzTGFiZWwuc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuQWRkcmVzcy5sYWJlbCIpKTsKLQkJYWRkcmVzc0xhYmVsLnNldEZvbnQoT2xlUGx1Z2luLmJyb3dzZXJGb250KTsKLQkJCi0JCXdlYlVybCA9IG5ldyBUZXh0KGFkZHJlc3NCYXIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJd2ViVXJsLnNldEZvbnQoT2xlUGx1Z2luLmJyb3dzZXJGb250KTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCXdlYlVybC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJd2ViVXJsLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCXdlYk5hdmlnYXRlQnV0dG9uLmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbih3ZWJOYXZpZ2F0ZUJ1dHRvbik7Ci0JCQl9Ci0JCX0pOwotCQotCQkvLyBBZGQgYSBidXR0b24gdG8gbmF2aWdhdGUgdG8gdGhlIHdlYiBzaXRlIHNwZWNpZmllZCBpbiB0aGUgVGV4dCBhcmVhIGRlZmluZWQgYWJvdmUKLQkJd2ViTmF2aWdhdGVCdXR0b24gPSBuZXcgQnV0dG9uKGFkZHJlc3NCYXIsIFNXVC5QVVNIKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCXdlYk5hdmlnYXRlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Hby50ZXh0IikpOwotCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5zZXRGb250KE9sZVBsdWdpbi5icm93c2VyRm9udCk7Ci0JCXdlYk5hdmlnYXRlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuTmF2aWdhdGUod2ViVXJsLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFdlYiBicm93c2VyIE9sZUZyYW1lLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVCcm93c2VyRnJhbWUoKSB7Ci0JCS8vIEV2ZXJ5IGNvbnRyb2wgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgT2xlRnJhbWU6Ci0JCXdlYkZyYW1lID0gbmV3IE9sZUZyYW1lKGRpc3BsYXlBcmVhLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXdlYkZyYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBXZWIgYnJvd3NlciBzdGF0dXMgYXJlYS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU3RhdHVzQXJlYSgpIHsKLQkJLy8gQWRkIGEgcHJvZ3Jlc3MgYmFyIHRvIGRpc3BsYXkgZG93bmxvYWRpbmcgcHJvZ3Jlc3MgaW5mb3JtYXRpb24KLQkJd2ViUHJvZ3Jlc3MgPSBuZXcgUHJvZ3Jlc3NCYXIoZGlzcGxheUFyZWEsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXdlYlByb2dyZXNzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwkJCi0KLQkJLy8gQWRkIGEgbGFiZWwgZm9yIGRpc3BsYXlpbmcgc3RhdHVzIG1lc3NhZ2VzIGFzIHRoZXkgYXJlIHJlY2VpdmVkIGZyb20gdGhlIGNvbnRyb2wKLQkJd2ViU3RhdHVzID0gbmV3IExhYmVsKGRpc3BsYXlBcmVhLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl3ZWJTdGF0dXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXdlYlN0YXR1cy5zZXRGb250KE9sZVBsdWdpbi5icm93c2VyRm9udCk7Ci0JfQkKLQotCS8qKgotCSAqIENyZWF0ZXMgV2ViIGJyb3dzZXIgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQnJvd3NlckNvbnRyb2woKSB7Ci0JCXRyeSB7Ci0JCQkvLyBDcmVhdGUgYW4gQXV0b21hdGlvbiBvYmplY3QgZm9yIGFjY2VzcyB0byBleHRlbmRlZCBjYXBhYmlsaXRpZXMKLQkJCXdlYkNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKHdlYkZyYW1lLCBTV1QuTk9ORSwgIlNoZWxsLkV4cGxvcmVyIik7Ci0JCQlWYXJpYW50IGRvd25sb2FkID0gbmV3IFZhcmlhbnQoRExDVExfTk9fU0NSSVBUUyk7Ci0JCQl3ZWJDb250cm9sU2l0ZS5zZXRTaXRlUHJvcGVydHkoRElTUElEX0FNQklFTlRfRExDT05UUk9MLCBkb3dubG9hZCk7Ci0JCQlPbGVBdXRvbWF0aW9uIG9sZUF1dG9tYXRpb24gPSBuZXcgT2xlQXV0b21hdGlvbih3ZWJDb250cm9sU2l0ZSk7Ci0JCQl3ZWJCcm93c2VyID0gbmV3IE9sZVdlYkJyb3dzZXIob2xlQXV0b21hdGlvbik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQkJLy8gQ3JlYXRpb24gbWF5IGhhdmUgZmFpbGVkIGJlY2F1c2UgY29udHJvbCBpcyBub3QgaW5zdGFsbGVkIG9uIG1hY2hpbmUKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHdlYkZyYW1lLCBTV1QuQk9SREVSKTsKLQkJCU9sZVBsdWdpbi5sb2dFcnJvcihPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90Q3JlYXRlQnJvd3NlckNvbnRyb2wiKSwgZXgpOwotCQkJbGFiZWwuc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90Q3JlYXRlQnJvd3NlckNvbnRyb2wiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBSZXNwb25kIHRvIFByb2dyZXNzQ2hhbmdlIGV2ZW50cyBieSB1cGRhdGluZyB0aGUgUHJvZ3Jlc3MgYmFyCi0JCXdlYkNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoT2xlV2ViQnJvd3Nlci5Qcm9ncmVzc0NoYW5nZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYXJpYW50IHByb2dyZXNzID0gZXZlbnQuYXJndW1lbnRzWzBdOwotCQkJCVZhcmlhbnQgbWF4UHJvZ3Jlc3MgPSBldmVudC5hcmd1bWVudHNbMV07Ci0JCQkJaWYgKHByb2dyZXNzID09IG51bGwgfHwgbWF4UHJvZ3Jlc3MgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCXdlYlByb2dyZXNzLnNldE1heGltdW0obWF4UHJvZ3Jlc3MuZ2V0SW50KCkpOwotCQkJCXdlYlByb2dyZXNzLnNldFNlbGVjdGlvbihwcm9ncmVzcy5nZXRJbnQoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gUmVzcG9uZCB0byBTdGF0dXNUZXh0Q2hhbmdlIGV2ZW50cyBieSB1cGRhdGluZyB0aGUgU3RhdHVzIFRleHQgbGFiZWwKLQkJd2ViQ29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihPbGVXZWJCcm93c2VyLlN0YXR1c1RleHRDaGFuZ2UsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFyaWFudCBzdGF0dXNUZXh0ID0gZXZlbnQuYXJndW1lbnRzWzBdOwotCQkJCWlmIChzdGF0dXNUZXh0ID09IG51bGwpCXJldHVybjsKLQkJCQlTdHJpbmcgdGV4dCA9IHN0YXR1c1RleHQuZ2V0U3RyaW5nKCk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCQkJd2ViU3RhdHVzLnNldFRleHQodGV4dCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSByZWFkeSBzdGF0ZSBhbmQgcHJpbnQgb3V0IHRoZSBjdXJyZW50IHN0YXRlIAotCQl3ZWJDb250cm9sU2l0ZS5hZGRQcm9wZXJ0eUxpc3RlbmVyKE9sZVdlYkJyb3dzZXIuRElTUElEX1JFQURZU1RBVEUsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBPTEUuUFJPUEVSVFlfQ0hBTkdJTkcpIHJldHVybjsKLQkJCQlpbnQgc3RhdGUgPSB3ZWJCcm93c2VyLmdldFJlYWR5U3RhdGUoKTsKLQkJCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX1VOSU5JVElBTElaRUQ6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuVW5pbml0aWFsaXplZC50ZXh0IikpOwotCQkJCQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJd2ViQ29tbWFuZEZvcndhcmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl3ZWJDb21tYW5kSG9tZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXdlYkNvbW1hbmRSZWZyZXNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJd2ViQ29tbWFuZFN0b3Auc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl3ZWJDb21tYW5kU2VhcmNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX0xPQURJTkc6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuTG9hZGluZy50ZXh0IikpOwotCQkJCQkJd2ViQ29tbWFuZEhvbWUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCXdlYkNvbW1hbmRSZWZyZXNoLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl3ZWJDb21tYW5kU3RvcC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX0xPQURFRDoKLQkJCQkJCXdlYlN0YXR1cy5zZXRUZXh0KAotCQkJCQkJCU9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TdGF0ZS5Mb2FkZWQudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLlJFQURZU1RBVEVfSU5URVJBQ1RJVkU6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuSW50ZXJhY3RpdmUudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLlJFQURZU1RBVEVfQ09NUExFVEU6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuQ29tcGxldGUudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBMaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIGFjdGl2ZSBjb21tYW5kIHN0YXRlcwotCQl3ZWJDb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKE9sZVdlYkJyb3dzZXIuQ29tbWFuZFN0YXRlQ2hhbmdlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC50eXBlICE9IE9sZVdlYkJyb3dzZXIuQ29tbWFuZFN0YXRlQ2hhbmdlKSByZXR1cm47Ci0JCQkJZmluYWwgaW50IGNvbW1hbmRJRCA9Ci0JCQkJCShldmVudC5hcmd1bWVudHNbMF0gIT0gbnVsbCkgPyBldmVudC5hcmd1bWVudHNbMF0uZ2V0SW50KCkgOiAwOwotCQkJCWZpbmFsIGJvb2xlYW4gY29tbWFuZEVuYWJsZWQgPQotCQkJCQkoZXZlbnQuYXJndW1lbnRzWzFdICE9IG51bGwpID8gZXZlbnQuYXJndW1lbnRzWzFdLmdldEJvb2xlYW4oKSA6IGZhbHNlOwotCQkJCQotCQkJCXN3aXRjaCAoY29tbWFuZElEKSB7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5DU0NfTkFWSUdBVEVCQUNLOgotCQkJCQkgCXdlYkNvbW1hbmRCYWNrd2FyZC5zZXRFbmFibGVkKGNvbW1hbmRFbmFibGVkKTsKLQkJCQkJIAlicmVhazsKLQkJCQkJY2FzZSBPbGVXZWJCcm93c2VyLkNTQ19OQVZJR0FURUZPUldBUkQ6Ci0JCQkJCSAJd2ViQ29tbWFuZEZvcndhcmQuc2V0RW5hYmxlZChjb21tYW5kRW5hYmxlZCk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGluIHBsYWNlIGFjdGl2YXRlIHRoZSBBY3RpdmVYIGNvbnRyb2wJCQotCQlhY3RpdmF0ZWQgPSAod2ViQ29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpID09IE9MRS5TX09LKTsKLQkJaWYgKGFjdGl2YXRlZCkgd2ViQnJvd3Nlci5Hb0hvbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTU1YzJlMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgT2xlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE9sZVBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlzdGF0aWMgZmluYWwgaW50Ci0JCWJpQmFjayA9IDAsCi0JCWJpRm9yd2FyZCA9IDEsCi0JCWJpSG9tZSA9IDIsCi0JCWJpU3RvcCA9IDMsCi0JCWJpUmVmcmVzaCA9IDQsCi0JCWJpU2VhcmNoID0gNTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gaW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCSJpY29ucy9iYWNrd2FyZF9uYXYuZ2lmIiwKLQkJImljb25zL2ZvcndhcmRfbmF2LmdpZiIsCi0JCSJpY29ucy9ob21lX25hdi5naWYiLAotCQkiaWNvbnMvc3RvcF9uYXYuZ2lmIiwKLQkJImljb25zL3JlZnJlc2hfbmF2LmdpZiIsCi0JCSJpY29ucy9zZWFyY2hfbmF2LmdpZiIgfTsKLQlzdGF0aWMgSW1hZ2UgaW1hZ2VzW107Ci0Jc3RhdGljIEZvbnQgIGJyb3dzZXJGb250OwotICAgCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbiBPTEUgcGx1Z2luLgotCSAqLwotCXB1YmxpYyBPbGVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGdldEJ1bmRsZSgpKTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQ2xlYW4gdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPbGVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2cgYW4gZXJyb3IgdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlwbHVnaW4uZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoCi0JCQlJU3RhdHVzLkVSUk9SLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRSZXNvdXJjZXMoKSB7Ci0JCWlmIChpbWFnZXMgPT0gbnVsbCkgewotCQkJaW1hZ2VzID0gbmV3IEltYWdlW2ltYWdlTG9jYXRpb25zLmxlbmd0aF07Ci0JCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlTG9jYXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJaW1hZ2VzW2ldID0gZ2V0SW1hZ2VGcm9tUGx1Z2luKHBsdWdpbi5nZXRCdW5kbGUoKSwgaW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCWlmIChpbWFnZXNbaV0gPT0gbnVsbCkgewotCQkJCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSwgbnVsbCk7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGJyb3dzZXJGb250ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYnJvd3NlckZvbnQgPSBuZXcgRm9udCAobnVsbCwgIk1TIFNhbnMgU2VyaWYiLCA4LCBTV1QuTlVMTCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCX0KLQkJfQotCQlpZiAoaW1hZ2VzID09IG51bGwgfHwgYnJvd3NlckZvbnQgPT0gbnVsbCkgewotCQkJZnJlZVJlc291cmNlcygpOwotCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpLCBudWxsKTsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZyZWVzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpbWFnZXMgPSBudWxsOwotCQl9Ci0JCWlmIChicm93c2VyRm9udCAhPSBudWxsKSBicm93c2VyRm9udC5kaXNwb3NlICgpOwotCQlicm93c2VyRm9udCA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYW4gaW1hZ2UgZnJvbSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsIGRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBwZCB0aGUgcGx1Z2luIGRlc2NyaXB0b3IgZm9yIHRoZSBwbHVnaW4gd2l0aCB0aGUgaW1hZ2UKLQkgKiBAcGFyYW0gaWNvblBhdGggdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGluc3RhbGwgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIG51bGwgaWYgbm90IGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2VGcm9tUGx1Z2luKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBpY29uUGF0aCkgewotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVybCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIHVybCA9IG5ldyBVUkwoaW5zdGFsbFVybCwgaWNvblBhdGgpOwotCQkJaXMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoaXMpOwotCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgc291cmNlLCBtYXNrKTsKLQkJCXJldHVybiBpbWFnZTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlzICE9IG51bGwpIGlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVdlYkJyb3dzZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlV2ViQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDk4ODEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlV2ViQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci0KLS8qKgotICogV3JhcHBlciBmb3IgYW4gT2xlQXV0b21hdGlvbiBvYmplY3QgdXNlZCB0byBzZW5kIGNvbW1hbmRzCi0gKiB0byBhIFdpbjMyICJTaGVsbC5FeHBsb3JlciIgT0xFIGNvbnRyb2wuCi0gKiAKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIG1hbmFnZSB0aGUgc2V0dXAsIHR5cGljYWwgdXNlIGFuZCB0ZWFyZG93biBvZgotICogYSBzaW1wbGUgd2ViIGJyb3dzZXIuCi0gKi8KLWNsYXNzIE9sZVdlYkJyb3dzZXIgewotCS8qIFNlZSB0aGUgV2luZG93cyBQbGF0Zm9ybSBTREsgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkgKiBPTEUgY29udHJvbCB1c2VkIGhlcmUgYW5kIGl0cyB1c2FnZS4KLQkgKi8KLQkvLyBHZW5lcmF0ZWQgZnJvbSB0eXBlbGliIGZpbGVuYW1lOiBzaGRvY3Z3LmRsbAotCi0JLy8gQ29uc3RhbnRzIGZvciBXZWJCcm93c2VyIENvbW1hbmRTdGF0ZUNoYW5nZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTQ19VUERBVEVDT01NQU5EUyA9IC0xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTQ19OQVZJR0FURUZPUldBUkQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTQ19OQVZJR0FURUJBQ0sgPSAyOwotCi0JLy8gQ09uc3RhbnRzIGZvciBXZWIgQnJvd3NlciBSZWFkeVN0YXRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9VTklOSVRJQUxJWkVEID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0xPQURJTkcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfTE9BREVEID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0lOVEVSQUNUSVZFID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0NPTVBMRVRFID0gNDsKLQkKLQkvLyBXZWIgQnJvd3NlciBDb250cm9sIEV2ZW50cyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCZWZvcmVOYXZpZ2F0ZSAgICAgICAgPSAxMDA7IC8vIEZpcmVkIHdoZW4gYSBuZXcgaHlwZXJsaW5rIGlzIGJlaW5nIG5hdmlnYXRlZCB0by4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOYXZpZ2F0ZUNvbXBsZXRlICAgICAgPSAxMDE7IC8vIEZpcmVkIHdoZW4gdGhlIGRvY3VtZW50IGJlaW5nIG5hdmlnYXRlZCB0byBiZWNvbWVzIHZpc2libGUgYW5kIGVudGVycyB0aGUgbmF2aWdhdGlvbiBzdGFjay4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTdGF0dXNUZXh0Q2hhbmdlICAgICAgPSAxMDI7IC8vIFN0YXR1c2JhciB0ZXh0IGNoYW5nZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NDaGFuZ2UgICAgICAgID0gMTA4OyAvLyBGaXJlZCB3aGVuIGRvd25sb2FkIHByb2dyZXNzIGlzIHVwZGF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRG93bmxvYWRDb21wbGV0ZSAgICAgID0gMTA0OyAvLyBEb3dubG9hZCBvZiBwYWdlIGNvbXBsZXRlLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENvbW1hbmRTdGF0ZUNoYW5nZSAgICA9IDEwNTsgLy8gVGhlIGVuYWJsZWQgc3RhdGUgb2YgYSBjb21tYW5kIGNoYW5nZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEb3dubG9hZEJlZ2luICAgICAgICAgPSAxMDY7IC8vIERvd25sb2FkIG9mIGEgcGFnZSBzdGFydGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5ld1dpbmRvdyAgICAgICAgICAgICA9IDEwNzsgLy8gRmlyZWQgd2hlbiBhIG5ldyB3aW5kb3cgc2hvdWxkIGJlIGNyZWF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGl0bGVDaGFuZ2UgICAgICAgICAgID0gMTEzOyAvLyBEb2N1bWVudCB0aXRsZSBjaGFuZ2VkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lQmVmb3JlTmF2aWdhdGUgICA9IDIwMDsgLy8gRmlyZWQgd2hlbiBhIG5ldyBoeXBlcmxpbmsgaXMgYmVpbmcgbmF2aWdhdGVkIHRvIGluIGEgZnJhbWUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRnJhbWVOYXZpZ2F0ZUNvbXBsZXRlID0gMjAxOyAvLyBGaXJlZCB3aGVuIGEgbmV3IGh5cGVybGluayBpcyBiZWluZyBuYXZpZ2F0ZWQgdG8gaW4gYSBmcmFtZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGcmFtZU5ld1dpbmRvdyAgICAgICAgPSAyMDQ7IC8vIEZpcmVkIHdoZW4gYSBuZXcgd2luZG93IHNob3VsZCBiZSBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFF1aXQgICAgICAgICAgICAgICAgICA9IDEwMzsgLy8gRmlyZWQgd2hlbiBhcHBsaWNhdGlvbiBpcyBxdWl0aW5nLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd01vdmUgICAgICAgICAgICA9IDEwOTsgLy8gRmlyZWQgd2hlbiB3aW5kb3cgaGFzIGJlZW4gbW92ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93UmVzaXplICAgICAgICAgID0gMTEwOyAvLyBGaXJlZCB3aGVuIHdpbmRvdyBoYXMgYmVlbiBzaXplZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBY3RpdmF0ZSAgICAgICAgPSAxMTE7IC8vIEZpcmVkIHdoZW4gd2luZG93IGhhcyBiZWVuIGFjdGl2YXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9wZXJ0eUNoYW5nZSAgICAgICAgPSAxMTI7IC8vIEZpcmVkIHdoZW4gdGhlIFB1dFByb3BlcnR5IG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCi0KLQkvLyBXZWIgQnJvd3NlciBwcm9wZXJ0aWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUElEX1JFQURZU1RBVEUgPSAtNTI1OwotCi0JcHJpdmF0ZSBPbGVBdXRvbWF0aW9uICBvbGVBdXRvbWF0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIFdlYiBicm93c2VyIGNvbnRyb2wuCi0JICogPHA+Ci0JICogVHlwaWNhbCB1c2U6PGJyPgotCSAqIDxjb2RlPgotCSAqIE9sZUNvbnRyb2xTaXRlIG9sZUNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKG9sZUZyYW1lLCBzdHlsZSwgIlNoZWxsLkV4cGxvcmVyIik7PGJyPgotCSAqIE9sZUF1dG9tYXRpb24gb2xlQXV0b21hdGlvbiA9IG5ldyBPbGVBdXRvbWF0aW9uKG9sZUNvbnRyb2xTaXRlKTs8YnI+Ci0JICogT2xlV2ViQnJvd3NlciB3ZWJCcm93c2VyID0gbmV3IE9sZVdlYkJyb3dzZXIob2xlQ29udHJvbFNpdGUsIG9sZUF1dG9tYXRpb24pOzxicj4KLQkgKiA8L2NvZGU+Ci0JICogCi0gICAgICogQHBhcmFtIG9sZUF1dG9tYXRpb24gdGhlIE9sZUF1dG9tYXRpb24gb2JqZWN0IGZvciB0aGlzIGNvbnRyb2wuCi0gICAgICogQHBhcmFtIG9sZUNvbnRyb2xTaXRlIHRoZSBPbGVDb250cm9sU2l0ZSBvYmplY3QgZm9yIHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgT2xlV2ViQnJvd3NlcihPbGVBdXRvbWF0aW9uIG9sZUF1dG9tYXRpb24pIHsKLQkJdGhpcy5vbGVBdXRvbWF0aW9uID0gb2xlQXV0b21hdGlvbjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhlIFdlYiBicm93c2VyIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKG9sZUF1dG9tYXRpb24gIT0gbnVsbCkgb2xlQXV0b21hdGlvbi5kaXNwb3NlKCk7Ci0JCW9sZUF1dG9tYXRpb24gPSBudWxsOwotCX0KLQkKLQkvKgotCSAqIEludGVyYWN0IHdpdGggdGhlIENvbnRyb2wgdmlhIE9MRSBBdXRvbWF0aW9uCi0JICogCi0JICogTm90ZTogWW91IGNhbiBoYXJkIGNvZGUgdGhlIERJU1BJRHMgaWYgeW91IGtub3cgdGhlbSBiZWZvcmVoYW5kCi0JICogICAgICAgdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIGZhc3Rlc3Qgd2F5LCBidXQgeW91IGluY3JlYXNlIGNvdXBsaW5nCi0JICogICAgICAgdG8gdGhlIGNvbnRyb2wuCi0JICovCi0JIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgd2ViIHBhZ2UgdGl0bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCB3ZWIgcGFnZSB0aXRsZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uTmFtZSgpIHsKLQkJLy8gZGlzcGlkPTIxMCwgdHlwZT1QUk9QR0VULCBuYW1lPSJMb2NhdGlvbk5hbWUiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTG9jYXRpb25OYW1lIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVBdXRvbWF0aW9uLmdldFByb3BlcnR5KGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgIT0gT0xFLlZUX0JTVFIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRTdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBVUkwuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBVUkwgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTCgpIHsKLQkJLy8gZGlzcGlkPTIxMSwgdHlwZT1QUk9QR0VULCBuYW1lPSJMb2NhdGlvblVSTCIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJMb2NhdGlvblVSTCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJCi0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZUF1dG9tYXRpb24uZ2V0UHJvcGVydHkoZGlzcElkTWVtYmVyKTsKLQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSAhPSBPTEUuVlRfQlNUUikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldFN0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbnRyb2wsIG9uZSBvZjoKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfVU5JTklUSUFMSVpFRDsKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfTE9BRElORzsKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfTE9BREVEOwotCSAqICAgICAgICAgUkVBRFlTVEFURV9JTlRFUkFDVElWRTsKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfQ09NUExFVEUuCi0JICovCi0JcHVibGljIGludCBnZXRSZWFkeVN0YXRlKCkgewotCQkvLyBkaXNwaWQ9NDI5NDk2Njc3MSwgdHlwZT1QUk9QR0VULCBuYW1lPSJSZWFkeVN0YXRlIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlJlYWR5U3RhdGUifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCQotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVBdXRvbWF0aW9uLmdldFByb3BlcnR5KGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgIT0gT0xFLlZUX0k0KSByZXR1cm4gLTE7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldEludCgpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIHRocm91Z2ggcHJldmlvdXNseSB2aXNpdGVkIHdlYiBzaXRlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBHb0JhY2soKSB7Ci0JCi0JCS8vIGRpc3BpZD0xMDAsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb0JhY2siCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiR29CYWNrIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIHRocm91Z2ggcHJldmlvdXNseSB2aXNpdGVkIHdlYiBzaXRlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBHb0ZvcndhcmQoKSB7Ci0JCi0JCS8vIGRpc3BpZD0xMDEsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb0ZvcndhcmQiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiR29Gb3J3YXJkIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgdG8gaG9tZSBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIEdvSG9tZSgpIHsKLQkJLy8gZGlzcGlkPTEwMiwgdHlwZT1NRVRIT0QsIG5hbWU9IkdvSG9tZSIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJHb0hvbWUifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JfQotCQotCS8qKgotCSAqIE5hdmlnYXRlcyB0byB1c2VyLXNwZWNpZmllZCBXZWIgc2VhcmNoIGdhdGV3YXkuCi0JICovCi0JcHVibGljIHZvaWQgR29TZWFyY2goKSB7Ci0JCS8vIGRpc3BpZD0xMDMsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb1NlYXJjaCIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJHb1NlYXJjaCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogTmF2aWdhdGVzIHRvIGEgcGFydGljdWxhciBVUkwuCi0JICovCi0JcHVibGljIHZvaWQgTmF2aWdhdGUoU3RyaW5nIHVybCkgewotCQkvLyBkaXNwaWQ9MTA0LCB0eXBlPU1FVEhPRCwgbmFtZT0iTmF2aWdhdGUiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUiLCAiVVJMIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQkKLQkJVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50WzFdOwotCQlyZ3ZhcmdbMF0gPSBuZXcgVmFyaWFudCh1cmwpOwotCQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbMV07Ci0JCXJnZGlzcGlkTmFtZWRBcmdzWzBdID0gcmdkaXNwaWRbMV07IC8vIGlkZW50aWZpZXIgb2YgYXJndW1lbnQKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjdXJyZW50bHkgdmlld2VkIHBhZ2UuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBwbGF0Zm9ybS1kZWZpbmVkIHJlc3VsdCBjb2RlIGZvciB0aGUgIlJlZnJlc2giIG1ldGhvZCBpbnZvY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgUmVmcmVzaCgpewotCQkvLyBkaXNwaWQ9IDQyOTQ5NjY3NDYsIHR5cGU9TUVUSE9ELCBuYW1lPSJSZWZyZXNoIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlJlZnJlc2gifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlTm9SZXBseShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBBYm9ydHMgbG9hZGluZyBvZiB0aGUgY3Vycm5ldCBwYWdlLgotCSAqCi0JICogQHJldHVybiB0aGUgcGxhdGZvcm0tZGVmaW5lZCByZXN1bHQgY29kZSBmb3IgdGhlICJTdG9wIiBtZXRob2QgaW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIFN0b3AoKSB7Ci0JCS8vIGRpc3BpZD0xMDYsIHR5cGU9TUVUSE9ELCBuYW1lPSJTdG9wIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlN0b3AifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/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/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5jbGFzc3BhdGhfZmxleCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uY2xhc3NwYXRoX2ZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzhmNWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5jbGFzc3BhdGhfZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGluY2x1ZGluZz0iZXhhbXBsZXNfY29udHJvbC5wcm9wZXJ0aWVzfG9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS8iIGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1NjJkYjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbgotLmJ1aWxkYXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzcyNTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTU3NTcxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNDozMTozNyBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4MjY3Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNXZWQgTWF5IDAyIDE0OjI3OjIwIENFU1QgMjAwNwotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCi1jb21waWxlcnMucC5idWlsZD0xCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MgotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTEKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4NGQ5MjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHN3dGV4YW1wbGVzLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBzcmMvCi0gICAgICAgICAgICAgICAKLXNvdXJjZS5zd3RleGFtcGxlcy5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2FkZHJlc3Nib29rX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2FkZHJlc3Nib29rX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiMDRjMmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9hZGRyZXNzYm9va19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhYjIwZWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUU3RhbmRhbG9uZUV4YW1wbGVTZXQubmFtZSA9IFNXVCBTdGFuZGFsb25lIEV4YW1wbGVzIFBsdWdpbgotCi1sYXVuY2hjYXRlZ29yeS5TV1RTdGFuZGFsb25lRXhhbXBsZXMubmFtZSA9IFN0YW5kYWxvbmUKLWxhdW5jaGNhdGVnb3J5LlNXVFN0YW5kYWxvbmVFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgdGhhdCBydW4gaW5kZXBlbmRhbnQgXAotCW9mIHRoZSBFY2xpcHNlIFBsYXRmb3JtLgotCi1sYXVuY2hpdGVtLkFkZHJlc3NCb29rLm5hbWUgPSBBZGRyZXNzIEJvb2sKLWxhdW5jaGl0ZW0uQWRkcmVzc0Jvb2suZGVzY3JpcHRpb24gPSBcCi0JVGhlIEFkZHJlc3NCb29rIGV4YW1wbGUgc2hvd3MgaG93IHRoZSBUYWJsZSBjb250cm9sIGNhbiBiZSB1c2VkIHRvIFwKLQlwcmVzZW50IGluZm9ybWF0aW9uIGluIGEgdGFidWxhciBmb3JtYXQuXG5cblwKLQlUaGUgYXBwbGljYXRpb24gY2FuIHNhdmUgYW5kIGxvYWQgZGF0YSBmcm9tIGEgZmlsZSwgc29ydCB0aGUgZW50cmllcywgYW5kIFwKLQlzZWFyY2ggZm9yIHN0cmluZ3Mgd2l0aGluIHRoZSBmaWVsZHMuCi0KLWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUubmFtZSA9IEJyb3dzZXIKLWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC5cblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgY29tcG9zaXRlIGNvbnRhaW5pbmcgYSBCcm93c2VyIHdpZGdldCB0byByZW5kZXIgSFRNTC4gXAotCUFkZGl0aW9uYWwgd2lkZ2V0cyBhbGxvdyB0aGUgdXNlciB0byBwZXJmb3JtIHR5cGljYWwgYnJvd3NlciBhY3Rpb25zIChmb3IgZXhhbXBsZSwgbmF2aWdhdGUgdG8gYSBwYXJ0aWN1bGFyIFVSTCwgZ28gYmFjaywgZm9yd2FyZCwgcmVmcmVzaCBhbmQgc3RvcCkuCi0KLWxhdW5jaGl0ZW0uQ2xpcGJvYXJkLm5hbWUgPSBDbGlwYm9hcmQKLWxhdW5jaGl0ZW0uQ2xpcGJvYXJkLmRlc2NyaXB0aW9uID0gXAotCVRoZSBDbGlwYm9hcmQgZXhhbXBsZSBzaG93cyB0aGUgdmFyaW91cyBTV1QgY2xpcGJvYXJkIHRyYW5zZmVyIHR5cGVzIGluIHVzZS4KLQotbGF1bmNoaXRlbS5Db250cm9sRXhhbXBsZS5uYW1lID0gU1dUIENvbnRyb2xzIEV4YW1wbGUKLWxhdW5jaGl0ZW0uQ29udHJvbEV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhlIENvbnRyb2xzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGNvbnRyb2xzLiBcblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciBcCi0JdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBjb250cm9sLiBcCi0JVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgdGhlIGNvbnRyb2wuCi0KLWxhdW5jaGl0ZW0uRE5ELm5hbWUgPSBEcmFnIGFuZCBEcm9wCi1sYXVuY2hpdGVtLkRORC5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNob3dzIHRoZSB2YXJpb3VzIFNXVCBkcmFnIGFuZCBkcm9wIHRyYW5zZmVyIHR5cGVzIGluIHVzZS4KLQkKLWxhdW5jaGl0ZW0uRmlsZVZpZXdlci5uYW1lID0gRmlsZSBWaWV3ZXIKLWxhdW5jaGl0ZW0uRmlsZVZpZXdlci5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgRmlsZSBWaWV3ZXIgZXhhbXBsZSBzaG93cyBob3cgYSBzaW1wbGUgYXBwbGljYXRpb24gY2FuIGJlIGltcGxlbWVudGVkIHVzaW5nIFNXVC5cblxuXAotCVRoaXMgYXBwbGljYXRpb24gcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gbmF2aWdhdGUgZmlsZXMgYW5kIGZvbGRlcnMgYW5kIG1hbmlwdWxhdGUgdGhlbSB2aWEgRHJhZyBhbmQgRHJvcC4gIFwKLQlJdCBpbmNsdWRlcyB0aGUgdXNlIG9mIGFsdGVybmF0ZSB0aHJlYWRzIGZvciBsb25nIGFjdGlvbnMgYW5kIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBUcmVlLCBcCi0JVGFibGUsIFRvb2xiYXIgYW5kIFByb2dyYW0uCi0KLWxhdW5jaGl0ZW0uSG92ZXJIZWxwLm5hbWUgPSBIb3ZlciBIZWxwCi1sYXVuY2hpdGVtLkhvdmVySGVscC5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgSG92ZXIgSGVscCBleGFtcGxlIHNob3dzIGhvdyB0byBpbXBsZW1lbnQgY3VzdG9tIHRvb2x0aXBzIGFuZCBob3ZlciBoZWxwIHN1cHBvcnQgXAotCW9uIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBTV1QgY29udHJvbHMgaW5jbHVkaW5nIEJ1dHRvbnMsIFRhYmxlSXRlbXMsIFRvb2xJdGVtcyBhbmQgVHJlZUl0ZW1zLlxuXG5cCi0JVGhlIGV4YW1wbGUgaW1wbGVtZW50cyBpdHMgb3duIHRvb2x0aXAgYW5kIGhvdmVyIGhlbHAgc3VwcG9ydC4gIFwKLQlUbyBzZWUgdGhlIGN1c3RvbSB0b29sdGlwcyBpbiBhY3Rpb24sIGhvdmVyIG92ZXIgYW4gaXRlbSBvciBidXR0b24gaW4gdGhlIFVJLiAgXAotCUFuIGltYWdlIGFwcGVhcnMgaW4gdGhlIGxlZnQtaGFuZCBjb3JuZXIgb2YgdGhlIHRvb2x0aXAuXG5cblwKLQlUbyBzZWUgdGhlIGN1c3RvbSBob3ZlciBoZWxwIGluIGFjdGlvbiwgaG92ZXIgb3ZlciBhbiBpdGVtIG9yIGJ1dHRvbiBpbiB0aGUgVUkgdW50aWwgXAotCXRoZSB0b29sdGlwIGlzIGRpc3BsYXllZC4gIFdpdGhvdXQgbW92aW5nIHRoZSBtb3VzZSwgaGl0IEYxLiAgQSBuZXcgU2hlbGwgd2lsbCBwb3AgdXAgd2l0aCB0aGUgXAotCWV4dGVuZGVkIGhvdmVyIGhlbHAgaW5mb3JtYXRpb24gZm9yIHRoZSBVSSBlbGVtZW50IGluIHF1ZXN0aW9uCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDEubmFtZSA9IEhlbGxvIFdvcmxkICgxKQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBvcGVuIGEgU2hlbGwgYW5kIHByb2Nlc3MgdGhlIGV2ZW50cy4KLQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMi5uYW1lID0gSGVsbG8gV29ybGQgKDIpCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQyLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDEgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gZGlzcGxheSBhIExhYmVsIGluc2lkZSB0aGUgU2hlbGwuCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDMubmFtZSA9IEhlbGxvIFdvcmxkICgzKQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMy5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQyIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlc2l6ZSB0aGUgTGFiZWwgXAotCXdoZW4gdGhlIFNoZWxsIHJlc2l6ZXMgdXNpbmcgYSBMaXN0ZW5lciBtZWNoYW5pc20uCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDQubmFtZSA9IEhlbGxvIFdvcmxkICg0KQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkNC5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQyIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlc2l6ZSB0aGUgTGFiZWwgXAotCXdoZW4gdGhlIFNoZWxsIHJlc2l6ZXMgdXNpbmcgYSBMYXlvdXQuCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDUubmFtZSA9IEhlbGxvIFdvcmxkICg1KQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkNS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQxIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIGRyYXcgZGlyZWN0bHkgb24gYW4gU1dUIENvbnRyb2wgdXNpbmcgYSBncmFwaGljIGNvbnRleHQuCi0KLWxhdW5jaGl0ZW0uSW1hZ2VBbmFseXplci5uYW1lID0gSW1hZ2UgQW5hbHl6ZXIKLWxhdW5jaGl0ZW0uSW1hZ2VBbmFseXplci5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgSW1hZ2VBbmFseXplciBvcGVucyBpbWFnZSBmaWxlcyBhbmQgZGlzcGxheXMgdGhlIHZpc3VhbCBjb250ZW50cyBvZiB0aGUgZmlsZSBhbG9uZyB3aXRoIGEgXAotCXN1bW1hcnkgb2YgdGhlIGRhdGEgaW4gdGhlIGltYWdlIGZpbGUuXG5cblwKLQlUaGUgdXNlciBjYW4gbWFrZSBhZGp1c3RtZW50cyB0byB2YXJpb3VzIGVsZW1lbnRzIG9mIHRoZSBpbWFnZSBzdWNoIGFzIHNjYWxpbmcgYW5kIEFscGhhIFwKLQlibGVuZGluZyBhbmQgY2FuIHNhdmUgdGhlc2UgY2hhbmdlcyB0byBhIGZpbGUuXG5cblwKLQlUaGUgSW1hZ2VBbmFseXplciB3aWxsIGxvYWQgYW5kIGRpc3BsYXkgaW1hZ2UgZmlsZXMgb2YgdHlwZSBHSUYsIEpQRUcsIEJNUCwgSUNPLCBQTkcsIGFuZCBUSUZGLiAgXAotCVRvIG9wZW4gYSBmaWxlLCB1c2UgdGhlIEZpbGUtPk9wZW4uLi4gbWVudSBpdGVtLCBhbmQgc2VsZWN0IHRoZSBpbWFnZSBmaWxlIGluIHRoZSBGaWxlRGlhbG9nLlxuXG5cCi0JSWYgdGhlIGZpbGUgaXMgYW4gaW50ZXJsYWNlZCBHSUYgb3IgUE5HIG9yIGEgcHJvZ3Jlc3NpdmUgSlBFRywgYW5kIEluY3JlbWVudGFsIERpc3BsYXkgaXMgc2VsZWN0ZWQsIFwKLQl0aGVuIHRoZSBJbWFnZUFuYWx5emVyIGRpc3BsYXlzIHRoZSBpbWFnZSBpbmNyZW1lbnRzIGFzIHRoZXkgYXJlIGJlaW5nIGxvYWRlZC5cblxuXAotCUlmIHRoZSBmaWxlIGNvbnRhaW5zIGFuIGFuaW1hdGVkIEdJRiwgdGhlbiB0aGUgTmV4dCwgUHJldmlvdXMsIGFuZCBBbmltYXRlIGJ1dHRvbnMgYmVjb21lIGVuYWJsZWQsIFwKLQlhbmQgdGhleSBjYW4gYmUgdXNlZCB0byBjeWNsZSB0aHJvdWdoIHRoZSBpbWFnZXMgaW4gdGhlIGZpbGUsIG9yIGFuaW1hdGUgdGhlbS4gSWYgYSBHSUYgZGVmaW5lcyBhIGJhY2tncm91bmQgY29sb3IsIFwKLQlhcyBtYW55IGFuaW1hdGVkIEdJRnMgZG8sIHNlbGVjdGluZyBCYWNrZ3JvdW5kIHdpbGwgdXNlIHRoZSBHSUYncyBiYWNrZ3JvdW5kIGNvbG9yLlxuXG5cCi0JSWYgdGhlIGltYWdlIGhhcyB0cmFuc3BhcmVuY3kgKHBvc3NpYmxlIHdpdGggR0lGLCBQTkcsIG9yIElDTyksIHRoZW4gc2VsZWN0aW5nIERpc3BsYXkgTWFzayB3aWxsIGRyYXcgdGhlIGltYWdlJ3MgdHJhbnNwYXJlbmN5IFwKLQltYXNrIHRvIHRoZSByaWdodCBvZiB0aGUgaW1hZ2UuIFlvdSBjYW4gY2hhbmdlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBJbWFnZUFuYWx5emVyIHRvIHNlZSB0aGUgdHJhbnNwYXJlbmN5IHdvcmsuIFwKLQlUbyB0dXJuIG9mZiB0aGUgdHJhbnNwYXJlbmN5LCBkZXNlbGVjdCBEaXNwbGF5IFRyYW5zcGFyZW5jeS5cblxuXAotCUFmdGVyIGFuIGltYWdlIGlzIGxvYWRlZCwgaXQgY2FuIGJlIHNjYWxlZCBvciBoYXZlIGFscGhhIHRyYW5zcGFyZW5jeSBhcHBsaWVkLCB1c2luZyB0aGUgU2NhbGUgYW5kIEFscGhhLUsgY29tYm9zLCBcCi0JYW5kIHRoZSBBbHBoYSBtZW51LiBGaWxlLT5SZW9wZW4gcmVzdG9yZXMgc2NhbGluZyBhbmQgQWxwaGEgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYW5kIHJlbG9hZHMgdGhlIGN1cnJlbnQgaW1hZ2UgZmlsZS5cblxuXAotCUZpbGUtPlNhdmUgQXMuLi4gY2FuIGJlIHVzZWQgdG8gc2F2ZSB0aGUgY3VycmVudGx5IGxvYWRlZCBpbWFnZSB0byBhbm90aGVyIHR5cGUgb2YgaW1hZ2UgZmlsZS4gSWYgdGhlIGltYWdlIGhhcyB0cmFuc3BhcmVuY3ksIFwKLQlGaWxlLT5TYXZlIE1hc2sgQXMuLi4gc2F2ZXMgdGhlIGltYWdlJ3MgdHJhbnNwYXJlbmN5IG1hc2suXG5cblwKLQlXaGVuIFNXVCBsb2FkcyBhbiBpbWFnZSBmaWxlLCBhbiBpbnN0YW5jZSBvZiBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhIGlzIGNyZWF0ZWQuIChJbiB0aGUgY2FzZSBvZiBhbiBJQ08gZmlsZSBvciBcCi0JbXVsdGktaW1hZ2UgR0lGLCBhbiBhcnJheSBvZiBJbWFnZURhdGEgaW5zdGFuY2VzIGlzIGNyZWF0ZWQpLiBUaGUgSW1hZ2VBbmFseXplciBkaXNwbGF5cyBhbGwgb2YgdGhlIGRhdGEgc3RvcmVkIGluIHRoZSBJbWFnZURhdGEgXAotCWluc3RhbmNlKHMpIGZvciB0aGUgY3VycmVudGx5IGxvYWRlZCBpbWFnZSBmaWxlLCBpbmNsdWRpbmcgdGhlIHBpeGVsIGRhdGEuIEhvdmVyaW5nIG92ZXIgYSBwaXhlbCBpbiB0aGUgaW1hZ2UgZGlzcGxheSB3aWxsIHNob3cgdGhlIFJHQiBcCi0JY29sb3IgZGF0YSBmb3IgdGhhdCBwaXhlbC4gRm9yIGNlcnRhaW4gaW1hZ2VzIChwYXJ0aWN1bGFybHkgYW5pbWF0ZWQgR0lGcykgYWRkaXRpb25hbCBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyIFwKLQlpbnN0YW5jZSB1c2VkIHRvIGxvYWQgdGhlIGltYWdlLiBUaGUgSW1hZ2VBbmFseXplciBkaXNwbGF5cyB0aGlzIGRhdGEgYXMgd2VsbC4KLQotbGF1bmNoaXRlbS5KYXZhVmlld2VyLm5hbWUgPSBKYXZhIFN5bnRheCBWaWV3ZXIKLWxhdW5jaGl0ZW0uSmF2YVZpZXdlci5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBpbXBsZW1lbnQgYSB1c2VyLWRlZmluZWQgbGluZSBzdHlsZXIgZm9yIHRoZSBTdHlsZWRUZXh0IHdpZGdldC5cblxuXAotCVRoZSBleGFtcGxlIHByb3ZpZGVzIGEgdHlwaWNhbCBlZGl0b3IgaW50ZXJmYWNlLiAgXAotCVRvIHNlZSB0aGUgZWZmZWN0IG9mIHRoZSBsaW5lIHN0eWxlciwgb3BlbiBhICouamF2YSBmaWxlLiAgXAotCVdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGVkaXRvciBhcmVhLCBub3RpY2UgdGhhdCB0aGUga2V5d29yZHMgaGF2ZSBiZWVuIGhpZ2hsaWdodGVkLgotCi1sYXVuY2hpdGVtLkxheW91dEV4YW1wbGUubmFtZSA9IExheW91dCBFeGFtcGxlCi1sYXVuY2hpdGVtLkxheW91dEV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgY29tbW9uIFNXVCBsYXlvdXRzLiBcblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgXAotCXVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgbGF5b3V0LiBcCi0JVGhlIHVzZXIgY2FuIGluc2VydCB3aWRnZXRzIGludG8gYSBsYXlvdXQgYW5kIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBsYXlvdXQgZGF0YSBcCi0JdXNpbmcgYSBwcm9wZXJ0eSBzaGVldC4gIFdoZW4gdGhlIHVzZXIgaGFzIGEgc3VpdGFibGUgYXJyYW5nZW1lbnQsIGNvZGUgY2FuIGJlIFwKLQlnZW5lcmF0ZWQgYnkgY2xpY2tpbmcgb24gdGhlIENvZGUgYnV0dG9uLgotCi1sYXVuY2hpdGVtLkFkdmFuY2VkR3JhcGhpY3MubmFtZSA9IEFkdmFuY2VkIEdyYXBoaWNzCi1sYXVuY2hpdGVtLkFkdmFuY2VkR3JhcGhpY3MuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlICh1cGRhdGVkIGZvciAzLjMpIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBhcHBsaWNhdGlvbnMgdGhhdCBzaG93IHRoZSB1c2Ugb2YgYWR2YW5jZWQgZ3JhcGhpY3Mgb3BlcmF0aW9ucy4KLQotbGF1bmNoaXRlbS5UZXh0RWRpdG9yLm5hbWUgPSBUZXh0IEVkaXRvcgotbGF1bmNoaXRlbS5UZXh0RWRpdG9yLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgU3R5bGVkVGV4dCB3aWRnZXQgdG8gaW1wbGVtZW50IFwKLQlhIHRleHQgZWRpdG9yIHdpdGggZm9ybWF0dGluZyBzdXBwb3J0LlxuXG5cCi0JVGhlIGV4YW1wbGUgaGFzIGEgdHlwaWNhbCB0ZXh0IGVkaXRvciBpbnRlcmZhY2UuICBcCi0JVGhlIEVkaXQgbWVudSBjb250YWlucyBDdXQsIENvcHksIFBhc3RlIGFuZCBTZXQgRm9udCBpdGVtcyBhbmQgdGhlIHRvb2xiYXIgXAotCXByb3ZpZGVzIGEgYm9sZCB0ZXh0IHRvZ2dsZSwgdGhyZWUgY29sb3VyIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbiB0aGUgY3VycmVudCBcCi0Jc2VsZWN0aW9uLCBhbmQgYSByZXNldCB0byBkZWZhdWx0cyBidXR0b24gdGhhdCBhbHNvIG9wZXJhdGVzIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiYjliN2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gRmlsZSB3cml0dGVuIGJ5IFBERSAxLjAgLS0+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgbmFtZT0iJXBsdWdpbi5TV1RTdGFuZGFsb25lRXhhbXBsZVNldC5uYW1lIgotICAgdmVyc2lvbj0iMy40LjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciIgb3B0aW9uYWw9InRydWUiLz4KLTwvcmVxdWlyZXM+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTxydW50aW1lPgotICAgPGxpYnJhcnkgbmFtZT0ic3d0ZXhhbXBsZXMuamFyIj4KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgPC9saWJyYXJ5PgotPC9ydW50aW1lPgotCi08IS0tIEV4dGVuc2lvbnMgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08ZXh0ZW5zaW9uCi0gICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgIDxjYXRlZ29yeQotICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFN0YW5kYWxvbmVFeGFtcGxlcy5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RTdGFuZGFsb25lRXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSI+Ci0gICA8L2NhdGVnb3J5PgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkFkZHJlc3NCb29rLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQWRkcmVzc0Jvb2suZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2suc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2suQWRkcmVzc0Jvb2siPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkNsaXBib2FyZC5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkNsaXBib2FyZC5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jbGlwYm9hcmQuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkLkNsaXBib2FyZEV4YW1wbGUiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkRORC5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkRORC5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5kbmQuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZG5kLkROREV4YW1wbGUiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkZpbGVWaWV3ZXIubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5GaWxlVmlld2VyLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmZpbGV2aWV3ZXIuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZmlsZXZpZXdlci5GaWxlVmlld2VyIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5Ib3ZlckhlbHAubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5Ib3ZlckhlbHAuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaG92ZXJoZWxwLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhvdmVyaGVscC5Ib3ZlckhlbHAiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQxLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDEuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDEuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZC5IZWxsb1dvcmxkMSI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDIubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkMi5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkMi5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkLkhlbGxvV29ybGQyIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkMy5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQzLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQzLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQuSGVsbG9Xb3JsZDMiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQ0Lm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDQuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDQuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZC5IZWxsb1dvcmxkNCI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDUubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkNS5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkNS5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkLkhlbGxvV29ybGQ1Ij4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5JbWFnZUFuYWx5emVyLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSW1hZ2VBbmFseXplci5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5pbWFnZWFuYWx5emVyLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmltYWdlYW5hbHl6ZXIuSW1hZ2VBbmFseXplciI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSmF2YVZpZXdlci5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkphdmFWaWV3ZXIuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuamF2YXZpZXdlci5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyLkphdmFWaWV3ZXIiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLlRleHRFZGl0b3IubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5UZXh0RWRpdG9yLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnRleHRlZGl0b3Iuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMudGV4dGVkaXRvci5UZXh0RWRpdG9yIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5BZHZhbmNlZEdyYXBoaWNzLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQWR2YW5jZWRHcmFwaGljcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzRXhhbXBsZSIKLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvaXRlbT4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2FjY2Vzc2liaWxpdHkucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYWNjZXNzaWJpbGl0eS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NmY3YzJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYWNjZXNzaWJpbGl0eS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY29sb3IxID0gd2hpdGUKLWNvbG9yMiA9IGJsYWNrCi1jb2xvcjMgPSByZWQKLWNvbG9yNCA9IGRhcmsgcmVkCi1jb2xvcjUgPSBncmVlbgotY29sb3I2ID0gZGFyayBncmVlbgotY29sb3I3ID0geWVsbG93Ci1jb2xvcjggPSBkYXJrIHllbGxvdwotY29sb3I5ID0gYmx1ZQotY29sb3IxMCA9IGRhcmsgYmx1ZQotY29sb3IxMSA9IG1hZ2VudGEKLWNvbG9yMTIgPSBkYXJrIG1hZ2VudGEKLWNvbG9yMTMgPSBjeWFuCi1jb2xvcjE0ID0gZGFyayBjeWFuCi1jb2xvcjE1ID0gZ3JheQotY29sb3IxNiA9IGRhcmsgZ3JheQotCi1zcXVhcmUgPSBzcXVhcmUKLWNpcmNsZSA9IGNpcmNsZQotCi1uYW1lID0gezB9IHsxfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19hZGRyZXNzYm9vay5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19hZGRyZXNzYm9vay5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTI1MmUxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYWRkcmVzc2Jvb2sucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUxhc3RfbmFtZSA9IExhc3QgTmFtZQotRmlyc3RfbmFtZSA9IEZpcnN0IE5hbWUKLUJ1c2luZXNzX3Bob25lID0gQnVzaW5lc3MgUGhvbmUKLUhvbWVfcGhvbmUgPSBIb21lIFBob25lCi1FbWFpbCA9IEVtYWlsCi1GYXggPSBGYXgKLUNsb3NlX3NhdmUgPSBUaGUgYWRkcmVzcyBib29rIGNvbnRlbnRzIGhhdmUgY2hhbmdlZC5cbkRvIHlvdSB3YW50IHRvIHNhdmUgdGhlIGNoYW5nZXM/Ci1OZXdfdGl0bGUgPSBVbnRpdGxlZAotQ29sdW1uID0gQ29sdW1uOgotQm9va19leHRlbnNpb24gPSAuYWRyCi1Cb29rX2ZpbHRlcl9uYW1lID0gQWRkcmVzcyBCb29rcwotQWxsX2ZpbHRlcl9uYW1lID0gQWxsIEZpbGVzCi1GaWxlID0gRmlsZSAKLURvZXNfbm90X2V4aXN0ID0gZG9lcyBub3QgZXhpc3QuCi1GaWxlX25vdF9mb3VuZCA9IEZpbGUgbm90IGZvdW5kOgotSU9fZXJyb3JfcmVhZCA9IElPIGVycm9yIHJlYWRpbmcgdGV4dCBmaWxlOgotSU9fZXJyb3Jfd3JpdGUgPSBJTyBlcnJvciB3cml0aW5nIHRleHQgZmlsZToKLUlPX2Vycm9yX2Nsb3NlID0gSU8gZXJyb3IgY2xvc2luZyB0ZXh0IGZpbGU6Ci1UaXRsZV9iYXIgPSBBZGRyZXNzIEJvb2sgLSAKLVNhdmVfYXNfdGl0bGUgPSBTYXZlIEFzCi1RdWVyeV9vdmVyd3JpdGUgPSBhbHJlYWR5IGV4aXN0cy5cbkRvIHlvdSB3YW50IHRvIHJlcGxhY2UgaXQ/Ci1GaWxlX21lbnVfdGl0bGUgPSAmRmlsZQotTmV3X2NvbnRhY3QgPSAmTmV3IENvbnRhY3QuLi5cdEN0cmwrTgotRWRpdF9jb250YWN0ID0gJkVkaXQgQ29udGFjdC4uLlx0Q3RybCtFCi1OZXdfYWRkcmVzc19ib29rID0gTmV3IEFkZHJlc3MgJkJvb2tcdEN0cmwrQgotT3Blbl9hZGRyZXNzX2Jvb2sgPSAmT3BlbiBBZGRyZXNzIEJvb2suLi5cdEN0cmwrTwotU2F2ZV9hZGRyZXNzX2Jvb2sgPSAmU2F2ZSBBZGRyZXNzIEJvb2tcdEN0cmwrUwotU2F2ZV9ib29rX2FzID0gU2F2ZSAmQWRkcmVzcyBCb29rIEFzLi4uXHRDdHJsK0EKLUV4aXQgPSBFJnhpdAotRWRpdF9tZW51X3RpdGxlID0gJkVkaXQKLUVkaXQgPSAmRWRpdC4uLlx0Q3RybCtFCi1Db3B5ID0gJkNvcHlcdEN0cmwrQwotUGFzdGUgPSAmUGFzdGVcdEN0cmwrVgotRGVsZXRlID0gRGUmbGV0ZVx0RGVsCi1Tb3J0ID0gJlNvcnQKLVNlYXJjaF9tZW51X3RpdGxlID0gJlNlYXJjaAotRmluZCA9ICZGaW5kLi4uXHRDdHJsK0YKLUZpbmRfbmV4dCA9IEZpbmQgJk5leHQuLi5cdEYzCi1Qb3BfdXBfbmV3ID0gJk5ldy4uLgotUG9wX3VwX2VkaXQgPSAmRWRpdC4uLgotUG9wX3VwX2NvcHkgPSAmQ29weQotUG9wX3VwX3Bhc3RlID0gJlBhc3RlCi1Qb3BfdXBfZGVsZXRlID0gJkRlbGV0ZQotUG9wX3VwX2ZpbmQgPSAmRmluZC4uLgotSGVscF9tZW51X3RpdGxlID0gJkhlbHAKLUFib3V0ID0gJkFib3V0IEFkZHJlc3MgQm9vay4uLgotQWJvdXRfMSA9IEFib3V0IAotQWJvdXRfMiA9IFxudmVyc2lvbiAxLjAKLU9LID0gT0sKLUNhbmNlbCA9IENhbmNlbAotU2VhcmNoX2RpYWxvZ190aXRsZSA9IEZpbmQKLURpYWxvZ19maW5kX3doYXQgPSBGaSZuZCB3aGF0OgotRGlhbG9nX21hdGNoX2Nhc2UgPSBNYXRjaCAmY2FzZQotRGlhbG9nX21hdGNoX3dvcmQgPSBNYXRjaCAmd2hvbGUgd29yZAotRGlhbG9nX2RpcmVjdGlvbiA9IERpcmVjdGlvbgotRGlhbG9nX2Rpcl91cCA9ICZVcAotRGlhbG9nX2Rpcl9kb3duID0gJkRvd24KLURpYWxvZ19maW5kID0gJkZpbmQKLUNhbm5vdF9maW5kID0gQ2Fubm90IGZpbmQgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19icm93c2VyLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2Jyb3dzZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3Nzk5MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2Jyb3dzZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcwotd2luZG93LnRpdGxlID0gU1dUIEJyb3dzZXIKLQotQmFjawkJCQk9IEJhY2sKLUJyb3dzZXJOb3RDcmVhdGVkCT0gRXJyb3IgLSBUaGUgQnJvd3NlciB3aWRnZXQgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZC4gUGxlYXNlIGNoZWNrIHRoZSBCcm93c2VyIHdpZGdldCBpcyBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4gU3VwcG9ydGVkIHBsYXRmb3JtcyBhbmQgc29mdHdhcmUgcmVxdWlyZW1lbnRzIGZvciB0aGUgQnJvd3NlciB3aWRnZXQgYXJlIGxpc3RlZCBvbiB0aGUgU1dUIEZBUSB3ZWIgcGFnZS4KLUZvcndhcmQJCQkJPSBGb3J3YXJkCi1TdG9wCQkJCT0gU3RvcAotUmVmcmVzaAkJCQk9IFJlZnJlc2gKLUdvCQkJCQk9IEdvCi1TdGFydHVwCQkJCT0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19jb250cm9sLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2NvbnRyb2wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1YmM0NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2NvbnRyb2wucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1lcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMgPSBVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMKLXdpbmRvdy50aXRsZSA9IFNXVCBDb250cm9scwotY3VzdG9tLndpbmRvdy50aXRsZSA9IFNXVCBDdXN0b20gQ29udHJvbHMKLQotVGV4dF9CdXR0b25zCQk9IFRleHQgQnV0dG9ucwotU2l6ZSAJCQkJPSBTaXplCi1BbGlnbm1lbnQJCQk9IEFsaWdubWVudAotTGVmdAkJCQk9IExlZnQKLVJpZ2h0CQkJCT0gUmlnaHQKLVVwCQkJCQk9IFVwCi1Eb3duCQkJCT0gRG93bgotQ2VudGVyCQkJCT0gQ2VudGVyCi1PbmUJCQkJCT0gT25lCi1Ud28JCQkJCT0gVHdvCi1UaHJlZQkJCQk9IFRocmVlCi1JbWFnZV9CdXR0b25zCQk9IEltYWdlIEJ1dHRvbnMKLUltYWdlX1RleHRfQnV0dG9ucwk9IEltYWdlIGFuZCBUZXh0IEJ1dHRvbnMKLUNvbnRyb2xfRXhhbXBsZQkJPSBDb250cm9sIEV4YW1wbGUKLVBhcmFtZXRlcnMJCQk9IFBhcmFtZXRlcnMKLU90aGVyCQkJCT0gT3RoZXIKLUVuYWJsZWQJCQkJPSBFbmFibGVkCi1WaXNpYmxlCQkJCT0gVmlzaWJsZQotQmFja2dyb3VuZENvbG9yCQk9IEJhY2tncm91bmQgQ29sb3IKLUJhY2tncm91bmRJbWFnZQkJPSBCYWNrZ3JvdW5kIEltYWdlCi1Qb3B1cE1lbnUJCQk9IFBvcHVwIE1lbnUKLVByZWZlcnJlZCAJCQk9IFByZWZlcnJlZAotU3R5bGVzCSAJCQk9IFN0eWxlcwotTWVudV9TdHlsZXMJIAkJPSBNZW51IFN0eWxlcwotTWVudUl0ZW1fU3R5bGVzCSAJPSBNZW51SXRlbSBTdHlsZXMKLUJhY2tncm91bmRfTW9kZQkJPSBCYWNrZ3JvdW5kIE1vZGUgb24gUGFyZW50Ci1MaXN0ZW5lcnMJCQk9IExpc3RlbmVycwotU2VsZWN0X0xpc3RlbmVycwk9IFNlbGVjdCBMaXN0ZW5lcnMKLUxpc3RlbgkJCQk9IExpc3RlbgotRWRpdF9FdmVudAkJCT0gRWRpdCBFdmVudAotRWRpdF9FdmVudF9GaWVsZHMJPSBPbiB7MH0sIHJldHVybiB0aGUgZm9sbG93aW5nOgotUmV0dXJuaW5nCQkJPSA8LSBSZXR1cm5pbmc6IAotQ2xlYXIJCQkJPSBDbGVhcgotU2V0X0dldAkJCQk9IFNldC9HZXQgQVBJCi1QYXJhbWV0ZXJfSW5mbwkJPSB7MH0gICBlLmcuIHsxfSAKLUluZm9faW50CQkJPSA0Ci1JbmZvX2ludEEJCQk9IDAsMSwyCi1JbmZvX2xvbmcJCQk9IDQKLUluZm9fbG9uZ0EJCQk9IDAsMSwyCi1JbmZvX2NoYXIJCQk9IGMKLUluZm9fY2hhckEJCQk9IGEsYixjCi1JbmZvX2Jvb2xlYW4JCT0gdHJ1ZQotSW5mb19ib29sZWFuQQkJPSB0cnVlLHRydWUsZmFsc2UKLUluZm9fU3RyaW5nCQkJPSBoZWxsbwotSW5mb19TdHJpbmdBCQk9IGhlbGxvLHRoZXJlCi1JbmZvX1BvaW50CQkJPSAwLDAKLUluZm9fVGFiSXRlbQkJPSBUYWIgMAotSW5mb19UYWJJdGVtQQkJPSBUYWIgMCxUYWIgMgotSW5mb19UYWJsZUl0ZW0JCT0gSW5kZXg6MgotSW5mb19UYWJsZUl0ZW1BCQk9IEluZGV4OjIsSW5kZXg6NAotSW5mb19UcmVlSXRlbQkJPSBOb2RlIDEKLUluZm9fVHJlZUl0ZW1BCQk9IE5vZGUgMSxOb2RlIDMKLVNlbGVjdF9BbGwJCQk9IFNlbGVjdCBBbGwKLURlc2VsZWN0X0FsbAkJPSBEZXNlbGVjdCBBbGwKLU9LCQkJCQk9IE9LCi1GaWxsRGFtYWdlCQkJPSBGaWxsIERhbWFnZWQgQXJlYSBXaXRoIENvbG9yCi1UaXRsZV9UZXh0CQkJPSBUaXRsZSBUZXh0Ci1UZXh0X0xhYmVscwkJCT0gVGV4dCBMYWJlbHMKLUltYWdlX0xhYmVscwkJPSBJbWFnZSBMYWJlbHMKLUN1c3RvbV9MYWJlbHMJCT0gQ3VzdG9tIExhYmVscwotQ3VzdG9tX0NvbWJvCQk9IEN1c3RvbSBDb21ibwotT25lX1R3b19UaHJlZQkJPSBPbmUgVHdvIFRocmVlCi1UZXh0X1Rvb2xCYXIgCQk9IFRleHQgVG9vbEJhcgotSW1hZ2VfVG9vbEJhciAJCT0gSW1hZ2UgVG9vbEJhcgotSW1hZ2VUZXh0X1Rvb2xCYXIJPSBJbWFnZSBhbmQgVGV4dCBUb29sQmFyCi1NYXhpbXVtCQkJCT0gTWF4aW11bQotTWluaW11bQkJCQk9IE1pbmltdW0KLVNlbGVjdGlvbgkJCT0gU2VsZWN0aW9uCi1JbmNyZW1lbnQJCQk9IEluY3JlbWVudAotUGFnZV9JbmNyZW1lbnQJCT0gUGFnZSBJbmNyZW1lbnQKLVRodW1iCQkJCT0gVGh1bWIKLURpZ2l0cwkJCQk9IERpZ2l0cwotVHJlZV9XaXRoX0ltYWdlcwk9IFRyZWUgV2l0aCBJbWFnZXMKLURpYWxvZ19UeXBlCQkJPSBEaWFsb2cgVHlwZQotQ3JlYXRlX0RpYWxvZwkJPSBDcmVhdGUgRGlhbG9nCi1CdXR0b25fU3R5bGVzCQk9IEJ1dHRvbiBTdHlsZXMKLUljb25fU3R5bGVzCQkJPSBJY29uIFN0eWxlcwotTW9kYWxfU3R5bGVzCQk9IE1vZGFsIFN0eWxlcwotRmlsZV9EaWFsb2dfU3R5bGVzCT0gRmlsZSBEaWFsb2cgU3R5bGVzCi1PdGhlcl9TdHlsZXMJCT0gT3RoZXIgU3R5bGVzCi1JdGVtX1N0eWxlcwkJCT0gSXRlbSBTdHlsZXMKLURpYWxvZ19SZXN1bHQJCT0gRGlhbG9nIFJlc3VsdAotQ29sb3JEaWFsb2cJCQk9IENvbG9yRGlhbG9nCi1EaXJlY3RvcnlEaWFsb2cJCT0gRGlyZWN0b3J5RGlhbG9nCi1GaWxlRGlhbG9nCQkJPSBGaWxlRGlhbG9nCi1Gb250RGlhbG9nCQkJPSBGb250RGlhbG9nCi1QcmludERpYWxvZwkJCT0gUHJpbnREaWFsb2cKLU1lc3NhZ2VCb3gJCQk9IE1lc3NhZ2VCb3gKLU11bHRpX2xpbmUJCQk9IEEgbXVsdGkgbGluZSB0ZXh0IHdpZGdldC4KLUV4YW1wbGVfc3RyaW5nCQk9IFRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuCi1IZWFkZXJfVmlzaWJsZQkJPSBIZWFkZXIgVmlzaWJsZQotU29ydF9JbmRpY2F0b3IJCT0gU29ydCBJbmRpY2F0b3IKLUhlYWRlcl9JbWFnZXMJCT0gSGVhZGVyIEltYWdlcwotU3ViX0ltYWdlcwkJCT0gU3ViIEltYWdlcwotTGluZXNfVmlzaWJsZQkJPSBMaW5lcyBWaXNpYmxlCi1Nb3ZlYWJsZV9Db2x1bW5zCT0gTW92ZWFibGUgQ29sdW1ucwotUmVzaXphYmxlX0NvbHVtbnMJPSBSZXNpemFibGUgQ29sdW1ucwotTXVsdGlwbGVfQ29sdW1ucwk9IE11bHRpcGxlIENvbHVtbnMKLUxvY2tlZAkJCQk9IExvY2tlZAotQ29tYm9fY2hpbGQJCQk9IENvbWJvIENoaWxkCi1Ob2RlXzEJCQkJPSBOb2RlIDEKLU5vZGVfMgkJCQk9IE5vZGUgMgotTm9kZV8zCQkJCT0gTm9kZSAzCi1Ob2RlXzQJCQkJPSBOb2RlIDQKLU5vZGVfMV8xCQkJPSBOb2RlIDEuMQotTm9kZV8yXzEJCQk9IE5vZGUgMi4xCi1Ob2RlXzNfMQkJCT0gTm9kZSAzLjEKLU5vZGVfMl8yCQkJPSBOb2RlIDIuMgotTm9kZV8yXzJfMQkJCT0gTm9kZSAyLjIuMQotUGFyZW50CQkJCT0gUGFyZW50Ci1Ob19QYXJlbnQJCQk9IE5vIFBhcmVudAotRGVjb3JhdGlvbl9TdHlsZXMJPSBEZWNvcmF0aW9uIFN0eWxlcwotQ3JlYXRlX1NoZWxsCQk9IENyZWF0ZSBTaGVsbAotQ2xvc2VfQWxsX1NoZWxscwk9IENsb3NlIEFsbCBTaGVsbHMKLVB1c2gJCQkJPSBQdXNoCi1SYWRpbwkJCQk9IFJhZGlvCi1DaGVjawkJCQk9IENoZWNrCi1DYXNjYWRlCQkJCT0gQ2FzY2FkZQotRHJvcF9Eb3duCQkJPSBEcm9wIERvd24KLUltYWdlc19mYWlsZWQJCT0gV2FybmluZzogRmFpbGVkIHRvIGxvYWQgaW1hZ2VzCi1yZWFkbWVfdHh0CQkJPSByZWFkbWUudHh0Ci1JbmRleAkJCQk9IEluZGV4OgotVGl0bGUJCQkJPSBUaXRsZToKLUNsb3NlCQkJCT0gQ2xvc2UKLUJ1dHRvbgkJCQk9IEJ1dHRvbgotUmVzdWx0CQkJCT0gUmVzdWx0OiB7MH0KLUZpbHRlck5hbWVfMAkJPSBUZXh0IEZpbGVzCi1GaWx0ZXJOYW1lXzEJCT0gQmF0Y2ggRmlsZXMKLUZpbHRlck5hbWVfMgkJPSBEb2MgRmlsZXMKLUZpbHRlck5hbWVfMwkJPSBBbGwgRmlsZXMKLVRhYmxlVGl0bGVfMAkJPSBOYW1lCi1UYWJsZVRpdGxlXzEJCT0gVHlwZQotVGFibGVUaXRsZV8yCQk9IFNpemUKLVRhYmxlVGl0bGVfMwkJPSBNb2RpZmllZAotVGFibGVMaW5lMF8wCQk9IDxlbXB0eT4KLVRhYmxlTGluZTBfMQkJPSBjbGFzc2VzCi1UYWJsZUxpbmUwXzIJCT0gMAotVGFibGVMaW5lMF8zCQk9IHRvZGF5Ci1UYWJsZUxpbmUxXzAJCT0gPGVtcHR5PgotVGFibGVMaW5lMV8xCQk9IGRhdGFiYXNlcwotVGFibGVMaW5lMV8yCQk9IDI1NTYKLVRhYmxlTGluZTFfMwkJPSB0b21vcnJvdwotVGFibGVMaW5lMl8wCQk9IDxlbXB0eT4KLVRhYmxlTGluZTJfMQkJPSBpbWFnZXMKLVRhYmxlTGluZTJfMgkJPSA5MTU3MQotVGFibGVMaW5lMl8zCQk9IHllc3RlcmRheQotTGlzdERhdGEwXzAJCQk9IExpbmUgMQotTGlzdERhdGEwXzEJCQk9IExpbmUgMgotTGlzdERhdGEwXzIJCQk9IExpbmUgMwotTGlzdERhdGEwXzMJCQk9IExpbmUgNAotTGlzdERhdGEwXzQJCQk9IExpbmUgNQotTGlzdERhdGEwXzUJCQk9IExpbmUgNgotTGlzdERhdGEwXzYJCQk9IExpbmUgNwotTGlzdERhdGEwXzcJCQk9IExpbmUgOAotTGlzdERhdGEwXzgJCQk9IExvbmdlc3QgTGluZSBJbiBMaXN0Ci1MaXN0RGF0YTFfMAkJCT0gQXBwbGVzCi1MaXN0RGF0YTFfMQkJCT0gT3JhbmdlcwotTGlzdERhdGExXzIJCQk9IEJhbmFuYXMKLUxpc3REYXRhMV8zCQkJPSBHcmFwZWZydWl0Ci1MaXN0RGF0YTFfNAkJCT0gUGVhY2hlcwotTGlzdERhdGExXzUJCQk9IEtpd2kKLUxpc3REYXRhMV82CQkJPSBBcHJpY290cwotTGlzdERhdGExXzcJCQk9IFN0cmF3YmVycmllcwotTGlzdERhdGExXzgJCQk9IFRoZSBMb25nZXN0IFN0cmluZwotRHJvcERvd25EYXRhXzAJCT0gQXBwbGVzCi1Ecm9wRG93bkRhdGFfMQkJPSBPcmFuZ2VzCi1Ecm9wRG93bkRhdGFfMgkJPQotRHJvcERvd25EYXRhXzMJCT0gR3JhcGVmcnVpdAotRHJvcERvd25EYXRhXzQJCT0gUGVhY2hlcwotRHJvcERvd25EYXRhXzUJCT0gS2l3aQotRHJvcERvd25EYXRhXzYJCT0KLURyb3BEb3duRGF0YV83CQk9IFN0cmF3YmVycmllcwotRHJvcERvd25EYXRhXzgJCT0gVGhlIExvbmdlc3QgU3RyaW5nCi1Db2xvcnMgCQkJCT0gQ29sb3JzIGFuZCBGb250Ci1DaGFuZ2UJCQkJPSAmQ2hhbmdlLi4uCi1EZWZhdWx0cwkJCT0gJkRlZmF1bHRzCi1Gb3JlZ3JvdW5kX0NvbG9yCT0gRm9yZWdyb3VuZCBDb2xvcgotQmFja2dyb3VuZF9Db2xvcgk9IEJhY2tncm91bmQgQ29sb3IKLUZvbnQJCQkJPSBGb250Ci1JdGVtX0ZvcmVncm91bmRfQ29sb3IJPSBJdGVtIDAgRm9yZWdyb3VuZCBDb2xvcgotSXRlbV9CYWNrZ3JvdW5kX0NvbG9yCT0gSXRlbSAwIEJhY2tncm91bmQgQ29sb3IKLUl0ZW1fRm9udAkJCQk9IEl0ZW0gMCBGb250Ci1DZWxsX0ZvcmVncm91bmRfQ29sb3IJPSBJdGVtIDAgQ29sIDEgRm9yZWdyb3VuZCBDb2xvcgotQ2VsbF9CYWNrZ3JvdW5kX0NvbG9yCT0gSXRlbSAwIENvbCAxIEJhY2tncm91bmQgQ29sb3IKLUNlbGxfRm9udAkJCQk9IEl0ZW0gMCBDb2wgMSBGb250Ci1XcmFwX1RleHQJCQk9IEphY2sgYW5kIEppbGwgd2VudCB1cCB0aGUgaGlsbCB0byBmZXRjaCBhIHBhaWwgb2Ygd2F0ZXIsIFwKLQkJCQkJICBKYWNrIGZlbGwgZG93biBhbmQgYnJva2UgaGlzIGNyb3duIGFuZCBKaWxsIGNhbWUgdHVtYmxpbmcgYWZ0ZXIhCi1Gb3JlZ3JvdW5kX1N0eWxlCT0gRm9yZWdyb3VuZAotQmFja2dyb3VuZF9TdHlsZSAJPSBCYWNrZ3JvdW5kCi1TdHlsZWRUZXh0X1N0eWxlcwk9IFRleHQgU3R5bGVzCi1TdHlsZWRUZXh0X1N0eWxlX0luc3RydWN0aW9ucwk9IFNlbGVjdCB0ZXh0LCB0aGVuIHN0eWxlLgotQm9sZAkJCQk9IEJvbGQKLUl0YWxpYwkJCQk9IEl0YWxpYwotVW5kZXJsaW5lCQkJPSBVbmRlcmxpbmUKLVN0cmlrZW91dAkJCT0gU3RyaWtlb3V0Ci1GaWxsX1gJCQkJPSBIb3Jpem9udGFsIEZpbGwKLUZpbGxfWQkJCQk9IFZlcnRpY2FsIEZpbGwKLVBhY2tfQ29sdW1ucwkJPSBQYWNrIENvbHVtbnMKLVRhYkl0ZW0xXzAJCQk9IFRhYiAwCi1UYWJJdGVtMV8xCQkJPSBUYWIgMQotVGFiSXRlbTFfMgkJCT0gVGFiIDIKLVRhYkl0ZW1fY29udGVudAkJPSBUYWJJdGVtIENvbnRlbnQKLUNUYWJJdGVtMV8wCQkJPSBDVGFiSXRlbSAwCi1DVGFiSXRlbTFfMQkJCT0gQ1RhYkl0ZW0gMQotQ1RhYkl0ZW0xXzIJCQk9IENUYWJJdGVtIDIgaGFzIGEgbG9uZyBuYW1lCi1DSXRlbV9Db2xvcnMJCT0gQ1RhYkl0ZW0gQ29sb3JzCi1DVGFiSXRlbV9jb250ZW50CT0gQ1RhYkl0ZW0gQ29udGVudAotU2V0X1NpbXBsZV9UYWJzCQk9IFNpbXBsZSBUYWJzCi1TZXRfU2luZ2xlX1RhYnMJCT0gU2luZ2xlIFRhYgotU2V0X01pbl9WaXNpYmxlICAgICA9IE1pbmltaXplCi1TZXRfTWF4X1Zpc2libGUgICAgID0gTWF4aW1pemUKLVNldF9VbnNlbGVjdGVkX0Nsb3NlX1Zpc2libGUgPSBDbG9zZSBvbiBVbnNlbGVjdGVkIFRhYnMKLVNldF9VbnNlbGVjdGVkX0ltYWdlX1Zpc2libGUgPSBJbWFnZSBvbiBVbnNlbGVjdGVkIFRhYnMKLVNlbGVjdGlvbl9Gb3JlZ3JvdW5kX0NvbG9yID0gU2VsZWN0aW9uIEZvcmVncm91bmQgQ29sb3IKLVNlbGVjdGlvbl9CYWNrZ3JvdW5kX0NvbG9yID0gU2VsZWN0aW9uIEJhY2tncm91bmQgQ29sb3IKLVNldF9JbWFnZQkJCT0gU2V0IEltYWdlCi1UYWJsZVRyZWVfY29sdW1uCT0gQ29sdW1uCi1NZW51SXRlbV9DdXQJCT0gQ3UmdAlDdHJsK1gKLU1lbnVJdGVtX0NvcHkJCT0gJkNvcHkJQ3RybCtDCi1NZW51SXRlbV9QYXN0ZQkJPSAmUGFzdGUJQ3RybCtWCi1NZW51SXRlbV9TZWxlY3RBbGwJPSBTZWxlY3QgJkFsbAlDdHJsK0EKLU9yaWVudGF0aW9uIAkJPSBPcmllbnRhdGlvbgotRGVmYXVsdCAJCQk9IERlZmF1bHQgKEluaGVyaXQpCi1JbWFnZXMJCQkJPSBJbWFnZXMKLUFjY2VsZXJhdG9ycwkJPSBBY2NlbGVyYXRvcnMKLU1uZW1vbmljcwkJCT0gTW5lbW9uaWNzCi1TdWJNZW51CQkJCT0gU3ViLU1lbnUKLVN1YlN1Yk1lbnUJCQk9IFN1Yi1TdWItTWVudQotMVJhZGlvCQkJCT0gUmFkaW8xCi0yUmFkaW8JCQkJPSBSYWRpbzIKLTFSYWRpb1dpdGhNbmVtb25pYwk9IFJhZGlvJjEKLTJSYWRpb1dpdGhNbmVtb25pYwk9IFJhZGlvJjIKLVB1c2hXaXRoTW5lbW9uaWMJPSAmUHVzaAotUmFkaW9XaXRoTW5lbW9uaWMJPSAmUmFkaW8KLUNoZWNrV2l0aE1uZW1vbmljCT0gJkNoZWNrCi1DYXNjYWRlV2l0aE1uZW1vbmljCT0gQyZhc2NhZGUKLVBvcHVwTWVudUhlcmUJCT0gUG9wdXAgTWVudSBIZXJlCi1MaW5rVGV4dD1WaXNpdCB0aGUgPEEgSFJFRj1cInd3dy5lY2xpcHNlLm9yZ1wiPkVjbGlwc2Uub3JnPC9BPiBwcm9qZWN0IGFuZCB0aGUgPEEgSFJFRj1cInd3dy5lY2xpcHNlLm9yZ1xcc3d0Ij5TV1Q8L0E+IGhvbWVwYWdlLgotVG9vbHRpcAkJCQk9IFRvb2x0aXA6ICB7MH0KLUl0ZW0xX1RleHQJCQk9IFdoYXQgaXMgeW91ciBmYXZvcml0ZSBidXR0b24/Ci1JdGVtMl9UZXh0CQkJPSBXaGF0IGlzIHlvdXIgZmF2b3JpdGUgaWNvbj8KLVRvb2xUaXBfVGl0bGUJCT0gRm94ZXMgdnMuIERvZ3MKLU5vX0ljb24JCQkJPSBObyBJY29uCi1TaG93X0luX1RyYXkJCT0gU2hvdyBJbiBUcmF5Ci1Ccm93c2VyTm90Rm91bmQJCT0gQnJvd3NlciBub3QgZm91bmQ6ICB7MH0KLU1vemlsbGFOb3RGb3VuZAkJPSBDYW5ub3QgdXNlIFNXVC5NT1pJTExBIHN0eWxlOiAgezB9XG5TZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvZmFxLnBocCNob3d1c2Vtb3ppbGxhIGZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19maWxldmlld2VyLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2ZpbGV2aWV3ZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjZGRjZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2ZpbGV2aWV3ZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRpdGxlID0gU1dUIEZpbGVWaWV3ZXIgLSB7MH0KLQotbWVudS5GaWxlLnRleHQgPSAmRmlsZQotbWVudS5GaWxlLkNsb3NlLnRleHQgPSAmQ2xvc2UKLW1lbnUuRmlsZS5TaW11bGF0ZU9ubHkudGV4dCA9IFNpbXVsYXRlIEZpbGUgT3BlcmF0aW9ucwotbWVudS5IZWxwLnRleHQgPSAmSGVscAotbWVudS5IZWxwLkFib3V0LnRleHQgPSAmQWJvdXQKLQotdG9vbC5DdXQudGlwdGV4dCA9IEN1dAotdG9vbC5Db3B5LnRpcHRleHQgPSBDb3B5Ci10b29sLkRlbGV0ZS50aXB0ZXh0ID0gRGVsZXRlCi10b29sLlBhcmVudC50aXB0ZXh0ID0gUGFyZW50Ci10b29sLlBhc3RlLnRpcHRleHQgPSBQYXN0ZQotdG9vbC5QcmludC50aXB0ZXh0ID0gUHJpbnQKLXRvb2wuUmVmcmVzaC50aXB0ZXh0ID0gUmVmcmVzaAotdG9vbC5SZW5hbWUudGlwdGV4dCA9IFJlbmFtZQotdG9vbC5TZWFyY2gudGlwdGV4dCA9IFNlYXJjaAotCi1kZXRhaWxzLkFsbEZvbGRlcnMudGV4dCA9IEFsbCBGb2xkZXJzCi1kZXRhaWxzLkNvbnRlbnRzT2YudGV4dCA9IENvbnRlbnRzIG9mICcnezB9JycKLWRldGFpbHMuRmlsZVNpemUudGV4dCA9IHswfSBieXRlcwotZGV0YWlscy5EaXJOdW1iZXJPZk9iamVjdHMudGV4dCA9IHswfSBvYmplY3QocykKLWRldGFpbHMuTnVtYmVyT2ZTZWxlY3RlZEZpbGVzLnRleHQgPSB7MH0gb2JqZWN0KHMpIHNlbGVjdGVkCi0KLXRhYmxlLk5hbWUudGl0bGUgPSBOYW1lCi10YWJsZS5TaXplLnRpdGxlID0gU2l6ZQotdGFibGUuVHlwZS50aXRsZSA9IFR5cGUKLXRhYmxlLk1vZGlmaWVkLnRpdGxlID0gTW9kaWZpZWQKLQotZmlsZXR5cGUuVW5rbm93biA9IHswfSBGaWxlCi1maWxldHlwZS5Ob25lID0gRmlsZQotZmlsZXR5cGUuRm9sZGVyID0gRm9sZGVyCi1maWxlc2l6ZS5LQiA9IHswfSBrYgotCi1kaWFsb2cuQWJvdXQudGl0bGUgPSBBYm91dCBTV1QgRmlsZVZpZXdlcgotZGlhbG9nLkFib3V0LmRlc2NyaXB0aW9uID0gU1dUIEZpbGVWaWV3ZXJcblxuVmVyc2lvbjogMC45XG5cblJ1bm5pbmcgb246IHswfQotCi1kaWFsb2cuTm90SW1wbGVtZW50ZWQudGl0bGUgPSBOb3QgSW1wbGVtZW50ZWQKLWRpYWxvZy5BY3Rpb25Ob3RJbXBsZW1lbnRlZC5kZXNjcmlwdGlvbiA9IFNvcnJ5ISAgVGhlIGFjdGlvbiB5b3Ugc2VsZWN0ZWQgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLgotCi1kaWFsb2cuRmFpbGVkQ29weS50aXRsZSA9IENvcHkgRmlsZXMgRXJyb3IKLWRpYWxvZy5GYWlsZWRDb3B5LmRlc2NyaXB0aW9uID0gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGNvcHkgInswfSIgdG8gInsxfSIuCi0KLWRpYWxvZy5GYWlsZWREZWxldGUudGl0bGUgPSBEZWxldGUgRmlsZXMgRXJyb3IKLWRpYWxvZy5GYWlsZWREZWxldGUuZGVzY3JpcHRpb24gPSBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZGVsZXRlICJ7MH0iLgotCi1wcm9ncmVzc0RpYWxvZy5jYW5jZWxCdXR0b24udGV4dCA9IENhbmNlbAotcHJvZ3Jlc3NEaWFsb2cuQ29weS50aXRsZSA9IENvcHkgRmlsZXMKLXByb2dyZXNzRGlhbG9nLkNvcHkuZGVzY3JpcHRpb24gPSBDb3B5aW5nIGZpbGVzLgotcHJvZ3Jlc3NEaWFsb2cuQ29weS5vcGVyYXRpb24gPSBDb3B5aW5nLi4uIHswfQotcHJvZ3Jlc3NEaWFsb2cuTW92ZS50aXRsZSA9IE1vdmUgRmlsZXMKLXByb2dyZXNzRGlhbG9nLk1vdmUuZGVzY3JpcHRpb24gPSBNb3ZpbmcgZmlsZXMuCi1wcm9ncmVzc0RpYWxvZy5EZWxldGUub3BlcmF0aW9uID0gRGVsZXRpbmcuLi4gezB9Ci0KLXNpbXVsYXRlLkNvcHlGcm9tVG8udGV4dCA9IFNpbXVsYXRlZCBjb3B5IGZyb20gInswfSIgdG8gInsxfSIuCi1zaW11bGF0ZS5EaXJlY3Rvcmllc0NyZWF0ZWQudGV4dCA9IFNpbXVsYXRlZCBkaXJlY3RvcmllcyBjcmVhdGVkIGZvciAiezB9Ii4KLXNpbXVsYXRlLkRlbGV0ZS50ZXh0ID0gU2ltdWxhdGVkIGRlbGV0ZSBvZiAiezB9Ii4KLQotZXJyb3IuRmFpbGVkTGF1bmNoLm1lc3NhZ2UgPSBDb3VsZCBub3QgbGF1bmNoICJ7MH0iCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2dyYXBoaWNzLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2dyYXBoaWNzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhN2Q0MDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19ncmFwaGljcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFkdmFuY2VkR3JhcGhpY3M9QWR2YW5jZWQgR3JhcGhpY3MKLUdyYXBoaWNzRXhhbXBsZT1HcmFwaGljcyBFeGFtcGxlCi1TV1RHcmFwaGljcz1TV1QgR3JhcGhpY3MKLVdhcm5pbmc9V2FybmluZwotTGliTm90Rm91bmQ9QWR2YW5jZWQgZ3JhcGhpY3MgbGlicmFyeSBub3QgZm91bmQuIFNvbWUgZXhhbXBsZXMgd2lsbCBub3QgZGlzcGxheS4KLVNldHRpbmdzPVNldHRpbmdzCi1QbGF5PVBsYXkKLVBhdXNlPVBhdXNlCi1CYWNrZ3JvdW5kPUJhY2tncm91bmQKLURvdWJsZUJ1ZmZlcj1Eb3VibGUgQnVmZmVyCi1XaGl0ZT1XaGl0ZQotQmxhY2s9QmxhY2sKLVJlZD1SZWQKLUdyZWVuPUdyZWVuCi1CbHVlPUJsdWUKLUN5YW49Q3lhbgotWWVsbG93PVllbGxvdwkKLUN1c3RvbUNvbG9yPUN1c3RvbSBDb2xvcgotQ3VzdG9tUGF0dGVybj1DdXN0b20gUGF0dGVybgotUGF0dGVybjE9UGluayBMb3NhbmdlCi1QYXR0ZXJuMj1QdXJwbGUgQ2hlY2tlcnMKLVBhdHRlcm4zPUJsdWUgUGVudGFnb24KLUFuaW1hdGlvbj1BbmltYXRpb24KLVN0YXJQb2x5Z29uPVN0YXIgUG9seWdvbgotTGluZT1MaW5lCi1CbGFja0hvbGU9QmxhY2sgSG9sZQotRmlsbFJ1bGU9RmlsbCBSdWxlOgotUG9seWdvbnM9UG9seWdvbnMKLUludHJvZHVjdGlvbj1JbnRyb2R1Y3Rpb24KLVNXVD1TV1QKLUJvdW5jZT1Cb3VuY2UKLUZvbnQ9Rm9udAotTWlzYz1NaXNjCi1Db3VudGRvd249Q291bnRkb3duCi1MaW5lV2lkdGg9TGluZSBXaWR0aAotQW50aWFsaWFzaW5nPUFudGlhbGlhc2luZwotTGluZUNhcD1MaW5lIENhcAotU3BpcmFsPVNwaXJhbAotUGV0YWxzPVBldGFscwotR3JhZGllbnQ9R3JhZGllbnQKLUdyYWRJbWFnZT1HcmFkaWVudCBJbWFnZQotU3dhcENvbG9ycz1Td2FwIENvbG9ycwotQ3VydmVzPUN1cnZlcwotQ3ViaWM9Q3ViaWMKLVF1YWRyYXRpYz1RdWFkcmF0aWMKLUxpbmVzPUxpbmVzCi1GbGF0PUZsYXQKLVNxdWFyZT1TcXVhcmUKLVJvdW5kPVJvdW5kCi1MaW5lU3R5bGVzPUxpbmUgU3R5bGVzCi1HcmFkaWVudERsZ01zZz1QbGVhc2Ugc2VsZWN0IHR3byBjb2xvcnM6Ci1HcmFkaWVudERsZ0J1dHRvbjE9Q29sb3IgMQotR3JhZGllbnREbGdCdXR0b24yPUNvbG9yIDIKLUdyYWRpZW50VGFiSXRlbTE9Q29sb3IgMQotR3JhZGllbnRUYWJJdGVtMj1Db2xvciAyCi1BbHBoYT1BbHBoYQotQ3VzdG9tRm9udD1DdXN0b20gRm9udAotUmVndWxhcj1SZWd1bGFyCi1JdGFsaWM9SXRhbGljCi1Cb2xkPUJvbGQKLUJvbGRJdGFsaWM9Qm9sZCBJdGFsaWMKLUZvbnRGYWNlPUZhY2UKLUZvbnRTdHlsZT1TdHlsZQotRm9udFNpemU9U2l6ZQotQ29sb3I9Q29sb3IKLUNsaXBwaW5nPUNsaXBwaW5nCi1QYXRoQ2xpcHBpbmc9UGF0aCBDbGlwcGluZwotQ2lyY2xlcz1DaXJjbGVzCi1SZWN0YW5nbGU9UmVjdGFuZ2xlCi1PdmFsPU92YWwKLVdvcmQ9V29yZAotU3Rhcj1TdGFyCi1UcmlhbmdsZXM9VHJpYW5nbGVzCi1EZWZhdWx0PURlZmF1bHQKLVJlZ2lvbkNsaXBwaW5nPVJlZ2lvbiBDbGlwcGluZwotUmVnaW9uMT1SZWdpb24gMQotUmVnaW9uMj1SZWdpb24gMgotQWRkPUFkZAotU3ViPVN1YnRyYWN0Ci1JbnRlcj1JbnRlcnNlY3QKLUludGVycG9sYXRpb249SW50ZXJwb2xhdGlvbgotSW1hZ2U9SW1hZ2UKLU9yaWdpbmFsSW1nPU9yaWdpbmFsIEltYWdlCi1Ib3VzZT1Ib3VzZQotUXVlc3Rpb249UXVlc3Rpb24KLVRhc2s9VGFzawotQ3ViZT1DdWJlCi1PdmFscz1PdmFscwotTm9uZT1Ob25lCi1Mb3c9TG93Ci1EZWZhdWx0PURlZmF1bHQKLUhpZ2g9SGlnaAotVHJhbnNmb3JtPVRyYW5zZm9ybQotQ2FyZHM9Q2FyZHMKLVNvbGlkPVNvbGlkCi1EYXNoPURhc2gKLURvdD1Eb3QKLURhc2hEb3Q9RGFzaCBEb3QKLURhc2hEb3REb3Q9RGFzaCBEb3QgRG90Ci1MaW5lSm9pbj1MaW5lIEpvaW4KLWJldmVsPUJFVkVMCi1taXRlcj1NSVRFUgotcm91bmQ9Uk9VTkQKLUJhbGw9QmFsbAotQ3VzdG9tQWxwaGE9Q3VzdG9tIEFscGhhCi1NYXplPU1hemUKLXJnYj1SR0IKLUdyYXBoaWNzPUdyYXBoaWNzCi1GbGlwPUZsaXAKLVNjYWxlPVNjYWxlCi1Sb3RhdGU9Um90YXRlCi14c2NhbGU9WC1TY2FsZQoteXNjYWxlPVktU2NhbGUKLUludmVydD1JbnZlcnQKLVBhdGg9UGF0aAotUGF0aE9wZXI9UGF0aCBPcGVyYXRpb25zCi1EcmF3UGF0aD1EcmF3IFBhdGgKLUZpbGxQYXRoPUZpbGwgUGF0aAotQ2xvc2VQYXRoPUNsb3NlIFBhdGgKLUZpbGxDb2xvcj1GaWxsIENvbG9yCi1UZXh0PVRleHQKLVNoYXBlcz1TaGFwZXMKLU5leHQ9TmV4dAotQmFjaz1CYWNrCi1BbmltUGF0aENsaXBwaW5nPUFuaW1hdGVkIFBhdGggQ2xpcHBpbmcKLSMjIyMjIC0tLS0tLS0tLS0tLS0tLS0tLSBUYWIgRGVzY3JpcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLSAjIyMjIwotQWxwaGFEZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgYWxwaGEgYmxlbmRpbmcuIEl0IGRyYXdzIHZhcmlvdXMgc2hhcGVzIGFuZCBpbWFnZXMgYXMgYWxwaGEgdmFsdWVzIGNoYW5nZS4KLUJhbGxEZXNjcmlwdGlvbj1UaGlzIHRhYiB1c2VzIGFscGhhIGJsZW5kaW5nIHRvIHNpbXVsYXRlIFwiZ2hvc3RpbmdcIiBvZiBhIGJhbGwgaW4gbW92ZW1lbnQuCi1CbGFja0hvbGVEZXNjcmlwdGlvbj1UaGlzIGlzIGEgbWlzY2VsbGFuZW91cyBkZW1vbnN0cmF0aW9uIHRoYXQgbWFrZXMgdXNlIG9mIHRoZSBmaWxsT3ZhbCgpIG9wZXJhdGlvbiB0byBzaW11bGF0ZSBhIGJsYWNrIGhvbGUuCi1DYXJkc0Rlc2NyaXB0aW9uPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyB2YXJpb3VzIHRyYW5zZm9ybWF0aW9ucywgc3VjaCBhcyBzY2FsaW5nLCByb3RhdGlvbiwgYW5kIHRyYW5zbGF0aW9uLgotQ291bnRkb3duRGVzY3JpcHRpb249VGhpcyBtaXNjZWxsYW5lb3VzIHRhYiBwcmVzZW50cyBhIGNvdW50IGRvd24gZnJvbSA1IHRvIDEsIHRoZW4gZGlzcGxheXMgU1dULgotQ3VydmVzU1dURGVzY3JpcHRpb249VGhpcyB0YWIgcHJlc2VudHMgY3ViaWMgYW5kIHF1YWRyYXRpYyBjdXJ2ZXMgdGhhdCBjYW4gYmUgZHJhd24uICBBcyBhIGRlbW9uc3RyYXRpb24sIGN1YmljIGFuZCBxdWFkcmF0aWMgY3VydmVzIGFyZSB1c2VkIHRvIHNwZWxsIG91dCBcIlNXVFwiLiAgVGhlIHVzZXIgbWF5IHJlcG9zaXRpb24gdGhlIGN1YmljIGFuZCBxdWFkcmF0aWMgaGFuZGxlcy4KLUN1cnZlc0Rlc2NyaXB0aW9uPVRoaXMgdGFiIHByZXNlbnRzIGN1YmljIGFuZCBxdWFkcmF0aWMgY3VydmVzIHRoYXQgY2FuIGJlIGRyYXduLiAgVGhlIHVzZXIgbWF5IHJlcG9zaXRpb24gdGhlIGN1YmljIGFuZCBxdWFkcmF0aWMgaGFuZGxlcwotQ3VzdG9tQWxwaGFEZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBhbHBoYSBibGVuZGluZy4gIEl0IGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSBhIGN1c3RvbSBhbHBoYSB2YWx1ZS4KLUN1c3RvbUZvbnREZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdmFyaW91cyB0ZXh0IGZvbnRzLiAgSXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgZm9udCBwYXJhbWV0ZXJzIHN1Y2ggYXMgZmFjZSwgc3R5bGUgYW5kIHNpemUuCi1Gb250Qm91bmNlRGVzY3JpcHRpb249VGhpcyB0YWIgaXMgYW4gYW5pbWF0ZWQgZ3JhcGhpYy4gSXQgcHJlc2VudHMgdGhlIHdvcmQgU1dUIGluIGRpZmZlcmVudCBmb250cyBhcyBpdCBib3VuY2VzIGFyb3VuZCB0aGUgc2NyZWVuLgotR3JhZGllbnRJbWFnZURlc2NyaXB0aW9uPVRoaXMgdGFiIGlzIGFuIGFuaW1hdGVkIGdyYXBoaWMuIEl0IHByZXNlbnRzIHRoZSB3b3JkIFNXVCBpbiBkaWZmZXJlbnQgZm9udHMgYXMgaXQgYm91bmNlcyBhcm91bmQgdGhlIHNjcmVlbi4KLUFudGlhbGlhc2luZ0dyYXBoaWNzRGVzYz1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgYW50aWFsaWFzaW5nIGZvciBncmFwaGljcy4gQW50aWFsaWFzaW5nIGlzIHVzZWQgZm9yIHNtb290aGluZyBqYWdnZWQgZWRnZXMgaW4gZ3JhcGhpY3MuIFRoaXMgdGFiIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlIGVmZmVjdHMgb2YgZGlmZmVyZW50IGFudGlhbGlhc2luZyB2YWx1ZXMuCi1GbGlwRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIGhvdyBhbiBpbWFnZSBjYW4gYmUgZmxpcHBlZCBpbiB2YXJpb3VzIGZhc2hpb25zLgotU2NhbGVEZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgaG93IGFuIGltYWdlIGNhbiBiZSBzY2FsZWQuIFJlc2l6ZSB0aGUgc2hlbGwsIGFuZCB0aGUgaW1hZ2Ugd2lsbCBzY2FsZSB3aXRoIGl0LgotVHJhbnNmb3JtSW1nRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIHRyYW5zZm9ybWF0aW9ucywgc3VjaCBhcyBzY2FsaW5nLCByb3RhdGlvbiwgYW5kIGludmVydC4gIEl0IGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IHZhbHVlcyBmb3Igc2NhbGluZyBhbmQgcm90YXRpb24uCi1JbWFnZUludGVycG9sYXRpb25EZXNjPVRoaXMgdGFiIHNob3dzIHRoZSBlZmZlY3RzIG9mIGFwcGx5aW5nIHZhcmlvdXMgaW50ZXJwb2xhdGlvbiBhbGdvcml0aG1zIHRvIGltYWdlcyB0aGF0IGhhdmUgYmVlbiBzdHJldGNoZWQgb3Igc2hydW5rLgotSW50cm9kdWN0aW9uRGVzY3JpcHRpb249VGhpcyBpcyB0aGUgaW50cm9kdWN0aW9uIHRhYi4gIFRoaXMgZGVtb25zdHJhdGlvbiBtYWtlcyB1c2Ugb2YgYSBwYXRoIGNsaXBwaW5nLgotTGluZUNhcERlc2NyaXB0aW9uPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyB2YXJpb3VzIGxpbmUgY2FwcyBhcHBsaWNhYmxlIHRvIGEgbGluZS4KLUxpbmVKb2luRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIHZhcmlvdXMgbGluZSBqb2lucy4gSXQgYWxsb3dzIGEgdXNlciB0byBjaG9vc2UgZnJvbSBiZXZlbCwgbWl0ZXIgYW5kIHJvdW5kLgotTGluZVN0eWxlc0Rlc2NyaXB0aW9uPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyBsaW5lIHN0eWxlcyBhcHBsaWNhYmxlIHRvIGEgbGluZS4gIEl0IHNob3dzIHRoZSB1c2Ugb2YgdGhlIHNldExpbmVTdHlsZSgpIG1ldGhvZC4KLUxpbmVEZXNjcmlwdGlvbj1UaGlzIHRhYiBkcmF3cyB0d28gbGluZXMuCi1NYXplRGVzY3JpcHRpb249VGhpcyBpcyBhIG1pc2NlbGxhbmVvdXMgZGVtb25zdHJhdGlvbi4gIFRocmVlIG9iamVjdHMgbW92ZSB0aHJvdWdoIHRoZSBtYXplLCBlYWNoIGZvbGxvd2luZyBhIGRpZmZlcmVudCBwYXRoLiAgT25seSBvbmUgb2YgdGhlIHRocmVlIGZvbGxvd3MgdGhlIGNvcnJlY3QgcGF0aC4KLUFuaW1QYXRoQ2xpcHBpbmdEZXNjPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHBhdGggY2xpcHBpbmcuICBBIGNsaXBwaW5nIGlzIHRoZSBhcmVhIG9udG8gd2hpY2ggYSBkcmF3aW5nIGlzIG1hZGUgdmlzaWJsZS4gIFRoZSBkZWZhdWx0IGNsaXBwaW5nIGlzIHRoZSBlbnRpcmUgY2FudmFzIChhbGwgdGhlIHNwYWNlIGluIHRoZSByaWdodCBwYW5lbCkuICBIb3dldmVyLCBvbmUgY2FuIHNldCB0aGUgY2xpcHBpbmcgdG8gYmUgc29tZXRoaW5nIGRpZmZlcmVudC4gIEluIHRoaXMgdGFiLCB0aGUgY2xpcHBpbmcgaXMgdGhlIHNldCBvZiB0cmlhbmdsZXMsIHJlY3RhbmdsZXMgYW5kIHRoZSBjaXJjbGUuICBXaGVuIHRoZSBibHVlIHJlY3RhbmdsZSBpcyBkcmF3biwgb25seSB0aGUgcG9ydGlvbnMgb2YgdGhlIGJsdWUgcmVjdGFuZ2xlIGFwcGVhcmluZyBpbiB0aGUgY2xpcHBpbmcgYXJlIHZpc2libGUuCi1QYXRoQ2xpcHBpbmdEZXNjPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHBhdGggY2xpcHBpbmcuICBBIGNsaXBwaW5nIGlzIHRoZSBhcmVhIG9udG8gd2hpY2ggYSBkcmF3aW5nIGlzIG1hZGUgdmlzaWJsZS4gIFRoZSBkZWZhdWx0IGNsaXBwaW5nIGlzIHRoZSBlbnRpcmUgY2FudmFzIChhbGwgdGhlIHNwYWNlIGluIHRoZSByaWdodCBwYW5lbCkuICBIb3dldmVyLCBvbmUgY2FuIHNldCB0aGUgY2xpcHBpbmcgdG8gYmUgc29tZXRoaW5nIGRpZmZlcmVudC4KLVBhdGhPcGVyRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgcGF0aHMuIEl0IGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gZmlsbGluZywgZHJhd2luZyBhbmQgY2xvc2luZyBwYXRocy4KLXJnYkRlc2NyaXB0aW9uPU1pc2NlbGxhbmVvdXMgdGFiIHRoYXQgZGVtb25zdHJhdGVzIGVtZXJnaW5nIGNvbG9ycyBmcm9tIGxheWVyaW5nIG90aGVyIGNvbG9ycy4KLVJlZ2lvbkNsaXBwaW5nRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIGhvdyB0byBhcHBseSBhIHJlZ2lvbiBjbGlwcGluZyBhbmQgdGhlIGVmZmVjdHMgb2YgYXBwbHlpbmcgb25lLiAgSXQgYWxzbyBkZW1vbnN0cmF0ZXMgdGhlIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCBiZXR3ZWVuIHR3byByZWdpb25zLgotU2hhcGVzRGVzY3JpcHRpb249VGhpcyB0YWIgZHJhd3MgM0Qgc2hhcGVzIChpbiAyRCkgdXNpbmcgdmFyaW91cyBsaW5lIHN0eWxlcy4KLVNwaXJhbERlc2NyaXB0aW9uPU1pc2NlbGxhbmVvdXMgdGFiIHRoYXQgcHJlc2VudHMgYSBzcGlyYWwgY29uc2lzdGluZyBvZiB0aGUgbnVtYmVyIG9mIHBldGFscyBzcGVjaWZpZWQuCi1TdGFyUG9seWdvbkRlc2NyaXB0aW9uPVRoaXMgdGFiIGRyYXdzIGEgcG9seWdvbiBhbmQgc2hvd3MgdGhlIGVmZmVjdHMgb2Ygc2V0dGluZyBkaWZmZXJlbnQgZmlsbCBydWxlczogU1dULkZJTExfV0lORElORyBvciBTV1QuRklMTF9FVkVOX09ERAotQW50aWFsaWFzaW5nVGV4dERlc2M9VGhpcyB0YWIgZGVtb25zdHJhdGVzIGFudGlhbGlhc2luZyBmb3IgdGV4dC4gQW50aWFsaWFzaW5nIGlzIHVzZWQgZm9yIHNtb290aGluZyBqYWdnZWQgZWRnZXMgaW4gZ3JhcGhpY3MuIFRoaXMgdGFiIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlIGVmZmVjdHMgb2YgZGlmZmVyZW50IGFudGlhbGlhc2luZyB2YWx1ZXMuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2hlbGxvd29ybGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaGVsbG93b3JsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDQwYTE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaGVsbG93b3JsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSGVsbG9fd29ybGQgPSBIZWxsbyBXb3JsZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaG92ZXJoZWxwLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2hvdmVyaGVscC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTA0ZGY3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaG92ZXJoZWxwLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1lcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMgPSBVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMgOiB7MH0KLQotVG9vbEl0ZW0udGV4dCA9IFRvb2xJdGVtIHswfQotVG9vbEl0ZW0udG9vbHRpcCA9IFRvb2x0aXAgZm9yIHswfS4gVHJ5IHByZXNzaW5nIHsxfSBvbiBtZS4KLVRvb2xJdGVtLmhlbHAgPSBIZWxwIHRleHQgZm9yIHswfS4KLQotVGFibGVJdGVtLnRleHQgPSBUYWJsZUl0ZW0gezB9Ci1UYWJsZUl0ZW0udG9vbHRpcCA9IFRvb2x0aXAgZm9yIHswfS4gVHJ5IHByZXNzaW5nIHsxfSBvbiBtZS4KLVRhYmxlSXRlbS5oZWxwID0gSGVscCB0ZXh0IGZvciB7MH0uCi0KLVRyZWVJdGVtLnRleHQgPSBUcmVlSXRlbSB7MH0KLVRyZWVJdGVtLnRvb2x0aXAgPSBUb29sdGlwIGZvciB7MH0uIFRyeSBwcmVzc2luZyB7MX0gb24gbWUuCi1UcmVlSXRlbS5oZWxwID0gSGVscCB0ZXh0IGZvciB7MH0uCi0KLUhlbGxvLnRleHQgPSBIZWxsbwotSGVsbG8udG9vbHRpcCA9IEdyZWV0aW5ncyEKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaW1hZ2VzLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2ltYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjg5ODljLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaW1hZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSW1hZ2VfYW5hbHl6ZXIgCQkJCT0gSW1hZ2UgQW5hbHl6ZXIKLU5vbmUgCQkJCQkJPSBOb25lCi1XaGl0ZSAJCQkJCQk9IFdoaXRlCi1CbGFjayAJCQkJCQk9IEJsYWNrCi1SZWQgCQkJCQkJPSBSZWQKLUdyZWVuIAkJCQkJCT0gR3JlZW4KLUJsdWUgCQkJCQkJPSBCbHVlCi1YX3NjYWxlIAkJCQkJPSBYIFNjYWxlCi1ZX3NjYWxlIAkJCQkJPSBZIFNjYWxlCi1BbHBoYV9LIAkJCQkJPSBBbHBoYS1LCi1EaXNwbGF5IAkJCQkJPSBEaXNwbGF5Ci1JbmNyZW1lbnRhbCAJCQkJPSBJbmNyZW1lbnRhbAotVHJhbnNwYXJlbnQgCQkJCT0gVHJhbnNwYXJlbnQKLVRyYW5zcGFyZW50X2xjIAkJCQk9IHRyYW5zcGFyZW50Ci1NYXNrIAkJCQkJCT0gTWFzawotQmFja2dyb3VuZCAJCQkJCT0gQmFja2dyb3VuZAotQW5pbWF0aW9uIAkJCQkJPSBBbmltYXRpb24KLVByZXZpb3VzIAkJCQkJPSA8ICZQcmV2aW91cwotTmV4dCAJCQkJCQk9ICZOZXh0ID4KLUFuaW1hdGUgCQkJCQk9ICZBbmltYXRlCi1UeXBlX2luaXRpYWwgCQkJCT0gVHlwZToKLVR5cGVfc3RyaW5nIAkJCQk9IFR5cGU6IHswfQotVHlwZV9pbmRleCAJCQkJCT0gVHlwZTogezB9IFt7MSxudW1iZXIsaW50ZWdlcn0gb2YgezIsbnVtYmVyLGludGVnZXJ9XQotU2l6ZV9pbml0aWFsIAkJCQk9IFNpemU6Ci1TaXplX3ZhbHVlIAkJCQkJPSBTaXplOiB7MCxudW1iZXIsaW50ZWdlcn0geCB7MSxudW1iZXIsaW50ZWdlcn0KLURlcHRoX2luaXRpYWwgCQkJCT0gRGVwdGg6Ci1EZXB0aF92YWx1ZSAJCQkJPSBEZXB0aDogezB9Ci1UcmFuc3BhcmVudF9waXhlbF9pbml0aWFsIAk9IFRyYW5zcGFyZW50IHBpeGVsOgotVHJhbnNwYXJlbnRfcGl4ZWxfdmFsdWUJCT0gVHJhbnNwYXJlbnQgcGl4ZWw6IHswfQotVGltZV90b19sb2FkX2luaXRpYWwgCQk9IFRpbWUgdG8gbG9hZDoKLVRpbWVfdG9fbG9hZF92YWx1ZQkJCT0gVGltZSB0byBsb2FkOiB7MH0gbXMKLUFuaW1hdGlvbl9zaXplX2luaXRpYWwgCQk9IEFuaW1hdGlvbiBzaXplOgotQW5pbWF0aW9uX3NpemVfdmFsdWUgCQk9IEFuaW1hdGlvbiBzaXplOiB7MCxudW1iZXIsaW50ZWdlcn0geCB7MSxudW1iZXIsaW50ZWdlcn0KLUJhY2tncm91bmRfcGl4ZWxfaW5pdGlhbCAJPSBCYWNrZ3JvdW5kIHBpeGVsOgotQmFja2dyb3VuZF9waXhlbF92YWx1ZSAJCT0gQmFja2dyb3VuZCBwaXhlbDogezB9Ci1JbWFnZV9sb2NhdGlvbl9pbml0aWFsIAkJPSBJbWFnZSBsb2NhdGlvbjoKLUltYWdlX2xvY2F0aW9uX3ZhbHVlIAkJPSBJbWFnZSBsb2NhdGlvbjogKHswLG51bWJlcixpbnRlZ2VyfSwgezEsbnVtYmVyLGludGVnZXJ9KQotRGlzcG9zYWxfaW5pdGlhbCAJCQk9IERpc3Bvc2FsOgotRGlzcG9zYWxfdmFsdWUgCQkJCT0gRGlzcG9zYWw6IHswLG51bWJlcixpbnRlZ2VyfSAoezF9KQotRGVsYXlfaW5pdGlhbCAJCQkJPSBEZWxheToKLURlbGF5X3ZhbHVlIAkJCQk9IERlbGF5OiB7MCxudW1iZXIsaW50ZWdlcn0gbXMgKHVzaW5nIHsxLG51bWJlcixpbnRlZ2VyfSBtcykKLURlbGF5X3VzZWQgCQkJCQk9IERlbGF5OiB7MCxudW1iZXIsaW50ZWdlcn0gbXMKLVJlcGVhdHNfaW5pdGlhbCAJCQk9IFJlcGVhdHM6Ci1SZXBlYXRzX3ZhbHVlIAkJCQk9IFJlcGVhdHM6IHswLG51bWJlcixpbnRlZ2VyfQotUmVwZWF0c19mb3JldmVyIAkJCT0gUmVwZWF0czogezAsbnVtYmVyLGludGVnZXJ9IChmb3JldmVyKQotUGFsZXR0ZV9pbml0aWFsIAkJCT0gUGFsZXR0ZToKLVBhbGV0dGVfZGlyZWN0IAkJCQk9IFBhbGV0dGU6IERpcmVjdAotUGFsZXR0ZV92YWx1ZSAJCQkJPSBQYWxldHRlIHNpemU6IHswLG51bWJlcixpbnRlZ2VyfQotTWF4X2xlbmd0aF9zdHJpbmcgCQkJPSBUcmFuc3BhcmVudCBwaXhlbDogLTEgKG5vbmUpCi1QaXhlbF9kYXRhX2luaXRpYWwgCQkJPSBQaXhlbCBkYXRhOgotUGl4ZWxfZGF0YV92YWx1ZSAJCQk9IFBpeGVsIGRhdGE6ICBCeXRlcyBwZXIgbGluZTogezAsbnVtYmVyLGludGVnZXJ9ICBcCi0JCQkJCQkJICBTY2FubGluZSBwYWQ6IHsxLG51bWJlcixpbnRlZ2VyfSB7Mn0gIHszfQotRGVwdGhfaW5mbyAJCQkJCT0gRGVwdGg6IHswLG51bWJlcixpbnRlZ2VyfSAtLSB7MX0KLU9uZV9ieXRlIAkJCQkJPSAxIGJ5dGUgcGVyIHBpeGVsCi1NdWx0aV9ieXRlcyAJCQkJPSB7MCxudW1iZXIsaW50ZWdlcn0gYnl0ZXMgcGVyIHBpeGVsCi1NdWx0aV9waXhlbHMgCQkJCT0gezAsbnVtYmVyLGludGVnZXJ9IHBpeGVscyBwZXIgYnl0ZSB7MX0KLVNjcm9sbF9mb3JfYWxwaGEJCQk9IChTY3JvbGwgZG93biB0byBzZWUgYWxwaGEgZGF0YSkKLUZpbGUgCQkJCQkJPSAmRmlsZQotT3BlbkZpbGUgCQkJCQk9ICZPcGVuIEZpbGUuLi5cdEN0cmwrTwotT3BlblVSTAkJCQkJCT0gT3BlbiAmVVJMLi4uXHRDdHJsK1UKLVJlb3BlbiAJCQkJCQk9ICZSZW9wZW4KLUxvYWRGaWxlIAkJCQkJPSAmTG9hZCBGaWxlLi4uXHRDdHJsK0wKLVNhdmUgCQkJCQkJPSAmU2F2ZVx0Q3RybCtTCi1TYXZlX2FzIAkJCQkJPSBTYXZlICZBcy4uLgotU2F2ZV9tYXNrX2FzIAkJCQk9IFNhdmUgJk1hc2sgQXMuLi4KLVByaW50IAkJCQkJCT0gJlByaW50XHRDdHJsK1AKLUV4aXQgCQkJCQkJPSBFJnhpdAotQWxwaGEgCQkJCQkJPSBBbHBoYQotT3BlblVSTERpYWxvZwkJCQk9IE9wZW4gVVJMCi1FbnRlclVSTAkJCQkJPSBFbnRlciB0aGUgVVJMIGZvciBhbiBpbWFnZSAoYm1wLCBnaWYsIGljbywgamZpZiwganBlZywganBnLCBwbmcsIHRpZiwgdGlmZik6Ci1BbGxfaW1hZ2VzIAkJCQkJPSBBbGwgSW1hZ2UgRmlsZXMKLUxvYWRpbmdfbGMgCQkJCQk9IGxvYWRpbmcKLVNhdmluZ19sYyAJCQkJCT0gc2F2aW5nCi1Vbmtub3duX2V4dGVuc2lvbiAJCQk9IFVua25vd24gZmlsZSBleHRlbnNpb246IHswfVxuUGxlYXNlIHVzZSBibXAsIGdpZiwgaWNvLCBqZmlmLCBqcGVnLCBqcGcsIHBuZywgdGlmLCBvciB0aWZmLgotT3ZlcndyaXRlIAkJCQkJPSBPdmVyd3JpdGUgezB9PwotU2F2ZV9hbGwJCQkJCT0gU2F2ZSBhbGwgezB9IGltYWdlcyBpbnRvIGEgbXVsdGktaW1hZ2UgZmlsZT8KLUFuYWx5emVyX29uIAkJCQk9IEltYWdlIEFuYWx5emVyIG9uOiB7MH0KLVJlbG9hZGluZ19sYyAJCQkJPSByZWxvYWRpbmcKLUNvbG9yX2F0IAkJCQkJPSBJbWFnZSBjb2xvciBhdCAoezAsbnVtYmVyLGludGVnZXJ9LCB7MSxudW1iZXIsaW50ZWdlcn0pIFwKLQkJCQkJCQkgIC0gcGl4ZWwgezIsbnVtYmVyLGludGVnZXJ9IFsweHszfV0gLSBpcyB7NH0gWzB4ezV9XSB7Nn0KLVJHQgkJCQkJCQk9IFJHQiAneyd7MH0sIHsxfSwgezJ9J30nCi1SR0JBCQkJCQkJPSBSR0JBICd7J3swfSwgezF9LCB7Mn0sIHszfSd9JwotQ29sb3JfYXRfdHJhbnNwYXJlbnQJCT0gKHRyYW5zcGFyZW50KQotQ3JlYXRpbmdfaW1hZ2UgCQkJCT0gQ3JlYXRpbmcgaW1hZ2UgIyB7MCxudW1iZXIsaW50ZWdlcn0gZnJvbSAKLU9LCQkJCQkJCT0gT0sKLUNhbmNlbAkJCQkJCT0gQ2FuY2VsCi1TdG9wIAkJCQkJCT0gJlN0b3AKLUNyZWF0aW5nX2Zyb20gCQkJCT0gQ3JlYXRpbmcgaW1hZ2UgcmVhZCBmcm9tCi1CeXRlc19wZXJfbGluZSAJCQkJPSBCeXRlcyBwZXIgbGluZToKLVNjYW5saW5lX3BhZCAJCQkJPSBTY2FubGluZSBwYWQ6Ci1QcmludGluZ19lcnJvcgkJCQk9IFByaW50aW5nIGVycm9yOiAKLUVycm9yIAkJCQkJCT0gRXJyb3IgezB9IGZpbGVcbnsxfVxuXG4KLVVuc3VwcG9ydGVkX2xjIAkJCQk9IHVuc3VwcG9ydGVkCi1Ob25lX2xjIAkJCQkJPSBub25lCi1CYWNrZ3JvdW5kX2xjIAkJCQk9IGJhY2tncm91bmQKLVByZXZpb3VzX2xjIAkJCQk9IHByZXZpb3VzCi1VbnNwZWNpZmllZF9sYyAJCQkJPSB1bnNwZWNpZmllZAotVW5rbm93bl9hYyAJCQkJCT0gVU5LTk9XTgotRm9yZXZlcl9sYyAJCQkJCT0gZm9yZXZlcgotU2F2ZV9hc190eXBlCQkJCT0gU2F2ZSBBcyBCTVAgVHlwZS4uLgotU2F2ZV9hc190eXBlX2xhYmVsCQkJPSBTZWxlY3QgdGhlIHR5cGUgb2YgQk1QIHRvIHNhdmUgYXM6Ci1TYXZlX2FzX3R5cGVfbm9fY29tcHJlc3MJPSBObyBDb21wcmVzc2lvbgotU2F2ZV9hc190eXBlX3JsZV9jb21wcmVzcwk9IFJMRSBDb21wcmVzc2lvbgotU2F2ZV9hc190eXBlX29zMgkJCT0gT1MvMiBCTVAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfamF2YXZpZXdlci5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19qYXZhdmlld2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YWZjNzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19qYXZhdmlld2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1PcGVuX21lbnVpdGVtPSZPcGVuLi4uXHRDdHJsK08KLUV4aXRfbWVudWl0ZW09RSZ4aXQKLUZpbGVfbWVudWl0ZW09JkZpbGUKLVdpbmRvd190aXRsZT1TV1QgSmF2YSBWaWV3ZXIKLUVycl9maWxlX25vX2V4aXN0PUZpbGUgezB9IGRvZXMgbm90IGV4aXN0LgotRXJyX2ZpbGVfaW89SU8gZXJyb3IgcmVhZGluZyBmaWxlOlxuezB9Ci1FcnJfZmlsZV9ub3RfZm91bmQ9RmlsZSBub3QgZm91bmQ6XG57MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2xheW91dC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19sYXlvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxYjMyZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2xheW91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotd2luZG93LnRpdGxlID0gU1dUIExheW91dHMKLQotQWRkCQkJCQk9ICZBZGQKLURlbGV0ZQkgCQkJPSAmRGVsZXRlCi1DbGVhcgkJCQk9ICZDbGVhcgotQ2hpbGRyZW4JCQk9IENoaWxkcmVuCi1UeXBlCQkJCT0gVHlwZQotVG9wX0NvbnRyb2wJCQk9IFRvcCBDb250cm9sCi1MYXlvdXQJCQkJPSBMYXlvdXQKLVByZWZlcnJlZF9TaXplCQk9IFByZWZlcnJlZCBTaXplCi1HZW5lcmF0ZV9Db2RlCQk9ICZHZW5lcmF0ZSBDb2RlCi1HZW5lcmF0ZWRfQ29kZQkJPSBHZW5lcmF0ZWQgQ29kZQotUGFyYW1ldGVycwkJCT0gUGFyYW1ldGVycwotUHJvcGVydGllcwkJCT0gUHJvcGVydGllcwotTWFyZ2lucwkJCQk9IE1hcmdpbnMKLU1hcmdpbnNfU3BhY2luZwkJPSBNYXJnaW5zIGFuZCBTcGFjaW5nCi1Db2x1bW5zCQkJCT0gQ29sdW1ucwotQXR0YWNoX0VkaXQJCQk9IEVkaXQKLUxlZnRfQXR0YWNobWVudAkJPSBFZGl0IExlZnQgQXR0YWNobWVudAotUmlnaHRfQXR0YWNobWVudAk9IEVkaXQgUmlnaHQgQXR0YWNobWVudAotVG9wX0F0dGFjaG1lbnQJCT0gRWRpdCBUb3AgQXR0YWNobWVudAotQm90dG9tX0F0dGFjaG1lbnQJPSBFZGl0IEJvdHRvbSBBdHRhY2htZW50Ci1Qb3NpdGlvbgkJCT0gUG9zaXRpb24KLUNvbnRyb2wJCQkJPSBDb250cm9sCi1PZmZzZXQJCQkJPSBPZmZzZXQgWysvLV0KLUl0ZW0JCQkJPSBJdGVtIHswfQotQ29tYm9fSW5kZXgJCQk9IENvbWJvIHswfQotR3JvdXBfSW5kZXgJCQk9IEdyb3VwIHswfQotTGFiZWxfSW5kZXgJCQk9IExhYmVsIHswfQotQnV0dG9uX0luZGV4CQk9IEJ1dHRvbiB7MH0KLVN0eWxlZFRleHRfSW5kZXgJPSBTdHlsZWRUZXh0IHswfQotVGV4dF9JbmRleAkJCT0gVGV4dCB7MH0KLU9LCQkJCQk9IE9LCi1DYW5jZWwJCQkJPSBDYW5jZWwKLUVkaXQJCQkJPSAmRWRpdAotU2VsZWN0X0FsbAkJCT0gU2VsZWN0ICZBbGxcdEN0cmwrQQotQ29weQkJCQk9ICZDb3B5XHRDdHJsK0MKLUV4aXQJCQkJPSBFJnhpdAotTmFtZV9UaXRsZQkJCT0gRW50ZXIgTmFtZXMKLU5hbWVfTGFiZWwJCQk9IEVudGVyIG5hbWVzIGZvciB5b3VyIGNvbnRyb2xzCi1JbnZhbGlkX05hbWUgCQk9IEludmFsaWQgTmFtZSAtIFBsZWFzZSBlbnRlciB2YWxpZCB2YXJpYWJsZSBuYW1lcyBmb3IgeW91ciBjb250cm9scwotRGVmYXVsdAkJCQk9IERlZmF1bHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX3BhaW50LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX3BhaW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZWNlYzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19wYWludC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcwotd2luZG93LnRpdGxlID0gUGFpbnQKLQotbWVudS5Ub29scy5sYWJlbCA9IFRvb2xzCi1tZW51Lk9wdGlvbnMubGFiZWwgPSBPcHRpb25zCi0KLXRvb2wuUGVuY2lsLmxhYmVsID0gUGVuY2lsCi10b29sLlBlbmNpbC50b29sdGlwID0gUGVuY2lsIHRvb2wKLXRvb2wuUGVuY2lsLmltYWdlID0gdG9vbF9wZW5jaWwuZ2lmCi10b29sLlBlbmNpbC5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIFBlbmNpbCB0b29sLgotCi10b29sLkFpcmJydXNoLmxhYmVsID0gQWlyYnJ1c2gKLXRvb2wuQWlyYnJ1c2gudG9vbHRpcCA9IEFpcmJydXNoIHRvb2wKLXRvb2wuQWlyYnJ1c2guaW1hZ2UgPSB0b29sX2FpcmJydXNoLmdpZgotdG9vbC5BaXJicnVzaC5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIEFpcmJydXNoIHRvb2wuCi0KLXRvb2wuTGluZS5sYWJlbCA9IExpbmUKLXRvb2wuTGluZS50b29sdGlwID0gTGluZSB0b29sCi10b29sLkxpbmUuaW1hZ2UgPSB0b29sX2xpbmUuZ2lmCi10b29sLkxpbmUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBMaW5lIHRvb2wuCi0KLXRvb2wuUG9seUxpbmUubGFiZWwgPSBQb2x5Z29uCi10b29sLlBvbHlMaW5lLnRvb2x0aXAgPSBQb2x5Z29uIHRvb2wKLXRvb2wuUG9seUxpbmUuaW1hZ2UgPSB0b29sX3BvbHlsaW5lLmdpZgotdG9vbC5Qb2x5TGluZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIFBvbHlMaW5lIHRvb2wuCi0KLXRvb2wuUmVjdGFuZ2xlLmxhYmVsID0gUmVjdGFuZ2xlCi10b29sLlJlY3RhbmdsZS50b29sdGlwID0gUmVjdGFuZ2xlIHRvb2wKLXRvb2wuUmVjdGFuZ2xlLmltYWdlID0gdG9vbF9yZWN0YW5nbGUuZ2lmCi10b29sLlJlY3RhbmdsZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIFJlY3RhbmdsZSB0b29sLgotCi10b29sLkVsbGlwc2UubGFiZWwgPSBFbGxpcHNlCi10b29sLkVsbGlwc2UudG9vbHRpcCA9IEVsbGlwc2UgdG9vbAotdG9vbC5FbGxpcHNlLmltYWdlID0gdG9vbF9lbGxpcHNlLmdpZgotdG9vbC5FbGxpcHNlLmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgRWxsaXBzZSB0b29sLgotCi10b29sLlJvdW5kZWRSZWN0YW5nbGUubGFiZWwgPSBSb3VuZGVkIFJlY3RhbmdsZQotdG9vbC5Sb3VuZGVkUmVjdGFuZ2xlLnRvb2x0aXAgPSBSb3VuZGVkIFJlY3RhbmdsZSB0b29sCi10b29sLlJvdW5kZWRSZWN0YW5nbGUuaW1hZ2UgPSB0b29sX3JvdW5kZWRyZWN0YW5nbGUuZ2lmCi10b29sLlJvdW5kZWRSZWN0YW5nbGUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBSb3VuZGVkIFJlY3RhbmdsZSB0b29sLgotCi10b29sLlRleHQubGFiZWwgPSBUZXh0Ci10b29sLlRleHQudG9vbHRpcCA9IFRleHQgdG9vbAotdG9vbC5UZXh0LmltYWdlID0gdG9vbF90ZXh0LmdpZgotdG9vbC5UZXh0LmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgVGV4dCB0b29sLgotdG9vbC5UZXh0LnNldHRpbmdzLmRlZmF1bHR0ZXh0ID0gSGVsbG8hCi10b29sLlRleHQuZGlhbG9nLnRpdGxlID0gVGV4dCBUb29sIFNldHRpbmdzCi10b29sLlRleHQuZGlhbG9nLm1lc3NhZ2UgPSBQbGVhc2UgZW50ZXIgdGhlIG5ldyB0ZXh0IHN0cmluZyB0byBiZSBwYWludGVkLgotCi10b29sLk51bGwubGFiZWwgPSA8bm9uZT4KLQotZmlsbC5Ob25lLmxhYmVsID0gTm8gRmlsbAotZmlsbC5Ob25lLnRvb2x0aXAgPSBObyBmaWxsIG1vZGUKLWZpbGwuTm9uZS5pbWFnZSA9IGZpbGxfbm9uZS5naWYKLWZpbGwuTm9uZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgTm8gRmlsbCBtb2RlLgotCi1maWxsLk91dGxpbmUubGFiZWwgPSBPdXRsaW5lIEZpbGwKLWZpbGwuT3V0bGluZS50b29sdGlwID0gT3V0bGluZSBmaWxsIG1vZGUKLWZpbGwuT3V0bGluZS5pbWFnZSA9IGZpbGxfb3V0bGluZS5naWYKLWZpbGwuT3V0bGluZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgT3V0bGluZSBGaWxsIG1vZGUuCi0KLWZpbGwuU29saWQubGFiZWwgPSBTb2xpZCBGaWxsCi1maWxsLlNvbGlkLnRvb2x0aXAgPSBTb2xpZCBmaWxsIG1vZGUKLWZpbGwuU29saWQuaW1hZ2UgPSBmaWxsX3NvbGlkLmdpZgotZmlsbC5Tb2xpZC5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgU29saWQgRmlsbCBtb2RlLgotCi1saW5lc3R5bGUuU29saWQubGFiZWwgPSBTb2xpZCBMaW5lCi1saW5lc3R5bGUuU29saWQudG9vbHRpcCA9IFNvbGlkIGxpbmUgc3R5bGUKLWxpbmVzdHlsZS5Tb2xpZC5pbWFnZSA9IGxpbmVzdHlsZV9zb2xpZC5naWYKLWxpbmVzdHlsZS5Tb2xpZC5kZXNjcmlwdGlvbiA9IFNlbGVjdCBTb2xpZCBMaW5lIHN0eWxlLgotCi1saW5lc3R5bGUuRG90LmxhYmVsID0gRG90dGVkIExpbmUKLWxpbmVzdHlsZS5Eb3QudG9vbHRpcCA9IERvdHRlZCBsaW5lIHN0eWxlCi1saW5lc3R5bGUuRG90LmltYWdlID0gbGluZXN0eWxlX2RvdC5naWYKLWxpbmVzdHlsZS5Eb3QuZGVzY3JpcHRpb24gPSBTZWxlY3QgRG90dGVkIExpbmUgc3R5bGUuCi0KLWxpbmVzdHlsZS5EYXNoLmxhYmVsID0gRGFzaGVkIExpbmUKLWxpbmVzdHlsZS5EYXNoLnRvb2x0aXAgPSBEYXNoZWQgbGluZSBzdHlsZQotbGluZXN0eWxlLkRhc2guaW1hZ2UgPSBsaW5lc3R5bGVfZGFzaC5naWYKLWxpbmVzdHlsZS5EYXNoLmRlc2NyaXB0aW9uID0gU2VsZWN0IERhc2hlZCBMaW5lIHN0eWxlLgotCi1saW5lc3R5bGUuRGFzaERvdC5sYWJlbCA9IERhc2gtRG90IExpbmUKLWxpbmVzdHlsZS5EYXNoRG90LnRvb2x0aXAgPSBEYXNoLURvdCBsaW5lIHN0eWxlCi1saW5lc3R5bGUuRGFzaERvdC5pbWFnZSA9IGxpbmVzdHlsZV9kYXNoZG90LmdpZgotbGluZXN0eWxlLkRhc2hEb3QuZGVzY3JpcHRpb24gPSBTZWxlY3QgRGFzaC1Eb3QgTGluZSBzdHlsZS4KLQotb3B0aW9ucy5Gb250LmxhYmVsID0gVGV4dCBUb29sIEZvbnQKLW9wdGlvbnMuRm9udC50b29sdGlwID0gU2VsZWN0IFRleHQgVG9vbCBmb250Ci1vcHRpb25zLkZvbnQuaW1hZ2UgPSBvcHRpb25zX2ZvbnQuZ2lmCi1vcHRpb25zLkZvbnQuZGVzY3JpcHRpb24gPSBTZWxlY3RzIFRleHQgVG9vbCBmb250Lgotb3B0aW9ucy5Gb250LmRpYWxvZy50aXRsZSA9IFRleHQgVG9vbCBGb250Ci0KLXNldHRpbmdzLkFpcmJydXNoUmFkaXVzLnRleHQgPSBBaXJicnVzaCBSYWRpdXMKLXNldHRpbmdzLkFpcmJydXNoSW50ZW5zaXR5LnRleHQgPSBBaXJicnVzaCBJbnRlbnNpdHkKLQotc2Vzc2lvbi5OdWxsLm1lc3NhZ2UgPSBTZWxlY3QgYSB0b29sLi4uCi1zZXNzaW9uLkNvbnRpbnVvdXNQYWludC5tZXNzYWdlID0gQ2xpY2sgYW5kIGRyYWcgdG8gZHJhdy4uLgotc2Vzc2lvbi5EcmFnSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlID0gQ2xpY2sgYW5kIGRyYWcgdG8gcHJldmlldywgcmVsZWFzZSB0byBkcmF3LCByaWdodC1jbGljayB0byBjYW5jZWwuLi4KLXNlc3Npb24uU2VnbWVudGVkSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlLmFuY2hvck1vZGUgPSBDbGljayB0byBzZXQgYW5jaG9yLi4uCi1zZXNzaW9uLlNlZ21lbnRlZEludGVyYWN0aXZlUGFpbnQubWVzc2FnZS5pbnRlcmFjdGl2ZU1vZGUgPSBDbGljayB0byBkcmF3LCBkb3VibGUtY2xpY2sgdG8gY2xvc2UgZmlndXJlLCByaWdodC1jbGljayB0byBjYW5jZWwuLi4KLXNlc3Npb24uVGV4dC5tZXNzYWdlID0gQ2xpY2sgdG8gZHJhdyB0ZXh0LCByaWdodC1jbGljayB0byBlZGl0IHRleHQuLi4KLQotc3RhdHVzLkNvb3JkLmZvcm1hdCA9ICh7MH0sIHsxfSkKLXN0YXR1cy5Db29yZFJhbmdlLmZvcm1hdCA9ICh7MH0sIHsxfSkgLSAoezJ9LCB7M30pCi1zdGF0dXMuQmFyLmZvcm1hdCA9IHswfSA6IHsxfSAgIHsyfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc190ZXh0ZWRpdG9yLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX3RleHRlZGl0b3IucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkMjIzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX3RleHRlZGl0b3IucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVdpbmRvd190aXRsZT1UZXh0IEVkaXRvcgotUHJvZmlsZTI9VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBjdXJyZW50bHkgZ29pbmcgdGhyb3VnaCB0aGUgZXhlcmNpc2Vcbm9mIGVuc3VyaW5nIHRoYXQgYWxsIG9mIG91ciBjb21taXR0ZXIgcmVjb3JkcyBhcmUgY29tcGxldGUuXG5CYXNpY2FsbHksIHlvdSBjYW4gdmlldyB0aGlzIGFzIGEgc2VsZi1hdWRpdCB0byBlbnN1cmUgb3VyXG5jb21wbGlhbmNlIHdpdGggb3VyIG93biBwb2xpY2llcyBhbmQgcHJvY2Vzc2VzCi1Qcm9maWxlND0iXHUwNjIzXHUwNjM5XHUwNjQ0XHUwNjQ2XHUwNjJBIFx1MDY0OFx1MDYzMlx1MDYyN1x1MDYzMVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MkZcdTA2MjdcdTA2MkVcdTA2NDRcdTA2NEFcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjJDXHUwNjMyXHUwNjI3XHUwNjI2XHUwNjMxXHUwNjRBXHUwNjI5IFx1MDYyNVx1MDY0NiBcdTA2MjdcdTA2NDRcdTA2NDZcdTA2MjdcdTA2MkVcdTA2MjhcdTA2NEFcdTA2NDYgXHUwNjM1XHUwNjQ4XHUwNjJBXHUwNjQ4XHUwNjI3IFx1MDYyOFx1MDYyM1x1MDYzQVx1MDY0NFx1MDYyOFx1MDY0QVx1MDYyOSBcdTA2MzNcdTA2MjdcdTA2MkRcdTA2NDJcdTA2MjkgXHUwNjQ0XHUwNjM1XHUwNjI3XHUwNjQ0XHUwNjJEIFx1MDY0NVx1MDYyOFx1MDYyN1x1MDYyRlx1MDYzMVx1MDYyOSBcdTA2MzdcdTA2MzFcdTA2MkRcdTA2NDdcdTA2MjcgXHUwNjI3XHUwNjQ0XHUwNjMxXHUwNjI2XHUwNjRBXHUwNjMzIFx1MDYzOVx1MDYyOFx1MDYyRiBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzJcdTA2NEFcdTA2MzIgXHUwNjI4XHUwNjQ4XHUwNjJBXHUwNjQxXHUwNjQ0XHUwNjRBXHUwNjQyXHUwNjI5IFx1MDY0NFx1MDYyNVx1MDY0Nlx1MDY0N1x1MDYyN1x1MDYyMSBcdTA2MjNcdTA2NDNcdTA2MkJcdTA2MzEgXHUwNjQ1XHUwNjQ2IFx1MDYzOVx1MDY0Mlx1MDYyRiBcdTA2NDVcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjJEXHUwNjMxXHUwNjI4IFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0N1x1MDY0NFx1MDY0QVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MkFcdTA2NEEgXHUwNjJFXHUwNjQ0XHUwNjQxXHUwNjJBIFx1MDYzOVx1MDYzNFx1MDYzMVx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2MjJcdTA2NDRcdTA2MjdcdTA2NDEgXHUwNjQ1XHUwNjQ2IFx1MDYyN1x1MDY0NFx1MDY0Mlx1MDYyQVx1MDY0NFx1MDY0OSBcdTA2NDhcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDFcdTA2NDJcdTA2NDhcdTA2MkZcdTA2NEFcdTA2NDYuIFxyXG5cdTA2NDhcdTA2NDJcdTA2MjdcdTA2NDRcdTA2MkEgXHUwNjI3XHUwNjQ0XHUwNjQ4XHUwNjMyXHUwNjI3XHUwNjMxXHUwNjI5IFx1MDYyNVx1MDY0NiBcdTA2MjNcdTA2NDNcdTA2MkJcdTA2MzEgXHUwNjQ1XHUwNjQ2IDk3IFx1MDY0MVx1MDY0QSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MjZcdTA2MjkgXHUwNjQ1XHUwNjQ1XHUwNjQ2IFx1MDYzNFx1MDYyN1x1MDYzMVx1MDY0M1x1MDY0OFx1MDYyNyBcdTA2NDFcdTA2NEEgXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjMzXHUwNjJBXHUwNjQxXHUwNjJBXHUwNjI3XHUwNjIxIFx1MDYyN1x1MDY0NFx1MDYzMFx1MDY0QSBcdTA2MjNcdTA2MkNcdTA2MzFcdTA2NEEgXHUwNjI3XHUwNjQ0XHUwNjJFXHUwNjQ1XHUwNjRBXHUwNjMzXHUwNjBDIFx1MDY0OFx1MDYyN1x1MDY0MVx1MDY0Mlx1MDY0OFx1MDYyNyBcdTA2MzlcdTA2NDRcdTA2NDkgXHUwNjQ1XHUwNjRBXHUwNjJCXHUwNjI3XHUwNjQyIFx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0NFx1MDY0NSBcdTA2NDhcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzVcdTA2MjdcdTA2NDRcdTA2MkRcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ4XHUwNjM3XHUwNjQ2XHUwNjRBXHUwNjI5LiBcclxuXHJcblx1MDY0OFx1MDY0M1x1MDYyN1x1MDY0NiBcdTA2NDhcdTA2MzJcdTA2NEFcdTA2MzEgXHUwNjI3XHUwNjQ0XHUwNjJGXHUwNjI3XHUwNjJFXHUwNjQ0XHUwNjRBXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyQ1x1MDYzMlx1MDYyN1x1MDYyNlx1MDYzMVx1MDY0QVx1MDYyOSBcdTA2NDZcdTA2NDhcdTA2MzEgXHUwNjI3XHUwNjQ0XHUwNjJGXHUwNjRBXHUwNjQ2IFx1MDY0QVx1MDYzMlx1MDY0QVx1MDYyRiBcdTA2MzJcdTA2MzFcdTA2NDdcdTA2NDhcdTA2NDZcdTA2NEEgXHUwNjQyXHUwNjJGIFx1MDY0Mlx1MDYyN1x1MDY0NCBcdTA2MjVcdTA2NDYgXHUwNjQ2XHUwNjMzXHUwNjI4XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDY0Mlx1MDYyOFx1MDYyN1x1MDY0NCBcdTA2MzlcdTA2NDRcdTA2NDkgXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjMzXHUwNjJBXHUwNjQxXHUwNjJBXHUwNjI3XHUwNjIxIFx1MDYyOFx1MDY0NFx1MDYzQVx1MDYyQSA3OS40OSBcdTA2NDFcdTA2NEEgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjI2XHUwNjI5LiBcclxuXHJcblx1MDY0OFx1MDY0M1x1MDYyN1x1MDY0Nlx1MDYyQSBcdTA2MjNcdTA2MkRcdTA2MzJcdTA2MjdcdTA2MjggXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjM5XHUwNjI3XHUwNjMxXHUwNjM2XHUwNjI5IFx1MDY0Mlx1MDYyRiBcdTA2MkZcdTA2MzlcdTA2MkEgXHUwNjI1XHUwNjQ0XHUwNjQ5IFx1MDY0NVx1MDY0Mlx1MDYyN1x1MDYzN1x1MDYzOVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjdcdTA2MzNcdTA2MkFcdTA2NDFcdTA2MkFcdTA2MjdcdTA2MjEgXHUwNjQyXHUwNjI3XHUwNjI2XHUwNjQ0XHUwNjI5IFx1MDYyNVx1MDY0Nlx1MDY0NyBcdTA2NDRcdTA2MjcgXHUwNjRBXHUwNjQ1XHUwNjQzXHUwNjQ2IFx1MDYyQVx1MDYyRFx1MDY0Mlx1MDY0QVx1MDY0MiBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzVcdTA2MjdcdTA2NDRcdTA2MkRcdTA2MjkgXHUwNjJGXHUwNjQ4XHUwNjQ2IFx1MDYyNVx1MDY0Mlx1MDYzMVx1MDYyN1x1MDYzMSBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MkZcdTA2MjdcdTA2NDRcdTA2MjkuIFxyXG5cclxuXHUwNjQ4XHUwNjJBXHUwNjMxXHUwNjRBXHUwNjJGIFx1MDYyQVx1MDY0NFx1MDY0MyBcdTA2MjdcdTA2NDRcdTA2MjNcdTA2MkRcdTA2MzJcdTA2MjdcdTA2MjggXHUwNjQ1XHUwNjQ2IFx1MDYyN1x1MDY0NFx1MDYyRFx1MDY0M1x1MDY0OFx1MDY0NVx1MDYyOSBcdTA2MkFcdTA2NDJcdTA2MkZcdTA2NEFcdTA2NDUgXHUwNjQ1XHUwNjM5XHUwNjQ0XHUwNjQ4XHUwNjQ1XHUwNjI3XHUwNjJBIFx1MDYzOVx1MDY0NiBcdTA2MjdcdTA2NDRcdTA2MjJcdTA2NDRcdTA2MjdcdTA2NDEgXHUwNjQ1XHUwNjQ2IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0OFx1MDYyN1x1MDYzN1x1MDY0Nlx1MDY0QVx1MDY0NiBcdTA2MjdcdTA2NDRcdTA2MzBcdTA2NEFcdTA2NDYgXHUwNjI3XHUwNjJFXHUwNjJBXHUwNjQxXHUwNjQ4XHUwNjI3IFx1MDYyM1x1MDYyQlx1MDY0Nlx1MDYyN1x1MDYyMSBcdTA2MjdcdTA2NDRcdTA2MzVcdTA2MzFcdTA2MjdcdTA2MzkuIFxyXG5cclxuXHUwNjRBXHUwNjMwXHUwNjQzXHUwNjMxIFx1MDYyM1x1MDY0NiBcdTA2MjdcdTA2NDRcdTA2MkRcdTA2MzFcdTA2MjggXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjQ3XHUwNjQ0XHUwNjRBXHUwNjI5IFx1MDYyOFx1MDYyRlx1MDYyM1x1MDYyQSBcdTA2MzlcdTA2MjdcdTA2NDUgMTk5MiBcdTA2MzlcdTA2NDZcdTA2MkZcdTA2NDVcdTA2MjcgXHUwNjJBXHUwNjJGXHUwNjJFXHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYyQ1x1MDY0QVx1MDYzNCBcdTA2MjdcdTA2NDRcdTA2MkNcdTA2MzJcdTA2MjdcdTA2MjZcdTA2MzFcdTA2NEEgXHUwNjQ0XHUwNjI1XHUwNjQ0XHUwNjNBXHUwNjI3XHUwNjIxIFx1MDYyN1x1MDY0Nlx1MDYyQVx1MDYyRVx1MDYyN1x1MDYyOFx1MDYyN1x1MDYyQSBcdTA2MzlcdTA2MjdcdTA2NDVcdTA2MjkgXHUwNjQzXHUwNjI3XHUwNjQ2IFx1MDY0QVx1MDYyQVx1MDY0OFx1MDY0Mlx1MDYzOSBcdTA2MjNcdTA2NDYgXHUwNjJBXHUwNjQxXHUwNjQ4XHUwNjMyIFx1MDY0MVx1MDY0QVx1MDY0N1x1MDYyNyBcdTA2MkNcdTA2MjhcdTA2NDdcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjQ2XHUwNjQyXHUwNjI3XHUwNjMwIFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYzM1x1MDY0NFx1MDYyN1x1MDY0NVx1MDY0QVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MkFcdTA2MzRcdTA2MkZcdTA2MkZcdTA2MjkuIFxyXG5cclxuXHUwNjQ4XHUwNjJBXHUwNjQyXHUwNjQ4XHUwNjQ0IFx1MDY0OFx1MDYzMlx1MDYyN1x1MDYzMVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MkZcdTA2MjdcdTA2MkVcdTA2NDRcdTA2NEFcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjJDXHUwNjMyXHUwNjI3XHUwNjI2XHUwNjMxXHUwNjRBXHUwNjI5IFx1MDYyNVx1MDY0NiBcdTA2NDdcdTA2NDZcdTA2MjdcdTA2NDMgXHUwNjQ1XHUwNjI3IFx1MDY0QVx1MDYzNVx1MDY0NCBcdTA2MjVcdTA2NDRcdTA2NDkgXHUwNjIzXHUwNjQ0XHUwNjQxIFx1MDY0NVx1MDY0Mlx1MDYyN1x1MDYyQVx1MDY0NCBcdTA2NDRcdTA2MjcgXHUwNjRBXHUwNjMyXHUwNjI3XHUwNjQ0XHUwNjQ4XHUwNjQ2IFx1MDY0QVx1MDYyRFx1MDY0NVx1MDY0NFx1MDY0OFx1MDY0NiBcdTA2MjdcdTA2NDRcdTA2MzNcdTA2NDRcdTA2MjdcdTA2MkQgXHUwNjQ4XHUwNjRBXHUwNjJFXHUwNjQ4XHUwNjM2XHUwNjQ4XHUwNjQ2IFx1MDYyRFx1MDYzMVx1MDYyOFx1MDYyNyBcdTA2MzZcdTA2MkYgXHUwNjQyXHUwNjQ4XHUwNjI3XHUwNjJBIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0NVx1MDY0Ni4gXHJcblxyXG5cdTA2NDhcdTA2NEFcdTA2NDJcdTA2NDhcdTA2NDQgXHUwNjQ1XHUwNjMxXHUwNjI3XHUwNjMzXHUwNjQ0XHUwNjQ4XHUwNjQ2IFx1MDYyNVx1MDY0NiBcdTA2NDVcdTA2MjhcdTA2MjdcdTA2MkZcdTA2MzFcdTA2MjkgXHUwNjQ1XHUwNjRBXHUwNjJCXHUwNjI3XHUwNjQyIFx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0NFx1MDY0NSBcdTA2NDhcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzVcdTA2MjdcdTA2NDRcdTA2MkRcdTA2MjkgXHUwNjJBXHUwNjMzXHUwNjJBXHUwNjQ3XHUwNjJGXHUwNjQxIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzM1x1MDYyN1x1MDYzOVx1MDYyRlx1MDYyOSBcdTA2NDFcdTA2NEEgXHUwNjJBXHUwNjJEXHUwNjJGXHUwNjRBXHUwNjJCIFx1MDYyN1x1MDY0NFx1MDYyQ1x1MDYzMlx1MDYyN1x1MDYyNlx1MDYzMSBcdTA2NDhcdTA2MkFcdTA2NDJcdTA2NDhcdTA2NEFcdTA2MjkgXHUwNjM5XHUwNjQ0XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBXHUwNjQ3XHUwNjI3IFx1MDY0NVx1MDYzOSBcdTA2MjdcdTA2NDRcdTA2M0FcdTA2MzFcdTA2MjguIFxyXG5cclxuXHUwNjQzXHUwNjQ1XHUwNjI3IFx1MDYyQVx1MDY0Mlx1MDYyQVx1MDYzMVx1MDYyRCBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MjhcdTA2MjdcdTA2MkZcdTA2MzFcdTA2MjkgXHUwNjJGXHUwNjQxXHUwNjM5IFx1MDYyQVx1MDYzOVx1MDY0OFx1MDY0QVx1MDYzNlx1MDYyN1x1MDYyQSBcdTA2NDRcdTA2MjNcdTA2MzNcdTA2MzEgXHUwNjM2XHUwNjJEXHUwNjI3XHUwNjRBXHUwNjI3IFx1MDYyN1x1MDY0NFx1MDYzNVx1MDYzMVx1MDYyN1x1MDYzOS4gXHJcbgotRmlsZV9tZW51aXRlbT0mRmlsZQotRXhpdF9tZW51aXRlbT1FJnhpdAotT3Blbl9tZW51aXRlbT0mT3Blbi4uLgotT3Blbl9maWxlaXRlbT1PcGVuCi1TYXZlX21lbnVpdGVtPSZTYXZlCi1TYXZlX2ZpbGVpdGVtPVNhdmUKLVNhdmVBc19tZW51aXRlbT1TYXZlICZBcy4uLgotRWRpdF9tZW51aXRlbT0mRWRpdAotQ3V0X21lbnVpdGVtPUN1JnRcdEN0cmwrWAotQ29weV9tZW51aXRlbT0mQ29weVx0Q3RybCtDCi1UZXh0X0RvY3VtZW50cz1UZXh0IERvY3VtZW50cyAoKi50eHQpCi1QYXN0ZV9tZW51aXRlbT0mUGFzdGVcdEN0cmwrVgotU2VsZWN0QWxsX21lbnVpdGVtPVNlbGVjdCAmQWxsXHRDdHJsK0EKLVdyYXBfbWVudWl0ZW09V3JhcAotSnVzdGlmeV9tZW51aXRlbT1KdXN0aWZ5Ci1TZXRGb250X21lbnVpdGVtPVNldCAmRm9udC4uLgotQWxpZ25tZW50X21lbnVpdGVtPUFsaWdubWVudAotTGVmdF9tZW51aXRlbT1MZWZ0Ci1DZW50ZXJfbWVudWl0ZW09Q2VudGVyCi1SaWdodF9tZW51aXRlbT1SaWdodAotSW5zZXJ0T2JqZWN0X21lbnVpdGVtPUluc2VydCBPYmplY3QuLi4KLU9yaWVudGF0aW9uX21lbnVpdGVtPU9yaWVudGF0aW9uLi4uCi1Db250cm9sc19tZW51aXRlbT1Db250cm9scwotQnV0dG9uX21lbnVpdGVtPUJ1dHRvbgotQ29tYm9fbWVudWl0ZW09Q29tYm8KLUltYWdlX21lbnVpdGVtPUltYWdlCi1MZWZ0VG9SaWdodF9tZW51aXRlbT1MZWZ0IHRvIHJpZ2h0Ci1SaWdodFRvTGVmdF9tZW51aXRlbT1SaWdodCB0byBsZWZ0Ci1Mb2FkUHJvZmlsZV9tZW51aXRlbT1Mb2FkIFNhbXBsZSBUZXh0Ci1Qcm9maWxlMV9tZW51aXRlbT1TYW1wbGUgMQotUHJvZmlsZTJfbWVudWl0ZW09U2FtcGxlIDIKLVByb2ZpbGUzX21lbnVpdGVtPVNhbXBsZSAzCi1Qcm9maWxlNF9tZW51aXRlbT1TYW1wZWwgNAotQm9sZD1Cb2xkCi1JdGFsaWM9SXRhbGljCi1VbmRlcmxpbmU9VW5kZXJsaW5lCi1TaW5nbGVfbWVudWl0ZW09U2luZ2xlCi1Eb3VibGVfbWVudWl0ZW09RG91YmxlCi1TcXVpZ2dsZV9tZW51aXRlbT1TcXVpZ2dsZQotRXJyb3JfbWVudWl0ZW09RXJyb3IKLUNvbG9yX21lbnVpdGVtPUNvbG9yLi4uCi1CbG9ja1NlbGVjdGlvbj1CbG9jayBTZWxlY3Rpb24KLVN0cmlrZW91dD1TdHJpa2VvdXQKLVRleHRGb3JlZ3JvdW5kPVRleHQgRm9yZWdyb3VuZAotVGV4dEJhY2tncm91bmQ9VGV4dCBCYWNrZ3JvdW5kCi1JbmNyZWFzZUJhc2VsaW5lPUluY3JlYXNlIEJhc2VsaW5lCi1JbmNyZWFzZUZvbnQ9SW5jcmVhc2UgRm9udAotRGVjcmVhc2VCYXNlbGluZT1EZWNyZWFzZSBCYXNlbGluZQotRGVjcmVhc2VGb250PURlY3JlYXNlIEZvbnQKLUFsaWduTGVmdD1BbGlnbiBMZWZ0Ci1BbGlnblJpZ2h0PUFsaWduIFJpZ2h0Ci1KdXN0aWZ5PUp1c3RpZnkKLUJ1bGxldExpc3Q9QnVsbGV0IExpc3QKLU51bWJlcmVkTGlzdD1OdW1iZXJlZCBMaXN0Ci1JbmRlbnQ9SW5kZW50OgotU3BhY2luZz1TcGFjaW5nOgotT2Zmc2V0PU9mZnNldDogCi1MaW5lPWxpbmU6IAotSW5zZXJ0PUluc2VydAotT3ZlcndyaXRlPU92ZXJ3cml0ZQotQm94PUJvcmRlcgotU29saWQ9U29saWQKLURvdD1Eb3QKLURhc2g9RGFzaAotQmFkX2ltYWdlPUJhZCBpbWFnZSBmaWxlCi1FcnJvcj1FcnJvcgotTGluaz1MaW5rCi1Paz1PawotQ2FuY2VsPUNhbmNlbAotVVJMPVVSTDoKLVNldExpbms9U2V0IExpbmsKLUJyb3dzZXI9QnJvd3NlciBXaW5kb3cKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3OTM3ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2suamF2YSVBZGRyZXNzQm9vayA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db250cm9sRXhhbXBsZS5qYXZhJUNvbnRyb2xFeGFtcGxlID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvRmlsZVZpZXdlci5qYXZhJUZpbGVWaWV3ZXIgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMS5qYXZhJUhlbGxvV29ybGQxID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDIuamF2YSVIZWxsb1dvcmxkMiA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQzLmphdmElSGVsbG9Xb3JsZDMgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNC5qYXZhJUhlbGxvV29ybGQ0ID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDUuamF2YSVIZWxsb1dvcmxkNSA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvSG92ZXJIZWxwLmphdmElSG92ZXJIZWxwID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ltYWdlYW5hbHl6ZXIvSW1hZ2VBbmFseXplci5qYXZhJUltYWdlQW5hbHl6ZXIgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvamF2YXZpZXdlci9KYXZhVmlld2VyLmphdmElSmF2YVZpZXdlciA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL1RleHRFZGl0b3IuamF2YSVUZXh0RWRpdG9yID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2libGVTaGFwZXNFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2libGVTaGFwZXNFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ODg4YzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmxlU2hhcGVzRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hY2Nlc3NpYmlsaXR5OwotCi0vKioKLSAqIFRoaXMgZXhhbXBsZSBjcmVhdGVzIHNvbWUgU2hhcGVzIGluIGEgU2hlbGwgYW5kIHVzZXMgYSBGaWxsTGF5b3V0IHRvIHBvc2l0aW9uIHRoZW0uCi0gKiBUaGUgU2hhcGUgY2xhc3MgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiB0aGUgdXNlIG9mIHRoZSBTV1QgQWNjZXNzaWJpbGl0eSBBUEkuCi0gKiBBIFNoYXBlIGlzIGFjY2Vzc2libGUsIGJ1dCBpdCBkb2VzIG5vdCBoYXZlIGFueSBhY2Nlc3NpYmxlIGNoaWxkcmVuLgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmxlU2hhcGVzRXhhbXBsZSB7Ci0Jc3RhdGljIERpc3BsYXkgZGlzcGxheTsKLQlzdGF0aWMgU2hlbGwgc2hlbGw7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JCVNoYXBlIHJlZFNxdWFyZSA9IG5ldyBTaGFwZShzaGVsbCwgU1dULk5PTkUpOwotCQlyZWRTcXVhcmUuc2V0Q29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JCXJlZFNxdWFyZS5zZXRTaGFwZSgic3F1YXJlIik7Ci0JCQotCQlTaGFwZSBibHVlQ2lyY2xlID0gbmV3IFNoYXBlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJsdWVDaXJjbGUuc2V0Q29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQlibHVlQ2lyY2xlLnNldFNoYXBlKCJjaXJjbGUiKTsKLQotCQlTaGFwZSBncmVlblNxdWFyZSA9IG5ldyBTaGFwZShzaGVsbCwgU1dULk5PTkUpOwotCQlncmVlblNxdWFyZS5zZXRDb2xvcihTV1QuQ09MT1JfR1JFRU4pOwotCQlncmVlblNxdWFyZS5zZXRTaGFwZSgic3F1YXJlIik7Ci0KLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXJlZFNxdWFyZS5zZXRGb2N1cygpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L0NvbnRyb2xzV2l0aEFjY2Vzc2libGVOYW1lc0V4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FjY2Vzc2liaWxpdHkvQ29udHJvbHNXaXRoQWNjZXNzaWJsZU5hbWVzRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzkwMGNlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FjY2Vzc2liaWxpdHkvQ29udHJvbHNXaXRoQWNjZXNzaWJsZU5hbWVzRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWNjZXNzaWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLQotcHVibGljIGNsYXNzIENvbnRyb2xzV2l0aEFjY2Vzc2libGVOYW1lc0V4YW1wbGUgewotCXN0YXRpYyBEaXNwbGF5IGRpc3BsYXk7Ci0Jc3RhdGljIFNoZWxsIHNoZWxsOwotCXN0YXRpYyBCdXR0b24gYnV0dG9uLCBvdmVycmlkZUJ1dHRvbiwgaW1hZ2VCdXR0b24sIG92ZXJyaWRlSW1hZ2VCdXR0b247Ci0Jc3RhdGljIExhYmVsIGxhYmVsLCBvdmVycmlkZUxhYmVsLCBpbWFnZUxhYmVsLCBvdmVycmlkZUltYWdlTGFiZWw7Ci0Jc3RhdGljIENvbWJvIGNvbWJvLCBvdmVycmlkZUNvbWJvOwotCXN0YXRpYyBTcGlubmVyIHNwaW5uZXIsIG92ZXJyaWRlU3Bpbm5lcjsKLQlzdGF0aWMgTGlzdCBsaXN0LCBvdmVycmlkZUxpc3Q7Ci0Jc3RhdGljIFRleHQgdGV4dCwgb3ZlcnJpZGVUZXh0OwotCXN0YXRpYyBUYWJsZSB0YWJsZSwgb3ZlcnJpZGVUYWJsZTsKLQlzdGF0aWMgVHJlZSB0cmVlLCBvdmVycmlkZVRyZWU7Ci0Jc3RhdGljIFRyZWUgdHJlZVRhYmxlLCBvdmVycmlkZVRyZWVUYWJsZTsKLQlzdGF0aWMgVG9vbEJhciB0b29sQmFyLCBvdmVycmlkZVRvb2xCYXI7Ci0Jc3RhdGljIFRvb2xCYXIgaW1hZ2VUb29sQmFyLCBvdmVycmlkZUltYWdlVG9vbEJhcjsKLQlzdGF0aWMgQ29vbEJhciBjb29sQmFyLCBvdmVycmlkZUNvb2xCYXI7Ci0Jc3RhdGljIENhbnZhcyBjYW52YXMsIG92ZXJyaWRlQ2FudmFzOwotCXN0YXRpYyBDb21wb3NpdGUgY29tcG9zaXRlLCBvdmVycmlkZUNvbXBvc2l0ZTsKLQlzdGF0aWMgR3JvdXAgZ3JvdXAsIG92ZXJyaWRlR3JvdXA7Ci0Jc3RhdGljIFRhYkZvbGRlciB0YWJGb2xkZXIsIG92ZXJyaWRlVGFiRm9sZGVyOwotCXN0YXRpYyBDTGFiZWwgY0xhYmVsLCBvdmVycmlkZUNMYWJlbDsKLQlzdGF0aWMgQ0NvbWJvIGNDb21ibywgb3ZlcnJpZGVDQ29tYm87Ci0Jc3RhdGljIENUYWJGb2xkZXIgY1RhYkZvbGRlciwgb3ZlcnJpZGVDVGFiRm9sZGVyOwotCXN0YXRpYyBTdHlsZWRUZXh0IHN0eWxlZFRleHQsIG92ZXJyaWRlU3R5bGVkVGV4dDsKLQlzdGF0aWMgUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXIsIG92ZXJyaWRlUHJvZ3Jlc3NCYXI7Ci0Jc3RhdGljIFNhc2ggc2FzaCwgb3ZlcnJpZGVTYXNoOwotCXN0YXRpYyBTY2FsZSBzY2FsZSwgb3ZlcnJpZGVTY2FsZTsKLQlzdGF0aWMgU2xpZGVyIHNsaWRlciwgb3ZlcnJpZGVTbGlkZXI7Ci0Jc3RhdGljIEltYWdlIHNtYWxsSW1hZ2UsIGxhcmdlSW1hZ2UsIHRyYW5zcGFyZW50SW1hZ2U7Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlzaGVsbC5zZXRUZXh0KCJPdmVycmlkZSBBY2Nlc3NpYmlsaXR5IFRlc3QiKTsKLQkJCi0JCWxhcmdlSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgQ29udHJvbHNXaXRoQWNjZXNzaWJsZU5hbWVzRXhhbXBsZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJydW5fd2l6LmdpZiIpKTsKLQkJc21hbGxJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBDb250cm9sc1dpdGhBY2Nlc3NpYmxlTmFtZXNFeGFtcGxlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oInJ1bi5naWYiKSk7Ci0JCUltYWdlRGF0YSBzb3VyY2UgPSBzbWFsbEltYWdlLmdldEltYWdlRGF0YSgpOwotCQlJbWFnZURhdGEgbWFzayA9IHNvdXJjZS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCXRyYW5zcGFyZW50SW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc291cmNlLCBtYXNrKTsKLQkJCi0JCW5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpLnNldFRleHQoIlVzZSBQbGF0Zm9ybSBOYW1lIik7Ci0JCW5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpLnNldFRleHQoIk92ZXJyaWRlIFBsYXRmb3JtIE5hbWUiKTsKLQkJCi0JCUFjY2Vzc2libGVBZGFwdGVyIG92ZXJyaWRlQWNjZXNzaWJsZUFkYXB0ZXIgPSBuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJQ29udHJvbCBjb250cm9sID0gKChBY2Nlc3NpYmxlKSBlLmdldFNvdXJjZSgpKS5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0JCQkJCWUucmVzdWx0ID0gIk92ZXJyaWRpbmcgUGxhdGZvcm0gTmFtZSBGb3IgIiArIGNvbnRyb2wuZ2V0RGF0YSgibmFtZSIpICsgIiAod2FzICIgKyBlLnJlc3VsdCArICIpIjsKLQkJCQl9IGVsc2UgewotCQkJCQllLnJlc3VsdCA9ICJPdmVycmlkaW5nIFBsYXRmb3JtIE5hbWUgRm9yICIgKyBjb250cm9sLmdldERhdGEoImNoaWxkIikgKyAiOiAiICsgZS5jaGlsZElEICsgIiAod2FzICIgKyBlLnJlc3VsdCArICIpIjsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBnZXRIZWxwKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJQ29udHJvbCBjb250cm9sID0gKChBY2Nlc3NpYmxlKSBlLmdldFNvdXJjZSgpKS5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0JCQkJCWUucmVzdWx0ID0gIk92ZXJyaWRpbmcgUGxhdGZvcm0gSGVscCBGb3IgIiArIGNvbnRyb2wuZ2V0RGF0YSgibmFtZSIpICsgIiAod2FzICIgKyBlLnJlc3VsdCArICIpIjsKLQkJCQl9IGVsc2UgewotCQkJCQllLnJlc3VsdCA9ICJPdmVycmlkaW5nIFBsYXRmb3JtIEhlbHAgRm9yICIgKyBjb250cm9sLmdldERhdGEoImNoaWxkIikgKyAiOiAiICsgZS5jaGlsZElEICsgIiAod2FzICIgKyBlLnJlc3VsdCArICIpIjsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotLy8JCVNoZWxsIHNoZWxsOwotCQlzaGVsbC5zZXREYXRhKCJuYW1lIiwgIlNoZWxsIik7Ci0JCXNoZWxsLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIob3ZlcnJpZGVBY2Nlc3NpYmxlQWRhcHRlcik7Ci0KLS8vCQlMYWJlbCBsYWJlbCwgb3ZlcnJpZGVMYWJlbDsKLQkJbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlsYWJlbC5zZXRUZXh0KCJMYWJlbCIpOwotCQlsYWJlbC5zZXRUb29sVGlwVGV4dCgiTGFiZWwgVG9vbFRpcCIpOwotCi0JCW92ZXJyaWRlTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlvdmVycmlkZUxhYmVsLnNldFRleHQoIkxhYmVsIik7Ci0JCW92ZXJyaWRlTGFiZWwuc2V0VG9vbFRpcFRleHQoIkxhYmVsIFRvb2xUaXAiKTsKLQkJb3ZlcnJpZGVMYWJlbC5zZXREYXRhKCJuYW1lIiwgIkxhYmVsIik7Ci0JCW92ZXJyaWRlTGFiZWwuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihvdmVycmlkZUFjY2Vzc2libGVBZGFwdGVyKTsKLQotLy8JCUxhYmVsIGltYWdlTGFiZWwsIG92ZXJyaWRlSW1hZ2VMYWJlbDsKLQkJaW1hZ2VMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWltYWdlTGFiZWwuc2V0SW1hZ2UobGFyZ2VJbWFnZSk7Ci0JCWltYWdlTGFiZWwuc2V0VG9vbFRpcFRleHQoIkltYWdlIExhYmVsIFRvb2xUaXAiKTsKLQotCQlvdmVycmlkZUltYWdlTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlvdmVycmlkZUltYWdlTGFiZWwuc2V0SW1hZ2UobGFyZ2VJbWFnZSk7Ci0JCW92ZXJyaWRlSW1hZ2VMYWJlbC5zZXRUb29sVGlwVGV4dCgiSW1hZ2UgTGFiZWwgVG9vbFRpcCIpOwotCQlvdmVycmlkZUltYWdlTGFiZWwuc2V0RGF0YSgibmFtZSIsICJJbWFnZSBMYWJlbCIpOwotCQlvdmVycmlkZUltYWdlTGFiZWwuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihvdmVycmlkZUFjY2Vzc2libGVBZGFwdGVyKTsKLQotLy8JCUJ1dHRvbiBidXR0b24sIG92ZXJyaWRlQnV0dG9uOwotCQlidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJCdXR0b24iKTsKLQkJYnV0dG9uLnNldFRvb2xUaXBUZXh0KCJCdXR0b24gVG9vbFRpcCIpOwotCi0JCW92ZXJyaWRlQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlvdmVycmlkZUJ1dHRvbi5zZXRUZXh0KCJCdXR0b24iKTsKLQkJb3ZlcnJpZGVCdXR0b24uc2V0VG9vbFRpcFRleHQoIkJ1dHRvbiBUb29sVGlwIik7Ci0JCW92ZXJyaWRlQnV0dG9uLnNldERhdGEoIm5hbWUiLCAiQnV0dG9uIik7Ci0JCW92ZXJyaWRlQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIob3ZlcnJpZGVBY2Nlc3NpYmxlQWRhcHRlcik7Ci0KLS8vCQlCdXR0b24gaW1hZ2VCdXR0b24sIG92ZXJyaWRlSW1hZ2VCdXR0b247Ci0JCWltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlpbWFnZUJ1dHRvbi5zZXRJbWFnZShzbWFsbEltYWdlKTsKLQkJaW1hZ2VCdXR0b24uc2V0VG9vbFRpcFRleHQoIkltYWdlIEJ1dHRvbiBUb29sVGlwIik7Ci0JCQotCQlvdmVycmlkZUltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlvdmVycmlkZUltYWdlQnV0dG9uLnNldEltYWdlKHNtYWxsSW1hZ2UpOwotCQlvdmVycmlkZUltYWdlQnV0dG9uLnNldFRvb2xUaXBUZXh0KCJJbWFnZSBCdXR0b24gVG9vbFRpcCIpOwotCQlvdmVycmlkZUltYWdlQnV0dG9uLnNldERhdGEoIm5hbWUiLCAiSW1hZ2UgQnV0dG9uIik7Ci0JCW92ZXJyaWRlSW1hZ2VCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihvdmVycmlkZUFjY2Vzc2libGVBZGFwdGVyKTsKLQkJCi0vLwkJQ29tYm8gY29tYm8sIG92ZXJyaWRlQ29tYm87Ci0JCWNvbWJvID0gbmV3IENvbWJvKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCWNvbWJvLmFkZCgiaXRlbSIgKyBpKTsKLQkJfQotCQljb21iby5zZXRUZXh0KCJDb21ibyIpOwotCQljb21iby5zZXRUb29sVGlwVGV4dCgiQ29tYm8gVG9vbFRpcCIpOwotCi0JCW92ZXJyaWRlQ29tYm8gPSBuZXcgQ29tYm8oc2hlbGwsIFNXVC5CT1JERVIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJb3ZlcnJpZGVDb21iby5hZGQoIml0ZW0iICsgaSk7Ci0JCX0KLQkJb3ZlcnJpZGVDb21iby5zZXRUZXh0KCJDb21ibyIpOwotCQlvdmVycmlkZUNvbWJvLnNldFRvb2xUaXBUZXh0KCJDb21ibyBUb29sVGlwIik7Ci0JCW92ZXJyaWRlQ29tYm8uc2V0RGF0YSgibmFtZSIsICJDb21ibyIpOwotCQlvdmVycmlkZUNvbWJvLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIob3ZlcnJpZGVBY2Nlc3NpYmxlQWRhcHRlcik7Ci0JCQkJCi0vLwkJU3Bpbm5lciBzcGlubmVyLCBvdmVycmlkZVNwaW5uZXI7Ci0JCXNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JCXNwaW5uZXIuc2V0U2VsZWN0aW9uKDUpOwotCQlzcGlubmVyLnNldFRvb2xUaXBUZXh0KCJTcGlubmVyIFRvb2xUaXAiKTsKLQotCQlvdmVycmlkZVNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JCW92ZXJyaWRlU3Bpbm5lci5zZXRTZWxlY3Rpb24oNSk7Ci0JCW92ZXJyaWRlU3Bpbm5lci5zZXRUb29sVGlwVGV4dCgiU3Bpbm5lciBUb29sVGlwIik7Ci0JCW92ZXJyaWRlU3Bpbm5lci5zZXREYXRhKCJuYW1lIiwgIlNwaW5uZXIiKTsKLQkJb3ZlcnJpZGVTcGlubmVyLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIob3ZlcnJpZGVBY2Nlc3NpYmxlQWRhcHRlcik7Ci0JCQkJCi0vLwkJTGlzdCBsaXN0LCBvdmVycmlkZUxpc3Q7Ci0JCWxpc3QgPSBuZXcgTGlzdChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlsaXN0LnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ikl0ZW0wIiwgIkl0ZW0xIiwgIkl0ZW0yIn0pOwotCQkKLQkJb3ZlcnJpZGVMaXN0ID0gbmV3IExpc3Qoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJb3ZlcnJpZGVMaXN0LnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ikl0ZW0wIiwgIkl0ZW0xIiwgIkl0ZW0yIn0pOwotCQlvdmVycmlkZUxpc3Quc2V0RGF0YSgibmFtZSIsICJMaXN0Iik7Ci0JCW92ZXJyaWRlTGlzdC5zZXREYXRhKCJjaGlsZCIsICJMaXN0IEl0ZW0iKTsKLQkJb3ZlcnJpZGVMaXN0LmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIob3ZlcnJpZGVBY2Nlc3NpYmxlQWRhcHRlcik7Ci0JCQotLy8JCVRleHQgdGV4dCwgb3ZlcnJpZGVUZXh0OwotCQl0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJdGV4dC5zZXRUZXh0KCJDb250ZW50cyBvZiBUZXh0Iik7Ci0JCQotCQlvdmVycmlkZVRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlvdmVycmlkZVRleHQuc2V0VGV4dCgiQ29udGVudHMgb2YgVGV4dCIpOwotCQlvdmVycmlkZVRleHQuc2V0RGF0YSgibmFtZSIsICJUZXh0Iik7Ci0JCW92ZXJyaWRlVGV4dC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG92ZXJyaWRlQWNjZXNzaWJsZUFkYXB0ZXIpOwotCQkKLS8vCQlUYWJsZSB0YWJsZSwgb3ZlcnJpZGVUYWJsZTsKLQkJdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCWNvbHVtbi5zZXRUZXh0KCJDb2wgIiArIGNvbCk7Ci0JCQljb2x1bW4ucGFjaygpOwotCQl9Ci0JCWZvciAoaW50IHJvdyA9IDA7IHJvdyA8IDM7IHJvdysrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiQzBSIiArIHJvdywgIkMxUiIgKyByb3csICJDMlIiICsgcm93fSk7Ci0JCX0KLQkJCi0JCW92ZXJyaWRlVGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlvdmVycmlkZVRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCW92ZXJyaWRlVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlmb3IgKGludCBjb2wgPSAwOyBjb2wgPCAzOyBjb2wrKykgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG92ZXJyaWRlVGFibGUsIFNXVC5OT05FKTsKLQkJCWNvbHVtbi5zZXRUZXh0KCJDb2wgIiArIGNvbCk7Ci0JCQljb2x1bW4ucGFjaygpOwotCQl9Ci0JCWZvciAoaW50IHJvdyA9IDA7IHJvdyA8IDM7IHJvdysrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0ob3ZlcnJpZGVUYWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJDMFIiICsgcm93LCAiQzFSIiArIHJvdywgIkMyUiIgKyByb3d9KTsKLQkJfQotCQlvdmVycmlkZVRhYmxlLnNldERhdGEoIm5hbWUiLCAiVGFibGUiKTsKLQkJb3ZlcnJpZGVUYWJsZS5zZXREYXRhKCJjaGlsZCIsICJUYWJsZSBJdGVtIik7Ci0JCW92ZXJyaWRlVGFibGUuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihvdmVycmlkZUFjY2Vzc2libGVBZGFwdGVyKTsKLQkJCi0vLwkJVHJlZSB0cmVlLCBvdmVycmlkZVRyZWU7Ci0JCXRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgiSXRlbSIgKyBpKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JCQkJbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKS5zZXRUZXh0KCJJdGVtIiArIGkgKyBqKTsKLQkJCX0KLQkJfQotCQkKLQkJb3ZlcnJpZGVUcmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbShvdmVycmlkZVRyZWUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgiSXRlbSIgKyBpKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JCQkJbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKS5zZXRUZXh0KCJJdGVtIiArIGkgKyBqKTsKLQkJCX0KLQkJfQotCQlvdmVycmlkZVRyZWUuc2V0RGF0YSgibmFtZSIsICJUcmVlIik7Ci0JCW92ZXJyaWRlVHJlZS5zZXREYXRhKCJjaGlsZCIsICJUcmVlIEl0ZW0iKTsKLQkJb3ZlcnJpZGVUcmVlLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIob3ZlcnJpZGVBY2Nlc3NpYmxlQWRhcHRlcik7Ci0JCQkJCQkKLS8vCQlUcmVlIHRyZWVUYWJsZSwgb3ZlcnJpZGVUcmVlVGFibGU7Ci0JCXRyZWVUYWJsZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJdHJlZVRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRyZWVUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7Ci0JCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWVUYWJsZSwgU1dULk5PTkUpOwotCQkJY29sdW1uLnNldFRleHQoIkNvbCAiICsgY29sKTsKLQkJCWNvbHVtbi5wYWNrKCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZVRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQobmV3IFN0cmluZyBbXSB7IkkiICsgaSArICJDMCIsICJJIiArIGkgKyAiQzEiLCAiSSIgKyBpICsgIkMyIn0pOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCQluZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpLnNldFRleHQobmV3IFN0cmluZyBbXSB7IkkiICsgaSArIGogKyAiQzAiLCAiSSIgKyBpICsgaiArICJDMSIsICJJIiArIGkgKyBqICsgIkMyIn0pOwotCQkJfQotCQl9Ci0JCQotCQlvdmVycmlkZVRyZWVUYWJsZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJb3ZlcnJpZGVUcmVlVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJb3ZlcnJpZGVUcmVlVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlmb3IgKGludCBjb2wgPSAwOyBjb2wgPCAzOyBjb2wrKykgewotCQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbihvdmVycmlkZVRyZWVUYWJsZSwgU1dULk5PTkUpOwotCQkJY29sdW1uLnNldFRleHQoIkNvbCAiICsgY29sKTsKLQkJCWNvbHVtbi5wYWNrKCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0ob3ZlcnJpZGVUcmVlVGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiSSIgKyBpICsgIkMwIiwgIkkiICsgaSArICJDMSIsICJJIiArIGkgKyAiQzIifSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgewotCQkJCW5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSkuc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiSSIgKyBpICsgaiArICJDMCIsICJJIiArIGkgKyBqICsgIkMxIiwgIkkiICsgaSArIGogKyAiQzIifSk7Ci0JCQl9Ci0JCX0KLQkJb3ZlcnJpZGVUcmVlVGFibGUuc2V0RGF0YSgibmFtZSIsICJUcmVlIFRhYmxlIik7Ci0JCW92ZXJyaWRlVHJlZVRhYmxlLnNldERhdGEoImNoaWxkIiwgIlRyZWUgVGFibGUgSXRlbSIpOwotCQlvdmVycmlkZVRyZWVUYWJsZS5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG92ZXJyaWRlQWNjZXNzaWJsZUFkYXB0ZXIpOwotCQkJCQkJCi0vLwkJVG9vbEJhciB0b29sQmFyLCBvdmVycmlkZVRvb2xCYXI7Ci0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgU1dULkZMQVQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQoIkl0ZW0iICsgaSk7Ci0JCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJUb29sSXRlbSBUb29sVGlwIiArIGkpOwotCQl9Ci0JCQotCQlvdmVycmlkZVRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgU1dULkZMQVQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbShvdmVycmlkZVRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0VGV4dCgiSXRlbSIgKyBpKTsKLQkJCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlRvb2xJdGVtIFRvb2xUaXAiICsgaSk7Ci0JCX0KLQkJb3ZlcnJpZGVUb29sQmFyLnNldERhdGEoIm5hbWUiLCAiVG9vbEJhciIpOwotCQlvdmVycmlkZVRvb2xCYXIuc2V0RGF0YSgiY2hpbGQiLCAiVG9vbEJhciBJdGVtIik7Ci0JCW92ZXJyaWRlVG9vbEJhci5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG92ZXJyaWRlQWNjZXNzaWJsZUFkYXB0ZXIpOwotCQkKLS8vCQlUb29sQmFyIGltYWdlVG9vbEJhciwgb3ZlcnJpZGVJbWFnZVRvb2xCYXI7Ci0JCWltYWdlVG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuRkxBVCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKGltYWdlVG9vbEJhciwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRJbWFnZSh0cmFuc3BhcmVudEltYWdlKTsKLQkJCWl0ZW0uc2V0VG9vbFRpcFRleHQoIkltYWdlIFRvb2xJdGVtIFRvb2xUaXAiICsgaSk7Ci0JCX0KLQkJCi0JCW92ZXJyaWRlSW1hZ2VUb29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5GTEFUKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0ob3ZlcnJpZGVJbWFnZVRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0SW1hZ2UodHJhbnNwYXJlbnRJbWFnZSk7Ci0JCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJJbWFnZSBUb29sSXRlbSBUb29sVGlwIiArIGkpOwotCQl9Ci0JCW92ZXJyaWRlSW1hZ2VUb29sQmFyLnNldERhdGEoIm5hbWUiLCAiSW1hZ2UgVG9vbEJhciIpOwotCQlvdmVycmlkZUltYWdlVG9vbEJhci5zZXREYXRhKCJjaGlsZCIsICJJbWFnZSBUb29sQmFyIEl0ZW0iKTsKLQkJb3ZlcnJpZGVJbWFnZVRvb2xCYXIuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihvdmVycmlkZUFjY2Vzc2libGVBZGFwdGVyKTsKLQkJCi0vLwkJQ29vbEJhciBjb29sQmFyLCBvdmVycmlkZUNvb2xCYXI7Ci0JCWNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgU1dULkZMQVQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULlBVU0gpOwotCQkJVG9vbEJhciBjb29sSXRlbVRvb2xCYXIgPSBuZXcgVG9vbEJhcihjb29sQmFyLCBTV1QuRkxBVCk7Ci0JCQlpbnQgdG9vbEl0ZW1XaWR0aCA9IDA7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykgewotCQkJCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0oY29vbEl0ZW1Ub29sQmFyLCBTV1QuUFVTSCk7Ci0JCQkJaXRlbS5zZXRUZXh0KCJJIiArIGkgKyBqKTsKLQkJCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJUb29sSXRlbSBUb29sVGlwIiArIGkgKyBqKTsKLQkJCQlpZiAoaXRlbS5nZXRXaWR0aCgpID4gdG9vbEl0ZW1XaWR0aCkgdG9vbEl0ZW1XaWR0aCA9IGl0ZW0uZ2V0V2lkdGgoKTsKLQkJCX0KLQkgICAgICAgIGNvb2xJdGVtLnNldENvbnRyb2woY29vbEl0ZW1Ub29sQmFyKTsKLQkgICAgICAgIFBvaW50IHNpemUgPSBjb29sSXRlbVRvb2xCYXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkgICAgICAgIFBvaW50IGNvb2xTaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KTsKLQkgICAgICAgIGNvb2xJdGVtLnNldE1pbmltdW1TaXplKHRvb2xJdGVtV2lkdGgsIGNvb2xTaXplLnkpOwotCSAgICAgICAgY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShjb29sU2l6ZSk7Ci0JICAgICAgICBjb29sSXRlbS5zZXRTaXplKGNvb2xTaXplKTsKLQkJfQotCQkKLQkJLy8gTm90ZTogY3VycmVudGx5LCBNU0FBIGRvZXMgbm90IHN1cHBvcnQgY29vbGJhcgotCQlvdmVycmlkZUNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgU1dULkZMQVQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0ob3ZlcnJpZGVDb29sQmFyLCBTV1QuUFVTSCk7Ci0JCQlUb29sQmFyIGNvb2xJdGVtVG9vbEJhciA9IG5ldyBUb29sQmFyKG92ZXJyaWRlQ29vbEJhciwgU1dULkZMQVQpOwotCQkJaW50IHRvb2xJdGVtV2lkdGggPSAwOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKLQkJCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKGNvb2xJdGVtVG9vbEJhciwgU1dULlBVU0gpOwotCQkJCWl0ZW0uc2V0VGV4dCgiSSIgKyBpICsgaik7Ci0JCQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiVG9vbEl0ZW0gVG9vbFRpcCIgKyBpICsgaik7Ci0JCQkJaWYgKGl0ZW0uZ2V0V2lkdGgoKSA+IHRvb2xJdGVtV2lkdGgpIHRvb2xJdGVtV2lkdGggPSBpdGVtLmdldFdpZHRoKCk7Ci0JCQl9Ci0JICAgICAgICBjb29sSXRlbS5zZXRDb250cm9sKGNvb2xJdGVtVG9vbEJhcik7Ci0JICAgICAgICBQb2ludCBzaXplID0gY29vbEl0ZW1Ub29sQmFyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JICAgICAgICBQb2ludCBjb29sU2l6ZSA9IGNvb2xJdGVtLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSk7Ci0JICAgICAgICBjb29sSXRlbS5zZXRNaW5pbXVtU2l6ZSh0b29sSXRlbVdpZHRoLCBjb29sU2l6ZS55KTsKLQkgICAgICAgIGNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoY29vbFNpemUpOwotCSAgICAgICAgY29vbEl0ZW0uc2V0U2l6ZShjb29sU2l6ZSk7Ci0JCX0KLQkJb3ZlcnJpZGVDb29sQmFyLnNldERhdGEoIm5hbWUiLCAiQ29vbEJhciIpOwotCQlvdmVycmlkZUNvb2xCYXIuc2V0RGF0YSgiY2hpbGQiLCAiQ29vbEJhciBJdGVtIik7Ci0JCW92ZXJyaWRlQ29vbEJhci5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG92ZXJyaWRlQWNjZXNzaWJsZUFkYXB0ZXIpOwotCQkJCQotLy8JCUNhbnZhcyBjYW52YXMsIG92ZXJyaWRlQ2FudmFzOwotCQljYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJY2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJZS5nYy5kcmF3U3RyaW5nKCJDYW52YXMiLCAxNSwgMjUpOwotCQkJfQotCQl9KTsKLQkJQ2FyZXQgY2FyZXQgPSBuZXcgQ2FyZXQoY2FudmFzLCBTV1QuTk9ORSk7Ci0JCWNhcmV0LnNldFNpemUoMiwgMTApOwotCQljYW52YXMuc2V0Q2FyZXQgKGNhcmV0KTsKLQkJLyogSG9vayBrZXkgbGlzdGVuZXIgc28gY2FudmFzIHdpbGwgdGFrZSBmb2N1cyBkdXJpbmcgdHJhdmVyc2FsIGluLiAqLwotCQljYW52YXMuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCS8qIEhvb2sgdHJhdmVyc2UgbGlzdGVuZXIgdG8gbWFrZSBjYW52YXMgZ2l2ZSB1cCBmb2N1cyBkdXJpbmcgdHJhdmVyc2FsIG91dC4gKi8KLQkJY2FudmFzLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJb3ZlcnJpZGVDYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJb3ZlcnJpZGVDYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQllLmdjLmRyYXdTdHJpbmcoIkNhbnZhcyIsIDE1LCAyNSk7Ci0JCQl9Ci0JCX0pOwotCQljYXJldCA9IG5ldyBDYXJldChvdmVycmlkZUNhbnZhcywgU1dULk5PTkUpOwotCQljYXJldC5zZXRTaXplKDIsIDEwKTsKLQkJb3ZlcnJpZGVDYW52YXMuc2V0Q2FyZXQgKGNhcmV0KTsKLQkJLyogSG9vayBrZXkgbGlzdGVuZXIgc28gY2FudmFzIHdpbGwgdGFrZSBmb2N1cyBkdXJpbmcgdHJhdmVyc2FsIGluLiAqLwotCQlvdmVycmlkZUNhbnZhcy5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJfQotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJLyogSG9vayB0cmF2ZXJzZSBsaXN0ZW5lciB0byBtYWtlIGNhbnZhcyBnaXZlIHVwIGZvY3VzIGR1cmluZyB0cmF2ZXJzYWwgb3V0LiAqLwotCQlvdmVycmlkZUNhbnZhcy5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlvdmVycmlkZUNhbnZhcy5zZXREYXRhKCJuYW1lIiwgIkNhbnZhcyIpOwotCQlvdmVycmlkZUNhbnZhcy5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG92ZXJyaWRlQWNjZXNzaWJsZUFkYXB0ZXIpOwotCQkKLS8vCQlDb21wb3NpdGUgY29tcG9zaXRlLCBvdmVycmlkZUNvbXBvc2l0ZTsKLQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCW5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUkFESU8pLnNldFRleHQoIkNoaWxkIDEiKTsKLQkJbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5SQURJTykuc2V0VGV4dCgiQ2hpbGQgMiIpOwotCi0JCW92ZXJyaWRlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JCW92ZXJyaWRlQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJbmV3IEJ1dHRvbihvdmVycmlkZUNvbXBvc2l0ZSwgU1dULlJBRElPKS5zZXRUZXh0KCJDaGlsZCAxIik7Ci0JCW5ldyBCdXR0b24ob3ZlcnJpZGVDb21wb3NpdGUsIFNXVC5SQURJTykuc2V0VGV4dCgiQ2hpbGQgMiIpOwotCQlvdmVycmlkZUNvbXBvc2l0ZS5zZXREYXRhKCJuYW1lIiwgIkNvbXBvc2l0ZSIpOwotCQlvdmVycmlkZUNvbXBvc2l0ZS5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG92ZXJyaWRlQWNjZXNzaWJsZUFkYXB0ZXIpOwotCQkKLS8vCQlHcm91cCBncm91cCwgb3ZlcnJpZGVHcm91cDsKLQkJZ3JvdXAgPSBuZXcgR3JvdXAoc2hlbGwsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dCgiR3JvdXAiKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQluZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSkuc2V0VGV4dCgiVGV4dCBpbiBHcm91cCIpOwotCQkKLQkJb3ZlcnJpZGVHcm91cCA9IG5ldyBHcm91cChzaGVsbCwgU1dULk5PTkUpOwotCQlvdmVycmlkZUdyb3VwLnNldFRleHQoIkdyb3VwIik7Ci0JCW92ZXJyaWRlR3JvdXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQluZXcgVGV4dChvdmVycmlkZUdyb3VwLCBTV1QuU0lOR0xFKS5zZXRUZXh0KCJUZXh0IGluIEdyb3VwIik7Ci0JCW92ZXJyaWRlR3JvdXAuc2V0RGF0YSgibmFtZSIsICJHcm91cCIpOwotCQlvdmVycmlkZUdyb3VwLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIob3ZlcnJpZGVBY2Nlc3NpYmxlQWRhcHRlcik7Ci0JCQotLy8JCVRhYkZvbGRlciB0YWJGb2xkZXIsIG92ZXJyaWRlVGFiRm9sZGVyOwotCQl0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgiVGFiSXRlbSAmIiArIGkpOwotCQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiVGFiSXRlbSBUb29sVGlwIiArIGkpOwotCQkJVGV4dCBpdGVtVGV4dCA9IG5ldyBUZXh0KHRhYkZvbGRlciwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCQlpdGVtVGV4dC5zZXRUZXh0KCJcblRleHQgZm9yIFRhYkl0ZW0gIiArIGkgKyAiXG5cblxuIik7Ci0JCQlpdGVtLnNldENvbnRyb2woaXRlbVRleHQpOwotCQl9Ci0JCQotCQlvdmVycmlkZVRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKG92ZXJyaWRlVGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQoIlRhYkl0ZW0gJiIgKyBpKTsKLQkJCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlRhYkl0ZW0gVG9vbFRpcCIgKyBpKTsKLQkJCVRleHQgaXRlbVRleHQgPSBuZXcgVGV4dChvdmVycmlkZVRhYkZvbGRlciwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCQlpdGVtVGV4dC5zZXRUZXh0KCJcblRleHQgZm9yIFRhYkl0ZW0gIiArIGkgKyAiXG5cblxuIik7Ci0JCQlpdGVtLnNldENvbnRyb2woaXRlbVRleHQpOwotCQl9Ci0JCW92ZXJyaWRlVGFiRm9sZGVyLnNldERhdGEoIm5hbWUiLCAiVGFiRm9sZGVyIik7Ci0JCW92ZXJyaWRlVGFiRm9sZGVyLnNldERhdGEoImNoaWxkIiwgIlRhYkl0ZW0iKTsKLQkJb3ZlcnJpZGVUYWJGb2xkZXIuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihvdmVycmlkZUFjY2Vzc2libGVBZGFwdGVyKTsKLQotLy8JCUNMYWJlbCBjTGFiZWwsIG92ZXJyaWRlQ0xhYmVsOwotCQljTGFiZWwgPSBuZXcgQ0xhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJY0xhYmVsLnNldFRleHQoIkNMYWJlbCIpOwotCQljTGFiZWwuc2V0VG9vbFRpcFRleHQoIkNMYWJlbCBUb29sVGlwIik7Ci0JCWNMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgxMDAsIFNXVC5ERUZBVUxUKSk7Ci0KLQkJb3ZlcnJpZGVDTGFiZWwgPSBuZXcgQ0xhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJb3ZlcnJpZGVDTGFiZWwuc2V0VGV4dCgiQ0xhYmVsIik7Ci0JCW92ZXJyaWRlQ0xhYmVsLnNldFRvb2xUaXBUZXh0KCJDTGFiZWwgVG9vbFRpcCIpOwotCQlvdmVycmlkZUNMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgxMDAsIFNXVC5ERUZBVUxUKSk7Ci0JCW92ZXJyaWRlQ0xhYmVsLnNldERhdGEoIm5hbWUiLCAiQ0xhYmVsIik7Ci0JCW92ZXJyaWRlQ0xhYmVsLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIob3ZlcnJpZGVBY2Nlc3NpYmxlQWRhcHRlcik7Ci0JCQotLy8JCUNDb21ibyBjQ29tYm8sIG92ZXJyaWRlQ0NvbWJvOwotCQljQ29tYm8gPSBuZXcgQ0NvbWJvKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCWNDb21iby5hZGQoIml0ZW0iICsgaSk7Ci0JCX0KLQkJY0NvbWJvLnNldFRleHQoIkNDb21ibyIpOwotCQljQ29tYm8uc2V0VG9vbFRpcFRleHQoIkNDb21ibyBUb29sVGlwIik7Ci0KLQkJLy8gTm90ZTogVGhpcyBkb2Vzbid0IHdvcmsgd2VsbCBiZWNhdXNlIENDb21ibyBoYXMgQ29udHJvbCBjaGlsZHJlbgotCQlvdmVycmlkZUNDb21ibyA9IG5ldyBDQ29tYm8oc2hlbGwsIFNXVC5CT1JERVIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJb3ZlcnJpZGVDQ29tYm8uYWRkKCJpdGVtIiArIGkpOwotCQl9Ci0JCW92ZXJyaWRlQ0NvbWJvLnNldFRleHQoIkNDb21ibyIpOwotCQlvdmVycmlkZUNDb21iby5zZXRUb29sVGlwVGV4dCgiQ0NvbWJvIFRvb2xUaXAiKTsKLQkJb3ZlcnJpZGVDQ29tYm8uc2V0RGF0YSgibmFtZSIsICJDQ29tYm8iKTsKLQkJb3ZlcnJpZGVDQ29tYm8uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihvdmVycmlkZUFjY2Vzc2libGVBZGFwdGVyKTsKLQkJCQkKLS8vCQlDVGFiRm9sZGVyIGNUYWJGb2xkZXIsIG92ZXJyaWRlQ1RhYkZvbGRlcjsKLQkJY1RhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKGNUYWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgiQ1RhYkl0ZW0gJiIgKyBpKTsKLQkJCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlRhYkl0ZW0gVG9vbFRpcCIgKyBpKTsKLQkJCVRleHQgaXRlbVRleHQgPSBuZXcgVGV4dChjVGFiRm9sZGVyLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJCWl0ZW1UZXh0LnNldFRleHQoIlxuVGV4dCBmb3IgQ1RhYkl0ZW0gIiArIGkgKyAiXG5cblxuIik7Ci0JCQlpdGVtLnNldENvbnRyb2woaXRlbVRleHQpOwotCQl9Ci0JCWNUYWJGb2xkZXIuc2V0U2VsZWN0aW9uKGNUYWJGb2xkZXIuZ2V0SXRlbSgwKSk7Ci0JCQotCQlvdmVycmlkZUNUYWJGb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihzaGVsbCwgU1dULk5PTkUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbShvdmVycmlkZUNUYWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgiQ1RhYkl0ZW0gJiIgKyBpKTsKLQkJCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlRhYkl0ZW0gVG9vbFRpcCIgKyBpKTsKLQkJCVRleHQgaXRlbVRleHQgPSBuZXcgVGV4dChvdmVycmlkZUNUYWJGb2xkZXIsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQkJaXRlbVRleHQuc2V0VGV4dCgiXG5UZXh0IGZvciBDVGFiSXRlbSAiICsgaSArICJcblxuXG4iKTsKLQkJCWl0ZW0uc2V0Q29udHJvbChpdGVtVGV4dCk7Ci0JCX0KLQkJb3ZlcnJpZGVDVGFiRm9sZGVyLnNldFNlbGVjdGlvbihvdmVycmlkZUNUYWJGb2xkZXIuZ2V0SXRlbSgwKSk7Ci0JCW92ZXJyaWRlQ1RhYkZvbGRlci5zZXREYXRhKCJuYW1lIiwgIkNUYWJGb2xkZXIiKTsKLQkJb3ZlcnJpZGVDVGFiRm9sZGVyLnNldERhdGEoImNoaWxkIiwgIkNUYWJJdGVtIik7Ci0JCW92ZXJyaWRlQ1RhYkZvbGRlci5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG92ZXJyaWRlQWNjZXNzaWJsZUFkYXB0ZXIpOwotCi0vLwkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0LCBvdmVycmlkZVN0eWxlZFRleHQ7Ci0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlzdHlsZWRUZXh0LnNldFRleHQoIkNvbnRlbnRzIG9mIFN0eWxlZFRleHQiKTsKLQkJCi0JCW92ZXJyaWRlU3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCW92ZXJyaWRlU3R5bGVkVGV4dC5zZXRUZXh0KCJDb250ZW50cyBvZiBTdHlsZWRUZXh0Iik7Ci0JCW92ZXJyaWRlU3R5bGVkVGV4dC5zZXREYXRhKCJuYW1lIiwgIlN0eWxlZFRleHQiKTsKLQkJb3ZlcnJpZGVTdHlsZWRUZXh0LmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIob3ZlcnJpZGVBY2Nlc3NpYmxlQWRhcHRlcik7Ci0JCi0vLwkJU2NhbGUgc2NhbGUsIG92ZXJyaWRlU2NhbGU7Ci0JCXNjYWxlID0gbmV3IFNjYWxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXNjYWxlLnNldFRvb2xUaXBUZXh0KCJTY2FsZSBUb29sVGlwIik7Ci0KLQkJb3ZlcnJpZGVTY2FsZSA9IG5ldyBTY2FsZShzaGVsbCwgU1dULk5PTkUpOwotCQlvdmVycmlkZVNjYWxlLnNldFRvb2xUaXBUZXh0KCJTY2FsZSBUb29sVGlwIik7Ci0JCW92ZXJyaWRlU2NhbGUuc2V0RGF0YSgibmFtZSIsICJTY2FsZSIpOwotCQlvdmVycmlkZVNjYWxlLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIob3ZlcnJpZGVBY2Nlc3NpYmxlQWRhcHRlcik7Ci0KLS8vCQlTbGlkZXIgc2xpZGVyLCBvdmVycmlkZVNsaWRlcjsKLQkJc2xpZGVyID0gbmV3IFNsaWRlcihzaGVsbCwgU1dULk5PTkUpOwotCQlzbGlkZXIuc2V0VG9vbFRpcFRleHQoIlNsaWRlciBUb29sVGlwIik7Ci0KLQkJb3ZlcnJpZGVTbGlkZXIgPSBuZXcgU2xpZGVyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCW92ZXJyaWRlU2xpZGVyLnNldFRvb2xUaXBUZXh0KCJTbGlkZXIgVG9vbFRpcCIpOwotCQlvdmVycmlkZVNsaWRlci5zZXREYXRhKCJuYW1lIiwgIlNsaWRlciIpOwotCQlvdmVycmlkZVNsaWRlci5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG92ZXJyaWRlQWNjZXNzaWJsZUFkYXB0ZXIpOwotCi0vLwkJUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXIsIG92ZXJyaWRlUHJvZ3Jlc3NCYXI7Ci0JCXByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbig1MCk7Ci0JCXByb2dyZXNzQmFyLnNldFRvb2xUaXBUZXh0KCJQcm9ncmVzc0JhciBUb29sVGlwIik7Ci0KLQkJb3ZlcnJpZGVQcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihzaGVsbCwgU1dULk5PTkUpOwotCQlvdmVycmlkZVByb2dyZXNzQmFyLnNldFNlbGVjdGlvbig1MCk7Ci0JCW92ZXJyaWRlUHJvZ3Jlc3NCYXIuc2V0VG9vbFRpcFRleHQoIlByb2dyZXNzQmFyIFRvb2xUaXAiKTsKLQkJb3ZlcnJpZGVQcm9ncmVzc0Jhci5zZXREYXRhKCJuYW1lIiwgIlByb2dyZXNzQmFyIik7Ci0JCW92ZXJyaWRlUHJvZ3Jlc3NCYXIuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihvdmVycmlkZUFjY2Vzc2libGVBZGFwdGVyKTsKLQotLy8JCVNhc2ggc2FzaCwgb3ZlcnJpZGVTYXNoOwotCQlzYXNoID0gbmV3IFNhc2goc2hlbGwsIFNXVC5CT1JERVIpOwotCQlzYXNoLnNldFRvb2xUaXBUZXh0KCJTYXNoIFRvb2xUaXAiKTsKLQotCQlvdmVycmlkZVNhc2ggPSBuZXcgU2FzaChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCW92ZXJyaWRlU2FzaC5zZXRUb29sVGlwVGV4dCgiU2FzaCBUb29sVGlwIik7Ci0JCW92ZXJyaWRlU2FzaC5zZXREYXRhKCJuYW1lIiwgIlNhc2giKTsKLQkJb3ZlcnJpZGVTYXNoLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIob3ZlcnJpZGVBY2Nlc3NpYmxlQWRhcHRlcik7Ci0KLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlsYXJnZUltYWdlLmRpc3Bvc2UoKTsKLQkJc21hbGxJbWFnZS5kaXNwb3NlKCk7Ci0JCXRyYW5zcGFyZW50SW1hZ2UuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWNjZXNzaWJpbGl0eS9Db250cm9sc1dpdGhMYWJlbHNFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L0NvbnRyb2xzV2l0aExhYmVsc0V4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1MWRjMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L0NvbnRyb2xzV2l0aExhYmVsc0V4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFjY2Vzc2liaWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgQ29udHJvbHNXaXRoTGFiZWxzRXhhbXBsZSB7Ci0Jc3RhdGljIERpc3BsYXkgZGlzcGxheTsKLQlzdGF0aWMgU2hlbGwgc2hlbGw7Ci0Jc3RhdGljIExhYmVsIGxhYmVsOwotCXN0YXRpYyBCdXR0b24gYnV0dG9uUHVzaDsKLQlzdGF0aWMgQnV0dG9uIGJ1dHRvblJhZGlvOwotCXN0YXRpYyBCdXR0b24gYnV0dG9uQ2hlY2s7Ci0Jc3RhdGljIEJ1dHRvbiBidXR0b25Ub2dnbGU7Ci0Jc3RhdGljIENvbWJvIGNvbWJvOwotCXN0YXRpYyBDQ29tYm8gY0NvbWJvOwotCXN0YXRpYyBMaXN0IGxpc3Q7Ci0Jc3RhdGljIFNwaW5uZXIgc3Bpbm5lcjsKLQlzdGF0aWMgVGV4dCB0ZXh0U2luZ2xlOwotCXN0YXRpYyBUZXh0IHRleHRNdWx0aTsKLQlzdGF0aWMgU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCXN0YXRpYyBUYWJsZSB0YWJsZTsKLQlzdGF0aWMgVHJlZSB0cmVlOwotCXN0YXRpYyBUcmVlIHRyZWVUYWJsZTsKLQlzdGF0aWMgVG9vbEJhciB0b29sQmFyOwotCXN0YXRpYyBDb29sQmFyIGNvb2xCYXI7Ci0Jc3RhdGljIENhbnZhcyBjYW52YXM7Ci0Jc3RhdGljIEdyb3VwIGdyb3VwOwotCXN0YXRpYyBUYWJGb2xkZXIgdGFiRm9sZGVyOwotCXN0YXRpYyBDVGFiRm9sZGVyIGNUYWJGb2xkZXI7Ci0Jc3RhdGljIENMYWJlbCBjTGFiZWw7Ci0Jc3RhdGljIFNjYWxlIHNjYWxlOwotCXN0YXRpYyBTbGlkZXIgc2xpZGVyOwotCXN0YXRpYyBQcm9ncmVzc0JhciBwcm9ncmVzc0JhcjsKLQlzdGF0aWMgU2FzaCBzYXNoOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNjMSwgU1dULk5PTkUpOwotCQlzYzEuc2V0Q29udGVudChjb21wKTsKLQkJY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlzaGVsbC5zZXRUZXh0KCJBbGwgQ29udHJvbHMgVGVzdCIpOwotCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSkuc2V0VGV4dCgiTGFiZWwgZm9yIExhYmVsIik7Ci0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiTGFiZWwiKTsKLQotCQluZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGZvciBDTGFiZWwiKTsKLQkJY0xhYmVsID0gbmV3IENMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCWNMYWJlbC5zZXRUZXh0KCJDTGFiZWwiKTsKLQotCQluZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGZvciBQdXNoIEJ1dHRvbiIpOwotCQlidXR0b25QdXNoID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvblB1c2guc2V0VGV4dCgiUHVzaCBCdXR0b24iKTsKLQotCQluZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGZvciBSYWRpbyBCdXR0b24iKTsKLQkJYnV0dG9uUmFkaW8gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5SQURJTyk7Ci0JCWJ1dHRvblJhZGlvLnNldFRleHQoIlJhZGlvIEJ1dHRvbiIpOwotCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSkuc2V0VGV4dCgiTGFiZWwgZm9yIENoZWNrIEJ1dHRvbiIpOwotCQlidXR0b25DaGVjayA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uQ2hlY2suc2V0VGV4dCgiQ2hlY2sgQnV0dG9uIik7Ci0KLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KCJMYWJlbCBmb3IgVG9nZ2xlIEJ1dHRvbiIpOwotCQlidXR0b25Ub2dnbGUgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5UT0dHTEUpOwotCQlidXR0b25Ub2dnbGUuc2V0VGV4dCgiVG9nZ2xlIEJ1dHRvbiIpOwotCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSkuc2V0VGV4dCgiTGFiZWwgZm9yIEVkaXRhYmxlIENvbWJvIik7Ci0JCWNvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5CT1JERVIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJY29tYm8uYWRkKCJpdGVtIiArIGkpOwotCQl9Ci0JCWNvbWJvLnNldFRleHQoIkNvbWJvIik7Ci0KLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KCJMYWJlbCBmb3IgUmVhZC1Pbmx5IENvbWJvIik7Ci0JCWNvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCWNvbWJvLmFkZCgiaXRlbSIgKyBpKTsKLQkJfQotCQljb21iby5zZXRUZXh0KCJDb21ibyIpOwotCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSkuc2V0VGV4dCgiTGFiZWwgZm9yIENDb21ibyIpOwotCQljQ29tYm8gPSBuZXcgQ0NvbWJvKGNvbXAsIFNXVC5CT1JERVIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJY0NvbWJvLmFkZCgiaXRlbSIgKyBpKTsKLQkJfQotCQljQ29tYm8uc2V0VGV4dCgiQ0NvbWJvIik7Ci0KLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KCJMYWJlbCBmb3IgTGlzdCIpOwotCQlsaXN0ID0gbmV3IExpc3QoY29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlsaXN0LnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ikl0ZW0wIiwgIkl0ZW0xIiwgIkl0ZW0yIn0pOwotCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSkuc2V0VGV4dCgiTGFiZWwgZm9yIFNwaW5uZXIiKTsKLQkJc3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5OT05FKTsKLQotCQluZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGZvciBTaW5nbGUtbGluZSBUZXh0Iik7Ci0JCXRleHRTaW5nbGUgPSBuZXcgVGV4dChjb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXRleHRTaW5nbGUuc2V0VGV4dCgiQ29udGVudHMgb2YgU2luZ2xlLWxpbmUgVGV4dCIpOwotCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSkuc2V0VGV4dCgiTGFiZWwgZm9yIE11bHRpLWxpbmUgVGV4dCIpOwotCQl0ZXh0TXVsdGkgPSBuZXcgVGV4dChjb21wLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJdGV4dE11bHRpLnNldFRleHQoIlxuQ29udGVudHMgb2YgTXVsdGktbGluZSBUZXh0XG4iKTsKLQotCQluZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGZvciBTdHlsZWRUZXh0Iik7Ci0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChjb21wLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVkVGV4dC5zZXRUZXh0KCJcbkNvbnRlbnRzIG9mIE11bHRpLWxpbmUgU3R5bGVkVGV4dFxuIik7Ci0KLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KCJMYWJlbCBmb3IgVGFibGUiKTsKLQkJdGFibGUgPSBuZXcgVGFibGUoY29tcCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJZm9yIChpbnQgY29sID0gMDsgY29sIDwgMzsgY29sKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQkJY29sdW1uLnNldFRleHQoIkNvbCAiICsgY29sKTsKLQkJCWNvbHVtbi5zZXRXaWR0aCg1MCk7Ci0JCX0KLQkJZm9yIChpbnQgcm93ID0gMDsgcm93IDwgMzsgcm93KyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJDMFIiICsgcm93LCAiQzFSIiArIHJvdywgIkMyUiIgKyByb3d9KTsKLQkJfQotCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSkuc2V0VGV4dCgiTGFiZWwgZm9yIFRyZWUiKTsKLQkJdHJlZSA9IG5ldyBUcmVlKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQoIkl0ZW0iICsgaSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgewotCQkJCW5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSkuc2V0VGV4dCgiSXRlbSIgKyBpICsgaik7Ci0JCQl9Ci0JCX0KLQotCQluZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGZvciBUcmVlIHdpdGggY29sdW1ucyIpOwotCQl0cmVlVGFibGUgPSBuZXcgVHJlZShjb21wLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJdHJlZVRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRyZWVUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7Ci0JCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWVUYWJsZSwgU1dULk5PTkUpOwotCQkJY29sdW1uLnNldFRleHQoIkNvbCAiICsgY29sKTsKLQkJCWNvbHVtbi5zZXRXaWR0aCg1MCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZVRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQobmV3IFN0cmluZyBbXSB7IkkiICsgaSArICJDMCIsICJJIiArIGkgKyAiQzEiLCAiSSIgKyBpICsgIkMyIn0pOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCQluZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpLnNldFRleHQobmV3IFN0cmluZyBbXSB7IkkiICsgaSArIGogKyAiQzAiLCAiSSIgKyBpICsgaiArICJDMSIsICJJIiArIGkgKyBqICsgIkMyIn0pOwotCQkJfQotCQl9Ci0KLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KCJMYWJlbCBmb3IgVG9vbEJhciIpOwotCQl0b29sQmFyID0gbmV3IFRvb2xCYXIoY29tcCwgU1dULkZMQVQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQoIkl0ZW0iICsgaSk7Ci0JCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJUb29sSXRlbSBUb29sVGlwIiArIGkpOwotCQl9Ci0KLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KCJMYWJlbCBmb3IgQ29vbEJhciIpOwotCQljb29sQmFyID0gbmV3IENvb2xCYXIoY29tcCwgU1dULkZMQVQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULlBVU0gpOwotCQkJVG9vbEJhciBjb29sSXRlbVRvb2xCYXIgPSBuZXcgVG9vbEJhcihjb29sQmFyLCBTV1QuRkxBVCk7Ci0JCQlpbnQgdG9vbEl0ZW1XaWR0aCA9IDA7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykgewotCQkJCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0oY29vbEl0ZW1Ub29sQmFyLCBTV1QuUFVTSCk7Ci0JCQkJaXRlbS5zZXRUZXh0KCJJdGVtIiArIGkgKyBqKTsKLQkJCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJUb29sSXRlbSBUb29sVGlwIiArIGkgKyBqKTsKLQkJCQlpZiAoaXRlbS5nZXRXaWR0aCgpID4gdG9vbEl0ZW1XaWR0aCkgdG9vbEl0ZW1XaWR0aCA9IGl0ZW0uZ2V0V2lkdGgoKTsKLQkJCX0KLQkJCWNvb2xJdGVtLnNldENvbnRyb2woY29vbEl0ZW1Ub29sQmFyKTsKLQkJCVBvaW50IHNpemUgPSBjb29sSXRlbVRvb2xCYXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCVBvaW50IGNvb2xTaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KTsKLQkJCWNvb2xJdGVtLnNldE1pbmltdW1TaXplKHRvb2xJdGVtV2lkdGgsIGNvb2xTaXplLnkpOwotCQkJY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShjb29sU2l6ZSk7Ci0JCQljb29sSXRlbS5zZXRTaXplKGNvb2xTaXplKTsKLQkJfQotCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSkuc2V0VGV4dCgiTGFiZWwgZm9yIENhbnZhcyIpOwotCQljYW52YXMgPSBuZXcgQ2FudmFzKGNvbXAsIFNXVC5CT1JERVIpOwotCQljYW52YXMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoNjQsIDY0KSk7Ci0JCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCWUuZ2MuZHJhd1N0cmluZygiQ2FudmFzIiwgMTUsIDI1KTsKLQkJCX0KLQkJfSk7Ci0JCWNhbnZhcy5zZXRDYXJldCAobmV3IENhcmV0KGNhbnZhcywgU1dULk5PTkUpKTsKLQkJLyogSG9vayBrZXkgbGlzdGVuZXIgc28gY2FudmFzIHdpbGwgdGFrZSBmb2N1cyBkdXJpbmcgdHJhdmVyc2FsIGluLiAqLwotCQljYW52YXMuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCS8qIEhvb2sgdHJhdmVyc2UgbGlzdGVuZXIgdG8gbWFrZSBjYW52YXMgZ2l2ZSB1cCBmb2N1cyBkdXJpbmcgdHJhdmVyc2FsIG91dC4gKi8KLQkJY2FudmFzLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KCJMYWJlbCBmb3IgR3JvdXAiKTsKLQkJZ3JvdXAgPSBuZXcgR3JvdXAoY29tcCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KCJHcm91cCIpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCW5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUikuc2V0VGV4dCgiVGV4dCBpbiBHcm91cCIpOwotCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSkuc2V0VGV4dCgiTGFiZWwgZm9yIFRhYkZvbGRlciIpOwotCQl0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyKGNvbXAsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KCJUYWJJdGVtICYiICsgaSk7Ci0JCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJUYWJJdGVtIFRvb2xUaXAiICsgaSk7Ci0JCQlUZXh0IGl0ZW1UZXh0ID0gbmV3IFRleHQodGFiRm9sZGVyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlpdGVtVGV4dC5zZXRUZXh0KCJUZXh0IGZvciBUYWJJdGVtICIgKyBpKTsKLQkJCWl0ZW0uc2V0Q29udHJvbChpdGVtVGV4dCk7Ci0JCX0KLQotCQluZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGZvciBDVGFiRm9sZGVyIik7Ci0JCWNUYWJGb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihjb21wLCBTV1QuQk9SREVSKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCUNUYWJJdGVtIGl0ZW0gPSBuZXcgQ1RhYkl0ZW0oY1RhYkZvbGRlciwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KCJDVGFiSXRlbSAmIiArIGkpOwotCQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiQ1RhYkl0ZW0gVG9vbFRpcCIgKyBpKTsKLQkJCVRleHQgaXRlbVRleHQgPSBuZXcgVGV4dChjVGFiRm9sZGVyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlpdGVtVGV4dC5zZXRUZXh0KCJUZXh0IGZvciBDVGFiSXRlbSAiICsgaSk7Ci0JCQlpdGVtLnNldENvbnRyb2woaXRlbVRleHQpOwotCQl9Ci0JCWNUYWJGb2xkZXIuc2V0U2VsZWN0aW9uKGNUYWJGb2xkZXIuZ2V0SXRlbSgwKSk7Ci0KLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KCJMYWJlbCBmb3IgU2NhbGUiKTsKLQkJc2NhbGUgPSBuZXcgU2NhbGUoY29tcCwgU1dULk5PTkUpOwotCi0JCW5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSkuc2V0VGV4dCgiTGFiZWwgZm9yIFNsaWRlciIpOwotCQlzbGlkZXIgPSBuZXcgU2xpZGVyKGNvbXAsIFNXVC5OT05FKTsKLQotCQluZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGZvciBQcm9ncmVzc0JhciIpOwotCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0Jhcihjb21wLCBTV1QuTk9ORSk7Ci0JCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbig1MCk7Ci0KLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKS5zZXRUZXh0KCJMYWJlbCBmb3IgU2FzaCIpOwotCQlzYXNoID0gbmV3IFNhc2goY29tcCwgU1dULk5PTkUpOwotCi0JCWNvbXAuc2V0U2l6ZShjb21wLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L1NoYXBlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L1NoYXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZTA2M2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWNjZXNzaWJpbGl0eS9TaGFwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWNjZXNzaWJpbGl0eTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGFuIGFjY2Vzc2libGUsIGZvY3VzYWJsZSwgdXNlciBpbnRlcmZhY2Ugb2JqZWN0Ci0gKiB0aGF0IGhhcyBhIHNoYXBlIGFuZCBhIGNvbG9yLiBGcm9tIGFuIGFjY2Vzc2liaWxpdHkgcG9pbnQgb2YgdmlldywgdGhleSBpbWl0YXRlIGEKLSAqICJsYWJlbCIgb3IgInN0YXRpYyB0ZXh0IiB3aG9zZSBuYW1lIGlzIGl0cyBjb2xvciBhbmQgc2hhcGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaGFwZSBleHRlbmRzIENhbnZhcyB7Ci0Jc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfYWNjZXNzaWJpbGl0eSIpOwotCWludCBjb2xvciA9IFNXVC5DT0xPUl9CTFVFOwotCVN0cmluZyBzaGFwZSA9ICJzcXVhcmUiOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBnaXZlbiBpdHMgcGFyZW50Ci0JICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IGEgY29tcG9zaXRlIGNvbnRyb2wgd2hpY2ggd2lsbCBiZSB0aGUgcGFyZW50IG9mIHRoZSBuZXcgaW5zdGFuY2UgKGNhbm5vdCBiZSBudWxsKQotCSAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgb2YgY29udHJvbCB0byBjb25zdHJ1Y3QKLQkgKi8KLQlwdWJsaWMgU2hhcGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQl2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQlHQyBnYyA9IGUuZ2M7Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQkJCUNvbG9yIGMgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKGNvbG9yKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGMpOwotCQkJCVJlY3RhbmdsZSByZWN0ID0gZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWludCBsZW5ndGggPSBNYXRoLm1pbihyZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQkJaWYgKHNoYXBlLmVxdWFscyhidW5kbGUuZ2V0U3RyaW5nKCJjaXJjbGUiKSkpIHsKLQkJCQkJZ2MuZmlsbE92YWwoMCwgMCwgbGVuZ3RoLCBsZW5ndGgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgbGVuZ3RoLCBsZW5ndGgpOwotCQkJCX0KLQkJCQlpZiAoaXNGb2N1c0NvbnRyb2woKSkgZ2MuZHJhd0ZvY3VzKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJcmVkcmF3KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJcmVkcmF3KCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmIChnZXRDbGllbnRBcmVhKCkuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJCXNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJLy8ga2V5IGxpc3RlbmVyIGVuYWJsZXMgdHJhdmVyc2FsIG91dAotCQkJfQotCQl9KTsKLQkJCi0JCWFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9UQUJfTkVYVDoKLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTOgotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJTWVzc2FnZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgTWVzc2FnZUZvcm1hdCgiIik7Ci0JCQkJZm9ybWF0dGVyLmFwcGx5UGF0dGVybihidW5kbGUuZ2V0U3RyaW5nKCJuYW1lIikpOwkKLQkJCQlTdHJpbmcgY29sb3JOYW1lID0gYnVuZGxlLmdldFN0cmluZygiY29sb3IiICsgY29sb3IpOwotCQkJCWUucmVzdWx0ID0gZm9ybWF0dGVyLmZvcm1hdChuZXcgU3RyaW5nIFtdIHtjb2xvck5hbWUsIHNoYXBlfSk7IC8vJE5PTl9OTFMkCi0JCQl9Ci0JCX0pOwotCQkKLQkJZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldFJvbGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJZS5kZXRhaWwgPSBBQ0MuUk9MRV9MQUJFTDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGdldFN0YXRlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJCWUuZGV0YWlsID0gQUNDLlNUQVRFX0ZPQ1VTQUJMRTsKLQkJCQlpZiAoaXNGb2N1c0NvbnRyb2woKSkgZS5kZXRhaWwgfD0gQUNDLlNUQVRFX0ZPQ1VTRUQ7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlY2VpdmVyJ3MgY29sb3IuCi0JICogVGhlIGRlZmF1bHQgY29sb3IgaXMgU1dULkNPTE9SX0JMVUUuCi0JICogCi0JICogQHJldHVybiB0aGUgY29sb3IsIHdoaWNoIG1heSBiZSBhbnkgb2YgdGhlIFNXVC5DT0xPUl8gY29uc3RhbnRzCi0JICovCi0JcHVibGljIGludCBnZXRDb2xvciAoKSB7Ci0JCXJldHVybiB0aGlzLmNvbG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVjZWl2ZXIncyBzaGFwZS4KLQkgKiBUaGUgZGVmYXVsdCBzaGFwZSBpcyAic3F1YXJlIi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGFwZSBuYW1lIHN0cmluZywgd2hpY2ggbWF5IGJlIGVpdGhlciAiY2lyY2xlIiBvciAic3F1YXJlIgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGUgKCkgewotCQlyZXR1cm4gdGhpcy5zaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJlY2VpdmVyJ3MgY29sb3IgdG8gdGhlIHNwZWNpZmllZCBjb2xvci4KLQkgKiBUaGUgZGVmYXVsdCBjb2xvciBpcyBTV1QuQ09MT1JfQkxVRS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgYW55IG9mIHRoZSBTV1QuQ09MT1JfIGNvbnN0YW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbG9yIChpbnQgY29sb3IpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVjZWl2ZXIncyBzaGFwZSB0byB0aGUgc3BlY2lmaWVkIHNoYXBlIG5hbWUgc3RyaW5nLgotCSAqIFRoZSBkZWZhdWx0IHNoYXBlIGlzICJzcXVhcmUiLgotCSAqIAotCSAqIEBwYXJhbSBzaGFwZSBhIHN0cmluZyB0aGF0IGNhbiBiZSBlaXRoZXIgImNpcmNsZSIgb3IgInNxdWFyZSIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaGFwZSAoU3RyaW5nIHNoYXBlKSB7Ci0JCXRoaXMuc2hhcGUgPSBzaGFwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L1NpbXBsZUJ1dHRvbk5hbWVFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L1NpbXBsZUJ1dHRvbk5hbWVFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlN2RiMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWNjZXNzaWJpbGl0eS9TaW1wbGVCdXR0b25OYW1lRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hY2Nlc3NpYmlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLQotLyoqCi0gKiBUaGlzIGV4YW1wbGUgc2hvd3MgYSB2ZXJ5IGNvbW1vbiwgc2ltcGxlIHVzZSBvZiB0aGUgU1dUIEFjY2Vzc2liaWxpdHkgQVBJOgotICogZ2l2aW5nIGFuIGFjY2Vzc2libGUgbmFtZSB0byBhIGJ1dHRvbiB0aGF0IGhhcyBvbmx5IGFuIGltYWdlIChhbmQgbm8gdGV4dCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVCdXR0b25OYW1lRXhhbXBsZSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiQnV0dG9uIik7IC8vIHRoZSBmaXJzdCBidXR0b24ncyBhY2Nlc3NpYmxlIG5hbWUgaXMgIkJ1dHRvbiIKLQkJCi0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIFNpbXBsZUJ1dHRvbk5hbWVFeGFtcGxlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oInJ1bi5naWYiKSk7Ci0JCWJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQkJYnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCWUucmVzdWx0ID0gIlJ1bm5pbmcgbWFuIjsgLy8gdGhlIHNlY29uZCBidXR0b24ncyBhY2Nlc3NpYmxlIG5hbWUgaXMgIlJ1bm5pbmcgbWFuIgotCQkJfQotCQl9KTsKLQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FjY2Vzc2liaWxpdHkvcnVuLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FjY2Vzc2liaWxpdHkvcnVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0YTIzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L3J1bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L3J1bl93aXouZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWNjZXNzaWJpbGl0eS9ydW5fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YTAyZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hY2Nlc3NpYmlsaXR5L3J1bl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2suamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxNmNkZmUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFkZHJlc3Nib29rOwotCi0KLS8qIEltcG9ydHMgKi8KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQWRkcmVzc0Jvb2tFeGFtcGxlIGlzIGFuIGV4YW1wbGUgdGhhdCB1c2VzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dDwvY29kZT4gCi0gKiBsaWJyYXJpZXMgdG8gaW1wbGVtZW50IGEgc2ltcGxlIGFkZHJlc3MgYm9vay4gIFRoaXMgYXBwbGljYXRpb24gaGFzIAotICogc2F2ZSwgbG9hZCwgc29ydGluZywgYW5kIHNlYXJjaGluZyBmdW5jdGlvbnMgY29tbW9uCi0gKiB0byBiYXNpYyBhZGRyZXNzIGJvb2tzLgotICovCi1wdWJsaWMgY2xhc3MgQWRkcmVzc0Jvb2sgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzQWRkcmVzc0Jvb2sgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2FkZHJlc3Nib29rIik7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQkKLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCXByaXZhdGUgU2VhcmNoRGlhbG9nIHNlYXJjaERpYWxvZzsKLQkKLQlwcml2YXRlIEZpbGUgZmlsZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNNb2RpZmllZDsKLQkKLQlwcml2YXRlIFN0cmluZ1tdIGNvcHlCdWZmZXI7Ci0KLQlwcml2YXRlIGludCBsYXN0U29ydENvbHVtbj0gLTE7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNSVRFUiA9ICJcdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gY29sdW1uTmFtZXMgPSB7cmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJMYXN0X25hbWUiKSwKLQkJCQkJCQkJCQkJCSByZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpcnN0X25hbWUiKSwKLQkJCQkJCQkJCQkJCSByZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkJ1c2luZXNzX3Bob25lIiksCi0JCQkJCQkJCQkJCQkgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJIb21lX3Bob25lIiksCi0JCQkJCQkJCQkJCQkgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJFbWFpbCIpLAotCQkJCQkJCQkJCQkJIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmF4Iil9OwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JQWRkcmVzc0Jvb2sgYXBwbGljYXRpb24gPSBuZXcgQWRkcmVzc0Jvb2soKTsKLQlTaGVsbCBzaGVsbCA9IGFwcGxpY2F0aW9uLm9wZW4oZGlzcGxheSk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSl7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXB1YmxpYyBTaGVsbCBvcGVuKERpc3BsYXkgZGlzcGxheSkgewotCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQkJZS5kb2l0ID0gY2xvc2VBZGRyZXNzQm9vaygpOwotCQl9Ci0JfSk7Ci0JCi0JY3JlYXRlTWVudUJhcigpOwotCi0Jc2VhcmNoRGlhbG9nID0gbmV3IFNlYXJjaERpYWxvZyhzaGVsbCk7Ci0Jc2VhcmNoRGlhbG9nLnNldFNlYXJjaEFyZWFOYW1lcyhjb2x1bW5OYW1lcyk7Ci0Jc2VhcmNoRGlhbG9nLnNldFNlYXJjaEFyZWFMYWJlbChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkNvbHVtbiIpKTsKLQlzZWFyY2hEaWFsb2cuYWRkRmluZExpc3RlbmVyKG5ldyBGaW5kTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgYm9vbGVhbiBmaW5kKCkgewotCQkJcmV0dXJuIGZpbmRFbnRyeSgpOwotCQl9Ci0JfSk7Ci0JCQkJCQotCXRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsJCi0JdGFibGUuc2V0TWVudShjcmVhdGVQb3BVcE1lbnUoKSk7CQotCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPiAwKSBlZGl0RW50cnkoaXRlbXNbMF0pOwotCQl9Ci0JfSk7Ci0JZm9yKGludCBpID0gMDsgaSA8IGNvbHVtbk5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dChjb2x1bW5OYW1lc1tpXSk7Ci0JCWNvbHVtbi5zZXRXaWR0aCgxNTApOwotCQlmaW5hbCBpbnQgY29sdW1uSW5kZXggPSBpOwotCQljb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzb3J0KGNvbHVtbkluZGV4KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JbmV3QWRkcmVzc0Jvb2soKTsKLQotCXNoZWxsLnNldFNpemUodGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54LCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci0KLXByaXZhdGUgYm9vbGVhbiBjbG9zZUFkZHJlc3NCb29rKCkgewotCWlmKGlzTW9kaWZpZWQpIHsKLQkJLy9hc2sgdXNlciBpZiB0aGV5IHdhbnQgdG8gc2F2ZSBjdXJyZW50IGFkZHJlc3MgYm9vawotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCQlib3guc2V0VGV4dChzaGVsbC5nZXRUZXh0KCkpOwotCQlib3guc2V0TWVzc2FnZShyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkNsb3NlX3NhdmUiKSk7Ci0JCi0JCWludCBjaG9pY2UgPSBib3gub3BlbigpOwotCQlpZihjaG9pY2UgPT0gU1dULkNBTkNFTCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYoY2hvaWNlID09IFNXVC5ZRVMpIHsKLQkJCWlmICghc2F2ZSgpKSByZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCQotCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArKykgewotCQlpdGVtc1tpXS5kaXNwb3NlKCk7Ci0JfQotCQotCXJldHVybiB0cnVlOwotfQotLyoqCi0gKiBDcmVhdGVzIHRoZSBtZW51IGF0IHRoZSB0b3Agb2YgdGhlIHNoZWxsIHdoZXJlIG1vc3QKLSAqIG9mIHRoZSBwcm9ncmFtcyBmdW5jdGlvbmFsaXR5IGlzIGFjY2Vzc2VkLgotICoKLSAqIEByZXR1cm4JCVRoZSA8Y29kZT5NZW51PC9jb2RlPiB3aWRnZXQgdGhhdCB3YXMgY3JlYXRlZAotICovCi1wcml2YXRlIE1lbnUgY3JlYXRlTWVudUJhcigpIHsKLQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkKLQkvL2NyZWF0ZSBlYWNoIGhlYWRlciBhbmQgc3ViTWVudSBmb3IgdGhlIG1lbnVCYXIKLQljcmVhdGVGaWxlTWVudShtZW51QmFyKTsKLQljcmVhdGVFZGl0TWVudShtZW51QmFyKTsKLQljcmVhdGVTZWFyY2hNZW51KG1lbnVCYXIpOwotCWNyZWF0ZUhlbHBNZW51KG1lbnVCYXIpOwotCQotCXJldHVybiBtZW51QmFyOwotfQotCi0vKioKLSAqIENvbnZlcnRzIGFuIGVuY29kZWQgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBhIFN0cmluZyBhcnJheSByZXByZXNlbnRpbmcgYSB0YWJsZSBlbnRyeS4KLSAqLwotcHJpdmF0ZSBTdHJpbmdbXSBkZWNvZGVMaW5lKFN0cmluZyBsaW5lKSB7Ci0JaWYobGluZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkKLQlTdHJpbmdbXSBwYXJzZWRMaW5lID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgcGFyc2VkTGluZS5sZW5ndGggLSAxOyBpKyspIHsKLQkJaW50IGluZGV4ID0gbGluZS5pbmRleE9mKERFTElNSVRFUik7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlwYXJzZWRMaW5lW2ldID0gbGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJbGluZSA9IGxpbmUuc3Vic3RyaW5nKGluZGV4ICsgREVMSU1JVEVSLmxlbmd0aCgpLCBsaW5lLmxlbmd0aCgpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCWlmIChsaW5lLmluZGV4T2YoREVMSU1JVEVSKSAhPSAtMSkgcmV0dXJuIG51bGw7Ci0JCi0JcGFyc2VkTGluZVtwYXJzZWRMaW5lLmxlbmd0aCAtIDFdID0gbGluZTsKLQotCXJldHVybiBwYXJzZWRMaW5lOwotfQotcHJpdmF0ZSB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgbXNnKSB7Ci0JTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCWJveC5zZXRNZXNzYWdlKG1zZyk7Ci0JYm94Lm9wZW4oKTsKLX0KLXByaXZhdGUgdm9pZCBlZGl0RW50cnkoVGFibGVJdGVtIGl0ZW0pIHsKLQlEYXRhRW50cnlEaWFsb2cgZGlhbG9nID0gbmV3IERhdGFFbnRyeURpYWxvZyhzaGVsbCk7Ci0JZGlhbG9nLnNldExhYmVscyhjb2x1bW5OYW1lcyk7Ci0JU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQl2YWx1ZXNbaV0gPSBpdGVtLmdldFRleHQoaSk7Ci0JfQotCWRpYWxvZy5zZXRWYWx1ZXModmFsdWVzKTsKLQl2YWx1ZXMgPSBkaWFsb2cub3BlbigpOwotCWlmICh2YWx1ZXMgIT0gbnVsbCkgewotCQlpdGVtLnNldFRleHQodmFsdWVzKTsKLQkJaXNNb2RpZmllZCA9IHRydWU7Ci0JfQotfQotcHJpdmF0ZSBTdHJpbmcgZW5jb2RlTGluZShTdHJpbmdbXSB0YWJsZUl0ZW1zKSB7Ci0JU3RyaW5nIGxpbmUgPSAiIjsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCWxpbmUgKz0gdGFibGVJdGVtc1tpXSArIERFTElNSVRFUjsKLQl9Ci0JbGluZSArPSB0YWJsZUl0ZW1zW3RhYmxlSXRlbXMubGVuZ3RoIC0gMV0gKyAiXG4iOwotCQotCXJldHVybiBsaW5lOwotfQotcHJpdmF0ZSBib29sZWFuIGZpbmRFbnRyeSgpIHsKLQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3Ioc2hlbGwuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX1dBSVQpOwotCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkKLQlib29sZWFuIG1hdGNoQ2FzZSA9IHNlYXJjaERpYWxvZy5nZXRNYXRjaENhc2UoKTsKLQlib29sZWFuIG1hdGNoV29yZCA9IHNlYXJjaERpYWxvZy5nZXRNYXRjaFdvcmQoKTsKLQlTdHJpbmcgc2VhcmNoU3RyaW5nID0gc2VhcmNoRGlhbG9nLmdldFNlYXJjaFN0cmluZygpOwotCWludCBjb2x1bW4gPSBzZWFyY2hEaWFsb2cuZ2V0U2VsZWN0ZWRTZWFyY2hBcmVhKCk7Ci0JCi0Jc2VhcmNoU3RyaW5nID0gbWF0Y2hDYXNlID8gc2VhcmNoU3RyaW5nIDogc2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCi0JYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCWlmIChzZWFyY2hEaWFsb2cuZ2V0U2VhcmNoRG93bigpKSB7Ci0JCWZvcihpbnQgaSA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgKyAxOyBpIDwgdGFibGUuZ2V0SXRlbUNvdW50KCk7IGkrKykgewotCQkJaWYgKGZvdW5kID0gZmluZE1hdGNoKHNlYXJjaFN0cmluZywgdGFibGUuZ2V0SXRlbShpKSwgY29sdW1uLCBtYXRjaFdvcmQsIG1hdGNoQ2FzZSkpewotCQkJCXRhYmxlLnNldFNlbGVjdGlvbihpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWZvcihpbnQgaSA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJaWYgKGZvdW5kID0gZmluZE1hdGNoKHNlYXJjaFN0cmluZywgdGFibGUuZ2V0SXRlbShpKSwgY29sdW1uLCBtYXRjaFdvcmQsIG1hdGNoQ2FzZSkpewotCQkJCXRhYmxlLnNldFNlbGVjdGlvbihpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkKLQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0Jd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCQotCXJldHVybiBmb3VuZDsKLX0KLXByaXZhdGUgYm9vbGVhbiBmaW5kTWF0Y2goU3RyaW5nIHNlYXJjaFN0cmluZywgVGFibGVJdGVtIGl0ZW0sIGludCBjb2x1bW4sIGJvb2xlYW4gbWF0Y2hXb3JkLCBib29sZWFuIG1hdGNoQ2FzZSkgewotCQotCVN0cmluZyB0YWJsZVRleHQgPSBtYXRjaENhc2UgPyBpdGVtLmdldFRleHQoY29sdW1uKSA6IGl0ZW0uZ2V0VGV4dChjb2x1bW4pLnRvTG93ZXJDYXNlKCk7Ci0JaWYgKG1hdGNoV29yZCkgewotCQlpZiAodGFibGVUZXh0ICE9IG51bGwgJiYgdGFibGVUZXh0LmVxdWFscyhzZWFyY2hTdHJpbmcpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQl9IGVsc2UgewotCQlpZih0YWJsZVRleHQhPSBudWxsICYmIHRhYmxlVGV4dC5pbmRleE9mKHNlYXJjaFN0cmluZykgIT0gLTEpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLXByaXZhdGUgdm9pZCBuZXdBZGRyZXNzQm9vaygpIHsJCi0Jc2hlbGwuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlRpdGxlX2JhciIpICsgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJOZXdfdGl0bGUiKSk7Ci0JZmlsZSA9IG51bGw7Ci0JaXNNb2RpZmllZCA9IGZhbHNlOwotfQotcHJpdmF0ZSB2b2lkIG5ld0VudHJ5KCkgewotCURhdGFFbnRyeURpYWxvZyBkaWFsb2cgPSBuZXcgRGF0YUVudHJ5RGlhbG9nKHNoZWxsKTsKLQlkaWFsb2cuc2V0TGFiZWxzKGNvbHVtbk5hbWVzKTsKLQlTdHJpbmdbXSBkYXRhID0gZGlhbG9nLm9wZW4oKTsKLQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoZGF0YSk7Ci0JCWlzTW9kaWZpZWQgPSB0cnVlOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIG9wZW5BZGRyZXNzQm9vaygpIHsJCi0JRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQotCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmFkcjsiLCAiKi4qIn0pOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHtyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkJvb2tfZmlsdGVyX25hbWUiKSArICIgKCouYWRyKSIsIAotCQkJCQkJCQkJCQlyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkFsbF9maWx0ZXJfbmFtZSIpICsgIiAoKi4qKSJ9KTsKLQlTdHJpbmcgbmFtZSA9IGZpbGVEaWFsb2cub3BlbigpOwotCi0JaWYobmFtZSA9PSBudWxsKSByZXR1cm47Ci0JRmlsZSBmaWxlID0gbmV3IEZpbGUobmFtZSk7Ci0JaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCWRpc3BsYXlFcnJvcihyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpbGUiKStmaWxlLmdldE5hbWUoKSsiICIrcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEb2VzX25vdF9leGlzdCIpKTsgCi0JCXJldHVybjsKLQl9Ci0JCi0JQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKHNoZWxsLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKTsKLQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCi0JRmlsZVJlYWRlciBmaWxlUmVhZGVyID0gbnVsbDsKLQlCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG51bGw7Ci0JU3RyaW5nW10gZGF0YSA9IG5ldyBTdHJpbmdbMF07Ci0JdHJ5IHsKLQkJZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmaWxlUmVhZGVyKTsKLQkJU3RyaW5nIG5leHRMaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJd2hpbGUgKG5leHRMaW5lICE9IG51bGwpewotCQkJU3RyaW5nW10gbmV3RGF0YSA9IG5ldyBTdHJpbmdbZGF0YS5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgbmV3RGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCQkJbmV3RGF0YVtkYXRhLmxlbmd0aF0gPSBuZXh0TGluZTsKLQkJCWRhdGEgPSBuZXdEYXRhOwotCQkJbmV4dExpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotCQl9Ci0JfSBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlX25vdF9mb3VuZCIpICsgIlxuIiArIGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUgKSB7Ci0JCWRpc3BsYXlFcnJvcihyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIklPX2Vycm9yX3JlYWQiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCXJldHVybjsKLQl9IGZpbmFsbHkgewkKLQkJCi0JCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCi0JCWlmKGZpbGVSZWFkZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmaWxlUmVhZGVyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJJT19lcnJvcl9jbG9zZSIpICsgIlxuIiArIGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JU3RyaW5nW11bXSB0YWJsZUluZm8gPSBuZXcgU3RyaW5nW2RhdGEubGVuZ3RoXVt0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQlpbnQgd3JpdGVJbmRleCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZ1tdIGxpbmUgPSBkZWNvZGVMaW5lKGRhdGFbaV0pOwotCQlpZiAobGluZSAhPSBudWxsKSB0YWJsZUluZm9bd3JpdGVJbmRleCsrXSA9IGxpbmU7Ci0JfQotCWlmICh3cml0ZUluZGV4ICE9IGRhdGEubGVuZ3RoKSB7Ci0JCVN0cmluZ1tdW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t3cml0ZUluZGV4XVt0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJU3lzdGVtLmFycmF5Y29weSh0YWJsZUluZm8sIDAsIHJlc3VsdCwgMCwgd3JpdGVJbmRleCk7Ci0JCXRhYmxlSW5mbyA9IHJlc3VsdDsKLQl9Ci0JQXJyYXlzLnNvcnQodGFibGVJbmZvLCBuZXcgUm93Q29tcGFyYXRvcigwKSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSW5mby5sZW5ndGg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KHRhYmxlSW5mb1tpXSk7Ci0JfQotCXNoZWxsLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJUaXRsZV9iYXIiKStmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCkpOwotCWlzTW9kaWZpZWQgPSBmYWxzZTsKLQl0aGlzLmZpbGUgPSBmaWxlOwotfQotcHJpdmF0ZSBib29sZWFuIHNhdmUoKSB7Ci0JaWYoZmlsZSA9PSBudWxsKSByZXR1cm4gc2F2ZUFzKCk7Ci0JCi0JQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKHNoZWxsLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKTsKLQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCi0JVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCVN0cmluZ1tdIGxpbmVzID0gbmV3IFN0cmluZ1tpdGVtcy5sZW5ndGhdOwotCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmdbXSBpdGVtVGV4dCA9IG5ldyBTdHJpbmdbdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgaXRlbVRleHQubGVuZ3RoOyBqKyspIHsKLQkJCWl0ZW1UZXh0W2pdID0gaXRlbXNbaV0uZ2V0VGV4dChqKTsKLQkJfQotCQlsaW5lc1tpXSA9IGVuY29kZUxpbmUoaXRlbVRleHQpOwotCX0KLQkJCi0JRmlsZVdyaXRlciBmaWxlV3JpdGVyID0gbnVsbDsKLQl0cnkgeyAKLQkJZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGZhbHNlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewotCQkJZmlsZVdyaXRlci53cml0ZShsaW5lc1tpXSk7Ci0JCX0KLQl9IGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCWRpc3BsYXlFcnJvcihyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpbGVfbm90X2ZvdW5kIikgKyAiXG4iICsgZmlsZS5nZXROYW1lKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfSBjYXRjaChJT0V4Y2VwdGlvbiBlICkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJJT19lcnJvcl93cml0ZSIpICsgIlxuIiArIGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gZmluYWxseSB7Ci0JCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCQotCQlpZihmaWxlV3JpdGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZVdyaXRlci5jbG9zZSgpOwotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZGlzcGxheUVycm9yKHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSU9fZXJyb3JfY2xvc2UiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0Jc2hlbGwuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlRpdGxlX2JhciIpK2ZpbGUuZ2V0TmFtZSgpKTsKLQlpc01vZGlmaWVkID0gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci1wcml2YXRlIGJvb2xlYW4gc2F2ZUFzKCkgewotCQkKLQlGaWxlRGlhbG9nIHNhdmVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULlNBVkUpOwotCXNhdmVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmFkcjsiLCAgIiouKiJ9KTsKLQlzYXZlRGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7IkFkZHJlc3MgQm9va3MgKCouYWRyKSIsICJBbGwgRmlsZXMgIn0pOwotCQotCXNhdmVEaWFsb2cub3BlbigpOwotCVN0cmluZyBuYW1lID0gc2F2ZURpYWxvZy5nZXRGaWxlTmFtZSgpOwotCQkKLQlpZihuYW1lLmVxdWFscygiIikpIHJldHVybiBmYWxzZTsKLQotCWlmKG5hbWUuaW5kZXhPZigiLmFkciIpICE9IG5hbWUubGVuZ3RoKCkgLSA0KSB7Ci0JCW5hbWUgKz0gIi5hZHIiOwotCX0KLQotCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHNhdmVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLCBuYW1lKTsKLQlpZihmaWxlLmV4aXN0cygpKSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1dBUk5JTkcgfCBTV1QuWUVTIHwgU1dULk5PKTsKLQkJYm94LnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJTYXZlX2FzX3RpdGxlIikpOwotCQlib3guc2V0TWVzc2FnZShyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpbGUiKSArIGZpbGUuZ2V0TmFtZSgpKyIgIityZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlF1ZXJ5X292ZXJ3cml0ZSIpKTsKLQkJaWYoYm94Lm9wZW4oKSAhPSBTV1QuWUVTKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JdGhpcy5maWxlID0gZmlsZTsKLQlyZXR1cm4gc2F2ZSgpOwkKLX0KLXByaXZhdGUgdm9pZCBzb3J0KGludCBjb2x1bW4pIHsKLQlpZih0YWJsZS5nZXRJdGVtQ291bnQoKSA8PSAxKSByZXR1cm47Ci0KLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JU3RyaW5nW11bXSBkYXRhID0gbmV3IFN0cmluZ1tpdGVtcy5sZW5ndGhdW3RhYmxlLmdldENvbHVtbkNvdW50KCldOwotCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlmb3IoaW50IGogPSAwOyBqIDwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsgaisrKSB7Ci0JCQlkYXRhW2ldW2pdID0gaXRlbXNbaV0uZ2V0VGV4dChqKTsKLQkJfQotCX0KLQkKLQlBcnJheXMuc29ydChkYXRhLCBuZXcgUm93Q29tcGFyYXRvcihjb2x1bW4pKTsKLQkKLQlpZiAobGFzdFNvcnRDb2x1bW4gIT0gY29sdW1uKSB7Ci0JCXRhYmxlLnNldFNvcnRDb2x1bW4odGFibGUuZ2V0Q29sdW1uKGNvbHVtbikpOwotCQl0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5ET1dOKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpdGVtc1tpXS5zZXRUZXh0KGRhdGFbaV0pOwotCQl9Ci0JCWxhc3RTb3J0Q29sdW1uID0gY29sdW1uOwotCX0gZWxzZSB7Ci0JCS8vIHJldmVyc2Ugb3JkZXIgaWYgdGhlIGN1cnJlbnQgY29sdW1uIGlzIHNlbGVjdGVkIGFnYWluCi0JCXRhYmxlLnNldFNvcnREaXJlY3Rpb24oU1dULlVQKTsKLQkJaW50IGogPSBkYXRhLmxlbmd0aCAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpdGVtc1tpXS5zZXRUZXh0KGRhdGFbai0tXSk7Ci0JCX0KLQkJbGFzdFNvcnRDb2x1bW4gPSAtMTsKLQl9Ci0JCi19Ci0vKioKLSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBsb2NhdGVkIGluIHRoZSBGaWxlIHN1Ym1lbnUgYW5kCi0gKiBhc3NvY2lhdGUgYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcGFyYW0JbWVudUJhciBNZW51Ci0gKgkJCQl0aGUgPGNvZGU+TWVudTwvY29kZT4gdGhhdCBmaWxlIGNvbnRhaW4KLSAqCQkJCXRoZSBGaWxlIHN1Ym1lbnUuCi0gKi8KLXByaXZhdGUgdm9pZCBjcmVhdGVGaWxlTWVudShNZW51IG1lbnVCYXIpIHsKLQkvL0ZpbGUgbWVudS4KLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlX21lbnVfdGl0bGUiKSk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWl0ZW0uc2V0TWVudShtZW51KTsKLQkvKiogCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIGhhbmRsZSBlbmFibGluZyBhbmQgZGlzYWJsaW5nIAotCSAqIHNvbWUgaXRlbXMgaW4gdGhlIEVkaXQgc3VibWVudS4KLQkgKi8KLQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJTWVudSBtZW51ID0gKE1lbnUpZS53aWRnZXQ7Ci0JCQlNZW51SXRlbVtdIGl0ZW1zID0gbWVudS5nZXRJdGVtcygpOwotCQkJaXRlbXNbMV0uc2V0RW5hYmxlZCh0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpICE9IDApOyAvLyBlZGl0IGNvbnRhY3QKLQkJCWl0ZW1zWzVdLnNldEVuYWJsZWQoKGZpbGUgIT0gbnVsbCkgJiYgaXNNb2RpZmllZCk7IC8vIHNhdmUKLQkJCWl0ZW1zWzZdLnNldEVuYWJsZWQodGFibGUuZ2V0SXRlbUNvdW50KCkgIT0gMCk7IC8vIHNhdmUgYXMKLQkJfQotCX0pOwotCi0KLQkvL0ZpbGUgLT4gTmV3IENvbnRhY3QKLQlNZW51SXRlbSBzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJOZXdfY29udGFjdCIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ04nKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQluZXdFbnRyeSgpOwotCQl9Ci0JfSk7Ci0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRWRpdF9jb250YWN0IikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnRScpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJCWVkaXRFbnRyeShpdGVtc1swXSk7Ci0JCX0KLQl9KTsKLQotCQotCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkKLQkvL0ZpbGUgLT4gTmV3IEFkZHJlc3MgQm9vawotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIk5ld19hZGRyZXNzX2Jvb2siKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdCJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGNsb3NlQWRkcmVzc0Jvb2soKSkgewotCQkJCW5ld0FkZHJlc3NCb29rKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCS8vRmlsZSAtPiBPcGVuCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiT3Blbl9hZGRyZXNzX2Jvb2siKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdPJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGNsb3NlQWRkcmVzc0Jvb2soKSkgewotCQkJCW9wZW5BZGRyZXNzQm9vaygpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQkvL0ZpbGUgLT4gU2F2ZS4KLQlzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJTYXZlX2FkZHJlc3NfYm9vayIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ1MnKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzYXZlKCk7Ci0JCX0KLQl9KTsKLQkKLQkvL0ZpbGUgLT4gU2F2ZSBBcy4KLQlzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJTYXZlX2Jvb2tfYXMiKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdBJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2F2ZUFzKCk7Ci0JCX0KLQl9KTsKLQotCQkKLQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCi0JLy9GaWxlIC0+IEV4aXQuCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRXhpdCIpKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhbGwgdGhlIGl0ZW1zIGxvY2F0ZWQgaW4gdGhlIEVkaXQgc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEBwYXJhbQltZW51QmFyIE1lbnUKLSAqCQkJCXRoZSA8Y29kZT5NZW51PC9jb2RlPiB0aGF0IGZpbGUgY29udGFpbgotICoJCQkJdGhlIEVkaXQgc3VibWVudS4KLSAqCi0gKiBAc2VlCSNjcmVhdGVTb3J0TWVudSgpCi0gKi8KLXByaXZhdGUgTWVudUl0ZW0gY3JlYXRlRWRpdE1lbnUoTWVudSBtZW51QmFyKSB7Ci0JLy9FZGl0IG1lbnUuCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRWRpdF9tZW51X3RpdGxlIikpOwotCU1lbnUgbWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlpdGVtLnNldE1lbnUobWVudSk7Ci0JCi0JLyoqIAotCSAqIEFkZCBhIGxpc3RlbmVyIHRvIGhhbmRsZSBlbmFibGluZyBhbmQgZGlzYWJsaW5nIAotCSAqIHNvbWUgaXRlbXMgaW4gdGhlIEVkaXQgc3VibWVudS4KLQkgKi8KLQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJTWVudSBtZW51ID0gKE1lbnUpZS53aWRnZXQ7Ci0JCQlNZW51SXRlbVtdIGl0ZW1zID0gbWVudS5nZXRJdGVtcygpOwotCQkJaW50IGNvdW50ID0gdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQkJCWl0ZW1zWzBdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGVkaXQKLQkJCWl0ZW1zWzFdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGNvcHkKLQkJCWl0ZW1zWzJdLnNldEVuYWJsZWQoY29weUJ1ZmZlciAhPSBudWxsKTsgLy8gcGFzdGUKLQkJCWl0ZW1zWzNdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGRlbGV0ZQotCQkJaXRlbXNbNV0uc2V0RW5hYmxlZCh0YWJsZS5nZXRJdGVtQ291bnQoKSAhPSAwKTsgLy8gc29ydAotCQl9Ci0JfSk7Ci0JCi0JLy9FZGl0IC0+IEVkaXQKLQlNZW51SXRlbSBzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJFZGl0IikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnRScpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJCWVkaXRFbnRyeShpdGVtc1swXSk7Ci0JCX0KLQl9KTsKLQotCS8vRWRpdCAtPiBDb3B5Ci0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQ29weSIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0MnKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQljb3B5QnVmZmVyID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29weUJ1ZmZlci5sZW5ndGg7IGkrKykgewotCQkJCWNvcHlCdWZmZXJbaV0gPSBpdGVtc1swXS5nZXRUZXh0KGkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy9FZGl0IC0+IFBhc3RlCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUGFzdGUiKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdWJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGNvcHlCdWZmZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQoY29weUJ1ZmZlcik7Ci0JCQlpc01vZGlmaWVkID0gdHJ1ZTsKLQkJfQotCX0pOwotCQotCS8vRWRpdCAtPiBEZWxldGUKLQlzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEZWxldGUiKSk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJaXRlbXNbMF0uZGlzcG9zZSgpOwotCQkJaXNNb2RpZmllZCA9IHRydWU7CQl9Ci0JfSk7Ci0JCi0JbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQotCS8vRWRpdCAtPiBTb3J0KENhc2NhZGUpCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0FTQ0FERSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU29ydCIpKTsKLQlNZW51IHN1Ym1lbnUgPSBjcmVhdGVTb3J0TWVudSgpOwotCXN1Ykl0ZW0uc2V0TWVudShzdWJtZW51KTsKLQkKLQlyZXR1cm4gaXRlbTsKLQkKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGFsbCB0aGUgaXRlbXMgbG9jYXRlZCBpbiB0aGUgU29ydCBjYXNjYWRpbmcgc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEByZXR1cm4JTWVudQotICoJCQlUaGUgY2FzY2FkaW5nIG1lbnUgd2l0aCBhbGwgdGhlIHNvcnQgbWVudSBpdGVtcyBvbiBpdC4KLSAqLwotcHJpdmF0ZSBNZW51IGNyZWF0ZVNvcnRNZW51KCkgewotCU1lbnUgc3VibWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlNZW51SXRlbSBzdWJpdGVtOwotCWZvcihpbnQgaSA9IDA7IGkgPCBjb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykgewotCQlzdWJpdGVtID0gbmV3IE1lbnVJdGVtIChzdWJtZW51LCBTV1QuTk9ORSk7Ci0JCXN1Yml0ZW0uc2V0VGV4dChjb2x1bW5OYW1lcyBbaV0pOwotCQlmaW5hbCBpbnQgY29sdW1uID0gaTsKLQkJc3ViaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzb3J0KGNvbHVtbik7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCQotCXJldHVybiBzdWJtZW51OwotfQotCi0vKioKLSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBsb2NhdGVkIGluIHRoZSBTZWFyY2ggc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEBwYXJhbQltZW51QmFyCU1lbnUKLSAqCQkJCXRoZSA8Y29kZT5NZW51PC9jb2RlPiB0aGF0IGZpbGUgY29udGFpbgotICoJCQkJdGhlIFNlYXJjaCBzdWJtZW51LgotICovCi1wcml2YXRlIHZvaWQgY3JlYXRlU2VhcmNoTWVudShNZW51IG1lbnVCYXIpIHsKLQkvL1NlYXJjaCBtZW51LgotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlNlYXJjaF9tZW51X3RpdGxlIikpOwotCU1lbnUgc2VhcmNoTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlpdGVtLnNldE1lbnUoc2VhcmNoTWVudSk7Ci0KLQkvL1NlYXJjaCAtPiBGaW5kLi4uCi0JaXRlbSA9IG5ldyBNZW51SXRlbShzZWFyY2hNZW51LCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmluZCIpKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0YnKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzZWFyY2hEaWFsb2cuc2V0TWF0Y2hDYXNlKGZhbHNlKTsKLQkJCXNlYXJjaERpYWxvZy5zZXRNYXRjaFdvcmQoZmFsc2UpOwotCQkJc2VhcmNoRGlhbG9nLnNldFNlYXJjaERvd24odHJ1ZSk7Ci0JCQlzZWFyY2hEaWFsb2cuc2V0U2VhcmNoU3RyaW5nKCIiKTsKLQkJCXNlYXJjaERpYWxvZy5zZXRTZWxlY3RlZFNlYXJjaEFyZWEoMCk7Ci0JCQlzZWFyY2hEaWFsb2cub3BlbigpOwotCQl9Ci0JfSk7Ci0KLQkvL1NlYXJjaCAtPiBGaW5kIE5leHQKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHNlYXJjaE1lbnUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaW5kX25leHQiKSk7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuRjMpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXNlYXJjaERpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9KTsKLX0KLQotLyoqIAotICogQ3JlYXRlcyBhbGwgaXRlbXMgbG9jYXRlZCBpbiB0aGUgcG9wdXAgbWVudSBhbmQgYXNzb2NpYXRlcwotICogYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUgZnVuY3Rpb25zLgotICoKLSAqIEByZXR1cm4JTWVudQotICoJCQlUaGUgY3JlYXRlZCBwb3B1cCBtZW51LgotICovCi1wcml2YXRlIE1lbnUgY3JlYXRlUG9wVXBNZW51KCkgewotCU1lbnUgcG9wVXBNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5QT1BfVVApOwotCi0JLyoqIAotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBoYW5kbGUgZW5hYmxpbmcgYW5kIGRpc2FibGluZyAKLQkgKiBzb21lIGl0ZW1zIGluIHRoZSBFZGl0IHN1Ym1lbnUuCi0JICovCi0JcG9wVXBNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJTWVudSBtZW51ID0gKE1lbnUpZS53aWRnZXQ7Ci0JCQlNZW51SXRlbVtdIGl0ZW1zID0gbWVudS5nZXRJdGVtcygpOwotCQkJaW50IGNvdW50ID0gdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQkJCWl0ZW1zWzJdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGVkaXQKLQkJCWl0ZW1zWzNdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGNvcHkKLQkJCWl0ZW1zWzRdLnNldEVuYWJsZWQoY29weUJ1ZmZlciAhPSBudWxsKTsgLy8gcGFzdGUKLQkJCWl0ZW1zWzVdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGRlbGV0ZQotCQkJaXRlbXNbN10uc2V0RW5hYmxlZCh0YWJsZS5nZXRJdGVtQ291bnQoKSAhPSAwKTsgLy8gZmluZAotCQl9Ci0JfSk7Ci0KLQkvL05ldwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX25ldyIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQluZXdFbnRyeSgpOwotCQl9Ci0JfSk7Ci0JCi0JbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULlNFUEFSQVRPUik7CQotCQotCS8vRWRpdAotCWl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX2VkaXQiKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJZWRpdEVudHJ5KGl0ZW1zWzBdKTsKLQkJfQotCX0pOwotCi0JLy9Db3B5Ci0JaXRlbSA9IG5ldyBNZW51SXRlbShwb3BVcE1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJQb3BfdXBfY29weSIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQljb3B5QnVmZmVyID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29weUJ1ZmZlci5sZW5ndGg7IGkrKykgewotCQkJCWNvcHlCdWZmZXJbaV0gPSBpdGVtc1swXS5nZXRUZXh0KGkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy9QYXN0ZQotCWl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX3Bhc3RlIikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChjb3B5QnVmZmVyID09IG51bGwpIHJldHVybjsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KGNvcHlCdWZmZXIpOwotCQkJaXNNb2RpZmllZCA9IHRydWU7Ci0JCX0KLQl9KTsKLQkKLQkvL0RlbGV0ZQotCWl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX2RlbGV0ZSIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQlpdGVtc1swXS5kaXNwb3NlKCk7Ci0JCQlpc01vZGlmaWVkID0gdHJ1ZTsKLQkJfQotCX0pOwotCQotCW5ldyBNZW51SXRlbShwb3BVcE1lbnUsIFNXVC5TRVBBUkFUT1IpOwkKLQkKLQkvL0ZpbmQuLi4KLQlpdGVtID0gbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBvcF91cF9maW5kIikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXNlYXJjaERpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9KTsKLQotCXJldHVybiBwb3BVcE1lbnU7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhbGwgdGhlIGl0ZW1zIGxvY2F0ZWQgaW4gdGhlIEhlbHAgc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEBwYXJhbQltZW51QmFyCU1lbnUKLSAqCQkJCXRoZSA8Y29kZT5NZW51PC9jb2RlPiB0aGF0IGZpbGUgY29udGFpbgotICoJCQkJdGhlIEhlbHAgc3VibWVudS4KLSAqLwotcHJpdmF0ZSB2b2lkIGNyZWF0ZUhlbHBNZW51KE1lbnUgbWVudUJhcikgewotCQotCS8vSGVscCBNZW51Ci0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSGVscF9tZW51X3RpdGxlIikpOwkKLQlNZW51IG1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JaXRlbS5zZXRNZW51KG1lbnUpOwotCQotCS8vSGVscCAtPiBBYm91dCBUZXh0IEVkaXRvcgotCU1lbnVJdGVtIHN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkFib3V0IikpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5OT05FKTsKLQkJCWJveC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQWJvdXRfMSIpICsgc2hlbGwuZ2V0VGV4dCgpKTsKLQkJCWJveC5zZXRNZXNzYWdlKHNoZWxsLmdldFRleHQoKSArIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQWJvdXRfMiIpKTsKLQkJCWJveC5vcGVuKCk7CQkKLQkJfQotCX0pOwotfQotCi0vKioKLSAqIFRvIGNvbXBhcmUgZW50cmllcyAocm93cykgYnkgdGhlIGdpdmVuIGNvbHVtbgotICovCi1wcml2YXRlIGNsYXNzIFJvd0NvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQlwcml2YXRlIGludCBjb2x1bW47Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFJvd0NvbXBhcmF0b3IgZ2l2ZW4gdGhlIGNvbHVtbiBpbmRleAotCSAqIEBwYXJhbSBjb2wgVGhlIGluZGV4IChzdGFydGluZyBhdCB6ZXJvKSBvZiB0aGUgY29sdW1uCi0JICovCi0JcHVibGljIFJvd0NvbXBhcmF0b3IoaW50IGNvbCkgewotCQljb2x1bW4gPSBjb2w7Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmVzIHR3byByb3dzICh0eXBlIFN0cmluZ1tdKSB1c2luZyB0aGUgc3BlY2lmaWVkCi0JICogY29sdW1uIGVudHJ5LgotCSAqIEBwYXJhbSBvYmoxIEZpcnN0IHJvdyB0byBjb21wYXJlCi0JICogQHBhcmFtIG9iajIgU2Vjb25kIHJvdyB0byBjb21wYXJlCi0JICogQHJldHVybiBuZWdhdGl2ZSBpZiBvYmoxIGxlc3MgdGhhbiBvYmoyLCBwb3NpdGl2ZSBpZgotCSAqIAkJCW9iajEgZ3JlYXRlciB0aGFuIG9iajIsIGFuZCB6ZXJvIGlmIGVxdWFsLgotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJU3RyaW5nW10gcm93MSA9IChTdHJpbmdbXSlvYmoxOwotCQlTdHJpbmdbXSByb3cyID0gKFN0cmluZ1tdKW9iajI7Ci0JCQotCQlyZXR1cm4gcm93MVtjb2x1bW5dLmNvbXBhcmVUbyhyb3cyW2NvbHVtbl0pOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0RhdGFFbnRyeURpYWxvZy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRGF0YUVudHJ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhNTE0MzEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRGF0YUVudHJ5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hZGRyZXNzYm9vazsKLQotCi0vKiBJbXBvcnRzICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBEYXRhRW50cnlEaWFsb2cgY2xhc3MgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IAotICogbGlicmFyaWVzIHRvIGltcGxlbWVudCBhIGRpYWxvZyB0aGF0IGFjY2VwdHMgYmFzaWMgcGVyc29uYWwgaW5mb3JtYXRpb24gdGhhdAotICogaXMgYWRkZWQgdG8gYSA8Y29kZT5UYWJsZTwvY29kZT4gd2lkZ2V0IG9yIGVkaXRzIGEgPGNvZGU+VGFibGVJdGVtPC9jb2RlPiBlbnRyeSAKLSAqIHRvIHJlcHJlc2VudCB0aGUgZW50ZXJlZCBkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgRGF0YUVudHJ5RGlhbG9nIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0FkZHJlc3NCb29rID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19hZGRyZXNzYm9vayIpOwotCQotCVNoZWxsIHNoZWxsOwotCVN0cmluZ1tdIHZhbHVlczsKLQlTdHJpbmdbXSBsYWJlbHM7Ci0JCi1wdWJsaWMgRGF0YUVudHJ5RGlhbG9nKFNoZWxsIHBhcmVudCkgewotCXNoZWxsID0gbmV3IFNoZWxsKHBhcmVudCwgU1dULkRJQUxPR19UUklNIHwgU1dULlBSSU1BUllfTU9EQUwpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsJCQotfQotCi1wcml2YXRlIHZvaWQgYWRkVGV4dExpc3RlbmVyKGZpbmFsIFRleHQgdGV4dCkgewotCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotCQkJSW50ZWdlciBpbmRleCA9IChJbnRlZ2VyKSh0ZXh0LmdldERhdGEoImluZGV4IikpOwotCQkJdmFsdWVzW2luZGV4LmludFZhbHVlKCldID0gdGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQl9KTsKLX0KLXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9sQnV0dG9ucygpIHsKLQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUikpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQotCUJ1dHRvbiBva0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0Jb2tCdXR0b24uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIk9LIikpOwotCW9rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JY2FuY2VsQnV0dG9uLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDYW5jZWwiKSk7Ci0JY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl2YWx1ZXMgPSBudWxsOwotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotCQotCXNoZWxsLnNldERlZmF1bHRCdXR0b24ob2tCdXR0b24pOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVGV4dFdpZGdldHMoKSB7Ci0JaWYgKGxhYmVscyA9PSBudWxsKSByZXR1cm47Ci0JCi0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlpZiAodmFsdWVzID09IG51bGwpCi0JCXZhbHVlcyA9IG5ldyBTdHJpbmdbbGFiZWxzLmxlbmd0aF07Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuUklHSFQpOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsc1tpXSk7CQotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWlmICh2YWx1ZXNbaV0gIT0gbnVsbCkgewotCQkJdGV4dC5zZXRUZXh0KHZhbHVlc1tpXSk7Ci0JCX0KLQkJdGV4dC5zZXREYXRhKCJpbmRleCIsIG5ldyBJbnRlZ2VyKGkpKTsKLQkJYWRkVGV4dExpc3RlbmVyKHRleHQpOwkKLQl9Ci19Ci0KLXB1YmxpYyBTdHJpbmdbXSBnZXRMYWJlbHMoKSB7Ci0JcmV0dXJuIGxhYmVsczsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JcmV0dXJuIHNoZWxsLmdldFRleHQoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldHMgaW4gdGhlIGRpYWxvZyBpbiBhIAotICogPGNvZGU+U3RyaW5nPC9jb2RlPiBhcnJheS4KLSAqCi0gKiBAcmV0dXJuCVN0cmluZ1tdCQotICoJCQlUaGUgY29udGVudHMgb2YgdGhlIHRleHQgd2lkZ2V0cyBvZiB0aGUgZGlhbG9nLgotICoJCQlNYXkgcmV0dXJuIG51bGwgaWYgYWxsIHRleHQgd2lkZ2V0cyBhcmUgZW1wdHkuCi0gKi8gCi1wdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotCXJldHVybiB2YWx1ZXM7Ci19Ci0vKiogCi0gKiBPcGVucyB0aGUgZGlhbG9nIGluIHRoZSBnaXZlbiBzdGF0ZS4gIFNldHMgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IGNvbnRlbnRzIAotICogYW5kIGRpYWxvZyBiZWhhdmlvdXIgYWNjb3JkaW5nbHkuCi0gKgotICogQHBhcmFtIAlkaWFsb2dTdGF0ZQlpbnQKLSAqCQkJCQlUaGUgc3RhdGUgdGhlIGRpYWxvZyBzaG91bGQgYmUgb3BlbmVkIGluLgotICovCi1wdWJsaWMgU3RyaW5nW10gb3BlbigpIHsKLQljcmVhdGVUZXh0V2lkZ2V0cygpOwotCWNyZWF0ZUNvbnRyb2xCdXR0b25zKCk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSl7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQkKLQlyZXR1cm4gZ2V0VmFsdWVzKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRMYWJlbHMoU3RyaW5nW10gbGFiZWxzKSB7Ci0JdGhpcy5sYWJlbHMgPSBsYWJlbHM7Ci19Ci1wdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQlzaGVsbC5zZXRUZXh0KHRpdGxlKTsKLX0KLS8qKgotICogU2V0cyB0aGUgdmFsdWVzIG9mIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXRzIG9mIHRoZSBkaWFsb2cgdG8KLSAqIHRoZSB2YWx1ZXMgc3VwcGxpZWQgaW4gdGhlIHBhcmFtZXRlciBhcnJheS4KLSAqCi0gKiBAcGFyYW0JaXRlbUluZm8JU3RyaW5nW10KLSAqIAkJCQkJCVRoZSB2YWx1ZXMgdG8gd2hpY2ggdGhlIGRpYWxvZyBjb250ZW50cyB3aWxsIGJlIHNldC4KLSAqLwotcHVibGljIHZvaWQgc2V0VmFsdWVzKFN0cmluZ1tdIGl0ZW1JbmZvKSB7Ci0JaWYgKGxhYmVscyA9PSBudWxsKSByZXR1cm47Ci0JCi0JaWYgKHZhbHVlcyA9PSBudWxsKQotCQl2YWx1ZXMgPSBuZXcgU3RyaW5nW2xhYmVscy5sZW5ndGhdOwotCi0JaW50IG51bUl0ZW1zID0gTWF0aC5taW4odmFsdWVzLmxlbmd0aCwgaXRlbUluZm8ubGVuZ3RoKTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykgewotCQl2YWx1ZXNbaV0gPSBpdGVtSW5mb1tpXTsKLQl9CQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRmluZExpc3RlbmVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9GaW5kTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTczMjUwNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9GaW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2s7Ci0KLQotcHVibGljIGludGVyZmFjZSBGaW5kTGlzdGVuZXIgewotCi1wdWJsaWMgYm9vbGVhbiBmaW5kKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL1NlYXJjaERpYWxvZy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svU2VhcmNoRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0YjY2ZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svU2VhcmNoRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hZGRyZXNzYm9vazsKLQotCi0vKiBJbXBvcnRzICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBTZWFyY2hEaWFsb2cgaXMgYSBzaW1wbGUgY2xhc3MgdGhhdCB1c2VzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dDwvY29kZT4gCi0gKiBsaWJyYXJpZXMgdG8gaW1wbGVtZW50IGEgYmFzaWMgc2VhcmNoIGRpYWxvZy4KLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaERpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNBZGRyZXNzQm9vayA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfYWRkcmVzc2Jvb2siKTsKLQotCVNoZWxsIHNoZWxsOwotCVRleHQgc2VhcmNoVGV4dDsKLQlDb21ibyBzZWFyY2hBcmVhOwotCUxhYmVsIHNlYXJjaEFyZWFMYWJlbDsKLQlCdXR0b24gbWF0Y2hDYXNlOwotCUJ1dHRvbiBtYXRjaFdvcmQ7Ci0JQnV0dG9uIGZpbmRCdXR0b247Ci0JQnV0dG9uIGRvd247Ci0JRmluZExpc3RlbmVyIGZpbmRIYW5kbGVyOwotCi0vKioKLSAqIENsYXNzIGNvbnN0cnVjdG9yIHRoYXQgc2V0cyB0aGUgcGFyZW50IHNoZWxsIGFuZCB0aGUgdGFibGUgd2lkZ2V0IHRoYXQKLSAqIHRoZSBkaWFsb2cgd2lsbCBzZWFyY2guCi0gKgotICogQHBhcmFtIHBhcmVudAlTaGVsbCAKLSAqCQkJVGhlIHNoZWxsIHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGUgZGlhbG9nLgotICovCi1wdWJsaWMgU2VhcmNoRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCXNoZWxsID0gbmV3IFNoZWxsKHBhcmVudCwgU1dULkNMT1NFIHwgU1dULkJPUkRFUiB8IFNXVC5USVRMRSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQlzaGVsbC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU2VhcmNoX2RpYWxvZ190aXRsZSIpKTsKLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKXsKLQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQoU2hlbGxFdmVudCBlKSB7Ci0JCQkvLyBkb24ndCBkaXNwb3NlIG9mIHRoZSBzaGVsbCwganVzdCBoaWRlIGl0IGZvciBsYXRlciB1c2UKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQl9KTsKLQkJCi0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5MRUZUKTsKLQlsYWJlbC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2ZpbmRfd2hhdCIpKTsJCi0Jc2VhcmNoVGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLQlzZWFyY2hUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCXNlYXJjaFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWJvb2xlYW4gZW5hYmxlRmluZCA9IChzZWFyY2hUZXh0LmdldENoYXJDb3VudCgpICE9IDApOwotCQkJZmluZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZUZpbmQpOwotCQl9Ci0JfSk7Ci0KLQlzZWFyY2hBcmVhTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5MRUZUKTsKLQlzZWFyY2hBcmVhID0gbmV3IENvbWJvKHNoZWxsLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0Jc2VhcmNoQXJlYS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkKLQltYXRjaENhc2UgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQ0hFQ0spOwotCW1hdGNoQ2FzZS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX21hdGNoX2Nhc2UiKSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JbWF0Y2hDYXNlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQotCW1hdGNoV29yZCA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5DSEVDSyk7Ci0JbWF0Y2hXb3JkLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfbWF0Y2hfd29yZCIpKTsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQltYXRjaFdvcmQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCi0JR3JvdXAgZGlyZWN0aW9uID0gbmV3IEdyb3VwKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JZGlyZWN0aW9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCWRpcmVjdGlvbi5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsJCi0JZGlyZWN0aW9uLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfZGlyZWN0aW9uIikpOwotCQotCUJ1dHRvbiB1cCA9IG5ldyBCdXR0b24oZGlyZWN0aW9uLCBTV1QuUkFESU8pOwotCXVwLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfZGlyX3VwIikpOwotCXVwLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQotCWRvd24gPSBuZXcgQnV0dG9uKGRpcmVjdGlvbiwgU1dULlJBRElPKTsKLQlkb3duLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfZGlyX2Rvd24iKSk7Ci0JZG93bi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0JZmluZEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JZmluZEJ1dHRvbi5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2ZpbmQiKSk7Ci0JZmluZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCWZpbmRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JZmluZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKCFmaW5kSGFuZGxlci5maW5kKCkpewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0lORk9STUFUSU9OIHwgU1dULk9LIHwgU1dULlBSSU1BUllfTU9EQUwpOwotCQkJCWJveC5zZXRUZXh0KHNoZWxsLmdldFRleHQoKSk7Ci0JCQkJYm94LnNldE1lc3NhZ2UocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDYW5ub3RfZmluZCIpICsgIlwiIiArIHNlYXJjaFRleHQuZ2V0VGV4dCgpICsgIlwiIik7Ci0JCQkJYm94Lm9wZW4oKTsJCi0JCQl9CQkKLQkJfQotCX0pOwotCQkJCi0JQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JY2FuY2VsQnV0dG9uLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDYW5jZWwiKSk7Ci0JY2FuY2VsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0pOwotCQotCXNoZWxsLnBhY2soKTsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoQXJlYUxhYmVsKFN0cmluZyBsYWJlbCkgewotCXJldHVybiBzZWFyY2hBcmVhTGFiZWwuZ2V0VGV4dCgpOwotfQotCi1wdWJsaWMgU3RyaW5nW10gZ2V0c2VhcmNoQXJlYU5hbWVzKCkgewotCXJldHVybiBzZWFyY2hBcmVhLmdldEl0ZW1zKCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBnZXRNYXRjaENhc2UoKSB7Ci0JcmV0dXJuIG1hdGNoQ2FzZS5nZXRTZWxlY3Rpb24oKTsKLX0KLXB1YmxpYyBib29sZWFuIGdldE1hdGNoV29yZCgpIHsKLQlyZXR1cm4gbWF0Y2hXb3JkLmdldFNlbGVjdGlvbigpOwotfQotcHVibGljIFN0cmluZyBnZXRTZWFyY2hTdHJpbmcoKSB7Ci0JcmV0dXJuIHNlYXJjaFRleHQuZ2V0VGV4dCgpOwotfQotcHVibGljIGJvb2xlYW4gZ2V0U2VhcmNoRG93bigpewotCXJldHVybiBkb3duLmdldFNlbGVjdGlvbigpOwotfQotcHVibGljIGludCBnZXRTZWxlY3RlZFNlYXJjaEFyZWEoKSB7Ci0JcmV0dXJuIHNlYXJjaEFyZWEuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLX0KLXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JaWYgKHNoZWxsLmlzVmlzaWJsZSgpKSB7Ci0JCXNoZWxsLnNldEZvY3VzKCk7Ci0JfSBlbHNlIHsKLQkJc2hlbGwub3BlbigpOwotCX0KLQlzZWFyY2hUZXh0LnNldEZvY3VzKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hBcmVhTmFtZXMoU3RyaW5nW10gbmFtZXMpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCXNlYXJjaEFyZWEuYWRkKG5hbWVzW2ldKTsKLQl9Ci0Jc2VhcmNoQXJlYS5zZWxlY3QoMCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hBcmVhTGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0Jc2VhcmNoQXJlYUxhYmVsLnNldFRleHQobGFiZWwpOwotfQotcHVibGljIHZvaWQgc2V0TWF0Y2hDYXNlKGJvb2xlYW4gbWF0Y2gpIHsKLQltYXRjaENhc2Uuc2V0U2VsZWN0aW9uKG1hdGNoKTsKLX0KLXB1YmxpYyB2b2lkIHNldE1hdGNoV29yZChib29sZWFuIG1hdGNoKSB7Ci0JbWF0Y2hXb3JkLnNldFNlbGVjdGlvbihtYXRjaCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hEb3duKGJvb2xlYW4gc2VhcmNoRG93bil7Ci0JZG93bi5zZXRTZWxlY3Rpb24oc2VhcmNoRG93bik7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hTdHJpbmcoU3RyaW5nIHNlYXJjaFN0cmluZykgewotCXNlYXJjaFRleHQuc2V0VGV4dChzZWFyY2hTdHJpbmcpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFNlYXJjaEFyZWEoaW50IGluZGV4KSB7Ci0Jc2VhcmNoQXJlYS5zZWxlY3QoaW5kZXgpOwotfQotcHVibGljIHZvaWQgYWRkRmluZExpc3RlbmVyKEZpbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCXRoaXMuZmluZEhhbmRsZXIgPSBsaXN0ZW5lcjsJCi19Ci1wdWJsaWMgdm9pZCByZW1vdmVGaW5kTGlzdGVuZXIoRmluZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JdGhpcy5maW5kSGFuZGxlciA9IG51bGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlckV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0ZTU4Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlckV4YW1wbGUgewotCXN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfYnJvd3NlciIpOwotCWludCBpbmRleDsKLQlib29sZWFuIGJ1c3k7Ci0JSW1hZ2UgaW1hZ2VzW107Ci0JSW1hZ2UgaWNvbiA9IG51bGw7Ci0JYm9vbGVhbiB0aXRsZSA9IGZhbHNlOwotCUNvbXBvc2l0ZSBwYXJlbnQ7Ci0JVGV4dCBsb2NhdGlvbkJhcjsKLQlCcm93c2VyIGJyb3dzZXI7Ci0JVG9vbEJhciB0b29sYmFyOwotCUNhbnZhcyBjYW52YXM7Ci0JVG9vbEl0ZW0gaXRlbUJhY2ssIGl0ZW1Gb3J3YXJkOwotCUxhYmVsIHN0YXR1czsKLQlQcm9ncmVzc0JhciBwcm9ncmVzc0JhcjsKLQlTV1RFcnJvciBlcnJvciA9IG51bGw7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gaW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCQkiZWNsaXBzZTAxLmJtcCIsICJlY2xpcHNlMDIuYm1wIiwgImVjbGlwc2UwMy5ibXAiLCAiZWNsaXBzZTA0LmJtcCIsICJlY2xpcHNlMDUuYm1wIiwKLQkJCSJlY2xpcHNlMDYuYm1wIiwgImVjbGlwc2UwNy5ibXAiLCAiZWNsaXBzZTA4LmJtcCIsICJlY2xpcHNlMDkuYm1wIiwgImVjbGlwc2UxMC5ibXAiLAotCQkJImVjbGlwc2UxMS5ibXAiLCAiZWNsaXBzZTEyLmJtcCIsfTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIGljb25Mb2NhdGlvbiA9ICJkb2N1bWVudC5naWYiOwotCQkKLQlwdWJsaWMgQnJvd3NlckV4YW1wbGUoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiB0b3ApIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJZXJyb3IgPSBlOwotCQkJLyogQnJvd3NlciB3aWRnZXQgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCAqLwotCQkJcGFyZW50LnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkNFTlRFUiB8IFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkJyb3dzZXJOb3RDcmVhdGVkIikpOwotCQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpbml0UmVzb3VyY2VzKCk7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCWJyb3dzZXIuc2V0RGF0YSgib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLkJyb3dzZXJBcHBsaWNhdGlvbiIsIHRoaXMpOwotCQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCWlmIChpY29uICE9IG51bGwpIHNoZWxsLnNldEltYWdlKGljb24pOwotCQkJCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCQlCcm93c2VyRXhhbXBsZSBhcHAgPSBuZXcgQnJvd3NlckV4YW1wbGUoc2hlbGwsIGZhbHNlKTsKLQkJCQlhcHAuc2V0U2hlbGxEZWNvcmF0aW9uKGljb24sIHRydWUpOwotCQkJCWV2ZW50LmJyb3dzZXIgPSBhcHAuZ2V0QnJvd3NlcigpOwotCQkJfQotCQl9KTsKLQkJaWYgKHRvcCkgewotCQkJYnJvd3Nlci5zZXRVcmwoZ2V0UmVzb3VyY2VTdHJpbmcoIlN0YXJ0dXAiKSk7Ci0JCQlzaG93KGZhbHNlLCBudWxsLCBudWxsLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBlKSB7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZSkgewotCQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcillLndpZGdldDsKLQkJCQkJQnJvd3NlckV4YW1wbGUgYXBwID0gKEJyb3dzZXJFeGFtcGxlKWJyb3dzZXIuZ2V0RGF0YSgib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLkJyb3dzZXJBcHBsaWNhdGlvbiIpOwotCQkJCQlhcHAuc2hvdyh0cnVlLCBlLmxvY2F0aW9uLCBlLnNpemUsIGUuYWRkcmVzc0JhciwgZS5tZW51QmFyLCBlLnN0YXR1c0JhciwgZS50b29sQmFyKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjbG9zZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyCi0JICogaW5zdGFuY2Ugb2YgdGhlIEJyb3dzZXJBcHBsaWNhdGlvbi4KLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZnJlZVJlc291cmNlcygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQkKLQlwdWJsaWMgU1dURXJyb3IgZ2V0RXJyb3IoKSB7IHJldHVybiBlcnJvcjsgfQotCQotCXB1YmxpYyBCcm93c2VyIGdldEJyb3dzZXIoKSB7IHJldHVybiBicm93c2VyOyB9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hlbGxEZWNvcmF0aW9uKEltYWdlIGljb24sIGJvb2xlYW4gdGl0bGUpIHsKLQkJdGhpcy5pY29uID0gaWNvbjsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQkKLQl2b2lkIHNob3coYm9vbGVhbiBvd25lZCwgUG9pbnQgbG9jYXRpb24sIFBvaW50IHNpemUsIGJvb2xlYW4gYWRkcmVzc0JhciwgYm9vbGVhbiBtZW51QmFyLCBib29sZWFuIHN0YXR1c0JhciwgYm9vbGVhbiB0b29sQmFyKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQlpZiAob3duZWQpIHsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSBzaGVsbC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQlpZiAoc2l6ZSAhPSBudWxsKSBzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KSk7Ci0JCX0KLQkJRm9ybURhdGEgZGF0YSA9IG51bGw7Ci0JCWlmICh0b29sQmFyKSB7Ci0JCQl0b29sYmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQkJCXRvb2xiYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWl0ZW1CYWNrID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW1CYWNrLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2siKSk7Ci0JCQlpdGVtRm9yd2FyZCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCQlpdGVtRm9yd2FyZC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJGb3J3YXJkIikpOwotCQkJZmluYWwgVG9vbEl0ZW0gaXRlbVN0b3AgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQkJaXRlbVN0b3Auc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiU3RvcCIpKTsKLQkJCWZpbmFsIFRvb2xJdGVtIGl0ZW1SZWZyZXNoID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW1SZWZyZXNoLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZnJlc2giKSk7Ci0JCQlmaW5hbCBUb29sSXRlbSBpdGVtR28gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQkJaXRlbUdvLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkdvIikpOwotCQkJCi0JCQlpdGVtQmFjay5zZXRFbmFibGVkKGJyb3dzZXIuaXNCYWNrRW5hYmxlZCgpKTsKLQkJCWl0ZW1Gb3J3YXJkLnNldEVuYWJsZWQoYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCkpOwotCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJVG9vbEl0ZW0gaXRlbSA9IChUb29sSXRlbSlldmVudC53aWRnZXQ7Ci0JCQkJCWlmIChpdGVtID09IGl0ZW1CYWNrKSBicm93c2VyLmJhY2soKTsgCi0JCQkJCWVsc2UgaWYgKGl0ZW0gPT0gaXRlbUZvcndhcmQpIGJyb3dzZXIuZm9yd2FyZCgpOwotCQkJCQllbHNlIGlmIChpdGVtID09IGl0ZW1TdG9wKSBicm93c2VyLnN0b3AoKTsKLQkJCQkJZWxzZSBpZiAoaXRlbSA9PSBpdGVtUmVmcmVzaCkgYnJvd3Nlci5yZWZyZXNoKCk7Ci0JCQkJCWVsc2UgaWYgKGl0ZW0gPT0gaXRlbUdvKSBicm93c2VyLnNldFVybChsb2NhdGlvbkJhci5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX07Ci0JCQlpdGVtQmFjay5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtRm9yd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtU3RvcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtUmVmcmVzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtR28uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCi0JCQljYW52YXMgPSBuZXcgQ2FudmFzKHBhcmVudCwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS53aWR0aCA9IDI0OwotCQkJZGF0YS5oZWlnaHQgPSAyNDsKLQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCWNhbnZhcy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlc1swXS5nZXRCb3VuZHMoKTsKLQkJCWNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCVBvaW50IHB0ID0gKChDYW52YXMpZS53aWRnZXQpLmdldFNpemUoKTsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2VzW2luZGV4XSwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIDAsIDAsIHB0LngsIHB0LnkpOwkJCQotCQkJCX0KLQkJCX0pOwotCQkJY2FudmFzLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCWJyb3dzZXIuc2V0VXJsKGdldFJlc291cmNlU3RyaW5nKCJTdGFydHVwIikpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJaWYgKGJ1c3kpIHsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQlpZiAoaW5kZXggPT0gaW1hZ2VzLmxlbmd0aCkgaW5kZXggPSAwOwotCQkJCQkJY2FudmFzLnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJCWRpc3BsYXkudGltZXJFeGVjKDE1MCwgdGhpcyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGFkZHJlc3NCYXIpIHsKLQkJCWxvY2F0aW9uQmFyID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWlmICh0b29sYmFyICE9IG51bGwpIHsKLQkJCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0b29sYmFyLCAwLCBTV1QuVE9QKTsKLQkJCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9vbGJhciwgNSwgU1dULlJJR0hUKTsKLQkJCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNhbnZhcywgLTUsIFNXVC5ERUZBVUxUKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsJCQkKLQkJCX0KLQkJCWxvY2F0aW9uQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsb2NhdGlvbkJhci5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJYnJvd3Nlci5zZXRVcmwobG9jYXRpb25CYXIuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoc3RhdHVzQmFyKSB7Ci0JCQlzdGF0dXMgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCQotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChwcm9ncmVzc0JhciwgMCwgU1dULkRFRkFVTFQpOwotCQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JCQlzdGF0dXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCQkJcHJvZ3Jlc3NCYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkgewotCQkJCQlzdGF0dXMuc2V0VGV4dChldmVudC50ZXh0KTsJCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcGFyZW50LnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQotCQlDb250cm9sIGFib3ZlQnJvd3NlciA9IHRvb2xCYXIgPyAoQ29udHJvbCljYW52YXMgOiAoYWRkcmVzc0JhciA/IChDb250cm9sKWxvY2F0aW9uQmFyIDogbnVsbCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IGFib3ZlQnJvd3NlciAhPSBudWxsID8gbmV3IEZvcm1BdHRhY2htZW50KGFib3ZlQnJvd3NlciwgNSwgU1dULkRFRkFVTFQpIDogbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gc3RhdHVzICE9IG51bGwgPyBuZXcgRm9ybUF0dGFjaG1lbnQoc3RhdHVzLCAtNSwgU1dULkRFRkFVTFQpIDogbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQlpZiAoc3RhdHVzQmFyIHx8IHRvb2xCYXIpIHsKLQkJCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGV2ZW50LnRvdGFsID09IDApIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCWludCByYXRpbyA9IGV2ZW50LmN1cnJlbnQgKiAxMDAgLyBldmVudC50b3RhbDsKLQkJCQkJaWYgKHByb2dyZXNzQmFyICE9IG51bGwpIHByb2dyZXNzQmFyLnNldFNlbGVjdGlvbihyYXRpbyk7Ci0JCQkJCWJ1c3kgPSBldmVudC5jdXJyZW50ICE9IGV2ZW50LnRvdGFsOwotCQkJCQlpZiAoIWJ1c3kpIHsKLQkJCQkJCWluZGV4ID0gMDsKLQkJCQkJCWlmIChjYW52YXMgIT0gbnVsbCkgY2FudmFzLnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChwcm9ncmVzc0JhciAhPSBudWxsKSBwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJCWJ1c3kgPSBmYWxzZTsKLQkJCQkJaW5kZXggPSAwOwotCQkJCQlpZiAoY2FudmFzICE9IG51bGwpIHsKLQkJCQkJCWl0ZW1CYWNrLnNldEVuYWJsZWQoYnJvd3Nlci5pc0JhY2tFbmFibGVkKCkpOwotCQkJCQkJaXRlbUZvcndhcmQuc2V0RW5hYmxlZChicm93c2VyLmlzRm9yd2FyZEVuYWJsZWQoKSk7Ci0JCQkJCQljYW52YXMucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoYWRkcmVzc0JhciB8fCBzdGF0dXNCYXIgfHwgdG9vbEJhcikgewotCQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCQlidXN5ID0gdHJ1ZTsKLQkJCQkJaWYgKGV2ZW50LnRvcCAmJiBsb2NhdGlvbkJhciAhPSBudWxsKSBsb2NhdGlvbkJhci5zZXRUZXh0KGV2ZW50LmxvY2F0aW9uKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmICh0aXRsZSkgewotCQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQkJCQlzaGVsbC5zZXRUZXh0KGV2ZW50LnRpdGxlKyIgLSAiK2dldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJaWYgKG93bmVkKSBzaGVsbC5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogR3JhYnMgaW5wdXQgZm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb2N1cygpIHsKLQkJaWYgKGxvY2F0aW9uQmFyICE9IG51bGwpIGxvY2F0aW9uQmFyLnNldEZvY3VzKCk7Ci0JCWVsc2UgaWYgKGJyb3dzZXIgIT0gbnVsbCkgYnJvd3Nlci5zZXRGb2N1cygpOwotCQllbHNlIHBhcmVudC5zZXRGb2N1cygpOwotCX0KLQkKLQkvKioKLQkgKiBGcmVlcyB0aGUgcmVzb3VyY2VzCi0JICovCi0Jdm9pZCBmcmVlUmVzb3VyY2VzKCkgewotCQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbaV07Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWltYWdlcyA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgdGhlIHJlc291cmNlcwotCSAqLwotCXZvaWQgaW5pdFJlc291cmNlcygpIHsKLQkJZmluYWwgQ2xhc3MgY2xhenogPSB0aGlzLmdldENsYXNzKCk7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbWFnZXMgPT0gbnVsbCkgewotCQkJCQlpbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCQkJSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbShpbWFnZUxvY2F0aW9uc1tpXSk7Ci0JCQkJCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YShzb3VyY2VTdHJlYW0pOwotCQkJCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJCQkJaW1hZ2VzW2ldID0gbmV3IEltYWdlKG51bGwsIHNvdXJjZSwgbWFzayk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNvdXJjZVN0cmVhbS5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlICgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGVycm9yID0gKHJlc291cmNlQnVuZGxlICE9IG51bGwpID8gZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpIDogIlVuYWJsZSB0byBsb2FkIHJlc291cmNlcyI7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXJyb3IpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IEJyb3dzZXJFeGFtcGxlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oaWNvbkxvY2F0aW9uKTsKLQkJSW1hZ2UgaWNvbiA9IG5ldyBJbWFnZShkaXNwbGF5LCBzdHJlYW0pOwotCQlzaGVsbC5zZXRJbWFnZShpY29uKTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCUJyb3dzZXJFeGFtcGxlIGFwcCA9IG5ldyBCcm93c2VyRXhhbXBsZShzaGVsbCwgdHJ1ZSk7Ci0JCWFwcC5zZXRTaGVsbERlY29yYXRpb24oaWNvbiwgdHJ1ZSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaWNvbi5kaXNwb3NlKCk7Ci0JCWFwcC5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2RvY3VtZW50LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2RvY3VtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1ZTIyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9kb2N1bWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDEuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAxLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMTZlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDEuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAyLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjA0ZWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAyLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMy5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDMuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmM3YjEwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMy5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDQuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0MDY1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA1LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDVhOTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA1LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNi5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDYuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWE4ODhhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDcuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA3LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlMjIyMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDcuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA4LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwOC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYWMyOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA4LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwOS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDkuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjFmODMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwOS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTAuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTEwLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlNzliMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTAuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTExLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzI0YTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTExLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMi5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTIuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2FlNzFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL0NsaXBib2FyZEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmMDE1ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkOwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgQ2xpcGJvYXJkRXhhbXBsZSB7Ci0KLQlDbGlwYm9hcmQgY2xpcGJvYXJkOwotCVNoZWxsIHNoZWxsOwotCVRleHQgdGV4dDsKLQlDb21ibyBjb21ibzsKLQlTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0JTGFiZWwgc3RhdHVzOwotCXN0YXRpYyBmaW5hbCBpbnQgU0laRSA9IDYwOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCW5ldyBDbGlwYm9hcmRFeGFtcGxlKCkub3BlbihkaXNwbGF5KTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXB1YmxpYyB2b2lkIG9wZW4oRGlzcGxheSBkaXNwbGF5KSB7Ci0JY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChkaXNwbGF5KTsKLQlzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU1dUIENsaXBib2FyZCIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShzYywgU1dULk5PTkUpOwotCXNjLnNldENvbnRlbnQocGFyZW50KTsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkKLQlHcm91cCBjb3B5R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29weUdyb3VwLnNldFRleHQoIkNvcHkgRnJvbToiKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JY29weUdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JY29weUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQotCUdyb3VwIHBhc3RlR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JcGFzdGVHcm91cC5zZXRUZXh0KCJQYXN0ZSBUbzoiKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JcGFzdGVHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCXBhc3RlR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCi0JR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbnRyb2xHcm91cC5zZXRUZXh0KCJDb250cm9sIEFQSToiKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JY29udHJvbEdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JY29udHJvbEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCg1LCBmYWxzZSkpOwotCQotCUdyb3VwIHR5cGVzR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JdHlwZXNHcm91cC5zZXRUZXh0KCJBdmFpbGFibGUgVHlwZXMiKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JdHlwZXNHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCXR5cGVzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0Jc3RhdHVzID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWRhdGEuaGVpZ2h0SGludCA9IDYwOwotCXN0YXR1cy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWNyZWF0ZVRleHRUcmFuc2Zlcihjb3B5R3JvdXAsIHBhc3RlR3JvdXApOwotCWNyZWF0ZVJURlRyYW5zZmVyKGNvcHlHcm91cCwgcGFzdGVHcm91cCk7Ci0JY3JlYXRlSFRNTFRyYW5zZmVyKGNvcHlHcm91cCwgcGFzdGVHcm91cCk7Ci0JY3JlYXRlRmlsZVRyYW5zZmVyKGNvcHlHcm91cCwgcGFzdGVHcm91cCk7Ci0JY3JlYXRlSW1hZ2VUcmFuc2Zlcihjb3B5R3JvdXAsIHBhc3RlR3JvdXApOwotCWNyZWF0ZU15VHJhbnNmZXIoY29weUdyb3VwLCBwYXN0ZUdyb3VwKTsKLQljcmVhdGVDb250cm9sVHJhbnNmZXIoY29udHJvbEdyb3VwKTsKLQljcmVhdGVBdmFpbGFibGVUeXBlcyh0eXBlc0dyb3VwKTsKLQkKLQlzYy5zZXRNaW5TaXplKHBhcmVudC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQlzYy5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCXNjLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQotCVBvaW50IHNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVJlY3RhbmdsZSBtb25pdG9yQXJlYSA9IHNoZWxsLmdldE1vbml0b3IoKS5nZXRDbGllbnRBcmVhKCk7Ci0Jc2hlbGwuc2V0U2l6ZShNYXRoLm1pbihzaXplLngsIG1vbml0b3JBcmVhLndpZHRoIC0gMjApLCBNYXRoLm1pbihzaXplLnksIG1vbml0b3JBcmVhLmhlaWdodCAtIDIwKSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotfQotdm9pZCBjcmVhdGVUZXh0VHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCkgewotCQotCS8vIFRleHRUcmFuc2ZlcgotCUxhYmVsIGwgPSBuZXcgTGFiZWwoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiVGV4dFRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JZmluYWwgVGV4dCBjb3B5VGV4dCA9IG5ldyBUZXh0KGNvcHlQYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWNvcHlUZXh0LnNldFRleHQoInNvbWVcbnBsYWluXG50ZXh0Iik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQljb3B5VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb3B5UGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nIGRhdGEgPSBjb3B5VGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7ZGF0YX0sIG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBjb3B5Iik7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlsID0gbmV3IExhYmVsKHBhc3RlUGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJUZXh0VHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBUZXh0IHBhc3RlVGV4dCA9IG5ldyBUZXh0KHBhc3RlUGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQlwYXN0ZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQliID0gbmV3IEJ1dHRvbihwYXN0ZVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgZGF0YSA9IChTdHJpbmcpY2xpcGJvYXJkLmdldENvbnRlbnRzKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJcGFzdGVUZXh0LnNldFRleHQoImJlZ2luIHBhc3RlPiIrZGF0YSsiPGVuZCBwYXN0ZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBwYXN0ZSIpOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci12b2lkIGNyZWF0ZVJURlRyYW5zZmVyKENvbXBvc2l0ZSBjb3B5UGFyZW50LCBDb21wb3NpdGUgcGFzdGVQYXJlbnQpewotCS8vCVJURiBUcmFuc2ZlcgotCUxhYmVsIGwgPSBuZXcgTGFiZWwoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiUlRGVHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBUZXh0IGNvcHlSdGZUZXh0ID0gbmV3IFRleHQoY29weVBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JY29weVJ0ZlRleHQuc2V0VGV4dCgic29tZVxucnRmXG50ZXh0Iik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQljb3B5UnRmVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb3B5UGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nIGRhdGEgPSBjb3B5UnRmVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJ7XFxydGYxXFxhbnNpXFx1YzF7XFxjb2xvcnRibDtcXHJlZDI1NVxcZ3JlZW4wXFxibHVlMDt9XFx1YzFcXGJcXGkgIik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJY2hhciBjaCA9IGRhdGEuY2hhckF0KGkpOwotCQkJCQlpZiAoY2ggPiAweEZGKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCJcXHUiKTsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b1N0cmluZygoc2hvcnQpIGNoKSk7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCc/Jyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoY2ggPT0gJ30nIHx8IGNoID09ICd7JyB8fCBjaCA9PSAnXFwnKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnXFwnKTsKLQkJCQkJCX0KLQkJCQkJCWJ1ZmZlci5hcHBlbmQoY2gpOwotCQkJCQkJaWYgKGNoID09ICdcbicpIGJ1ZmZlci5hcHBlbmQoIlxccGFyICIpOwotCQkJCQkJaWYgKGNoID09ICdccicgJiYgKGkgLSAxID09IGRhdGEubGVuZ3RoKCkgfHwgZGF0YS5jaGFyQXQoaSArIDEpICE9ICdcbicpKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxwYXIgIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCgifSIpOwotCQkJCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10ge2J1ZmZlci50b1N0cmluZygpfSwgbmV3IFRyYW5zZmVyW10ge1JURlRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gY29weSIpOwotCQkJfQotCQl9Ci0JfSk7Ci0JICAKLQlsID0gbmV3IExhYmVsKHBhc3RlUGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJSVEZUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFRleHQgcGFzdGVSdGZUZXh0ID0gbmV3IFRleHQocGFzdGVQYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXBhc3RlUnRmVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWIgPSBuZXcgQnV0dG9uKHBhc3RlUGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gKFN0cmluZyljbGlwYm9hcmQuZ2V0Q29udGVudHMoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCXBhc3RlUnRmVGV4dC5zZXRUZXh0KCJzdGFydCBwYXN0ZT4iK2RhdGErIjxlbmQgcGFzdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gcGFzdGUiKTsKLQkJCX0KLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVIVE1MVHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCl7Ci0JLy8JSFRNTCBUcmFuc2ZlcgotCUxhYmVsIGwgPSBuZXcgTGFiZWwoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiSFRNTFRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JZmluYWwgVGV4dCBjb3B5SHRtbFRleHQgPSBuZXcgVGV4dChjb3B5UGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQljb3B5SHRtbFRleHQuc2V0VGV4dCgiPGI+SGVsbG8gV29ybGQ8L2I+Iik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQljb3B5SHRtbFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29weVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gY29weUh0bWxUZXh0LmdldFRleHQoKTsKLQkJCWlmIChkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHtkYXRhfSwgbmV3IFRyYW5zZmVyW10ge0hUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIGNvcHkiKTsKLQkJCX0KLQkJfQotCX0pOwotCSAgCi0JbCA9IG5ldyBMYWJlbChwYXN0ZVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiSFRNTFRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JZmluYWwgVGV4dCBwYXN0ZUh0bWxUZXh0ID0gbmV3IFRleHQocGFzdGVQYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXBhc3RlSHRtbFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQliID0gbmV3IEJ1dHRvbihwYXN0ZVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgZGF0YSA9IChTdHJpbmcpY2xpcGJvYXJkLmdldENvbnRlbnRzKEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJcGFzdGVIdG1sVGV4dC5zZXRUZXh0KCJzdGFydCBwYXN0ZT4iK2RhdGErIjxlbmQgcGFzdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gcGFzdGUiKTsKLQkJCX0KLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVGaWxlVHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCl7Ci0JLy9GaWxlIFRyYW5zZmVyCi0JTGFiZWwgbCA9IG5ldyBMYWJlbChjb3B5UGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJGaWxlVHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQkKLQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlmaW5hbCBUYWJsZSBjb3B5RmlsZVRhYmxlID0gbmV3IFRhYmxlKGMsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JY29weUZpbGVUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJTZWxlY3QgZmlsZShzKSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOIHwgU1dULk1VTFRJKTsKLQkJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDApewotCQkJCVN0cmluZyBzZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0JCQkJU3RyaW5nIHBhdGggPSBkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpOwotCQkJCVN0cmluZ1tdIG5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvcHlGaWxlVGFibGUsIFNXVC5OT05FKTsKLQkJCQkJaXRlbS5zZXRUZXh0KHBhdGgrc2VwYXJhdG9yK25hbWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJTZWxlY3QgZGlyZWN0b3J5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDApewotCQkJCS8vY29weUZpbGVUYWJsZS5yZW1vdmVBbGwoKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29weUZpbGVUYWJsZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dChyZXN1bHQpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24oY29weVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gY29weUZpbGVUYWJsZS5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDApewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQlTdHJpbmdbXSBkYXRhID0gbmV3IFN0cmluZ1tpdGVtcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCQlkYXRhW2ldID0gaXRlbXNbaV0uZ2V0VGV4dCgpOwotCQkJCX0KLQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHtkYXRhfSwgbmV3IFRyYW5zZmVyW10ge0ZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIGNvcHkiKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWwgPSBuZXcgTGFiZWwocGFzdGVQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIkZpbGVUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFRhYmxlIHBhc3RlRmlsZVRhYmxlID0gbmV3IFRhYmxlKHBhc3RlUGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXBhc3RlRmlsZVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFzdGVQYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlBhc3RlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nW10gZGF0YSA9IChTdHJpbmdbXSljbGlwYm9hcmQuZ2V0Q29udGVudHMoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJcGFzdGVGaWxlVGFibGUucmVtb3ZlQWxsKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShwYXN0ZUZpbGVUYWJsZSwgU1dULk5PTkUpOwotCQkJCQlpdGVtLnNldFRleHQoZGF0YVtpXSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBwYXN0ZSIpOwotCQkJfQotCQl9Ci0JfSk7CSAKLX0KLQotdm9pZCBjcmVhdGVJbWFnZVRyYW5zZmVyKENvbXBvc2l0ZSBjb3B5UGFyZW50LCBDb21wb3NpdGUgcGFzdGVQYXJlbnQpewotCWZpbmFsIEltYWdlW10gY29weUltYWdlID0gbmV3IEltYWdlW10ge251bGx9OwotCUxhYmVsIGwgPSBuZXcgTGFiZWwoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiSW1hZ2VUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCQotCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShjb3B5UGFyZW50LCBTV1QuTk9ORSk7Ci0JYy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JYy5zZXRMYXlvdXREYXRhKGRhdGEpOwkKLQkKLQlmaW5hbCBDYW52YXMgY29weUltYWdlQ2FudmFzID0gbmV3IENhbnZhcyhjLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCWNvcHlJbWFnZUNhbnZhcy5zZXRMYXlvdXREYXRhKGRhdGEpOwkKLQkKLQlmaW5hbCBQb2ludCBjb3B5T3JpZ2luID0gbmV3IFBvaW50KDAsIDApOwotCWZpbmFsIFNjcm9sbEJhciBjb3B5SEJhciA9IGNvcHlJbWFnZUNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JY29weUhCYXIuc2V0RW5hYmxlZChmYWxzZSk7CQotCWNvcHlIQmFyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGNvcHlJbWFnZVswXSAhPSBudWxsKSB7Ci0JCQkJaW50IGhTZWxlY3Rpb24gPSBjb3B5SEJhci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpbnQgZGVzdFggPSAtaFNlbGVjdGlvbiAtIGNvcHlPcmlnaW4ueDsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGNvcHlJbWFnZVswXS5nZXRCb3VuZHMoKTsKLQkJCQljb3B5SW1hZ2VDYW52YXMuc2Nyb2xsKGRlc3RYLCAwLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJCWNvcHlPcmlnaW4ueCA9IC1oU2VsZWN0aW9uOwotCQkJfQotCQl9Ci0JfSk7Ci0JZmluYWwgU2Nyb2xsQmFyIGNvcHlWQmFyID0gY29weUltYWdlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JY29weVZCYXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JY29weVZCYXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJaWYgKGNvcHlJbWFnZVswXSAhPSBudWxsKSB7Ci0JCQkJaW50IHZTZWxlY3Rpb24gPSBjb3B5VkJhci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpbnQgZGVzdFkgPSAtdlNlbGVjdGlvbiAtIGNvcHlPcmlnaW4ueTsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGNvcHlJbWFnZVswXS5nZXRCb3VuZHMoKTsKLQkJCQljb3B5SW1hZ2VDYW52YXMuc2Nyb2xsKDAsIGRlc3RZLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJCWNvcHlPcmlnaW4ueSA9IC12U2VsZWN0aW9uOwotCQkJfQotCQl9Ci0JfSk7Ci0JY29weUltYWdlQ2FudmFzLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZihjb3B5SW1hZ2VbMF0gIT0gbnVsbCkgewotCQkJCUdDIGdjID0gZS5nYzsKLQkJCQlnYy5kcmF3SW1hZ2UoY29weUltYWdlWzBdLCBjb3B5T3JpZ2luLngsIGNvcHlPcmlnaW4ueSk7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBjb3B5SW1hZ2VbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIGNsaWVudCA9IGNvcHlJbWFnZUNhbnZhcy5nZXRDbGllbnRBcmVhICgpOwotCQkJCWludCBtYXJnaW5XaWR0aCA9IGNsaWVudC53aWR0aCAtIHJlY3Qud2lkdGg7Ci0JCQkJaWYgKG1hcmdpbldpZHRoID4gMCkgewotCQkJCQlnYy5maWxsUmVjdGFuZ2xlIChyZWN0LndpZHRoLCAwLCBtYXJnaW5XaWR0aCwgY2xpZW50LmhlaWdodCk7Ci0JCQkJfQotCQkJCWludCBtYXJnaW5IZWlnaHQgPSBjbGllbnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQ7Ci0JCQkJaWYgKG1hcmdpbkhlaWdodCA+IDApIHsKLQkJCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCByZWN0LmhlaWdodCwgY2xpZW50LndpZHRoLCBtYXJnaW5IZWlnaHQpOwotCQkJCX0KLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gb3BlbkJ1dHRvbiA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotCW9wZW5CdXR0b24uc2V0VGV4dCgiT3BlbiBJbWFnZSIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCW9wZW5CdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlvcGVuQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nIChzaGVsbCwgU1dULk9QRU4pOwotCQkJZGlhbG9nLnNldFRleHQoIk9wZW4gYW4gaW1hZ2UgZmlsZSBvciBjYW5jZWwiKTsKLQkJCVN0cmluZyBzdHJpbmcgPSBkaWFsb2cub3BlbiAoKTsKLQkJCWlmIChzdHJpbmcgIT0gbnVsbCkgewotCQkJCWlmIChjb3B5SW1hZ2VbMF0gIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvcHlJbWFnZSIpOwotCQkJCQljb3B5SW1hZ2VbMF0uZGlzcG9zZSgpOwotCQkJCX0KLQkJCQljb3B5SW1hZ2VbMF0gPSBuZXcgSW1hZ2UoZS5kaXNwbGF5LCBzdHJpbmcpOwotCQkJCWNvcHlWQmFyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJY29weUhCYXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQljb3B5T3JpZ2luLnggPSAwOyBjb3B5T3JpZ2luLnkgPSAwOwotCQkJCVJlY3RhbmdsZSByZWN0ID0gY29weUltYWdlWzBdLmdldEJvdW5kcygpOwotCQkJCVJlY3RhbmdsZSBjbGllbnQgPSBjb3B5SW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwkJCi0JCQkJY29weUhCYXIuc2V0TWF4aW11bShyZWN0LndpZHRoKTsKLQkJCQljb3B5VkJhci5zZXRNYXhpbXVtKHJlY3QuaGVpZ2h0KTsKLQkJCQljb3B5SEJhci5zZXRUaHVtYihNYXRoLm1pbihyZWN0LndpZHRoLCBjbGllbnQud2lkdGgpKTsKLQkJCQljb3B5VkJhci5zZXRUaHVtYihNYXRoLm1pbihyZWN0LmhlaWdodCwgY2xpZW50LmhlaWdodCkpOwotCQkJCWNvcHlJbWFnZUNhbnZhcy5zY3JvbGwoMCwgMCwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIHRydWUpOwotCQkJCWNvcHlWQmFyLnNldFNlbGVjdGlvbigwKTsKLQkJCQljb3B5SEJhci5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJY29weUltYWdlQ2FudmFzLnJlZHJhdygpOwotCQkJfQotCQl9Ci0JfSk7CQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb3B5UGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGNvcHlJbWFnZVswXSAhPSBudWxsKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10ge2NvcHlJbWFnZVswXS5nZXRJbWFnZURhdGEoKX0sIG5ldyBUcmFuc2ZlcltdIHtJbWFnZVRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gY29weSIpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JZmluYWwgSW1hZ2VbXSBwYXN0ZUltYWdlID0gbmV3IEltYWdlW10ge251bGx9OwkgIAotCWwgPSBuZXcgTGFiZWwocGFzdGVQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIkltYWdlVHJhbnNmZXI6Iik7Ci0JZmluYWwgQ2FudmFzIHBhc3RlSW1hZ2VDYW52YXMgPSBuZXcgQ2FudmFzKHBhc3RlUGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQlwYXN0ZUltYWdlQ2FudmFzLnNldExheW91dERhdGEoZGF0YSk7Ci0JZmluYWwgUG9pbnQgcGFzdGVPcmlnaW4gPSBuZXcgUG9pbnQoMCwgMCk7Ci0JZmluYWwgU2Nyb2xsQmFyIHBhc3RlSEJhciA9IHBhc3RlSW1hZ2VDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCXBhc3RlSEJhci5zZXRFbmFibGVkKGZhbHNlKTsJCi0JcGFzdGVIQmFyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKHBhc3RlSW1hZ2VbMF0gIT0gbnVsbCkgewotCQkJCWludCBoU2VsZWN0aW9uID0gcGFzdGVIQmFyLmdldFNlbGVjdGlvbigpOwotCQkJCWludCBkZXN0WCA9IC1oU2VsZWN0aW9uIC0gcGFzdGVPcmlnaW4ueDsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHBhc3RlSW1hZ2VbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJcGFzdGVJbWFnZUNhbnZhcy5zY3JvbGwoZGVzdFgsIDAsIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCBmYWxzZSk7Ci0JCQkJcGFzdGVPcmlnaW4ueCA9IC1oU2VsZWN0aW9uOwotCQkJfQotCQl9Ci0JfSk7Ci0JZmluYWwgU2Nyb2xsQmFyIHBhc3RlVkJhciA9IHBhc3RlSW1hZ2VDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQlwYXN0ZVZCYXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JcGFzdGVWQmFyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKHBhc3RlSW1hZ2VbMF0gIT0gbnVsbCkgewotCQkJCWludCB2U2VsZWN0aW9uID0gcGFzdGVWQmFyLmdldFNlbGVjdGlvbigpOwotCQkJCWludCBkZXN0WSA9IC12U2VsZWN0aW9uIC0gcGFzdGVPcmlnaW4ueTsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHBhc3RlSW1hZ2VbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJcGFzdGVJbWFnZUNhbnZhcy5zY3JvbGwoMCwgZGVzdFksIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCBmYWxzZSk7Ci0JCQkJcGFzdGVPcmlnaW4ueSA9IC12U2VsZWN0aW9uOwotCQkJfQotCQl9Ci0JfSk7Ci0JcGFzdGVJbWFnZUNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYocGFzdGVJbWFnZVswXSAhPSBudWxsKSB7Ci0JCQkJR0MgZ2MgPSBlLmdjOwotCQkJCWdjLmRyYXdJbWFnZShwYXN0ZUltYWdlWzBdLCBwYXN0ZU9yaWdpbi54LCBwYXN0ZU9yaWdpbi55KTsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHBhc3RlSW1hZ2VbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIGNsaWVudCA9IHBhc3RlSW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQlpbnQgbWFyZ2luV2lkdGggPSBjbGllbnQud2lkdGggLSByZWN0LndpZHRoOwotCQkJCWlmIChtYXJnaW5XaWR0aCA+IDApIHsKLQkJCQkJZ2MuZmlsbFJlY3RhbmdsZShyZWN0LndpZHRoLCAwLCBtYXJnaW5XaWR0aCwgY2xpZW50LmhlaWdodCk7Ci0JCQkJfQotCQkJCWludCBtYXJnaW5IZWlnaHQgPSBjbGllbnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQ7Ci0JCQkJaWYgKG1hcmdpbkhlaWdodCA+IDApIHsKLQkJCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCByZWN0LmhlaWdodCwgY2xpZW50LndpZHRoLCBtYXJnaW5IZWlnaHQpOwotCQkJCX0KLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihwYXN0ZVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CQkKLQkJCUltYWdlRGF0YSBkYXRhID0oSW1hZ2VEYXRhKWNsaXBib2FyZC5nZXRDb250ZW50cyhJbWFnZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCWlmIChwYXN0ZUltYWdlWzBdICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQYXN0ZUltYWdlIik7Ci0JCQkJCXBhc3RlSW1hZ2VbMF0uZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJcGFzdGVJbWFnZVswXSA9IG5ldyBJbWFnZShlLmRpc3BsYXksIGRhdGEpOwotCQkJCXBhc3RlVkJhci5zZXRFbmFibGVkKHRydWUpOwotCQkJCXBhc3RlSEJhci5zZXRFbmFibGVkKHRydWUpOwotCQkJCXBhc3RlT3JpZ2luLnggPSAwOyBwYXN0ZU9yaWdpbi55ID0gMDsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHBhc3RlSW1hZ2VbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIGNsaWVudCA9IHBhc3RlSW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwkJCi0JCQkJcGFzdGVIQmFyLnNldE1heGltdW0ocmVjdC53aWR0aCk7Ci0JCQkJcGFzdGVWQmFyLnNldE1heGltdW0ocmVjdC5oZWlnaHQpOwotCQkJCXBhc3RlSEJhci5zZXRUaHVtYihNYXRoLm1pbihyZWN0LndpZHRoLCBjbGllbnQud2lkdGgpKTsKLQkJCQlwYXN0ZVZCYXIuc2V0VGh1bWIoTWF0aC5taW4ocmVjdC5oZWlnaHQsIGNsaWVudC5oZWlnaHQpKTsKLQkJCQlwYXN0ZUltYWdlQ2FudmFzLnNjcm9sbCgwLCAwLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgdHJ1ZSk7Ci0JCQkJcGFzdGVWQmFyLnNldFNlbGVjdGlvbigwKTsKLQkJCQlwYXN0ZUhCYXIuc2V0U2VsZWN0aW9uKDApOwotCQkJCXBhc3RlSW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIHBhc3RlIik7Ci0JCQl9CQkJCi0JCX0KLQl9KTsJCi19Ci12b2lkIGNyZWF0ZU15VHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCl7Ci0JLy8JTXlUeXBlIFRyYW5zZmVyCi0JLy8gVE9ETwotfQotdm9pZCBjcmVhdGVDb250cm9sVHJhbnNmZXIoQ29tcG9zaXRlIHBhcmVudCl7Ci0JTGFiZWwgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIlRleHQ6Iik7Ci0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ3V0Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdGV4dC5jdXQoKTsKLQkJfQotCX0pOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXRleHQuY29weSgpOwotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXRleHQucGFzdGUoKTsKLQkJfQotCX0pOwotCXRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJDb21ibzoiKTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkN1dCIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWNvbWJvLmN1dCgpOwotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJY29tYm8uY29weSgpOwotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWNvbWJvLnBhc3RlKCk7Ci0JCX0KLQl9KTsKLQljb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5OT05FKTsKLQljb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10geyJJdGVtIDEiLCAiSXRlbSAyIiwgIkl0ZW0gMyIsICJBIGxvbmdlciBJdGVtIn0pOwotCQotCWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJTdHlsZWRUZXh0OiIpOwotCWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNvcHkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzdHlsZWRUZXh0LmNvcHkoKTsKLQkJfQotCX0pOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzdHlsZWRUZXh0LnBhc3RlKCk7Ci0JCX0KLQl9KTsKLQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXN0eWxlZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLX0KLXZvaWQgY3JlYXRlQXZhaWxhYmxlVHlwZXMoQ29tcG9zaXRlIHBhcmVudCl7Ci0JZmluYWwgTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCWxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJHZXQgQXZhaWxhYmxlIFR5cGVzIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbGlzdC5yZW1vdmVBbGwoKTsKLQkJCVN0cmluZ1tdIG5hbWVzID0gY2xpcGJvYXJkLmdldEF2YWlsYWJsZVR5cGVOYW1lcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWxpc3QuYWRkKG5hbWVzW2ldKTsKLQkJCX0KLQkJfQotCX0pOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjZGZjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvTXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNsaXBib2FyZDsKLQotcHVibGljIGNsYXNzIE15VHlwZSB7Ci0JU3RyaW5nIGZpcnN0TmFtZTsKLQlTdHJpbmcgbGFzdE5hbWU7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvTXlUeXBlVHJhbnNmZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGVUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDA5ZTNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGVUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLQotcHVibGljIGNsYXNzIE15VHlwZVRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWVRZUEVOQU1FID0gIm5hbWVfbGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVlUWVBFSUQgPSByZWdpc3RlclR5cGUoTVlUWVBFTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTXlUeXBlVHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHlwZVRyYW5zZmVyKCk7Ci0JCi1wdWJsaWMgc3RhdGljIE15VHlwZVRyYW5zZmVyIGdldEluc3RhbmNlICgpIHsKLQlyZXR1cm4gX2luc3RhbmNlOwotfQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JaWYgKCFjaGVja015VHlwZShvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JfQotCU15VHlwZVtdIG15VHlwZXMgPSAoTXlUeXBlW10pIG9iamVjdDsJCi0JdHJ5IHsKLQkJLy8gd3JpdGUgZGF0YSB0byBhIGJ5dGUgYXJyYXkgYW5kIHRoZW4gYXNrIHN1cGVyIHRvIGNvbnZlcnQgdG8gcE1lZGl1bQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlEYXRhT3V0cHV0U3RyZWFtIHdyaXRlT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG15VHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyAgaSsrKXsKLQkJCWJ5dGVbXSBidWZmZXIgPSBteVR5cGVzW2ldLmZpcnN0TmFtZS5nZXRCeXRlcygpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZShidWZmZXIpOwotCQkJYnVmZmVyID0gbXlUeXBlc1tpXS5maXJzdE5hbWUuZ2V0Qnl0ZXMoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50KGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUoYnVmZmVyKTsKLQkJfQotCQlieXRlW10gYnVmZmVyID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JCXdyaXRlT3V0LmNsb3NlKCk7Ci0JCXN1cGVyLmphdmFUb05hdGl2ZShidWZmZXIsIHRyYW5zZmVyRGF0YSk7CQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKXsJCi0JaWYgKGlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSB7Ci0JCQotCQlieXRlW10gYnVmZmVyID0gKGJ5dGVbXSlzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCi0JCU15VHlwZVtdIG15RGF0YSA9IG5ldyBNeVR5cGVbMF07Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIpOwotCQkJRGF0YUlucHV0U3RyZWFtIHJlYWRJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pOwotCQkJd2hpbGUocmVhZEluLmF2YWlsYWJsZSgpID4gMjApIHsKLQkJCQlNeVR5cGUgZGF0dW0gPSBuZXcgTXlUeXBlKCk7Ci0JCQkJaW50IHNpemUgPSByZWFkSW4ucmVhZEludCgpOwotCQkJCWJ5dGVbXSBuYW1lID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQkJcmVhZEluLnJlYWQobmFtZSk7Ci0JCQkJZGF0dW0uZmlyc3ROYW1lID0gbmV3IFN0cmluZyhuYW1lKTsKLQkJCQlzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCQluYW1lID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQkJcmVhZEluLnJlYWQobmFtZSk7Ci0JCQkJZGF0dW0ubGFzdE5hbWUgPSBuZXcgU3RyaW5nKG5hbWUpOwotCQkJCU15VHlwZVtdIG5ld015RGF0YSA9IG5ldyBNeVR5cGVbbXlEYXRhLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobXlEYXRhLCAwLCBuZXdNeURhdGEsIDAsIG15RGF0YS5sZW5ndGgpOwotCQkJCW5ld015RGF0YVtteURhdGEubGVuZ3RoXSA9IGRhdHVtOwotCQkJCW15RGF0YSA9IG5ld015RGF0YTsKLQkJCX0KLQkJCXJlYWRJbi5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG15RGF0YTsKLQl9Ci0KLQlyZXR1cm4gbnVsbDsKLX0KLXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKXsKLQlyZXR1cm4gbmV3IFN0cmluZ1tde01ZVFlQRU5BTUV9OwotfQotcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKXsKLQlyZXR1cm4gbmV3IGludFtdIHtNWVRZUEVJRH07Ci19Ci1ib29sZWFuIGNoZWNrTXlUeXBlKE9iamVjdCBvYmplY3QpIHsKLQlpZiAob2JqZWN0ID09IG51bGwgfHwgIShvYmplY3QgaW5zdGFuY2VvZiBNeVR5cGVbXSkgfHwgKChNeVR5cGVbXSlvYmplY3QpLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7Ci0JTXlUeXBlW10gbXlUeXBlcyA9IChNeVR5cGVbXSlvYmplY3Q7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBteVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChteVR5cGVzW2ldID09IG51bGwgfHwgCi0JCQlteVR5cGVzW2ldLmZpcnN0TmFtZSA9PSBudWxsIHx8IAotCQkJbXlUeXBlc1tpXS5maXJzdE5hbWUubGVuZ3RoKCkgPT0gMCB8fAotCQkJbXlUeXBlc1tpXS5sYXN0TmFtZSA9PSBudWxsIHx8Ci0JCQlteVR5cGVzW2ldLmxhc3ROYW1lLmxlbmd0aCgpID09IDApIHJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0JcmV0dXJuIGNoZWNrTXlUeXBlKG9iamVjdCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9BbGlnbmFibGVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0FsaWduYWJsZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNzVlZTIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0FsaWduYWJsZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi0vKioKLSAqIDxjb2RlPkFsaWduYWJsZVRhYjwvY29kZT4gaXMgdGhlIGFic3RyYWN0Ci0gKiBzdXBlcmNsYXNzIG9mIGV4YW1wbGUgY29udHJvbHMgdGhhdCBjYW4gYmUKLSAqIGFsaWduZWQuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFsaWduYWJsZVRhYiBleHRlbmRzIFRhYiB7Ci0KLQkvKiBBbGlnbm1lbnQgQ29udHJvbHMgKi8KLQlCdXR0b24gbGVmdEJ1dHRvbiwgcmlnaHRCdXR0b24sIGNlbnRlckJ1dHRvbjsKLQotCS8qIEFsaWdubWVudCBHcm91cCAqLwotCUdyb3VwIGFsaWdubWVudEdyb3VwOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUFsaWduYWJsZVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4gCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJYWxpZ25tZW50R3JvdXAgPSBuZXcgR3JvdXAgKG90aGVyR3JvdXAsIFNXVC5OT05FKTsKLQkJYWxpZ25tZW50R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWFsaWdubWVudEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfAotCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlhbGlnbm1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQWxpZ25tZW50IikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCWxlZnRCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJbGVmdEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGVmdCIpKTsKLQkJY2VudGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNlbnRlckJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDZW50ZXIiKSk7Ci0JCXJpZ2h0QnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCXJpZ2h0QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSaWdodCIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICghKChCdXR0b24pIGV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uICgpKSByZXR1cm47Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKTsKLQkJCX0KLQkJfTsKLQkJbGVmdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQljZW50ZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJcmlnaHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlXaWRnZXQgW10gd2lkZ2V0cyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlpZiAod2lkZ2V0cy5sZW5ndGggIT0gMCkgewotCQkJbGVmdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5MRUZUKSAhPSAwKTsKLQkJCWNlbnRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5DRU5URVIpICE9IDApOwotCQkJcmlnaHRCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQnJvd3NlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQnJvd3NlclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjlmMjY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0Jyb3dzZXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIEJyb3dzZXJUYWIgZXh0ZW5kcyBUYWIgewotCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlCcm93c2VyIGJyb3dzZXI7Ci0JR3JvdXAgYnJvd3Nlckdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gbW96aWxsYUJ1dHRvbjsKLQkKLQlTdHJpbmcgZXJyb3JNZXNzYWdlLCBsYXN0VGV4dCwgbGFzdFVybDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQnJvd3NlclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCXZvaWQgY3JlYXRlQmFja2dyb3VuZE1vZGVHcm91cCAoKSB7Ci0JCS8vIEJyb3dzZXIgZG9lcyBub3QgbmVlZCBhIGJhY2tncm91bmQgbW9kZSBncm91cC4KLQl9Ci0JCi0Jdm9pZCBjcmVhdGVDb2xvckFuZEZvbnRHcm91cCAoKSB7Ci0JCS8vIEJyb3dzZXIgZG9lcyBub3QgbmVlZCBhIGNvbG9yIGFuZCBmb250IGdyb3VwLgotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGJyb3dzZXIgKi8KLQkJYnJvd3Nlckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJYnJvd3Nlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlicm93c2VyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJYnJvd3Nlckdyb3VwLnNldFRleHQgKCJCcm93c2VyIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKG1vemlsbGFCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTU9aSUxMQTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIgKGJyb3dzZXJHcm91cCwgc3R5bGUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7IC8vWFBDT00gZXJyb3IKLQkJCXRyeSB7Ci0JCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyIChicm93c2VyR3JvdXAsIHN0eWxlICZ+IFNXVC5NT1pJTExBKTsKLQkJCX0gY2F0Y2ggKFNXVEVycm9yIGUyKSB7IC8vIFVuc3VwcG9ydGVkIHBsYXRmb3JtCi0JCQkJZXJyb3JNZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fV0FSTklORyB8IFNXVC5PSyk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZShDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTW96aWxsYU5vdEZvdW5kIiwgbmV3IFN0cmluZyBbXSB7ZS5nZXRNZXNzYWdlKCl9KSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0KLQkJaWYgKGxhc3RVcmwgIT0gbnVsbCkgewotCQkJYnJvd3Nlci5zZXRVcmwobGFzdFVybCk7Ci0JCX0gZWxzZSBpZiAobGFzdFRleHQgIT0gbnVsbCkgewotCQkJYnJvd3Nlci5zZXRUZXh0KGxhc3RUZXh0KTsKLQkJfSBlbHNlIHsKLQkgICAgICAgIElucHV0U3RyZWFtIGh0bWxTdHJlYW09IENvbnRyb2xFeGFtcGxlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImJyb3dzZXItY29udGVudC5odG1sIik7Ci0JCQlCdWZmZXJlZFJlYWRlciBicj0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihodG1sU3RyZWFtKSk7Ci0JCQlTdHJpbmdCdWZmZXIgc2I9IG5ldyBTdHJpbmdCdWZmZXIoMzAwKTsKLQkJCXRyeSB7Ci0JCQkJaW50IHJlYWQ9IDA7Ci0JCQkJd2hpbGUgKChyZWFkPSBici5yZWFkKCkpICE9IC0xKQotCQkJCQlzYi5hcHBlbmQoKGNoYXIpIHJlYWQpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWxvZyhlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWJyLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlsb2coZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyB0ZXh0PSBzYi50b1N0cmluZygpOwotCQkJYnJvd3Nlci5zZXRUZXh0KHRleHQpOwotCQl9Ci0JCWxhc3RUZXh0ID0gbGFzdFVybCA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJPdGhlciIgZ3JvdXAuICBUaGlzIGlzIHR5cGljYWxseQotCSAqIGEgY2hpbGQgb2YgdGhlICJDb250cm9sIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQliYWNrZ3JvdW5kSW1hZ2VCdXR0b24uZGlzcG9zZSAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlNpemUiIGdyb3VwLiAgVGhlICJTaXplIiBncm91cCBjb250YWlucwotCSAqIGNvbnRyb2xzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBzaXplIG9mCi0JICogdGhlIGV4YW1wbGUgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZVNpemVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVNpemVHcm91cCAoKTsKLQkJCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSBmb3IgQnJvd3NlciB0byBmaWxsIGhvcml6b250YWxseSAmIHZlcnRpY2FsbHkuICovCi0JCWZpbGxIQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWZpbGxWQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJbW96aWxsYUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1vemlsbGFCdXR0b24uc2V0VGV4dCAoIlNXVC5NT1pJTExBIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChmaW5hbCBUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8qCi0JCSAqIEFkZCBhIHNlbGVjdGlvbiBsaXN0ZW5lciB0byB0aGUgdGFiRm9sZGVyIHRvIGJyaW5nIHVwIGEKLQkJICogZGlhbG9nIGlmIHRoaXMgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgQnJvd3Nlci4KLQkJICovCi0JCXRhYkZvbGRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZXJyb3JNZXNzYWdlICE9IG51bGwgJiYgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpWzBdLmdldFRleHQoKS5lcXVhbHMoZ2V0VGFiVGV4dCgpKSkgewotCQkJCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULk9LKTsKLQkJCQkJZGlhbG9nLnNldE1lc3NhZ2UoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJyb3dzZXJOb3RGb3VuZCIsIG5ldyBTdHJpbmcgW10ge2Vycm9yTWVzc2FnZX0pKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgZGlzcG9zZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJLyogc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBCcm93c2VyIGlmIGFwcGxpY2FibGUgKi8KLQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHVybCA9IGJyb3dzZXIuZ2V0VXJsKCk7Ci0JCQlpZiAodXJsLmxlbmd0aCgpID4gMCAmJiAhdXJsLmVxdWFscygiYWJvdXQ6YmxhbmsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbGFzdFVybCA9IHVybDsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBicm93c2VyLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJbGFzdFRleHQgPSB0ZXh0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5kaXNwb3NlRXhhbXBsZVdpZGdldHMoKTsJCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGVudHMoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2I9IG5ldyBTdHJpbmdCdWZmZXIoMzAwKTsKLQkJdHJ5IHsKLQkJCWludCByZWFkPSAwOwotCQkJd2hpbGUgKChyZWFkPSBici5yZWFkKCkpICE9IC0xKQotCQkJCXNiLmFwcGVuZCgoY2hhcikgcmVhZCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlici5jbG9zZSgpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgY3VzdG9tIGV2ZW50IG5hbWVzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBjdXN0b20gZXZlbnQgbmFtZXMKLQkgKi8KLQlTdHJpbmcgW10gZ2V0Q3VzdG9tRXZlbnROYW1lcyAoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiQ2xvc2VXaW5kb3dMaXN0ZW5lciIsICJMb2NhdGlvbkxpc3RlbmVyIiwgIk9wZW5XaW5kb3dMaXN0ZW5lciIsCi0JCQkJIlByb2dyZXNzTGlzdGVuZXIiLCAiU3RhdHVzVGV4dExpc3RlbmVyIiwgIlRpdGxlTGlzdGVuZXIiLCAiVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIn07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgcmV0dXJuIG5ldyBXaWRnZXQgW10ge2Jyb3dzZXJ9OwotCQlyZXR1cm4gc3VwZXIuZ2V0RXhhbXBsZVdpZGdldHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRleHQiLCAiVXJsIiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiQnJvd3NlciI7Ci0JfQotCQotCS8qKgotCSAqIEhvb2tzIHRoZSBjdXN0b20gbGlzdGVuZXIgc3BlY2lmaWVkIGJ5IGV2ZW50TmFtZS4KLQkgKi8KLQl2b2lkIGhvb2tDdXN0b21MaXN0ZW5lciAoZmluYWwgU3RyaW5nIGV2ZW50TmFtZSkgewotCQlpZiAoYnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChldmVudE5hbWUgPT0gIkNsb3NlV2luZG93TGlzdGVuZXIiKSB7Ci0JCQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIgKG5ldyBDbG9zZVdpbmRvd0xpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBjbG9zZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmIChldmVudE5hbWUgPT0gIkxvY2F0aW9uTGlzdGVuZXIiKSB7Ci0JCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIgKG5ldyBMb2NhdGlvbkxpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUgKyAiLmNoYW5nZWQiLCBldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUgKyAiLmNoYW5naW5nIiwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmIChldmVudE5hbWUgPT0gIk9wZW5XaW5kb3dMaXN0ZW5lciIpIHsKLQkJCWJyb3dzZXIuYWRkT3BlbldpbmRvd0xpc3RlbmVyIChuZXcgT3BlbldpbmRvd0xpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGV2ZW50TmFtZSA9PSAiUHJvZ3Jlc3NMaXN0ZW5lciIpIHsKLQkJCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lciAobmV3IFByb2dyZXNzTGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSArICIuY2hhbmdlZCIsIGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUgKyAiLmNvbXBsZXRlZCIsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoZXZlbnROYW1lID09ICJTdGF0dXNUZXh0TGlzdGVuZXIiKSB7Ci0JCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lciAobmV3IFN0YXR1c1RleHRMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoZXZlbnROYW1lID09ICJUaXRsZUxpc3RlbmVyIikgewotCQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyIChuZXcgVGl0bGVMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChUaXRsZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGV2ZW50TmFtZSA9PSAiVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIikgewotCQkJYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIgKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUgKyAiLmhpZGUiLCBldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUgKyAiLnNob3ciLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlib29sZWFuIHJ0bFN1cHBvcnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQltb3ppbGxhQnV0dG9uLnNldFNlbGVjdGlvbiAoYnJvd3NlciA9PSBudWxsID8gZmFsc2UgOiAoYnJvd3Nlci5nZXRTdHlsZSAoKSAmIFNXVC5NT1pJTExBKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoYnJvd3NlciA9PSBudWxsID8gZmFsc2UgOiAoYnJvd3Nlci5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0J1dHRvblRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQnV0dG9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjMTFmODIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQnV0dG9uVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi0vKioKLSAqIDxjb2RlPkJ1dHRvblRhYjwvY29kZT4gaXMgdGhlIGNsYXNzIHRoYXQKLSAqIGRlbW9uc3RyYXRlcyBTV1QgYnV0dG9ucy4KLSAqLwotY2xhc3MgQnV0dG9uVGFiIGV4dGVuZHMgQWxpZ25hYmxlVGFiIHsKLQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JQnV0dG9uIGJ1dHRvbjEsIGJ1dHRvbjIsIGJ1dHRvbjMsIGJ1dHRvbjQsIGJ1dHRvbjUsIGJ1dHRvbjYsIGJ1dHRvbjcsIGJ1dHRvbjgsIGJ1dHRvbjk7Ci0JR3JvdXAgdGV4dEJ1dHRvbkdyb3VwLCBpbWFnZUJ1dHRvbkdyb3VwLCBpbWFnZXRleHRCdXR0b25Hcm91cDsKLQotCS8qIEFsaWdubWVudCB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiQ29udHJvbCIgZ3JvdXAgKi8KLQlCdXR0b24gdXBCdXR0b24sIGRvd25CdXR0b247Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHB1c2hCdXR0b24sIGNoZWNrQnV0dG9uLCByYWRpb0J1dHRvbiwgdG9nZ2xlQnV0dG9uLCBhcnJvd0J1dHRvbiwgZmxhdEJ1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQnV0dG9uVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjb250cm9scyAqLwotCQl1cEJ1dHRvbiA9IG5ldyBCdXR0b24gKGFsaWdubWVudEdyb3VwLCBTV1QuUkFESU8pOwotCQl1cEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVXAiKSk7Ci0JCWRvd25CdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJZG93bkJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRG93biIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCEoKEJ1dHRvbikgZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkgcmV0dXJuOwotCQkJCXNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCk7Ci0JCQl9Ci0JCX07Ci0JCXVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0ZXh0IGJ1dHRvbnMgKi8KLQkJdGV4dEJ1dHRvbkdyb3VwID0gbmV3IEdyb3VwKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJdGV4dEJ1dHRvbkdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJdGV4dEJ1dHRvbkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRleHRCdXR0b25Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGV4dF9CdXR0b25zIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIGJ1dHRvbnMgKi8KLQkJaW1hZ2VCdXR0b25Hcm91cCA9IG5ldyBHcm91cChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWltYWdlQnV0dG9uR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlpbWFnZUJ1dHRvbkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdlQnV0dG9uR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlX0J1dHRvbnMiKSk7Ci0KLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBpbWFnZSBhbmQgdGV4dCBidXR0b25zICovCi0JCWltYWdldGV4dEJ1dHRvbkdyb3VwID0gbmV3IEdyb3VwKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW1hZ2V0ZXh0QnV0dG9uR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlpbWFnZXRleHRCdXR0b25Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlpbWFnZXRleHRCdXR0b25Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VfVGV4dF9CdXR0b25zIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAocHVzaEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlBVU0g7Ci0JCWlmIChjaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkNIRUNLOwotCQlpZiAocmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5SQURJTzsKLQkJaWYgKHRvZ2dsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlRPR0dMRTsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5GTEFUOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAobGVmdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkxFRlQ7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlJJR0hUOwotCQlpZiAoYXJyb3dCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXN0eWxlIHw9IFNXVC5BUlJPVzsgCi0JCQlpZiAodXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5VUDsKLQkJCWlmIChkb3duQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuRE9XTjsKLQkJfSBlbHNlIHsKLQkJCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5DRU5URVI7CQkJCi0JCX0KLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJYnV0dG9uMSA9IG5ldyBCdXR0b24odGV4dEJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjEuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT25lIikpOwotCQlidXR0b24yID0gbmV3IEJ1dHRvbih0ZXh0QnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uMi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUd28iKSk7Ci0JCWJ1dHRvbjMgPSBuZXcgQnV0dG9uKHRleHRCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b24zLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRocmVlIikpOwotCQlidXR0b240ID0gbmV3IEJ1dHRvbihpbWFnZUJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjQuc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWJ1dHRvbjUgPSBuZXcgQnV0dG9uKGltYWdlQnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uNS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWJ1dHRvbjYgPSBuZXcgQnV0dG9uKGltYWdlQnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uNi5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJYnV0dG9uNyA9IG5ldyBCdXR0b24oaW1hZ2V0ZXh0QnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uNy5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmUiKSk7Ci0JCWJ1dHRvbjcuc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWJ1dHRvbjggPSBuZXcgQnV0dG9uKGltYWdldGV4dEJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjguc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHdvIikpOwotCQlidXR0b244LnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJYnV0dG9uOSA9IG5ldyBCdXR0b24oaW1hZ2V0ZXh0QnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uOS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaHJlZSIpKTsKLQkJYnV0dG9uOS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlwdXNoQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJcHVzaEJ1dHRvbi5zZXRUZXh0KCJTV1QuUFVTSCIpOwotCQljaGVja0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNoZWNrQnV0dG9uLnNldFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0ICgiU1dULlJBRElPIik7Ci0JCXRvZ2dsZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvZ2dsZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlRPR0dMRSIpOwotCQlhcnJvd0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWFycm93QnV0dG9uLnNldFRleHQgKCJTV1QuQVJST1ciKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtidXR0b24xLCBidXR0b24yLCBidXR0b24zLCBidXR0b240LCBidXR0b241LCBidXR0b242LCBidXR0b243LCBidXR0b244LCBidXR0b245fTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJHcmF5ZWQiLCAiU2VsZWN0aW9uIiwgIlRleHQiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJCdXR0b24iOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKSB7Ci0JCWludCBhbGlnbm1lbnQgPSAwOwotCQlpZiAobGVmdEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5MRUZUOwotCQlpZiAoY2VudGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULlJJR0hUOwotCQlpZiAodXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuVVA7Ci0JCWlmIChkb3duQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkRPV047Ci0JCWJ1dHRvbjEuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b24yLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uMy5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWJ1dHRvbjQuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b241LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uNi5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWJ1dHRvbjcuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b244LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uOS5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaWYgKGFycm93QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJdXBCdXR0b24uc2V0RW5hYmxlZCAodHJ1ZSk7Ci0JCQljZW50ZXJCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJZG93bkJ1dHRvbi5zZXRFbmFibGVkICh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXVwQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJCWNlbnRlckJ1dHRvbi5zZXRFbmFibGVkICh0cnVlKTsKLQkJCWRvd25CdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQl9Ci0JCXVwQnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuVVApICE9IDApOwotCQlkb3duQnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuRE9XTikgIT0gMCk7Ci0JCXB1c2hCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5QVVNIKSAhPSAwKTsKLQkJY2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5DSEVDSykgIT0gMCk7Ci0JCXJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuUkFESU8pICE9IDApOwotCQl0b2dnbGVCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5UT0dHTEUpICE9IDApOwotCQlhcnJvd0J1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULkFSUk9XKSAhPSAwKTsKLQkJZmxhdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULkZMQVQpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NDb21ib1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0NvbWJvVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmJiZjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0NvbWJvVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBDQ29tYm9UYWIgZXh0ZW5kcyBUYWIgewotCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlDQ29tYm8gY29tYm8xOwotCUdyb3VwIGNvbWJvR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBmbGF0QnV0dG9uLCByZWFkT25seUJ1dHRvbjsKLQkKLQlzdGF0aWMgU3RyaW5nIFtdIExpc3REYXRhID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMCIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8xIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzIiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMyIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV80IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzUiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNiIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV83IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzgiKX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ0NvbWJvVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBjb21ibyBib3ggKi8KLQkJY29tYm9Hcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvbWJvR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWNvbWJvR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJY29tYm9Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tX0NvbWJvIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQljb21ibzEgPSBuZXcgQ0NvbWJvIChjb21ib0dyb3VwLCBzdHlsZSk7Ci0JCWNvbWJvMS5zZXRJdGVtcyAoTGlzdERhdGEpOwotCQlpZiAoTGlzdERhdGEubGVuZ3RoID49IDMpIHsKLQkJCWNvbWJvMS5zZXRUZXh0KExpc3REYXRhIFsyXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2NvbWJvMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiRWRpdGFibGUiLCAiSXRlbXMiLCAiU2VsZWN0aW9uIiwgIlRleHQiLCAiVGV4dExpbWl0IiwgIlRvb2xUaXBUZXh0IiwgIlZpc2libGVJdGVtQ291bnQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJDQ29tYm8iOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWZsYXRCdXR0b24uc2V0U2VsZWN0aW9uICgoY29tYm8xLmdldFN0eWxlICgpICYgU1dULkZMQVQpICE9IDApOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbWJvMS5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NMYWJlbFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0xhYmVsVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNjhjNTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0xhYmVsVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBDTGFiZWxUYWIgZXh0ZW5kcyBBbGlnbmFibGVUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JQ0xhYmVsIGxhYmVsMSwgbGFiZWwyLCBsYWJlbDM7Ci0JR3JvdXAgdGV4dExhYmVsR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHNoYWRvd0luQnV0dG9uLCBzaGFkb3dPdXRCdXR0b24sIHNoYWRvd05vbmVCdXR0b247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUNMYWJlbFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCBsYWJlbHMgKi8KLQkJdGV4dExhYmVsR3JvdXAgPSBuZXcgR3JvdXAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQl0ZXh0TGFiZWxHcm91cC5zZXRMYXlvdXQgKGdyaWRMYXlvdXQpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQl0ZXh0TGFiZWxHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0ZXh0TGFiZWxHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tX0xhYmVscyIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChzaGFkb3dJbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfSU47Ci0JCWlmIChzaGFkb3dOb25lQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19OT05FOwotCQlpZiAoc2hhZG93T3V0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19PVVQ7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWxhYmVsMSA9IG5ldyBDTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsMS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmUiKSk7Ci0JCWxhYmVsMS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWxhYmVsMiA9IG5ldyBDTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsMi5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWxhYmVsMyA9IG5ldyBDTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsMy5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJFeGFtcGxlX3N0cmluZyIpICsgIlxuIiArIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmVfVHdvX1RocmVlIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlzaGFkb3dOb25lQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19OT05FIik7Ci0JCXNoYWRvd0luQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfSU4iKTsKLQkJc2hhZG93T3V0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX09VVCIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtsYWJlbDEsIGxhYmVsMiwgbGFiZWwzfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUZXh0IiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiQ0xhYmVsIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCkgewotCQlpbnQgYWxpZ25tZW50ID0gMDsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJaWYgKGNlbnRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5SSUdIVDsKLQkJbGFiZWwxLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwyLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwzLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlsZWZ0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5MRUZUKSAhPSAwKTsKLQkJY2VudGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5DRU5URVIpICE9IDApOwotCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0lOKSAhPSAwKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfT1VUKSAhPSAwKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChsYWJlbDEuZ2V0U3R5bGUgKCkgJiAoU1dULlNIQURPV19JTiB8IFNXVC5TSEFET1dfT1VUKSkgPT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ1RhYkZvbGRlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ1RhYkZvbGRlclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWRhYTkxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NUYWJGb2xkZXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBDVGFiRm9sZGVyVGFiIGV4dGVuZHMgVGFiIHsKLQlpbnQgbGFzdFNlbGVjdGVkVGFiID0gMDsKLQkKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUNUYWJGb2xkZXIgdGFiRm9sZGVyMTsKLQlHcm91cCB0YWJGb2xkZXJHcm91cCwgaXRlbUdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gdG9wQnV0dG9uLCBib3R0b21CdXR0b24sIGZsYXRCdXR0b24sIGNsb3NlQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBDVGFiSXRlbXMxID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDVGFiSXRlbTFfMCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDVGFiSXRlbTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDVGFiSXRlbTFfMiIpfTsKLQotCS8qIENvbnRyb2xzIGFuZCByZXNvdXJjZXMgYWRkZWQgdG8gdGhlICJGb250cyIgZ3JvdXAgKi8KLQlzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9GT1JFR1JPVU5EX0NPTE9SID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9CQUNLR1JPVU5EX0NPTE9SID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IElURU1fRk9OVCA9IDU7Ci0JQ29sb3Igc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yLCBzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3I7Ci0JRm9udCBpdGVtRm9udDsKLQkKLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIHNpbXBsZVRhYkJ1dHRvbiwgc2luZ2xlVGFiQnV0dG9uLCBpbWFnZUJ1dHRvbiwgc2hvd01pbkJ1dHRvbiwgc2hvd01heEJ1dHRvbiwgdW5zZWxlY3RlZENsb3NlQnV0dG9uLCB1bnNlbGVjdGVkSW1hZ2VCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ1RhYkZvbGRlclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb2xvcnMgYW5kIEZvbnRzIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbG9yQW5kRm9udEdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29sb3JBbmRGb250R3JvdXAoKTsKLQkJCi0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTZWxlY3Rpb25fRm9yZWdyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2VsZWN0aW9uX0JhY2tncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW1fRm9udCIpKTsKLQotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgc2VsZWN0aW9uQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yICE9IG51bGwpIHNlbGVjdGlvbkZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb250ICE9IG51bGwpIGl0ZW1Gb250LmRpc3Bvc2UoKTsKLQkJCQlzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCXNlbGVjdGlvbkZvcmVncm91bmRDb2xvciA9IG51bGw7CQkJCi0JCQkJaXRlbUZvbnQgPSBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQl2b2lkIGNoYW5nZUZvbnRPckNvbG9yKGludCBpbmRleCkgewotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIFNFTEVDVElPTl9GT1JFR1JPVU5EX0NPTE9SOiB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBzZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGFiRm9sZGVyMS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JCQkJY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yOwotCQkJCXNlbGVjdGlvbkZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCQljYXNlIFNFTEVDVElPTl9CQUNLR1JPVU5EX0NPTE9SOiB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGFiRm9sZGVyMS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCk7Ci0JCQkJY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gc2VsZWN0aW9uQmFja2dyb3VuZENvbG9yOwotCQkJCXNlbGVjdGlvbkJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRTZWxlY3Rpb25CYWNrZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCQljYXNlIElURU1fRk9OVDogewotCQkJCUZvbnQgb2xkRm9udCA9IGl0ZW1Gb250OwotCQkJCWlmIChvbGRGb250ID09IG51bGwpIG9sZEZvbnQgPSB0YWJGb2xkZXIxLmdldEl0ZW0gKDApLmdldEZvbnQgKCk7Ci0JCQkJZm9udERpYWxvZy5zZXRGb250TGlzdChvbGRGb250LmdldEZvbnREYXRhKCkpOwotCQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuICgpOwotCQkJCWlmIChmb250RGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkRm9udCA9IGl0ZW1Gb250OwotCQkJCWl0ZW1Gb250ID0gbmV3IEZvbnQgKGRpc3BsYXksIGZvbnREYXRhKTsKLQkJCQlzZXRJdGVtRm9udCAoKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3VwZXIuY2hhbmdlRm9udE9yQ29sb3IoaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJc2ltcGxlVGFiQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc2ltcGxlVGFiQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfU2ltcGxlX1RhYnMiKSk7Ci0JCXNpbXBsZVRhYkJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXNpbXBsZVRhYkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0U2ltcGxlVGFicygpOwotCQkJfQotCQl9KTsKLQkJCQkKLQkJc2luZ2xlVGFiQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc2luZ2xlVGFiQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfU2luZ2xlX1RhYnMiKSk7Ci0JCXNpbmdsZVRhYkJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlzaW5nbGVUYWJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFNpbmdsZVRhYnMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaG93TWluQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc2hvd01pbkJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2V0X01pbl9WaXNpYmxlIikpOwotCQlzaG93TWluQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXNob3dNaW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldE1pbmltaXplVmlzaWJsZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNob3dNYXhCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzaG93TWF4QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfTWF4X1Zpc2libGUiKSk7Ci0JCXNob3dNYXhCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJc2hvd01heEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0TWF4aW1pemVWaXNpYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbWFnZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2V0X0ltYWdlIikpOwotCQlpbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0SW1hZ2VzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdW5zZWxlY3RlZEltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJdW5zZWxlY3RlZEltYWdlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfVW5zZWxlY3RlZF9JbWFnZV9WaXNpYmxlIikpOwotCQl1bnNlbGVjdGVkSW1hZ2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl1bnNlbGVjdGVkSW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFVuc2VsZWN0ZWRJbWFnZVZpc2libGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXVuc2VsZWN0ZWRDbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXVuc2VsZWN0ZWRDbG9zZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2V0X1Vuc2VsZWN0ZWRfQ2xvc2VfVmlzaWJsZSIpKTsKLQkJdW5zZWxlY3RlZENsb3NlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJdW5zZWxlY3RlZENsb3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRVbnNlbGVjdGVkQ2xvc2VWaXNpYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgQ1RhYkZvbGRlciAqLwotCQl0YWJGb2xkZXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl0YWJGb2xkZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0YWJGb2xkZXJHcm91cC5zZXRUZXh0ICgiQ1RhYkZvbGRlciIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHRvcEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5UT1A7Ci0JCWlmIChib3R0b21CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9UVE9NOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKGNsb3NlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkNMT1NFOwotCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXRhYkZvbGRlcjEgPSBuZXcgQ1RhYkZvbGRlciAodGFiRm9sZGVyR3JvdXAsIHN0eWxlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBDVGFiSXRlbXMxLmxlbmd0aDsgaSsrKSB7Ci0JCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlcjEsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChDVGFiSXRlbXMxW2ldKTsKLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHRhYkZvbGRlcjEsIFNXVC5XUkFQIHwgU1dULk1VTFRJKTsKLQkJCXRleHQuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ1RhYkl0ZW1fY29udGVudCIpICsgIjogIiArIGkpOwotCQkJaXRlbS5zZXRDb250cm9sKHRleHQpOwotCQl9Ci0JCXRhYkZvbGRlcjEuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlsYXN0U2VsZWN0ZWRUYWIgPSB0YWJGb2xkZXIxLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQl9Ci0JCX0pOwotCQl0YWJGb2xkZXIxLnNldFNlbGVjdGlvbihsYXN0U2VsZWN0ZWRUYWIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQl0b3BCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQl0b3BCdXR0b24uc2V0VGV4dCAoIlNXVC5UT1AiKTsKLQkJdG9wQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYm90dG9tQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJYm90dG9tQnV0dG9uLnNldFRleHQgKCJTV1QuQk9UVE9NIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCQlmbGF0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZmxhdEJ1dHRvbi5zZXRUZXh0ICgiU1dULkZMQVQiKTsKLQkJY2xvc2VCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljbG9zZUJ1dHRvbi5zZXRUZXh0ICgiU1dULkNMT1NFIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgY3VzdG9tIGV2ZW50IG5hbWVzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBjdXN0b20gZXZlbnQgbmFtZXMKLQkgKi8KLQlTdHJpbmcgW10gZ2V0Q3VzdG9tRXZlbnROYW1lcyAoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiQ1RhYkZvbGRlckV2ZW50In07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQlyZXR1cm4gdGFiRm9sZGVyMS5nZXRJdGVtcygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHt0YWJGb2xkZXIxfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiQ1RhYkZvbGRlciI7Ci0JfQotCi0JLyoqCi0JICogSG9va3MgdGhlIGN1c3RvbSBsaXN0ZW5lciBzcGVjaWZpZWQgYnkgZXZlbnROYW1lLgotCSAqLwotCXZvaWQgaG9va0N1c3RvbUxpc3RlbmVyIChmaW5hbCBTdHJpbmcgZXZlbnROYW1lKSB7Ci0JCWlmIChldmVudE5hbWUgPT0gIkNUYWJGb2xkZXJFdmVudCIpIHsKLQkJCXRhYkZvbGRlcjEuYWRkQ1RhYkZvbGRlcjJMaXN0ZW5lciAobmV3IENUYWJGb2xkZXIyQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2xvc2UgKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciwgYmFja2dyb3VuZCBjb2xvciwgYW5kIGZvbnQKLQkgKiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMgdG8gdGhlaXIgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKiBBbHNvIHNldHMgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgTm9kZSAxCi0JICogVHJlZUl0ZW1zIHRvIGRlZmF1bHQgc2V0dGluZ3MuCi0JICovCi0Jdm9pZCByZXNldENvbG9yc0FuZEZvbnRzICgpIHsKLQkJc3VwZXIucmVzZXRDb2xvcnNBbmRGb250cyAoKTsKLQkJQ29sb3Igb2xkQ29sb3IgPSBzZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3I7Ci0JCXNlbGVjdGlvbkZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldFNlbGVjdGlvbkZvcmVncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCW9sZENvbG9yID0gc2VsZWN0aW9uQmFja2dyb3VuZENvbG9yOwotCQlzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRTZWxlY3Rpb25CYWNrZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlGb250IG9sZEZvbnQgPSBpdGVtRm9udDsKLQkJaXRlbUZvbnQgPSBudWxsOwotCQlzZXRJdGVtRm9udCAoKTsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSgpOwotCQlzZXRTaW1wbGVUYWJzKCk7Ci0JCXNldFNpbmdsZVRhYnMoKTsKLQkJc2V0SW1hZ2VzKCk7Ci0JCXNldE1pbmltaXplVmlzaWJsZSgpOwotCQlzZXRNYXhpbWl6ZVZpc2libGUoKTsKLQkJc2V0VW5zZWxlY3RlZENsb3NlVmlzaWJsZSgpOwotCQlzZXRVbnNlbGVjdGVkSW1hZ2VWaXNpYmxlKCk7Ci0JCXNldFNlbGVjdGlvbkJhY2tncm91bmQgKCk7Ci0JCXNldFNlbGVjdGlvbkZvcmVncm91bmQgKCk7Ci0JCXNldEl0ZW1Gb250ICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzaGFwZSB0aGF0IHRoZSBDVGFiRm9sZGVyIHdpbGwgdXNlIHRvIHJlbmRlciBpdHNlbGYuIAotCSAqLwotCXZvaWQgc2V0U2ltcGxlVGFicyAoKSB7Ci0JCXRhYkZvbGRlcjEuc2V0U2ltcGxlIChzaW1wbGVUYWJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbnVtYmVyIG9mIHRhYnMgdGhhdCB0aGUgQ1RhYkZvbGRlciBzaG91bGQgZGlzcGxheS4KLQkgKi8KLQl2b2lkIHNldFNpbmdsZVRhYnMgKCkgewotCQl0YWJGb2xkZXIxLnNldFNpbmdsZSAoc2luZ2xlVGFiQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotCS8qKgotCSAqIFNldHMgYW4gaW1hZ2UgaW50byBlYWNoIGl0ZW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0SW1hZ2VzICgpIHsKLQkJYm9vbGVhbiBzZXRJbWFnZSA9IGltYWdlQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJQ1RhYkl0ZW0gaXRlbXNbXSA9IHRhYkZvbGRlcjEuZ2V0SXRlbXMgKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzZXRJbWFnZSkgewotCQkJCWl0ZW1zW2ldLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaXRlbXNbaV0uc2V0SW1hZ2UgKG51bGwpOwotCQkJfQotCQl9Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBtaW5pbWl6ZSBidXR0b24KLQkgKi8KLQl2b2lkIHNldE1pbmltaXplVmlzaWJsZSAoKSB7Ci0JCXRhYkZvbGRlcjEuc2V0TWluaW1pemVWaXNpYmxlKHNob3dNaW5CdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgbWF4aW1pemUgYnV0dG9uCi0JICovCi0Jdm9pZCBzZXRNYXhpbWl6ZVZpc2libGUgKCkgewotCQl0YWJGb2xkZXIxLnNldE1heGltaXplVmlzaWJsZShzaG93TWF4QnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGNsb3NlIGJ1dHRvbiBvbiB1bnNlbGVjdGVkIHRhYnMKLQkgKi8KLQl2b2lkIHNldFVuc2VsZWN0ZWRDbG9zZVZpc2libGUgKCkgewotCQl0YWJGb2xkZXIxLnNldFVuc2VsZWN0ZWRDbG9zZVZpc2libGUodW5zZWxlY3RlZENsb3NlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGltYWdlIG9uIHVuc2VsZWN0ZWQgdGFicwotCSAqLwotCXZvaWQgc2V0VW5zZWxlY3RlZEltYWdlVmlzaWJsZSAoKSB7Ci0JCXRhYkZvbGRlcjEuc2V0VW5zZWxlY3RlZEltYWdlVmlzaWJsZSh1bnNlbGVjdGVkSW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiBDVGFiSXRlbSAwLgotCSAqLwotCXZvaWQgc2V0U2VsZWN0aW9uQmFja2dyb3VuZCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGFiRm9sZGVyMS5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKHNlbGVjdGlvbkJhY2tncm91bmRDb2xvcik7Ci0JCX0KLQkJLy8gU2V0IHRoZSBzZWxlY3Rpb24gYmFja2dyb3VuZCBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHNlbGVjdGlvbi4KLQkJQ29sb3IgY29sb3IgPSBzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRhYkZvbGRlcjEuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKFNFTEVDVElPTl9CQUNLR1JPVU5EX0NPTE9SKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGNvbG9ySW1hZ2UoY29sb3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiBDVGFiSXRlbSAwLgotCSAqLwotCXZvaWQgc2V0U2VsZWN0aW9uRm9yZWdyb3VuZCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGFiRm9sZGVyMS5zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKHNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik7Ci0JCX0KLQkJLy8gU2V0IHRoZSBzZWxlY3Rpb24gZm9yZWdyb3VuZCBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIHNlbGVjdGlvbi4KLQkJQ29sb3IgY29sb3IgPSBzZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRhYkZvbGRlcjEuZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKFNFTEVDVElPTl9GT1JFR1JPVU5EX0NPTE9SKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGNvbG9ySW1hZ2UoY29sb3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBvZiBDVGFiSXRlbSAwLgotCSAqLwotCXZvaWQgc2V0SXRlbUZvbnQgKCkgewotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXRhYkZvbGRlcjEuZ2V0SXRlbSAoMCkuc2V0Rm9udCAoaXRlbUZvbnQpOwotCQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvbnQgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb250IG9mIHRoZSBpdGVtLiAqLwotCQlGb250IGZ0ID0gaXRlbUZvbnQ7Ci0JCWlmIChmdCA9PSBudWxsKSBmdCA9IHRhYkZvbGRlcjEuZ2V0SXRlbSAoMCkuZ2V0Rm9udCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKElURU1fRk9OVCk7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChmb250SW1hZ2UoZnQpKTsKLQkJaXRlbS5zZXRGb250KGZ0KTsKLQkJY29sb3JBbmRGb250VGFibGUubGF5b3V0ICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NhbnZhc1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ2FudmFzVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YmZjMGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ2FudmFzVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBDYW52YXNUYWIgZXh0ZW5kcyBUYWIgewotCXN0YXRpYyBmaW5hbCBpbnQgY29sb3JzIFtdID0gewotCQlTV1QuQ09MT1JfUkVELAotCQlTV1QuQ09MT1JfR1JFRU4sCi0JCVNXVC5DT0xPUl9CTFVFLAotCQlTV1QuQ09MT1JfTUFHRU5UQSwKLQkJU1dULkNPTE9SX1lFTExPVywKLQkJU1dULkNPTE9SX0NZQU4sCi0JCVNXVC5DT0xPUl9EQVJLX1JFRCwKLQkJU1dULkNPTE9SX0RBUktfR1JFRU4sCi0JCVNXVC5DT0xPUl9EQVJLX0JMVUUsCi0JCVNXVC5DT0xPUl9EQVJLX01BR0VOVEEsCi0JCVNXVC5DT0xPUl9EQVJLX1lFTExPVywKLQkJU1dULkNPTE9SX0RBUktfQ1lBTgotCX07Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBjYW52YXNTdHJpbmcgPSAiQ2FudmFzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JQ2FudmFzIGNhbnZhczsKLQlHcm91cCBjYW52YXNHcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b24sIG5vQmFja2dyb3VuZEJ1dHRvbiwgbm9Gb2N1c0J1dHRvbiwgCi0Jbm9NZXJnZVBhaW50c0J1dHRvbiwgbm9SZWRyYXdSZXNpemVCdXR0b24sIGRvdWJsZUJ1ZmZlcmVkQnV0dG9uOwotCi0JLyogT3RoZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBjYXJldEJ1dHRvbiwgZmlsbERhbWFnZUJ1dHRvbjsKLQotCWludCBwYWludENvdW50OwotCWludCBjeCwgY3k7Ci0JaW50IG1heFgsIG1heFk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUNhbnZhc1RhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJY2FyZXRCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQljYXJldEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2FyZXQiKSk7Ci0JCWZpbGxEYW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmaWxsRGFtYWdlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxsRGFtYWdlIikpOwotCQkJCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWNhcmV0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDYXJldCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgY2FudmFzIHdpZGdldCAqLwotCQljYW52YXNHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNhbnZhc0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQljYW52YXNHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQljYW52YXNHcm91cC5zZXRUZXh0ICgiQ2FudmFzIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5IX1NDUk9MTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZfU0NST0xMOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKG5vQmFja2dyb3VuZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5OT19CQUNLR1JPVU5EOwotCQlpZiAobm9Gb2N1c0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5OT19GT0NVUzsKLQkJaWYgKG5vTWVyZ2VQYWludHNCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTk9fTUVSR0VfUEFJTlRTOwotCQlpZiAobm9SZWRyYXdSZXNpemVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTk9fUkVEUkFXX1JFU0laRTsKLQkJaWYgKGRvdWJsZUJ1ZmZlcmVkQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkRPVUJMRV9CVUZGRVJFRDsKLQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlwYWludENvdW50ID0gMDsgY3ggPSAwOyBjeSA9IDA7Ci0JCWNhbnZhcyA9IG5ldyBDYW52YXMgKGNhbnZhc0dyb3VwLCBzdHlsZSk7Ci0JCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQlwYWludENvdW50Kys7Ci0JCQkJR0MgZ2MgPSBlLmdjOwotCQkJCWlmIChmaWxsRGFtYWdlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJCQlDb2xvciBjb2xvciA9IGUuZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoY29sb3JzIFtwYWludENvdW50ICUgY29sb3JzLmxlbmd0aF0pOwotCQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJCQkJZ2MuZmlsbFJlY3RhbmdsZShlLngsIGUueSwgZS53aWR0aCwgZS5oZWlnaHQpOwotCQkJCX0KLQkJCQlQb2ludCBzaXplID0gY2FudmFzLmdldFNpemUgKCk7Ci0JCQkJZ2MuZHJhd0FyYyhjeCArIDEsIGN5ICsgMSwgc2l6ZS54IC0gMiwgc2l6ZS55IC0gMiwgMCwgMzYwKTsKLQkJCQlnYy5kcmF3UmVjdGFuZ2xlKGN4ICsgKHNpemUueCAtIDEwKSAvIDIsIGN5ICsgKHNpemUueSAtIDEwKSAvIDIsIDEwLCAxMCk7Ci0JCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudChjYW52YXNTdHJpbmcpOwotCQkJCWdjLmRyYXdTdHJpbmcoY2FudmFzU3RyaW5nLCBjeCArIChzaXplLnggLSBleHRlbnQueCkgLyAyLCBjeSAtIGV4dGVudC55ICsgKHNpemUueSAtIDEwKSAvIDIsIHRydWUpOwotCQkJfQotCQl9KTsKLQkJY2FudmFzLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKLQkJCQlQb2ludCBzaXplID0gY2FudmFzLmdldFNpemUgKCk7Ci0JCQkJbWF4WCA9IHNpemUueCAqIDMgLyAyOyBtYXhZID0gc2l6ZS55ICogMyAvIDI7Ci0JCQkJcmVzaXplU2Nyb2xsQmFycyAoKTsKLQkJCX0KLQkJfSk7Ci0JCVNjcm9sbEJhciBiYXIgPSBjYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlpZiAoYmFyICE9IG51bGwpIHsKLQkJCWhvb2tMaXN0ZW5lcnMgKGJhcik7Ci0JCQliYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2Nyb2xsSG9yaXpvbnRhbCAoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWJhciA9IGNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQlpZiAoYmFyICE9IG51bGwpIHsKLQkJCWhvb2tMaXN0ZW5lcnMgKGJhcik7Ci0JCQliYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2Nyb2xsVmVydGljYWwgKChTY3JvbGxCYXIpZXZlbnQud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJaG9yaXpvbnRhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IX1NDUk9MTCIpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJdmVydGljYWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlZfU0NST0xMIik7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JCW5vQmFja2dyb3VuZEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW5vQmFja2dyb3VuZEJ1dHRvbi5zZXRUZXh0ICgiU1dULk5PX0JBQ0tHUk9VTkQiKTsKLQkJbm9Gb2N1c0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW5vRm9jdXNCdXR0b24uc2V0VGV4dCAoIlNXVC5OT19GT0NVUyIpOwotCQlub01lcmdlUGFpbnRzQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9NZXJnZVBhaW50c0J1dHRvbi5zZXRUZXh0ICgiU1dULk5PX01FUkdFX1BBSU5UUyIpOwotCQlub1JlZHJhd1Jlc2l6ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW5vUmVkcmF3UmVzaXplQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fUkVEUkFXX1JFU0laRSIpOwotCQlkb3VibGVCdWZmZXJlZEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWRvdWJsZUJ1ZmZlcmVkQnV0dG9uLnNldFRleHQgKCJTV1QuRE9VQkxFX0JVRkZFUkVEIik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQlzdXBlci5jcmVhdGVUYWJGb2xkZXJQYWdlICh0YWJGb2xkZXIpOwotCi0JCS8qCi0JCSAqIEFkZCBhIHJlc2l6ZSBsaXN0ZW5lciB0byB0aGUgdGFiRm9sZGVyUGFnZSBzbyB0aGF0Ci0JCSAqIGlmIHRoZSB1c2VyIHR5cGVzIGludG8gdGhlIGV4YW1wbGUgd2lkZ2V0IHRvIGNoYW5nZQotCQkgKiBpdHMgcHJlZmVycmVkIHNpemUsIGFuZCB0aGVuIHJlc2l6ZXMgdGhlIHNoZWxsLCB3ZQotCQkgKiByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUgY29ycmVjdGx5LgotCQkgKi8KLQkJdGFiRm9sZGVyUGFnZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtjYW52YXN9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiQ2FudmFzIjsKLQl9Ci0JCi0JLyoqCi0JICogUmVzaXplcyB0aGUgbWF4aW11bSBhbmQgdGh1bWIgb2YgYm90aCBzY3JvbGxiYXJzLgotCSAqLwotCXZvaWQgcmVzaXplU2Nyb2xsQmFycyAoKSB7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gY2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJU2Nyb2xsQmFyIGJhciA9IGNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JCWlmIChiYXIgIT0gbnVsbCkgewotCQkJYmFyLnNldE1heGltdW0obWF4WCk7Ci0JCQliYXIuc2V0VGh1bWIoY2xpZW50QXJlYS53aWR0aCk7Ci0JCQliYXIuc2V0UGFnZUluY3JlbWVudChjbGllbnRBcmVhLndpZHRoKTsKLQkJfQotCQliYXIgPSBjYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJaWYgKGJhciAhPSBudWxsKSB7Ci0JCQliYXIuc2V0TWF4aW11bShtYXhZKTsKLQkJCWJhci5zZXRUaHVtYihjbGllbnRBcmVhLmhlaWdodCk7Ci0JCQliYXIuc2V0UGFnZUluY3JlbWVudChjbGllbnRBcmVhLmhlaWdodCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTY3JvbGxzIHRoZSBjYW52YXMgaG9yaXpvbnRhbGx5LgotCSAqIAotCSAqIEBwYXJhbSBzY3JvbGxCYXIKLQkgKi8KLQl2b2lkIHNjcm9sbEhvcml6b250YWwgKFNjcm9sbEJhciBzY3JvbGxCYXIpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCWludCB4ID0gLXNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHggKyBtYXhYIDwgYm91bmRzLndpZHRoKSB7Ci0JCQl4ID0gYm91bmRzLndpZHRoIC0gbWF4WDsKLQkJfQotCQljYW52YXMuc2Nyb2xsKHgsIGN5LCBjeCwgY3ksIG1heFgsIG1heFksIGZhbHNlKTsKLQkJY3ggPSB4OwotCX0KLQotCS8qKgotCSAqIFNjcm9sbHMgdGhlIGNhbnZhcyB2ZXJ0aWNhbGx5LgotCSAqIAotCSAqIEBwYXJhbSBzY3JvbGxCYXIKLQkgKi8KLQl2b2lkIHNjcm9sbFZlcnRpY2FsIChTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgeSA9IC1zY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICh5ICsgbWF4WSA8IGJvdW5kcy5oZWlnaHQpIHsKLQkJCXkgPSBib3VuZHMuaGVpZ2h0IC0gbWF4WTsKLQkJfQotCQljYW52YXMuc2Nyb2xsKGN4LCB5LCBjeCwgY3ksIG1heFgsIG1heFksIGZhbHNlKTsKLQkJY3kgPSB5OwotCX0KLQotCS8qKgotCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBjYXJldCBpbiB0aGUgIkV4YW1wbGUiIHdpZGdldC4KLQkgKi8KLQl2b2lkIHNldENhcmV0ICgpIHsKLQkJQ2FyZXQgb2xkQ2FyZXQgPSBjYW52YXMuZ2V0Q2FyZXQgKCk7Ci0JCWlmIChjYXJldEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCUNhcmV0IG5ld0NhcmV0ID0gbmV3IENhcmV0KGNhbnZhcywgU1dULk5PTkUpOwotCQkJRm9udCBmb250ID0gY2FudmFzLmdldEZvbnQoKTsKLQkJCW5ld0NhcmV0LnNldEZvbnQoZm9udCk7Ci0JCQlHQyBnYyA9IG5ldyBHQyhjYW52YXMpOwotCQkJZ2Muc2V0Rm9udChmb250KTsKLQkJCW5ld0NhcmV0LnNldEJvdW5kcygxLCAxLCAxLCBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCWNhbnZhcy5zZXRDYXJldCAobmV3Q2FyZXQpOwotCQkJY2FudmFzLnNldEZvY3VzKCk7Ci0JCX0gZWxzZSB7Ci0JCQljYW52YXMuc2V0Q2FyZXQgKG51bGwpOwotCQl9Ci0JCWlmIChvbGRDYXJldCAhPSBudWxsKSBvbGRDYXJldC5kaXNwb3NlICgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgoY2FudmFzLmdldFN0eWxlICgpICYgU1dULkhfU0NST0xMKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgoY2FudmFzLmdldFN0eWxlICgpICYgU1dULlZfU0NST0xMKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCQlub0JhY2tncm91bmRCdXR0b24uc2V0U2VsZWN0aW9uICgoY2FudmFzLmdldFN0eWxlICgpICYgU1dULk5PX0JBQ0tHUk9VTkQpICE9IDApOwotCQlub0ZvY3VzQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5OT19GT0NVUykgIT0gMCk7Ci0JCW5vTWVyZ2VQYWludHNCdXR0b24uc2V0U2VsZWN0aW9uICgoY2FudmFzLmdldFN0eWxlICgpICYgU1dULk5PX01FUkdFX1BBSU5UUykgIT0gMCk7Ci0JCW5vUmVkcmF3UmVzaXplQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5OT19SRURSQVdfUkVTSVpFKSAhPSAwKTsKLQkJZG91YmxlQnVmZmVyZWRCdXR0b24uc2V0U2VsZWN0aW9uICgoY2FudmFzLmdldFN0eWxlICgpICYgU1dULkRPVUJMRV9CVUZGRVJFRCkgIT0gMCk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgc2V0Q2FyZXQgKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29tYm9UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NvbWJvVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjYTM3NzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29tYm9UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIENvbWJvVGFiIGV4dGVuZHMgVGFiIHsKLQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JQ29tYm8gY29tYm8xOwotCUdyb3VwIGNvbWJvR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBkcm9wRG93bkJ1dHRvbiwgcmVhZE9ubHlCdXR0b24sIHNpbXBsZUJ1dHRvbjsKLQkKLQlzdGF0aWMgU3RyaW5nIFtdIExpc3REYXRhID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMCIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8xIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzIiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMyIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF80IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzUiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNiIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF83IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzgiKX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ29tYm9UYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGNvbWJvIGJveCAqLwotCQljb21ib0dyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJY29tYm9Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJY29tYm9Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQljb21ib0dyb3VwLnNldFRleHQgKCJDb21ibyIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGRyb3BEb3duQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkRST1BfRE9XTjsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKHNpbXBsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU1QTEU7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQljb21ibzEgPSBuZXcgQ29tYm8gKGNvbWJvR3JvdXAsIHN0eWxlKTsKLQkJY29tYm8xLnNldEl0ZW1zIChMaXN0RGF0YSk7Ci0JCWlmIChMaXN0RGF0YS5sZW5ndGggPj0gMykgewotCQkJY29tYm8xLnNldFRleHQoTGlzdERhdGEgWzJdKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWRyb3BEb3duQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJZHJvcERvd25CdXR0b24uc2V0VGV4dCAoIlNXVC5EUk9QX0RPV04iKTsKLQkJc2ltcGxlQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2ltcGxlQnV0dG9uLnNldFRleHQoIlNXVC5TSU1QTEUiKTsKLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtjb21ibzF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ikl0ZW1zIiwgIk9yaWVudGF0aW9uIiwgIlNlbGVjdGlvbiIsICJUZXh0IiwgIlRleHRMaW1pdCIsICJUb29sVGlwVGV4dCIsICJWaXNpYmxlSXRlbUNvdW50In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiQ29tYm8iOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbWJvMS5nZXRTdHlsZSAoKSAmIFNXVC5EUk9QX0RPV04pICE9IDApOwotCQlzaW1wbGVCdXR0b24uc2V0U2VsZWN0aW9uICgoY29tYm8xLmdldFN0eWxlICgpICYgU1dULlNJTVBMRSkgIT0gMCk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbWJvMS5nZXRTdHlsZSAoKSAmIFNXVC5SRUFEX09OTFkpICE9IDApOwotCQlyZWFkT25seUJ1dHRvbi5zZXRFbmFibGVkKCFzaW1wbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NvbnRyb2xFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db250cm9sRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTZiNjgyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NvbnRyb2xFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBDb250cm9sRXhhbXBsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPQotCQlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2NvbnRyb2wiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU2hlbGxUYWIgc2hlbGxUYWI7Ci0JcHJpdmF0ZSBUYWJGb2xkZXIgdGFiRm9sZGVyOwotCXByaXZhdGUgVGFiIFtdIHRhYnM7Ci0JSW1hZ2UgaW1hZ2VzW107Ci0KLQlzdGF0aWMgZmluYWwgaW50IGNpQ2xvc2VkRm9sZGVyID0gMCwgY2lPcGVuRm9sZGVyID0gMSwgY2lUYXJnZXQgPSAyLCBjaUJhY2tncm91bmQgPSAzLCBjaVBhcmVudEJhY2tncm91bmQgPSA0OwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbWFnZUxvY2F0aW9ucyA9IHsKLQkJImNsb3NlZEZvbGRlci5naWYiLCAJCQkvLyROT04tTkxTLTEkCi0JCSJvcGVuRm9sZGVyLmdpZiIsIAkJCQkvLyROT04tTkxTLTEkCi0JCSJ0YXJnZXQuZ2lmIiwgCQkJCQkvLyROT04tTkxTLTEkCi0JCSJiYWNrZ3JvdW5kSW1hZ2UucG5nIiwgCQkJLy8kTk9OLU5MUy0xJAotCQkicGFyZW50QmFja2dyb3VuZEltYWdlLnBuZyJ9OyAJLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBpbnRbXSBpbWFnZVR5cGVzID0gewotCQlTV1QuSUNPTiwKLQkJU1dULklDT04sCi0JCVNXVC5JQ09OLAotCQlTV1QuQklUTUFQLAotCQlTV1QuQklUTUFQfTsKLQotCWJvb2xlYW4gc3RhcnR1cCA9IHRydWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgQ29udHJvbEV4YW1wbGUgZW1iZWRkZWQgaW5zaWRlCi0JICogdGhlIHN1cHBsaWVkIHBhcmVudCBDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29udGFpbmVyIG9mIHRoZSBleGFtcGxlCi0JICovCi0JcHVibGljIENvbnRyb2xFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdFJlc291cmNlcygpOwotCQl0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyIChwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGFicyA9IGNyZWF0ZVRhYnMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtICh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJICAgIGl0ZW0uc2V0VGV4dCAodGFicyBbaV0uZ2V0VGFiVGV4dCAoKSk7Ci0JCSAgICBpdGVtLnNldENvbnRyb2wgKHRhYnMgW2ldLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcikpOwotCQkgICAgaXRlbS5zZXREYXRhICh0YWJzIFtpXSk7Ci0JCX0KLQkJc3RhcnR1cCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgdGhlIHNldCBvZiBleGFtcGxlIFRhYnMKLQkgKi8KLQlUYWJbXSBjcmVhdGVUYWJzKCkgewotCQlyZXR1cm4gbmV3IFRhYiBbXSB7Ci0JCQluZXcgQnV0dG9uVGFiICh0aGlzKSwKLQkJCW5ldyBDYW52YXNUYWIgKHRoaXMpLAotCQkJbmV3IENvbWJvVGFiICh0aGlzKSwKLQkJCW5ldyBDb29sQmFyVGFiICh0aGlzKSwKLQkJCW5ldyBEYXRlVGltZVRhYiAodGhpcyksCi0JCQluZXcgRGlhbG9nVGFiICh0aGlzKSwKLQkJCW5ldyBFeHBhbmRCYXJUYWIgKHRoaXMpLAotCQkJbmV3IEdyb3VwVGFiICh0aGlzKSwKLQkJCW5ldyBMYWJlbFRhYiAodGhpcyksCi0JCQluZXcgTGlua1RhYiAodGhpcyksCi0JCQluZXcgTGlzdFRhYiAodGhpcyksCi0JCQluZXcgTWVudVRhYiAodGhpcyksCi0JCQluZXcgUHJvZ3Jlc3NCYXJUYWIgKHRoaXMpLAotCQkJbmV3IFNhc2hUYWIgKHRoaXMpLAotCQkJbmV3IFNjYWxlVGFiICh0aGlzKSwKLQkJCXNoZWxsVGFiID0gbmV3IFNoZWxsVGFiKHRoaXMpLAotCQkJbmV3IFNsaWRlclRhYiAodGhpcyksCi0JCQluZXcgU3Bpbm5lclRhYiAodGhpcyksCi0JCQluZXcgVGFiRm9sZGVyVGFiICh0aGlzKSwKLQkJCW5ldyBUYWJsZVRhYiAodGhpcyksCi0JCQluZXcgVGV4dFRhYiAodGhpcyksCi0JCQluZXcgVG9vbEJhclRhYiAodGhpcyksCi0JCQluZXcgVG9vbFRpcFRhYiAodGhpcyksCi0JCQluZXcgVHJlZVRhYiAodGhpcyksCi0JCQluZXcgQnJvd3NlclRhYiAodGhpcyksCi0JCX07Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyCi0JICogaW5zdGFuY2Ugb2YgdGhlIENvbnRyb2xFeGFtcGxlLgotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvKgotCQkgKiBEZXN0cm95IGFueSBzaGVsbHMgdGhhdCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQKLQkJICogYnkgdGhlIFNoZWxscyB0YWIuICBXaGVuIGEgc2hlbGwgaXMgZGlzcG9zZWQsCi0JCSAqIGFsbCBjaGlsZCBzaGVsbHMgYXJlIGFsc28gZGlzcG9zZWQuICBUaGVyZWZvcmUKLQkJICogaXQgaXMgbmVjZXNzYXJ5IHRvIGNoZWNrIGZvciBkaXNwb3NlZCBzaGVsbHMKLQkJICogaW4gdGhlIHNoZWxscyBsaXN0IHRvIGF2b2lkIGRpc3Bvc2luZyBhIHNoZWxsCi0JCSAqIHR3aWNlLgotCQkgKi8KLQkJaWYgKHNoZWxsVGFiICE9IG51bGwpIHNoZWxsVGFiLmNsb3NlQWxsU2hlbGxzICgpOwotCQlzaGVsbFRhYiA9IG51bGw7Ci0JCXRhYkZvbGRlciA9IG51bGw7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBGcmVlcyB0aGUgcmVzb3VyY2VzCi0JICovCi0Jdm9pZCBmcmVlUmVzb3VyY2VzKCkgewotCQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbaV07Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWltYWdlcyA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHJlc291cmNlcwotCSAqLwotCXZvaWQgaW5pdFJlc291cmNlcygpIHsKLQkJZmluYWwgQ2xhc3MgY2xhenogPSBDb250cm9sRXhhbXBsZS5jbGFzczsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGltYWdlcyA9PSBudWxsKSB7Ci0JCQkJCWltYWdlcyA9IG5ldyBJbWFnZVtpbWFnZUxvY2F0aW9ucy5sZW5ndGhdOwotCQkJCQkKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCQkJSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbShpbWFnZUxvY2F0aW9uc1tpXSk7Ci0JCQkJCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YShzb3VyY2VTdHJlYW0pOwotCQkJCQkJaWYgKGltYWdlVHlwZXNbaV0gPT0gU1dULklDT04pIHsKLQkJCQkJCQlJbWFnZURhdGEgbWFzayA9IHNvdXJjZS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCQkJCQkJaW1hZ2VzW2ldID0gbmV3IEltYWdlKG51bGwsIHNvdXJjZSwgbWFzayk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWltYWdlc1tpXSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UpOwotCQkJCQkJfQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzb3VyY2VTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGVycm9yID0gKHJlc291cmNlQnVuZGxlICE9IG51bGwpID8KLQkJCWdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSA6Ci0JCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGVycm9yKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2VzIGFzIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0pOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUNvbnRyb2xFeGFtcGxlIGluc3RhbmNlID0gbmV3IENvbnRyb2xFeGFtcGxlKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzZXRTaGVsbFNpemUoaW5zdGFuY2UsIHNoZWxsKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBHcmFicyBpbnB1dCBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJdGFiRm9sZGVyLnNldEZvY3VzKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHNoZWxsIHRvIGl0J3MgInBhY2tlZCIgc2l6ZSwKLQkgKiB1bmxlc3MgdGhhdCBtYWtlcyBpdCBsYXJnZXIgdGhhbiB0aGUgbW9uaXRvciBpdCBpcyBiZWluZyBkaXNwbGF5ZWQgb24sCi0JICogaW4gd2hpY2ggY2FzZSBqdXN0IHNldCB0aGUgc2hlbGwgc2l6ZSB0byBiZSBzbGlnaHRseSBzbWFsbGVyIHRoYW4gdGhlIG1vbml0b3IuCi0JICovCi0Jc3RhdGljIHZvaWQgc2V0U2hlbGxTaXplKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlLCBTaGVsbCBzaGVsbCkgewotCQlQb2ludCBzaXplID0gc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJUmVjdGFuZ2xlIG1vbml0b3JBcmVhID0gc2hlbGwuZ2V0TW9uaXRvcigpLmdldENsaWVudEFyZWEoKTsKLQkJLyogV29ya2Fyb3VuZDogaWYgdGhlIHRhYiBmb2xkZXIgaXMgd2lkZXIgdGhhbiB0aGUgc2NyZWVuLAotCQkgKiBjYXJib24gY2xpcHMgaW5zdGVhZCBvZiBzb21laG93IHNjcm9sbGluZyB0aGUgdGFiIGl0ZW1zLgotCQkgKiBXZSB0cnkgdG8gcmVjb3ZlciBzb21lIHdpZHRoIGJ5IHVzaW5nIHNob3J0ZXIgdGFiIG5hbWVzLiAqLwotCQlpZiAoc2l6ZS54ID4gbW9uaXRvckFyZWEud2lkdGggJiYgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJjYXJib24iKSkgewotCQkJVGFiSXRlbSBbXSB0YWJJdGVtcyA9IGluc3RhbmNlLnRhYkZvbGRlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaT0wOyBpPHRhYkl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdGFiSXRlbXNbaV0uc2V0VGV4dCAoaW5zdGFuY2UudGFicyBbaV0uZ2V0U2hvcnRUYWJUZXh0ICgpKTsKLQkJCX0KLQkJCXNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQl9Ci0JCXNoZWxsLnNldFNpemUoTWF0aC5taW4oc2l6ZS54LCBtb25pdG9yQXJlYS53aWR0aCksIE1hdGgubWluKHNpemUueSwgbW9uaXRvckFyZWEuaGVpZ2h0KSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db29sQmFyVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db29sQmFyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MjBjZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29vbEJhclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIENvb2xCYXJUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXAgdGhhdCBjb250YWlucyB0aGVtICovCi0JQ29vbEJhciBjb29sQmFyOwotCUNvb2xJdGVtIHB1c2hJdGVtLCBkcm9wRG93bkl0ZW0sIHJhZGlvSXRlbSwgY2hlY2tJdGVtLCB0ZXh0SXRlbTsKLQlHcm91cCBjb29sQmFyR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbjsKLQlCdXR0b24gZHJvcERvd25CdXR0b24sIGZsYXRCdXR0b247Ci0KLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIGxvY2tlZEJ1dHRvbjsKLQkKLQlQb2ludFtdIHNpemVzOwotCWludFtdIHdyYXBJbmRpY2VzOwotCWludFtdIG9yZGVyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlDb29sQmFyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJbG9ja2VkQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbG9ja2VkQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMb2NrZWQiKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWxvY2tlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0TG9ja2VkICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQljb29sQmFyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQljb29sQmFyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWNvb2xCYXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQljb29sQmFyR3JvdXAuc2V0VGV4dCAoIkNvb2xCYXIiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpLCBpdGVtU3R5bGUgPSAwOwotCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCwgaXRlbSwgYW5kIGl0ZW0gdG9vbEJhciBzdHlsZXMgKi8KLQkJaW50IHRvb2xCYXJTdHlsZSA9IFNXVC5GTEFUOwotCQlib29sZWFuIHZlcnRpY2FsID0gZmFsc2U7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCQl0b29sQmFyU3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCX0KLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJc3R5bGUgfD0gU1dULlZFUlRJQ0FMOwotCQkJdG9vbEJhclN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJCXZlcnRpY2FsID0gdHJ1ZTsKLQkJfQotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAoZmxhdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkZMQVQ7Ci0JCWlmIChkcm9wRG93bkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbVN0eWxlIHw9IFNXVC5EUk9QX0RPV047Ci0JCi0JCS8qCi0JCSogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JCSovCi0JCWNvb2xCYXIgPSBuZXcgQ29vbEJhciAoY29vbEJhckdyb3VwLCBzdHlsZSk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIHB1c2ggYnV0dG9uIHRvb2xiYXIgY29vbCBpdGVtICovCi0JCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChjb29sQmFyLCB0b29sQmFyU3R5bGUpOwotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7CQkKLQkJcHVzaEl0ZW0gPSBuZXcgQ29vbEl0ZW0gKGNvb2xCYXIsIGl0ZW1TdHlsZSk7Ci0JCXB1c2hJdGVtLnNldENvbnRyb2wgKHRvb2xCYXIpOwotCQlwdXNoSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQkJCi0JCS8qIENyZWF0ZSB0aGUgZHJvcGRvd24gdG9vbGJhciBjb29sIGl0ZW0gKi8KLQkJdG9vbEJhciA9IG5ldyBUb29sQmFyIChjb29sQmFyLCB0b29sQmFyU3R5bGUpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULkRST1BfRE9XTiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULkRST1BfRE9XTiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZHJvcERvd25JdGVtID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCBpdGVtU3R5bGUpOwotCQlkcm9wRG93bkl0ZW0uc2V0Q29udHJvbCAodG9vbEJhcik7Ci0JCWRyb3BEb3duSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLQkJLyogQ3JlYXRlIHRoZSByYWRpbyBidXR0b24gdG9vbGJhciBjb29sIGl0ZW0gKi8KLQkJdG9vbEJhciA9IG5ldyBUb29sQmFyIChjb29sQmFyLCB0b29sQmFyU3R5bGUpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5SQURJTyIpOwotCQlyYWRpb0l0ZW0gPSBuZXcgQ29vbEl0ZW0gKGNvb2xCYXIsIGl0ZW1TdHlsZSk7Ci0JCXJhZGlvSXRlbS5zZXRDb250cm9sICh0b29sQmFyKTsKLQkJcmFkaW9JdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgY2hlY2sgYnV0dG9uIHRvb2xiYXIgY29vbCBpdGVtICovCi0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhciAoY29vbEJhciwgdG9vbEJhclN0eWxlKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkNIRUNLKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkNIRUNLKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkNIRUNLKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWNoZWNrSXRlbSA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgaXRlbVN0eWxlKTsKLQkJY2hlY2tJdGVtLnNldENvbnRyb2wgKHRvb2xCYXIpOwotCQljaGVja0l0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSB0ZXh0IGNvb2wgaXRlbSAqLwotCQlpZiAoIXZlcnRpY2FsKSB7Ci0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoY29vbEJhciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQkJdGV4dEl0ZW0gPSBuZXcgQ29vbEl0ZW0gKGNvb2xCYXIsIGl0ZW1TdHlsZSk7Ci0JCQl0ZXh0SXRlbS5zZXRDb250cm9sICh0ZXh0KTsKLQkJCXRleHRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCVBvaW50IHRleHRTaXplID0gdGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJdGV4dFNpemUgPSB0ZXh0SXRlbS5jb21wdXRlU2l6ZSh0ZXh0U2l6ZS54LCB0ZXh0U2l6ZS55KTsKLQkJCXRleHRJdGVtLnNldE1pbmltdW1TaXplKHRleHRTaXplKTsKLQkJCXRleHRJdGVtLnNldFByZWZlcnJlZFNpemUodGV4dFNpemUpOwotCQkJdGV4dEl0ZW0uc2V0U2l6ZSh0ZXh0U2l6ZSk7Ci0JCX0KLQotCQkvKiBTZXQgdGhlIHNpemVzIGFmdGVyIGFkZGluZyBhbGwgY29vbCBpdGVtcyAqLwotCQlDb29sSXRlbVtdIGNvb2xJdGVtcyA9IGNvb2xCYXIuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb29sSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCUNvb2xJdGVtIGNvb2xJdGVtID0gY29vbEl0ZW1zW2ldOwotCQkJQ29udHJvbCBjb250cm9sID0gY29vbEl0ZW0uZ2V0Q29udHJvbCgpOwotCQkJUG9pbnQgc2l6ZSA9IGNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCVBvaW50IGNvb2xTaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpOwotCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUb29sQmFyKSB7Ci0JCQkJVG9vbEJhciBiYXIgPSAoVG9vbEJhciljb250cm9sOwotCQkJCWlmIChiYXIuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQkJCWlmICh2ZXJ0aWNhbCkgewotCQkJCQkJc2l6ZS55ID0gYmFyLmdldEl0ZW0oMCkuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2l6ZS54ID0gYmFyLmdldEl0ZW0oMCkuZ2V0V2lkdGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNvb2xJdGVtLnNldE1pbmltdW1TaXplKHNpemUpOwotCQkJY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShjb29sU2l6ZSk7Ci0JCQljb29sSXRlbS5zZXRTaXplKGNvb2xTaXplKTsKLQkJfQotCQkKLQkJLyogSWYgd2UgaGF2ZSBzYXZlZCBzdGF0ZSwgcmVzdG9yZSBpdCAqLwotCQlpZiAob3JkZXIgIT0gbnVsbCAmJiBvcmRlci5sZW5ndGggPT0gY29vbEJhci5nZXRJdGVtQ291bnQoKSkgewotCQkJY29vbEJhci5zZXRJdGVtTGF5b3V0KG9yZGVyLCB3cmFwSW5kaWNlcywgc2l6ZXMpOwotCQl9IGVsc2UgewotCQkJY29vbEJhci5zZXRXcmFwSW5kaWNlcyhuZXcgaW50W10gezEsIDN9KTsKLQkJfQotCQkKLQkJLyogQWRkIGEgbGlzdGVuZXIgdG8gcmVzaXplIHRoZSBncm91cCBib3ggdG8gbWF0Y2ggdGhlIGNvb2xiYXIgKi8KLQkJY29vbEJhci5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV4YW1wbGVHcm91cC5sYXlvdXQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJdmVydGljYWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlZFUlRJQ0FMIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCQlmbGF0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZmxhdEJ1dHRvbi5zZXRUZXh0ICgiU1dULkZMQVQiKTsKLQkJR3JvdXAgaXRlbUdyb3VwID0gbmV3IEdyb3VwKHN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJaXRlbUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlpdGVtR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWl0ZW1Hcm91cC5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJdGVtX1N0eWxlcyIpKTsKLQkJZHJvcERvd25CdXR0b24gPSBuZXcgQnV0dG9uIChpdGVtR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFRleHQgKCJTV1QuRFJPUF9ET1dOIik7Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCS8qIHN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgdG9vbGJhciBpZiBhcHBsaWNhYmxlICovCi0JCWlmIChjb29sQmFyICE9IG51bGwpIHsKLQkJCXNpemVzID0gY29vbEJhci5nZXRJdGVtU2l6ZXMoKTsKLQkJCXdyYXBJbmRpY2VzID0gY29vbEJhci5nZXRXcmFwSW5kaWNlcygpOwotCQkJb3JkZXIgPSBjb29sQmFyLmdldEl0ZW1PcmRlcigpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VFeGFtcGxlV2lkZ2V0cygpOwkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJcmV0dXJuIGNvb2xCYXIuZ2V0SXRlbXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7Y29vbEJhcn07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG9ydCB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRTaG9ydFRhYlRleHQoKSB7Ci0JCXJldHVybiAiQ0IiOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNvb2xCYXIiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5IT1JJWk9OVEFMKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb29sQmFyLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCWZsYXRCdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5GTEFUKSAhPSAwKTsKLQkJZHJvcERvd25CdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRJdGVtKDApLmdldFN0eWxlICgpICYgU1dULkRST1BfRE9XTikgIT0gMCk7Ci0JCWxvY2tlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29vbEJhci5nZXRMb2NrZWQoKSk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgc2V0V2lkZ2V0TG9ja2VkICgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBoZWFkZXIgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRMb2NrZWQgKCkgewotCQljb29sQmFyLnNldExvY2tlZCAobG9ja2VkQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIExpc3RlbnMgdG8gd2lkZ2V0U2VsZWN0ZWQoKSBldmVudHMgb24gU1dULkRST1BfRE9XTiB0eXBlIFRvb2xJdGVtcwotCSAqIGFuZCBvcGVucy9jbG9zZXMgYSBtZW51IHdoZW4gYXBwcm9wcmlhdGUuCi0JICovCi0JY2xhc3MgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotCQlwcml2YXRlIE1lbnUgbWVudSA9IG51bGw7Ci0JCXByaXZhdGUgYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7Ci0JCQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLy8gQ3JlYXRlIHRoZSBtZW51IGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKLQkJCWlmIChtZW51ID09IG51bGwpIHsKLQkJCQkvLyBMYXp5IGNyZWF0ZSB0aGUgbWVudS4KLQkJCQltZW51ID0gbmV3IE1lbnUoc2hlbGwpOwotCQkJCW1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51QWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJCQkJdmlzaWJsZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA5OyArK2kpIHsKLQkJCQkJZmluYWwgU3RyaW5nIHRleHQgPSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRHJvcERvd25EYXRhXyIgKyBpKTsKLQkJCQkJaWYgKHRleHQubGVuZ3RoKCkgIT0gMCkgewotCQkJCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQkJCQkJbWVudUl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJCS8qCi0JCQkJCQkgKiBBZGQgYSBtZW51IHNlbGVjdGlvbiBsaXN0ZW5lciBzbyB0aGF0IHRoZSBtZW51IGlzIGhpZGRlbgotCQkJCQkJICogd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGl0ZW0gZnJvbSB0aGUgZHJvcCBkb3duIG1lbnUuCi0JCQkJCQkgKi8KLQkJCQkJCW1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQkJc2V0TWVudVZpc2libGUoZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvKioKLQkJCSAqIEEgc2VsZWN0aW9uIGV2ZW50IHdpbGwgYmUgZmlyZWQgd2hlbiBhIGRyb3AgZG93biB0b29sCi0JCQkgKiBpdGVtIGlzIHNlbGVjdGVkIGluIHRoZSBtYWluIGFyZWEgYW5kIGluIHRoZSBkcm9wCi0JCQkgKiBkb3duIGFycm93LiAgRXhhbWluZSB0aGUgZXZlbnQgZGV0YWlsIHRvIGRldGVybWluZQotCQkJICogd2hlcmUgdGhlIHdpZGdldCB3YXMgc2VsZWN0ZWQuCi0JCQkgKi8JCQotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCQkvKgotCQkJCSAqIFRoZSBkcm9wIGRvd24gYXJyb3cgd2FzIHNlbGVjdGVkLgotCQkJCSAqLwotCQkJCWlmICh2aXNpYmxlKSB7Ci0JCQkJCS8vIEhpZGUgdGhlIG1lbnUgdG8gZ2l2ZSB0aGUgQXJyb3cgdGhlIGFwcGVhcmFuY2Ugb2YgYmVpbmcgYSB0b2dnbGUgYnV0dG9uLgotCQkJCQlzZXRNZW51VmlzaWJsZShmYWxzZSk7Ci0JCQkJfSBlbHNlIHsJCi0JCQkJCS8vIFBvc2l0aW9uIHRoZSBtZW51IGJlbG93IGFuZCB2ZXJ0aWNhbGx5IGFsaWduZWQgd2l0aCB0aGUgdGhlIGRyb3AgZG93biB0b29sIGJ1dHRvbi4KLQkJCQkJZmluYWwgVG9vbEl0ZW0gdG9vbEl0ZW0gPSAoVG9vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCQkJZmluYWwgVG9vbEJhciAgdG9vbEJhciA9IHRvb2xJdGVtLmdldFBhcmVudCgpOwotCQkJCQkKLQkJCQkJUmVjdGFuZ2xlIHRvb2xJdGVtQm91bmRzID0gdG9vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJCVBvaW50IHBvaW50ID0gdG9vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KHRvb2xJdGVtQm91bmRzLngsIHRvb2xJdGVtQm91bmRzLnkpKTsKLQkJCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgdG9vbEl0ZW1Cb3VuZHMuaGVpZ2h0KTsKLQkJCQkJc2V0TWVudVZpc2libGUodHJ1ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIE1haW4gYXJlYSBvZiBkcm9wIGRvd24gdG9vbCBpdGVtIHNlbGVjdGVkLgotCQkJCSAqIEFuIGFwcGxpY2F0aW9uIHdvdWxkIGludm9rZSB0aGUgY29kZSB0byBwZXJmb3JtIHRoZSBhY3Rpb24gZm9yIHRoZSB0b29sIGl0ZW0uCi0JCQkJICovCi0JCQl9Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIHNldE1lbnVWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQkJbWVudS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJdGhpcy52aXNpYmxlID0gdmlzaWJsZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbnMgdG8gd2lkZ2V0U2VsZWN0ZWQoKSBldmVudHMgb24gU1dULkRST1BfRE9XTiB0eXBlIENvb2xJdGVtcwotCSAqIGFuZCBvcGVucy9jbG9zZXMgYSBtZW51IHdoZW4gYXBwcm9wcmlhdGUuCi0JICovCi0JY2xhc3MgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotCQlwcml2YXRlIE1lbnUgbWVudSA9IG51bGw7Ci0JCQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLyoqCi0JCQkgKiBBIHNlbGVjdGlvbiBldmVudCB3aWxsIGJlIGZpcmVkIHdoZW4gdGhlIGNvb2wgaXRlbQotCQkJICogaXMgc2VsZWN0ZWQgYnkgaXRzIGdyaXBwZXIgb3IgaWYgdGhlIGRyb3AgZG93biBhcnJvdwotCQkJICogKG9yICdjaGV2cm9uJykgaXMgc2VsZWN0ZWQuIEV4YW1pbmUgdGhlIGV2ZW50IGRldGFpbAotCQkJICogdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSB3aWRnZXQgd2FzIHNlbGVjdGVkLgotCQkJICovCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCS8qIElmIHRoZSBwb3B1cCBtZW51IGlzIGFscmVhZHkgdXAgKGkuZS4gdXNlciBwcmVzc2VkIGFycm93IHR3aWNlKSwKLQkJCQkgKiB0aGVuIGRpc3Bvc2UgaXQuCi0JCQkJICovCi0JCQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJCQltZW51LmRpc3Bvc2UoKTsKLQkJCQkJbWVudSA9IG51bGw7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogR2V0IHRoZSBjb29sIGl0ZW0gYW5kIGNvbnZlcnQgaXRzIGJvdW5kcyB0byBkaXNwbGF5IGNvb3JkaW5hdGVzLiAqLwotCQkJCUNvb2xJdGVtIGNvb2xJdGVtID0gKENvb2xJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBjb29sSXRlbS5nZXRCb3VuZHMgKCk7Ci0JCQkJaXRlbUJvdW5kcy53aWR0aCA9IGV2ZW50LnggLSBpdGVtQm91bmRzLng7Ci0JCQkJUG9pbnQgcHQgPSBjb29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQgKGl0ZW1Cb3VuZHMueCwgaXRlbUJvdW5kcy55KSk7Ci0JCQkJaXRlbUJvdW5kcy54ID0gcHQueDsKLQkJCQlpdGVtQm91bmRzLnkgPSBwdC55OwotCQkJCQotCQkJCS8qIEdldCB0aGUgdG9vbGJhciBmcm9tIHRoZSBjb29sIGl0ZW0uICovCi0JCQkJVG9vbEJhciB0b29sQmFyID0gKFRvb2xCYXIpIGNvb2xJdGVtLmdldENvbnRyb2wgKCk7Ci0JCQkJVG9vbEl0ZW1bXSB0b29scyA9IHRvb2xCYXIuZ2V0SXRlbXMgKCk7Ci0JCQkJaW50IHRvb2xDb3VudCA9IHRvb2xzLmxlbmd0aDsKLQkJCQkJCQkJCi0JCQkJLyogQ29udmVydCB0aGUgYm91bmRzIG9mIGVhY2ggdG9vbCBpdGVtIHRvIGRpc3BsYXkgY29vcmRpbmF0ZXMsCi0JCQkJICogYW5kIGRldGVybWluZSB3aGljaCBvbmVzIGFyZSBwYXN0IHRoZSBib3VuZHMgb2YgdGhlIGNvb2wgaXRlbS4KLQkJCQkgKi8KLQkJCQlpbnQgaSA9IDA7Ci0JCQkJd2hpbGUgKGkgPCB0b29sQ291bnQpIHsKLQkJCQkJUmVjdGFuZ2xlIHRvb2xCb3VuZHMgPSB0b29sc1tpXS5nZXRCb3VuZHMgKCk7Ci0JCQkJCXB0ID0gdG9vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KHRvb2xCb3VuZHMueCwgdG9vbEJvdW5kcy55KSk7Ci0JCQkJCXRvb2xCb3VuZHMueCA9IHB0Lng7Ci0JCQkJCXRvb2xCb3VuZHMueSA9IHB0Lnk7Ci0JCQkgIAkJUmVjdGFuZ2xlIGludGVyc2VjdGlvbiA9IGl0ZW1Cb3VuZHMuaW50ZXJzZWN0aW9uICh0b29sQm91bmRzKTsKLQkJCSAgCQlpZiAoIWludGVyc2VjdGlvbi5lcXVhbHMgKHRvb2xCb3VuZHMpKSBicmVhazsKLQkJCSAgCQlpKys7Ci0JCQkJfQotCQkJCQotCQkJCS8qIENyZWF0ZSBhIHBvcC11cCBtZW51IHdpdGggaXRlbXMgZm9yIGVhY2ggb2YgdGhlIGhpZGRlbiBidXR0b25zLiAqLwotCQkJCW1lbnUgPSBuZXcgTWVudSAoY29vbEJhcik7Ci0JCQkJZm9yIChpbnQgaiA9IGk7IGogPCB0b29sQ291bnQ7IGorKykgewotCQkJCQlUb29sSXRlbSB0b29sID0gdG9vbHNbal07Ci0JCQkJCUltYWdlIGltYWdlID0gdG9vbC5nZXRJbWFnZSgpOwotCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICgodG9vbC5nZXRTdHlsZSgpICYgU1dULkRST1BfRE9XTikgIT0gMCkgewotCQkJCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuQ0FTQ0FERSk7Ci0JCQkJCQkJbWVudUl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJCQkJCVN0cmluZyB0ZXh0ID0gdG9vbC5nZXRUb29sVGlwVGV4dCgpOwotCQkJCQkJCWlmICh0ZXh0ICE9IG51bGwpIG1lbnVJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCQkJTWVudSBtID0gbmV3IE1lbnUobWVudSk7Ci0JCQkJCQkJbWVudUl0ZW0uc2V0TWVudShtKTsKLQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IDk7ICsraykgewotCQkJCQkJCQl0ZXh0ID0gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyb3BEb3duRGF0YV8iICsgayk7Ci0JCQkJCQkJCWlmICh0ZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCQkJCQkJCU1lbnVJdGVtIG1pID0gbmV3IE1lbnVJdGVtKG0sIFNXVC5OT05FKTsKLQkJCQkJCQkJCW1pLnNldFRleHQodGV4dCk7Ci0JCQkJCQkJCQkvKiBBcHBsaWNhdGlvbiBjb2RlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBmb3IgdGhlIHN1Ym1lbnUgaXRlbSB3b3VsZCBnbyBoZXJlLiAqLwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJbmV3IE1lbnVJdGVtKG0sIFNXVC5TRVBBUkFUT1IpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULk5PTkUpOwotCQkJCQkJCW1lbnVJdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCQkJCQlTdHJpbmcgdGV4dCA9IHRvb2wuZ2V0VG9vbFRpcFRleHQoKTsKLQkJCQkJCQlpZiAodGV4dCAhPSBudWxsKSBtZW51SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQkJfQotCQkJCQkJLyogQXBwbGljYXRpb24gY29kZSB0byBwZXJmb3JtIHRoZSBhY3Rpb24gZm9yIHRoZSBtZW51IGl0ZW0gd291bGQgZ28gaGVyZS4gKi8KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvKiBEaXNwbGF5IHRoZSBwb3AtdXAgbWVudSBhdCB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGFycm93IGJ1dHRvbi4KLQkJCQkgKiBEaXNwb3NlIHRoZSBtZW51IHdoZW4gdGhlIHVzZXIgaXMgZG9uZSB3aXRoIGl0LgotCQkJCSAqLwotCQkJCXB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQltZW51LnNldExvY2F0aW9uIChwdC54LCBwdC55KTsKLQkJCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJCXdoaWxlIChtZW51ICE9IG51bGwgJiYgIW1lbnUuaXNEaXNwb3NlZCgpICYmIG1lbnUuaXNWaXNpYmxlICgpKSB7Ci0JCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCQkJfQotCQkJCWlmIChtZW51ICE9IG51bGwpIHsKLQkJCQkJbWVudS5kaXNwb3NlICgpOwotCQkJCQltZW51ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DdXN0b21Db250cm9sRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ3VzdG9tQ29udHJvbEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NDVmMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DdXN0b21Db250cm9sRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db250cm9sRXhhbXBsZSBleHRlbmRzIENvbnRyb2xFeGFtcGxlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBDdXN0b21Db250cm9sRXhhbXBsZSBlbWJlZGRlZAotCSAqIGluc2lkZSB0aGUgc3VwcGxpZWQgcGFyZW50IENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluZXIgb2YgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ29udHJvbEV4YW1wbGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlciAocGFyZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VycyB0aGUgc2V0IG9mIGV4YW1wbGUgVGFicwotCSAqLwotCVRhYltdIGNyZWF0ZVRhYnMoKSB7Ci0JCXJldHVybiBuZXcgVGFiIFtdIHsKLQkJCW5ldyBDQ29tYm9UYWIgKHRoaXMpLAotCQkJbmV3IENMYWJlbFRhYiAodGhpcyksCi0JCQluZXcgQ1RhYkZvbGRlclRhYiAodGhpcyksCi0JCQluZXcgU2FzaEZvcm1UYWIgKHRoaXMpLAotCQkJbmV3IFN0eWxlZFRleHRUYWIgKHRoaXMpLAotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBJbnZva2VzIGFzIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ3VzdG9tQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UgPSBuZXcgQ3VzdG9tQ29udHJvbEV4YW1wbGUoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJjdXN0b20ud2luZG93LnRpdGxlIikpOwotCQlzZXRTaGVsbFNpemUoaW5zdGFuY2UsIHNoZWxsKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRGF0ZVRpbWVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0RhdGVUaW1lVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDljZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRGF0ZVRpbWVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgRGF0ZVRpbWVUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JRGF0ZVRpbWUgZGF0ZVRpbWUxOwotCUdyb3VwIGRhdGVUaW1lR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBkYXRlQnV0dG9uLCB0aW1lQnV0dG9uLCBjYWxlbmRhckJ1dHRvbiwgc2hvcnRCdXR0b24sIG1lZGl1bUJ1dHRvbiwgbG9uZ0J1dHRvbiwgZHJvcERvd25CdXR0b247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCURhdGVUaW1lVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBsaXN0ICovCi0JCWRhdGVUaW1lR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlkYXRlVGltZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlkYXRlVGltZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWRhdGVUaW1lR3JvdXAuc2V0VGV4dCAoIkRhdGVUaW1lIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoZGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5EQVRFOwotCQlpZiAodGltZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5USU1FOwotCQlpZiAoY2FsZW5kYXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0FMRU5EQVI7Ci0JCWlmIChzaG9ydEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSE9SVDsKLQkJaWYgKG1lZGl1bUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NRURJVU07Ci0JCWlmIChsb25nQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkxPTkc7Ci0JCWlmIChkcm9wRG93bkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5EUk9QX0RPV047Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwkJCi0JCWRhdGVUaW1lMSA9IG5ldyBEYXRlVGltZSAoZGF0ZVRpbWVHcm91cCwgc3R5bGUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlkYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlkYXRlQnV0dG9uLnNldFRleHQoIlNXVC5EQVRFIik7Ci0JCXRpbWVCdXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRpbWVCdXR0b24uc2V0VGV4dCgiU1dULlRJTUUiKTsKLQkJY2FsZW5kYXJCdXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNhbGVuZGFyQnV0dG9uLnNldFRleHQoIlNXVC5DQUxFTkRBUiIpOwotCQlHcm91cCBmb3JtYXRHcm91cCA9IG5ldyBHcm91cChzdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWZvcm1hdEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJc2hvcnRCdXR0b24gPSBuZXcgQnV0dG9uKGZvcm1hdEdyb3VwLCBTV1QuUkFESU8pOwotCQlzaG9ydEJ1dHRvbi5zZXRUZXh0KCJTV1QuU0hPUlQiKTsKLQkJbWVkaXVtQnV0dG9uID0gbmV3IEJ1dHRvbihmb3JtYXRHcm91cCwgU1dULlJBRElPKTsKLQkJbWVkaXVtQnV0dG9uLnNldFRleHQoIlNXVC5NRURJVU0iKTsKLQkJbG9uZ0J1dHRvbiA9IG5ldyBCdXR0b24oZm9ybWF0R3JvdXAsIFNXVC5SQURJTyk7Ci0JCWxvbmdCdXR0b24uc2V0VGV4dCgiU1dULkxPTkciKTsKLQkJZHJvcERvd25CdXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFRleHQoIlNXVC5EUk9QX0RPV04iKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbihzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCgiU1dULkJPUkRFUiIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtkYXRlVGltZTF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IkRheSIsICJIb3VycyIsICJNaW51dGVzIiwgIk1vbnRoIiwgIlNlY29uZHMiLCAiWWVhciJ9OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJEYXRlVGltZSI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlkYXRlQnV0dG9uLnNldFNlbGVjdGlvbiAoKGRhdGVUaW1lMS5nZXRTdHlsZSAoKSAmIFNXVC5EQVRFKSAhPSAwKTsKLQkJdGltZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChkYXRlVGltZTEuZ2V0U3R5bGUgKCkgJiBTV1QuVElNRSkgIT0gMCk7Ci0JCWNhbGVuZGFyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGRhdGVUaW1lMS5nZXRTdHlsZSAoKSAmIFNXVC5DQUxFTkRBUikgIT0gMCk7Ci0JCXNob3J0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGRhdGVUaW1lMS5nZXRTdHlsZSAoKSAmIFNXVC5TSE9SVCkgIT0gMCk7Ci0JCW1lZGl1bUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChkYXRlVGltZTEuZ2V0U3R5bGUgKCkgJiBTV1QuTUVESVVNKSAhPSAwKTsKLQkJbG9uZ0J1dHRvbi5zZXRTZWxlY3Rpb24gKChkYXRlVGltZTEuZ2V0U3R5bGUgKCkgJiBTV1QuTE9ORykgIT0gMCk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFNlbGVjdGlvbiAoKGRhdGVUaW1lMS5nZXRTdHlsZSAoKSAmIFNXVC5EUk9QX0RPV04pICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoZGF0ZVRpbWUxLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRGlhbG9nVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9EaWFsb2dUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjU0MjFjMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9EaWFsb2dUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIERpYWxvZ1RhYiBleHRlbmRzIFRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlHcm91cCBkaWFsb2dTdHlsZUdyb3VwLCByZXN1bHRHcm91cDsKLQlUZXh0IHRleHRXaWRnZXQ7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUNvbWJvIGRpYWxvZ0NvbWJvOwotCUJ1dHRvbiBjcmVhdGVCdXR0b247Ci0JQnV0dG9uIG9rQnV0dG9uLCBjYW5jZWxCdXR0b247Ci0JQnV0dG9uIHllc0J1dHRvbiwgbm9CdXR0b247Ci0JQnV0dG9uIHJldHJ5QnV0dG9uOwotCUJ1dHRvbiBhYm9ydEJ1dHRvbiwgaWdub3JlQnV0dG9uOwotCUJ1dHRvbiBpY29uRXJyb3JCdXR0b24sIGljb25JbmZvcm1hdGlvbkJ1dHRvbiwgaWNvblF1ZXN0aW9uQnV0dG9uOwotCUJ1dHRvbiBpY29uV2FybmluZ0J1dHRvbiwgaWNvbldvcmtpbmdCdXR0b24sIG5vSWNvbkJ1dHRvbjsKLQlCdXR0b24gcHJpbWFyeU1vZGFsQnV0dG9uLCBhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLCBzeXN0ZW1Nb2RhbEJ1dHRvbjsKLQlCdXR0b24gc2hlZXRCdXR0b247Ci0JQnV0dG9uIHNhdmVCdXR0b24sIG9wZW5CdXR0b24sIG11bHRpQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBGaWx0ZXJFeHRlbnNpb25zCT0geyIqLnR4dCIsICIqLmJhdCIsICIqLmRvYyIsICIqIn07Ci0Jc3RhdGljIFN0cmluZyBbXSBGaWx0ZXJOYW1lcwkJPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbHRlck5hbWVfMCIpLAotCQkJCQkJCQkJCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWx0ZXJOYW1lXzEiKSwKLQkJCQkJCQkJCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsdGVyTmFtZV8yIiksCi0JCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbHRlck5hbWVfMyIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlEaWFsb2dUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIGJ1dHRvbiBzdHlsZSBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIHNlbGVjdGlvbiBldmVudAotCSAqLwotCXZvaWQgYnV0dG9uU3R5bGVTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkvKgotCQkgKiBPbmx5IGNlcnRhaW4gY29tYmluYXRpb25zIG9mIGJ1dHRvbiBzdHlsZXMgYXJlCi0JCSAqIHN1cHBvcnRlZCBmb3IgdmFyaW91cyBkaWFsb2dzLiAgTWFrZSBzdXJlIHRoZQotCQkgKiBjb250cm9sIHdpZGdldCByZWZsZWN0cyBvbmx5IHZhbGlkIGNvbWJpbmF0aW9ucy4KLQkJICovCi0JCWJvb2xlYW4gb2sgPSBva0J1dHRvbi5nZXRTZWxlY3Rpb24gKCk7Ci0JCWJvb2xlYW4gY2FuY2VsID0gY2FuY2VsQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJYm9vbGVhbiB5ZXMgPSB5ZXNCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIG5vID0gbm9CdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIGFib3J0ID0gYWJvcnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIHJldHJ5ID0gcmV0cnlCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIGlnbm9yZSA9IGlnbm9yZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCk7Ci0JCQotCQlva0J1dHRvbi5zZXRFbmFibGVkICghKHllcyB8fCBubyB8fCByZXRyeSB8fCBhYm9ydCB8fCBpZ25vcmUpKTsKLQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQgKCEoYWJvcnQgfHwgaWdub3JlIHx8ICh5ZXMgIT0gbm8pKSk7Ci0JCXllc0J1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IHJldHJ5IHx8IGFib3J0IHx8IGlnbm9yZSB8fCAoY2FuY2VsICYmICF5ZXMgJiYgIW5vKSkpOwotCQlub0J1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IHJldHJ5IHx8IGFib3J0IHx8IGlnbm9yZSB8fCAoY2FuY2VsICYmICF5ZXMgJiYgIW5vKSkpOwotCQlyZXRyeUJ1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IHllcyB8fCBubykpOwotCQlhYm9ydEJ1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IGNhbmNlbCB8fCB5ZXMgfHwgbm8pKTsKLQkJaWdub3JlQnV0dG9uLnNldEVuYWJsZWQgKCEob2sgfHwgY2FuY2VsIHx8IHllcyB8fCBubykpOwotCQkKLQkJY3JlYXRlQnV0dG9uLnNldEVuYWJsZWQgKAotCQkJCSEob2sgfHwgY2FuY2VsIHx8IHllcyB8fCBubyB8fCByZXRyeSB8fCBhYm9ydCB8fCBpZ25vcmUpIHx8Ci0JCQkJb2sgfHwKLQkJCQkob2sgJiYgY2FuY2VsKSB8fAotCQkJCSh5ZXMgJiYgbm8pIHx8Ci0JCQkJKHllcyAmJiBubyAmJiBjYW5jZWwpIHx8Ci0JCQkJKHJldHJ5ICYmIGNhbmNlbCkgfHwKLQkJCQkoYWJvcnQgJiYgcmV0cnkgJiYgaWdub3JlKSk7Ci0JCQotCi0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY3JlYXRlIGJ1dHRvbiBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXZvaWQgY3JlYXRlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkKLQkJLyogQ29tcHV0ZSB0aGUgYXBwcm9wcmlhdGUgZGlhbG9nIHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAob2tCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBva0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5PSzsKLQkJaWYgKGNhbmNlbEJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGNhbmNlbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5DQU5DRUw7Ci0JCWlmICh5ZXNCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiB5ZXNCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuWUVTOwotCQlpZiAobm9CdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBub0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5OTzsKLQkJaWYgKHJldHJ5QnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgcmV0cnlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVUUlk7Ci0JCWlmIChhYm9ydEJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGFib3J0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkFCT1JUOwotCQlpZiAoaWdub3JlQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWdub3JlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklHTk9SRTsKLQkJaWYgKGljb25FcnJvckJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGljb25FcnJvckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JQ09OX0VSUk9SOwotCQlpZiAoaWNvbkluZm9ybWF0aW9uQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWNvbkluZm9ybWF0aW9uQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklDT05fSU5GT1JNQVRJT047Ci0JCWlmIChpY29uUXVlc3Rpb25CdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBpY29uUXVlc3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9RVUVTVElPTjsKLQkJaWYgKGljb25XYXJuaW5nQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWNvbldhcm5pbmdCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9XQVJOSU5HOwotCQlpZiAoaWNvbldvcmtpbmdCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBpY29uV29ya2luZ0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JQ09OX1dPUktJTkc7Ci0JCWlmIChwcmltYXJ5TW9kYWxCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBwcmltYXJ5TW9kYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUFJJTUFSWV9NT0RBTDsKLQkJaWYgKGFwcGxpY2F0aW9uTW9kYWxCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkFQUExJQ0FUSU9OX01PREFMOwotCQlpZiAoc3lzdGVtTW9kYWxCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBzeXN0ZW1Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TWVNURU1fTU9EQUw7Ci0JCWlmIChzaGVldEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEVFVDsKLQkJaWYgKHNhdmVCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBzYXZlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNBVkU7Ci0JCWlmIChvcGVuQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgb3BlbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5PUEVOOwotCQlpZiAobXVsdGlCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkKLQkJLyogT3BlbiB0aGUgYXBwcm9wcmlhdGUgZGlhbG9nIHR5cGUgKi8KLQkJU3RyaW5nIG5hbWUgPSBkaWFsb2dDb21iby5nZXRUZXh0ICgpOwotCQkKLQkJaWYgKG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3JEaWFsb2ciKSkpIHsKLQkJCUNvbG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyAoc2hlbGwgLHN0eWxlKTsKLQkJCWRpYWxvZy5zZXRSR0IgKG5ldyBSR0IgKDEwMCwgMTAwLCAxMDApKTsKLQkJCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlSR0IgcmVzdWx0ID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yRGlhbG9nIikgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyIiICsgcmVzdWx0fSkgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoImdldFJHQigpID0gIiArIGRpYWxvZy5nZXRSR0IoKSArIFRleHQuREVMSU1JVEVSICsgVGV4dC5ERUxJTUlURVIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAobmFtZS5lcXVhbHMgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaXJlY3RvcnlEaWFsb2ciKSkpIHsKLQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nIChzaGVsbCwgc3R5bGUpOwotCQkJZGlhbG9nLnNldE1lc3NhZ2UgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJFeGFtcGxlX3N0cmluZyIpKTsKLQkJCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRpcmVjdG9yeURpYWxvZyIpICsgVGV4dC5ERUxJTUlURVIpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pICsgVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVEaWFsb2ciKSkpIHsKLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cgKHNoZWxsLCBzdHlsZSk7Ci0JCQlkaWFsb2cuc2V0RmlsZU5hbWUgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJyZWFkbWVfdHh0IikpOwotCQkJZGlhbG9nLnNldEZpbHRlck5hbWVzIChGaWx0ZXJOYW1lcyk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyAoRmlsdGVyRXh0ZW5zaW9ucyk7Ci0JCQlkaWFsb2cuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikpOwotCQkJU3RyaW5nIHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVEaWFsb2ciKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IiIgKyByZXN1bHR9KSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kICgiZ2V0RmlsZU5hbWVzKCkgPSIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQlpZiAoKGRpYWxvZy5nZXRTdHlsZSAoKSAmIFNXVC5NVUxUSSkgIT0gMCkgewotCQkJCVN0cmluZyBbXSBmaWxlcyA9IGRpYWxvZy5nZXRGaWxlTmFtZXMgKCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kICgiXHQiICsgZmlsZXMgW2ldICsgVGV4dC5ERUxJTUlURVIpOwotCQkJCX0KLQkJCX0KLQkJCXRleHRXaWRnZXQuYXBwZW5kICgiZ2V0RmlsdGVySW5kZXgoKSA9ICIgKyBkaWFsb2cuZ2V0RmlsdGVySW5kZXgoKSArIFRleHQuREVMSU1JVEVSICsgVGV4dC5ERUxJTUlURVIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAobmFtZS5lcXVhbHMgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250RGlhbG9nIikpKSB7Ci0JCQlGb250RGlhbG9nIGRpYWxvZyA9IG5ldyBGb250RGlhbG9nIChzaGVsbCwgc3R5bGUpOwotCQkJZGlhbG9nLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIpKTsKLQkJCUZvbnREYXRhIHJlc3VsdCA9IGRpYWxvZy5vcGVuICgpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250RGlhbG9nIikgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyIiICsgcmVzdWx0fSkgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoImdldEZvbnRMaXN0KCkgPSIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQlGb250RGF0YSBbXSBmb250cyA9IGRpYWxvZy5nZXRGb250TGlzdCAoKTsKLQkJCWlmIChmb250cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGZvbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kICgiXHQiICsgZm9udHMgW2ldICsgVGV4dC5ERUxJTUlURVIpOwotCQkJCX0KLQkJCX0KLQkJCXRleHRXaWRnZXQuYXBwZW5kICgiZ2V0UkdCKCkgPSAiICsgZGlhbG9nLmdldFJHQigpICsgVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByaW50RGlhbG9nIikpKSB7Ci0JCQlQcmludERpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbnREaWFsb2cgKHNoZWxsLCBzdHlsZSk7Ci0JCQlkaWFsb2cuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlQcmludGVyRGF0YSByZXN1bHQgPSBkaWFsb2cub3BlbiAoKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHJpbnREaWFsb2ciKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IiIgKyByZXN1bHR9KSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kICgiZ2V0U2NvcGUoKSA9ICIgKyBkaWFsb2cuZ2V0U2NvcGUoKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kICgiZ2V0U3RhcnRQYWdlKCkgPSAiICsgZGlhbG9nLmdldFN0YXJ0UGFnZSgpICsgVGV4dC5ERUxJTUlURVIpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKCJnZXRFbmRQYWdlKCkgPSAiICsgZGlhbG9nLmdldEVuZFBhZ2UoKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kICgiZ2V0UHJpbnRUb0ZpbGUoKSA9ICIgKyBkaWFsb2cuZ2V0UHJpbnRUb0ZpbGUoKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kICgicmVzdWx0LmZpbGVOYW1lID0gIiArIHJlc3VsdC5maWxlTmFtZSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kICgicmVzdWx0Lm9yaWVudGF0aW9uID0gIiArIChyZXN1bHQub3JpZW50YXRpb24gPT0gUHJpbnRlckRhdGEuTEFORFNDQVBFID8gIlByaW50ZXJEYXRhLkxBTkRTQ0FQRSIgOiAiUHJpbnRlckRhdGEuUE9SVFJBSVQiKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kICgicmVzdWx0LmNvcHlDb3VudCA9ICIgKyByZXN1bHQuY29weUNvdW50ICsgVGV4dC5ERUxJTUlURVIpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKCJyZXN1bHQuY29sbGF0ZSA9ICIgKyByZXN1bHQuY29sbGF0ZSArIFRleHQuREVMSU1JVEVSICsgVGV4dC5ERUxJTUlURVIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCWlmIChuYW1lLmVxdWFscyhDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVzc2FnZUJveCIpKSkgewotCQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveCAoc2hlbGwsIHN0eWxlKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRXhhbXBsZV9zdHJpbmciKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikpOwotCQkJaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuICgpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNZXNzYWdlQm94IikgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQkvKgotCQkJICogVGhlIHJlc3VsdGluZyBpbnRlZ2VyIGRlcGVuZHMgb24gdGhlIG9yaWdpbmFsCi0JCQkgKiBkaWFsb2cgc3R5bGUuICBEZWNvZGUgdGhlIHJlc3VsdCBhbmQgZGlzcGxheSBpdC4KLQkJCSAqLwotCQkJc3dpdGNoIChyZXN1bHQpIHsKLQkJCQljYXNlIFNXVC5PSzoKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULk9LIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuWUVTOgotCQkJCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyJTV1QuWUVTIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTk86Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IlNXVC5OTyJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULkNBTkNFTDoKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULkNBTkNFTCJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULkFCT1JUOiAKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULkFCT1JUIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUkVUUlk6Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IlNXVC5SRVRSWSJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULklHTk9SRToKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULklHTk9SRSJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgIkNvbnRyb2wiIGdyb3VwLiAgVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JCSAqIHJpZ2h0IGhhbGYgb2YgZWFjaCBleGFtcGxlIHRhYi4gIEl0IGNvbnNpc3RzIG9mIHRoZQotCQkgKiBzdHlsZSBncm91cCwgdGhlIGRpc3BsYXkgZ3JvdXAgYW5kIHRoZSBzaXplIGdyb3VwLgotCQkgKi8JCQkKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dD0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJY29udHJvbEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQljb250cm9sR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmFtZXRlcnMiKSk7Ci0JCQotCQkvKgotCQkgKiBDcmVhdGUgYSBncm91cCB0byBob2xkIHRoZSBkaWFsb2cgc3R5bGUgY29tYm8gYm94IGFuZAotCQkgKiBjcmVhdGUgZGlhbG9nIGJ1dHRvbi4KLQkJICovCi0JCWRpYWxvZ1N0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlkaWFsb2dTdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRpYWxvZ1N0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQlkaWFsb2dTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaWFsb2dfVHlwZSIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjb21ibyAqLwotCQlTdHJpbmcgW10gc3RyaW5ncyA9IHsKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb2xvckRpYWxvZyIpLCAKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaXJlY3RvcnlEaWFsb2ciKSwKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxlRGlhbG9nIiksCi0JCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udERpYWxvZyIpLAotCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByaW50RGlhbG9nIiksCi0JCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVzc2FnZUJveCIpLAotCQl9OwotCQlkaWFsb2dDb21ibyA9IG5ldyBDb21ibyAoZGlhbG9nU3R5bGVHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWRpYWxvZ0NvbWJvLnNldEl0ZW1zIChzdHJpbmdzKTsKLQkJZGlhbG9nQ29tYm8uc2V0VGV4dCAoc3RyaW5ncyBbMF0pOwotCQlkaWFsb2dDb21iby5zZXRWaXNpYmxlSXRlbUNvdW50KHN0cmluZ3MubGVuZ3RoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjcmVhdGUgZGlhbG9nIGJ1dHRvbiAqLwotCQljcmVhdGVCdXR0b24gPSBuZXcgQnV0dG9uKGRpYWxvZ1N0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJY3JlYXRlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDcmVhdGVfRGlhbG9nIikpOwotCQljcmVhdGVCdXR0b24uc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdmFyaW91cyBkaWFsb2cgYnV0dG9uIHN0eWxlIGNvbnRyb2xzICovCi0JCUdyb3VwIGJ1dHRvblN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlidXR0b25TdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlidXR0b25TdHlsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlidXR0b25TdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCdXR0b25fU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGJ1dHRvbiBzdHlsZSBidXR0b25zICovCi0JCW9rQnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJb2tCdXR0b24uc2V0VGV4dCAoIlNXVC5PSyIpOwotCQljYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uIChidXR0b25TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljYW5jZWxCdXR0b24uc2V0VGV4dCAoIlNXVC5DQU5DRUwiKTsKLQkJeWVzQnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJeWVzQnV0dG9uLnNldFRleHQgKCJTV1QuWUVTIik7Ci0JCW5vQnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9CdXR0b24uc2V0VGV4dCAoIlNXVC5OTyIpOwotCQlyZXRyeUJ1dHRvbiA9IG5ldyBCdXR0b24gKGJ1dHRvblN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJldHJ5QnV0dG9uLnNldFRleHQgKCJTV1QuUkVUUlkiKTsKLQkJYWJvcnRCdXR0b24gPSBuZXcgQnV0dG9uIChidXR0b25TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlhYm9ydEJ1dHRvbi5zZXRUZXh0ICgiU1dULkFCT1JUIik7Ci0JCWlnbm9yZUJ1dHRvbiA9IG5ldyBCdXR0b24gKGJ1dHRvblN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWlnbm9yZUJ1dHRvbi5zZXRUZXh0ICgiU1dULklHTk9SRSIpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGljb24gc3R5bGUgY29udHJvbHMgKi8KLQkJR3JvdXAgaWNvblN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlpY29uU3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaWNvblN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWljb25TdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJY29uX1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBpY29uIHN0eWxlIGJ1dHRvbnMgKi8KLQkJaWNvbkVycm9yQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25FcnJvckJ1dHRvbi5zZXRUZXh0ICgiU1dULklDT05fRVJST1IiKTsKLQkJaWNvbkluZm9ybWF0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25JbmZvcm1hdGlvbkJ1dHRvbi5zZXRUZXh0ICgiU1dULklDT05fSU5GT1JNQVRJT04iKTsKLQkJaWNvblF1ZXN0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25RdWVzdGlvbkJ1dHRvbi5zZXRUZXh0ICgiU1dULklDT05fUVVFU1RJT04iKTsKLQkJaWNvbldhcm5pbmdCdXR0b24gPSBuZXcgQnV0dG9uIChpY29uU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvbldhcm5pbmdCdXR0b24uc2V0VGV4dCAoIlNXVC5JQ09OX1dBUk5JTkciKTsKLQkJaWNvbldvcmtpbmdCdXR0b24gPSBuZXcgQnV0dG9uIChpY29uU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvbldvcmtpbmdCdXR0b24uc2V0VGV4dCAoIlNXVC5JQ09OX1dPUktJTkciKTsKLQkJbm9JY29uQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW5vSWNvbkJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9fSWNvbiIpKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbW9kYWwgc3R5bGUgY29udHJvbHMgKi8KLQkJR3JvdXAgbW9kYWxTdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbW9kYWxTdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCW1vZGFsU3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTW9kYWxfU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIG1vZGFsIHN0eWxlIGJ1dHRvbnMgKi8KLQkJcHJpbWFyeU1vZGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAobW9kYWxTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmltYXJ5TW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5QUklNQVJZX01PREFMIik7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5BUFBMSUNBVElPTl9NT0RBTCIpOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc3lzdGVtTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5TWVNURU1fTU9EQUwiKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIG90aGVyIHN0eWxlIGNvbnRyb2xzICovCi0JCUdyb3VwIG90aGVyU3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW90aGVyU3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJb3RoZXJTdHlsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlvdGhlclN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk90aGVyX1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBvdGhlciBzdHlsZSBidXR0b25zICovCi0JCXNoZWV0QnV0dG9uID0gbmV3IEJ1dHRvbihvdGhlclN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNoZWV0QnV0dG9uLnNldFRleHQoIlNXVC5TSEVFVCIpOwotCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgZmlsZSBkaWFsb2cgc3R5bGUgY29udHJvbHMgKi8KLQkJR3JvdXAgZmlsZURpYWxvZ1N0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlmaWxlRGlhbG9nU3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJZmlsZURpYWxvZ1N0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWZpbGVEaWFsb2dTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxlX0RpYWxvZ19TdHlsZXMiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZmlsZSBkaWFsb2cgc3R5bGUgYnV0dG9ucyAqLwotCQlvcGVuQnV0dG9uID0gbmV3IEJ1dHRvbihmaWxlRGlhbG9nU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJb3BlbkJ1dHRvbi5zZXRUZXh0KCJTV1QuT1BFTiIpOwotCQlzYXZlQnV0dG9uID0gbmV3IEJ1dHRvbiAoZmlsZURpYWxvZ1N0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNhdmVCdXR0b24uc2V0VGV4dCAoIlNXVC5TQVZFIik7Ci0JCW11bHRpQnV0dG9uID0gbmV3IEJ1dHRvbihmaWxlRGlhbG9nU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbXVsdGlCdXR0b24uc2V0VGV4dCgiU1dULk1VTFRJIik7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgb3JpZW50YXRpb24gZ3JvdXAgKi8KLQkJaWYgKFJUTF9TVVBQT1JUX0VOQUJMRSkgewotCQkJY3JlYXRlT3JpZW50YXRpb25Hcm91cCgpOwotCQl9Ci0JCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlkaWFsb2dDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZGlhbG9nU2VsZWN0ZWQgKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCWNyZWF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJY3JlYXRlQnV0dG9uU2VsZWN0ZWQgKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIGJ1dHRvblN0eWxlTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlidXR0b25TdHlsZVNlbGVjdGVkIChldmVudCk7Ci0JCQl9Ci0JCX07Ci0JCW9rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChidXR0b25TdHlsZUxpc3RlbmVyKTsKLQkJY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChidXR0b25TdHlsZUxpc3RlbmVyKTsKLQkJeWVzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChidXR0b25TdHlsZUxpc3RlbmVyKTsKLQkJbm9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQlyZXRyeUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCWFib3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChidXR0b25TdHlsZUxpc3RlbmVyKTsKLQkJaWdub3JlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChidXR0b25TdHlsZUxpc3RlbmVyKTsKLQkKLQkJLyogU2V0IGRlZmF1bHQgdmFsdWVzIGZvciBzdHlsZSBidXR0b25zICovCi0JCW9rQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJeWVzQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJbm9CdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlyZXRyeUJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWFib3J0QnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJaWdub3JlQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJaWNvbkVycm9yQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJaWNvbkluZm9ybWF0aW9uQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJaWNvblF1ZXN0aW9uQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJaWNvbldhcm5pbmdCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpY29uV29ya2luZ0J1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCW5vSWNvbkJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCXNhdmVCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlvcGVuQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJb3BlbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQltdWx0aUJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCW5vSWNvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCWV4YW1wbGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQkKLQkJLyoKLQkJICogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSB0ZXh0IHdpZGdldCB0byBkaXNwbGF5Ci0JCSAqIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5IHRoZSBleGFtcGxlIGRpYWxvZ3MuCi0JCSAqLwotCQlyZXN1bHRHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXJlc3VsdEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlyZXN1bHRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlyZXN1bHRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGlhbG9nX1Jlc3VsdCIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSBhIG11bHRpIGxpbmVkLCBzY3JvbGxlZCB0ZXh0IHdpZGdldCBmb3Igb3V0cHV0LgotCQkgKi8KLQkJdGV4dFdpZGdldCA9IG5ldyBUZXh0KHJlc3VsdEdyb3VwLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXRleHRXaWRnZXQuc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwkKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHBsYXRmb3JtIGRpYWxvZ3MgZG8gbm90IGhhdmUgU1dUIGxpc3RlbmVycy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxpc3RlbmVyc0dyb3VwICgpIHsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgYSBkaWFsb2cgdHlwZSBjb21ibyBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIHNlbGVjdGlvbiBldmVudAotCSAqLwotCXZvaWQgZGlhbG9nU2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCi0JCS8qIEVuYWJsZS9EaXNhYmxlIHRoZSBidXR0b25zICovCi0JCVN0cmluZyBuYW1lID0gZGlhbG9nQ29tYm8uZ2V0VGV4dCAoKTsKLQkJYm9vbGVhbiBpc01lc3NhZ2VCb3ggPSBuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lc3NhZ2VCb3giKSk7Ci0JCWJvb2xlYW4gaXNGaWxlRGlhbG9nID0gbmFtZS5lcXVhbHMgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxlRGlhbG9nIikpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQljYW5jZWxCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJeWVzQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCW5vQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCXJldHJ5QnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWFib3J0QnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWlnbm9yZUJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlpY29uRXJyb3JCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJaWNvbkluZm9ybWF0aW9uQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWljb25RdWVzdGlvbkJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlpY29uV2FybmluZ0J1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlpY29uV29ya2luZ0J1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlub0ljb25CdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJc2F2ZUJ1dHRvbi5zZXRFbmFibGVkIChpc0ZpbGVEaWFsb2cpOwotCQlvcGVuQnV0dG9uLnNldEVuYWJsZWQgKGlzRmlsZURpYWxvZyk7Ci0JCW11bHRpQnV0dG9uLnNldEVuYWJsZWQgKGlzRmlsZURpYWxvZyk7Ci0JCi0JCS8qIFVuc2VsZWN0IHRoZSBidXR0b25zICovCi0JCWlmICghaXNNZXNzYWdlQm94KSB7Ci0JCQlva0J1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCWNhbmNlbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCXllc0J1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCW5vQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJcmV0cnlCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlhYm9ydEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCWlnbm9yZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFswXTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiRGlhbG9nIjsKLQl9Ci0JCi0JLyoqCi0JICogUmVjcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQlpZiAodGV4dFdpZGdldCA9PSBudWxsKSB7Ci0JCQlzdXBlci5yZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQl9IAotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0V4cGFuZEJhclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRXhwYW5kQmFyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMWEyNWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRXhwYW5kQmFyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIEV4cGFuZEJhclRhYiBleHRlbmRzIFRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlFeHBhbmRCYXIgZXhwYW5kQmFyMTsKLQlHcm91cCBleHBhbmRCYXJHcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCQotCUJ1dHRvbiB2ZXJ0aWNhbEJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlFeHBhbmRCYXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGxpc3QgKi8KLQkJZXhwYW5kQmFyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlleHBhbmRCYXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJZXhwYW5kQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJZXhwYW5kQmFyR3JvdXAuc2V0VGV4dCAoIkV4cGFuZEJhciIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlZfU0NST0xMOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwkJCi0JCWV4cGFuZEJhcjEgPSBuZXcgRXhwYW5kQmFyIChleHBhbmRCYXJHcm91cCwgc3R5bGUpOwotCQkKLQkJLy8gRmlyc3QgaXRlbQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoZXhwYW5kQmFyMSwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuUFVTSCkuc2V0VGV4dCgiU1dULlBVU0giKTsKLQkJbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuUkFESU8pLnNldFRleHQoIlNXVC5SQURJTyIpOwotCQluZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5DSEVDSykuc2V0VGV4dCgiU1dULkNIRUNLIik7Ci0JCW5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULlRPR0dMRSkuc2V0VGV4dCgiU1dULlRPR0dMRSIpOwotCQlFeHBhbmRJdGVtIGl0ZW0gPSBuZXcgRXhwYW5kSXRlbSAoZXhwYW5kQmFyMSwgU1dULk5PTkUsIDApOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkl0ZW0xX1RleHQiKSk7Ci0JCWl0ZW0uc2V0SGVpZ2h0KGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnkpOwotCQlpdGVtLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJCi0JCS8vIFNlY29uZCBpdGVtCi0JCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKGV4cGFuZEJhcjEsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCAoMiwgZmFsc2UpKTsJCi0JCW5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0SW1hZ2UoZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUikpOwotCQluZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlNXVC5JQ09OX0VSUk9SIik7Ci0JCW5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0SW1hZ2UoZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTikpOwotCQluZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlNXVC5JQ09OX0lORk9STUFUSU9OIik7Ci0JCW5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0SW1hZ2UoZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKSk7Ci0JCW5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiU1dULklDT05fV0FSTklORyIpOwotCQluZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldEltYWdlKGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fUVVFU1RJT04pKTsKLQkJbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJTV1QuSUNPTl9RVUVTVElPTiIpOwotCQlpdGVtID0gbmV3IEV4cGFuZEl0ZW0gKGV4cGFuZEJhcjEsIFNXVC5OT05FLCAxKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJdGVtMl9UZXh0IikpOwotCQlpdGVtLnNldEhlaWdodChjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLQkJaXRlbS5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVl9TQ1JPTEwiKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0KCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2V4cGFuZEJhcjF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlNwYWNpbmcifTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvcnQgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnRUYWJUZXh0KCkgewotCQlyZXR1cm4gIkVCIjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJFeHBhbmRCYXIiOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJV2lkZ2V0IFtdIHdpZGdldHMgPSBnZXRFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJaWYgKHdpZGdldHMubGVuZ3RoICE9IDApewotCQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuVl9TQ1JPTEwpICE9IDApOwotCQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKHdpZGdldHMgWzBdLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Hcm91cFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvR3JvdXBUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4NDM0ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Hcm91cFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgR3JvdXBUYWIgZXh0ZW5kcyBUYWIgewotCUJ1dHRvbiB0aXRsZUJ1dHRvbjsKLQkKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUdyb3VwIGdyb3VwMTsKLQlHcm91cCBncm91cEdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gc2hhZG93RXRjaGVkSW5CdXR0b24sIHNoYWRvd0V0Y2hlZE91dEJ1dHRvbiwgc2hhZG93SW5CdXR0b24sIHNoYWRvd091dEJ1dHRvbiwgc2hhZG93Tm9uZUJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlHcm91cFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJPdGhlciIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIGRpc3BsYXkgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlICovCi0JCXRpdGxlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJdGl0bGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlX1RleHQiKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCXRpdGxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRUaXRsZVRleHQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIEdyb3VwICovCi0JCWdyb3VwR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlncm91cEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlncm91cEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWdyb3VwR3JvdXAuc2V0VGV4dCAoIkdyb3VwIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc2hhZG93RXRjaGVkSW5CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX0VUQ0hFRF9JTjsKLQkJaWYgKHNoYWRvd0V0Y2hlZE91dEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfRVRDSEVEX09VVDsKLQkJaWYgKHNoYWRvd0luQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19JTjsKLQkJaWYgKHNoYWRvd091dEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfT1VUOwotCQlpZiAoc2hhZG93Tm9uZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfTk9ORTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0KLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJZ3JvdXAxID0gbmV3IEdyb3VwIChncm91cEdyb3VwLCBzdHlsZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXNoYWRvd0V0Y2hlZEluQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93RXRjaGVkSW5CdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfRVRDSEVEX0lOIik7Ci0JCXNoYWRvd0V0Y2hlZEluQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJc2hhZG93RXRjaGVkT3V0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93RXRjaGVkT3V0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX0VUQ0hFRF9PVVQiKTsKLQkJc2hhZG93SW5CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19JTiIpOwotCQlzaGFkb3dPdXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dPdXRCdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfT1VUIik7Ci0JCXNoYWRvd05vbmVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dOb25lQnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX05PTkUiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2dyb3VwMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVGV4dCIsICJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkdyb3VwIjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0aXRsZSB0ZXh0IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFRpdGxlVGV4dCAoKSB7Ci0JCWlmICh0aXRsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCWdyb3VwMS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGVfVGV4dCIpKTsKLQkJfSBlbHNlIHsKLQkJCWdyb3VwMS5zZXRUZXh0ICgiIik7Ci0JCX0KLQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlzaGFkb3dFdGNoZWRJbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0VUQ0hFRF9JTikgIT0gMCk7Ci0JCXNoYWRvd0V0Y2hlZE91dEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0VUQ0hFRF9PVVQpICE9IDApOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0lOKSAhPSAwKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGdyb3VwMS5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfT1VUKSAhPSAwKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX05PTkUpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoZ3JvdXAxLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgc2V0VGl0bGVUZXh0ICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xhYmVsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MYWJlbFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTY4ZWNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xhYmVsVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIExhYmVsVGFiIGV4dGVuZHMgQWxpZ25hYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUxhYmVsIGxhYmVsMSwgbGFiZWwyLCBsYWJlbDMsIGxhYmVsNCwgbGFiZWw1LCBsYWJlbDY7Ci0JR3JvdXAgdGV4dExhYmVsR3JvdXAsIGltYWdlTGFiZWxHcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gd3JhcEJ1dHRvbiwgc2VwYXJhdG9yQnV0dG9uLCBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbiwgc2hhZG93SW5CdXR0b24sIHNoYWRvd091dEJ1dHRvbiwgc2hhZG93Tm9uZUJ1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JTGFiZWxUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgbGFiZWxzICovCi0JCXRleHRMYWJlbEdyb3VwID0gbmV3IEdyb3VwKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJdGV4dExhYmVsR3JvdXAuc2V0TGF5b3V0IChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJdGV4dExhYmVsR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdGV4dExhYmVsR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRleHRfTGFiZWxzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIGxhYmVscyAqLwotCQlpbWFnZUxhYmVsR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULlNIQURPV19OT05FKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlpbWFnZUxhYmVsR3JvdXAuc2V0TGF5b3V0IChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJaW1hZ2VMYWJlbEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdlTGFiZWxHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VfTGFiZWxzIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJaWYgKHNlcGFyYXRvckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TRVBBUkFUT1I7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJaWYgKHNoYWRvd0luQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19JTjsKLQkJaWYgKHNoYWRvd091dEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfT1VUOwotCQlpZiAoc2hhZG93Tm9uZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfTk9ORTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWxhYmVsMSA9IG5ldyBMYWJlbCAodGV4dExhYmVsR3JvdXAsIHN0eWxlKTsKLQkJbGFiZWwxLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZSIpKTsKLQkJbGFiZWwyID0gbmV3IExhYmVsICh0ZXh0TGFiZWxHcm91cCwgc3R5bGUpOwotCQlsYWJlbDIuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHdvIikpOwotCQlsYWJlbDMgPSBuZXcgTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWlmICh3cmFwQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJbGFiZWwzLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJXcmFwX1RleHQiKSk7Ci0JCX0gZWxzZSB7Ci0JCQlsYWJlbDMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRocmVlIikpOwotCQl9Ci0JCWxhYmVsNCA9IG5ldyBMYWJlbCAoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNC5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWxhYmVsNSA9IG5ldyBMYWJlbCAoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlsYWJlbDYgPSBuZXcgTGFiZWwoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNi5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXdyYXBCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl3cmFwQnV0dG9uLnNldFRleHQgKCJTV1QuV1JBUCIpOwotCQlzZXBhcmF0b3JCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzZXBhcmF0b3JCdXR0b24uc2V0VGV4dCAoIlNXVC5TRVBBUkFUT1IiKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IT1JJWk9OVEFMIik7Ci0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQlHcm91cCBzdHlsZVN1Ykdyb3VwID0gbmV3IEdyb3VwIChzdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlU3ViR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXNoYWRvd0luQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfSU4iKTsKLQkJc2hhZG93T3V0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX09VVCIpOwotCQlzaGFkb3dOb25lQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19OT05FIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7bGFiZWwxLCBsYWJlbDIsIGxhYmVsMywgbGFiZWw0LCBsYWJlbDUsIGxhYmVsNn07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVGV4dCIsICJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkxhYmVsIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCkgewotCQlpbnQgYWxpZ25tZW50ID0gMDsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJaWYgKGNlbnRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5SSUdIVDsKLQkJbGFiZWwxLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwyLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwzLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWw0LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWw1LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWw2LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlib29sZWFuIGlzU2VwYXJhdG9yID0gKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5TRVBBUkFUT1IpICE9IDA7Ci0JCXdyYXBCdXR0b24uc2V0U2VsZWN0aW9uICghaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5XUkFQKSAhPSAwKTsKLQkJbGVmdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCFpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULkxFRlQpICE9IDApOwotCQljZW50ZXJCdXR0b24uc2V0U2VsZWN0aW9uICghaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5DRU5URVIpICE9IDApOwotCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCFpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlJJR0hUKSAhPSAwKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0U2VsZWN0aW9uIChpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19JTikgIT0gMCk7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX09VVCkgIT0gMCk7Ci0JCXNoYWRvd05vbmVCdXR0b24uc2V0U2VsZWN0aW9uIChpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19OT05FKSAhPSAwKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuSE9SSVpPTlRBTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7CQkKLQkJd3JhcEJ1dHRvbi5zZXRFbmFibGVkICghaXNTZXBhcmF0b3IpOwotCQlsZWZ0QnV0dG9uLnNldEVuYWJsZWQgKCFpc1NlcGFyYXRvcik7Ci0JCWNlbnRlckJ1dHRvbi5zZXRFbmFibGVkICghaXNTZXBhcmF0b3IpOwotCQlyaWdodEJ1dHRvbi5zZXRFbmFibGVkICghaXNTZXBhcmF0b3IpOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRFbmFibGVkIChpc1NlcGFyYXRvcik7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRFbmFibGVkIChpc1NlcGFyYXRvcik7Ci0JCXNoYWRvd05vbmVCdXR0b24uc2V0RW5hYmxlZCAoaXNTZXBhcmF0b3IpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldEVuYWJsZWQgKGlzU2VwYXJhdG9yKTsKLQkJdmVydGljYWxCdXR0b24uc2V0RW5hYmxlZCAoaXNTZXBhcmF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xpbmtUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xpbmtUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiMDFiOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MaW5rVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgTGlua1RhYiBleHRlbmRzIFRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlMaW5rIGxpbmsxOwotCUdyb3VwIGxpbmtHcm91cDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JTGlua1RhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbGlzdCAqLwotCQlsaW5rR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlsaW5rR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWxpbmtHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlsaW5rR3JvdXAuc2V0VGV4dCAoIkxpbmsiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwkJCi0JCXRyeSB7Ci0JCQlsaW5rMSA9IG5ldyBMaW5rIChsaW5rR3JvdXAsIHN0eWxlKTsKLQkJCWxpbmsxLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5rVGV4dCIpKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJLy8gdGVtcG9yYXJ5IGNvZGUgZm9yIHBob3RvbgotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGxpbmtHcm91cCwgU1dULkNFTlRFUiB8IFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQgKCJMaW5rIHdpZGdldCBub3Qgc3Vwb3J0ZWQiKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0KCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLS8vCQkgdGVtcG9yYXJ5IGNvZGUgZm9yIHBob3RvbgotCQlpZiAobGluazEgIT0gbnVsbCkgcmV0dXJuIG5ldyBXaWRnZXQgW10ge2xpbmsxfTsKLQkJcmV0dXJuIG5ldyBXaWRnZXRbXSB7fTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUZXh0IiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkxpbmsiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGlzdFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGlzdFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzY2VhY2E5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xpc3RUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBMaXN0VGFiIGV4dGVuZHMgU2Nyb2xsYWJsZVRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUxpc3QgbGlzdDE7Ci0JR3JvdXAgbGlzdEdyb3VwOwotCQotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGExID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfOCIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlMaXN0VGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBsaXN0ICovCi0JCWxpc3RHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJbGlzdEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWxpc3RHcm91cC5zZXRUZXh0ICgiTGlzdCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWxpc3QxID0gbmV3IExpc3QgKGxpc3RHcm91cCwgc3R5bGUpOwotCQlsaXN0MS5zZXRJdGVtcyAoTGlzdERhdGExKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7bGlzdDF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ikl0ZW1zIiwgIlNlbGVjdGlvbiIsICJUb29sVGlwVGV4dCIsICJUb3BJbmRleCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkxpc3QiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL01lbnVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL01lbnVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxNTc5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9NZW51VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBNZW51VGFiIGV4dGVuZHMgVGFiIHsJCi0JLyogV2lkZ2V0cyBhZGRlZCB0byB0aGUgIk1lbnUgU3R5bGUiLCAiTWVudUl0ZW0gU3R5bGUiIGFuZCAiT3RoZXIiIGdyb3VwcyAqLwotCUJ1dHRvbiBiYXJCdXR0b24sIGRyb3BEb3duQnV0dG9uLCBwb3BVcEJ1dHRvbiwgbm9SYWRpb0dyb3VwQnV0dG9uLCBsZWZ0VG9SaWdodEJ1dHRvbiwgcmlnaHRUb0xlZnRCdXR0b247Ci0JQnV0dG9uIGNoZWNrQnV0dG9uLCBjYXNjYWRlQnV0dG9uLCBwdXNoQnV0dG9uLCByYWRpb0J1dHRvbiwgc2VwYXJhdG9yQnV0dG9uOwotCUJ1dHRvbiBpbWFnZXNCdXR0b24sIGFjY2VsZXJhdG9yc0J1dHRvbiwgbW5lbW9uaWNzQnV0dG9uLCBzdWJNZW51QnV0dG9uLCBzdWJTdWJNZW51QnV0dG9uOwotCUJ1dHRvbiBjcmVhdGVCdXR0b24sIGNsb3NlQWxsQnV0dG9uOwotCUdyb3VwIG1lbnVJdGVtU3R5bGVHcm91cDsKLQotCS8qIFZhcmlhYmxlcyB1c2VkIHRvIHRyYWNrIHRoZSBvcGVuIHNoZWxscyAqLwotCWludCBzaGVsbENvdW50ID0gMDsKLQlTaGVsbCBbXSBzaGVsbHMgPSBuZXcgU2hlbGwgWzRdOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlNZW51VGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbGwgdGhlIGV4YW1wbGUgc2hlbGxzLgotCSAqLwotCXZvaWQgY2xvc2VBbGxTaGVsbHMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpPHNoZWxsQ291bnQ7IGkrKykgewotCQkJaWYgKHNoZWxsc1tpXSAhPSBudWxsICYgIXNoZWxscyBbaV0uaXNEaXNwb3NlZCAoKSkgewotCQkJCXNoZWxscyBbaV0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXNoZWxsQ291bnQgPSAwOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIENyZWF0ZSBidXR0b24gc2VsZWN0aW9uIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGV2ZW50IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQotCQkvKgotCQkgKiBSZW1lbWJlciB0aGUgZXhhbXBsZSBzaGVsbHMgc28gdGhleQotCQkgKiBjYW4gYmUgZGlzcG9zZWQgYnkgdGhlIHVzZXIuCi0JCSAqLwotCQlpZiAoc2hlbGxDb3VudCA+PSBzaGVsbHMubGVuZ3RoKSB7Ci0JCQlTaGVsbCBbXSBuZXdTaGVsbHMgPSBuZXcgU2hlbGwgW3NoZWxscy5sZW5ndGggKyA0XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkgKHNoZWxscywgMCwgbmV3U2hlbGxzLCAwLCBzaGVsbHMubGVuZ3RoKTsKLQkJCXNoZWxscyA9IG5ld1NoZWxsczsKLQkJfQotCQotCQlpbnQgb3JpZW50YXRpb24gPSAwOwotCQlpZiAobGVmdFRvUmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIG9yaWVudGF0aW9uIHw9IFNXVC5MRUZUX1RPX1JJR0hUOwotCQlpZiAocmlnaHRUb0xlZnRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIG9yaWVudGF0aW9uIHw9IFNXVC5SSUdIVF9UT19MRUZUOwotCQlpbnQgcmFkaW9CZWhhdmlvciA9IDA7Ci0JCWlmIChub1JhZGlvR3JvdXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHJhZGlvQmVoYXZpb3IgfD0gU1dULk5PX1JBRElPX0dST1VQOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBzaGVsbCBhbmQgbWVudShzKSAqLwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoU1dULlNIRUxMX1RSSU0gfCBvcmllbnRhdGlvbik7Ci0JCXNoZWxscyBbc2hlbGxDb3VudF0gPSBzaGVsbDsKLQkJaWYgKGJhckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCS8qIENyZWF0ZSBtZW51IGJhci4gKi8KLQkJCU1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSIHwgcmFkaW9CZWhhdmlvcik7Ci0JCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQkJaG9va0xpc3RlbmVycyhtZW51QmFyKTsKLQotCQkJaWYgKGRyb3BEb3duQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIGNhc2NhZGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkvKiBDcmVhdGUgY2FzY2FkZSBidXR0b24gYW5kIGRyb3AtZG93biBtZW51IGluIG1lbnUgYmFyLiAqLwotCQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIkNhc2NhZGUiKSk7Ci0JCQkJaWYgKGltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQkJCQlNZW51IGRyb3BEb3duTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOIHwgcmFkaW9CZWhhdmlvcik7Ci0JCQkJaXRlbS5zZXRNZW51KGRyb3BEb3duTWVudSk7Ci0JCQkJaG9va0xpc3RlbmVycyhkcm9wRG93bk1lbnUpOwotCQotCQkJCS8qIENyZWF0ZSB2YXJpb3VzIG1lbnUgaXRlbXMsIGRlcGVuZGluZyBvbiBzZWxlY3Rpb25zLiAqLwotCQkJCWNyZWF0ZU1lbnVJdGVtcyhkcm9wRG93bk1lbnUsIHN1Yk1lbnVCdXR0b24uZ2V0U2VsZWN0aW9uKCksIHN1YlN1Yk1lbnVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocG9wVXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCS8qIENyZWF0ZSBwb3AtdXAgbWVudS4gKi8KLQkJCU1lbnUgcG9wVXBNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5QT1BfVVAgfCByYWRpb0JlaGF2aW9yKTsKLQkJCXNoZWxsLnNldE1lbnUocG9wVXBNZW51KTsKLQkJCWhvb2tMaXN0ZW5lcnMocG9wVXBNZW51KTsKLQotCQkJLyogQ3JlYXRlIHZhcmlvdXMgbWVudSBpdGVtcywgZGVwZW5kaW5nIG9uIHNlbGVjdGlvbnMuICovCi0JCQljcmVhdGVNZW51SXRlbXMocG9wVXBNZW51LCBzdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbigpLCBzdWJTdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQkJLyogU2V0IHRoZSBzaXplLCB0aXRsZSBhbmQgb3BlbiB0aGUgc2hlbGwuICovCi0JCXNoZWxsLnNldFNpemUgKDMwMCwgMTAwKTsKLQkJc2hlbGwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikgKyBzaGVsbENvdW50KTsKLQkJc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQllLmdjLmRyYXdTdHJpbmcoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBvcHVwTWVudUhlcmUiKSwgMjAsIDIwKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXNoZWxsQ291bnQrKzsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgIkNvbnRyb2wiIGdyb3VwLiAgVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JCSAqIHJpZ2h0IGhhbGYgb2YgZWFjaCBleGFtcGxlIHRhYi4gIEZvciBNZW51VGFiLCBpdCBjb25zaXN0cyBvZgotCQkgKiB0aGUgTWVudSBzdHlsZSBncm91cCwgdGhlIE1lbnVJdGVtIHN0eWxlIGdyb3VwIGFuZCB0aGUgJ290aGVyJyBncm91cC4KLQkJICovCQkKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY29udHJvbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIG1lbnUgc3R5bGUgY29udHJvbHMgKi8KLQkJc3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVfU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIG1lbnUgaXRlbSBzdHlsZSBjb250cm9scyAqLwotCQltZW51SXRlbVN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltZW51SXRlbVN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1lbnVJdGVtU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQltZW51SXRlbVN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX1N0eWxlcyIpKTsKLQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlICdvdGhlcicgY29udHJvbHMgKi8KLQkJb3RoZXJHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJb3RoZXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3RoZXIiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgbWVudSBzdHlsZSBidXR0b25zICovCi0JCWJhckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJhckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJBUiIpOwotCQlkcm9wRG93bkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFRleHQgKCJTV1QuRFJPUF9ET1dOIik7Ci0JCXBvcFVwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcG9wVXBCdXR0b24uc2V0VGV4dCAoIlNXVC5QT1BfVVAiKTsKLQkJbm9SYWRpb0dyb3VwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9SYWRpb0dyb3VwQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fUkFESU9fR1JPVVAiKTsKLQkJbGVmdFRvUmlnaHRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlsZWZ0VG9SaWdodEJ1dHRvbi5zZXRUZXh0ICgiU1dULkxFRlRfVE9fUklHSFQiKTsKLQkJbGVmdFRvUmlnaHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlyaWdodFRvTGVmdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXJpZ2h0VG9MZWZ0QnV0dG9uLnNldFRleHQgKCJTV1QuUklHSFRfVE9fTEVGVCIpOwotCQotCQkvKiBDcmVhdGUgdGhlIG1lbnUgaXRlbSBzdHlsZSBidXR0b25zICovCi0JCWNhc2NhZGVCdXR0b24gPSBuZXcgQnV0dG9uIChtZW51SXRlbVN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNhc2NhZGVCdXR0b24uc2V0VGV4dCAoIlNXVC5DQVNDQURFIik7Ci0JCWNoZWNrQnV0dG9uID0gbmV3IEJ1dHRvbiAobWVudUl0ZW1TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljaGVja0J1dHRvbi5zZXRUZXh0ICgiU1dULkNIRUNLIik7Ci0JCXB1c2hCdXR0b24gPSBuZXcgQnV0dG9uIChtZW51SXRlbVN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXB1c2hCdXR0b24uc2V0VGV4dCAoIlNXVC5QVVNIIik7Ci0JCXJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbiAobWVudUl0ZW1TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0ICgiU1dULlJBRElPIik7Ci0JCXNlcGFyYXRvckJ1dHRvbiA9IG5ldyBCdXR0b24gKG1lbnVJdGVtU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc2VwYXJhdG9yQnV0dG9uLnNldFRleHQgKCJTV1QuU0VQQVJBVE9SIik7Ci0JCQotCQkvKiBDcmVhdGUgdGhlICdvdGhlcicgYnV0dG9ucyAqLwotCQlpbWFnZXNCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbWFnZXNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlcyIpKTsKLQkJYWNjZWxlcmF0b3JzQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJYWNjZWxlcmF0b3JzQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBY2NlbGVyYXRvcnMiKSk7Ci0JCW1uZW1vbmljc0J1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1uZW1vbmljc0J1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTW5lbW9uaWNzIikpOwotCQlzdWJNZW51QnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc3ViTWVudUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3ViTWVudSIpKTsKLQkJc3ViU3ViTWVudUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXN1YlN1Yk1lbnVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN1YlN1Yk1lbnUiKSk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlICJjcmVhdGUiIGFuZCAiY2xvc2VBbGwiIGJ1dHRvbnMgKGFuZCBhICdmaWxsZXInIGxhYmVsIHRvIHBsYWNlIHRoZW0pICovCi0JCW5ldyBMYWJlbChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY3JlYXRlQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNyZWF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWNyZWF0ZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3JlYXRlX1NoZWxsIikpOwotCQljbG9zZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQljbG9zZUFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWNsb3NlQWxsQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDbG9zZV9BbGxfU2hlbGxzIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQljcmVhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3JlYXRlQnV0dG9uU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQljbG9zZUFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljbG9zZUFsbFNoZWxscyAoKTsKLQkJCX0KLQkJfSk7Ci0JCXN1Yk1lbnVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3ViU3ViTWVudUJ1dHRvbi5zZXRFbmFibGVkIChzdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCQl9Ci0JCX0pOwotCQotCQkvKiBTZXQgdGhlIGRlZmF1bHQgc3RhdGUgKi8KLQkJYmFyQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCXBvcFVwQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWNhc2NhZGVCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJY2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJcHVzaEJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlyYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlzZXBhcmF0b3JCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJc3ViU3ViTWVudUJ1dHRvbi5zZXRFbmFibGVkIChzdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qIENyZWF0ZSB2YXJpb3VzIG1lbnUgaXRlbXMsIGRlcGVuZGluZyBvbiBzZWxlY3Rpb25zLiAqLwotCXZvaWQgY3JlYXRlTWVudUl0ZW1zKE1lbnUgbWVudSwgYm9vbGVhbiBjcmVhdGVTdWJNZW51LCBib29sZWFuIGNyZWF0ZVN1YlN1Yk1lbnUpIHsKLQkJTWVudUl0ZW0gaXRlbTsKLQkJaWYgKHB1c2hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0KGdldE1lbnVJdGVtVGV4dCgiUHVzaCIpKTsKLQkJCWlmIChhY2NlbGVyYXRvcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyBTV1QuTU9EMiArICdQJyk7Ci0JCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQkJfQotCQkKLQkJaWYgKHNlcGFyYXRvckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQl9Ci0JCQotCQlpZiAoY2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKLQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIkNoZWNrIikpOwotCQkJaWYgKGFjY2VsZXJhdG9yc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArIFNXVC5NT0QyICsgJ0MnKTsKLQkJCWlmIChpbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQkJfQotCQkJCQotCQlpZiAocmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlJBRElPKTsKLQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIjFSYWRpbyIpKTsKLQkJCWlmIChhY2NlbGVyYXRvcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyBTV1QuTU9EMiArICcxJyk7Ci0JCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQkJaXRlbS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlob29rTGlzdGVuZXJzKGl0ZW0pOwotCi0JCQlpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5SQURJTyk7Ci0JCQlpdGVtLnNldFRleHQoZ2V0TWVudUl0ZW1UZXh0KCIyUmFkaW8iKSk7Ci0JCQlpZiAoYWNjZWxlcmF0b3JzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgU1dULk1PRDIgKyAnMicpOwotCQkJaWYgKGltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJCWhvb2tMaXN0ZW5lcnMoaXRlbSk7Ci0JCX0KLQotCQlpZiAoY3JlYXRlU3ViTWVudSAmJiBjYXNjYWRlQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkvKiBDcmVhdGUgY2FzY2FkZSBidXR0b24gYW5kIGRyb3AtZG93biBtZW51IGZvciB0aGUgc3ViLW1lbnUuICovCi0JCQlpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIkNhc2NhZGUiKSk7Ci0JCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJCWhvb2tMaXN0ZW5lcnMoaXRlbSk7Ci0JCQlNZW51IHN1Yk1lbnUgPSBuZXcgTWVudShtZW51LmdldFNoZWxsKCksIFNXVC5EUk9QX0RPV04pOwotCQkJaXRlbS5zZXRNZW51KHN1Yk1lbnUpOwotCQkJaG9va0xpc3RlbmVycyhzdWJNZW51KTsKLQkJCQotCQkJY3JlYXRlTWVudUl0ZW1zKHN1Yk1lbnUsIGNyZWF0ZVN1YlN1Yk1lbnUsIGZhbHNlKTsKLQkJfQotCX0KLQkKLQlTdHJpbmcgZ2V0TWVudUl0ZW1UZXh0KFN0cmluZyBpdGVtKSB7Ci0JCWJvb2xlYW4gY2FzY2FkZSA9IGl0ZW0uZXF1YWxzKCJDYXNjYWRlIik7Ci0JCWJvb2xlYW4gbW5lbW9uaWMgPSBtbmVtb25pY3NCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gYWNjZWxlcmF0b3IgPSBhY2NlbGVyYXRvcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWNoYXIgYWNjZWxlcmF0b3JLZXkgPSBpdGVtLmNoYXJBdCgwKTsKLQkJaWYgKG1uZW1vbmljICYmIGFjY2VsZXJhdG9yICYmICFjYXNjYWRlKSB7Ci0JCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaXRlbSArICJXaXRoTW5lbW9uaWMiKSArICJcdEN0cmwrU2hpZnQrIiArIGFjY2VsZXJhdG9yS2V5OwotCQl9Ci0JCWlmIChhY2NlbGVyYXRvciAmJiAhY2FzY2FkZSkgewotCQkJcmV0dXJuIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKGl0ZW0pICsgIlx0Q3RybCtTaGlmdCsiICsgYWNjZWxlcmF0b3JLZXk7Ci0JCX0KLQkJaWYgKG1uZW1vbmljKSB7Ci0JCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaXRlbSArICJXaXRoTW5lbW9uaWMiKTsKLQkJfQotCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaXRlbSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIk1lbnUiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Byb2dyZXNzQmFyVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Qcm9ncmVzc0JhclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDkxZmYzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Byb2dyZXNzQmFyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIFByb2dyZXNzQmFyVGFiIGV4dGVuZHMgUmFuZ2VUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXIxOwotCUdyb3VwIHByb2dyZXNzQmFyR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHNtb290aEJ1dHRvbjsKLQlCdXR0b24gaW5kZXRlcm1pbmF0ZUJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlQcm9ncmVzc0JhclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0KLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBwcm9ncmVzcyBiYXIgKi8KLQkJcHJvZ3Jlc3NCYXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXByb2dyZXNzQmFyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXByb2dyZXNzQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJcHJvZ3Jlc3NCYXJHcm91cC5zZXRUZXh0ICgiUHJvZ3Jlc3NCYXIiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJaWYgKHNtb290aEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TTU9PVEg7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAoaW5kZXRlcm1pbmF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JTkRFVEVSTUlOQVRFOwotCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXByb2dyZXNzQmFyMSA9IG5ldyBQcm9ncmVzc0JhciAocHJvZ3Jlc3NCYXJHcm91cCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc21vb3RoQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc21vb3RoQnV0dG9uLnNldFRleHQgKCJTV1QuU01PT1RIIik7Ci0JCWluZGV0ZXJtaW5hdGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbmRldGVybWluYXRlQnV0dG9uLnNldFRleHQgKCJTV1QuSU5ERVRFUk1JTkFURSIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3Byb2dyZXNzQmFyMX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJTZWxlY3Rpb24iLCAiU3RhdGUiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG9ydCB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRTaG9ydFRhYlRleHQoKSB7Ci0JCXJldHVybiAiUEIiOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlByb2dyZXNzQmFyIjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWlmIChpbmRldGVybWluYXRlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJc2VsZWN0aW9uU3Bpbm5lci5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCQltaW5pbXVtU3Bpbm5lci5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCQltYXhpbXVtU3Bpbm5lci5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25TcGlubmVyLnNldEVuYWJsZWQgKHRydWUpOwotCQkJbWluaW11bVNwaW5uZXIuc2V0RW5hYmxlZCAodHJ1ZSk7Ci0JCQltYXhpbXVtU3Bpbm5lci5zZXRFbmFibGVkICh0cnVlKTsKLQkJfQotCQlzbW9vdGhCdXR0b24uc2V0U2VsZWN0aW9uICgocHJvZ3Jlc3NCYXIxLmdldFN0eWxlICgpICYgU1dULlNNT09USCkgIT0gMCk7Ci0JCWluZGV0ZXJtaW5hdGVCdXR0b24uc2V0U2VsZWN0aW9uICgocHJvZ3Jlc3NCYXIxLmdldFN0eWxlICgpICYgU1dULklOREVURVJNSU5BVEUpICE9IDApOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWF4aW11bSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRNYXhpbXVtICgpIHsKLQkJcmV0dXJuIHByb2dyZXNzQmFyMS5nZXRNYXhpbXVtKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRNaW5pbXVtICgpIHsKLQkJcmV0dXJuIHByb2dyZXNzQmFyMS5nZXRNaW5pbXVtKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFNlbGVjdGlvbiAoKSB7Ci0JCXJldHVybiBwcm9ncmVzc0JhcjEuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWF4aW11bSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNYXhpbXVtICgpIHsKLQkJcHJvZ3Jlc3NCYXIxLnNldE1heGltdW0gKG1heGltdW1TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXVwZGF0ZVNwaW5uZXJzICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TWluaW11bSAoKSB7Ci0JCXByb2dyZXNzQmFyMS5zZXRNaW5pbXVtIChtaW5pbXVtU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCQl1cGRhdGVTcGlubmVycyAoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZWxlY3Rpb24gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0U2VsZWN0aW9uICgpIHsKLQkJcHJvZ3Jlc3NCYXIxLnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCQl1cGRhdGVTcGlubmVycyAoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0cyB0byByZWZsZWN0IHRoZSBhY3R1YWwgdmFsdWUgc2V0IAotCSAqIG9uIHRoZSAiRXhhbXBsZSIgd2lkZ2V0LgotCSAqLwotCXZvaWQgdXBkYXRlU3Bpbm5lcnMgKCkgewotCQltaW5pbXVtU3Bpbm5lci5zZXRTZWxlY3Rpb24gKHByb2dyZXNzQmFyMS5nZXRNaW5pbXVtICgpKTsKLQkJc2VsZWN0aW9uU3Bpbm5lci5zZXRTZWxlY3Rpb24gKHByb2dyZXNzQmFyMS5nZXRTZWxlY3Rpb24gKCkpOwotCQltYXhpbXVtU3Bpbm5lci5zZXRTZWxlY3Rpb24gKHByb2dyZXNzQmFyMS5nZXRNYXhpbXVtICgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9SYW5nZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvUmFuZ2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIyOTJhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9SYW5nZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotYWJzdHJhY3QgY2xhc3MgUmFuZ2VUYWIgZXh0ZW5kcyBUYWIgewotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b247Ci0JYm9vbGVhbiBvcmllbnRhdGlvbkJ1dHRvbnMgPSB0cnVlOwotCi0JLyogU2NhbGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIkNvbnRyb2wiIGdyb3VwICovCi0JU3Bpbm5lciBtaW5pbXVtU3Bpbm5lciwgc2VsZWN0aW9uU3Bpbm5lciwgbWF4aW11bVNwaW5uZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JUmFuZ2VUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCS8qIENyZWF0ZSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJY3JlYXRlTWluaW11bUdyb3VwICgpOwotCQljcmVhdGVNYXhpbXVtR3JvdXAgKCk7Ci0JCWNyZWF0ZVNlbGVjdGlvbkdyb3VwICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIG1heGltdW0KLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlTWF4aW11bUdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIG1heGltdW1Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1heGltdW1Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJbWF4aW11bUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNYXhpbXVtIikpOwotCQltYXhpbXVtR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkKLQkJLyogQ3JlYXRlIGEgU3Bpbm5lciB3aWRnZXQgKi8KLQkJbWF4aW11bVNwaW5uZXIgPSBuZXcgU3Bpbm5lciAobWF4aW11bUdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWF4aW11bVNwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJbWF4aW11bVNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0TWF4aW11bSgpKTsKLQkJbWF4aW11bVNwaW5uZXIuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQkJbWF4aW11bVNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJbWF4aW11bVNwaW5uZXIuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJbWF4aW11bVNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0TWF4aW11bSAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgbWluaW11bQotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVNaW5pbXVtR3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgbWluaW11bUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbWluaW11bUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQltaW5pbXVtR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1pbmltdW0iKSk7Ci0JCW1pbmltdW1Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgYSBTcGlubmVyIHdpZGdldCAqLwotCQltaW5pbXVtU3Bpbm5lciA9IG5ldyBTcGlubmVyIChtaW5pbXVtR3JvdXAsIFNXVC5CT1JERVIpOwotCQltaW5pbXVtU3Bpbm5lci5zZXRNYXhpbXVtICgxMDAwMDApOwotCQltaW5pbXVtU3Bpbm5lci5zZXRTZWxlY3Rpb24oZ2V0RGVmYXVsdE1pbmltdW0oKSk7Ci0JCW1pbmltdW1TcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCW1pbmltdW1TcGlubmVyLnNldEluY3JlbWVudCAoMSk7Ci0JCW1pbmltdW1TcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJbWluaW11bVNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldE1pbmltdW0gKCk7Ci0JCQl9Ci0JCX0pOwotCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIHNlbGVjdGlvbgotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVTZWxlY3Rpb25Hcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBzZWxlY3Rpb25Hcm91cCA9IG5ldyBHcm91cChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc2VsZWN0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKTsKLQkJc2VsZWN0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXNlbGVjdGlvbkdyb3VwLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNlbGVjdGlvbiIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgU3Bpbm5lciB3aWRnZXQgKi8KLQkJc2VsZWN0aW9uU3Bpbm5lciA9IG5ldyBTcGlubmVyIChzZWxlY3Rpb25Hcm91cCwgU1dULkJPUkRFUik7Ci0JCXNlbGVjdGlvblNwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJc2VsZWN0aW9uU3Bpbm5lci5zZXRTZWxlY3Rpb24gKGdldERlZmF1bHRTZWxlY3Rpb24oKSk7Ci0JCXNlbGVjdGlvblNwaW5uZXIuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQkJc2VsZWN0aW9uU3Bpbm5lci5zZXRJbmNyZW1lbnQgKDEpOwotCQlzZWxlY3Rpb25TcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJc2VsZWN0aW9uU3Bpbm5lci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0U2VsZWN0aW9uICgpOwotCQkJfQotCQl9KTsKLQkJCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWlmIChvcmllbnRhdGlvbkJ1dHRvbnMpIHsKLQkJCWhvcml6b250YWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJfQotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXNldFdpZGdldE1pbmltdW0gKCk7Ci0JCQlzZXRXaWRnZXRNYXhpbXVtICgpOwotCQkJc2V0V2lkZ2V0U2VsZWN0aW9uICgpOwotCQl9Ci0JCVdpZGdldCBbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWlmICh3aWRnZXRzLmxlbmd0aCAhPSAwKSB7Ci0JCQlpZiAob3JpZW50YXRpb25CdXR0b25zKSB7Ci0JCQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5IT1JJWk9OVEFMKSAhPSAwKTsKLQkJCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7Ci0JCQl9Ci0JCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuQk9SREVSKSAhPSAwKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1heGltdW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IGludCBnZXREZWZhdWx0TWF4aW11bSAoKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IGludCBnZXREZWZhdWx0TWluaW11bSAoKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JYWJzdHJhY3QgaW50IGdldERlZmF1bHRTZWxlY3Rpb24gKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtYXhpbXVtIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHNldFdpZGdldE1heGltdW0gKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBzZXRXaWRnZXRNaW5pbXVtICgpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBzZXRXaWRnZXRTZWxlY3Rpb24gKCk7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TYXNoRm9ybVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2FzaEZvcm1UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0MjQ3ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TYXNoRm9ybVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgU2FzaEZvcm1UYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JR3JvdXAgc2FzaEZvcm1Hcm91cDsKLQlTYXNoRm9ybSBmb3JtOwotCUxpc3QgbGlzdDEsIGxpc3QyOwotCVRleHQgdGV4dDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGhvcml6b250YWxCdXR0b24sIHZlcnRpY2FsQnV0dG9uLCBzbW9vdGhCdXR0b247Ci0KLQlzdGF0aWMgU3RyaW5nIFtdIExpc3REYXRhMCA9IHtDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzAiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8yIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF81IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNyIpfTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIAotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGExID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8xIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzIiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV80IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV83Iil9OyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTYXNoRm9ybVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBzYXNoZm9ybSB3aWRnZXQgKi8KLQkJc2FzaEZvcm1Hcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNhc2hGb3JtR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXNhc2hGb3JtR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc2FzaEZvcm1Hcm91cC5zZXRUZXh0ICgiU2FzaEZvcm0iKTsKLQl9Ci0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhfU0NST0xMOwotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVl9TQ1JPTEw7Ci0JCWlmIChzbW9vdGhCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU01PT1RIOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJZm9ybSA9IG5ldyBTYXNoRm9ybSAoc2FzaEZvcm1Hcm91cCwgc3R5bGUpOwotCQlsaXN0MSA9IG5ldyBMaXN0IChmb3JtLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJbGlzdDEuc2V0SXRlbXMgKExpc3REYXRhMCk7Ci0JCWxpc3QyID0gbmV3IExpc3QgKGZvcm0sIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlsaXN0Mi5zZXRJdGVtcyAoTGlzdERhdGExKTsKLQkJdGV4dCA9IG5ldyBUZXh0IChmb3JtLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJdGV4dC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTXVsdGlfbGluZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlmb3JtLnNldFdlaWdodHMobmV3IGludFtdIHsxLCAxLCAxfSk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlzbW9vdGhCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzbW9vdGhCdXR0b24uc2V0VGV4dCAoIlNXVC5TTU9PVEgiKTsKLQkJc21vb3RoQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2Zvcm19OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJTYXNoRm9ybSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChmb3JtLmdldFN0eWxlICgpICYgU1dULkhfU0NST0xMKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgoZm9ybS5nZXRTdHlsZSAoKSAmIFNXVC5WX1NDUk9MTCkgIT0gMCk7Ci0JCXNtb290aEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChmb3JtLmdldFN0eWxlICgpICYgU1dULlNNT09USCkgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2FzaFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2FzaFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhY2UwNjAwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFNhc2hUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JU2FzaCBoU2FzaCwgdlNhc2g7Ci0JQ29tcG9zaXRlIHNhc2hDb21wOwotCUdyb3VwIHNhc2hHcm91cDsKLQlMaXN0IGxpc3QxLCBsaXN0MiwgbGlzdDM7Ci0JVGV4dCB0ZXh0OwotCUJ1dHRvbiBzbW9vdGhCdXR0b247Ci0KLQlzdGF0aWMgU3RyaW5nIFtdIExpc3REYXRhMCA9IHtDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzAiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzEiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzIiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzMiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzQiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzUiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzYiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzciKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzgiKX07Ci0JCQkJCQkJCSAgCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YTEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8wIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8xIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8yIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8zIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV80IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV81IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV82IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV83IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV84Iil9OwotCi0JLyogQ29uc3RhbnRzICovCi0Jc3RhdGljIGZpbmFsIGludCBTQVNIX1dJRFRIID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFNBU0hfTElNSVQgPSAyMDsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTYXNoVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQlleGFtcGxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgc2FzaCB3aWRnZXRzICovCi0JCXNhc2hHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCUZpbGxMYXlvdXQgbGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGxheW91dC5tYXJnaW5XaWR0aCA9IDU7Ci0JCXNhc2hHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2FzaEdyb3VwLnNldFRleHQgKCJTYXNoIik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgcGFnZS4gIFRoaXMgZXhhbXBsZSBkb2VzIG5vdCB1c2UgbGF5b3V0cy4KLQkJICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlzYXNoQ29tcCA9IG5ldyBDb21wb3NpdGUoc2FzaEdyb3VwLCBTV1QuQk9SREVSIHwgc3R5bGUpOwotCQotCQkvKiBDcmVhdGUgdGhlIGxpc3QgYW5kIHRleHQgd2lkZ2V0cyAqLwotCQlsaXN0MSA9IG5ldyBMaXN0IChzYXNoQ29tcCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWxpc3QxLnNldEl0ZW1zIChMaXN0RGF0YTApOwotCQlsaXN0MiA9IG5ldyBMaXN0IChzYXNoQ29tcCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWxpc3QyLnNldEl0ZW1zIChMaXN0RGF0YTEpOwotCQl0ZXh0ID0gbmV3IFRleHQgKHNhc2hDb21wLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJdGV4dC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTXVsdGlfbGluZSIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBzYXNoZXMgKi8KLQkJc3R5bGUgPSBzbW9vdGhCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPyBTV1QuU01PT1RIIDogU1dULk5PTkU7Ci0JCXZTYXNoID0gbmV3IFNhc2ggKHNhc2hDb21wLCBTV1QuVkVSVElDQUwgfCBzdHlsZSk7Ci0JCWhTYXNoID0gbmV3IFNhc2ggKHNhc2hDb21wLCBTV1QuSE9SSVpPTlRBTCB8IHN0eWxlKTsKLQkJCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWhTYXNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHZTYXNoLmdldFBhcmVudCgpLmdldENsaWVudEFyZWEoKTsKLQkJCQlldmVudC55ID0gTWF0aC5taW4gKE1hdGgubWF4IChldmVudC55LCBTQVNIX0xJTUlUKSwgcmVjdC5oZWlnaHQgLSBTQVNIX0xJTUlUKTsKLQkJCQlpZiAoZXZlbnQuZGV0YWlsICE9IFNXVC5EUkFHKSB7Ci0JCQkJCWhTYXNoLnNldEJvdW5kcyAoZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQkJCWxheW91dCAoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl2U2FzaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSB2U2FzaC5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZXZlbnQueCA9IE1hdGgubWluIChNYXRoLm1heCAoZXZlbnQueCwgU0FTSF9MSU1JVCksIHJlY3Qud2lkdGggLSBTQVNIX0xJTUlUKTsKLQkJCQlpZiAoZXZlbnQuZGV0YWlsICE9IFNXVC5EUkFHKSB7Ci0JCQkJCXZTYXNoLnNldEJvdW5kcyAoZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQkJCWxheW91dCAoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzYXNoQ29tcC5hZGRDb250cm9sTGlzdGVuZXIgKG5ldyBDb250cm9sQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZCAoQ29udHJvbEV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVzaXplZCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlNpemUiIGdyb3VwLiAgVGhlICJTaXplIiBncm91cCBjb250YWlucwotCSAqIGNvbnRyb2xzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBzaXplIG9mCi0JICogdGhlIGV4YW1wbGUgd2lkZ2V0cy4KLQkgKi8JCi0Jdm9pZCBjcmVhdGVTaXplR3JvdXAgKCkgewkJCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc21vb3RoQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc21vb3RoQnV0dG9uLnNldFRleHQoIlNXVC5TTU9PVEgiKTsKLQl9Ci0JCi0Jdm9pZCBkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCkgewotCQlzYXNoQ29tcC5kaXNwb3NlKCk7Ci0JCXNhc2hDb21wID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtoU2FzaCwgdlNhc2h9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2FzaCI7Ci0JfQotCQotCS8qKgotCSAqIExheW91dCB0aGUgbGlzdCBhbmQgdGV4dCB3aWRnZXRzIGFjY29yZGluZyB0byB0aGUgbmV3Ci0JICogcG9zaXRpb25zIG9mIHRoZSBzYXNoZXMuLmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXZvaWQgbGF5b3V0ICgpIHsKLQkJCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2FzaENvbXAuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJUmVjdGFuZ2xlIGhTYXNoQm91bmRzID0gaFNhc2guZ2V0Qm91bmRzICgpOwotCQlSZWN0YW5nbGUgdlNhc2hCb3VuZHMgPSB2U2FzaC5nZXRCb3VuZHMgKCk7Ci0JCQotCQlsaXN0MS5zZXRCb3VuZHMgKDAsIDAsIHZTYXNoQm91bmRzLngsIGhTYXNoQm91bmRzLnkpOwotCQlsaXN0Mi5zZXRCb3VuZHMgKHZTYXNoQm91bmRzLnggKyB2U2FzaEJvdW5kcy53aWR0aCwgMCwgY2xpZW50QXJlYS53aWR0aCAtICh2U2FzaEJvdW5kcy54ICsgdlNhc2hCb3VuZHMud2lkdGgpLCBoU2FzaEJvdW5kcy55KTsKLQkJdGV4dC5zZXRCb3VuZHMgKDAsIGhTYXNoQm91bmRzLnkgKyBoU2FzaEJvdW5kcy5oZWlnaHQsIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0IC0gKGhTYXNoQm91bmRzLnkgKyBoU2FzaEJvdW5kcy5oZWlnaHQpKTsKLQkKLQkJLyoqCi0JCSogSWYgdGhlIGhvcml6b250YWwgc2FzaCBoYXMgYmVlbiBtb3ZlZCB0aGVuIHRoZSB2ZXJ0aWNhbAotCQkqIHNhc2ggaXMgZWl0aGVyIHRvbyBsb25nIG9yIHRvbyBzaG9ydCBhbmQgaXRzIHNpemUgbXVzdAotCQkqIGJlIGFkanVzdGVkLgotCQkqLwotCQl2U2FzaEJvdW5kcy5oZWlnaHQgPSBoU2FzaEJvdW5kcy55OwotCQl2U2FzaC5zZXRCb3VuZHMgKHZTYXNoQm91bmRzKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKSB7Ci0JCXNhc2hHcm91cC5sYXlvdXQgKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXNtb290aEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChoU2FzaC5nZXRTdHlsZSAoKSAmIFNXVC5TTU9PVEgpICE9IDApOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIHNoZWxsIHJlc2l6ZWQgZXZlbnQuCi0JICovCi0Jdm9pZCByZXNpemVkICgpIHsKLQkKLQkJLyogR2V0IHRoZSBjbGllbnQgYXJlYSBmb3IgdGhlIHNoZWxsICovCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2FzaENvbXAuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCi0JCS8qCi0JCSogTWFrZSBsaXN0IDEgaGFsZiB0aGUgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgbGlzdCAxIGluIHRoZSB0b3AgbGVmdCBxdWFkcmFudCBvZiB0aGUgdGFiLgotCQkqLwotCQlSZWN0YW5nbGUgbGlzdDFCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlICgwLCAwLCAoY2xpZW50QXJlYS53aWR0aCAtIFNBU0hfV0lEVEgpIC8gMiwgKGNsaWVudEFyZWEuaGVpZ2h0IC0gU0FTSF9XSURUSCkgLyAyKTsKLQkJbGlzdDEuc2V0Qm91bmRzIChsaXN0MUJvdW5kcyk7Ci0JCi0JCS8qCi0JCSogTWFrZSBsaXN0IDIgaGFsZiB0aGUgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgbGlzdCAyIGluIHRoZSB0b3AgcmlnaHQgcXVhZHJhbnQgb2YgdGhlIHRhYi4KLQkJKi8KLQkJbGlzdDIuc2V0Qm91bmRzIChsaXN0MUJvdW5kcy53aWR0aCArIFNBU0hfV0lEVEgsIDAsIGNsaWVudEFyZWEud2lkdGggLSAobGlzdDFCb3VuZHMud2lkdGggKyBTQVNIX1dJRFRIKSwgbGlzdDFCb3VuZHMuaGVpZ2h0KTsKLQkKLQkJLyoKLQkJKiBNYWtlIHRoZSB0ZXh0IGFyZWEgdGhlIGZ1bGwgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgdGhlIHRleHQgYXJlYSBpbiB0aGUgYm90dG9tIGhhbGYgb2YgdGhlIHRhYi4KLQkJKi8KLQkJdGV4dC5zZXRCb3VuZHMgKDAsIGxpc3QxQm91bmRzLmhlaWdodCArIFNBU0hfV0lEVEgsIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0IC0gKGxpc3QxQm91bmRzLmhlaWdodCArIFNBU0hfV0lEVEgpKTsKLQkKLQkJLyogUG9zaXRpb24gdGhlIHNhc2hlcyAqLwotCQl2U2FzaC5zZXRCb3VuZHMgKGxpc3QxQm91bmRzLndpZHRoLCAwLCBTQVNIX1dJRFRILCBsaXN0MUJvdW5kcy5oZWlnaHQpOwotCQloU2FzaC5zZXRCb3VuZHMgKDAsIGxpc3QxQm91bmRzLmhlaWdodCwgY2xpZW50QXJlYS53aWR0aCwgU0FTSF9XSURUSCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2NhbGVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NjYWxlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjJlMGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2NhbGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFNjYWxlVGFiIGV4dGVuZHMgUmFuZ2VUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JU2NhbGUgc2NhbGUxOwotCUdyb3VwIHNjYWxlR3JvdXA7Ci0KLQkvKiBTcGlubmVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJDb250cm9sIiBncm91cCAqLwotCVNwaW5uZXIgaW5jcmVtZW50U3Bpbm5lciwgcGFnZUluY3JlbWVudFNwaW5uZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVNjYWxlVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJY3JlYXRlSW5jcmVtZW50R3JvdXAgKCk7Ci0JCWNyZWF0ZVBhZ2VJbmNyZW1lbnRHcm91cCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBzY2FsZSAqLwotCQlzY2FsZUdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJc2NhbGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc2NhbGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlzY2FsZUdyb3VwLnNldFRleHQgKCJTY2FsZSIpOwotCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZFUlRJQ0FMOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJc2NhbGUxID0gbmV3IFNjYWxlIChzY2FsZUdyb3VwLCBzdHlsZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgaW5jcmVtZW50Ci0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUluY3JlbWVudEdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIGluY3JlbWVudEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWluY3JlbWVudEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbmNyZW1lbnQiKSk7Ci0JCWluY3JlbWVudEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgU3Bpbm5lciB3aWRnZXQgKi8KLQkJaW5jcmVtZW50U3Bpbm5lciA9IG5ldyBTcGlubmVyIChpbmNyZW1lbnRHcm91cCwgU1dULkJPUkRFUik7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRTZWxlY3Rpb24gKGdldERlZmF1bHRJbmNyZW1lbnQoKSk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRJbmNyZW1lbnQgKDEpOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWluY3JlbWVudFNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7CQkKLQkJCQlzZXRXaWRnZXRJbmNyZW1lbnQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIHBhZ2UgaW5jcmVtZW50Ci0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVBhZ2VJbmNyZW1lbnRHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBwYWdlSW5jcmVtZW50R3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXBhZ2VJbmNyZW1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFnZV9JbmNyZW1lbnQiKSk7Ci0JCXBhZ2VJbmNyZW1lbnRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCi0JCS8qIENyZWF0ZSB0aGUgU3Bpbm5lciB3aWRnZXQgKi8KLQkJcGFnZUluY3JlbWVudFNwaW5uZXIgPSBuZXcgU3Bpbm5lciAocGFnZUluY3JlbWVudEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0UGFnZUluY3JlbWVudCgpKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0UGFnZUluY3JlbWVudCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3NjYWxlMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uIiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2NhbGUiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJc2V0V2lkZ2V0SW5jcmVtZW50ICgpOwotCQkJc2V0V2lkZ2V0UGFnZUluY3JlbWVudCAoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1heGltdW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0TWF4aW11bSAoKSB7Ci0JCXJldHVybiBzY2FsZTEuZ2V0TWF4aW11bSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0TWluaW11bSAoKSB7Ci0JCXJldHVybiBzY2FsZTEuZ2V0TWluaW11bSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRTZWxlY3Rpb24gKCkgewotCQlyZXR1cm4gc2NhbGUxLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdEluY3JlbWVudCAoKSB7Ci0JCXJldHVybiBzY2FsZTEuZ2V0SW5jcmVtZW50KCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgcGFnZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0UGFnZUluY3JlbWVudCAoKSB7Ci0JCXJldHVybiBzY2FsZTEuZ2V0UGFnZUluY3JlbWVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SW5jcmVtZW50ICgpIHsKLQkJc2NhbGUxLnNldEluY3JlbWVudCAoaW5jcmVtZW50U3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1heGltdW0gKCkgewotCQlzY2FsZTEuc2V0TWF4aW11bSAobWF4aW11bVNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNaW5pbXVtICgpIHsKLQkJc2NhbGUxLnNldE1pbmltdW0gKG1pbmltdW1TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhZ2UgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCkgewotCQlzY2FsZTEuc2V0UGFnZUluY3JlbWVudCAocGFnZUluY3JlbWVudFNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFNlbGVjdGlvbiAoKSB7Ci0JCXNjYWxlMS5zZXRTZWxlY3Rpb24gKHNlbGVjdGlvblNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TY3JvbGxhYmxlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TY3JvbGxhYmxlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhODcwOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2Nyb2xsYWJsZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotYWJzdHJhY3QgY2xhc3MgU2Nyb2xsYWJsZVRhYiBleHRlbmRzIFRhYiB7Ci0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwkKLQlCdXR0b24gc2luZ2xlQnV0dG9uLCBtdWx0aUJ1dHRvbiwgaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2Nyb2xsYWJsZVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc2luZ2xlQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2luZ2xlQnV0dG9uLnNldFRleHQgKCJTV1QuU0lOR0xFIik7Ci0JCW11bHRpQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJbXVsdGlCdXR0b24uc2V0VGV4dCAoIlNXVC5NVUxUSSIpOwotCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhfU0NST0xMIik7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVl9TQ1JPTEwiKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlXaWRnZXQgW10gd2lkZ2V0cyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlpZiAod2lkZ2V0cy5sZW5ndGggIT0gMCl7Ci0JCQlzaW5nbGVCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuU0lOR0xFKSAhPSAwKTsKLQkJCW11bHRpQnV0dG9uLnNldFNlbGVjdGlvbiAoKHdpZGdldHMgWzBdLmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQkJCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuSF9TQ1JPTEwpICE9IDApOwotCQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuVl9TQ1JPTEwpICE9IDApOwotCQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKHdpZGdldHMgWzBdLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TaGVsbFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2hlbGxUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDJlOTU2ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TaGVsbFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgU2hlbGxUYWIgZXh0ZW5kcyBUYWIgewkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwcywgYW5kICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gbm9QYXJlbnRCdXR0b24sIHBhcmVudEJ1dHRvbjsKLQlCdXR0b24gbm9UcmltQnV0dG9uLCBjbG9zZUJ1dHRvbiwgdGl0bGVCdXR0b24sIG1pbkJ1dHRvbiwgbWF4QnV0dG9uLCBib3JkZXJCdXR0b24sIHJlc2l6ZUJ1dHRvbiwgb25Ub3BCdXR0b24sIHRvb2xCdXR0b24sIHNoZWV0QnV0dG9uLCBzaGVsbFRyaW1CdXR0b24sIGRpYWxvZ1RyaW1CdXR0b247Ci0JQnV0dG9uIGNyZWF0ZUJ1dHRvbiwgY2xvc2VBbGxCdXR0b247Ci0JQnV0dG9uIG1vZGVsZXNzQnV0dG9uLCBwcmltYXJ5TW9kYWxCdXR0b24sIGFwcGxpY2F0aW9uTW9kYWxCdXR0b24sIHN5c3RlbU1vZGFsQnV0dG9uOwotCUJ1dHRvbiBpbWFnZUJ1dHRvbjsKLQlHcm91cCBwYXJlbnRTdHlsZUdyb3VwLCBtb2RhbFN0eWxlR3JvdXA7Ci0KLQkvKiBWYXJpYWJsZXMgdXNlZCB0byB0cmFjayB0aGUgb3BlbiBzaGVsbHMgKi8KLQlpbnQgc2hlbGxDb3VudCA9IDA7Ci0JU2hlbGwgW10gc2hlbGxzID0gbmV3IFNoZWxsIFs0XTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2hlbGxUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENsb3NlIGFsbCB0aGUgZXhhbXBsZSBzaGVsbHMuCi0JICovCi0Jdm9pZCBjbG9zZUFsbFNoZWxscygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGk8c2hlbGxDb3VudDsgaSsrKSB7Ci0JCQlpZiAoc2hlbGxzW2ldICE9IG51bGwgJiAhc2hlbGxzIFtpXS5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQkJc2hlbGxzIFtpXS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJc2hlbGxDb3VudCA9IDA7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgQ3JlYXRlIGJ1dHRvbiBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCi0JCS8qCi0JCSAqIFJlbWVtYmVyIHRoZSBleGFtcGxlIHNoZWxscyBzbyB0aGV5Ci0JCSAqIGNhbiBiZSBkaXNwb3NlZCBieSB0aGUgdXNlci4KLQkJICovCi0JCWlmIChzaGVsbENvdW50ID49IHNoZWxscy5sZW5ndGgpIHsKLQkJCVNoZWxsIFtdIG5ld1NoZWxscyA9IG5ldyBTaGVsbCBbc2hlbGxzLmxlbmd0aCArIDRdOwotCQkJU3lzdGVtLmFycmF5Y29weSAoc2hlbGxzLCAwLCBuZXdTaGVsbHMsIDAsIHNoZWxscy5sZW5ndGgpOwotCQkJc2hlbGxzID0gbmV3U2hlbGxzOwotCQl9Ci0JCi0JCS8qIENvbXB1dGUgdGhlIHNoZWxsIHN0eWxlICovCi0JCWludCBzdHlsZSA9IFNXVC5OT05FOwotCQlpZiAobm9UcmltQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuTk9fVFJJTTsKLQkJaWYgKGNsb3NlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQ0xPU0U7Ci0JCWlmICh0aXRsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlRJVExFOwotCQlpZiAobWluQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuTUlOOwotCQlpZiAobWF4QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuTUFYOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAocmVzaXplQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuUkVTSVpFOwotCQlpZiAob25Ub3BCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5PTl9UT1A7Ci0JCWlmICh0b29sQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuVE9PTDsKLQkJaWYgKHNoZWV0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuU0hFRVQ7Ci0JCWlmIChtb2RlbGVzc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULk1PREVMRVNTOwotCQlpZiAocHJpbWFyeU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuUFJJTUFSWV9NT0RBTDsKLQkJaWYgKGFwcGxpY2F0aW9uTW9kYWxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5BUFBMSUNBVElPTl9NT0RBTDsKLQkJaWYgKHN5c3RlbU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuU1lTVEVNX01PREFMOwotCQotCQkvKiBDcmVhdGUgdGhlIHNoZWxsIHdpdGggb3Igd2l0aG91dCBhIHBhcmVudCAqLwotCQlpZiAobm9QYXJlbnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlzaGVsbHMgW3NoZWxsQ291bnRdID0gbmV3IFNoZWxsIChzdHlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzaGVsbHMgW3NoZWxsQ291bnRdID0gbmV3IFNoZWxsIChzaGVsbCwgc3R5bGUpOwotCQl9Ci0JCWZpbmFsIFNoZWxsIGN1cnJlbnRTaGVsbCA9IHNoZWxscyBbc2hlbGxDb3VudF07Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGN1cnJlbnRTaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0Qm91bmRzKDIwLCAyMCwgMTIwLCAzMCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCdXR0b24iKSk7Ci0JCUJ1dHRvbiBjbG9zZSA9IG5ldyBCdXR0b24oY3VycmVudFNoZWxsLCBTV1QuUFVTSCk7Ci0JCWNsb3NlLnNldEJvdW5kcygxNjAsIDIwLCAxMjAsIDMwKTsKLQkJY2xvc2Uuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2xvc2UiKSk7Ci0JCWNsb3NlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJY3VycmVudFNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCS8qIFNldCB0aGUgc2l6ZSwgdGl0bGUsIGFuZCBpbWFnZSwgYW5kIG9wZW4gdGhlIHNoZWxsICovCi0JCWN1cnJlbnRTaGVsbC5zZXRTaXplICgzMDAsIDEwMCk7Ci0JCWN1cnJlbnRTaGVsbC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSArIHNoZWxsQ291bnQpOwotCQlpZiAoaW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGN1cnJlbnRTaGVsbC5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaWYgKGJhY2tncm91bmRJbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgY3VycmVudFNoZWxsLnNldEJhY2tncm91bmRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lCYWNrZ3JvdW5kXSk7Ci0JCWhvb2tMaXN0ZW5lcnMgKGN1cnJlbnRTaGVsbCk7Ci0JCWN1cnJlbnRTaGVsbC5vcGVuICgpOwotCQlzaGVsbENvdW50Kys7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiBncm91cC4gCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sR3JvdXAgKCkgewotCQkvKgotCQkgKiBDcmVhdGUgdGhlICJDb250cm9sIiBncm91cC4gIFRoaXMgaXMgdGhlIGdyb3VwIG9uIHRoZQotCQkgKiByaWdodCBoYWxmIG9mIGVhY2ggZXhhbXBsZSB0YWIuICBJdCBjb25zaXN0cyBvZiB0aGUKLQkJICogc3R5bGUgZ3JvdXAsIHRoZSAnb3RoZXInIGdyb3VwIGFuZCB0aGUgc2l6ZSBncm91cC4KLQkJICovCQkKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY29udHJvbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGRlY29yYXRpb24gc3R5bGUgY29udHJvbHMgKi8KLQkJc3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMykpOwotCQlzdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEZWNvcmF0aW9uX1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBtb2RhbCBzdHlsZSBjb250cm9scyAqLwotCQltb2RhbFN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1vZGFsU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1vZGFsX1N0eWxlcyIpKTsJCQotCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgJ290aGVyJyBjb250cm9scyAqLwotCQlvdGhlckdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJb3RoZXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3RoZXIiKSk7Ci0KLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBwYXJlbnQgc3R5bGUgY29udHJvbHMgKi8KLQkJcGFyZW50U3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXBhcmVudFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCXBhcmVudFN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQlwYXJlbnRTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJlbnQiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgcGFyZW50IHN0eWxlIGJ1dHRvbnMgKi8KLQkJbm9QYXJlbnRCdXR0b24gPSBuZXcgQnV0dG9uIChwYXJlbnRTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlub1BhcmVudEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9fUGFyZW50IikpOwotCQlwYXJlbnRCdXR0b24gPSBuZXcgQnV0dG9uIChwYXJlbnRTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwYXJlbnRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmVudCIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBkZWNvcmF0aW9uIHN0eWxlIGJ1dHRvbnMgKi8KLQkJbm9UcmltQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9UcmltQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fVFJJTSIpOwotCQljbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNsb3NlQnV0dG9uLnNldFRleHQgKCJTV1QuQ0xPU0UiKTsKLQkJdGl0bGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0aXRsZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlRJVExFIik7Ci0JCW1pbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1pbkJ1dHRvbi5zZXRUZXh0ICgiU1dULk1JTiIpOwotCQltYXhCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQltYXhCdXR0b24uc2V0VGV4dCAoIlNXVC5NQVgiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JCXJlc2l6ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlc2l6ZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFU0laRSIpOwotCQlvblRvcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW9uVG9wQnV0dG9uLnNldFRleHQgKCJTV1QuT05fVE9QIik7Ci0JCXRvb2xCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0b29sQnV0dG9uLnNldFRleHQgKCJTV1QuVE9PTCIpOwotCQlzaGVldEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNoZWV0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hFRVQiKTsKLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHN0eWxlR3JvdXAsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXNoZWxsVHJpbUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNoZWxsVHJpbUJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIRUxMX1RSSU0iKTsKLQkJZGlhbG9nVHJpbUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWRpYWxvZ1RyaW1CdXR0b24uc2V0VGV4dCAoIlNXVC5ESUFMT0dfVFJJTSIpOwotCQotCQkvKiBDcmVhdGUgdGhlIG1vZGFsIHN0eWxlIGJ1dHRvbnMgKi8KLQkJbW9kZWxlc3NCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW1vZGVsZXNzQnV0dG9uLnNldFRleHQgKCJTV1QuTU9ERUxFU1MiKTsKLQkJcHJpbWFyeU1vZGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAobW9kYWxTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmltYXJ5TW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5QUklNQVJZX01PREFMIik7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5BUFBMSUNBVElPTl9NT0RBTCIpOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc3lzdGVtTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5TWVNURU1fTU9EQUwiKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSAnb3RoZXInIGJ1dHRvbnMgKi8KLQkJaW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbWFnZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2UiKSk7Ci0JCWJhY2tncm91bmRJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24ob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJYmFja2dyb3VuZEltYWdlQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2tncm91bmRJbWFnZSIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSAiY3JlYXRlIiBhbmQgImNsb3NlQWxsIiBidXR0b25zICovCi0JCWNyZWF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQljcmVhdGVCdXR0b24uc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQljcmVhdGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNyZWF0ZV9TaGVsbCIpKTsKLQkJY2xvc2VBbGxCdXR0b24gPSBuZXcgQnV0dG9uIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJY2xvc2VBbGxCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsb3NlX0FsbF9TaGVsbHMiKSk7Ci0JCWNsb3NlQWxsQnV0dG9uLnNldExheW91dERhdGEgKGdyaWREYXRhKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJY3JlYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNyZWF0ZUJ1dHRvblNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJY2xvc2VBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY2xvc2VBbGxTaGVsbHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZGVjb3JhdGlvbkJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQkJbm9UcmltQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQljbG9zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJdGl0bGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCW1pbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJbWF4QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQlib3JkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCXJlc2l6ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJZGlhbG9nVHJpbUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJc2hlbGxUcmltQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQlhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkKLQkJLyogU2V0IHRoZSBkZWZhdWx0IHN0YXRlICovCi0JCW5vUGFyZW50QnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCW1vZGVsZXNzQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWJhY2tncm91bmRJbWFnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgYSBkZWNvcmF0aW9uIGJ1dHRvbiBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRpb25CdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlCdXR0b24gd2lkZ2V0ID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkKLQkJLyoKLQkJICogTWFrZSBzdXJlIHRoYXQgaWYgdGhlIG1vZGFsIHN0eWxlIGlzIFNXVC5BUFBMSUNBVElPTl9NT0RBTCAKLQkJICogb3IgU1dULlNZU1RFTV9NT0RBTCB0aGUgc3R5bGUgU1dULkNMT1NFIGlzIGFsc28gc2VsZWN0ZWQuCi0JCSAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoZSB1c2VyIGNhbiBjbG9zZSB0aGUgc2hlbGwuCi0JCSAqLwotCQlpZiAod2lkZ2V0ID09IGFwcGxpY2F0aW9uTW9kYWxCdXR0b24gfHwgd2lkZ2V0ID09IHN5c3RlbU1vZGFsQnV0dG9uKSB7Ci0JCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJY2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJCQlub1RyaW1CdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQl9IAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh3aWRnZXQgPT0gY2xvc2VCdXR0b24pIHsKLQkJCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IHN5c3RlbU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJY2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJCX0KLQkJfQkKLQkJLyoKLQkJICogTWFrZSBzdXJlIHRoYXQgaWYgdGhlIFNXVC5OT19UUklNIGJ1dHRvbiBpcyBzZWxlY3RlZAotCQkgKiB0aGVuIGFsbCBvdGhlciBkZWNvcmF0aW9uIGJ1dHRvbnMgYXJlIGRlc2VsZWN0ZWQuCi0JCSAqLwotCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpKSB7Ci0JCQlpZiAod2lkZ2V0ID09IG5vVHJpbUJ1dHRvbikgewotCQkJCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IHN5c3RlbU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCW5vVHJpbUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljbG9zZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCQl0aXRsZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCQltaW5CdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQkJbWF4QnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCQlyZXNpemVCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCW5vVHJpbUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogTWFrZSBzdXJlIHRoYXQgdGhlIFNXVC5ESUFMT0dfVFJJTSBhbmQgU1dULlNIRUxMX1RSSU0gYnV0dG9ucwotCQkgKiBhcmUgY29uc2lzdGVudC4KLQkJICovCi0JCWlmICh3aWRnZXQgPT0gZGlhbG9nVHJpbUJ1dHRvbiB8fCB3aWRnZXQgPT0gc2hlbGxUcmltQnV0dG9uKSB7Ci0JCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpICYmIHdpZGdldCA9PSBkaWFsb2dUcmltQnV0dG9uKSB7Ci0JCQkJc2hlbGxUcmltQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCWRpYWxvZ1RyaW1CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCX0KLQkJCS8vU0hFTExfVFJJTSA9IENMT1NFIHwgVElUTEUgfCBNSU4gfCBNQVggfCBSRVNJWkU7Ci0JCQkvL0RJQUxPR19UUklNID0gVElUTEUgfCBDTE9TRSB8IEJPUkRFUjsKLQkJCWNsb3NlQnV0dG9uLnNldFNlbGVjdGlvbiAod2lkZ2V0LmdldFNlbGVjdGlvbiAoKSk7Ci0JCQl0aXRsZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKHdpZGdldC5nZXRTZWxlY3Rpb24gKCkpOwotCQkJbWluQnV0dG9uLnNldFNlbGVjdGlvbiAod2lkZ2V0ID09IHNoZWxsVHJpbUJ1dHRvbiAmJiB3aWRnZXQuZ2V0U2VsZWN0aW9uKCApKTsKLQkJCW1heEJ1dHRvbi5zZXRTZWxlY3Rpb24gKHdpZGdldCA9PSBzaGVsbFRyaW1CdXR0b24gJiYgd2lkZ2V0LmdldFNlbGVjdGlvbiAoKSk7Ci0JCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICh3aWRnZXQgPT0gZGlhbG9nVHJpbUJ1dHRvbiAmJiB3aWRnZXQuZ2V0U2VsZWN0aW9uICgpKTsKLQkJCXJlc2l6ZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKHdpZGdldCA9PSBzaGVsbFRyaW1CdXR0b24gJiYgd2lkZ2V0LmdldFNlbGVjdGlvbiAoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlib29sZWFuIHRpdGxlID0gdGl0bGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQkJYm9vbGVhbiBjbG9zZSA9IGNsb3NlQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJCWJvb2xlYW4gbWluID0gbWluQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJCWJvb2xlYW4gbWF4ID0gbWF4QnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJCWJvb2xlYW4gYm9yZGVyID0gYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJCWJvb2xlYW4gcmVzaXplID0gcmVzaXplQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJCWRpYWxvZ1RyaW1CdXR0b24uc2V0U2VsZWN0aW9uKHRpdGxlICYmIGNsb3NlICYmIGJvcmRlciAmJiAhbWluICYmICFtYXggJiYgIXJlc2l6ZSk7Ci0JCQlzaGVsbFRyaW1CdXR0b24uc2V0U2VsZWN0aW9uKHRpdGxlICYmIGNsb3NlICYmIG1pbiAmJiBtYXggJiYgcmVzaXplICYmICFib3JkZXIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlNoZWxsIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TbGlkZXJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NsaWRlclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYmI4MzkwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NsaWRlclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgU2xpZGVyVGFiIGV4dGVuZHMgUmFuZ2VUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JU2xpZGVyIHNsaWRlcjE7Ci0JR3JvdXAgc2xpZGVyR3JvdXA7Ci0KLQkvKiBTcGlubmVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJDb250cm9sIiBncm91cCAqLwotCVNwaW5uZXIgaW5jcmVtZW50U3Bpbm5lciwgcGFnZUluY3JlbWVudFNwaW5uZXIsIHRodW1iU3Bpbm5lcjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2xpZGVyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJY3JlYXRlVGh1bWJHcm91cCAoKTsKLQkJY3JlYXRlSW5jcmVtZW50R3JvdXAgKCk7Ci0JCWNyZWF0ZVBhZ2VJbmNyZW1lbnRHcm91cCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBzbGlkZXIgKi8KLQkJc2xpZGVyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlzbGlkZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc2xpZGVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc2xpZGVyR3JvdXAuc2V0VGV4dCAoIlNsaWRlciIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZFUlRJQ0FMOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJc2xpZGVyMSA9IG5ldyBTbGlkZXIoc2xpZGVyR3JvdXAsIHN0eWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBpbmNyZW1lbnQKLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgaW5jcmVtZW50R3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkluY3JlbWVudCIpKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBTcGlubmVyIHdpZGdldCAqLwotCQlpbmNyZW1lbnRTcGlubmVyID0gbmV3IFNwaW5uZXIgKGluY3JlbWVudEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRNYXhpbXVtICgxMDAwMDApOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldFNlbGVjdGlvbiAoZ2V0RGVmYXVsdEluY3JlbWVudCgpKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRQYWdlSW5jcmVtZW50ICgxMDApOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldEluY3JlbWVudCAoMSk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJaW5jcmVtZW50U3Bpbm5lci5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQotCQkJCXNldFdpZGdldEluY3JlbWVudCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgcGFnZSBpbmNyZW1lbnQKLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlUGFnZUluY3JlbWVudEdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIHBhZ2VJbmNyZW1lbnRHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXBhZ2VJbmNyZW1lbnRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJcGFnZUluY3JlbWVudEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYWdlX0luY3JlbWVudCIpKTsKLQkJcGFnZUluY3JlbWVudEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkKLQkJLyogQ3JlYXRlIHRoZSBTcGlubmVyIHdpZGdldCAqLwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lciA9IG5ldyBTcGlubmVyIChwYWdlSW5jcmVtZW50R3JvdXAsIFNXVC5CT1JERVIpOwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5zZXRNYXhpbXVtICgxMDAwMDApOwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5zZXRTZWxlY3Rpb24gKGdldERlZmF1bHRQYWdlSW5jcmVtZW50KCkpOwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5zZXRQYWdlSW5jcmVtZW50ICgxMDApOwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5zZXRJbmNyZW1lbnQgKDEpOwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRQYWdlSW5jcmVtZW50ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSB0aHVtYgotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVUaHVtYkdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIHRodW1iR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQl0aHVtYkdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl0aHVtYkdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaHVtYiIpKTsKLQkJdGh1bWJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBTcGlubmVyIHdpZGdldCAqLwotCQl0aHVtYlNwaW5uZXIgPSBuZXcgU3Bpbm5lciAodGh1bWJHcm91cCwgU1dULkJPUkRFUik7Ci0JCXRodW1iU3Bpbm5lci5zZXRNYXhpbXVtICgxMDAwMDApOwotCQl0aHVtYlNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0VGh1bWIoKSk7Ci0JCXRodW1iU3Bpbm5lci5zZXRQYWdlSW5jcmVtZW50ICgxMDApOwotCQl0aHVtYlNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJdGh1bWJTcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJdGh1bWJTcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRUaHVtYiAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3NsaWRlcjF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbiIsICJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlNsaWRlciI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQlzZXRXaWRnZXRJbmNyZW1lbnQgKCk7Ci0JCQlzZXRXaWRnZXRQYWdlSW5jcmVtZW50ICgpOwotCQkJc2V0V2lkZ2V0VGh1bWIgKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBtYXhpbXVtIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdE1heGltdW0gKCkgewotCQlyZXR1cm4gc2xpZGVyMS5nZXRNYXhpbXVtKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRNaW5pbXVtICgpIHsKLQkJcmV0dXJuIHNsaWRlcjEuZ2V0TWluaW11bSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRTZWxlY3Rpb24gKCkgewotCQlyZXR1cm4gc2xpZGVyMS5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRJbmNyZW1lbnQgKCkgewotCQlyZXR1cm4gc2xpZGVyMS5nZXRJbmNyZW1lbnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBwYWdlIGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRQYWdlSW5jcmVtZW50ICgpIHsKLQkJcmV0dXJuIHNsaWRlcjEuZ2V0UGFnZUluY3JlbWVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHRodW1iIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFRodW1iICgpIHsKLQkJcmV0dXJuIHNsaWRlcjEuZ2V0VGh1bWIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SW5jcmVtZW50ICgpIHsKLQkJc2xpZGVyMS5zZXRJbmNyZW1lbnQgKGluY3JlbWVudFNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNYXhpbXVtICgpIHsKLQkJc2xpZGVyMS5zZXRNYXhpbXVtIChtYXhpbXVtU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1pbmltdW0gKCkgewotCQlzbGlkZXIxLnNldE1pbmltdW0gKG1pbmltdW1TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhZ2UgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCkgewotCQlzbGlkZXIxLnNldFBhZ2VJbmNyZW1lbnQgKHBhZ2VJbmNyZW1lbnRTcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRTZWxlY3Rpb24gKCkgewotCQlzbGlkZXIxLnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0aHVtYiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRUaHVtYiAoKSB7Ci0JCXNsaWRlcjEuc2V0VGh1bWIgKHRodW1iU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NwaW5uZXJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NwaW5uZXJUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwODQ3NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TcGlubmVyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBTcGlubmVyVGFiIGV4dGVuZHMgUmFuZ2VUYWIgewotCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlTcGlubmVyIHNwaW5uZXIxOwotCUdyb3VwIHNwaW5uZXJHcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHJlYWRPbmx5QnV0dG9uLCB3cmFwQnV0dG9uOwotCQotCS8qIFNwaW5uZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIkNvbnRyb2wiIGdyb3VwICovCi0JU3Bpbm5lciBpbmNyZW1lbnRTcGlubmVyLCBwYWdlSW5jcmVtZW50U3Bpbm5lciwgZGlnaXRzU3Bpbm5lcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTcGlubmVyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCWNyZWF0ZUluY3JlbWVudEdyb3VwICgpOwotCQljcmVhdGVQYWdlSW5jcmVtZW50R3JvdXAgKCk7Ci0JCWNyZWF0ZURpZ2l0c0dyb3VwICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHNwaW5uZXIgKi8KLQkJc3Bpbm5lckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJc3Bpbm5lckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzcGlubmVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc3Bpbm5lckdyb3VwLnNldFRleHQgKCJTcGlubmVyIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAocmVhZE9ubHlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVBRF9PTkxZOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXNwaW5uZXIxID0gbmV3IFNwaW5uZXIgKHNwaW5uZXJHcm91cCwgc3R5bGUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVJbmNyZW1lbnRHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBpbmNyZW1lbnRHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW5jcmVtZW50IikpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0ICovCi0JCWluY3JlbWVudFNwaW5uZXIgPSBuZXcgU3Bpbm5lciAoaW5jcmVtZW50R3JvdXAsIFNXVC5CT1JERVIpOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0SW5jcmVtZW50KCkpOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlpbmNyZW1lbnRTcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewkJCi0JCQkJc2V0V2lkZ2V0SW5jcmVtZW50ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBwYWdlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVQYWdlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgcGFnZUluY3JlbWVudEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJcGFnZUluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhZ2VfSW5jcmVtZW50IikpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQotCQkvKiBDcmVhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0ICovCi0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyID0gbmV3IFNwaW5uZXIgKHBhZ2VJbmNyZW1lbnRHcm91cCwgU1dULkJPUkRFUik7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldFNlbGVjdGlvbiAoZ2V0RGVmYXVsdFBhZ2VJbmNyZW1lbnQoKSk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldEluY3JlbWVudCAoMSk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIGRpZ2l0cwotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVEaWdpdHNHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBkaWdpdHNHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWRpZ2l0c0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlkaWdpdHNHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGlnaXRzIikpOwotCQlkaWdpdHNHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0ICovCi0JCWRpZ2l0c1NwaW5uZXIgPSBuZXcgU3Bpbm5lciAoZGlnaXRzR3JvdXAsIFNXVC5CT1JERVIpOwotCQlkaWdpdHNTcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCWRpZ2l0c1NwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0RGlnaXRzKCkpOwotCQlkaWdpdHNTcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCWRpZ2l0c1NwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJZGlnaXRzU3Bpbm5lci5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlkaWdpdHNTcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewkJCi0JCQkJc2V0V2lkZ2V0RGlnaXRzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQlzdXBlci5jcmVhdGVUYWJGb2xkZXJQYWdlICh0YWJGb2xkZXIpOwotCi0JCS8qCi0JCSAqIEFkZCBhIHJlc2l6ZSBsaXN0ZW5lciB0byB0aGUgdGFiRm9sZGVyUGFnZSBzbyB0aGF0Ci0JCSAqIGlmIHRoZSB1c2VyIHR5cGVzIGludG8gdGhlIGV4YW1wbGUgd2lkZ2V0IHRvIGNoYW5nZQotCQkgKiBpdHMgcHJlZmVycmVkIHNpemUsIGFuZCB0aGVuIHJlc2l6ZXMgdGhlIHNoZWxsLCB3ZQotCQkgKiByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUgY29ycmVjdGx5LgotCQkgKi8KLQkJdGFiRm9sZGVyUGFnZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCW9yaWVudGF0aW9uQnV0dG9ucyA9IGZhbHNlOwotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCQl3cmFwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJd3JhcEJ1dHRvbi5zZXRUZXh0ICgiU1dULldSQVAiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7c3Bpbm5lcjF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbiIsICJUZXh0TGltaXQiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJTcGlubmVyIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChzcGlubmVyMS5nZXRTdHlsZSAoKSAmIFNXVC5SRUFEX09OTFkpICE9IDApOwotCQl3cmFwQnV0dG9uLnNldFNlbGVjdGlvbiAoKHNwaW5uZXIxLmdldFN0eWxlICgpICYgU1dULldSQVApICE9IDApOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXNldFdpZGdldEluY3JlbWVudCAoKTsKLQkJCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCQlzZXRXaWRnZXREaWdpdHMgKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1heGltdW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0TWF4aW11bSAoKSB7Ci0JCXJldHVybiBzcGlubmVyMS5nZXRNYXhpbXVtKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRNaW5pbXVtICgpIHsKLQkJcmV0dXJuIHNwaW5uZXIxLmdldE1pbmltdW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0U2VsZWN0aW9uICgpIHsKLQkJcmV0dXJuIHNwaW5uZXIxLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdEluY3JlbWVudCAoKSB7Ci0JCXJldHVybiBzcGlubmVyMS5nZXRJbmNyZW1lbnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBwYWdlIGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRQYWdlSW5jcmVtZW50ICgpIHsKLQkJcmV0dXJuIHNwaW5uZXIxLmdldFBhZ2VJbmNyZW1lbnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBkaWdpdHMgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0RGlnaXRzICgpIHsKLQkJcmV0dXJuIHNwaW5uZXIxLmdldERpZ2l0cygpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRJbmNyZW1lbnQgKCkgewotCQlzcGlubmVyMS5zZXRJbmNyZW1lbnQgKGluY3JlbWVudFNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNYXhpbXVtICgpIHsKLQkJc3Bpbm5lcjEuc2V0TWF4aW11bSAobWF4aW11bVNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNaW5pbXVtICgpIHsKLQkJc3Bpbm5lcjEuc2V0TWluaW11bSAobWluaW11bVNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgcGFnZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0UGFnZUluY3JlbWVudCAoKSB7Ci0JCXNwaW5uZXIxLnNldFBhZ2VJbmNyZW1lbnQgKHBhZ2VJbmNyZW1lbnRTcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGRpZ2l0cyBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXREaWdpdHMgKCkgewotCQlzcGlubmVyMS5zZXREaWdpdHMgKGRpZ2l0c1NwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFNlbGVjdGlvbiAoKSB7Ci0JCXNwaW5uZXIxLnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1N0eWxlZFRleHRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1N0eWxlZFRleHRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzZjdjZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TdHlsZWRUZXh0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLWNsYXNzIFN0eWxlZFRleHRUYWIgZXh0ZW5kcyBTY3JvbGxhYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlHcm91cCBzdHlsZWRUZXh0R3JvdXAsIHN0eWxlZFRleHRTdHlsZUdyb3VwOwotCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiB3cmFwQnV0dG9uLCByZWFkT25seUJ1dHRvbiwgZnVsbFNlbGVjdGlvbkJ1dHRvbjsKLQkKLQkvKiBCdXR0b25zIGZvciBhZGRpbmcgU3R5bGVSYW5nZXMgdG8gU3R5bGVkVGV4dCAqLwotCUJ1dHRvbiBib2xkQnV0dG9uLCBpdGFsaWNCdXR0b24sIHJlZEJ1dHRvbiwgeWVsbG93QnV0dG9uLCB1bmRlcmxpbmVCdXR0b24sIHN0cmlrZW91dEJ1dHRvbjsKLQlJbWFnZSBib2xkSW1hZ2UsIGl0YWxpY0ltYWdlLCByZWRJbWFnZSwgeWVsbG93SW1hZ2UsIHVuZGVybGluZUltYWdlLCBzdHJpa2VvdXRJbWFnZTsKLQkKLQkvKiBWYXJpYWJsZXMgZm9yIHNhdmluZyBzdGF0ZS4gKi8KLQlTdHJpbmcgdGV4dDsKLQlTdHlsZVJhbmdlW10gc3R5bGVSYW5nZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU3R5bGVkVGV4dFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBiaXRtYXAgaW1hZ2UuIAotCSAqLwotCUltYWdlIGNyZWF0ZUJpdG1hcEltYWdlIChEaXNwbGF5IGRpc3BsYXksIFN0cmluZyBuYW1lKSB7Ci0JCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSA9IENvbnRyb2xFeGFtcGxlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0gKG5hbWUgKyAiLmJtcCIpOwotCQlJbnB1dFN0cmVhbSBtYXNrU3RyZWFtID0gQ29udHJvbEV4YW1wbGUuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSAobmFtZSArICJfbWFzay5ibXAiKTsKLQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEgKHNvdXJjZVN0cmVhbSk7Ci0JCUltYWdlRGF0YSBtYXNrID0gbmV3IEltYWdlRGF0YSAobWFza1N0cmVhbSk7Ci0JCUltYWdlIHJlc3VsdCA9IG5ldyBJbWFnZSAoZGlzcGxheSwgc291cmNlLCBtYXNrKTsKLQkJdHJ5IHsKLQkJCXNvdXJjZVN0cmVhbS5jbG9zZSAoKTsKLQkJCW1hc2tTdHJlYW0uY2xvc2UgKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlICgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCQkKLQkJLyogQWRkIGEgZ3JvdXAgZm9yIG1vZGlmeWluZyB0aGUgU3R5bGVkVGV4dCB3aWRnZXQgKi8KLQkJY3JlYXRlU3R5bGVkVGV4dFN0eWxlR3JvdXAgKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBzdHlsZWQgdGV4dCB3aWRnZXQgKi8KLQkJc3R5bGVkVGV4dEdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVkVGV4dEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzdHlsZWRUZXh0R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc3R5bGVkVGV4dEdyb3VwLnNldFRleHQgKCJTdHlsZWRUZXh0Iik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc2luZ2xlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNJTkdMRTsKLQkJaWYgKG11bHRpQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk1VTFRJOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5IX1NDUk9MTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZfU0NST0xMOwotCQlpZiAod3JhcEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5XUkFQOwotCQlpZiAocmVhZE9ubHlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVBRF9PTkxZOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGZ1bGxTZWxlY3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRlVMTF9TRUxFQ1RJT047Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc3R5bGVkVGV4dEdyb3VwLCBzdHlsZSk7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkV4YW1wbGVfc3RyaW5nIikpOwotCQlzdHlsZWRUZXh0LmFwcGVuZCAoIlxuIik7Ci0JCXN0eWxlZFRleHQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT25lX1R3b19UaHJlZSIpKTsKLQkJCi0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJCXRleHQgPSBudWxsOwotCQl9Ci0JCWlmIChzdHlsZVJhbmdlcyAhPSBudWxsKSB7Ci0JCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2VzKHN0eWxlUmFuZ2VzKTsKLQkJCXN0eWxlUmFuZ2VzID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJd3JhcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXBCdXR0b24uc2V0VGV4dCAoIlNXVC5XUkFQIik7Ci0JCXJlYWRPbmx5QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0VGV4dCAoIlNXVC5SRUFEX09OTFkiKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24uc2V0VGV4dCAoIlNXVC5GVUxMX1NFTEVDVElPTiIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGVkVGV4dCBTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZWRUZXh0U3R5bGVHcm91cCAoKSB7Ci0JCXN0eWxlZFRleHRTdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVkVGV4dFN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTdHlsZWRUZXh0X1N0eWxlcyIpKTsKLQkJc3R5bGVkVGV4dFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCg2LCBmYWxzZSkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3R5bGVkVGV4dFN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCQotCQkvKiBHZXQgaW1hZ2VzICovCi0JCWJvbGRJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiYm9sZCIpOwotCQlpdGFsaWNJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiaXRhbGljIik7Ci0JCXJlZEltYWdlID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJyZWQiKTsKLQkJeWVsbG93SW1hZ2UgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgInllbGxvdyIpOwotCQl1bmRlcmxpbmVJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAidW5kZXJsaW5lIik7Ci0JCXN0cmlrZW91dEltYWdlID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJzdHJpa2VvdXQiKTsKLQkJCi0JCS8qIENyZWF0ZSBjb250cm9scyB0byBtb2RpZnkgdGhlIFN0eWxlZFRleHQgKi8KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU3R5bGVkVGV4dF9TdHlsZV9JbnN0cnVjdGlvbnMiKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDYsIDEpKTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQm9sZCIpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJYm9sZEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCWJvbGRCdXR0b24uc2V0SW1hZ2UgKGJvbGRJbWFnZSk7Ci0JCWxhYmVsID0gbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlVuZGVybGluZSIpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJdW5kZXJsaW5lQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5QVVNIKTsKLQkJdW5kZXJsaW5lQnV0dG9uLnNldEltYWdlICh1bmRlcmxpbmVJbWFnZSk7Ci0JCWxhYmVsID0gbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkZvcmVncm91bmRfU3R5bGUiKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXJlZEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCXJlZEJ1dHRvbi5zZXRJbWFnZSAocmVkSW1hZ2UpOwotCQlsYWJlbCA9IG5ldyBMYWJlbCAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGFsaWMiKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWl0YWxpY0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCWl0YWxpY0J1dHRvbi5zZXRJbWFnZSAoaXRhbGljSW1hZ2UpOwotCQlsYWJlbCA9IG5ldyBMYWJlbCAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTdHJpa2VvdXQiKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXN0cmlrZW91dEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCXN0cmlrZW91dEJ1dHRvbi5zZXRJbWFnZSAoc3RyaWtlb3V0SW1hZ2UpOwotCQlsYWJlbCA9IG5ldyBMYWJlbCAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJCYWNrZ3JvdW5kX1N0eWxlIikpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQl5ZWxsb3dCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQl5ZWxsb3dCdXR0b24uc2V0SW1hZ2UgKHllbGxvd0ltYWdlKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc3R5bGVMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUG9pbnQgc2VsID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCQkJCWlmICgoc2VsID09IG51bGwpIHx8IChzZWwueSA9PSAwKSkgcmV0dXJuOwotCQkJCVN0eWxlUmFuZ2Ugc3R5bGU7Ci0JCQkJZm9yIChpbnQgaSA9IHNlbC54OyBpPHNlbC54K3NlbC55OyBpKyspIHsKLQkJCQkJU3R5bGVSYW5nZSByYW5nZSA9IHN0eWxlZFRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpOwotCQkJCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSlyYW5nZS5jbG9uZSgpOwotCQkJCQkJc3R5bGUuc3RhcnQgPSBpOwotCQkJCQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoaSwgMSwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGUud2lkZ2V0ID09IGJvbGRCdXR0b24pIHsKLQkJCQkJCXN0eWxlLmZvbnRTdHlsZSBePSBTV1QuQk9MRDsKLQkJCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBpdGFsaWNCdXR0b24pIHsKLQkJCQkJCXN0eWxlLmZvbnRTdHlsZSBePSBTV1QuSVRBTElDOwkJCQkJCQotCQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHVuZGVybGluZUJ1dHRvbikgewotCQkJCQkJc3R5bGUudW5kZXJsaW5lID0gIXN0eWxlLnVuZGVybGluZTsKLQkJCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBzdHJpa2VvdXRCdXR0b24pIHsKLQkJCQkJCXN0eWxlLnN0cmlrZW91dCA9ICFzdHlsZS5zdHJpa2VvdXQ7Ci0JCQkJCX0KLQkJCQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkJCQl9Ci0JCQkJc3R5bGVkVGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsJCQkKLQkJCX0KLQkJfTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgY29sb3JMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUG9pbnQgc2VsID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCQkJCWlmICgoc2VsID09IG51bGwpIHx8IChzZWwueSA9PSAwKSkgcmV0dXJuOwotCQkJCUNvbG9yIGZnID0gbnVsbCwgYmcgPSBudWxsOwotCQkJCWlmIChlLndpZGdldCA9PSByZWRCdXR0b24pIHsKLQkJCQkJZmcgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHllbGxvd0J1dHRvbikgewotCQkJCQliZyA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpOwotCQkJCX0KLQkJCQlTdHlsZVJhbmdlIHN0eWxlOwotCQkJCWZvciAoaW50IGkgPSBzZWwueDsgaTxzZWwueCtzZWwueTsgaSsrKSB7Ci0JCQkJCVN0eWxlUmFuZ2UgcmFuZ2UgPSBzdHlsZWRUZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJCQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCQkJCXN0eWxlID0gKFN0eWxlUmFuZ2UpcmFuZ2UuY2xvbmUoKTsKLQkJCQkJCXN0eWxlLnN0YXJ0ID0gaTsKLQkJCQkJCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCQkJCQlzdHlsZS5mb3JlZ3JvdW5kID0gc3R5bGUuZm9yZWdyb3VuZCAhPSBudWxsID8gbnVsbCA6IGZnOwotCQkJCQkJc3R5bGUuYmFja2dyb3VuZCA9IHN0eWxlLmJhY2tncm91bmQgIT0gbnVsbCA/IG51bGwgOiBiZzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2UgKGksIDEsIGZnLCBiZywgU1dULk5PUk1BTCk7Ci0JCQkJCX0KLQkJCQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkJCQl9Ci0JCQkJc3R5bGVkVGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsKLQkJCX0KLQkJfTsKLQkJYm9sZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzdHlsZUxpc3RlbmVyKTsKLQkJaXRhbGljQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHN0eWxlTGlzdGVuZXIpOwotCQl1bmRlcmxpbmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc3R5bGVMaXN0ZW5lcik7Ci0JCXN0cmlrZW91dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzdHlsZUxpc3RlbmVyKTsKLQkJcmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNvbG9yTGlzdGVuZXIpOwotCQl5ZWxsb3dCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoY29sb3JMaXN0ZW5lcik7Ci0JCXllbGxvd0J1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZCAoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlib2xkSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWl0YWxpY0ltYWdlLmRpc3Bvc2UoKTsKLQkJCQlyZWRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJeWVsbG93SW1hZ2UuZGlzcG9zZSgpOwotCQkJCXVuZGVybGluZUltYWdlLmRpc3Bvc2UoKTsKLQkJCQlzdHJpa2VvdXRJbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCS8qIHN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgc3R5bGVkVGV4dCBpZiBhcHBsaWNhYmxlICovCi0JCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCXN0eWxlUmFuZ2VzID0gc3R5bGVkVGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCQkJdGV4dCA9IHN0eWxlZFRleHQuZ2V0VGV4dCgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VFeGFtcGxlV2lkZ2V0cygpOwkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIGN1c3RvbSBldmVudCBuYW1lcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgY3VzdG9tIGV2ZW50IG5hbWVzCi0JICovCi0JU3RyaW5nIFtdIGdldEN1c3RvbUV2ZW50TmFtZXMgKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7Ci0JCQkJIkV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIiLCAiQmlkaVNlZ21lbnRMaXN0ZW5lciIsICJMaW5lQmFja2dyb3VuZExpc3RlbmVyIiwKLQkJCQkiTGluZVN0eWxlTGlzdGVuZXIiLCAiUGFpbnRPYmplY3RMaXN0ZW5lciIsICJUZXh0Q2hhbmdlTGlzdGVuZXIiLAotCQkJCSJWZXJpZnlLZXlMaXN0ZW5lciIsICJXb3JkTW92ZW1lbnRMaXN0ZW5lciJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3N0eWxlZFRleHR9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IkFsaWdubWVudCIsICJDYXJldE9mZnNldCIsICJEb3VibGVDbGlja0VuYWJsZWQiLCAiRWRpdGFibGUiLCAiSG9yaXpvbnRhbEluZGV4IiwgIkhvcml6b250YWxQaXhlbCIsICJJbmRlbnQiLCAiT3JpZW50YXRpb24iLCAiU2VsZWN0aW9uIiwgIlRhYnMiLCAiVGV4dCIsICJUZXh0TGltaXQiLCAiVG9vbFRpcFRleHQiLCAiVG9wSW5kZXgiLCAiVG9wUGl4ZWwiLCAiV29yZFdyYXAifTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJTdHlsZWRUZXh0IjsKLQl9Ci0JCi0JLyoqCi0JICogSG9va3MgdGhlIGN1c3RvbSBsaXN0ZW5lciBzcGVjaWZpZWQgYnkgZXZlbnROYW1lLgotCSAqLwotCXZvaWQgaG9va0N1c3RvbUxpc3RlbmVyIChmaW5hbCBTdHJpbmcgZXZlbnROYW1lKSB7Ci0JCWlmIChldmVudE5hbWUgPT0gIkV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIiKSB7Ci0JCQlzdHlsZWRUZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIgKG5ldyBFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoRXh0ZW5kZWRNb2RpZnlFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmIChldmVudE5hbWUgPT0gIkJpZGlTZWdtZW50TGlzdGVuZXIiKSB7Ci0JCQlzdHlsZWRUZXh0LmFkZEJpZGlTZWdtZW50TGlzdGVuZXIgKG5ldyBCaWRpU2VnbWVudExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGxpbmVHZXRTZWdtZW50cyhCaWRpU2VnbWVudEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGV2ZW50TmFtZSA9PSAiTGluZUJhY2tncm91bmRMaXN0ZW5lciIpIHsKLQkJCXN0eWxlZFRleHQuYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lciAobmV3IExpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGluZUdldEJhY2tncm91bmQoTGluZUJhY2tncm91bmRFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmIChldmVudE5hbWUgPT0gIkxpbmVTdHlsZUxpc3RlbmVyIikgewotCQkJc3R5bGVkVGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lciAobmV3IExpbmVTdHlsZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGxpbmVHZXRTdHlsZShMaW5lU3R5bGVFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmIChldmVudE5hbWUgPT0gIlBhaW50T2JqZWN0TGlzdGVuZXIiKSB7Ci0JCQlzdHlsZWRUZXh0LmFkZFBhaW50T2JqZWN0TGlzdGVuZXIgKG5ldyBQYWludE9iamVjdExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50T2JqZWN0KFBhaW50T2JqZWN0RXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoZXZlbnROYW1lID09ICJUZXh0Q2hhbmdlTGlzdGVuZXIiKSB7Ci0JCQlzdHlsZWRUZXh0LmdldENvbnRlbnQoKS5hZGRUZXh0Q2hhbmdlTGlzdGVuZXIgKG5ldyBUZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgdGV4dENoYW5nZWQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSArICIudGV4dENoYW5nZWQiLCBldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2luZyhUZXh0Q2hhbmdpbmdFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSArICIudGV4dENoYW5naW5nIiwgZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB0ZXh0U2V0KFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUgKyAiLnRleHRTZXQiLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGV2ZW50TmFtZSA9PSAiVmVyaWZ5S2V5TGlzdGVuZXIiKSB7Ci0JCQlzdHlsZWRUZXh0LmFkZFZlcmlmeUtleUxpc3RlbmVyIChuZXcgVmVyaWZ5S2V5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgdmVyaWZ5S2V5KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGV2ZW50TmFtZSA9PSAiV29yZE1vdmVtZW50TGlzdGVuZXIiKSB7Ci0JCQlzdHlsZWRUZXh0LmFkZFdvcmRNb3ZlbWVudExpc3RlbmVyIChuZXcgTW92ZW1lbnRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBnZXROZXh0T2Zmc2V0KE1vdmVtZW50RXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUgKyAiLmdldE5leHRPZmZzZXQiLCBldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGdldFByZXZpb3VzT2Zmc2V0KE1vdmVtZW50RXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUgKyAiLmdldFByZXZpb3VzT2Zmc2V0IiwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQl3cmFwQnV0dG9uLnNldFNlbGVjdGlvbiAoKHN0eWxlZFRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuV1JBUCkgIT0gMCk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFNlbGVjdGlvbiAoKHN0eWxlZFRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChzdHlsZWRUZXh0LmdldFN0eWxlICgpICYgU1dULkZVTExfU0VMRUNUSU9OKSAhPSAwKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRFbmFibGVkICgoc3R5bGVkVGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5NVUxUSSkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldEVuYWJsZWQgKChzdHlsZWRUZXh0LmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQkJd3JhcEJ1dHRvbi5zZXRFbmFibGVkICgoc3R5bGVkVGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5NVUxUSSkgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGUwY2IzZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi0vKioKLSAqIDxjb2RlPlRhYjwvY29kZT4gaXMgdGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgZXZlcnkgcGFnZQotICogaW4gdGhlIGV4YW1wbGUncyB0YWIgZm9sZGVyLiAgRWFjaCBwYWdlIGluIHRoZSB0YWIgZm9sZGVyCi0gKiBkZXNjcmliZXMgYSBjb250cm9sLgotICoKLSAqIEEgVGFiIGl0c2VsZiBpcyBub3QgYSBjb250cm9sIGJ1dCBpbnN0ZWFkIHByb3ZpZGVzIGEKLSAqIGhpZXJhcmNoeSB3aXRoIHdoaWNoIHRvIHNoYXJlIGNvZGUgdGhhdCBpcyBjb21tb24gdG8KLSAqIGV2ZXJ5IHBhZ2UgaW4gdGhlIGZvbGRlci4KLSAqCi0gKiBBIHR5cGljYWwgcGFnZSBpbiBhIFRhYiBjb250YWlucyBhIHR3byBjb2x1bW4gY29tcG9zaXRlLgotICogVGhlIGxlZnQgY29sdW1uIGNvbnRhaW5zIHRoZSAiRXhhbXBsZSIgZ3JvdXAuICBUaGUgcmlnaHQKLSAqIGNvbHVtbiBjb250YWlucyAiQ29udHJvbCIgZ3JvdXAuICBUaGUgIkNvbnRyb2wiIGdyb3VwCi0gKiBjb250YWlucyBjb250cm9scyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGludGVyYWN0IHdpdGgKLSAqIHRoZSBleGFtcGxlIGNvbnRyb2wuICBUaGUgIkNvbnRyb2wiIGdyb3VwIHR5cGljYWxseQotICogY29udGFpbnMgYSAiU3R5bGUiLCAiT3RoZXIiIGFuZCAiU2l6ZSIgZ3JvdXAuICBTdWJjbGFzc2VzCi0gKiBjYW4gb3ZlcnJpZGUgdGhlc2UgZGVmYXVsdHMgdG8gYXVnbWVudCBhIGdyb3VwIG9yIHN0b3AKLSAqIGEgZ3JvdXAgZnJvbSBiZWluZyBjcmVhdGVkLgotICovCi1hYnN0cmFjdCBjbGFzcyBUYWIgewotCVNoZWxsIHNoZWxsOwotCURpc3BsYXkgZGlzcGxheTsKLQkKLQkvKiBDb21tb24gY29udHJvbCBidXR0b25zICovCi0JQnV0dG9uIGJvcmRlckJ1dHRvbiwgZW5hYmxlZEJ1dHRvbiwgdmlzaWJsZUJ1dHRvbiwgYmFja2dyb3VuZEltYWdlQnV0dG9uLCBwb3B1cE1lbnVCdXR0b247Ci0JQnV0dG9uIHByZWZlcnJlZEJ1dHRvbiwgdG9vU21hbGxCdXR0b24sIHNtYWxsQnV0dG9uLCBsYXJnZUJ1dHRvbiwgZmlsbEhCdXR0b24sIGZpbGxWQnV0dG9uOwotCi0JLyogQ29tbW9uIGdyb3VwcyBhbmQgY29tcG9zaXRlcyAqLwotCUNvbXBvc2l0ZSB0YWJGb2xkZXJQYWdlOwotCUdyb3VwIGV4YW1wbGVHcm91cCwgY29udHJvbEdyb3VwLCBsaXN0ZW5lcnNHcm91cCwgb3RoZXJHcm91cCwgc2l6ZUdyb3VwLCBzdHlsZUdyb3VwLCBjb2xvckdyb3VwLCBiYWNrZ3JvdW5kTW9kZUdyb3VwOwotCi0JLyogQ29udHJvbGxpbmcgaW5zdGFuY2UgKi8KLQlmaW5hbCBDb250cm9sRXhhbXBsZSBpbnN0YW5jZTsKLQotCS8qIFNpemluZyBjb25zdGFudHMgZm9yIHRoZSAiU2l6ZSIgZ3JvdXAgKi8KLQlzdGF0aWMgZmluYWwgaW50IFRPT19TTUFMTF9TSVpFCT0gMTA7Ci0Jc3RhdGljIGZpbmFsIGludCBTTUFMTF9TSVpFCQk9IDUwOwotCXN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfU0laRQkJPSAxMDA7Ci0JCi0JLyogUmlnaHQtdG8tbGVmdCBzdXBwb3J0ICovCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gUlRMX1NVUFBPUlRfRU5BQkxFID0gIndpbjMyIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpIHx8ICJndGsiLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSk7Ci0JR3JvdXAgb3JpZW50YXRpb25Hcm91cDsKLQlCdXR0b24gcnRsQnV0dG9uLCBsdHJCdXR0b24sIGRlZmF1bHRPcmlldGF0aW9uQnV0dG9uOwotCi0JLyogQ29udHJvbHMgYW5kIHJlc291cmNlcyBmb3IgdGhlICJDb2xvcnMgJiBGb250cyIgZ3JvdXAgKi8KLQlzdGF0aWMgZmluYWwgaW50IElNQUdFX1NJWkUgPSAxMjsKLQlzdGF0aWMgZmluYWwgaW50IEZPUkVHUk9VTkRfQ09MT1IgPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgQkFDS0dST1VORF9DT0xPUiA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBGT05UID0gMjsKLQlUYWJsZSBjb2xvckFuZEZvbnRUYWJsZTsKLQlDb2xvckRpYWxvZyBjb2xvckRpYWxvZzsKLQlGb250RGlhbG9nIGZvbnREaWFsb2c7Ci0JQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kQ29sb3I7Ci0JRm9udCBmb250OwotCQotCS8qIENvbnRyb2xzIGFuZCByZXNvdXJjZXMgZm9yIHRoZSAiQmFja2dyb3VuZCBNb2RlIiBncm91cCAqLwotCUNvbWJvIGJhY2tncm91bmRNb2RlQ29tYm87Ci0JQnV0dG9uIGJhY2tncm91bmRNb2RlSW1hZ2VCdXR0b24sIGJhY2tncm91bmRNb2RlQ29sb3JCdXR0b247Ci0KLQlib29sZWFuIHNhbXBsZVBvcHVwID0gZmFsc2U7Ci0JCi0JLyogU2V0L0dldCBBUEkgY29udHJvbHMgKi8KLQlDb21ibyBuYW1lQ29tYm87Ci0JTGFiZWwgcmV0dXJuVHlwZUxhYmVsOwotCUJ1dHRvbiBnZXRCdXR0b24sIHNldEJ1dHRvbjsKLQlUZXh0IHNldFRleHQsIGdldFRleHQ7Ci0JU2hlbGwgc2V0R2V0RGlhbG9nOwotCi0JLyogRXZlbnQgbG9nZ2luZyB2YXJpYWJsZXMgYW5kIGNvbnRyb2xzICovCi0JVGV4dCBldmVudENvbnNvbGU7Ci0JYm9vbGVhbiBsb2dnaW5nID0gZmFsc2U7Ci0JYm9vbGVhbiBbXSBldmVudHNGaWx0ZXI7Ci0JaW50IHNldEZpZWxkc01hc2sgPSAwOwotCUV2ZW50IHNldEZpZWxkc0V2ZW50ID0gbmV3IEV2ZW50ICgpOwotCWJvb2xlYW4gaWdub3JlID0gZmFsc2U7Ci0JCi0JLyogRXZlbnQgbG9nZ2luZyBjb25zdGFudHMgKi8KLQlzdGF0aWMgZmluYWwgaW50IERPSVQJPSAweDAxMDA7Ci0Jc3RhdGljIGZpbmFsIGludCBERVRBSUwJPSAweDAyMDA7Ci0Jc3RhdGljIGZpbmFsIGludCBURVhUCT0gMHgwNDAwOwotCXN0YXRpYyBmaW5hbCBpbnQgWAkJPSAweDA4MDA7Ci0Jc3RhdGljIGZpbmFsIGludCBZCQk9IDB4MTAwMDsKLQlzdGF0aWMgZmluYWwgaW50IFdJRFRICT0gMHgyMDAwOwotCXN0YXRpYyBmaW5hbCBpbnQgSEVJR0hUCT0gMHg0MDAwOwotCi0Jc3RhdGljIGZpbmFsIGludCBERVRBSUxfSU1FCQkJPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgREVUQUlMX0VSQVNFX0lURU0JPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgREVUQUlMX1RSQVZFUlNFCT0gMjsKLQotCXN0YXRpYyBjbGFzcyBFdmVudEluZm8gewotCQlTdHJpbmcgbmFtZTsKLQkJaW50IHR5cGU7Ci0JCWludCBzZXR0YWJsZUZpZWxkczsKLQkJaW50IHNldEZpZWxkczsKLQkJRXZlbnQgZXZlbnQ7Ci0JCUV2ZW50SW5mbyAoU3RyaW5nIG5hbWUsIGludCB0eXBlLCBpbnQgc2V0dGFibGVGaWVsZHMsIGludCBzZXRGaWVsZHMsIEV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuc2V0dGFibGVGaWVsZHMgPSBzZXR0YWJsZUZpZWxkczsKLQkJCXRoaXMuc2V0RmllbGRzID0gc2V0RmllbGRzOwotCQkJdGhpcy5ldmVudCA9IGV2ZW50OwotCQl9Ci0JfQotCQotCWZpbmFsIEV2ZW50SW5mbyBbXSBFVkVOVF9JTkZPID0gewotCQluZXcgRXZlbnRJbmZvICgiQWN0aXZhdGUiLCBTV1QuQWN0aXZhdGUsIDAsIDAsIG5ldyBFdmVudCgpKSwgCi0JCW5ldyBFdmVudEluZm8gKCJBcm0iLCBTV1QuQXJtLCAwLCAwLCBuZXcgRXZlbnQoKSksIAotCQluZXcgRXZlbnRJbmZvICgiQ2xvc2UiLCBTV1QuQ2xvc2UsIERPSVQsIDAsIG5ldyBFdmVudCgpKSwKLQkJbmV3IEV2ZW50SW5mbyAoIkNvbGxhcHNlIiwgU1dULkNvbGxhcHNlLCAwLCAwLCBuZXcgRXZlbnQoKSksCi0JCW5ldyBFdmVudEluZm8gKCJEZWFjdGl2YXRlIiwgU1dULkRlYWN0aXZhdGUsIDAsIDAsIG5ldyBFdmVudCgpKSwKLQkJbmV3IEV2ZW50SW5mbyAoIkRlZmF1bHRTZWxlY3Rpb24iLCBTV1QuRGVmYXVsdFNlbGVjdGlvbiwgMCwgMCwgbmV3IEV2ZW50KCkpLAotCQluZXcgRXZlbnRJbmZvICgiRGVpY29uaWZ5IiwgU1dULkRlaWNvbmlmeSwgMCwgMCwgbmV3IEV2ZW50KCkpLCAKLQkJbmV3IEV2ZW50SW5mbyAoIkRpc3Bvc2UiLCBTV1QuRGlzcG9zZSwgMCwgMCwgbmV3IEV2ZW50KCkpLAotCQluZXcgRXZlbnRJbmZvICgiRHJhZ0RldGVjdCIsIFNXVC5EcmFnRGV0ZWN0LCAwLCAwLCBuZXcgRXZlbnQoKSksIAotCQluZXcgRXZlbnRJbmZvICgiRXJhc2VJdGVtIiwgU1dULkVyYXNlSXRlbSwgREVUQUlMIHwgREVUQUlMX0VSQVNFX0lURU0sIDAsIG5ldyBFdmVudCgpKSwKLQkJbmV3IEV2ZW50SW5mbyAoIkV4cGFuZCIsIFNXVC5FeHBhbmQsIDAsIDAsIG5ldyBFdmVudCgpKSwgCi0JCW5ldyBFdmVudEluZm8gKCJGb2N1c0luIiwgU1dULkZvY3VzSW4sIDAsIDAsIG5ldyBFdmVudCgpKSwgCi0JCW5ldyBFdmVudEluZm8gKCJGb2N1c091dCIsIFNXVC5Gb2N1c091dCwgMCwgMCwgbmV3IEV2ZW50KCkpLAotCQluZXcgRXZlbnRJbmZvICgiSGFyZEtleURvd24iLCBTV1QuSGFyZEtleURvd24sIDAsIDAsIG5ldyBFdmVudCgpKSwgCi0JCW5ldyBFdmVudEluZm8gKCJIYXJkS2V5VXAiLCBTV1QuSGFyZEtleVVwLCAwLCAwLCBuZXcgRXZlbnQoKSksCi0JCW5ldyBFdmVudEluZm8gKCJIZWxwIiwgU1dULkhlbHAsIDAsIDAsIG5ldyBFdmVudCgpKSwgCi0JCW5ldyBFdmVudEluZm8gKCJIaWRlIiwgU1dULkhpZGUsIDAsIDAsIG5ldyBFdmVudCgpKSwKLQkJbmV3IEV2ZW50SW5mbyAoIkljb25pZnkiLCBTV1QuSWNvbmlmeSwgMCwgMCwgbmV3IEV2ZW50KCkpLCAKLQkJbmV3IEV2ZW50SW5mbyAoIktleURvd24iLCBTV1QuS2V5RG93biwgRE9JVCwgMCwgbmV3IEV2ZW50KCkpLAotCQluZXcgRXZlbnRJbmZvICgiS2V5VXAiLCBTV1QuS2V5VXAsIERPSVQsIDAsIG5ldyBFdmVudCgpKSwKLQkJbmV3IEV2ZW50SW5mbyAoIk1lYXN1cmVJdGVtIiwgU1dULk1lYXN1cmVJdGVtLCAwLCAwLCBuZXcgRXZlbnQoKSksCi0JCW5ldyBFdmVudEluZm8gKCJNZW51RGV0ZWN0IiwgU1dULk1lbnVEZXRlY3QsIFggfCBZIHwgRE9JVCwgMCwgbmV3IEV2ZW50KCkpLAotCQluZXcgRXZlbnRJbmZvICgiTW9kaWZ5IiwgU1dULk1vZGlmeSwgMCwgMCwgbmV3IEV2ZW50KCkpLCAKLQkJbmV3IEV2ZW50SW5mbyAoIk1vdXNlRG91YmxlQ2xpY2siLCBTV1QuTW91c2VEb3VibGVDbGljaywgMCwgMCwgbmV3IEV2ZW50KCkpLAotCQluZXcgRXZlbnRJbmZvICgiTW91c2VEb3duIiwgU1dULk1vdXNlRG93biwgMCwgMCwgbmV3IEV2ZW50KCkpLCAKLQkJbmV3IEV2ZW50SW5mbyAoIk1vdXNlRW50ZXIiLCBTV1QuTW91c2VFbnRlciwgMCwgMCwgbmV3IEV2ZW50KCkpLCAKLQkJbmV3IEV2ZW50SW5mbyAoIk1vdXNlRXhpdCIsIFNXVC5Nb3VzZUV4aXQsIDAsIDAsIG5ldyBFdmVudCgpKSwgCi0JCW5ldyBFdmVudEluZm8gKCJNb3VzZUhvdmVyIiwgU1dULk1vdXNlSG92ZXIsIDAsIDAsIG5ldyBFdmVudCgpKSwKLQkJbmV3IEV2ZW50SW5mbyAoIk1vdXNlTW92ZSIsIFNXVC5Nb3VzZU1vdmUsIDAsIDAsIG5ldyBFdmVudCgpKSwgCi0JCW5ldyBFdmVudEluZm8gKCJNb3VzZVVwIiwgU1dULk1vdXNlVXAsIDAsIDAsIG5ldyBFdmVudCgpKSwgCi0JCW5ldyBFdmVudEluZm8gKCJNb3VzZVdoZWVsIiwgU1dULk1vdXNlV2hlZWwsIDAsIDAsIG5ldyBFdmVudCgpKSwKLQkJbmV3IEV2ZW50SW5mbyAoIk1vdmUiLCBTV1QuTW92ZSwgMCwgMCwgbmV3IEV2ZW50KCkpLCAKLQkJbmV3IEV2ZW50SW5mbyAoIlBhaW50IiwgU1dULlBhaW50LCAwLCAwLCBuZXcgRXZlbnQoKSksIAotCQluZXcgRXZlbnRJbmZvICgiUGFpbnRJdGVtIiwgU1dULlBhaW50SXRlbSwgMCwgMCwgbmV3IEV2ZW50KCkpLAotCQluZXcgRXZlbnRJbmZvICgiUmVzaXplIiwgU1dULlJlc2l6ZSwgMCwgMCwgbmV3IEV2ZW50KCkpLCAKLQkJbmV3IEV2ZW50SW5mbyAoIlNlbGVjdGlvbiIsIFNXVC5TZWxlY3Rpb24sIFggfCBZIHwgRE9JVCwgMCwgbmV3IEV2ZW50KCkpLCAvLyBzYXNoCi0JCW5ldyBFdmVudEluZm8gKCJTZXREYXRhIiwgU1dULlNldERhdGEsIDAsIDAsIG5ldyBFdmVudCgpKSwKLS8vCQluZXcgRXZlbnRJbmZvICgiU2V0dGluZ3MiLCBTV1QuU2V0dGluZ3MsIDAsIDAsIG5ldyBFdmVudCgpKSwgIC8vIG5vdGU6IHRoaXMgZXZlbnQgb25seSBnb2VzIHRvIERpc3BsYXkKLQkJbmV3IEV2ZW50SW5mbyAoIlNob3ciLCBTV1QuU2hvdywgMCwgMCwgbmV3IEV2ZW50KCkpLCAKLQkJbmV3IEV2ZW50SW5mbyAoIlRyYXZlcnNlIiwgU1dULlRyYXZlcnNlLCBERVRBSUwgfCBERVRBSUxfVFJBVkVSU0UgfCBET0lULCAwLCBuZXcgRXZlbnQoKSksCi0JCW5ldyBFdmVudEluZm8gKCJWZXJpZnkiLCBTV1QuVmVyaWZ5LCBURVhUIHwgRE9JVCwgMCwgbmV3IEV2ZW50KCkpLAotCQluZXcgRXZlbnRJbmZvICgiSW1lQ29tcG9zaXRpb24iLCBTV1QuSW1lQ29tcG9zaXRpb24sIERFVEFJTCB8IERFVEFJTF9JTUUgfCBURVhUIHwgRE9JVCwgMCwgbmV3IEV2ZW50KCkpLAotCX07Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFtdW10gREVUQUlMX0NPTlNUQU5UUyA9IHsKLQkJeyAvLyBERVRBSUxfSU1FID0gMAotCQkJIlNXVC5DT01QT1NJVElPTl9DSEFOR0VEIiwKLQkJCSJTV1QuQ09NUE9TSVRJT05fT0ZGU0VUIiwKLQkJCSJTV1QuQ09NUE9TSVRJT05fU0VMRUNUSU9OIiwKLQkJfSwKLQkJeyAvLyBERVRBSUxfRVJBU0VfSVRFTSA9IDEKLQkJCSJTV1QuU0VMRUNURUQiLAotCQkJIlNXVC5GT0NVU0VEIiwKLQkJCSJTV1QuQkFDS0dST1VORCIsCi0JCQkiU1dULkZPUkVHUk9VTkQiLAotCQkJIlNXVC5IT1QiLAotCQl9LAotCQl7IC8vIERFVEFJTF9UUkFWRVJTRSA9IDIKLQkJCSJTV1QuVFJBVkVSU0VfTk9ORSIsCi0JCQkiU1dULlRSQVZFUlNFX0VTQ0FQRSIsCi0JCQkiU1dULlRSQVZFUlNFX1JFVFVSTiIsCi0JCQkiU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUyIsCi0JCQkiU1dULlRSQVZFUlNFX1RBQl9ORVhUIiwKLQkJCSJTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVMiLAotCQkJIlNXVC5UUkFWRVJTRV9BUlJPV19ORVhUIiwKLQkJCSJTV1QuVFJBVkVSU0VfTU5FTU9OSUMiLAotCQkJIlNXVC5UUkFWRVJTRV9QQUdFX1BSRVZJT1VTIiwKLQkJCSJTV1QuVFJBVkVSU0VfUEFHRV9ORVhUIiwKLQkJfSwKLQl9OwotCi0Jc3RhdGljIGZpbmFsIE9iamVjdCBbXSBERVRBSUxfVkFMVUVTID0gewotCQkiU1dULkNPTVBPU0lUSU9OX0NIQU5HRUQiLCBuZXcgSW50ZWdlcihTV1QuQ09NUE9TSVRJT05fQ0hBTkdFRCksCi0JCSJTV1QuQ09NUE9TSVRJT05fT0ZGU0VUIiwgbmV3IEludGVnZXIoU1dULkNPTVBPU0lUSU9OX09GRlNFVCksCi0JCSJTV1QuQ09NUE9TSVRJT05fU0VMRUNUSU9OIiwgbmV3IEludGVnZXIoU1dULkNPTVBPU0lUSU9OX1NFTEVDVElPTiksCi0JCSJTV1QuU0VMRUNURUQiLCBuZXcgSW50ZWdlcihTV1QuU0VMRUNURUQpLAotCQkiU1dULkZPQ1VTRUQiLCBuZXcgSW50ZWdlcihTV1QuRk9DVVNFRCksCi0JCSJTV1QuQkFDS0dST1VORCIsIG5ldyBJbnRlZ2VyKFNXVC5CQUNLR1JPVU5EKSwKLQkJIlNXVC5GT1JFR1JPVU5EIiwgbmV3IEludGVnZXIoU1dULkZPUkVHUk9VTkQpLAotCQkiU1dULkhPVCIsIG5ldyBJbnRlZ2VyKFNXVC5IT1QpLAotCQkiU1dULlRSQVZFUlNFX05PTkUiLCBuZXcgSW50ZWdlcihTV1QuVFJBVkVSU0VfTk9ORSksCi0JCSJTV1QuVFJBVkVSU0VfRVNDQVBFIiwgbmV3IEludGVnZXIoU1dULlRSQVZFUlNFX0VTQ0FQRSksCi0JCSJTV1QuVFJBVkVSU0VfUkVUVVJOIiwgbmV3IEludGVnZXIoU1dULlRSQVZFUlNFX1JFVFVSTiksCi0JCSJTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTIiwgbmV3IEludGVnZXIoU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUyksCi0JCSJTV1QuVFJBVkVSU0VfVEFCX05FWFQiLCBuZXcgSW50ZWdlcihTV1QuVFJBVkVSU0VfVEFCX05FWFQpLAotCQkiU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTIiwgbmV3IEludGVnZXIoU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTKSwKLQkJIlNXVC5UUkFWRVJTRV9BUlJPV19ORVhUIiwgbmV3IEludGVnZXIoU1dULlRSQVZFUlNFX0FSUk9XX05FWFQpLAotCQkiU1dULlRSQVZFUlNFX01ORU1PTklDIiwgbmV3IEludGVnZXIoU1dULlRSQVZFUlNFX01ORU1PTklDKSwKLQkJIlNXVC5UUkFWRVJTRV9QQUdFX1BSRVZJT1VTIiwgbmV3IEludGVnZXIoU1dULlRSQVZFUlNFX1BBR0VfUFJFVklPVVMpLAotCQkiU1dULlRSQVZFUlNFX1BBR0VfTkVYVCIsIG5ldyBJbnRlZ2VyKFNXVC5UUkFWRVJTRV9QQUdFX05FWFQpLAotCX07Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiBncm91cC4gIFRoZSAiQ29udHJvbCIgZ3JvdXAKLQkgKiBpcyB0eXBpY2FsbHkgdGhlIHJpZ2h0IGhhbmQgY29sdW1uIGluIHRoZSB0YWIuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sR3JvdXAgKCkgewotCQotCQkvKgotCQkgKiBDcmVhdGUgdGhlICJDb250cm9sIiBncm91cC4gIFRoaXMgaXMgdGhlIGdyb3VwIG9uIHRoZQotCQkgKiByaWdodCBoYWxmIG9mIGVhY2ggZXhhbXBsZSB0YWIuICBJdCBjb25zaXN0cyBvZiB0aGUKLQkJICogIlN0eWxlIiBncm91cCwgdGhlICJPdGhlciIgZ3JvdXAgYW5kIHRoZSAiU2l6ZSIgZ3JvdXAuCi0JCSAqLwkKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJY29udHJvbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQotCQkvKiBDcmVhdGUgaW5kaXZpZHVhbCBncm91cHMgaW5zaWRlIHRoZSAiQ29udHJvbCIgZ3JvdXAgKi8KLQkJY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkJY3JlYXRlU2V0R2V0R3JvdXAoKTsKLQkJY3JlYXRlU2l6ZUdyb3VwICgpOwotCQljcmVhdGVDb2xvckFuZEZvbnRHcm91cCAoKTsKLQkJaWYgKHJ0bFN1cHBvcnQoKSkgewotCQkJY3JlYXRlT3JpZW50YXRpb25Hcm91cCAoKTsKLQkJfQotCQotCQkvKgotCQkgKiBGb3IgZWFjaCBCdXR0b24gY2hpbGQgaW4gdGhlIHN0eWxlIGdyb3VwLCBhZGQgYSBzZWxlY3Rpb24KLQkJICogbGlzdGVuZXIgdGhhdCB3aWxsIHJlY3JlYXRlIHRoZSBleGFtcGxlIGNvbnRyb2xzLiAgSWYgdGhlCi0JCSAqIHN0eWxlIGdyb3VwIGJ1dHRvbiBpcyBhIFJBRElPIGJ1dHRvbiwgZW5zdXJlIHRoYXQgdGhlIHJhZGlvCi0JCSAqIGJ1dHRvbiBpcyBzZWxlY3RlZCBiZWZvcmUgcmVjcmVhdGluZyB0aGUgZXhhbXBsZSBjb250cm9scy4KLQkJICogV2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgUkFESU8gYnV0dG9uLCB0aGUgY3VycmVudCBSQURJTwotCQkgKiBidXR0b24gaW4gdGhlIGdyb3VwIGlzIGRlc2VsZWN0ZWQgYW5kIHRoZSBuZXcgUkFESU8gYnV0dG9uCi0JCSAqIGlzIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkuICBUaGUgbGlzdGVuZXJzIGFyZSBub3RpZmllZCBmb3IKLQkJICogYm90aCB0aGVzZSBvcGVyYXRpb25zIGJ1dCB0eXBpY2FsbHkgb25seSBkbyB3b3JrIHdoZW4gYSBSQURJTwotCQkgKiBidXR0b24gaXMgc2VsZWN0ZWQuCi0JCSAqLwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICgoZXZlbnQud2lkZ2V0LmdldFN0eWxlICgpICYgU1dULlJBRElPKSAhPSAwKSB7Ci0JCQkJCWlmICghKChCdXR0b24pIGV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uICgpKSByZXR1cm47Ci0JCQkJfQotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX07Ci0JCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBzdHlsZUdyb3VwLmdldENoaWxkcmVuICgpOwotCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbiBbaV0gaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgY2hpbGRyZW4gW2ldOwotCQkJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY2hpbGRyZW4gW2ldIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JCQkJCS8qIExvb2sgZG93biBvbmUgbW9yZSBsZXZlbCBvZiBjaGlsZHJlbiBpbiB0aGUgc3R5bGUgZ3JvdXAuICovCi0JCQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBjaGlsZHJlbiBbaV07Ci0JCQkJCUNvbnRyb2wgW10gZ3JhbmRjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbiAoKTsKLQkJCQkJZm9yIChpbnQgaj0wOyBqPGdyYW5kY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChncmFuZGNoaWxkcmVuIFtqXSBpbnN0YW5jZW9mIEJ1dHRvbikgewotCQkJCQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBncmFuZGNoaWxkcmVuIFtqXTsKLQkJCQkJCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocnRsU3VwcG9ydCgpKSB7Ci0JCQlydGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsgCi0JCQlsdHJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsJCQotCQkJZGVmYXVsdE9yaWV0YXRpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBcHBlbmQgdGhlIFNldC9HZXQgQVBJIGNvbnRyb2xzIHRvIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU2V0R2V0R3JvdXAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgYnV0dG9uIHRvIGFjY2VzcyBzZXQvZ2V0IEFQSSBmdW5jdGlvbmFsaXR5LgotCQkgKi8KLQkJZmluYWwgU3RyaW5nIFtdIG1ldGhvZE5hbWVzID0gZ2V0TWV0aG9kTmFtZXMgKCk7Ci0JCWlmIChtZXRob2ROYW1lcyAhPSBudWxsKSB7Ci0JCQlmaW5hbCBCdXR0b24gc2V0R2V0QnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULlBVU0gpOwotCQkJc2V0R2V0QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2V0X0dldCIpKTsKLQkJCXNldEdldEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlzZXRHZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmIChnZXRFeGFtcGxlV2lkZ2V0cygpLmxlbmd0aCA+ICAwKSB7Ci0JCQkJCQlpZiAoc2V0R2V0RGlhbG9nID09IG51bGwpIHsKLQkJCQkJCQlzZXRHZXREaWFsb2cgPSBjcmVhdGVTZXRHZXREaWFsb2cobWV0aG9kTmFtZXMpOwotCQkJCQkJfQotCQkJCQkJUG9pbnQgcHQgPSBzZXRHZXRCdXR0b24uZ2V0TG9jYXRpb24oKTsKLQkJCQkJCXB0ID0gZGlzcGxheS5tYXAoc2V0R2V0QnV0dG9uLmdldFBhcmVudCgpLCBudWxsLCBwdCk7Ci0JCQkJCQlzZXRHZXREaWFsb2cuc2V0TG9jYXRpb24ocHQueCwgcHQueSk7Ci0JCQkJCQlzZXRHZXREaWFsb2cub3BlbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYXVnbWVudAotCSAqIHRoZSBzdGFuZGFyZCBjb250cm9scyBjcmVhdGVkIGluIHRoZSAiU3R5bGUiLAotCSAqICJPdGhlciIgYW5kICJTaXplIiBncm91cHMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb2xvcnMgYW5kIEZvbnRzIiBncm91cC4gVGhpcyBpcyB0eXBpY2FsbHkKLQkgKiBhIGNoaWxkIG9mIHRoZSAiQ29udHJvbCIgZ3JvdXAuIFN1YmNsYXNzZXMgb3ZlcnJpZGUKLQkgKiB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgY29sb3IgYW5kIGZvbnQgc2V0dGluZ3MuCi0JICovCi0Jdm9pZCBjcmVhdGVDb2xvckFuZEZvbnRHcm91cCAoKSB7Ci0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAuICovCi0JCWNvbG9yR3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvbG9yR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMiwgdHJ1ZSkpOwotCQljb2xvckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJY29sb3JHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNvbG9ycyIpKTsKLQkJY29sb3JBbmRGb250VGFibGUgPSBuZXcgVGFibGUoY29sb3JHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JCWNvbG9yQW5kRm9udFRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSwgMiwgMSkpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRm9yZWdyb3VuZF9Db2xvciIpKTsKLQkJY29sb3JBbmRGb250VGFibGUuc2V0U2VsZWN0aW9uKDApOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJCYWNrZ3JvdW5kX0NvbG9yIikpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJGb250IikpOwotCQlCdXR0b24gY2hhbmdlQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29sb3JHcm91cCwgU1dULlBVU0gpOwotCQljaGFuZ2VCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2hhbmdlIikpOwotCQljaGFuZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlCdXR0b24gZGVmYXVsdHNCdXR0b24gPSBuZXcgQnV0dG9uIChjb2xvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCWRlZmF1bHRzQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlZmF1bHRzIikpOwotCQlkZWZhdWx0c0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0KLQkJLyogQWRkIGxpc3RlbmVycyB0byBzZXQvcmVzZXQgY29sb3JzIGFuZCBmb250cy4gKi8KLQkJY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2cgKHNoZWxsKTsKLQkJZm9udERpYWxvZyA9IG5ldyBGb250RGlhbG9nIChzaGVsbCk7Ci0JCWNvbG9yQW5kRm9udFRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJY2hhbmdlRm9udE9yQ29sb3IgKGNvbG9yQW5kRm9udFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJfQotCQl9KTsKLQkJY2hhbmdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQljaGFuZ2VGb250T3JDb2xvciAoY29sb3JBbmRGb250VGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQl9Ci0JCX0pOwotCQlkZWZhdWx0c0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0Q29sb3JzQW5kRm9udHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChmb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgZm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoYmFja2dyb3VuZENvbG9yICE9IG51bGwpIGJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCQkJZm9yZWdyb3VuZENvbG9yID0gbnVsbDsKLQkJCQliYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCWZvbnQgPSBudWxsOwotCQkJCWlmIChjb2xvckFuZEZvbnRUYWJsZSAhPSBudWxsICYmICFjb2xvckFuZEZvbnRUYWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBpdGVtc1tpXS5nZXRJbWFnZSgpOwotCQkJCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXZvaWQgY2hhbmdlRm9udE9yQ29sb3IoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgRk9SRUdST1VORF9DT0xPUjogewotCQkJCUNvbG9yIG9sZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSB7Ci0JCQkJCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlQ29udHJvbHMgKCk7Ci0JCQkJCWlmIChjb250cm9scy5sZW5ndGggPiAwKSBvbGRDb2xvciA9IGNvbnRyb2xzIFswXS5nZXRGb3JlZ3JvdW5kICgpOwotCQkJCX0KLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsgLy8gc2VlZCBkaWFsb2cgd2l0aCBjdXJyZW50IGNvbG9yCi0JCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRDb2xvciA9IGZvcmVncm91bmRDb2xvcjsgLy8gc2F2ZSBvbGQgZm9yZWdyb3VuZCBjb2xvciB0byBkaXNwb3NlIHdoZW4gZG9uZQotCQkJCWZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkJY2FzZSBCQUNLR1JPVU5EX0NPTE9SOiB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIHsKLQkJCQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJCQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA+IDApIG9sZENvbG9yID0gY29udHJvbHMgWzBdLmdldEJhY2tncm91bmQgKCk7IC8vIHNlZWQgZGlhbG9nIHdpdGggY3VycmVudCBjb2xvcgotCQkJCX0KLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gYmFja2dyb3VuZENvbG9yOyAvLyBzYXZlIG9sZCBiYWNrZ3JvdW5kIGNvbG9yIHRvIGRpc3Bvc2Ugd2hlbiBkb25lCi0JCQkJYmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yIChkaXNwbGF5LCByZ2IpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRCYWNrZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCQljYXNlIEZPTlQ6IHsKLQkJCQlGb250IG9sZEZvbnQgPSBmb250OwotCQkJCWlmIChvbGRGb250ID09IG51bGwpIHsKLQkJCQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJCQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA+IDApIG9sZEZvbnQgPSBjb250cm9scyBbMF0uZ2V0Rm9udCAoKTsKLQkJCQl9Ci0JCQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgZm9udERpYWxvZy5zZXRGb250TGlzdChvbGRGb250LmdldEZvbnREYXRhKCkpOyAvLyBzZWVkIGRpYWxvZyB3aXRoIGN1cnJlbnQgZm9udAotCQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuICgpOwotCQkJCWlmIChmb250RGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkRm9udCA9IGZvbnQ7IC8vIGRpc3Bvc2Ugb2xkIGZvbnQgd2hlbiBkb25lCi0JCQkJZm9udCA9IG5ldyBGb250IChkaXNwbGF5LCBmb250RGF0YSk7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEZvbnQgKCk7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlICgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLiAgVGhpcyBpcyB0eXBpY2FsbHkKLQkgKiBhIGNoaWxkIG9mIHRoZSAiQ29udHJvbCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlvdGhlckdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCW90aGVyR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk90aGVyIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCWVuYWJsZWRCdXR0b24gPSBuZXcgQnV0dG9uKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWVuYWJsZWRCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRW5hYmxlZCIpKTsKLQkJdmlzaWJsZUJ1dHRvbiA9IG5ldyBCdXR0b24ob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJdmlzaWJsZUJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJWaXNpYmxlIikpOwotCQliYWNrZ3JvdW5kSW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJhY2tncm91bmRJbWFnZUJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCYWNrZ3JvdW5kSW1hZ2UiKSk7Ci0JCXBvcHVwTWVudUJ1dHRvbiA9IG5ldyBCdXR0b24ob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJcG9wdXBNZW51QnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBvcHVwTWVudSIpKTsKLQkJCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWVuYWJsZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRFbmFibGVkICgpOwotCQkJfQotCQl9KTsKLQkJdmlzaWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFZpc2liaWxpdHkgKCk7Ci0JCQl9Ci0JCX0pOwotCQliYWNrZ3JvdW5kSW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRCYWNrZ3JvdW5kSW1hZ2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlwb3B1cE1lbnVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRQb3B1cE1lbnUgKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQkvKiBTZXQgdGhlIGRlZmF1bHQgc3RhdGUgKi8KLQkJZW5hYmxlZEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXZpc2libGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQliYWNrZ3JvdW5kSW1hZ2VCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJcG9wdXBNZW51QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJCYWNrZ3JvdW5kIE1vZGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlQmFja2dyb3VuZE1vZGVHcm91cCAoKSB7Ci0JCS8vIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBjcmVhdGVFeGFtcGxlV2lkZ2V0cwotCQlpZiAoZ2V0RXhhbXBsZUNvbnRyb2xzICgpLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCWJhY2tncm91bmRNb2RlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQliYWNrZ3JvdW5kTW9kZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQliYWNrZ3JvdW5kTW9kZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJYmFja2dyb3VuZE1vZGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmFja2dyb3VuZF9Nb2RlIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCWJhY2tncm91bmRNb2RlQ29tYm8gPSBuZXcgQ29tYm8oYmFja2dyb3VuZE1vZGVHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWJhY2tncm91bmRNb2RlQ29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsiU1dULklOSEVSSVRfTk9ORSIsICJTV1QuSU5IRVJJVF9ERUZBVUxUIiwgIlNXVC5JTkhFUklUX0ZPUkNFIn0pOwotCQliYWNrZ3JvdW5kTW9kZUltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihiYWNrZ3JvdW5kTW9kZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQliYWNrZ3JvdW5kTW9kZUltYWdlQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2tncm91bmRJbWFnZSIpKTsKLQkJYmFja2dyb3VuZE1vZGVDb2xvckJ1dHRvbiA9IG5ldyBCdXR0b24oYmFja2dyb3VuZE1vZGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYmFja2dyb3VuZE1vZGVDb2xvckJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCYWNrZ3JvdW5kQ29sb3IiKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWJhY2tncm91bmRNb2RlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEV4YW1wbGVHcm91cEJhY2tncm91bmRNb2RlICgpOwotCQkJfQotCQl9KTsKLQkJYmFja2dyb3VuZE1vZGVJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RXhhbXBsZUdyb3VwQmFja2dyb3VuZEltYWdlICgpOwotCQkJfQotCQl9KTsKLQkJYmFja2dyb3VuZE1vZGVDb2xvckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RXhhbXBsZUdyb3VwQmFja2dyb3VuZENvbG9yICgpOwotCQkJfQotCQl9KTsKLQkKLQkJLyogU2V0IHRoZSBkZWZhdWx0IHN0YXRlICovCi0JCWJhY2tncm91bmRNb2RlQ29tYm8uc2V0VGV4dChiYWNrZ3JvdW5kTW9kZUNvbWJvLmdldEl0ZW0oMCkpOwotCQliYWNrZ3JvdW5kTW9kZUltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWJhY2tncm91bmRNb2RlQ29sb3JCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0JCi0Jdm9pZCBjcmVhdGVFZGl0RXZlbnREaWFsb2coU2hlbGwgcGFyZW50LCBpbnQgeCwgaW50IHksIGZpbmFsIGludCBpbmRleCkgewotCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwocGFyZW50LCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJZGlhbG9nLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZGlhbG9nLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJFZGl0X0V2ZW50IikpOwotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRWRpdF9FdmVudF9GaWVsZHMiLCBuZXcgU3RyaW5nIFtdIHtFVkVOVF9JTkZPW2luZGV4XS5uYW1lfSkpOwotCQkKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAgKGRpYWxvZywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOyAKLQkJCi0JCWZpbmFsIGludCBmaWVsZHMgPSBFVkVOVF9JTkZPW2luZGV4XS5zZXR0YWJsZUZpZWxkczsKLQkJZmluYWwgaW50IGV2ZW50VHlwZSA9IEVWRU5UX0lORk9baW5kZXhdLnR5cGU7Ci0JCXNldEZpZWxkc01hc2sgPSBFVkVOVF9JTkZPW2luZGV4XS5zZXRGaWVsZHM7Ci0JCXNldEZpZWxkc0V2ZW50ID0gRVZFTlRfSU5GT1tpbmRleF0uZXZlbnQ7Ci0JCQotCQlpZiAoKGZpZWxkcyAmIERPSVQpICE9IDApIHsKLQkJCW5ldyBMYWJlbCAoZ3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgiZG9pdCIpOwotCQkJZmluYWwgQ29tYm8gZG9pdENvbWJvID0gbmV3IENvbWJvIChncm91cCwgU1dULlJFQURfT05MWSk7Ci0JCQlkb2l0Q29tYm8uc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyIiLCAidHJ1ZSIsICJmYWxzZSJ9KTsKLQkJCWlmICgoc2V0RmllbGRzTWFzayAmIERPSVQpICE9IDApIGRvaXRDb21iby5zZXRUZXh0KEJvb2xlYW4udG9TdHJpbmcoc2V0RmllbGRzRXZlbnQuZG9pdCkpOwotCQkJZG9pdENvbWJvLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCQlkb2l0Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gZG9pdENvbWJvLmdldFRleHQoKTsKLQkJCQkJaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXNldEZpZWxkc01hc2sgJj0gfkRPSVQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXRGaWVsZHNFdmVudC50eXBlID0gZXZlbnRUeXBlOwotCQkJCQkJc2V0RmllbGRzRXZlbnQuZG9pdCA9IG5ld1ZhbHVlLmVxdWFscygidHJ1ZSIpOwotCQkJCQkJc2V0RmllbGRzTWFzayB8PSBET0lUOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlpZiAoKGZpZWxkcyAmIERFVEFJTCkgIT0gMCkgewotCQkJbmV3IExhYmVsIChncm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJkZXRhaWwiKTsJCQkKLQkJCWludCBkZXRhaWxUeXBlID0gZmllbGRzICYgMHhGRjsKLQkJCWZpbmFsIENvbWJvIGRldGFpbENvbWJvID0gbmV3IENvbWJvIChncm91cCwgU1dULlJFQURfT05MWSk7Ci0JCQlkZXRhaWxDb21iby5zZXRJdGVtcyAoREVUQUlMX0NPTlNUQU5UU1tkZXRhaWxUeXBlXSk7Ci0JCQlkZXRhaWxDb21iby5hZGQgKCIiLCAwKTsKLQkJCWRldGFpbENvbWJvLnNldFZpc2libGVJdGVtQ291bnQoZGV0YWlsQ29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCQkJaWYgKChzZXRGaWVsZHNNYXNrICYgREVUQUlMKSAhPSAwKSBkZXRhaWxDb21iby5zZXRUZXh0IChERVRBSUxfQ09OU1RBTlRTW2RldGFpbFR5cGVdW3NldEZpZWxkc0V2ZW50LmRldGFpbF0pOwotCQkJZGV0YWlsQ29tYm8uc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJCWRldGFpbENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IGRldGFpbENvbWJvLmdldFRleHQoKTsKLQkJCQkJaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXNldEZpZWxkc01hc2sgJj0gfkRFVEFJTDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXNldEZpZWxkc0V2ZW50LnR5cGUgPSBldmVudFR5cGU7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IERFVEFJTF9WQUxVRVMubGVuZ3RoOyBpICs9IDIpIHsKLQkJCQkJCQlpZiAobmV3VmFsdWUuZXF1YWxzIChERVRBSUxfVkFMVUVTIFtpXSkpIHsKLQkJCQkJCQkJc2V0RmllbGRzRXZlbnQuZGV0YWlsID0gKChJbnRlZ2VyKSBERVRBSUxfVkFMVUVTIFtpICsgMV0pLmludFZhbHVlKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXNldEZpZWxkc01hc2sgfD0gREVUQUlMOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlpZiAoKGZpZWxkcyAmIFRFWFQpICE9IDApIHsKLQkJCW5ldyBMYWJlbCAoZ3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgidGV4dCIpOwkKLQkJCWZpbmFsIFRleHQgdGV4dFRleHQgPSBuZXcgVGV4dCAoZ3JvdXAsIFNXVC5CT1JERVIpOwotCQkJaWYgKChzZXRGaWVsZHNNYXNrICYgVEVYVCkgIT0gMCkgdGV4dFRleHQuc2V0VGV4dChzZXRGaWVsZHNFdmVudC50ZXh0KTsKLQkJCXRleHRUZXh0LnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCQl0ZXh0VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSB0ZXh0VGV4dC5nZXRUZXh0KCk7Ci0JCQkJCWlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlzZXRGaWVsZHNNYXNrICY9IH5URVhUOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2V0RmllbGRzRXZlbnQudHlwZSA9IGV2ZW50VHlwZTsKLQkJCQkJCXNldEZpZWxkc0V2ZW50LnRleHQgPSBuZXdWYWx1ZTsKLQkJCQkJCXNldEZpZWxkc01hc2sgfD0gVEVYVDsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJaWYgKChmaWVsZHMgJiBYKSAhPSAwKSB7Ci0JCQluZXcgTGFiZWwgKGdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIngiKTsJCi0JCQlmaW5hbCBUZXh0IHhUZXh0ID0gbmV3IFRleHQgKGdyb3VwLCBTV1QuQk9SREVSKTsKLQkJCWlmICgoc2V0RmllbGRzTWFzayAmIFgpICE9IDApIHhUZXh0LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhzZXRGaWVsZHNFdmVudC54KSk7Ci0JCQl4VGV4dC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQkJeFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0geFRleHQuZ2V0VGV4dCAoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWludCBuZXdJbnRWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQgKG5ld1ZhbHVlKTsKLQkJCQkJCXNldEZpZWxkc0V2ZW50LnR5cGUgPSBldmVudFR5cGU7Ci0JCQkJCQlzZXRGaWVsZHNFdmVudC54ID0gbmV3SW50VmFsdWU7Ci0JCQkJCQlzZXRGaWVsZHNNYXNrIHw9IFg7Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJCQkJc2V0RmllbGRzTWFzayAmPSB+WDsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJaWYgKChmaWVsZHMgJiBZKSAhPSAwKSB7Ci0JCQluZXcgTGFiZWwgKGdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoInkiKTsJCi0JCQlmaW5hbCBUZXh0IHlUZXh0ID0gbmV3IFRleHQgKGdyb3VwLCBTV1QuQk9SREVSKTsKLQkJCWlmICgoc2V0RmllbGRzTWFzayAmIFkpICE9IDApIHlUZXh0LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhzZXRGaWVsZHNFdmVudC55KSk7Ci0JCQl5VGV4dC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQkJeVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0geVRleHQuZ2V0VGV4dCAoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWludCBuZXdJbnRWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQgKG5ld1ZhbHVlKTsKLQkJCQkJCXNldEZpZWxkc0V2ZW50LnR5cGUgPSBldmVudFR5cGU7Ci0JCQkJCQlzZXRGaWVsZHNFdmVudC55ID0gbmV3SW50VmFsdWU7Ci0JCQkJCQlzZXRGaWVsZHNNYXNrIHw9IFk7Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJCQkJc2V0RmllbGRzTWFzayAmPSB+WTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJaWYgKChmaWVsZHMgJiBXSURUSCkgIT0gMCkgewotCQkJbmV3IExhYmVsIChncm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJ3aWR0aCIpOwkKLQkJCWZpbmFsIFRleHQgd2lkdGhUZXh0ID0gbmV3IFRleHQgKGdyb3VwLCBTV1QuQk9SREVSKTsKLQkJCWlmICgoc2V0RmllbGRzTWFzayAmIFdJRFRIKSAhPSAwKSB3aWR0aFRleHQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHNldEZpZWxkc0V2ZW50LndpZHRoKSk7Ci0JCQl3aWR0aFRleHQuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXdpZHRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSB3aWR0aFRleHQuZ2V0VGV4dCAoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWludCBuZXdJbnRWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQgKG5ld1ZhbHVlKTsKLQkJCQkJCXNldEZpZWxkc0V2ZW50LnR5cGUgPSBldmVudFR5cGU7Ci0JCQkJCQlzZXRGaWVsZHNFdmVudC53aWR0aCA9IG5ld0ludFZhbHVlOwotCQkJCQkJc2V0RmllbGRzTWFzayB8PSBXSURUSDsKLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlzZXRGaWVsZHNNYXNrICY9IH5XSURUSDsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJaWYgKChmaWVsZHMgJiBIRUlHSFQpICE9IDApIHsKLQkJCW5ldyBMYWJlbCAoZ3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgiaGVpZ2h0Iik7CQotCQkJZmluYWwgVGV4dCBoZWlnaHRUZXh0ID0gbmV3IFRleHQgKGdyb3VwLCBTV1QuQk9SREVSKTsKLQkJCWlmICgoc2V0RmllbGRzTWFzayAmIEhFSUdIVCkgIT0gMCkgaGVpZ2h0VGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcoc2V0RmllbGRzRXZlbnQuaGVpZ2h0KSk7Ci0JCQloZWlnaHRUZXh0LnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCQloZWlnaHRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IGhlaWdodFRleHQuZ2V0VGV4dCAoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWludCBuZXdJbnRWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQgKG5ld1ZhbHVlKTsKLQkJCQkJCXNldEZpZWxkc0V2ZW50LnR5cGUgPSBldmVudFR5cGU7Ci0JCQkJCQlzZXRGaWVsZHNFdmVudC5oZWlnaHQgPSBuZXdJbnRWYWx1ZTsKLQkJCQkJCXNldEZpZWxkc01hc2sgfD0gSEVJR0hUOwotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCQkJCXNldEZpZWxkc01hc2sgJj0gfkhFSUdIVDsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJQnV0dG9uIG9rID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0JCW9rLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPSyIpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoNzAsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULlJJR0hUOwotCQlvay5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUVWRU5UX0lORk9baW5kZXhdLnNldEZpZWxkcyA9IHNldEZpZWxkc01hc2s7Ci0JCQkJRVZFTlRfSU5GT1tpbmRleF0uZXZlbnQgPSBzZXRGaWVsZHNFdmVudDsKLQkJCQlkaWFsb2cuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQotCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbihvayk7Ci0JCWRpYWxvZy5wYWNrKCk7Ci0JCWRpYWxvZy5zZXRMb2NhdGlvbih4LCB5KTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV2ZW50IGNvbnNvbGUgcG9wdXAgbWVudS4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV2ZW50Q29uc29sZVBvcHVwICgpIHsKLQkJTWVudSBwb3B1cCA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JCWV2ZW50Q29uc29sZS5zZXRNZW51IChwb3B1cCk7Ci0KLQkJTWVudUl0ZW0gY3V0ID0gbmV3IE1lbnVJdGVtIChwb3B1cCwgU1dULlBVU0gpOwotCQljdXQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX0N1dCIpKTsKLQkJY3V0LmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnRDb25zb2xlLmN1dCAoKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnVJdGVtIGNvcHkgPSBuZXcgTWVudUl0ZW0gKHBvcHVwLCBTV1QuUFVTSCk7Ci0JCWNvcHkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX0NvcHkiKSk7Ci0JCWNvcHkuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudENvbnNvbGUuY29weSAoKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnVJdGVtIHBhc3RlID0gbmV3IE1lbnVJdGVtIChwb3B1cCwgU1dULlBVU0gpOwotCQlwYXN0ZS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVudUl0ZW1fUGFzdGUiKSk7Ci0JCXBhc3RlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnRDb25zb2xlLnBhc3RlICgpOwotCQkJfQotCQl9KTsKLQkJbmV3IE1lbnVJdGVtIChwb3B1cCwgU1dULlNFUEFSQVRPUik7Ci0JCU1lbnVJdGVtIHNlbGVjdEFsbCA9IG5ldyBNZW51SXRlbSAocG9wdXAsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX1NlbGVjdEFsbCIpKTsKLQkJc2VsZWN0QWxsLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnRDb25zb2xlLnNlbGVjdEFsbCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLiAgVGhlICJFeGFtcGxlIiBncm91cAotCSAqIGlzIHR5cGljYWxseSB0aGUgbGVmdCBoYW5kIGNvbHVtbiBpbiB0aGUgdGFiLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJZXhhbXBsZUdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWV4YW1wbGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4gb2YgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcGFydGljdWxhcgotCSAqIGV4YW1wbGUgY29udHJvbC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJLyogRG8gbm90aGluZyAqLwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgIkxpc3RlbmVyIHNlbGVjdGlvbiIgZGlhbG9nLgotCSAqLwotCXZvaWQgY3JlYXRlTGlzdGVuZXJTZWxlY3Rpb25EaWFsb2cgKCkgewotCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJZGlhbG9nLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2VsZWN0X0xpc3RlbmVycyIpKTsKLQkJZGlhbG9nLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDIsIGZhbHNlKSk7Ci0JCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChkaWFsb2csIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQ0hFQ0spOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gMzsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9JTkZPLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQgKEVWRU5UX0lORk9baV0ubmFtZSk7Ci0JCQlpdGVtLnNldENoZWNrZWQgKGV2ZW50c0ZpbHRlcltpXSk7Ci0JCX0KLQkJZmluYWwgU3RyaW5nIFtdIGN1c3RvbU5hbWVzID0gZ2V0Q3VzdG9tRXZlbnROYW1lcyAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXN0b21OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0IChjdXN0b21OYW1lc1tpXSk7Ci0JCQlpdGVtLnNldENoZWNrZWQgKGV2ZW50c0ZpbHRlcltFVkVOVF9JTkZPLmxlbmd0aCArIGldKTsKLQkJfQotCQlCdXR0b24gc2VsZWN0QWxsID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbC5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2VsZWN0X0FsbCIpKTsKLQkJc2VsZWN0QWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9JTkZPLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWl0ZW1zW2ldLnNldENoZWNrZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaXRlbXNbRVZFTlRfSU5GTy5sZW5ndGggKyBpXS5zZXRDaGVja2VkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCUJ1dHRvbiBkZXNlbGVjdEFsbCA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbC5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRGVzZWxlY3RfQWxsIikpOwotCQlkZXNlbGVjdEFsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJZGVzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9JTkZPLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWl0ZW1zW2ldLnNldENoZWNrZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWl0ZW1zW0VWRU5UX0lORk8ubGVuZ3RoICsgaV0uc2V0Q2hlY2tlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZmluYWwgQnV0dG9uIGVkaXRFdmVudCA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCQllZGl0RXZlbnQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJFZGl0X0V2ZW50IikpOwotCQllZGl0RXZlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWVkaXRFdmVudC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVBvaW50IHB0ID0gZWRpdEV2ZW50LmdldExvY2F0aW9uKCk7Ci0JCQkJcHQgPSBlLmRpc3BsYXkubWFwKGVkaXRFdmVudCwgbnVsbCwgcHQpOwotCQkJCWludCBpbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJaWYgKGdldEV4YW1wbGVXaWRnZXRzKCkubGVuZ3RoID4gMCAmJiBpbmRleCAhPSAtMSkgewotCQkJCQljcmVhdGVFZGl0RXZlbnREaWFsb2coZGlhbG9nLCBwdC54LCBwdC55LCBpbmRleCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZWRpdEV2ZW50LnNldEVuYWJsZWQoZmFsc2UpOwotCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgZmllbGRzID0gMDsKLQkJCQlpbnQgaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCWlmIChpbmRleCAhPSAtMSAmJiBpbmRleCA8IEVWRU5UX0lORk8ubGVuZ3RoKSB7ICAvLyBUT0RPOiBBbGxvdyBjdXN0b20gd2lkZ2V0cyB0byBzcGVjaWZ5IGV2ZW50IGluZm8KLQkJCQkJZmllbGRzID0gKEVWRU5UX0lORk9baW5kZXhdLnNldHRhYmxlRmllbGRzKTsKLQkJCQl9Ci0JCQkJZWRpdEV2ZW50LnNldEVuYWJsZWQoZmllbGRzICE9IDApOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZWRpdEV2ZW50LmdldEVuYWJsZWQoKSkgewotCQkJCQlQb2ludCBwdCA9IGVkaXRFdmVudC5nZXRMb2NhdGlvbigpOwotCQkJCQlwdCA9IGUuZGlzcGxheS5tYXAoZWRpdEV2ZW50LCBudWxsLCBwdCk7Ci0JCQkJCWludCBpbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCWlmIChnZXRFeGFtcGxlV2lkZ2V0cygpLmxlbmd0aCA+IDAgJiYgaW5kZXggIT0gLTEgJiYgaW5kZXggPCBFVkVOVF9JTkZPLmxlbmd0aCkgewotCQkJCQkJY3JlYXRlRWRpdEV2ZW50RGlhbG9nKGRpYWxvZywgcHQueCwgcHQueSwgaW5kZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoZGlhbG9nLCBTV1QuTk9ORSk7IC8qIEZpbGxlciAqLwotCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJb2suc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIk9LIikpOwotCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbihvayk7Ci0JCW9rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlvay5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IEVWRU5UX0lORk8ubGVuZ3RoOyBpKyspIHsKLQkJCQkJZXZlbnRzRmlsdGVyW2ldID0gaXRlbXNbaV0uZ2V0Q2hlY2tlZCgpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWV2ZW50c0ZpbHRlcltFVkVOVF9JTkZPLmxlbmd0aCArIGldID0gaXRlbXNbRVZFTlRfSU5GTy5sZW5ndGggKyBpXS5nZXRDaGVja2VkKCk7Ci0JCQkJfQotCQkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlkaWFsb2cucGFjayAoKTsKLQkJLyoKLQkJICogSWYgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBkaWFsb2cgaXMgdG9vIHRhbGwgZm9yIHRoZSBkaXNwbGF5LAotCQkgKiB0aGVuIHJlZHVjZSB0aGUgaGVpZ2h0LCBzbyB0aGF0IHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBhcHBlYXIuCi0JCSAqLwotCQlSZWN0YW5nbGUgYm91bmRzID0gZGlhbG9nLmdldEJvdW5kcygpOwotCQlSZWN0YW5nbGUgdHJpbSA9IGRpYWxvZy5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBkaXNwbGF5LmdldENsaWVudEFyZWEoKTsKLQkJaWYgKGJvdW5kcy5oZWlnaHQgPiBjbGllbnRBcmVhLmhlaWdodCkgewotCQkJZGlhbG9nLnNldFNpemUoYm91bmRzLndpZHRoLCBjbGllbnRBcmVhLmhlaWdodCAtIHRyaW0uaGVpZ2h0KTsKLQkJfQotCQlkaWFsb2cuc2V0TG9jYXRpb24oYm91bmRzLngsIGNsaWVudEFyZWEueSk7Ci0JCWRpYWxvZy5vcGVuICgpOwotCQl3aGlsZSAoISBkaWFsb2cuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiTGlzdGVuZXJzIiBncm91cC4gIFRoZSAiTGlzdGVuZXJzIiBncm91cAotCSAqIGdvZXMgYmVsb3cgdGhlICJFeGFtcGxlIiBhbmQgIkNvbnRyb2wiIGdyb3Vwcy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxpc3RlbmVyc0dyb3VwICgpIHsKLQkJbGlzdGVuZXJzR3JvdXAgPSBuZXcgR3JvdXAgKHRhYkZvbGRlclBhZ2UsIFNXVC5OT05FKTsKLQkJbGlzdGVuZXJzR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMywgZmFsc2UpKTsKLQkJbGlzdGVuZXJzR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQkJbGlzdGVuZXJzR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJMaXN0ZW5lcnMiKSk7Ci0KLQkJLyoKLQkJICogQ3JlYXRlIHRoZSBidXR0b24gdG8gYWNjZXNzIHRoZSAnTGlzdGVuZXJzJyBkaWFsb2cuCi0JCSAqLwotCQlCdXR0b24gbGlzdGVuZXJzQnV0dG9uID0gbmV3IEJ1dHRvbiAobGlzdGVuZXJzR3JvdXAsIFNXVC5QVVNIKTsKLQkJbGlzdGVuZXJzQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2VsZWN0X0xpc3RlbmVycyIpKTsKLQkJbGlzdGVuZXJzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3JlYXRlTGlzdGVuZXJTZWxlY3Rpb25EaWFsb2cgKCk7Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvKgotCQkgKiBDcmVhdGUgdGhlIGNoZWNrYm94IHRvIGFkZC9yZW1vdmUgbGlzdGVuZXJzIHRvL2Zyb20gdGhlIGV4YW1wbGUgd2lkZ2V0cy4KLQkJICovCi0JCWZpbmFsIEJ1dHRvbiBsaXN0ZW5DaGVja2JveCA9IG5ldyBCdXR0b24gKGxpc3RlbmVyc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlsaXN0ZW5DaGVja2JveC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkxpc3RlbiIpKTsKLQkJbGlzdGVuQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlsb2dnaW5nID0gbGlzdGVuQ2hlY2tib3guZ2V0U2VsZWN0aW9uICgpOwotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgYnV0dG9uIHRvIGNsZWFyIHRoZSB0ZXh0LgotCQkgKi8KLQkJQnV0dG9uIGNsZWFyQnV0dG9uID0gbmV3IEJ1dHRvbiAobGlzdGVuZXJzR3JvdXAsIFNXVC5QVVNIKTsKLQkJY2xlYXJCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDbGVhciIpKTsKLQkJY2xlYXJCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJY2xlYXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlldmVudENvbnNvbGUuc2V0VGV4dCAoIiIpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8qIEluaXRpYWxpemUgdGhlIGV2ZW50c0ZpbHRlciB0byBsb2cgYWxsIGV2ZW50cy4gKi8KLQkJaW50IGN1c3RvbUV2ZW50Q291bnQgPSBnZXRDdXN0b21FdmVudE5hbWVzICgpLmxlbmd0aDsKLQkJZXZlbnRzRmlsdGVyID0gbmV3IGJvb2xlYW4gW0VWRU5UX0lORk8ubGVuZ3RoICsgY3VzdG9tRXZlbnRDb3VudF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgRVZFTlRfSU5GTy5sZW5ndGggKyBjdXN0b21FdmVudENvdW50OyBpKyspIHsKLQkJCWV2ZW50c0ZpbHRlciBbaV0gPSB0cnVlOwotCQl9Ci0KLQkJLyogQ3JlYXRlIHRoZSBldmVudCBjb25zb2xlIFRleHQuICovCi0JCWV2ZW50Q29uc29sZSA9IG5ldyBUZXh0IChsaXN0ZW5lcnNHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJZXZlbnRDb25zb2xlLnNldExheW91dERhdGEgKGRhdGEpOwotCQljcmVhdGVFdmVudENvbnNvbGVQb3B1cCAoKTsKLQkJZXZlbnRDb25zb2xlLmFkZEtleUxpc3RlbmVyIChuZXcgS2V5QWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkIChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKChlLmtleUNvZGUgPT0gJ0EnIHx8IGUua2V5Q29kZSA9PSAnYScpICYmIChlLnN0YXRlTWFzayAmIFNXVC5NT0QxKSAhPSAwKSB7Ci0JCQkJCWV2ZW50Q29uc29sZS5zZWxlY3RBbGwgKCk7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlTaGVsbCBjcmVhdGVTZXRHZXREaWFsb2coU3RyaW5nW10gbWV0aG9kTmFtZXMpIHsKLQkJZmluYWwgU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFIHwgU1dULk1PREVMRVNTKTsKLQkJZGlhbG9nLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlkaWFsb2cuc2V0VGV4dChnZXRUYWJUZXh0KCkgKyAiICIgKyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNldF9HZXQiKSk7Ci0JCW5hbWVDb21ibyA9IG5ldyBDb21ibyhkaWFsb2csIFNXVC5SRUFEX09OTFkpOwotCQluYW1lQ29tYm8uc2V0SXRlbXMobWV0aG9kTmFtZXMpOwotCQluYW1lQ29tYm8uc2V0VGV4dChtZXRob2ROYW1lc1swXSk7Ci0JCW5hbWVDb21iby5zZXRWaXNpYmxlSXRlbUNvdW50KG1ldGhvZE5hbWVzLmxlbmd0aCk7Ci0JCW5hbWVDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCW5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZXNldExhYmVscygpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuVHlwZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZywgU1dULk5PTkUpOwotCQlyZXR1cm5UeXBlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLCBmYWxzZSkpOwotCQlzZXRCdXR0b24gPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlBVU0gpOwotCQlzZXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLCBmYWxzZSkpOwotCQlzZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0VmFsdWUoKTsKLQkJCQlzZXRUZXh0LnNlbGVjdEFsbCgpOwotCQkJCXNldFRleHQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJfSk7Ci0JCXNldFRleHQgPSBuZXcgVGV4dChkaWFsb2csIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJc2V0VGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWdldEJ1dHRvbiA9IG5ldyBCdXR0b24oZGlhbG9nLCBTV1QuUFVTSCk7Ci0JCWdldEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKSk7Ci0JCWdldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlnZXRWYWx1ZSgpOwotCQkJfQotCQl9KTsKLQkJZ2V0VGV4dCA9IG5ldyBUZXh0KGRpYWxvZywgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjQwOwotCQlkYXRhLmhlaWdodEhpbnQgPSAyMDA7Ci0JCWdldFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVzZXRMYWJlbHMoKTsKLQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24oc2V0QnV0dG9uKTsKLQkJZGlhbG9nLnBhY2soKTsKLQkJZGlhbG9nLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlzZXRHZXREaWFsb2cgPSBudWxsOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGRpYWxvZzsKLQl9Ci0KLQl2b2lkIHJlc2V0TGFiZWxzKCkgewotCQlTdHJpbmcgbWV0aG9kUm9vdCA9IG5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCXJldHVyblR5cGVMYWJlbC5zZXRUZXh0KHBhcmFtZXRlckluZm8obWV0aG9kUm9vdCkpOwotCQlzZXRCdXR0b24uc2V0VGV4dChzZXRNZXRob2ROYW1lKG1ldGhvZFJvb3QpKTsKLQkJZ2V0QnV0dG9uLnNldFRleHQoImdldCIgKyBtZXRob2RSb290KTsKLQkJc2V0VGV4dC5zZXRUZXh0KCIiKTsKLQkJZ2V0VGV4dC5zZXRUZXh0KCIiKTsKLQkJZ2V0VmFsdWUoKTsKLQkJc2V0VGV4dC5zZXRGb2N1cygpOwotCX0KLQotCVN0cmluZyBzZXRNZXRob2ROYW1lKFN0cmluZyBtZXRob2RSb290KSB7Ci0JCXJldHVybiAic2V0IiArIG1ldGhvZFJvb3Q7Ci0JfQotCi0JU3RyaW5nIHBhcmFtZXRlckluZm8oU3RyaW5nIG1ldGhvZFJvb3QpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJQ2xhc3MgcmV0dXJuVHlwZSA9IGdldFJldHVyblR5cGUobWV0aG9kUm9vdCk7Ci0JCWJvb2xlYW4gaXNBcnJheSA9IHJldHVyblR5cGUuaXNBcnJheSgpOwotCQlpZiAoaXNBcnJheSkgewotCQkJdHlwZU5hbWUgPSByZXR1cm5UeXBlLmdldENvbXBvbmVudFR5cGUoKS5nZXROYW1lKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlTmFtZSA9IHJldHVyblR5cGUuZ2V0TmFtZSgpOwotCQl9Ci0JCVN0cmluZyB0eXBlTmFtZVN0cmluZyA9IHR5cGVOYW1lOwotCQlpbnQgaW5kZXggPSB0eXBlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXgrMSA8IHR5cGVOYW1lLmxlbmd0aCgpKSB0eXBlTmFtZVN0cmluZyA9IHR5cGVOYW1lLnN1YnN0cmluZyhpbmRleCsxKTsKLQkJU3RyaW5nIGluZm8gPSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW5mb18iICsgdHlwZU5hbWVTdHJpbmcgKyAoaXNBcnJheSA/ICJBIiA6ICIiKSk7Ci0JCWlmIChpc0FycmF5KSB7Ci0JCQl0eXBlTmFtZVN0cmluZyArPSAiW10iOwotCQl9Ci0JCXJldHVybiBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFyYW1ldGVyX0luZm8iLCBuZXcgT2JqZWN0W10ge3R5cGVOYW1lU3RyaW5nLCBpbmZvfSk7Ci0JfQotCi0Jdm9pZCBnZXRWYWx1ZSgpIHsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSAiZ2V0IiArIG5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCWdldFRleHQuc2V0VGV4dCgiIik7Ci0JCVdpZGdldFtdIHdpZGdldHMgPSBnZXRFeGFtcGxlV2lkZ2V0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IHdpZGdldHNbaV0uZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbnVsbCk7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IG1ldGhvZC5pbnZva2Uod2lkZ2V0c1tpXSwgbnVsbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCWdldFRleHQuYXBwZW5kKCJudWxsIik7Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLQkJCQkJaW50IGxlbmd0aCA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5LmdldExlbmd0aChyZXN1bHQpOwotCQkJCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCQkJCWdldFRleHQuYXBwZW5kKHJlc3VsdC5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSArICJbMF0iKTsKLQkJCQkJfQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0JCQkJCQlnZXRUZXh0LmFwcGVuZChqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXQocmVzdWx0LGopLnRvU3RyaW5nKCkgKyAiXG4iKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWdldFRleHQuYXBwZW5kKHJlc3VsdC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWdldFRleHQuYXBwZW5kKGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAoaSArIDEgPCB3aWRnZXRzLmxlbmd0aCkgewotCQkJCWdldFRleHQuYXBwZW5kKCJcblxuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlDbGFzcyBnZXRSZXR1cm5UeXBlKFN0cmluZyBtZXRob2RSb290KSB7Ci0JCUNsYXNzIHJldHVyblR5cGUgPSBudWxsOwotCQlTdHJpbmcgbWV0aG9kTmFtZSA9ICJnZXQiICsgbWV0aG9kUm9vdDsKLQkJV2lkZ2V0W10gd2lkZ2V0cyA9IGdldEV4YW1wbGVXaWRnZXRzKCk7Ci0JCXRyeSB7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gd2lkZ2V0c1swXS5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBudWxsKTsKLQkJCXJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiByZXR1cm5UeXBlOwotCX0KLQkKLQl2b2lkIHNldFZhbHVlKCkgewotCQkvKiBUaGUgcGFyYW1ldGVyIHR5cGUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgZ2V0IG1ldGhvZCdzIHJldHVybiB0eXBlICovCi0JCVN0cmluZyBtZXRob2RSb290ID0gbmFtZUNvbWJvLmdldFRleHQoKTsKLQkJQ2xhc3MgcmV0dXJuVHlwZSA9IGdldFJldHVyblR5cGUobWV0aG9kUm9vdCk7Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gc2V0TWV0aG9kTmFtZShtZXRob2RSb290KTsKLQkJU3RyaW5nIHZhbHVlID0gc2V0VGV4dC5nZXRUZXh0KCk7Ci0JCVdpZGdldFtdIHdpZGdldHMgPSBnZXRFeGFtcGxlV2lkZ2V0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IHdpZGdldHNbaV0uZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3JldHVyblR5cGV9KTsKLQkJCQlTdHJpbmcgdHlwZU5hbWUgPSByZXR1cm5UeXBlLmdldE5hbWUoKTsKLQkJCQlPYmplY3RbXSBwYXJhbWV0ZXIgPSBudWxsOwotCQkJCWlmICh2YWx1ZS5lcXVhbHMoIm51bGwiKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge251bGx9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJpbnQiKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKHZhbHVlKX07Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoImxvbmciKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBMb25nKHZhbHVlKX07Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoImNoYXIiKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge3ZhbHVlLmxlbmd0aCgpID09IDEgPyBuZXcgQ2hhcmFjdGVyKHZhbHVlLmNoYXJBdCgwKSkgOiBuZXcgQ2hhcmFjdGVyKCdcMCcpfTsKLQkJCQl9IGVsc2UgaWYgKHR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7Ci0JCQkJCXBhcmFtZXRlciA9IG5ldyBPYmplY3RbXSB7bmV3IEJvb2xlYW4odmFsdWUpfTsKLQkJCQl9IGVsc2UgaWYgKHR5cGVOYW1lLmVxdWFscygiamF2YS5sYW5nLlN0cmluZyIpKSB7Ci0JCQkJCXBhcmFtZXRlciA9IG5ldyBPYmplY3RbXSB7dmFsdWV9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQiKSkgewotCQkJCQlTdHJpbmcgeHlbXSA9IHNwbGl0KHZhbHVlLCAnLCcpOwotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBQb2ludChuZXcgSW50ZWdlcih4eVswXSkuaW50VmFsdWUoKSxuZXcgSW50ZWdlcih4eVsxXSkuaW50VmFsdWUoKSl9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJbSSIpKSB7Ci0JCQkJCVN0cmluZyBzdHJpbmdzW10gPSBzcGxpdCh2YWx1ZSwgJywnKTsKLQkJCQkJaW50W10gaW50cyA9IG5ldyBpbnRbc3RyaW5ncy5sZW5ndGhdOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN0cmluZ3MubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWludHNbal0gPSBuZXcgSW50ZWdlcihzdHJpbmdzW2pdKS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCXBhcmFtZXRlciA9IG5ldyBPYmplY3RbXSB7aW50c307Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoIltMamF2YS5sYW5nLlN0cmluZzsiKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge3NwbGl0KHZhbHVlLCAnLCcpfTsKLQkJCQl9IGVsc2UgewotCQkJCQlwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJGb3JUeXBlKHR5cGVOYW1lLCB2YWx1ZSwgd2lkZ2V0c1tpXSk7Ci0JCQkJfQotCQkJCW1ldGhvZC5pbnZva2Uod2lkZ2V0c1tpXSwgcGFyYW1ldGVyKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOwotCQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJZ2V0VGV4dC5zZXRUZXh0KGUudG9TdHJpbmcoKSk7Ci0JCQkJaWYgKGNhdXNlICE9IG51bGwpIGdldFRleHQuYXBwZW5kKCIsIGNhdXNlPVxuIiArIGNhdXNlLnRvU3RyaW5nKCkpOwotCQkJCWlmIChtZXNzYWdlICE9IG51bGwpIGdldFRleHQuYXBwZW5kKCIsIG1lc3NhZ2U9XG4iICsgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlPYmplY3RbXSBwYXJhbWV0ZXJGb3JUeXBlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHZhbHVlLCBXaWRnZXQgd2lkZ2V0KSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10ge3ZhbHVlfTsKLQl9Ci0KLQl2b2lkIGNyZWF0ZU9yaWVudGF0aW9uR3JvdXAgKCkgewotCQkvKiBDcmVhdGUgT3JpZW50YXRpb24gZ3JvdXAqLwotCQlvcmllbnRhdGlvbkdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJb3JpZW50YXRpb25Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0KCkpOwotCQlvcmllbnRhdGlvbkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJb3JpZW50YXRpb25Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3JpZW50YXRpb24iKSk7Ci0JCWRlZmF1bHRPcmlldGF0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAob3JpZW50YXRpb25Hcm91cCwgU1dULlJBRElPKTsKLQkJZGVmYXVsdE9yaWV0YXRpb25CdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlZmF1bHQiKSk7Ci0JCWRlZmF1bHRPcmlldGF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWx0ckJ1dHRvbiA9IG5ldyBCdXR0b24gKG9yaWVudGF0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWx0ckJ1dHRvbi5zZXRUZXh0ICgiU1dULkxFRlRfVE9fUklHSFQiKTsKLQkJcnRsQnV0dG9uID0gbmV3IEJ1dHRvbiAob3JpZW50YXRpb25Hcm91cCwgU1dULlJBRElPKTsKLQkJcnRsQnV0dG9uLnNldFRleHQgKCJTV1QuUklHSFRfVE9fTEVGVCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU2l6ZSIgZ3JvdXAuICBUaGUgIlNpemUiIGdyb3VwIGNvbnRhaW5zCi0JICogY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHNpemUgb2YKLQkgKiB0aGUgZXhhbXBsZSB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlU2l6ZUdyb3VwICgpIHsKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlzaXplR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlzaXplR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCgpKTsKLQkJc2l6ZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJc2l6ZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTaXplIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCi0JCS8qCi0JCSAqIFRoZSBwcmVmZXJyZWQgc2l6ZSBvZiBhIHdpZGdldCBpcyB0aGUgc2l6ZSByZXR1cm5lZAotCQkgKiBieSB3aWRnZXQuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkuCi0JCSAqIFRoaXMgc2l6ZSBpcyBkZWZpbmVkIG9uIGEgd2lkZ2V0IGJ5IHdpZGdldCBiYXNpcy4KLQkJICogTWFueSB3aWRnZXRzIHdpbGwgYXR0ZW1wdCB0byBkaXNwbGF5IHRoZWlyIGNvbnRlbnRzLgotCQkgKi8KLQkJcHJlZmVycmVkQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2l6ZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmVmZXJyZWRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByZWZlcnJlZCIpKTsKLQkJdG9vU21hbGxCdXR0b24gPSBuZXcgQnV0dG9uIChzaXplR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvb1NtYWxsQnV0dG9uLnNldFRleHQgKFRPT19TTUFMTF9TSVpFICsgIiBYICIgKyBUT09fU01BTExfU0laRSk7Ci0JCXNtYWxsQnV0dG9uID0gbmV3IEJ1dHRvbihzaXplR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNtYWxsQnV0dG9uLnNldFRleHQgKFNNQUxMX1NJWkUgKyAiIFggIiArIFNNQUxMX1NJWkUpOwotCQlsYXJnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHNpemVHcm91cCwgU1dULlJBRElPKTsKLQkJbGFyZ2VCdXR0b24uc2V0VGV4dCAoTEFSR0VfU0laRSArICIgWCAiICsgTEFSR0VfU0laRSk7Ci0JCWZpbGxIQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2l6ZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmaWxsSEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsbF9YIikpOwotCQlmaWxsVkJ1dHRvbiA9IG5ldyBCdXR0b24gKHNpemVHcm91cCwgU1dULkNIRUNLKTsKLQkJZmlsbFZCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGxfWSIpKTsKLQkJCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCVNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfTsKLQkJcHJlZmVycmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdG9vU21hbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzbWFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWxhcmdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZmlsbEhCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlmaWxsVkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQlwcmVmZXJyZWRCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4gIFRoZSAiU3R5bGUiIGdyb3VwIGNvbnRhaW5zCi0JICogY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHN0eWxlIG9mCi0JICogdGhlIGV4YW1wbGUgd2lkZ2V0cy4gIENoYW5naW5nIGEgd2lkZ2V0ICJTdHlsZSIgY2F1c2VzCi0JICogdGhlIHdpZGdldCB0byBiZSBkZXN0cm95ZWQgYW5kIHJlY3JlYXRlZC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCXN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN0eWxlcyIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQkvKiBDYWNoZSB0aGUgc2hlbGwgYW5kIGRpc3BsYXkuICovCi0JCXNoZWxsID0gdGFiRm9sZGVyLmdldFNoZWxsICgpOwotCQlkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIHR3byBjb2x1bW4gcGFnZS4gKi8KLQkJdGFiRm9sZGVyUGFnZSA9IG5ldyBDb21wb3NpdGUgKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQl0YWJGb2xkZXJQYWdlLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDIsIGZhbHNlKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgIkV4YW1wbGUiIGFuZCAiQ29udHJvbCIgZ3JvdXBzLiAqLwotCQljcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCWNyZWF0ZUNvbnRyb2xHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgIkxpc3RlbmVycyIgZ3JvdXAgdW5kZXIgdGhlICJDb250cm9sIiBncm91cC4gKi8KLQkJY3JlYXRlTGlzdGVuZXJzR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIGV4YW1wbGUgYW5kIGNvbnRyb2wgd2lkZ2V0cy4gKi8KLQkJY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCWhvb2tFeGFtcGxlV2lkZ2V0TGlzdGVuZXJzICgpOwotCQljcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJY3JlYXRlQmFja2dyb3VuZE1vZGVHcm91cCAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCQotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFBvcHVwTWVudSgpIHsKLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIENvbnRyb2wgY29udHJvbCA9IGNvbnRyb2xzIFtpXTsKLQkJCWNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULk1lbnVEZXRlY3QsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkgICAgICAgIAlNZW51IG1lbnUgPSBjb250cm9sLmdldE1lbnUoKTsKLQkJICAgICAgICAJaWYgKG1lbnUgIT0gbnVsbCAmJiBzYW1wbGVQb3B1cCkgewotCQkgICAgICAgIAkJbWVudS5kaXNwb3NlKCk7Ci0JCSAgICAgICAgCQltZW51ID0gbnVsbDsKLQkJICAgICAgICAJfQotCQkgICAgICAgIAlpZiAobWVudSA9PSBudWxsICYmIHBvcHVwTWVudUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJICAgICAgICAJbWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuUE9QX1VQKTsKLQkJCSAgICAgICAgCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJICAgICAgICAJaXRlbS5zZXRUZXh0KCJTYW1wbGUgcG9wdXAgbWVudSBpdGVtIik7Ci0JCQkgICAgICAgIAlzcGVjaWFsUG9wdXBNZW51SXRlbXMobWVudSwgZXZlbnQpOwotCQkJICAgICAgICAJY29udHJvbC5zZXRNZW51KG1lbnUpOwotCQkgICAgICAgIAkJc2FtcGxlUG9wdXAgPSB0cnVlOwotCQkgICAgICAgIAl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWFsUG9wdXBNZW51SXRlbXMoZmluYWwgTWVudSBtZW51LCBmaW5hbCBFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCVdpZGdldCBbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx3aWRnZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3aWRnZXRzIFtpXS5kaXNwb3NlICgpOwotCQl9Ci0JfQotCQotCUltYWdlIGNvbG9ySW1hZ2UgKENvbG9yIGNvbG9yKSB7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBJTUFHRV9TSVpFLCBJTUFHRV9TSVpFKTsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJZ2MuZHJhd1JlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGggLSAxLCBib3VuZHMuaGVpZ2h0IC0gMSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLQlJbWFnZSBmb250SW1hZ2UgKEZvbnQgZm9udCkgewotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgSU1BR0VfU0laRSwgSU1BR0VfU0laRSk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCAtIDEsIGJvdW5kcy5oZWlnaHQgLSAxKTsKLQkJRm9udERhdGEgZGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlpbnQgc3R5bGUgPSBkYXRhWzBdLmdldFN0eWxlKCk7Ci0JCXN3aXRjaCAoc3R5bGUpIHsKLQkJY2FzZSBTV1QuTk9STUFMOgotCQkJZ2MuZHJhd0xpbmUoMywgMywgMywgOCk7Ci0JCQlnYy5kcmF3TGluZSg0LCAzLCA3LCA4KTsKLQkJCWdjLmRyYXdMaW5lKDgsIDMsIDgsIDgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1dULkJPTEQ6Ci0JCQlnYy5kcmF3TGluZSgzLCAyLCAzLCA5KTsKLQkJCWdjLmRyYXdMaW5lKDQsIDIsIDQsIDkpOwotCQkJZ2MuZHJhd0xpbmUoNSwgMiwgNywgMik7Ci0JCQlnYy5kcmF3TGluZSg1LCAzLCA4LCAzKTsKLQkJCWdjLmRyYXdMaW5lKDUsIDUsIDcsIDUpOwotCQkJZ2MuZHJhd0xpbmUoNSwgNiwgNywgNik7Ci0JCQlnYy5kcmF3TGluZSg1LCA4LCA4LCA4KTsKLQkJCWdjLmRyYXdMaW5lKDUsIDksIDcsIDkpOwotCQkJZ2MuZHJhd0xpbmUoNywgNCwgOCwgNCk7Ci0JCQlnYy5kcmF3TGluZSg3LCA3LCA4LCA3KTsKLQkJCWJyZWFrOwotCQljYXNlIFNXVC5JVEFMSUM6Ci0JCQlnYy5kcmF3TGluZSg2LCAyLCA4LCAyKTsKLQkJCWdjLmRyYXdMaW5lKDcsIDMsIDQsIDgpOwotCQkJZ2MuZHJhd0xpbmUoMywgOSwgNSwgOSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTV1QuQk9MRCB8IFNXVC5JVEFMSUM6Ci0JCQlnYy5kcmF3TGluZSg1LCAyLCA4LCAyKTsKLQkJCWdjLmRyYXdMaW5lKDUsIDMsIDgsIDMpOwotCQkJZ2MuZHJhd0xpbmUoNiwgNCwgNCwgNyk7Ci0JCQlnYy5kcmF3TGluZSg3LCA0LCA1LCA3KTsKLQkJCWdjLmRyYXdMaW5lKDMsIDgsIDYsIDgpOwotCQkJZ2MuZHJhd0xpbmUoMywgOSwgNiwgOSk7Ci0JCQlicmVhazsKLQkJfQotCQlnYy5kaXNwb3NlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBjdXN0b20gZXZlbnQgbmFtZXMuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhbGxvdyBhZGRpbmcgb2YgY3VzdG9tIGV2ZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgY3VzdG9tIGV2ZW50IG5hbWVzCi0JICogQHNlZSBob29rQ3VzdG9tTGlzdGVuZXIKLQkgKi8KLQlTdHJpbmcgW10gZ2V0Q3VzdG9tRXZlbnROYW1lcyAoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFswXTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBzdHlsZSBmb3IgYSB3aWRnZXQKLQkgKgotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3R5bGUgYml0Ci0JICovCi0JaW50IGdldERlZmF1bHRTdHlsZSAoKSB7Ci0JCWlmIChsdHJCdXR0b24gIT0gbnVsbCAmJiBsdHJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJldHVybiBTV1QuTEVGVF9UT19SSUdIVDsKLQkJfQotCQlpZiAocnRsQnV0dG9uICE9IG51bGwgJiYgcnRsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlyZXR1cm4gU1dULlJJR0hUX1RPX0xFRlQ7Ci0JCX0KLQkJcmV0dXJuIFNXVC5OT05FOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXRzCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgWzBdOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgY29udHJvbHMuCi0JICogVGhpcyBpcyB0aGUgc3Vic2V0IG9mICJFeGFtcGxlIiB3aWRnZXRzIHRoYXQgYXJlIGNvbnRyb2xzLgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIGNvbnRyb2xzCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlQ29udHJvbHMgKCkgewotCQlXaWRnZXQgW10gd2lkZ2V0cyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gbmV3IENvbnRyb2wgWzBdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh3aWRnZXRzW2ldIGluc3RhbmNlb2YgQ29udHJvbCkgewotCQkJCUNvbnRyb2xbXSBuZXdDb250cm9scyA9IG5ldyBDb250cm9sW2NvbnRyb2xzLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoY29udHJvbHMsIDAsIG5ld0NvbnRyb2xzLCAwLCBjb250cm9scy5sZW5ndGgpOwotCQkJCWNvbnRyb2xzID0gbmV3Q29udHJvbHM7Ci0JCQkJY29udHJvbHNbY29udHJvbHMubGVuZ3RoIC0gMV0gPSAoQ29udHJvbCl3aWRnZXRzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250cm9sczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCdzIGl0ZW1zLCBpZiBhbnkuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgd2lkZ2V0J3MgaXRlbXMKLQkgKi8KLQlJdGVtIFtdIGdldEV4YW1wbGVXaWRnZXRJdGVtcyAoKSB7Ci0JCXJldHVybiBuZXcgSXRlbSBbMF07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHNob3J0IHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaG9ydCB0ZXh0IGZvciB0aGUgdGFiIGl0ZW0KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnRUYWJUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGFiVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGl0ZW0KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JLyoqCi0JICogSG9va3MgYWxsIGxpc3RlbmVycyB0byBhbGwgZXhhbXBsZSBjb250cm9scwotCSAqIGFuZCBleGFtcGxlIGNvbnRyb2wgaXRlbXMuCi0JICovCi0Jdm9pZCBob29rRXhhbXBsZVdpZGdldExpc3RlbmVycyAoKSB7Ci0JCWlmIChsb2dnaW5nKSB7Ci0JCQlXaWRnZXRbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyBpKyspIHsKLQkJCQlob29rTGlzdGVuZXJzICh3aWRnZXRzIFtpXSk7Ci0JCQl9Ci0JCQlJdGVtW10gZXhhbXBsZUl0ZW1zID0gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGFtcGxlSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlob29rTGlzdGVuZXJzIChleGFtcGxlSXRlbXMgW2ldKTsKLQkJCX0KLQkJCVN0cmluZyBbXSBjdXN0b21OYW1lcyA9IGdldEN1c3RvbUV2ZW50TmFtZXMgKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGV2ZW50c0ZpbHRlciBbRVZFTlRfSU5GTy5sZW5ndGggKyBpXSkgewotCQkJCQlob29rQ3VzdG9tTGlzdGVuZXIgKGN1c3RvbU5hbWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSG9va3MgdGhlIGN1c3RvbSBsaXN0ZW5lciBzcGVjaWZpZWQgYnkgZXZlbnROYW1lLgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIGN1c3RvbSBsaXN0ZW5lcnMuCi0JICogQHNlZSBnZXRDdXN0b21FdmVudE5hbWVzCi0JICovCi0Jdm9pZCBob29rQ3VzdG9tTGlzdGVuZXIgKFN0cmluZyBldmVudE5hbWUpIHsKLQl9Ci0JCi0JLyoqCi0JICogSG9va3MgYWxsIGxpc3RlbmVycyB0byB0aGUgc3BlY2lmaWVkIHdpZGdldC4KLQkgKi8KLQl2b2lkIGhvb2tMaXN0ZW5lcnMgKFdpZGdldCB3aWRnZXQpIHsKLQkJaWYgKGxvZ2dpbmcpIHsKLQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50KTsKLQkJCQl9Ci0JCQl9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9JTkZPLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGV2ZW50c0ZpbHRlciBbaV0pIHsKLQkJCQkJd2lkZ2V0LmFkZExpc3RlbmVyIChFVkVOVF9JTkZPW2ldLnR5cGUsIGxpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9ncyBhbiB1bnR5cGVkIGV2ZW50IHRvIHRoZSBldmVudCBjb25zb2xlLgotCSAqLwotCXZvaWQgbG9nKEV2ZW50IGV2ZW50KSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBFVkVOVF9JTkZPLmxlbmd0aCkgewotCQkJaWYgKEVWRU5UX0lORk9baV0udHlwZSA9PSBldmVudC50eXBlKSBicmVhazsKLQkJCWkrKzsKLQkJfQotCQlTdHJpbmcgdG9TdHJpbmcgPSBFVkVOVF9JTkZPW2ldLm5hbWUgKyAiIFsiICsgZXZlbnQudHlwZSArICJdOiAiOwotCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCWNhc2UgU1dULktleURvd246Ci0JCQljYXNlIFNXVC5LZXlVcDogdG9TdHJpbmcgKz0gbmV3IEtleUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJY2FzZSBTV1QuTW91c2VVcDoKLQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCWNhc2UgU1dULk1vdXNlRW50ZXI6Ci0JCQljYXNlIFNXVC5Nb3VzZUV4aXQ6Ci0JCQljYXNlIFNXVC5Nb3VzZURvdWJsZUNsaWNrOgotCQkJY2FzZSBTV1QuTW91c2VXaGVlbDogCi0JCQljYXNlIFNXVC5Nb3VzZUhvdmVyOiB0b1N0cmluZyArPSBuZXcgTW91c2VFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULlBhaW50OiB0b1N0cmluZyArPSBuZXcgUGFpbnRFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULk1vdmU6Ci0JCQljYXNlIFNXVC5SZXNpemU6IHRvU3RyaW5nICs9IG5ldyBDb250cm9sRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5EaXNwb3NlOiB0b1N0cmluZyArPSBuZXcgRGlzcG9zZUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuU2VsZWN0aW9uOgotCQkJY2FzZSBTV1QuRGVmYXVsdFNlbGVjdGlvbjogdG9TdHJpbmcgKz0gbmV3IFNlbGVjdGlvbkV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuRm9jdXNJbjoKLQkJCWNhc2UgU1dULkZvY3VzT3V0OiB0b1N0cmluZyArPSBuZXcgRm9jdXNFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULkV4cGFuZDoKLQkJCWNhc2UgU1dULkNvbGxhcHNlOiB0b1N0cmluZyArPSBuZXcgVHJlZUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuSWNvbmlmeToKLQkJCWNhc2UgU1dULkRlaWNvbmlmeToKLQkJCWNhc2UgU1dULkNsb3NlOgotCQkJY2FzZSBTV1QuQWN0aXZhdGU6Ci0JCQljYXNlIFNXVC5EZWFjdGl2YXRlOiB0b1N0cmluZyArPSBuZXcgU2hlbGxFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULlNob3c6Ci0JCQljYXNlIFNXVC5IaWRlOiB0b1N0cmluZyArPSAoZXZlbnQud2lkZ2V0IGluc3RhbmNlb2YgTWVudSkgPyBuZXcgTWVudUV2ZW50IChldmVudCkudG9TdHJpbmcgKCkgOiBldmVudC50b1N0cmluZygpOyBicmVhazsKLQkJCWNhc2UgU1dULk1vZGlmeTogdG9TdHJpbmcgKz0gbmV3IE1vZGlmeUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuVmVyaWZ5OiB0b1N0cmluZyArPSBuZXcgVmVyaWZ5RXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5IZWxwOiB0b1N0cmluZyArPSBuZXcgSGVscEV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuQXJtOiB0b1N0cmluZyArPSBuZXcgQXJtRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5UcmF2ZXJzZTogdG9TdHJpbmcgKz0gbmV3IFRyYXZlcnNlRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5IYXJkS2V5RG93bjoKLQkJCWNhc2UgU1dULkhhcmRLZXlVcDoKLQkJCWNhc2UgU1dULkRyYWdEZXRlY3Q6Ci0JCQljYXNlIFNXVC5NZW51RGV0ZWN0OgotCQkJY2FzZSBTV1QuU2V0RGF0YToKLQkJCWRlZmF1bHQ6IHRvU3RyaW5nICs9IGV2ZW50LnRvU3RyaW5nICgpOwotCQl9Ci0JCWxvZyAodG9TdHJpbmcpOwotCQkKLQkJLyogUmV0dXJuIHZhbHVlcyBmb3IgZXZlbnQgZmllbGRzLiAqLwotCQlpbnQgbWFzayA9IEVWRU5UX0lORk9baV0uc2V0RmllbGRzOwotCQlpZiAoIWlnbm9yZSAmJiBtYXNrICE9IDApIHsKLQkJCUV2ZW50IHNldEZpZWxkc0V2ZW50ID0gRVZFTlRfSU5GT1tpXS5ldmVudDsKLQkJCWlmICgobWFzayAmIERPSVQpICE9IDApIGV2ZW50LmRvaXQgPSBzZXRGaWVsZHNFdmVudC5kb2l0OwotCQkJaWYgKChtYXNrICYgREVUQUlMKSAhPSAwKSBldmVudC5kZXRhaWwgPSBzZXRGaWVsZHNFdmVudC5kZXRhaWw7Ci0JCQlpZiAoKG1hc2sgJiBURVhUKSAhPSAwKSBldmVudC50ZXh0ID0gc2V0RmllbGRzRXZlbnQudGV4dDsKLQkJCWlmICgobWFzayAmIFgpICE9IDApIGV2ZW50LnggPSBzZXRGaWVsZHNFdmVudC54OwotCQkJaWYgKChtYXNrICYgWSkgIT0gMCkgZXZlbnQueSA9IHNldEZpZWxkc0V2ZW50Lnk7Ci0JCQlpZiAoKG1hc2sgJiBXSURUSCkgIT0gMCkgZXZlbnQud2lkdGggPSBzZXRGaWVsZHNFdmVudC53aWR0aDsKLQkJCWlmICgobWFzayAmIEhFSUdIVCkgIT0gMCkgZXZlbnQuaGVpZ2h0ID0gc2V0RmllbGRzRXZlbnQuaGVpZ2h0OwotCQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJldHVybmluZyIpKTsKLQkJCWlnbm9yZSA9IHRydWU7Ci0JCQlsb2cgKGV2ZW50KTsKLQkJCWlnbm9yZSA9IGZhbHNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvZ3MgYSBzdHJpbmcgdG8gdGhlIGV2ZW50IGNvbnNvbGUuCi0JICovCi0Jdm9pZCBsb2cgKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKCFldmVudENvbnNvbGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlldmVudENvbnNvbGUuYXBwZW5kIChzdHJpbmcpOwotCQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoIlxuIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2dzIGEgdHlwZWQgZXZlbnQgdG8gdGhlIGV2ZW50IGNvbnNvbGUuCi0JICovCi0Jdm9pZCBsb2cgKFN0cmluZyBldmVudE5hbWUsIFR5cGVkRXZlbnQgZXZlbnQpIHsKLQkJbG9nIChldmVudE5hbWUgKyAiOiAiICsgZXZlbnQudG9TdHJpbmcgKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZWNyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCWRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCWhvb2tFeGFtcGxlV2lkZ2V0TGlzdGVuZXJzICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3IsIGJhY2tncm91bmQgY29sb3IsIGFuZCBmb250Ci0JICogb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzIHRvIHRoZWlyIGRlZmF1bHQgc2V0dGluZ3MuCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIGluIG9yZGVyIHRvIHJlc2V0IG90aGVyIGNvbG9ycwotCSAqIGFuZCBmb250cyB0byBkZWZhdWx0IHNldHRpbmdzIGFzIHdlbGwuCi0JICovCi0Jdm9pZCByZXNldENvbG9yc0FuZEZvbnRzICgpIHsKLQkJQ29sb3Igb2xkQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCWZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJYmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCUZvbnQgb2xkRm9udCA9IGZvbnQ7Ci0JCWZvbnQgPSBudWxsOwotCQlzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSgpOwotCX0KLQkKLQlib29sZWFuIHJ0bFN1cHBvcnQoKSB7Ci0JCXJldHVybiBSVExfU1VQUE9SVF9FTkFCTEU7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzJyBwYXJlbnQuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kQ29sb3IgKCkgewotCQlpZiAoYmFja2dyb3VuZE1vZGVHcm91cCA9PSBudWxsKSByZXR1cm47Ci0JCWV4YW1wbGVHcm91cC5zZXRCYWNrZ3JvdW5kIChiYWNrZ3JvdW5kTW9kZUNvbG9yQnV0dG9uLmdldFNlbGVjdGlvbiAoKSA/IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpIDogbnVsbCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgaW1hZ2Ugb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzJyBwYXJlbnQuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kSW1hZ2UgKCkgewotCQlpZiAoYmFja2dyb3VuZE1vZGVHcm91cCA9PSBudWxsKSByZXR1cm47Ci0JCWV4YW1wbGVHcm91cC5zZXRCYWNrZ3JvdW5kSW1hZ2UgKGJhY2tncm91bmRNb2RlSW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpID8gaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpUGFyZW50QmFja2dyb3VuZF0gOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIG1vZGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzJyBwYXJlbnQuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kTW9kZSAoKSB7Ci0JCWlmIChiYWNrZ3JvdW5kTW9kZUdyb3VwID09IG51bGwpIHJldHVybjsKLQkJU3RyaW5nIG1vZGVTdHJpbmcgPSBiYWNrZ3JvdW5kTW9kZUNvbWJvLmdldFRleHQgKCk7Ci0JCWludCBtb2RlID0gU1dULklOSEVSSVRfTk9ORTsKLQkJaWYgKG1vZGVTdHJpbmcuZXF1YWxzKCJTV1QuSU5IRVJJVF9ERUZBVUxUIikpIG1vZGUgPSBTV1QuSU5IRVJJVF9ERUZBVUxUOwotCQlpZiAobW9kZVN0cmluZy5lcXVhbHMoIlNXVC5JTkhFUklUX0ZPUkNFIikpIG1vZGUgPSBTV1QuSU5IRVJJVF9GT1JDRTsKLQkJZXhhbXBsZUdyb3VwLnNldEJhY2tncm91bmRNb2RlIChtb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRCYWNrZ3JvdW5kICgpIHsKLQkJaWYgKGNvbG9yQW5kRm9udFRhYmxlID09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5ub3QgY2hhbmdlIGNvbG9yL2ZvbnQgb24gdGhpcyB0YWIKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY29udHJvbHNbaV0uc2V0QmFja2dyb3VuZCAoYmFja2dyb3VuZENvbG9yKTsKLQkJCX0KLQkJfQotCQkvLyBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBleGFtcGxlIHdpZGdldChzKS4KLQkJQ29sb3IgY29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb250cm9scy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSBjb250cm9scyBbMF0uZ2V0QmFja2dyb3VuZCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKEJBQ0tHUk9VTkRfQ09MT1IpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoY29sb3JJbWFnZSAoY29sb3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0RW5hYmxlZCAoKSB7Ci0JCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlQ29udHJvbHMgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJY29udHJvbHMgW2ldLnNldEVuYWJsZWQgKGVuYWJsZWRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRGb250ICgpIHsKLQkJaWYgKGNvbG9yQW5kRm9udFRhYmxlID09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5ub3QgY2hhbmdlIGNvbG9yL2ZvbnQgb24gdGhpcyB0YWIKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY29udHJvbHNbaV0uc2V0Rm9udChmb250KTsKLQkJCX0KLQkJfQotCQkvKiBTZXQgdGhlIGZvbnQgaXRlbSdzIGltYWdlIGFuZCBmb250IHRvIG1hdGNoIHRoZSBmb250IG9mIHRoZSBleGFtcGxlIHdpZGdldChzKS4gKi8KLQkJRm9udCBmdCA9IGZvbnQ7Ci0JCWlmIChjb250cm9scy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlpZiAoZnQgPT0gbnVsbCkgZnQgPSBjb250cm9scyBbMF0uZ2V0Rm9udCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKEZPTlQpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoZm9udEltYWdlIChmdCkpOwotCQlpdGVtLnNldEZvbnQoZnQpOwotCQljb2xvckFuZEZvbnRUYWJsZS5sYXlvdXQgKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEZvcmVncm91bmQgKCkgewotCQlpZiAoY29sb3JBbmRGb250VGFibGUgPT0gbnVsbCkgcmV0dXJuOyAvLyB1c2VyIGNhbm5vdCBjaGFuZ2UgY29sb3IvZm9udCBvbiB0aGlzIHRhYgotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCQljb250cm9sc1tpXS5zZXRGb3JlZ3JvdW5kIChmb3JlZ3JvdW5kQ29sb3IpOwotCQkJfQotCQl9Ci0JCS8qIFNldCB0aGUgZm9yZWdyb3VuZCBjb2xvciBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIGV4YW1wbGUgd2lkZ2V0KHMpLiAqLwotCQlDb2xvciBjb2xvciA9IGZvcmVncm91bmRDb2xvcjsKLQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IGNvbnRyb2xzIFswXS5nZXRGb3JlZ3JvdW5kICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oRk9SRUdST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNpemUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFNpemUgKCkgewotCQlpbnQgc2l6ZSA9IFNXVC5ERUZBVUxUOwotCQlpZiAocHJlZmVycmVkQnV0dG9uID09IG51bGwpIHJldHVybjsKLQkJaWYgKHByZWZlcnJlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc2l6ZSA9IFNXVC5ERUZBVUxUOwotCQlpZiAodG9vU21hbGxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHNpemUgPSBUT09fU01BTExfU0laRTsKLQkJaWYgKHNtYWxsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzaXplID0gU01BTExfU0laRTsKLQkJaWYgKGxhcmdlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzaXplID0gTEFSR0VfU0laRTsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShzaXplLCBzaXplKTsgCi0JCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmlsbEhCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZpbGxWQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IGZpbGxIQnV0dG9uLmdldFNlbGVjdGlvbigpID8gU1dULkZJTEwgOiBTV1QuTEVGVDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gZmlsbFZCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPyBTV1QuRklMTCA6IFNXVC5UT1A7Ci0JCQljb250cm9scyBbaV0uc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQl9Ci0JCXRhYkZvbGRlclBhZ2UubGF5b3V0IChjb250cm9scyk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4gIFN1YmNsYXNzZXMKLQkgKiBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHNldCAiRXhhbXBsZSIgd2lkZ2V0IHN0YXRlCi0JICogdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQlzZXRFeGFtcGxlV2lkZ2V0RW5hYmxlZCAoKTsKLQkJCXNldEV4YW1wbGVXaWRnZXRWaXNpYmlsaXR5ICgpOwotCQkJc2V0RXhhbXBsZUdyb3VwQmFja2dyb3VuZE1vZGUgKCk7Ci0JCQlzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kQ29sb3IgKCk7Ci0JCQlzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kSW1hZ2UgKCk7Ci0JCQlzZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZEltYWdlICgpOwotCQkJc2V0RXhhbXBsZVdpZGdldFBvcHVwTWVudSAoKTsKLQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQl9Ci0JCS8vVEVNUE9SQVJZIENPREUKLS8vCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzICgpOwotLy8JCWZvciAoaW50IGk9MDsgaTxjb250cm9scy5sZW5ndGg7IGkrKykgewotLy8JCQlsb2cgKCJDb250cm9sPSIgKyBjb250cm9scyBbaV0gKyAiLCBib3JkZXIgd2lkdGg9IiArIGNvbnRyb2xzIFtpXS5nZXRCb3JkZXJXaWR0aCAoKSk7Ci0vLwkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRWaXNpYmlsaXR5ICgpIHsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250cm9scyBbaV0uc2V0VmlzaWJsZSAodmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBpbWFnZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZEltYWdlICgpIHsKLQkJaWYgKGJhY2tncm91bmRJbWFnZUJ1dHRvbiAhPSBudWxsICYmIGJhY2tncm91bmRJbWFnZUJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250cm9scyBbaV0uc2V0QmFja2dyb3VuZEltYWdlIChiYWNrZ3JvdW5kSW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpID8gaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQmFja2dyb3VuZF0gOiBudWxsKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTcGxpdHMgdGhlIGdpdmVuIHN0cmluZyBhcm91bmQgbWF0Y2hlcyBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyLgotCSAqIAotCSAqIFRoaXMgc3Vic2V0IG9mIGphdmEubGFuZy5TdHJpbmcuc3BsaXQoU3RyaW5nIHJlZ2V4KQotCSAqIHVzZXMgb25seSBjb2RlIHRoYXQgY2FuIGJlIHJ1biBvbiBDTERDIHBsYXRmb3Jtcy4KLQkgKi8KLQlTdHJpbmcgW10gc3BsaXQgKFN0cmluZyBzdHJpbmcsIGNoYXIgY2gpIHsKLQkJU3RyaW5nIFtdIHJlc3VsdCA9IG5ldyBTdHJpbmdbMF07Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCXdoaWxlIChzdGFydCA8IGxlbmd0aCkgewotCQkJaW50IGVuZCA9IHN0cmluZy5pbmRleE9mKGNoLCBzdGFydCk7Ci0JCQlpZiAoZW5kID09IC0xKSBlbmQgPSBsZW5ndGg7Ci0JCQlTdHJpbmcgc3Vic3RyID0gc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJCVN0cmluZyBbXSBuZXdSZXN1bHQgPSBuZXcgU3RyaW5nW3Jlc3VsdC5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCBuZXdSZXN1bHQsIDAsIHJlc3VsdC5sZW5ndGgpOwotCQkJbmV3UmVzdWx0IFtyZXN1bHQubGVuZ3RoXSA9IHN1YnN0cjsKLQkJCXJlc3VsdCA9IG5ld1Jlc3VsdDsKLQkJCXN0YXJ0ID0gZW5kICsgMTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYkZvbGRlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiRm9sZGVyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZjBiNGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiRm9sZGVyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIFRhYkZvbGRlclRhYiBleHRlbmRzIFRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlUYWJGb2xkZXIgdGFiRm9sZGVyMTsKLQlHcm91cCB0YWJGb2xkZXJHcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHRvcEJ1dHRvbiwgYm90dG9tQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBUYWJJdGVtczEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYkl0ZW0xXzAiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFiSXRlbTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJJdGVtMV8yIil9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRhYkZvbGRlclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgVGFiRm9sZGVyICovCi0JCXRhYkZvbGRlckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldFRleHQgKCJUYWJGb2xkZXIiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmICh0b3BCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVE9QOwotCQlpZiAoYm90dG9tQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPVFRPTTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0KLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJdGFiRm9sZGVyMSA9IG5ldyBUYWJGb2xkZXIgKHRhYkZvbGRlckdyb3VwLCBzdHlsZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVGFiSXRlbXMxLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIxLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQoVGFiSXRlbXMxW2ldKTsKLQkJCWl0ZW0uc2V0VG9vbFRpcFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2x0aXAiLCBuZXcgU3RyaW5nIFtdIHtUYWJJdGVtczFbaV19KSk7Ci0JCQlUZXh0IGNvbnRlbnQgPSBuZXcgVGV4dCh0YWJGb2xkZXIxLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSk7Ci0JCQljb250ZW50LnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYkl0ZW1fY29udGVudCIpICsgIjogIiArIGkpOwotCQkJaXRlbS5zZXRDb250cm9sKGNvbnRlbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXRvcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvcEJ1dHRvbi5zZXRUZXh0ICgiU1dULlRPUCIpOwotCQl0b3BCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3R0b21CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlib3R0b21CdXR0b24uc2V0VGV4dCAoIlNXVC5CT1RUT00iKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQlyZXR1cm4gdGFiRm9sZGVyMS5nZXRJdGVtcygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHt0YWJGb2xkZXIxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJTZWxlY3Rpb24iLCAiU2VsZWN0aW9uSW5kZXgiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQlTdHJpbmcgc2V0TWV0aG9kTmFtZShTdHJpbmcgbWV0aG9kUm9vdCkgewotCQkvKiBPdmVycmlkZSB0byBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGludCBnZXRTZWxlY3Rpb25JbmRleCgpL3NldFNlbGVjdGlvbihpbnQpICovCi0JCXJldHVybiAobWV0aG9kUm9vdC5lcXVhbHMoIlNlbGVjdGlvbkluZGV4IikpID8gInNldFNlbGVjdGlvbiIgOiAic2V0IiArIG1ldGhvZFJvb3Q7Ci0JfQotCi0JT2JqZWN0W10gcGFyYW1ldGVyRm9yVHlwZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyB2YWx1ZSwgV2lkZ2V0IHdpZGdldCkgewotCQlpZiAodmFsdWUuZXF1YWxzKCIiKSkgcmV0dXJuIG5ldyBPYmplY3RbXSB7bmV3IFRhYkl0ZW1bMF19OwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtIikpIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IGZpbmRJdGVtKHZhbHVlLCAoKFRhYkZvbGRlcikgd2lkZ2V0KS5nZXRJdGVtcygpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBuZXcgT2JqZWN0W10ge2l0ZW19OwotCQl9Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoIltMb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsiKSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gc3BsaXQodmFsdWUsICcsJyk7Ci0JCQlUYWJJdGVtW10gaXRlbXMgPSBuZXcgVGFiSXRlbVt2YWx1ZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaXRlbXNbaV0gPSBmaW5kSXRlbSh2YWx1ZXNbaV0sICgoVGFiRm9sZGVyKSB3aWRnZXQpLmdldEl0ZW1zKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7aXRlbXN9OwotCQl9Ci0JCXJldHVybiBzdXBlci5wYXJhbWV0ZXJGb3JUeXBlKHR5cGVOYW1lLCB2YWx1ZSwgd2lkZ2V0KTsKLQl9Ci0KLQlUYWJJdGVtIGZpbmRJdGVtKFN0cmluZyB2YWx1ZSwgVGFiSXRlbVtdIGl0ZW1zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJaWYgKGl0ZW0uZ2V0VGV4dCgpLmVxdWFscyh2YWx1ZSkpIHJldHVybiBpdGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNob3J0IHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFNob3J0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJURiI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVGFiRm9sZGVyIjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXRvcEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJGb2xkZXIxLmdldFN0eWxlICgpICYgU1dULlRPUCkgIT0gMCk7Ci0JCWJvdHRvbUJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJGb2xkZXIxLmdldFN0eWxlICgpICYgU1dULkJPVFRPTSkgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJGb2xkZXIxLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFibGVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYmxlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiOWNkNjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFibGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFRhYmxlVGFiIGV4dGVuZHMgU2Nyb2xsYWJsZVRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlUYWJsZSB0YWJsZTE7Ci0JR3JvdXAgdGFibGVHcm91cDsKLQotCS8qIFNpemUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlNpemUiIGdyb3VwICovCi0JQnV0dG9uIHBhY2tDb2x1bW5zQnV0dG9uOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gbm9TY3JvbGxCdXR0b24sIGNoZWNrQnV0dG9uLCBmdWxsU2VsZWN0aW9uQnV0dG9uLCBoaWRlU2VsZWN0aW9uQnV0dG9uOwotCi0JLyogT3RoZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBtdWx0aXBsZUNvbHVtbnMsIG1vdmVhYmxlQ29sdW1ucywgcmVzaXphYmxlQ29sdW1ucywgaGVhZGVyVmlzaWJsZUJ1dHRvbiwgc29ydEluZGljYXRvckJ1dHRvbiwgaGVhZGVySW1hZ2VzQnV0dG9uLCBsaW5lc1Zpc2libGVCdXR0b24sIHN1YkltYWdlc0J1dHRvbjsKLQkKLQkvKiBDb250cm9scyBhbmQgcmVzb3VyY2VzIGFkZGVkIHRvIHRoZSAiQ29sb3JzIGFuZCBGb250cyIgZ3JvdXAgKi8KLQlzdGF0aWMgZmluYWwgaW50IElURU1fRk9SRUdST1VORF9DT0xPUiA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBJVEVNX0JBQ0tHUk9VTkRfQ09MT1IgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgSVRFTV9GT05UID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IENFTExfRk9SRUdST1VORF9DT0xPUiA9IDY7Ci0Jc3RhdGljIGZpbmFsIGludCBDRUxMX0JBQ0tHUk9VTkRfQ09MT1IgPSA3OwotCXN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9GT05UID0gODsKLQlDb2xvciBpdGVtRm9yZWdyb3VuZENvbG9yLCBpdGVtQmFja2dyb3VuZENvbG9yLCBjZWxsRm9yZWdyb3VuZENvbG9yLCBjZWxsQmFja2dyb3VuZENvbG9yOwotCUZvbnQgaXRlbUZvbnQsIGNlbGxGb250OwotCQotCXN0YXRpYyBTdHJpbmcgW10gY29sdW1uVGl0bGVzCT0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzAiKSwKLQkJCQkJCQkJCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzEiKSwKLQkJCQkJCQkJCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzIiKSwKLQkJCQkJCQkJCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzMiKX07Ci0JCQkJCQkJCQkgICAKLQlzdGF0aWMgU3RyaW5nW11bXSB0YWJsZURhdGEgPSB7Ci0JCXsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMCIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUwXzEiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8yIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMyIpIH0sCi0JCXsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMCIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzEiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8yIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMyIpIH0sCi0JCXsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTJfMCIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzEiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8yIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTJfMyIpIH0gfTsKLQotCVBvaW50IG1lbnVNb3VzZUNvb3JkczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JVGFibGVUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29sb3JzIGFuZCBGb250cyIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDb2xvckFuZEZvbnRHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbG9yQW5kRm9udEdyb3VwKCk7Ci0JCQotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbV9Gb3JlZ3JvdW5kX0NvbG9yIikpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtX0JhY2tncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW1fRm9udCIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2VsbF9Gb3JlZ3JvdW5kX0NvbG9yIikpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDZWxsX0JhY2tncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNlbGxfRm9udCIpKTsKLQotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChpdGVtQmFja2dyb3VuZENvbG9yICE9IG51bGwpIGl0ZW1CYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtRm9yZWdyb3VuZENvbG9yICE9IG51bGwpIGl0ZW1Gb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChpdGVtRm9udCAhPSBudWxsKSBpdGVtRm9udC5kaXNwb3NlKCk7Ci0JCQkJaWYgKGNlbGxCYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgY2VsbEJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGNlbGxGb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgY2VsbEZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGNlbGxGb250ICE9IG51bGwpIGNlbGxGb250LmRpc3Bvc2UoKTsKLQkJCQlpdGVtQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJCQlpdGVtRm9yZWdyb3VuZENvbG9yID0gbnVsbDsJCQkKLQkJCQlpdGVtRm9udCA9IG51bGw7Ci0JCQkJY2VsbEJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCQkJY2VsbEZvcmVncm91bmRDb2xvciA9IG51bGw7CQkJCi0JCQkJY2VsbEZvbnQgPSBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQl2b2lkIGNoYW5nZUZvbnRPckNvbG9yKGludCBpbmRleCkgewotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCWNhc2UgSVRFTV9GT1JFR1JPVU5EX0NPTE9SOiB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJCWNvbG9yRGlhbG9nLnNldFJHQihvbGRDb2xvci5nZXRSR0IoKSk7Ci0JCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQlvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCQlpdGVtRm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yIChkaXNwbGF5LCByZ2IpOwotCQkJc2V0SXRlbUZvcmVncm91bmQgKCk7Ci0JCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJfQotCQlicmVhazsKLQkJY2FzZSBJVEVNX0JBQ0tHUk9VTkRfQ09MT1I6IHsKLQkJCUNvbG9yIG9sZENvbG9yID0gaXRlbUJhY2tncm91bmRDb2xvcjsKLQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSBvbGRDb2xvciA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRCYWNrZ3JvdW5kICgpOwotCQkJY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCW9sZENvbG9yID0gaXRlbUJhY2tncm91bmRDb2xvcjsKLQkJCWl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGRpc3BsYXksIHJnYik7Ci0JCQlzZXRJdGVtQmFja2dyb3VuZCAoKTsKLQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQljYXNlIElURU1fRk9OVDogewotCQkJRm9udCBvbGRGb250ID0gaXRlbUZvbnQ7Ci0JCQlpZiAob2xkRm9udCA9PSBudWxsKSBvbGRGb250ID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEZvbnQgKCk7Ci0JCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KG9sZEZvbnQuZ2V0Rm9udERhdGEoKSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbiAoKTsKLQkJCWlmIChmb250RGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQlvbGRGb250ID0gaXRlbUZvbnQ7Ci0JCQlpdGVtRm9udCA9IG5ldyBGb250IChkaXNwbGF5LCBmb250RGF0YSk7Ci0JCQlzZXRJdGVtRm9udCAoKTsKLQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQljYXNlIENFTExfRk9SRUdST1VORF9DT0xPUjogewotCQkJQ29sb3Igb2xkQ29sb3IgPSBjZWxsRm9yZWdyb3VuZENvbG9yOwotCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEZvcmVncm91bmQgKDEpOwotCQkJY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCW9sZENvbG9yID0gY2VsbEZvcmVncm91bmRDb2xvcjsKLQkJCWNlbGxGb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGRpc3BsYXksIHJnYik7Ci0JCQlzZXRDZWxsRm9yZWdyb3VuZCAoKTsKLQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQljYXNlIENFTExfQkFDS0dST1VORF9DT0xPUjogewotCQkJQ29sb3Igb2xkQ29sb3IgPSBjZWxsQmFja2dyb3VuZENvbG9yOwotCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEJhY2tncm91bmQgKDEpOwotCQkJY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCW9sZENvbG9yID0gY2VsbEJhY2tncm91bmRDb2xvcjsKLQkJCWNlbGxCYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGRpc3BsYXksIHJnYik7Ci0JCQlzZXRDZWxsQmFja2dyb3VuZCAoKTsKLQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQljYXNlIENFTExfRk9OVDogewotCQkJRm9udCBvbGRGb250ID0gY2VsbEZvbnQ7Ci0JCQlpZiAob2xkRm9udCA9PSBudWxsKSBvbGRGb250ID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEZvbnQgKDEpOwotCQkJZm9udERpYWxvZy5zZXRGb250TGlzdChvbGRGb250LmdldEZvbnREYXRhKCkpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBmb250RGlhbG9nLm9wZW4gKCk7Ci0JCQlpZiAoZm9udERhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkRm9udCA9IGNlbGxGb250OwotCQkJY2VsbEZvbnQgPSBuZXcgRm9udCAoZGlzcGxheSwgZm9udERhdGEpOwotCQkJc2V0Q2VsbEZvbnQgKCk7Ci0JCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSAoKTsKLQkJfQotCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXN1cGVyLmNoYW5nZUZvbnRPckNvbG9yKGluZGV4KTsKLQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJbGluZXNWaXNpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbGluZXNWaXNpYmxlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lc19WaXNpYmxlIikpOwotCQltdWx0aXBsZUNvbHVtbnMgPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQltdWx0aXBsZUNvbHVtbnMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk11bHRpcGxlX0NvbHVtbnMiKSk7Ci0JCW11bHRpcGxlQ29sdW1ucy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWhlYWRlclZpc2libGVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQloZWFkZXJWaXNpYmxlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJIZWFkZXJfVmlzaWJsZSIpKTsKLQkJc29ydEluZGljYXRvckJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNvcnRJbmRpY2F0b3JCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNvcnRfSW5kaWNhdG9yIikpOwotCQltb3ZlYWJsZUNvbHVtbnMgPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQltb3ZlYWJsZUNvbHVtbnMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1vdmVhYmxlX0NvbHVtbnMiKSk7Ci0JCXJlc2l6YWJsZUNvbHVtbnMgPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZXNpemFibGVDb2x1bW5zLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXNpemFibGVfQ29sdW1ucyIpKTsKLQkJaGVhZGVySW1hZ2VzQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJaGVhZGVySW1hZ2VzQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJIZWFkZXJfSW1hZ2VzIikpOwotCQlzdWJJbWFnZXNCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzdWJJbWFnZXNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN1Yl9JbWFnZXMiKSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJbGluZXNWaXNpYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRMaW5lc1Zpc2libGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQltdWx0aXBsZUNvbHVtbnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQloZWFkZXJWaXNpYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpOwotCQkJfQotCQl9KTsKLQkJc29ydEluZGljYXRvckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0U29ydEluZGljYXRvciAoKTsKLQkJCX0KLQkJfSk7Ci0JCW1vdmVhYmxlQ29sdW1ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q29sdW1uc01vdmVhYmxlICgpOwotCQkJfQotCQl9KTsKLQkJcmVzaXphYmxlQ29sdW1ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q29sdW1uc1Jlc2l6YWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWhlYWRlckltYWdlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfSk7Ci0JCXN1YkltYWdlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGFibGUgKi8KLQkJdGFibGVHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRhYmxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRhYmxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdGFibGVHcm91cC5zZXRUZXh0ICgiVGFibGUiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7CQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChzaW5nbGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0lOR0xFOwotCQlpZiAobXVsdGlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTVVMVEk7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmIChub1Njcm9sbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5OT19TQ1JPTEw7Ci0JCWlmIChjaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5DSEVDSzsKLQkJaWYgKGZ1bGxTZWxlY3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRlVMTF9TRUxFQ1RJT047Ci0JCWlmIChoaWRlU2VsZWN0aW9uQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhJREVfU0VMRUNUSU9OOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkKLQkJLyogQ3JlYXRlIHRoZSB0YWJsZSB3aWRnZXQgKi8KLQkJdGFibGUxID0gbmV3IFRhYmxlICh0YWJsZUdyb3VwLCBzdHlsZSk7Ci0JCi0JCS8qIEZpbGwgdGhlIHRhYmxlIHdpdGggZGF0YSAqLwotCQlib29sZWFuIG11bHRpQ29sdW1uID0gbXVsdGlwbGVDb2x1bW5zLmdldFNlbGVjdGlvbigpOwotCQlpZiAobXVsdGlDb2x1bW4pIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uVGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUxLCBTV1QuTk9ORSk7Ci0JCQkJdGFibGVDb2x1bW4uc2V0VGV4dChjb2x1bW5UaXRsZXNbaV0pOwotCQkJCXRhYmxlQ29sdW1uLnNldFRvb2xUaXBUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUb29sdGlwIiwgbmV3IFN0cmluZyBbXSB7Y29sdW1uVGl0bGVzW2ldfSkpOwotCQkJCWlmIChoZWFkZXJJbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHRhYmxlQ29sdW1uLnNldEltYWdlKGluc3RhbmNlLmltYWdlcyBbaSAlIDNdKTsKLQkJCX0KLQkJCXRhYmxlMS5zZXRTb3J0Q29sdW1uKHRhYmxlMS5nZXRDb2x1bW4oMCkpOwotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTwxNjsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlMSwgU1dULk5PTkUpOwotCQkJaWYgKG11bHRpQ29sdW1uICYmIHN1YkltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uVGl0bGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWl0ZW0uc2V0SW1hZ2UoaiwgaW5zdGFuY2UuaW1hZ2VzIFtpICUgM10pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXMgW2kgJSAzXSk7Ci0JCQl9Ci0JCQlzZXRJdGVtVGV4dCAoaXRlbSwgaSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkluZGV4IikgKyBpKTsKLQkJfQotCQlwYWNrQ29sdW1ucygpOwotCX0KLQkKLQl2b2lkIHNldEl0ZW1UZXh0KFRhYmxlSXRlbSBpdGVtLCBpbnQgaSwgU3RyaW5nIG5vZGUpIHsKLQkJaW50IGluZGV4ID0gaSAlIDM7Ci0JCWlmIChtdWx0aXBsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXRhYmxlRGF0YSBbaW5kZXhdWzBdID0gbm9kZTsKLQkJCWl0ZW0uc2V0VGV4dCAodGFibGVEYXRhIFtpbmRleF0pOwotCQl9IGVsc2UgewotCQkJaXRlbS5zZXRUZXh0IChub2RlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU2l6ZSIgZ3JvdXAuICBUaGUgIlNpemUiIGdyb3VwIGNvbnRhaW5zCi0JICogY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHNpemUgb2YKLQkgKiB0aGUgZXhhbXBsZSB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlU2l6ZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU2l6ZUdyb3VwKCk7Ci0JCi0JCXBhY2tDb2x1bW5zQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2l6ZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCXBhY2tDb2x1bW5zQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYWNrX0NvbHVtbnMiKSk7Ci0JCXBhY2tDb2x1bW5zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXBhY2tDb2x1bW5zICgpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCW5vU2Nyb2xsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9TY3JvbGxCdXR0b24uc2V0VGV4dCAoIlNXVC5OT19TQ1JPTEwiKTsKLQkJY2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljaGVja0J1dHRvbi5zZXRUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFRleHQgKCJTV1QuRlVMTF9TRUxFQ1RJT04iKTsKLQkJaGlkZVNlbGVjdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWhpZGVTZWxlY3Rpb25CdXR0b24uc2V0VGV4dCAoIlNXVC5ISURFX1NFTEVDVElPTiIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJSXRlbSBbXSBjb2x1bW5zID0gdGFibGUxLmdldENvbHVtbnMoKTsKLQkJSXRlbSBbXSBpdGVtcyA9IHRhYmxlMS5nZXRJdGVtcygpOwotCQlJdGVtIFtdIGFsbEl0ZW1zID0gbmV3IEl0ZW0gW2NvbHVtbnMubGVuZ3RoICsgaXRlbXMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShjb2x1bW5zLCAwLCBhbGxJdGVtcywgMCwgY29sdW1ucy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBhbGxJdGVtcywgY29sdW1ucy5sZW5ndGgsIGl0ZW1zLmxlbmd0aCk7Ci0JCXJldHVybiBhbGxJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7dGFibGUxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJDb2x1bW5PcmRlciIsICJJdGVtQ291bnQiLCAiU2VsZWN0aW9uIiwgIlNlbGVjdGlvbkluZGV4IiwgIlRvb2xUaXBUZXh0IiwgIlRvcEluZGV4In07Ci0JfQotCi0JU3RyaW5nIHNldE1ldGhvZE5hbWUoU3RyaW5nIG1ldGhvZFJvb3QpIHsKLQkJLyogT3ZlcnJpZGUgdG8gaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKS9zZXRTZWxlY3Rpb24oaW50KSAqLwotCQlyZXR1cm4gKG1ldGhvZFJvb3QuZXF1YWxzKCJTZWxlY3Rpb25JbmRleCIpKSA/ICJzZXRTZWxlY3Rpb24iIDogInNldCIgKyBtZXRob2RSb290OwotCX0KLQotCXZvaWQgcGFja0NvbHVtbnMgKCkgewotCQlpbnQgY29sdW1uQ291bnQgPSB0YWJsZTEuZ2V0Q29sdW1uQ291bnQoKTsgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZTEuZ2V0Q29sdW1uKGkpOwotCQkJdGFibGVDb2x1bW4ucGFjaygpOwotCQl9Ci0JfQotCi0JT2JqZWN0W10gcGFyYW1ldGVyRm9yVHlwZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyB2YWx1ZSwgV2lkZ2V0IHdpZGdldCkgewotCQlpZiAodmFsdWUuZXF1YWxzKCIiKSkgcmV0dXJuIG5ldyBPYmplY3RbXSB7bmV3IFRhYmxlSXRlbVswXX07IC8vIGJ1ZyBpbiBUYWJsZT8KLQkJaWYgKHR5cGVOYW1lLmVxdWFscygib3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtIikpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gZmluZEl0ZW0odmFsdWUsICgoVGFibGUpIHdpZGdldCkuZ2V0SXRlbXMoKSk7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSByZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtfTsKLQkJfQotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJbTG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsiKSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gc3BsaXQodmFsdWUsICcsJyk7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bdmFsdWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCWl0ZW1zW2ldID0gZmluZEl0ZW0odmFsdWVzW2ldLCAoKFRhYmxlKSB3aWRnZXQpLmdldEl0ZW1zKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7aXRlbXN9OwotCQl9Ci0JCXJldHVybiBzdXBlci5wYXJhbWV0ZXJGb3JUeXBlKHR5cGVOYW1lLCB2YWx1ZSwgd2lkZ2V0KTsKLQl9Ci0KLQlUYWJsZUl0ZW0gZmluZEl0ZW0oU3RyaW5nIHZhbHVlLCBUYWJsZUl0ZW1bXSBpdGVtcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJaWYgKGl0ZW0uZ2V0VGV4dCgpLmVxdWFscyh2YWx1ZSkpIHJldHVybiBpdGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlRhYmxlIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciwgYmFja2dyb3VuZCBjb2xvciwgYW5kIGZvbnQKLQkgKiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMgdG8gdGhlaXIgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKiBBbHNvIHNldHMgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvciBvZiBUYWJsZUl0ZW0gWzBdCi0JICogdG8gZGVmYXVsdCBzZXR0aW5ncy4KLQkgKi8KLQl2b2lkIHJlc2V0Q29sb3JzQW5kRm9udHMgKCkgewotCQlzdXBlci5yZXNldENvbG9yc0FuZEZvbnRzICgpOwotCQlDb2xvciBvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQlpdGVtQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0SXRlbUJhY2tncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCUZvbnQgb2xkRm9udCA9IGZvbnQ7Ci0JCWl0ZW1Gb250ID0gbnVsbDsKLQkJc2V0SXRlbUZvbnQgKCk7Ci0JCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGNlbGxGb3JlZ3JvdW5kQ29sb3I7Ci0JCWNlbGxGb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRDZWxsRm9yZWdyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkQ29sb3IgPSBjZWxsQmFja2dyb3VuZENvbG9yOwotCQljZWxsQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0Q2VsbEJhY2tncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCW9sZEZvbnQgPSBmb250OwotCQljZWxsRm9udCA9IG51bGw7Ci0JCXNldENlbGxGb250ICgpOwotCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgUm93IDAgVGFibGVJdGVtIGluIGNvbHVtbiAxLgotCSAqLwotCXZvaWQgc2V0Q2VsbEJhY2tncm91bmQgKCkgewotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXRhYmxlMS5nZXRJdGVtICgwKS5zZXRCYWNrZ3JvdW5kICgxLCBjZWxsQmFja2dyb3VuZENvbG9yKTsKLQkJfQotCQkvKiBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjZWxsLiAqLwotCQlDb2xvciBjb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRCYWNrZ3JvdW5kICgxKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKENFTExfQkFDS0dST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIFJvdyAwIFRhYmxlSXRlbSBpbiBjb2x1bW4gMS4KLQkgKi8KLQl2b2lkIHNldENlbGxGb3JlZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0YWJsZTEuZ2V0SXRlbSAoMCkuc2V0Rm9yZWdyb3VuZCAoMSwgY2VsbEZvcmVncm91bmRDb2xvcik7Ci0JCX0KLQkJLyogU2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yIGl0ZW0ncyBpbWFnZSB0byBtYXRjaCB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgY2VsbC4gKi8KLQkJQ29sb3IgY29sb3IgPSBjZWxsRm9yZWdyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9yZWdyb3VuZCAoMSk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbShDRUxMX0ZPUkVHUk9VTkRfQ09MT1IpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoY29sb3JJbWFnZShjb2xvcikpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG9mIHRoZSBSb3cgMCBUYWJsZUl0ZW0gaW4gY29sdW1uIDEuCi0JICovCi0Jdm9pZCBzZXRDZWxsRm9udCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGFibGUxLmdldEl0ZW0gKDApLnNldEZvbnQgKDEsIGNlbGxGb250KTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvbnQgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb250IG9mIHRoZSBpdGVtLiAqLwotCQlGb250IGZ0ID0gY2VsbEZvbnQ7Ci0JCWlmIChmdCA9PSBudWxsKSBmdCA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRGb250ICgxKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKENFTExfRk9OVCk7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChmb250SW1hZ2UoZnQpKTsKLQkJaXRlbS5zZXRGb250KGZ0KTsKLQkJY29sb3JBbmRGb250VGFibGUubGF5b3V0ICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgVGFibGVJdGVtIFswXS4KLQkgKi8KLQl2b2lkIHNldEl0ZW1CYWNrZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0YWJsZTEuZ2V0SXRlbSAoMCkuc2V0QmFja2dyb3VuZCAoaXRlbUJhY2tncm91bmRDb2xvcik7Ci0JCX0KLQkJLyogU2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGl0ZW0ncyBpbWFnZSB0byBtYXRjaCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgaXRlbS4gKi8KLQkJQ29sb3IgY29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0QmFja2dyb3VuZCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKElURU1fQkFDS0dST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgVGFibGVJdGVtIFswXS4KLQkgKi8KLQl2b2lkIHNldEl0ZW1Gb3JlZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0YWJsZTEuZ2V0SXRlbSAoMCkuc2V0Rm9yZWdyb3VuZCAoaXRlbUZvcmVncm91bmRDb2xvcik7Ci0JCX0KLQkJLyogU2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yIGl0ZW0ncyBpbWFnZSB0byBtYXRjaCB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgaXRlbS4gKi8KLQkJQ29sb3IgY29sb3IgPSBpdGVtRm9yZWdyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKElURU1fRk9SRUdST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgVGFibGVJdGVtIDAuCi0JICovCi0Jdm9pZCBzZXRJdGVtRm9udCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGFibGUxLmdldEl0ZW0gKDApLnNldEZvbnQgKGl0ZW1Gb250KTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvbnQgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb250IG9mIHRoZSBpdGVtLiAqLwotCQlGb250IGZ0ID0gaXRlbUZvbnQ7Ci0JCWlmIChmdCA9PSBudWxsKSBmdCA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRGb250ICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oSVRFTV9GT05UKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGZvbnRJbWFnZShmdCkpOwotCQlpdGVtLnNldEZvbnQoZnQpOwotCQljb2xvckFuZEZvbnRUYWJsZS5sYXlvdXQgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW92ZWFibGUgY29sdW1ucyBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRDb2x1bW5zTW92ZWFibGUgKCkgewotCQlib29sZWFuIHNlbGVjdGlvbiA9IG1vdmVhYmxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKTsKLQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUxLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zW2ldLnNldE1vdmVhYmxlKHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZXNpemFibGUgY29sdW1ucyBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRDb2x1bW5zUmVzaXphYmxlICgpIHsKLQkJYm9vbGVhbiBzZWxlY3Rpb24gPSByZXNpemFibGVDb2x1bW5zLmdldFNlbGVjdGlvbigpOwotCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZTEuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnNbaV0uc2V0UmVzaXphYmxlKHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzZXRJdGVtQmFja2dyb3VuZCAoKTsKLQkJc2V0SXRlbUZvcmVncm91bmQgKCk7Ci0JCXNldEl0ZW1Gb250ICgpOwotCQlzZXRDZWxsQmFja2dyb3VuZCAoKTsKLQkJc2V0Q2VsbEZvcmVncm91bmQgKCk7Ci0JCXNldENlbGxGb250ICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXNldENvbHVtbnNNb3ZlYWJsZSAoKTsKLQkJCXNldENvbHVtbnNSZXNpemFibGUgKCk7Ci0JCQlzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpOwotCQkJc2V0V2lkZ2V0U29ydEluZGljYXRvciAoKTsKLQkJCXNldFdpZGdldExpbmVzVmlzaWJsZSAoKTsKLQkJfQotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCW5vU2Nyb2xsQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRhYmxlMS5nZXRTdHlsZSAoKSAmIFNXVC5OT19TQ1JPTEwpICE9IDApOwotCQljaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJsZTEuZ2V0U3R5bGUgKCkgJiBTV1QuQ0hFQ0spICE9IDApOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRhYmxlMS5nZXRTdHlsZSAoKSAmIFNXVC5GVUxMX1NFTEVDVElPTikgIT0gMCk7Ci0JCWhpZGVTZWxlY3Rpb25CdXR0b24uc2V0U2VsZWN0aW9uICgodGFibGUxLmdldFN0eWxlICgpICYgU1dULkhJREVfU0VMRUNUSU9OKSAhPSAwKTsKLQkJdHJ5IHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IHRhYmxlMS5nZXRDb2x1bW4oMCk7Ci0JCQltb3ZlYWJsZUNvbHVtbnMuc2V0U2VsZWN0aW9uIChjb2x1bW4uZ2V0TW92ZWFibGUoKSk7Ci0JCQlyZXNpemFibGVDb2x1bW5zLnNldFNlbGVjdGlvbiAoY29sdW1uLmdldFJlc2l6YWJsZSgpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCQloZWFkZXJWaXNpYmxlQnV0dG9uLnNldFNlbGVjdGlvbiAodGFibGUxLmdldEhlYWRlclZpc2libGUoKSk7Ci0JCWxpbmVzVmlzaWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRhYmxlMS5nZXRMaW5lc1Zpc2libGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGhlYWRlciB2aXNpYmxlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldEhlYWRlclZpc2libGUgKCkgewotCQl0YWJsZTEuc2V0SGVhZGVyVmlzaWJsZSAoaGVhZGVyVmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzb3J0IGluZGljYXRvciBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRTb3J0SW5kaWNhdG9yICgpIHsKLQkJVGFibGVDb2x1bW4gW10gY29sdW1ucyA9IHRhYmxlMS5nZXRDb2x1bW5zKCk7Ci0JCWlmIChzb3J0SW5kaWNhdG9yQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJLyogUmVzZXQgdG8ga25vd24gc3RhdGU6ICdkb3duJyBvbiBjb2x1bW4gMC4gKi8KLQkJCXRhYmxlMS5zZXRTb3J0RGlyZWN0aW9uIChTV1QuRE9XTik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zW2ldOwotCQkJCWlmIChpID09IDApIHRhYmxlMS5zZXRTb3J0Q29sdW1uKGNvbHVtbik7Ci0JCQkJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJaW50IHNvcnREaXJlY3Rpb24gPSBTV1QuRE9XTjsKLQkJCQkJCWlmIChlLndpZGdldCA9PSB0YWJsZTEuZ2V0U29ydENvbHVtbigpKSB7Ci0JCQkJCQkJLyogSWYgdGhlIHNvcnQgY29sdW1uIGhhc24ndCBjaGFuZ2VkLCBjeWNsZSBkb3duIC0+IHVwIC0+IG5vbmUuICovCi0JCQkJCQkJc3dpdGNoICh0YWJsZTEuZ2V0U29ydERpcmVjdGlvbiAoKSkgewotCQkJCQkJCWNhc2UgU1dULkRPV046IHNvcnREaXJlY3Rpb24gPSBTV1QuVVA7IGJyZWFrOwotCQkJCQkJCWNhc2UgU1dULlVQOiBzb3J0RGlyZWN0aW9uID0gU1dULk5PTkU7IGJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdGFibGUxLnNldFNvcnRDb2x1bW4oKFRhYmxlQ29sdW1uKWUud2lkZ2V0KTsKLQkJCQkJCX0KLQkJCQkJCXRhYmxlMS5zZXRTb3J0RGlyZWN0aW9uIChzb3J0RGlyZWN0aW9uKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJY29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCQljb2x1bW4uc2V0RGF0YSgiU29ydExpc3RlbmVyIiwgbGlzdGVuZXIpOwkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0YWJsZTEuc2V0U29ydERpcmVjdGlvbiAoU1dULk5PTkUpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5zLmxlbmd0aDsgaisrKSB7Ci0JCQkJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSAoU2VsZWN0aW9uTGlzdGVuZXIpY29sdW1uc1tqXS5nZXREYXRhKCJTb3J0TGlzdGVuZXIiKTsJLy8kTk9OLU5MUy0xJAotCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKSBjb2x1bW5zW2pdLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBsaW5lcyB2aXNpYmxlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldExpbmVzVmlzaWJsZSAoKSB7Ci0JCXRhYmxlMS5zZXRMaW5lc1Zpc2libGUgKGxpbmVzVmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWFsUG9wdXBNZW51SXRlbXMoTWVudSBtZW51LCBFdmVudCBldmVudCkgewotICAgIAlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLSAgICAJaXRlbS5zZXRUZXh0KCJnZXRJdGVtKFBvaW50KSBvbiBtb3VzZSBjb29yZGluYXRlcyIpOwotICAgIAltZW51TW91c2VDb29yZHMgPSB0YWJsZTEudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0gICAgCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgCQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoImdldEl0ZW0oUG9pbnQoIiArIG1lbnVNb3VzZUNvb3JkcyArICIpKSByZXR1cm5lZDogIiArIHRhYmxlMS5nZXRJdGVtKG1lbnVNb3VzZUNvb3JkcykpOwotICAgIAkJCWV2ZW50Q29uc29sZS5hcHBlbmQgKCJcbiIpOwotICAgIAkJfTsKLSAgICAJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGV4dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGV4dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjE3Zjc5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RleHRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIFRleHRUYWIgZXh0ZW5kcyBTY3JvbGxhYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVRleHQgdGV4dDsKLQlHcm91cCB0ZXh0R3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHdyYXBCdXR0b24sIHJlYWRPbmx5QnV0dG9uLCBwYXNzd29yZEJ1dHRvbiwgc2VhcmNoQnV0dG9uLCBpY29uQ2FuY2VsQnV0dG9uLCBpY29uU2VhcmNoQnV0dG9uOwotCUJ1dHRvbiBsZWZ0QnV0dG9uLCBjZW50ZXJCdXR0b24sIHJpZ2h0QnV0dG9uOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlUZXh0VGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgd2lkZ2V0ICovCi0JCXRleHRHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRleHRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdGV4dEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRleHRHcm91cC5zZXRUZXh0ICgiVGV4dCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKHBhc3N3b3JkQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlBBU1NXT1JEOwotCQlpZiAoc2VhcmNoQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNFQVJDSDsKLQkJaWYgKGljb25DYW5jZWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9DQU5DRUw7Ci0JCWlmIChpY29uU2VhcmNoQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklDT05fU0VBUkNIOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTEVGVDsKLQkJaWYgKGNlbnRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5DRU5URVI7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5SSUdIVDsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJdGV4dCA9IG5ldyBUZXh0ICh0ZXh0R3JvdXAsIHN0eWxlKTsKLQkJdGV4dC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRXhhbXBsZV9zdHJpbmciKSArIFRleHQuREVMSU1JVEVSICsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZV9Ud29fVGhyZWUiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQl3cmFwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJd3JhcEJ1dHRvbi5zZXRUZXh0ICgiU1dULldSQVAiKTsKLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCQlwYXNzd29yZEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXBhc3N3b3JkQnV0dG9uLnNldFRleHQgKCJTV1QuUEFTU1dPUkQiKTsKLQkJc2VhcmNoQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc2VhcmNoQnV0dG9uLnNldFRleHQgKCJTV1QuU0VBUkNIIik7Ci0JCWljb25DYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpY29uQ2FuY2VsQnV0dG9uLnNldFRleHQgKCJTV1QuSUNPTl9DQU5DRUwiKTsKLQkJaWNvblNlYXJjaEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWljb25TZWFyY2hCdXR0b24uc2V0VGV4dCAoIlNXVC5JQ09OX1NFQVJDSCIpOwotCi0JCUNvbXBvc2l0ZSBhbGlnbm1lbnRHcm91cCA9IG5ldyBDb21wb3NpdGUgKHN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWFsaWdubWVudEdyb3VwLnNldExheW91dCAobGF5b3V0KTsKLQkJYWxpZ25tZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbGVmdEJ1dHRvbiA9IG5ldyBCdXR0b24gKGFsaWdubWVudEdyb3VwLCBTV1QuUkFESU8pOwotCQlsZWZ0QnV0dG9uLnNldFRleHQgKCJTV1QuTEVGVCIpOwotCQljZW50ZXJCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJY2VudGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQ0VOVEVSIik7Ci0JCXJpZ2h0QnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCXJpZ2h0QnV0dG9uLnNldFRleHQgKCJTV1QuUklHSFQiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3RleHR9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IkRvdWJsZUNsaWNrRW5hYmxlZCIsICJFY2hvQ2hhciIsICJFZGl0YWJsZSIsICJNZXNzYWdlIiwgIk9yaWVudGF0aW9uIiwgIlNlbGVjdGlvbiIsICJUYWJzIiwgIlRleHQiLCAiVGV4dExpbWl0IiwgIlRvb2xUaXBUZXh0IiwgIlRvcEluZGV4In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVGV4dCI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJd3JhcEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULldSQVApICE9IDApOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULlJFQURfT05MWSkgIT0gMCk7Ci0JCXBhc3N3b3JkQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuUEFTU1dPUkQpICE9IDApOwotCQlzZWFyY2hCdXR0b24uc2V0U2VsZWN0aW9uICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5TRUFSQ0gpICE9IDApOwotCQlsZWZ0QnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTEVGVCkgIT0gMCk7Ci0JCWNlbnRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULkNFTlRFUikgIT0gMCk7Ci0JCXJpZ2h0QnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCQkKLQkJLyogU3BlY2lhbCBjYXNlOiBJQ09OX0NBTkNFTCBhbmQgSF9TQ1JPTEwgaGF2ZSB0aGUgc2FtZSB2YWx1ZSwKLQkJICogYW5kIElDT05fU0VBUkNIIGFuZCBWX1NDUk9MTCBoYXZlIHRoZSBzYW1lIHZhbHVlLAotCQkgKiBzbyB0byBhdm9pZCBjb25mdXNpb24sIG9ubHkgc2V0IENBTkNFTCBpZiBTRUFSQ0ggaXMgc2V0LiAqLwotCQlpZiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuU0VBUkNIKSAhPSAwKSB7Ci0JCQlpY29uQ2FuY2VsQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuSUNPTl9DQU5DRUwpICE9IDApOwotCQkJaWNvblNlYXJjaEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULklDT05fU0VBUkNIKSAhPSAwKTsKLQkJCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWljb25DYW5jZWxCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlpY29uU2VhcmNoQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULkhfU0NST0xMKSAhPSAwKTsKLQkJCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuVl9TQ1JPTEwpICE9IDApOwotCQl9Ci0KLQkJcGFzc3dvcmRCdXR0b24uc2V0RW5hYmxlZCAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuU0lOR0xFKSAhPSAwKTsKLQkJc2VhcmNoQnV0dG9uLnNldEVuYWJsZWQgKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULlNJTkdMRSkgIT0gMCk7Ci0JCWljb25DYW5jZWxCdXR0b24uc2V0RW5hYmxlZCAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuU0VBUkNIKSAhPSAwKTsKLQkJaWNvblNlYXJjaEJ1dHRvbi5zZXRFbmFibGVkICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5TRUFSQ0gpICE9IDApOwotCQl3cmFwQnV0dG9uLnNldEVuYWJsZWQgKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRFbmFibGVkICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5NVUxUSSkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldEVuYWJsZWQgKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Ub29sQmFyVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Ub29sQmFyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjZDU5MGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVG9vbEJhclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgVG9vbEJhclRhYiBleHRlbmRzIFRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlUb29sQmFyIGltYWdlVG9vbEJhciwgdGV4dFRvb2xCYXIsIGltYWdlVGV4dFRvb2xCYXI7Ci0JR3JvdXAgaW1hZ2VUb29sQmFyR3JvdXAsIHRleHRUb29sQmFyR3JvdXAsIGltYWdlVGV4dFRvb2xCYXJHcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGhvcml6b250YWxCdXR0b24sIHZlcnRpY2FsQnV0dG9uLCBmbGF0QnV0dG9uLCBzaGFkb3dPdXRCdXR0b24sIHdyYXBCdXR0b24sIHJpZ2h0QnV0dG9uOwotCi0JLyogT3RoZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBjb21ib0NoaWxkQnV0dG9uOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlUb29sQmFyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIHRvb2wgYmFyICovCi0JCWltYWdlVG9vbEJhckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJaW1hZ2VUb29sQmFyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWltYWdlVG9vbEJhckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdlVG9vbEJhckdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZV9Ub29sQmFyIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgdG9vbCBiYXIgKi8KLQkJdGV4dFRvb2xCYXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRleHRUb29sQmFyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRleHRUb29sQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdGV4dFRvb2xCYXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGV4dF9Ub29sQmFyIikpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBpbWFnZSBhbmQgdGV4dCB0b29sIGJhciAqLwotCQlpbWFnZVRleHRUb29sQmFyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlpbWFnZVRleHRUb29sQmFyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWltYWdlVGV4dFRvb2xCYXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlpbWFnZVRleHRUb29sQmFyR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlVGV4dF9Ub29sQmFyIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlZFUlRJQ0FMOwotCQlpZiAoZmxhdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkZMQVQ7Ci0JCWlmICh3cmFwQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKHNoYWRvd091dEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlNIQURPV19PVVQ7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlJJR0hUOwotCQotCQkvKgotCQkqIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzLgotCQkqCi0JCSogQSB0b29sIGJhciBtdXN0IGNvbnNpc3Qgb2YgYWxsIGltYWdlIHRvb2wKLQkJKiBpdGVtcyBvciBhbGwgdGV4dCB0b29sIGl0ZW1zIGJ1dCBub3QgYm90aC4KLQkJKi8KLQkKLQkJLyogQ3JlYXRlIHRoZSBpbWFnZSB0b29sIGJhciAqLwotCQlpbWFnZVRvb2xCYXIgPSBuZXcgVG9vbEJhciAoaW1hZ2VUb29sQmFyR3JvdXAsIHN0eWxlKTsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUb29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuU0VQQVJBVE9SIik7Ci0JCWlmIChjb21ib0NoaWxkQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKGltYWdlVG9vbEJhciwgU1dULk5PTkUpOwotCQkJY29tYm8uc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyIyNTAiLCAiNTAwIiwgIjc1MCJ9KTsKLQkJCWNvbWJvLnNldFRleHQgKGNvbWJvLmdldEl0ZW0gKDApKTsKLQkJCWNvbWJvLnBhY2sgKCk7Ci0JCQlpdGVtLnNldFdpZHRoIChjb21iby5nZXRTaXplICgpLngpOwotCQkJaXRlbS5zZXRDb250cm9sIChjb21ibyk7Ci0JCX0KLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuRFJPUF9ET1dOIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgdGV4dCB0b29sIGJhciAqLwotCQl0ZXh0VG9vbEJhciA9IG5ldyBUb29sQmFyICh0ZXh0VG9vbEJhckdyb3VwLCBzdHlsZSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRleHRUb29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlB1c2giKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRleHRUb29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlB1c2giKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSYWRpbyIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSYWRpbyIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRleHRUb29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDaGVjayIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULkNIRUNLIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSYWRpbyIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSYWRpbyIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRleHRUb29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlNFUEFSQVRPUiIpOwotCQlpZiAoY29tYm9DaGlsZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvICh0ZXh0VG9vbEJhciwgU1dULk5PTkUpOwotCQkJY29tYm8uc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyIyNTAiLCAiNTAwIiwgIjc1MCJ9KTsKLQkJCWNvbWJvLnNldFRleHQgKGNvbWJvLmdldEl0ZW0gKDApKTsKLQkJCWNvbWJvLnBhY2sgKCk7Ci0JCQlpdGVtLnNldFdpZHRoIChjb21iby5nZXRTaXplICgpLngpOwotCQkJaXRlbS5zZXRDb250cm9sIChjb21ibyk7Ci0JCX0KLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEcm9wX0Rvd24iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5EUk9QX0RPV04iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQkvKiBDcmVhdGUgdGhlIGltYWdlIGFuZCB0ZXh0IHRvb2wgYmFyICovCi0JCWltYWdlVGV4dFRvb2xCYXIgPSBuZXcgVG9vbEJhciAoaW1hZ2VUZXh0VG9vbEJhckdyb3VwLCBzdHlsZSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlB1c2giKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlB1c2giKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULkNIRUNLKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNoZWNrIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuQ0hFQ0siKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5TRVBBUkFUT1IiKTsKLQkJaWYgKGNvbWJvQ2hpbGRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULk5PTkUpOwotCQkJY29tYm8uc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyIyNTAiLCAiNTAwIiwgIjc1MCJ9KTsKLQkJCWNvbWJvLnNldFRleHQgKGNvbWJvLmdldEl0ZW0gKDApKTsKLQkJCWNvbWJvLnBhY2sgKCk7Ci0JCQlpdGVtLnNldFdpZHRoIChjb21iby5nZXRTaXplICgpLngpOwotCQkJaXRlbS5zZXRDb250cm9sIChjb21ibyk7Ci0JCX0KLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEcm9wX0Rvd24iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5EUk9QX0RPV04iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQkvKgotCQkqIERvIG5vdCBhZGQgdGhlIHNlbGVjdGlvbiBldmVudCBmb3IgdGhpcyBkcm9wIGRvd24KLQkJKiB0b29sIGl0ZW0uICBXaXRob3V0IGhvb2tpbmcgdGhlIGV2ZW50LCB0aGUgZHJvcCBkb3duCi0JCSogd2lkZ2V0IGRvZXMgbm90aGluZyBzcGVjaWFsIHdoZW4gdGhlIGRyb3AgZG93biBhcmVhCi0JCSogaXMgc2VsZWN0ZWQuCi0JCSovCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJPdGhlciIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIGRpc3BsYXkgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlICovCi0JCWNvbWJvQ2hpbGRCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQljb21ib0NoaWxkQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb21ib19jaGlsZCIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJY29tYm9DaGlsZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJdmVydGljYWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlZFUlRJQ0FMIik7Ci0JCWZsYXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmbGF0QnV0dG9uLnNldFRleHQgKCJTV1QuRkxBVCIpOwotCQlzaGFkb3dPdXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzaGFkb3dPdXRCdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfT1VUIik7Ci0JCXdyYXBCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl3cmFwQnV0dG9uLnNldFRleHQgKCJTV1QuV1JBUCIpOwotCQlyaWdodEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJpZ2h0QnV0dG9uLnNldFRleHQgKCJTV1QuUklHSFQiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JfQotCQotCXZvaWQgZGlzcG9zZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJc3VwZXIuZGlzcG9zZUV4YW1wbGVXaWRnZXRzICgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJSXRlbSBbXSBpbWFnZVRvb2xCYXJJdGVtcyA9IGltYWdlVG9vbEJhci5nZXRJdGVtcygpOwotCQlJdGVtIFtdIHRleHRUb29sQmFySXRlbXMgPSB0ZXh0VG9vbEJhci5nZXRJdGVtcygpOwotCQlJdGVtIFtdIGltYWdlVGV4dFRvb2xCYXJJdGVtcyA9IGltYWdlVGV4dFRvb2xCYXIuZ2V0SXRlbXMoKTsKLQkJSXRlbSBbXSBhbGxJdGVtcyA9IG5ldyBJdGVtIFtpbWFnZVRvb2xCYXJJdGVtcy5sZW5ndGggKyB0ZXh0VG9vbEJhckl0ZW1zLmxlbmd0aCArIGltYWdlVGV4dFRvb2xCYXJJdGVtcy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGltYWdlVG9vbEJhckl0ZW1zLCAwLCBhbGxJdGVtcywgMCwgaW1hZ2VUb29sQmFySXRlbXMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZXh0VG9vbEJhckl0ZW1zLCAwLCBhbGxJdGVtcywgaW1hZ2VUb29sQmFySXRlbXMubGVuZ3RoLCB0ZXh0VG9vbEJhckl0ZW1zLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoaW1hZ2VUZXh0VG9vbEJhckl0ZW1zLCAwLCBhbGxJdGVtcywgaW1hZ2VUb29sQmFySXRlbXMubGVuZ3RoICsgdGV4dFRvb2xCYXJJdGVtcy5sZW5ndGgsIGltYWdlVGV4dFRvb2xCYXJJdGVtcy5sZW5ndGgpOwotCQlyZXR1cm4gYWxsSXRlbXM7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2ltYWdlVG9vbEJhciwgdGV4dFRvb2xCYXIsIGltYWdlVGV4dFRvb2xCYXJ9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvcnQgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnRUYWJUZXh0KCkgewotCQlyZXR1cm4gIlRCIjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJUb29sQmFyIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5IT1JJWk9OVEFMKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgoaW1hZ2VUb29sQmFyLmdldFN0eWxlICgpICYgU1dULlZFUlRJQ0FMKSAhPSAwKTsKLQkJZmxhdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChpbWFnZVRvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuRkxBVCkgIT0gMCk7Ci0JCXdyYXBCdXR0b24uc2V0U2VsZWN0aW9uICgoaW1hZ2VUb29sQmFyLmdldFN0eWxlICgpICYgU1dULldSQVApICE9IDApOwotCQlzaGFkb3dPdXRCdXR0b24uc2V0U2VsZWN0aW9uICgoaW1hZ2VUb29sQmFyLmdldFN0eWxlICgpICYgU1dULlNIQURPV19PVVQpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoaW1hZ2VUb29sQmFyLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCXJpZ2h0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5SSUdIVCkgIT0gMCk7Ci0JfQotCQotCS8qKgotCSAqIExpc3RlbnMgdG8gd2lkZ2V0U2VsZWN0ZWQoKSBldmVudHMgb24gU1dULkRST1BfRE9XTiB0eXBlIFRvb2xJdGVtcwotCSAqIGFuZCBvcGVucy9jbG9zZXMgYSBtZW51IHdoZW4gYXBwcm9wcmlhdGUuCi0JICovCi0JY2xhc3MgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotCQlwcml2YXRlIE1lbnUgICAgbWVudSA9IG51bGw7Ci0JCQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLy8gQ3JlYXRlIHRoZSBtZW51IGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKLQkJCWlmIChtZW51ID09IG51bGwpIHsKLQkJCQkvLyBMYXp5IGNyZWF0ZSB0aGUgbWVudS4KLQkJCQlUb29sQmFyIHRvb2xiYXIgPSAoKFRvb2xJdGVtKSBldmVudC53aWRnZXQpLmdldFBhcmVudCgpOwotCQkJCWludCBzdHlsZSA9IHRvb2xiYXIuZ2V0U3R5bGUoKSAmIChTV1QuUklHSFRfVE9fTEVGVCB8IFNXVC5MRUZUX1RPX1JJR0hUKTsKLQkJCQltZW51ID0gbmV3IE1lbnUoc2hlbGwsIHN0eWxlIHwgU1dULlBPUF9VUCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA5OyArK2kpIHsKLQkJCQkJZmluYWwgU3RyaW5nIHRleHQgPSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRHJvcERvd25EYXRhXyIgKyBpKTsKLQkJCQkJaWYgKHRleHQubGVuZ3RoKCkgIT0gMCkgewotCQkJCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQkJCQkJbWVudUl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyoqCi0JCQkgKiBBIHNlbGVjdGlvbiBldmVudCB3aWxsIGJlIGZpcmVkIHdoZW4gYSBkcm9wIGRvd24gdG9vbAotCQkJICogaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgbWFpbiBhcmVhIGFuZCBpbiB0aGUgZHJvcAotCQkJICogZG93biBhcnJvdy4gIEV4YW1pbmUgdGhlIGV2ZW50IGRldGFpbCB0byBkZXRlcm1pbmUKLQkJCSAqIHdoZXJlIHRoZSB3aWRnZXQgd2FzIHNlbGVjdGVkLgotCQkJICovCQkKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgZHJvcCBkb3duIGFycm93IHdhcyBzZWxlY3RlZC4KLQkJCQkgKi8KLQkJCQkvLyBQb3NpdGlvbiB0aGUgbWVudSBiZWxvdyBhbmQgdmVydGljYWxseSBhbGlnbmVkIHdpdGggdGhlIHRoZSBkcm9wIGRvd24gdG9vbCBidXR0b24uCi0JCQkJZmluYWwgVG9vbEl0ZW0gdG9vbEl0ZW0gPSAoVG9vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCQlmaW5hbCBUb29sQmFyICB0b29sQmFyID0gdG9vbEl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCi0JCQkJUG9pbnQgcG9pbnQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSk7Ci0JCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQkJfSAKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Rvb2xUaXBUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Rvb2xUaXBUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwMmE4Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Ub29sVGlwVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBUb29sVGlwVGFiIGV4dGVuZHMgVGFiIHsKLQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JVG9vbFRpcCB0b29sVGlwMTsKLQlHcm91cCB0b29sVGlwR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBiYWxsb29uQnV0dG9uLCBpY29uRXJyb3JCdXR0b24sIGljb25JbmZvcm1hdGlvbkJ1dHRvbiwgaWNvbldhcm5pbmdCdXR0b24sIG5vSWNvbkJ1dHRvbjsKLQkKLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIGF1dG9IaWRlQnV0dG9uLCBzaG93SW5UcmF5QnV0dG9uOwotCQotCVRyYXkgdHJheTsKLQlUcmF5SXRlbSB0cmF5SXRlbTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JVG9vbFRpcFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdG9vbHRpcCB2aXNpYmlsaXR5IGNoZWNrIGJveCAqLwotCQl0b29sVGlwR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQl0b29sVGlwR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRvb2xUaXBHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0b29sVGlwR3JvdXAuc2V0VGV4dCAoIlRvb2xUaXAiKTsKLQkJdmlzaWJsZUJ1dHRvbiA9IG5ldyBCdXR0b24odG9vbFRpcEdyb3VwLCBTV1QuQ0hFQ0spOwotCQl2aXNpYmxlQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlZpc2libGUiKSk7Ci0JCXZpc2libGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRWaXNpYmlsaXR5ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChiYWxsb29uQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJBTExPT047Ci0JCWlmIChpY29uRXJyb3JCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9FUlJPUjsKLQkJaWYgKGljb25JbmZvcm1hdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JQ09OX0lORk9STUFUSU9OOwotCQlpZiAoaWNvbldhcm5pbmdCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9XQVJOSU5HOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJdG9vbFRpcDEgPSBuZXcgVG9vbFRpcCAoc2hlbGwsIHN0eWxlKTsKLQkJdG9vbFRpcDEuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVG9vbFRpcF9UaXRsZSIpKTsKLQkJdG9vbFRpcDEuc2V0TWVzc2FnZShDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRXhhbXBsZV9zdHJpbmciKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBmb2xkZXIgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSB0YWJGb2xkZXIgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0JICogQHJldHVybiB0aGUgbmV3IHBhZ2UgZm9yIHRoZSB0YWIgZm9sZGVyCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UgKFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJc3VwZXIuY3JlYXRlVGFiRm9sZGVyUGFnZSAodGFiRm9sZGVyKTsKLQotCQkvKgotCQkgKiBBZGQgYSByZXNpemUgbGlzdGVuZXIgdG8gdGhlIHRhYkZvbGRlclBhZ2Ugc28gdGhhdAotCQkgKiBpZiB0aGUgdXNlciB0eXBlcyBpbnRvIHRoZSBleGFtcGxlIHdpZGdldCB0byBjaGFuZ2UKLQkJICogaXRzIHByZWZlcnJlZCBzaXplLCBhbmQgdGhlbiByZXNpemVzIHRoZSBzaGVsbCwgd2UKLQkJICogcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplIGNvcnJlY3RseS4KLQkJICovCi0JCXRhYkZvbGRlclBhZ2UuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJYmFsbG9vbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJhbGxvb25CdXR0b24uc2V0VGV4dCAoIlNXVC5CQUxMT09OIik7Ci0JCWljb25FcnJvckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25FcnJvckJ1dHRvbi5zZXRUZXh0KCJTV1QuSUNPTl9FUlJPUiIpOwotCQlpY29uSW5mb3JtYXRpb25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlpY29uSW5mb3JtYXRpb25CdXR0b24uc2V0VGV4dCgiU1dULklDT05fSU5GT1JNQVRJT04iKTsKLQkJaWNvbldhcm5pbmdCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlpY29uV2FybmluZ0J1dHRvbi5zZXRUZXh0KCJTV1QuSUNPTl9XQVJOSU5HIik7Ci0JCW5vSWNvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW5vSWNvbkJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb19JY29uIikpOwotCX0KLQkKLQl2b2lkIGNyZWF0ZUNvbG9yQW5kRm9udEdyb3VwICgpIHsKLQkJLy8gVG9vbFRpcCBkb2VzIG5vdCBuZWVkIGEgY29sb3IgYW5kIGZvbnQgZ3JvdXAuCi0JfQotCQotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJb3RoZXJHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQlvdGhlckdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPdGhlciIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjb250cm9scyAqLwotCQlhdXRvSGlkZUJ1dHRvbiA9IG5ldyBCdXR0b24ob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJYXV0b0hpZGVCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQXV0b0hpZGUiKSk7Ci0JCXNob3dJblRyYXlCdXR0b24gPSBuZXcgQnV0dG9uKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNob3dJblRyYXlCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2hvd19Jbl9UcmF5IikpOwotCQl0cmF5ID0gZGlzcGxheS5nZXRTeXN0ZW1UcmF5KCk7Ci0JCXNob3dJblRyYXlCdXR0b24uc2V0RW5hYmxlZCh0cmF5ICE9IG51bGwpOwotCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWF1dG9IaWRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0QXV0b0hpZGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzaG93SW5UcmF5QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzaG93RXhhbXBsZVdpZGdldEluVHJheSAoKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJZGlzcG9zZVRyYXlJdGVtKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQlhdXRvSGlkZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCQotCXZvaWQgY3JlYXRlU2l6ZUdyb3VwICgpIHsKLQkJLy8gVG9vbFRpcCBkb2VzIG5vdCBuZWVkIGEgc2l6ZSBncm91cC4KLQl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgZGlzcG9zZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJZGlzcG9zZVRyYXlJdGVtKCk7Ci0JCXN1cGVyLmRpc3Bvc2VFeGFtcGxlV2lkZ2V0cygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCS8vIFRhYiB1c2VzIHRoaXMgZm9yIG1hbnkgdGhpbmdzIC0gd2lkZ2V0cyB3b3VsZCBvbmx5IGdldCBzZXQvZ2V0LCBsaXN0ZW5lcnMsIGFuZCBkaXNwb3NlLgotCVdpZGdldFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3Rvb2xUaXAxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJNZXNzYWdlIiwgIlRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJUb29sVGlwIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc2hvd0V4YW1wbGVXaWRnZXRJblRyYXkgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRBdXRvSGlkZSAoKTsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQliYWxsb29uQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRvb2xUaXAxLmdldFN0eWxlICgpICYgU1dULkJBTExPT04pICE9IDApOwotCQlpY29uRXJyb3JCdXR0b24uc2V0U2VsZWN0aW9uICgodG9vbFRpcDEuZ2V0U3R5bGUgKCkgJiBTV1QuSUNPTl9FUlJPUikgIT0gMCk7Ci0JCWljb25JbmZvcm1hdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0b29sVGlwMS5nZXRTdHlsZSAoKSAmIFNXVC5JQ09OX0lORk9STUFUSU9OKSAhPSAwKTsKLQkJaWNvbldhcm5pbmdCdXR0b24uc2V0U2VsZWN0aW9uICgodG9vbFRpcDEuZ2V0U3R5bGUgKCkgJiBTV1QuSUNPTl9XQVJOSU5HKSAhPSAwKTsKLQkJbm9JY29uQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRvb2xUaXAxLmdldFN0eWxlICgpICYgKFNXVC5JQ09OX0VSUk9SIHwgU1dULklDT05fSU5GT1JNQVRJT04gfCBTV1QuSUNPTl9XQVJOSU5HKSkgPT0gMCk7Ci0JCWF1dG9IaWRlQnV0dG9uLnNldFNlbGVjdGlvbih0b29sVGlwMS5nZXRBdXRvSGlkZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRWaXNpYmlsaXR5ICgpIHsKLQkJdG9vbFRpcDEuc2V0VmlzaWJsZSAodmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhdXRvSGlkZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0QXV0b0hpZGUgKCkgewotCQl0b29sVGlwMS5zZXRBdXRvSGlkZShhdXRvSGlkZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQl2b2lkIHNob3dFeGFtcGxlV2lkZ2V0SW5UcmF5ICgpIHsKLQkJaWYgKHNob3dJblRyYXlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQljcmVhdGVUcmF5SXRlbSgpOwotCQkJdHJheUl0ZW0uc2V0VG9vbFRpcCh0b29sVGlwMSk7Ci0JCX0gZWxzZSB7Ci0JCQlkaXNwb3NlVHJheUl0ZW0oKTsKLQkJfQotCX0KLQotCXZvaWQgY3JlYXRlVHJheUl0ZW0oKSB7Ci0JCWlmICh0cmF5SXRlbSA9PSBudWxsKSB7Ci0JCQl0cmF5SXRlbSA9IG5ldyBUcmF5SXRlbSh0cmF5LCBTV1QuTk9ORSk7Ci0JCQl0cmF5SXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJfQotCX0KLQkKLQl2b2lkIGRpc3Bvc2VUcmF5SXRlbSgpIHsKLQkJaWYgKHRyYXlJdGVtICE9IG51bGwpIHsKLQkJCXRyYXlJdGVtLnNldFRvb2xUaXAobnVsbCk7Ci0JCQl0cmF5SXRlbS5kaXNwb3NlKCk7Ci0JCQl0cmF5SXRlbSA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UcmVlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UcmVlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlNDczYzguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVHJlZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgVHJlZVRhYiBleHRlbmRzIFNjcm9sbGFibGVUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JVHJlZSB0cmVlMSwgdHJlZTI7Ci0JVHJlZUl0ZW0gdGV4dE5vZGUxLCBpbWFnZU5vZGUxOwotCUdyb3VwIHRyZWVHcm91cCwgaW1hZ2VUcmVlR3JvdXAsIGl0ZW1Hcm91cDsKLQkKLQkvKiBTaXplIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTaXplIiBncm91cCAqLwotCUJ1dHRvbiBwYWNrQ29sdW1uc0J1dHRvbjsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIG5vU2Nyb2xsQnV0dG9uLCBjaGVja0J1dHRvbiwgZnVsbFNlbGVjdGlvbkJ1dHRvbjsKLQotCS8qIE90aGVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gbXVsdGlwbGVDb2x1bW5zLCBtb3ZlYWJsZUNvbHVtbnMsIHJlc2l6YWJsZUNvbHVtbnMsIGhlYWRlclZpc2libGVCdXR0b24sIHNvcnRJbmRpY2F0b3JCdXR0b24sIGhlYWRlckltYWdlc0J1dHRvbiwgc3ViSW1hZ2VzQnV0dG9uLCBsaW5lc1Zpc2libGVCdXR0b247Ci0JCi0JLyogQ29udHJvbHMgYW5kIHJlc291cmNlcyBhZGRlZCB0byB0aGUgIkNvbG9ycyBhbmQgRm9udHMiIGdyb3VwICovCi0Jc3RhdGljIGZpbmFsIGludCBJVEVNX0ZPUkVHUk9VTkRfQ09MT1IgPSAzOwotCXN0YXRpYyBmaW5hbCBpbnQgSVRFTV9CQUNLR1JPVU5EX0NPTE9SID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IElURU1fRk9OVCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBDRUxMX0ZPUkVHUk9VTkRfQ09MT1IgPSA2OwotCXN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9CQUNLR1JPVU5EX0NPTE9SID0gNzsKLQlzdGF0aWMgZmluYWwgaW50IENFTExfRk9OVCA9IDg7Ci0JQ29sb3IgaXRlbUZvcmVncm91bmRDb2xvciwgaXRlbUJhY2tncm91bmRDb2xvciwgY2VsbEZvcmVncm91bmRDb2xvciwgY2VsbEJhY2tncm91bmRDb2xvcjsKLQlGb250IGl0ZW1Gb250LCBjZWxsRm9udDsKLQotCXN0YXRpYyBTdHJpbmcgW10gY29sdW1uVGl0bGVzCT0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzAiKSwKLQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMSIpLAotCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVUaXRsZV8yIiksCi0JCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzMiKX07Ci0JCSAgIAotCXN0YXRpYyBTdHJpbmdbXVtdIHRhYmxlRGF0YSA9IHsKLQkJCXsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMCIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8xIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUwXzIiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMyIpIH0sCi0JCQl7IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzAiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMSIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8yIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzMiKSB9LAotCQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8wIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzEiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTJfMiIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8zIikgfSB9OwotCi0JUG9pbnQgbWVudU1vdXNlQ29vcmRzOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRyZWVUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb2xvcnMgYW5kIEZvbnRzIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbG9yQW5kRm9udEdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29sb3JBbmRGb250R3JvdXAoKTsKLQkJCi0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtX0ZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW1fQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbV9Gb250IikpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDZWxsX0ZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNlbGxfQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2VsbF9Gb250IikpOwotCi0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGl0ZW1CYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgaXRlbUJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgaXRlbUZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb250ICE9IG51bGwpIGl0ZW1Gb250LmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEJhY2tncm91bmRDb2xvciAhPSBudWxsKSBjZWxsQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEZvcmVncm91bmRDb2xvciAhPSBudWxsKSBjZWxsRm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEZvbnQgIT0gbnVsbCkgY2VsbEZvbnQuZGlzcG9zZSgpOwotCQkJCWl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwkJCQotCQkJCWl0ZW1Gb250ID0gbnVsbDsKLQkJCQljZWxsQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJCQljZWxsRm9yZWdyb3VuZENvbG9yID0gbnVsbDsJCQkKLQkJCQljZWxsRm9udCA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXZvaWQgY2hhbmdlRm9udE9yQ29sb3IoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJY2FzZSBJVEVNX0ZPUkVHUk9VTkRfQ09MT1I6IHsKLQkJCUNvbG9yIG9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSBvbGRDb2xvciA9IHRleHROb2RlMS5nZXRGb3JlZ3JvdW5kICgpOwotCQkJY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCW9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGRpc3BsYXksIHJnYik7Ci0JCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQljYXNlIElURU1fQkFDS0dST1VORF9DT0xPUjogewotCQkJQ29sb3Igb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGV4dE5vZGUxLmdldEJhY2tncm91bmQgKCk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldEl0ZW1CYWNrZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgSVRFTV9GT05UOiB7Ci0JCQlGb250IG9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCWlmIChvbGRGb250ID09IG51bGwpIG9sZEZvbnQgPSB0ZXh0Tm9kZTEuZ2V0Rm9udCAoKTsKLQkJCWZvbnREaWFsb2cuc2V0Rm9udExpc3Qob2xkRm9udC5nZXRGb250RGF0YSgpKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuICgpOwotCQkJaWYgKGZvbnREYXRhID09IG51bGwpIHJldHVybjsKLQkJCW9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCWl0ZW1Gb250ID0gbmV3IEZvbnQgKGRpc3BsYXksIGZvbnREYXRhKTsKLQkJCXNldEl0ZW1Gb250ICgpOwotCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9GT1JFR1JPVU5EX0NPTE9SOiB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGNlbGxGb3JlZ3JvdW5kQ29sb3I7Ci0JCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0ZXh0Tm9kZTEuZ2V0Rm9yZWdyb3VuZCAoMSk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBjZWxsRm9yZWdyb3VuZENvbG9yOwotCQkJY2VsbEZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldENlbGxGb3JlZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9CQUNLR1JPVU5EX0NPTE9SOiB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0ZXh0Tm9kZTEuZ2V0QmFja2dyb3VuZCAoMSk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBjZWxsQmFja2dyb3VuZENvbG9yOwotCQkJY2VsbEJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldENlbGxCYWNrZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9GT05UOiB7Ci0JCQlGb250IG9sZEZvbnQgPSBjZWxsRm9udDsKLQkJCWlmIChvbGRGb250ID09IG51bGwpIG9sZEZvbnQgPSB0ZXh0Tm9kZTEuZ2V0Rm9udCAoMSk7Ci0JCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KG9sZEZvbnQuZ2V0Rm9udERhdGEoKSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbiAoKTsKLQkJCWlmIChmb250RGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQlvbGRGb250ID0gY2VsbEZvbnQ7Ci0JCQljZWxsRm9udCA9IG5ldyBGb250IChkaXNwbGF5LCBmb250RGF0YSk7Ci0JCQlzZXRDZWxsRm9udCAoKTsKLQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3VwZXIuY2hhbmdlRm9udE9yQ29sb3IoaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJbGluZXNWaXNpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbGluZXNWaXNpYmxlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lc19WaXNpYmxlIikpOwotCQltdWx0aXBsZUNvbHVtbnMgPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQltdWx0aXBsZUNvbHVtbnMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk11bHRpcGxlX0NvbHVtbnMiKSk7Ci0JCWhlYWRlclZpc2libGVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQloZWFkZXJWaXNpYmxlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJIZWFkZXJfVmlzaWJsZSIpKTsKLQkJc29ydEluZGljYXRvckJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNvcnRJbmRpY2F0b3JCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNvcnRfSW5kaWNhdG9yIikpOwotCQltb3ZlYWJsZUNvbHVtbnMgPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQltb3ZlYWJsZUNvbHVtbnMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1vdmVhYmxlX0NvbHVtbnMiKSk7Ci0JCXJlc2l6YWJsZUNvbHVtbnMgPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZXNpemFibGVDb2x1bW5zLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXNpemFibGVfQ29sdW1ucyIpKTsKLQkJaGVhZGVySW1hZ2VzQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJaGVhZGVySW1hZ2VzQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJIZWFkZXJfSW1hZ2VzIikpOwotCQlzdWJJbWFnZXNCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzdWJJbWFnZXNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN1Yl9JbWFnZXMiKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWxpbmVzVmlzaWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0TGluZXNWaXNpYmxlICgpOwotCQkJfQotCQl9KTsKLQkJbXVsdGlwbGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQkJaGVhZGVyVmlzaWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0SGVhZGVyVmlzaWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCXNvcnRJbmRpY2F0b3JCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFNvcnRJbmRpY2F0b3IgKCk7Ci0JCQl9Ci0JCX0pOwotCQltb3ZlYWJsZUNvbHVtbnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldENvbHVtbnNNb3ZlYWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCXJlc2l6YWJsZUNvbHVtbnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldENvbHVtbnNSZXNpemFibGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQloZWFkZXJJbWFnZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzdWJJbWFnZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgdHJlZSAqLwotCQl0cmVlR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQl0cmVlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRyZWVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0cmVlR3JvdXAuc2V0VGV4dCAoIlRyZWUiKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBpbWFnZSB0cmVlICovCi0JCWltYWdlVHJlZUdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJaW1hZ2VUcmVlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWltYWdlVHJlZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdlVHJlZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUcmVlX1dpdGhfSW1hZ2VzIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc2luZ2xlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuU0lOR0xFOwotCQlpZiAobXVsdGlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKG5vU2Nyb2xsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuTk9fU0NST0xMOwotCQlpZiAoY2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5DSEVDSzsKLQkJaWYgKGZ1bGxTZWxlY3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRlVMTF9TRUxFQ1RJT047Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgdGV4dCB0cmVlICovCi0JCXRyZWUxID0gbmV3IFRyZWUgKHRyZWVHcm91cCwgc3R5bGUpOwotCQlib29sZWFuIG11bHRpQ29sdW1uID0gbXVsdGlwbGVDb2x1bW5zLmdldFNlbGVjdGlvbigpOwotCQlpZiAobXVsdGlDb2x1bW4pIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uVGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUNvbHVtbiB0cmVlQ29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZTEsIFNXVC5OT05FKTsKLQkJCQl0cmVlQ29sdW1uLnNldFRleHQoY29sdW1uVGl0bGVzW2ldKTsKLQkJCQl0cmVlQ29sdW1uLnNldFRvb2xUaXBUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUb29sdGlwIiwgbmV3IFN0cmluZyBbXSB7Y29sdW1uVGl0bGVzW2ldfSkpOwotCQkJfQotCQkJdHJlZTEuc2V0U29ydENvbHVtbih0cmVlMS5nZXRDb2x1bW4oMCkpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlMSwgU1dULk5PTkUpOwotCQkJc2V0SXRlbVRleHQoaXRlbSwgaSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfIiArIChpICsgMSkpKTsKLQkJCWlmIChpIDwgMykgewotCQkJCVRyZWVJdGVtIHN1Yml0ZW0gPSBuZXcgVHJlZUl0ZW0gKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzZXRJdGVtVGV4dChzdWJpdGVtLCBpLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9kZV8iICsgKGkgKyAxKSArICJfMSIpKTsKLQkJCX0KLQkJfQotCQlUcmVlSXRlbSB0cmVlUm9vdHNbXSA9IHRyZWUxLmdldEl0ZW1zICgpOwotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlUm9vdHNbMV0sIFNXVC5OT05FKTsKLQkJc2V0SXRlbVRleHQoaXRlbSwgMSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfMl8yIikpOwotCQlpdGVtID0gbmV3IFRyZWVJdGVtIChpdGVtLCBTV1QuTk9ORSk7Ci0JCXNldEl0ZW1UZXh0KGl0ZW0sIDEsIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXzJfMl8xIikpOwkJCQkJCi0JCXRleHROb2RlMSA9IHRyZWVSb290c1swXTsKLQkJcGFja0NvbHVtbnModHJlZTEpOwotCQl0cnkgewotCQkJVHJlZUNvbHVtbiBjb2x1bW4gPSB0cmVlMS5nZXRDb2x1bW4oMCk7Ci0JCQlyZXNpemFibGVDb2x1bW5zLnNldFNlbGVjdGlvbiAoY29sdW1uLmdldFJlc2l6YWJsZSgpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCi0JCS8qIENyZWF0ZSB0aGUgaW1hZ2UgdHJlZSAqLwkKLQkJdHJlZTIgPSBuZXcgVHJlZSAoaW1hZ2VUcmVlR3JvdXAsIHN0eWxlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdOwotCQlpZiAobXVsdGlDb2x1bW4pIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uVGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUNvbHVtbiB0cmVlQ29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5OT05FKTsKLQkJCQl0cmVlQ29sdW1uLnNldFRleHQoY29sdW1uVGl0bGVzW2ldKTsKLQkJCQl0cmVlQ29sdW1uLnNldFRvb2xUaXBUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUb29sdGlwIiwgbmV3IFN0cmluZyBbXSB7Y29sdW1uVGl0bGVzW2ldfSkpOwotCQkJCWlmIChoZWFkZXJJbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHRyZWVDb2x1bW4uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzIFtpICUgM10pOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlMiwgU1dULk5PTkUpOwotCQkJc2V0SXRlbVRleHQoaXRlbSwgaSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfIiArIChpICsgMSkpKTsKLQkJCWlmIChtdWx0aUNvbHVtbiAmJiBzdWJJbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtblRpdGxlcy5sZW5ndGg7IGorKykgewotCQkJCQlpdGVtLnNldEltYWdlKGosIGltYWdlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJfQotCQkJaWYgKGkgPCAzKSB7Ci0JCQkJVHJlZUl0ZW0gc3ViaXRlbSA9IG5ldyBUcmVlSXRlbSAoaXRlbSwgU1dULk5PTkUpOwotCQkJCXNldEl0ZW1UZXh0KHN1Yml0ZW0sIGksIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXyIgKyAoaSArIDEpICsgIl8xIikpOwotCQkJCWlmIChtdWx0aUNvbHVtbiAmJiBzdWJJbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCXN1Yml0ZW0uc2V0SW1hZ2UoaiwgaW1hZ2UpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3ViaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRyZWVSb290cyA9IHRyZWUyLmdldEl0ZW1zICgpOwotCQlpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlUm9vdHNbMV0sIFNXVC5OT05FKTsKLQkJc2V0SXRlbVRleHQoaXRlbSwgMSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfMl8yIikpOwotCQlpZiAobXVsdGlDb2x1bW4gJiYgc3ViSW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtblRpdGxlcy5sZW5ndGg7IGorKykgewotCQkJCWl0ZW0uc2V0SW1hZ2UoaiwgaW1hZ2UpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCX0KLQkJaXRlbSA9IG5ldyBUcmVlSXRlbSAoaXRlbSwgU1dULk5PTkUpOwotCQlzZXRJdGVtVGV4dChpdGVtLCAxLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9kZV8yXzJfMSIpKTsKLQkJaWYgKG11bHRpQ29sdW1uICYmIHN1YkltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlpdGVtLnNldEltYWdlKGosIGltYWdlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQl9Ci0JCWltYWdlTm9kZTEgPSB0cmVlUm9vdHNbMF07Ci0JCXBhY2tDb2x1bW5zKHRyZWUyKTsKLQl9Ci0JCi0Jdm9pZCBzZXRJdGVtVGV4dChUcmVlSXRlbSBpdGVtLCBpbnQgaSwgU3RyaW5nIG5vZGUpIHsKLQkJaW50IGluZGV4ID0gaSAlIDM7Ci0JCWlmIChtdWx0aXBsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXRhYmxlRGF0YSBbaW5kZXhdWzBdID0gbm9kZTsKLQkJCWl0ZW0uc2V0VGV4dCAodGFibGVEYXRhIFtpbmRleF0pOwotCQl9IGVsc2UgewotCQkJaXRlbS5zZXRUZXh0IChub2RlKTsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTaXplIiBncm91cC4gIFRoZSAiU2l6ZSIgZ3JvdXAgY29udGFpbnMKLQkgKiBjb250cm9scyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgc2l6ZSBvZgotCSAqIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVTaXplR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTaXplR3JvdXAoKTsKLQkKLQkJcGFja0NvbHVtbnNCdXR0b24gPSBuZXcgQnV0dG9uIChzaXplR3JvdXAsIFNXVC5QVVNIKTsKLQkJcGFja0NvbHVtbnNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhY2tfQ29sdW1ucyIpKTsKLQkJcGFja0NvbHVtbnNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcGFja0NvbHVtbnMgKHRyZWUxKTsKLQkJCQlwYWNrQ29sdW1ucyAodHJlZTIpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlub1Njcm9sbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW5vU2Nyb2xsQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fU0NST0xMIik7Ci0JCWNoZWNrQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCdXR0b24uc2V0VGV4dCAoIlNXVC5DSEVDSyIpOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbi5zZXRUZXh0ICgiU1dULkZVTExfU0VMRUNUSU9OIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQkvKiBOb3RlOiBXZSBkbyBub3QgYm90aGVyIGNvbGxlY3RpbmcgdGhlIHRyZWUgaXRlbXMKLQkJICogYmVjYXVzZSB0cmVlIGl0ZW1zIGRvbid0IGhhdmUgYW55IGV2ZW50cy4gSWYgZXZlbnRzCi0JCSAqIGFyZSBldmVyIGFkZGVkIHRvIFRyZWVJdGVtLCB0aGVuIHRoaXMgbmVlZHMgdG8gY2hhbmdlLgotCQkgKi8KLQkJSXRlbSBbXSBjb2x1bW5zMSA9IHRyZWUxLmdldENvbHVtbnMoKTsKLQkJSXRlbSBbXSBjb2x1bW5zMiA9IHRyZWUyLmdldENvbHVtbnMoKTsKLQkJSXRlbSBbXSBhbGxJdGVtcyA9IG5ldyBJdGVtIFtjb2x1bW5zMS5sZW5ndGggKyBjb2x1bW5zMi5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbHVtbnMxLCAwLCBhbGxJdGVtcywgMCwgY29sdW1uczEubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShjb2x1bW5zMiwgMCwgYWxsSXRlbXMsIGNvbHVtbnMxLmxlbmd0aCwgY29sdW1uczIubGVuZ3RoKTsKLQkJcmV0dXJuIGFsbEl0ZW1zOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHt0cmVlMSwgdHJlZTJ9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IkNvbHVtbk9yZGVyIiwgIlNlbGVjdGlvbiIsICJUb29sVGlwVGV4dCIsICJUb3BJdGVtIn07Ci0JfQotCi0JT2JqZWN0W10gcGFyYW1ldGVyRm9yVHlwZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyB2YWx1ZSwgV2lkZ2V0IHdpZGdldCkgewotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbSIpKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gZmluZEl0ZW0odmFsdWUsICgoVHJlZSkgd2lkZ2V0KS5nZXRJdGVtcygpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBuZXcgT2JqZWN0W10ge2l0ZW19OwotCQl9Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoIltMb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07IikpIHsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHNwbGl0KHZhbHVlLCAnLCcpOwotCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVt2YWx1ZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IGZpbmRJdGVtKHZhbHVlc1tpXSwgKChUcmVlKSB3aWRnZXQpLmdldEl0ZW1zKCkpOwotCQkJCWlmIChpdGVtID09IG51bGwpIGJyZWFrOwotCQkJCWl0ZW1zW2ldID0gaXRlbTsJCQkJCi0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtc307Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnBhcmFtZXRlckZvclR5cGUodHlwZU5hbWUsIHZhbHVlLCB3aWRnZXQpOwotCX0KLQotCVRyZWVJdGVtIGZpbmRJdGVtKFN0cmluZyB2YWx1ZSwgVHJlZUl0ZW1bXSBpdGVtcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlpZiAoaXRlbS5nZXRUZXh0KCkuZXF1YWxzKHZhbHVlKSkgcmV0dXJuIGl0ZW07Ci0JCQlpdGVtID0gZmluZEl0ZW0odmFsdWUsIGl0ZW0uZ2V0SXRlbXMoKSk7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSByZXR1cm4gaXRlbTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJUcmVlIjsKLQl9Ci0KLQl2b2lkIHBhY2tDb2x1bW5zIChUcmVlIHRyZWUpIHsKLQkJaWYgKG11bHRpcGxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKSkgewotCQkJaW50IGNvbHVtbkNvdW50ID0gdHJlZS5nZXRDb2x1bW5Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCQkJVHJlZUNvbHVtbiB0cmVlQ29sdW1uID0gdHJlZS5nZXRDb2x1bW4oaSk7Ci0JCQkJdHJlZUNvbHVtbi5wYWNrKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbW92ZWFibGUgY29sdW1ucyBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRDb2x1bW5zTW92ZWFibGUgKCkgewotCQlib29sZWFuIHNlbGVjdGlvbiA9IG1vdmVhYmxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKTsKLQkJVHJlZUNvbHVtbltdIGNvbHVtbnMxID0gdHJlZTEuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMxLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zMVtpXS5zZXRNb3ZlYWJsZShzZWxlY3Rpb24pOwotCQl9Ci0JCVRyZWVDb2x1bW5bXSBjb2x1bW5zMiA9IHRyZWUyLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zMi5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uczJbaV0uc2V0TW92ZWFibGUoc2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlc2l6YWJsZSBjb2x1bW5zIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldENvbHVtbnNSZXNpemFibGUgKCkgewotCQlib29sZWFuIHNlbGVjdGlvbiA9IHJlc2l6YWJsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCk7Ci0JCVRyZWVDb2x1bW5bXSBjb2x1bW5zMSA9IHRyZWUxLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zMS5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uczFbaV0uc2V0UmVzaXphYmxlKHNlbGVjdGlvbik7Ci0JCX0KLQkJVHJlZUNvbHVtbltdIGNvbHVtbnMyID0gdHJlZTIuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMyLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zMltpXS5zZXRSZXNpemFibGUoc2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3IsIGJhY2tncm91bmQgY29sb3IsIGFuZCBmb250Ci0JICogb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzIHRvIHRoZWlyIGRlZmF1bHQgc2V0dGluZ3MuCi0JICogQWxzbyBzZXRzIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIE5vZGUgMQotCSAqIFRyZWVJdGVtcyB0byBkZWZhdWx0IHNldHRpbmdzLgotCSAqLwotCXZvaWQgcmVzZXRDb2xvcnNBbmRGb250cyAoKSB7Ci0JCXN1cGVyLnJlc2V0Q29sb3JzQW5kRm9udHMgKCk7Ci0JCUNvbG9yIG9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJaXRlbUZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldEl0ZW1Gb3JlZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JCWl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRJdGVtQmFja2dyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJRm9udCBvbGRGb250ID0gZm9udDsKLQkJaXRlbUZvbnQgPSBudWxsOwotCQlzZXRJdGVtRm9udCAoKTsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlKCk7Ci0JCW9sZENvbG9yID0gY2VsbEZvcmVncm91bmRDb2xvcjsKLQkJY2VsbEZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldENlbGxGb3JlZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCWNlbGxCYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRDZWxsQmFja2dyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkRm9udCA9IGZvbnQ7Ci0JCWNlbGxGb250ID0gbnVsbDsKLQkJc2V0Q2VsbEZvbnQgKCk7Ci0JCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzZXRJdGVtQmFja2dyb3VuZCAoKTsKLQkJc2V0SXRlbUZvcmVncm91bmQgKCk7Ci0JCXNldEl0ZW1Gb250ICgpOwotCQlzZXRDZWxsQmFja2dyb3VuZCAoKTsKLQkJc2V0Q2VsbEZvcmVncm91bmQgKCk7Ci0JCXNldENlbGxGb250ICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXNldENvbHVtbnNNb3ZlYWJsZSAoKTsKLQkJCXNldENvbHVtbnNSZXNpemFibGUgKCk7Ci0JCQlzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpOwotCQkJc2V0V2lkZ2V0U29ydEluZGljYXRvciAoKTsKLQkJCXNldFdpZGdldExpbmVzVmlzaWJsZSAoKTsKLQkJfQotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCW5vU2Nyb2xsQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRyZWUxLmdldFN0eWxlICgpICYgU1dULk5PX1NDUk9MTCkgIT0gMCk7Ci0JCWNoZWNrQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRyZWUxLmdldFN0eWxlICgpICYgU1dULkNIRUNLKSAhPSAwKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0cmVlMS5nZXRTdHlsZSAoKSAmIFNXVC5GVUxMX1NFTEVDVElPTikgIT0gMCk7Ci0JCXRyeSB7Ci0JCQlUcmVlQ29sdW1uIGNvbHVtbiA9IHRyZWUxLmdldENvbHVtbigwKTsKLQkJCW1vdmVhYmxlQ29sdW1ucy5zZXRTZWxlY3Rpb24gKGNvbHVtbi5nZXRNb3ZlYWJsZSgpKTsKLQkJCXJlc2l6YWJsZUNvbHVtbnMuc2V0U2VsZWN0aW9uIChjb2x1bW4uZ2V0UmVzaXphYmxlKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JCWhlYWRlclZpc2libGVCdXR0b24uc2V0U2VsZWN0aW9uICh0cmVlMS5nZXRIZWFkZXJWaXNpYmxlKCkpOwotCQlsaW5lc1Zpc2libGVCdXR0b24uc2V0U2VsZWN0aW9uICh0cmVlMS5nZXRMaW5lc1Zpc2libGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIE5vZGUgMSBUcmVlSXRlbXMgaW4gY29sdW1uIDEuCi0JICovCi0Jdm9pZCBzZXRDZWxsQmFja2dyb3VuZCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGV4dE5vZGUxLnNldEJhY2tncm91bmQgKDEsIGNlbGxCYWNrZ3JvdW5kQ29sb3IpOwotCQkJaW1hZ2VOb2RlMS5zZXRCYWNrZ3JvdW5kICgxLCBjZWxsQmFja2dyb3VuZENvbG9yKTsKLQkJfQotCQkvKiBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjZWxsLiAqLwotCQlDb2xvciBjb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRleHROb2RlMS5nZXRCYWNrZ3JvdW5kICgxKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKENFTExfQkFDS0dST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIE5vZGUgMSBUcmVlSXRlbXMgaW4gY29sdW1uIDEuCi0JICovCi0Jdm9pZCBzZXRDZWxsRm9yZWdyb3VuZCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGV4dE5vZGUxLnNldEZvcmVncm91bmQgKDEsIGNlbGxGb3JlZ3JvdW5kQ29sb3IpOwotCQkJaW1hZ2VOb2RlMS5zZXRGb3JlZ3JvdW5kICgxLCBjZWxsRm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvcmVncm91bmQgY29sb3IgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBjZWxsLiAqLwotCQlDb2xvciBjb2xvciA9IGNlbGxGb3JlZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRleHROb2RlMS5nZXRGb3JlZ3JvdW5kICgxKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKENFTExfRk9SRUdST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgdGhlIE5vZGUgMSBUcmVlSXRlbXMgaW4gY29sdW1uIDEuCi0JICovCi0Jdm9pZCBzZXRDZWxsRm9udCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGV4dE5vZGUxLnNldEZvbnQgKDEsIGNlbGxGb250KTsKLQkJCWltYWdlTm9kZTEuc2V0Rm9udCAoMSwgY2VsbEZvbnQpOwotCQl9Ci0JCS8qIFNldCB0aGUgZm9udCBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGZvbnQgb2YgdGhlIGl0ZW0uICovCi0JCUZvbnQgZnQgPSBjZWxsRm9udDsKLQkJaWYgKGZ0ID09IG51bGwpIGZ0ID0gdGV4dE5vZGUxLmdldEZvbnQgKDEpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oQ0VMTF9GT05UKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGZvbnRJbWFnZShmdCkpOwotCQlpdGVtLnNldEZvbnQoZnQpOwotCQljb2xvckFuZEZvbnRUYWJsZS5sYXlvdXQgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgTm9kZSAxIFRyZWVJdGVtcy4KLQkgKi8KLQl2b2lkIHNldEl0ZW1CYWNrZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0ZXh0Tm9kZTEuc2V0QmFja2dyb3VuZCAoaXRlbUJhY2tncm91bmRDb2xvcik7Ci0JCQlpbWFnZU5vZGUxLnNldEJhY2tncm91bmQgKGl0ZW1CYWNrZ3JvdW5kQ29sb3IpOwotCQl9Ci0JCS8qIFNldCB0aGUgYmFja2dyb3VuZCBidXR0b24ncyBjb2xvciB0byBtYXRjaCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgaXRlbS4gKi8KLQkJQ29sb3IgY29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0ZXh0Tm9kZTEuZ2V0QmFja2dyb3VuZCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKElURU1fQkFDS0dST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIE5vZGUgMSBUcmVlSXRlbXMuCi0JICovCi0Jdm9pZCBzZXRJdGVtRm9yZWdyb3VuZCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGV4dE5vZGUxLnNldEZvcmVncm91bmQgKGl0ZW1Gb3JlZ3JvdW5kQ29sb3IpOwotCQkJaW1hZ2VOb2RlMS5zZXRGb3JlZ3JvdW5kIChpdGVtRm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvcmVncm91bmQgYnV0dG9uJ3MgY29sb3IgdG8gbWF0Y2ggdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIGl0ZW0uICovCi0JCUNvbG9yIGNvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGV4dE5vZGUxLmdldEZvcmVncm91bmQgKCk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbShJVEVNX0ZPUkVHUk9VTkRfQ09MT1IpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoY29sb3JJbWFnZShjb2xvcikpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG9mIHRoZSBOb2RlIDEgVHJlZUl0ZW1zLgotCSAqLwotCXZvaWQgc2V0SXRlbUZvbnQgKCkgewotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXRleHROb2RlMS5zZXRGb250IChpdGVtRm9udCk7Ci0JCQlpbWFnZU5vZGUxLnNldEZvbnQgKGl0ZW1Gb250KTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvbnQgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb250IG9mIHRoZSBpdGVtLiAqLwotCQlGb250IGZ0ID0gaXRlbUZvbnQ7Ci0JCWlmIChmdCA9PSBudWxsKSBmdCA9IHRleHROb2RlMS5nZXRGb250ICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oSVRFTV9GT05UKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGZvbnRJbWFnZShmdCkpOwotCQlpdGVtLnNldEZvbnQoZnQpOwotCQljb2xvckFuZEZvbnRUYWJsZS5sYXlvdXQgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVhZGVyIHZpc2libGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SGVhZGVyVmlzaWJsZSAoKSB7Ci0JCXRyZWUxLnNldEhlYWRlclZpc2libGUgKGhlYWRlclZpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJdHJlZTIuc2V0SGVhZGVyVmlzaWJsZSAoaGVhZGVyVmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzb3J0IGluZGljYXRvciBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRTb3J0SW5kaWNhdG9yICgpIHsKLQkJaWYgKHNvcnRJbmRpY2F0b3JCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlpbml0aWFsaXplU29ydFN0YXRlICh0cmVlMSk7Ci0JCQlpbml0aWFsaXplU29ydFN0YXRlICh0cmVlMik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNldFNvcnRTdGF0ZSAodHJlZTEpOwotCQkJcmVzZXRTb3J0U3RhdGUgKHRyZWUyKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbml0aWFsIHNvcnQgaW5kaWNhdG9yIHN0YXRlIGFuZCBhZGRzIGEgbGlzdGVuZXIKLQkgKiB0byBjeWNsZSB0aHJvdWdoIHNvcnQgc3RhdGVzIGFuZCBjb2x1bW5zLgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZVNvcnRTdGF0ZSAoZmluYWwgVHJlZSB0cmVlKSB7Ci0JCS8qIFJlc2V0IHRvIGtub3duIHN0YXRlOiAnZG93bicgb24gY29sdW1uIDAuICovCi0JCXRyZWUuc2V0U29ydERpcmVjdGlvbiAoU1dULkRPV04pOwotCQlUcmVlQ29sdW1uIFtdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnNbaV07Ci0JCQlpZiAoaSA9PSAwKSB0cmVlLnNldFNvcnRDb2x1bW4oY29sdW1uKTsKLQkJCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpbnQgc29ydERpcmVjdGlvbiA9IFNXVC5ET1dOOwotCQkJCQlpZiAoZS53aWRnZXQgPT0gdHJlZS5nZXRTb3J0Q29sdW1uKCkpIHsKLQkJCQkJCS8qIElmIHRoZSBzb3J0IGNvbHVtbiBoYXNuJ3QgY2hhbmdlZCwgY3ljbGUgZG93biAtPiB1cCAtPiBub25lLiAqLwotCQkJCQkJc3dpdGNoICh0cmVlLmdldFNvcnREaXJlY3Rpb24gKCkpIHsKLQkJCQkJCWNhc2UgU1dULkRPV046IHNvcnREaXJlY3Rpb24gPSBTV1QuVVA7IGJyZWFrOwotCQkJCQkJY2FzZSBTV1QuVVA6IHNvcnREaXJlY3Rpb24gPSBTV1QuTk9ORTsgYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cmVlLnNldFNvcnRDb2x1bW4oKFRyZWVDb2x1bW4pZS53aWRnZXQpOwotCQkJCQl9Ci0JCQkJCXRyZWUuc2V0U29ydERpcmVjdGlvbiAoc29ydERpcmVjdGlvbik7Ci0JCQkJfQotCQkJfTsKLQkJCWNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQljb2x1bW4uc2V0RGF0YSgiU29ydExpc3RlbmVyIiwgbGlzdGVuZXIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQl2b2lkIHJlc2V0U29ydFN0YXRlIChmaW5hbCBUcmVlIHRyZWUpIHsKLQkJdHJlZS5zZXRTb3J0RGlyZWN0aW9uIChTV1QuTk9ORSk7Ci0JCVRyZWVDb2x1bW4gW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKFNlbGVjdGlvbkxpc3RlbmVyKWNvbHVtbnNbaV0uZ2V0RGF0YSgiU29ydExpc3RlbmVyIik7CS8vJE5PTi1OTFMtMSQKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKSBjb2x1bW5zW2ldLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBsaW5lcyB2aXNpYmxlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldExpbmVzVmlzaWJsZSAoKSB7Ci0JCXRyZWUxLnNldExpbmVzVmlzaWJsZSAobGluZXNWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXRyZWUyLnNldExpbmVzVmlzaWJsZSAobGluZXNWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3BlY2lhbFBvcHVwTWVudUl0ZW1zKE1lbnUgbWVudSwgRXZlbnQgZXZlbnQpIHsKLSAgICAJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0gICAgCWl0ZW0uc2V0VGV4dCgiZ2V0SXRlbShQb2ludCkgb24gbW91c2UgY29vcmRpbmF0ZXMiKTsKLSAgICAJZmluYWwgVHJlZSB0ID0gKFRyZWUpIGV2ZW50LndpZGdldDsKLSAgICAJbWVudU1vdXNlQ29vcmRzID0gdC50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAJCQlldmVudENvbnNvbGUuYXBwZW5kICgiZ2V0SXRlbShQb2ludCgiICsgbWVudU1vdXNlQ29vcmRzICsgIikpIHJldHVybmVkOiAiICsgdC5nZXRJdGVtKG1lbnVNb3VzZUNvb3JkcykpOwotICAgIAkJCWV2ZW50Q29uc29sZS5hcHBlbmQgKCJcbiIpOwotICAgIAkJfTsKLSAgICAJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYmFja2dyb3VuZEltYWdlLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2JhY2tncm91bmRJbWFnZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MzJhZDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYmFja2dyb3VuZEltYWdlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2JvbGQuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYm9sZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTM2Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYm9sZC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYm9sZF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2MzQyOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYnJvd3Nlci1jb250ZW50Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9icm93c2VyLWNvbnRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4YjkzZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9icm93c2VyLWNvbnRlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+U1dUIEJyb3dzZXI8L3RpdGxlPgotPC9oZWFkPgotCi08aDM+QWJvdXQgU1dUIEJyb3dzZXI8L2gzPgotPHA+WW91IGFyZSBsb29raW5nIGF0IEhUTUwgY29udGVudCBpbiBhIDxiPkJyb3dzZXI8L2I+IHdpZGdldC4KLTx1bD4KLTxsaT5Gb3IgYSBkZWZpbml0aW9uIG9mIHRoZSBCcm93c2VyIHdpZGdldCwgc2VlOgotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvZmFxLnBocCN3aGF0aXNicm93c2VyIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9mYXEucGhwI3doYXRpc2Jyb3dzZXI8L2E+PC9saT4KLTxsaT5Gb3IgYSBsaXN0IG9mIHRoZSBwbGF0Zm9ybXMgdGhhdCBCcm93c2VyIHN1cHBvcnRzLCBzZWU6Ci08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9mYXEucGhwI2Jyb3dzZXJwbGF0Zm9ybXMiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L2ZhcS5waHAjYnJvd3NlcnBsYXRmb3JtczwvYT48L2xpPgotPGxpPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBTV1QuTU9aSUxMQSBCcm93c2VyIHN0eWxlLCBzZWU6Ci08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9mYXEucGhwI2hvd3VzZW1vemlsbGEiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L2ZhcS5waHAjaG93dXNlbW96aWxsYTwvYT48L2xpPgotPGxpPkZvciBtb3JlIGV4YW1wbGVzIHRoYXQgdXNlIGEgQnJvd3NlciB3aWRnZXQsIHNlZSBCcm93c2VyRXhhbXBsZSwgQnJvd3NlckRlbW8sIGFuZCBXZWJCcm93c2VyOgotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvZXhhbXBsZXMucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9leGFtcGxlcy5waHA8L2E+PC9saT4KLTwvdWw+PC9wPgotCi08aDM+QWJvdXQgU1dUPC9oMz4KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFNXVCwgaW5jbHVkaW5nIHRoZSBXaWRnZXQgR2FsbGVyeSwgU25pcHBldHMsIEV4YW1wbGVzLCBGQVEsIFRvb2xzLCBEb2N1bWVudGF0aW9uCi1hbmQgbW9yZSwgY2hlY2sgb3V0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0LyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Q8L2E+LjwvcD4KLQotPGgzPkVjbGlwc2UgRG93bmxvYWRzIFBhZ2U8L2gzPgotPHA+VG8gZG93bmxvYWQgdGhlIGxhdGVzdCBJbnRlZ3JhdGlvbiBCdWlsZCBvZiBlY2xpcHNlLCBnbyB0bzoKLTxhIGhyZWY9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL2Rvd25sb2Fkcy8iPmh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL2Rvd25sb2FkczwvYT4uPC9wPgotCi08aDM+QnVnIFJlcG9ydHMgYW5kIEZlYXR1cmUgUmVxdWVzdHM8L2gzPgotPHA+VG8gcmVwb3J0IGFuIFNXVCBidWcgb3IgcmVxdWVzdCBhbiBTV1QgZmVhdHVyZSwgZ28gdG86Ci08YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9UGxhdGZvcm0iPmh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzPC9hPgotYW5kIHNlbGVjdCA8Yj5Db21wb25lbnQ6IFNXVDwvYj4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9jbG9zZWRGb2xkZXIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvY2xvc2VkRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2MGQwYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9jbG9zZWRGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvaXRhbGljLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2l0YWxpYy5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMDcxZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvaXRhbGljLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2l0YWxpY19tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2l0YWxpY19tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmMjM1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9pdGFsaWNfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9vcGVuRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL29wZW5Gb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk5NDNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL29wZW5Gb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcGFyZW50QmFja2dyb3VuZEltYWdlLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3BhcmVudEJhY2tncm91bmRJbWFnZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZjU1YzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcGFyZW50QmFja2dyb3VuZEltYWdlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3JlZC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9yZWQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTU2M2ZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3JlZC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9yZWRfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9yZWRfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTljMDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcmVkX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvc3RyaWtlb3V0LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3N0cmlrZW91dC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMjFiM2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvc3RyaWtlb3V0LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3N0cmlrZW91dF9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3N0cmlrZW91dF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiNDhmYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9zdHJpa2VvdXRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS90YXJnZXQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdGFyZ2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwN2FlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS90YXJnZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdW5kZXJsaW5lLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3VuZGVybGluZS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZTI4ZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdW5kZXJsaW5lLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3VuZGVybGluZV9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3VuZGVybGluZV9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNWQ4Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS91bmRlcmxpbmVfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS95ZWxsb3cuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUveWVsbG93LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhOWMxZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS95ZWxsb3cuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUveWVsbG93X21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUveWVsbG93X21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzU5YzA4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3llbGxvd19tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9ETkRFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9kbmQvRE5ERXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZmMmFhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9ETkRFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZG5kOwotCi0gCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgRE5ERXhhbXBsZSB7Ci0JCi0JcHJpdmF0ZSBpbnQgZHJhZ09wZXJhdGlvbiA9IDA7Ci0JcHJpdmF0ZSBUcmFuc2ZlcltdIGRyYWdUeXBlcyA9IG5ldyBUcmFuc2ZlclswXTsKLQlwcml2YXRlIENvbnRyb2wgZHJhZ0NvbnRyb2w7Ci0JcHJpdmF0ZSBpbnQgZHJhZ0NvbnRyb2xUeXBlID0gMDsKLQlwcml2YXRlIERyYWdTb3VyY2UgZHJhZ1NvdXJjZTsKLQlwcml2YXRlIFN0cmluZyBkcmFnRGF0YVRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZHJhZ0RhdGFSVEY7Ci0JcHJpdmF0ZSBTdHJpbmcgZHJhZ0RhdGFIVE1MOwotCXByaXZhdGUgU3RyaW5nIGRyYWdEYXRhVVJMOwotCXByaXZhdGUgU3RyaW5nW10gZHJhZ0RhdGFGaWxlczsKLQlwcml2YXRlIExpc3QgZmlsZUxpc3Q7Ci0JcHJpdmF0ZSBib29sZWFuIGRyYWdFbmFibGVkID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBpbnQgZHJvcE9wZXJhdGlvbiA9IDA7Ci0JcHJpdmF0ZSBpbnQgZHJvcEZlZWRiYWNrID0gMDsKLQlwcml2YXRlIGludCBkcm9wRGVmYXVsdE9wZXJhdGlvbiA9IDA7Ci0JcHJpdmF0ZSBUcmFuc2ZlcltdIGRyb3BUeXBlcyA9IG5ldyBUcmFuc2ZlclswXTsKLQlwcml2YXRlIERyb3BUYXJnZXQgZHJvcFRhcmdldDsKLQlwcml2YXRlIENvbnRyb2wgZHJvcENvbnRyb2w7Ci0JcHJpdmF0ZSBpbnQgZHJvcENvbnRyb2xUeXBlID0gMDsKLQlwcml2YXRlIENvbXBvc2l0ZSBkZWZhdWx0UGFyZW50OwotCXByaXZhdGUgYm9vbGVhbiBkcm9wRW5hYmxlZCA9IGZhbHNlOwotCQotCXByaXZhdGUgVGV4dCBkcmFnQ29uc29sZTsKLQlwcml2YXRlIGJvb2xlYW4gZHJhZ0V2ZW50RGV0YWlsID0gZmFsc2U7Ci0JcHJpdmF0ZSBUZXh0IGRyb3BDb25zb2xlOwotCXByaXZhdGUgYm9vbGVhbiBkcm9wRXZlbnREZXRhaWwgPSBmYWxzZTsKLQkKLQlwcml2YXRlIEltYWdlIGl0ZW1JbWFnZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX1RPR0dMRSA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9SQURJTyA9IDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9DSEVDSyA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTlZBUyA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBQkVMID0gNDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElTVCA9IDU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQkxFID0gNjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJFRSA9IDc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFQgPSA4OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVFlMRURfVEVYVCA9IDk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTUJPID0gMTA7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlETkRFeGFtcGxlIGV4YW1wbGUgPSBuZXcgRE5ERXhhbXBsZSgpOwotCWV4YW1wbGUub3BlbihkaXNwbGF5KTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGFkZERyYWdUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JVHJhbnNmZXJbXSBuZXdUeXBlcyA9IG5ldyBUcmFuc2ZlcltkcmFnVHlwZXMubGVuZ3RoICsgMV07Ci0JU3lzdGVtLmFycmF5Y29weShkcmFnVHlwZXMsIDAsIG5ld1R5cGVzLCAwLCBkcmFnVHlwZXMubGVuZ3RoKTsKLQluZXdUeXBlc1tkcmFnVHlwZXMubGVuZ3RoXSA9IHRyYW5zZmVyOwotCWRyYWdUeXBlcyA9IG5ld1R5cGVzOwotCWlmIChkcmFnU291cmNlICE9IG51bGwpIHsKLQkJZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihkcmFnVHlwZXMpOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIGFkZERyb3BUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JVHJhbnNmZXJbXSBuZXdUeXBlcyA9IG5ldyBUcmFuc2Zlcltkcm9wVHlwZXMubGVuZ3RoICsgMV07Ci0JU3lzdGVtLmFycmF5Y29weShkcm9wVHlwZXMsIDAsIG5ld1R5cGVzLCAwLCBkcm9wVHlwZXMubGVuZ3RoKTsKLQluZXdUeXBlc1tkcm9wVHlwZXMubGVuZ3RoXSA9IHRyYW5zZmVyOwotCWRyb3BUeXBlcyA9IG5ld1R5cGVzOwotCWlmIChkcm9wVGFyZ2V0ICE9IG51bGwpIHsKLQkJZHJvcFRhcmdldC5zZXRUcmFuc2Zlcihkcm9wVHlwZXMpOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyYWdPcGVyYXRpb25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgQnV0dG9uIG1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQltb3ZlQnV0dG9uLnNldFRleHQoIkRORC5EUk9QX01PVkUiKTsKLQltb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyYWdPcGVyYXRpb24gfD0gRE5ELkRST1BfTU9WRTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiA9IGRyYWdPcGVyYXRpb24gJn5ETkQuRFJPUF9NT1ZFOwotCQkJCWlmIChkcmFnT3BlcmF0aW9uID09IDApIHsKLQkJCQkJZHJhZ09wZXJhdGlvbiA9IERORC5EUk9QX01PVkU7Ci0JCQkJCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcmFnRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyYWdTb3VyY2UoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCi0JQnV0dG9uIGNvcHlCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQljb3B5QnV0dG9uLnNldFRleHQoIkRORC5EUk9QX0NPUFkiKTsKLQljb3B5QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyYWdPcGVyYXRpb24gfD0gRE5ELkRST1BfQ09QWTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiA9IGRyYWdPcGVyYXRpb24gJn5ETkQuRFJPUF9DT1BZOwotCQkJCWlmIChkcmFnT3BlcmF0aW9uID09IDApIHsKLQkJCQkJZHJhZ09wZXJhdGlvbiA9IERORC5EUk9QX01PVkU7Ci0JCQkJCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcmFnRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyYWdTb3VyY2UoKTsKLQkJCX0KLQkJfQotCX0pOwotCi0JQnV0dG9uIGxpbmtCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQlsaW5rQnV0dG9uLnNldFRleHQoIkRORC5EUk9QX0xJTksiKTsKLQlsaW5rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyYWdPcGVyYXRpb24gfD0gRE5ELkRST1BfTElOSzsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiA9IGRyYWdPcGVyYXRpb24gJn5ETkQuRFJPUF9MSU5LOwotCQkJCWlmIChkcmFnT3BlcmF0aW9uID09IDApIHsKLQkJCQkJZHJhZ09wZXJhdGlvbiA9IERORC5EUk9QX01PVkU7Ci0JCQkJCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcmFnRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyYWdTb3VyY2UoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vaW5pdGlhbGl6ZSBzdGF0ZQotCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWNvcHlCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWxpbmtCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWRyYWdPcGVyYXRpb24gfD0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJhZ1NvdXJjZSgpIHsKLQlpZiAoZHJhZ1NvdXJjZSAhPSBudWxsKSBkcmFnU291cmNlLmRpc3Bvc2UoKTsKLQlkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UoZHJhZ0NvbnRyb2wsIGRyYWdPcGVyYXRpb24pOwotCWRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIoZHJhZ1R5cGVzKTsKLQlkcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQob3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWRyYWdDb25zb2xlLmFwcGVuZCgiPj5kcmFnRmluaXNoZWRcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlkcmFnRGF0YVRleHQgPSBkcmFnRGF0YVJURiA9IGRyYWdEYXRhSFRNTCA9IGRyYWdEYXRhVVJMID0gbnVsbDsKLQkJCWRyYWdEYXRhRmlsZXMgPSBudWxsOwotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJc3dpdGNoKGRyYWdDb250cm9sVHlwZSkgewotCQkJCQljYXNlIEJVVFRPTl9DSEVDSzoKLQkJCQkJY2FzZSBCVVRUT05fVE9HR0xFOgotCQkJCQljYXNlIEJVVFRPTl9SQURJTzogewotCQkJCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWRyYWdDb250cm9sOwotCQkJCQkJYi5zZXRUZXh0KCIiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgU1RZTEVEX1RFWFQ6IHsKLQkJCQkJCVN0eWxlZFRleHQgdGV4dCA9IChTdHlsZWRUZXh0KWRyYWdDb250cm9sOwotCQkJCQkJdGV4dC5pbnNlcnQoIiIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBUQUJMRTogewotCQkJCQkJVGFibGUgdGFibGUgPSAoVGFibGUpZHJhZ0NvbnRyb2w7Ci0JCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWl0ZW1zW2ldLmRpc3Bvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgVEVYVDogewotCQkJCQkJVGV4dCB0ZXh0ID0gKFRleHQpZHJhZ0NvbnRyb2w7Ci0JCQkJCQl0ZXh0Lmluc2VydCgiIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIFRSRUU6IHsKLQkJCQkJCVRyZWUgdHJlZSA9IChUcmVlKWRyYWdDb250cm9sOwotCQkJCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaXRlbXNbaV0uZGlzcG9zZSgpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBDQU5WQVM6IHsKLQkJCQkJCWRyYWdDb250cm9sLnNldERhdGEoIlNUUklOR1MiLCBudWxsKTsKLQkJCQkJCWRyYWdDb250cm9sLnJlZHJhdygpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBMQUJFTDogewotCQkJCQkJTGFiZWwgbGFiZWwgPSAoTGFiZWwpZHJhZ0NvbnRyb2w7Ci0JCQkJCQlsYWJlbC5zZXRUZXh0KCIiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTElTVDogewotCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpZHJhZ0NvbnRyb2w7Ci0JCQkJCQlpbnRbXSBpbmRpY2VzID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JCQkJCQlsaXN0LnJlbW92ZShpbmRpY2VzKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgQ09NQk86ewotCQkJCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pZHJhZ0NvbnRyb2w7Ci0JCQkJCQljb21iby5zZXRUZXh0KCIiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlkcmFnQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ1NldERhdGFcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlpZiAoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCWV2ZW50LmRhdGEgPSBkcmFnRGF0YVRleHQ7Ci0JCQl9Ci0JCQlpZiAoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9IGRyYWdEYXRhUlRGOwotCQkJfQotCQkJaWYgKEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCQlldmVudC5kYXRhID0gZHJhZ0RhdGFIVE1MOwotCQkJfQotCQkJaWYgKFVSTFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCWV2ZW50LmRhdGEgPSBkcmFnRGF0YVVSTDsKLQkJCX0KLQkJCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9IGRyYWdEYXRhRmlsZXM7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlkcmFnQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ1N0YXJ0XG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJZHJhZ0RhdGFGaWxlcyA9IGZpbGVMaXN0LmdldEl0ZW1zKCk7Ci0JCQlzd2l0Y2goZHJhZ0NvbnRyb2xUeXBlKSB7Ci0JCQkJY2FzZSBCVVRUT05fQ0hFQ0s6Ci0JCQkJY2FzZSBCVVRUT05fVE9HR0xFOgotCQkJCWNhc2UgQlVUVE9OX1JBRElPOiB7Ci0JCQkJCUJ1dHRvbiBiID0gKEJ1dHRvbilkcmFnQ29udHJvbDsKLQkJCQkJZHJhZ0RhdGFUZXh0ID0gYi5nZXRTZWxlY3Rpb24oKSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNUWUxFRF9URVhUOiB7Ci0JCQkJCVN0eWxlZFRleHQgdGV4dCA9IChTdHlsZWRUZXh0KWRyYWdDb250cm9sOwotCQkJCQlTdHJpbmcgcyA9IHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBzOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFRBQkxFOiB7Ci0JCQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKWRyYWdDb250cm9sOwotCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChpdGVtc1tpXS5nZXRUZXh0KCkpOwotCQkJCQkJCWlmIChpdGVtcy5sZW5ndGggPiAxICYmIGkgPCBpdGVtcy5sZW5ndGggLSAxKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZHJhZ0RhdGFUZXh0ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgVEVYVDogewotCQkJCQlUZXh0IHRleHQgPSAoVGV4dClkcmFnQ29udHJvbDsKLQkJCQkJU3RyaW5nIHMgPSB0ZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZHJhZ0RhdGFUZXh0ID0gczsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBUUkVFOiB7Ci0JCQkJCVRyZWUgdHJlZSA9IChUcmVlKWRyYWdDb250cm9sOwotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoaXRlbXNbaV0uZ2V0VGV4dCgpKTsKLQkJCQkJCQlpZiAoaXRlbXMubGVuZ3RoID4gMSAmJiBpIDwgaXRlbXMubGVuZ3RoIC0gMSkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWRyYWdEYXRhVGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIENBTlZBUzogewotCQkJCQlTdHJpbmdbXSBzdHJpbmdzID0gKFN0cmluZ1tdKWRyYWdDb250cm9sLmdldERhdGEoIlNUUklOR1MiKTsKLQkJCQkJaWYgKHN0cmluZ3MgPT0gbnVsbCB8fCBzdHJpbmdzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChzdHJpbmdzW2ldKTsKLQkJCQkJCQlpZiAoc3RyaW5ncy5sZW5ndGggPiAxICYmIGkgPCBzdHJpbmdzLmxlbmd0aCAtIDEpIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBMQUJFTDogewotCQkJCQlMYWJlbCBsYWJlbCA9IChMYWJlbClkcmFnQ29udHJvbDsKLQkJCQkJU3RyaW5nIHN0cmluZyA9IGxhYmVsLmdldFRleHQoKTsKLQkJCQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBzdHJpbmc7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTElTVDogewotCQkJCQlMaXN0IGxpc3QgPSAoTGlzdClkcmFnQ29udHJvbDsKLQkJCQkJU3RyaW5nW10gc2VsZWN0aW9uID0gbGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgewotCQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChzZWxlY3Rpb25baV0pOwotCQkJCQkJCWlmIChzZWxlY3Rpb24ubGVuZ3RoID4gMSAmJiBpIDwgc2VsZWN0aW9uLmxlbmd0aCAtIDEpIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBDT01CTzogewotCQkJCQlDb21ibyBjb21ibyA9IChDb21ibykgZHJhZ0NvbnRyb2w7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJCVBvaW50IHNlbGVjdGlvbiA9IGNvbWJvLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnggPT0gc2VsZWN0aW9uLnkpIHsKLQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRyYWdEYXRhVGV4dCA9IHN0cmluZy5zdWJzdHJpbmcoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi55KTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IFNXVEVycm9yKFNXVC5FUlJPUl9OT1RfSU1QTEVNRU5URUQpOwotCQkJfQotCQkJaWYgKGRyYWdEYXRhVGV4dCAhPSBudWxsKSB7Ci0JCQkJZHJhZ0RhdGFSVEYgPSAie1xccnRmMXtcXGNvbG9ydGJsO1xccmVkMjU1XFxncmVlbjBcXGJsdWUwO31cXGNmMVxcYiAiK2RyYWdEYXRhVGV4dCsifSI7Ci0JCQkJZHJhZ0RhdGFIVE1MID0gIjxiPiIrZHJhZ0RhdGFUZXh0KyI8L2I+IjsKLQkJCQlkcmFnRGF0YVVSTCA9ICJodHRwOi8vIiArIGRyYWdEYXRhVGV4dC5yZXBsYWNlKCcgJywgJy4nKTsKLQkJCQl0cnkgewotCQkJCQluZXcgVVJMKGRyYWdEYXRhVVJMKTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQlkcmFnRGF0YVVSTCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRyYWdUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChkcmFnVHlwZXNbaV0gaW5zdGFuY2VvZiBUZXh0VHJhbnNmZXIgJiYgZHJhZ0RhdGFUZXh0ID09IG51bGwpIHsKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoZHJhZ1R5cGVzW2ldIGluc3RhbmNlb2YgUlRGVHJhbnNmZXIgJiYgZHJhZ0RhdGFSVEYgPT0gbnVsbCkgewotCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChkcmFnVHlwZXNbaV0gaW5zdGFuY2VvZiBIVE1MVHJhbnNmZXIgJiYgZHJhZ0RhdGFIVE1MID09IG51bGwpIHsKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoZHJhZ1R5cGVzW2ldIGluc3RhbmNlb2YgVVJMVHJhbnNmZXIgJiYgZHJhZ0RhdGFVUkwgPT0gbnVsbCkgewotCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChkcmFnVHlwZXNbaV0gaW5zdGFuY2VvZiBGaWxlVHJhbnNmZXIgJiYgKGRyYWdEYXRhRmlsZXMgPT0gbnVsbCB8fCBkcmFnRGF0YUZpbGVzLmxlbmd0aCA9PSAwKSkgewotCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcmFnVHlwZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JQnV0dG9uIHRleHRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQl0ZXh0QnV0dG9uLnNldFRleHQoIlRleHQgVHJhbnNmZXIiKTsKLQl0ZXh0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWFkZERyYWdUcmFuc2ZlcihUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXJlbW92ZURyYWdUcmFuc2ZlcihUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiUlRGIFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcmFnVHJhbnNmZXIoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXJlbW92ZURyYWdUcmFuc2ZlcihSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkhUTUwgVHJhbnNmZXIiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWFkZERyYWdUcmFuc2ZlcihIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXJlbW92ZURyYWdUcmFuc2ZlcihIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJVUkwgVHJhbnNmZXIiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWFkZERyYWdUcmFuc2ZlcihVUkxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJhZ1RyYW5zZmVyKFVSTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRmlsZSBUcmFuc2ZlciIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcmFnVHJhbnNmZXIoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcmFnVHJhbnNmZXIoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJTZWxlY3QgRmlsZShzKSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhmaWxlTGlzdC5nZXRTaGVsbCgpLCBTV1QuT1BFTiB8IFNXVC5NVUxUSSk7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoKCkgPiAwKXsKLQkJCQlmaWxlTGlzdC5yZW1vdmVBbGwoKTsKLQkJCQlTdHJpbmcgc2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCQkJCVN0cmluZyBwYXRoID0gZGlhbG9nLmdldEZpbHRlclBhdGgoKTsKLQkJCQlTdHJpbmdbXSBuYW1lcyA9IGRpYWxvZy5nZXRGaWxlTmFtZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZpbGVMaXN0LmFkZChwYXRoK3NlcGFyYXRvcituYW1lc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0JZmlsZUxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQlmaWxlTGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCS8vIGluaXRpYWxpemUgc3RhdGUKLQl0ZXh0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlhZGREcmFnVHJhbnNmZXIoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJhZ1dpZGdldChDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCWNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7IlRvZ2dsZSBCdXR0b24iLCAiUmFkaW8gQnV0dG9uIiwgIkNoZWNrYm94IiwgIkNhbnZhcyIsICJMYWJlbCIsICJMaXN0IiwgIlRhYmxlIiwgIlRyZWUiLCAiVGV4dCIsICJTdHlsZWRUZXh0IiwgIkNvbWJvIn0pOwotCWNvbWJvLnNlbGVjdChMQUJFTCk7Ci0JZHJhZ0NvbnRyb2xUeXBlID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQlkcmFnQ29udHJvbCA9IGNyZWF0ZVdpZGdldChkcmFnQ29udHJvbFR5cGUsIHBhcmVudCwgIkRyYWcgU291cmNlIik7Ci0JCi0JY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU9iamVjdCBkYXRhID0gZHJhZ0NvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpOwotCQkJQ29tcG9zaXRlIHBhcmVudCA9IGRyYWdDb250cm9sLmdldFBhcmVudCgpOwotCQkJZHJhZ0NvbnRyb2wuZGlzcG9zZSgpOwotCQkJQ29tYm8gYyA9IChDb21ibyllLndpZGdldDsgCi0JCQlkcmFnQ29udHJvbFR5cGUgPSBjLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlkcmFnQ29udHJvbCA9IGNyZWF0ZVdpZGdldChkcmFnQ29udHJvbFR5cGUsIHBhcmVudCwgIkRyYWcgU291cmNlIik7Ci0JCQlkcmFnQ29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJaWYgKGRyYWdFbmFibGVkKSBjcmVhdGVEcmFnU291cmNlKCk7Ci0JCQlwYXJlbnQubGF5b3V0KCk7Ci0JCX0KLQl9KTsKLQkKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRHJhZ1NvdXJjZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWRyYWdFbmFibGVkID0gYi5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChkcmFnRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyYWdTb3VyY2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRyYWdTb3VyY2UgIT0gbnVsbCl7Ci0JCQkJCWRyYWdTb3VyY2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlkcmFnU291cmNlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0pOwotCWIuc2V0U2VsZWN0aW9uKHRydWUpOwotCWRyYWdFbmFibGVkID0gdHJ1ZTsKLQkKLQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZHJhZ0NvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21ibywgMTApOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyb3BPcGVyYXRpb25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgQnV0dG9uIG1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQltb3ZlQnV0dG9uLnNldFRleHQoIkRORC5EUk9QX01PVkUiKTsKLQltb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfTU9WRTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiA9IGRyb3BPcGVyYXRpb24gJiB+RE5ELkRST1BfTU9WRTsKLQkJCQlpZiAoZHJvcE9wZXJhdGlvbiA9PSAwIHx8IChkcm9wRGVmYXVsdE9wZXJhdGlvbiAmIERORC5EUk9QX01PVkUpICE9IDApIHsKLQkJCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9NT1ZFOwotCQkJCQltb3ZlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQotCWZpbmFsIEJ1dHRvbiBjb3B5QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JY29weUJ1dHRvbi5zZXRUZXh0KCJETkQuRFJPUF9DT1BZIik7Ci0JY29weUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX0NPUFk7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyb3BPcGVyYXRpb24gPSBkcm9wT3BlcmF0aW9uICYgfkRORC5EUk9QX0NPUFk7Ci0JCQkJaWYgKGRyb3BPcGVyYXRpb24gPT0gMCB8fCAoZHJvcERlZmF1bHRPcGVyYXRpb24gJiBETkQuRFJPUF9DT1BZKSAhPSAwKSB7Ci0JCQkJCWRyb3BPcGVyYXRpb24gPSBETkQuRFJPUF9DT1BZOwotCQkJCQljb3B5QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCWZpbmFsIEJ1dHRvbiBsaW5rQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JbGlua0J1dHRvbi5zZXRUZXh0KCJETkQuRFJPUF9MSU5LIik7Ci0JbGlua0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX0xJTks7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyb3BPcGVyYXRpb24gPSBkcm9wT3BlcmF0aW9uICYgfkRORC5EUk9QX0xJTks7Ci0JCQkJaWYgKGRyb3BPcGVyYXRpb24gPT0gMCB8fCAoZHJvcERlZmF1bHRPcGVyYXRpb24gJiBETkQuRFJPUF9MSU5LKSAhPSAwKSB7Ci0JCQkJCWRyb3BPcGVyYXRpb24gPSBETkQuRFJPUF9MSU5LOwotCQkJCQlsaW5rQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRE5ELkRST1BfREVGQVVMVCIpOwotCWRlZmF1bHRQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9ERUZBVUxUOwotCQkJCWRlZmF1bHRQYXJlbnQuc2V0VmlzaWJsZSh0cnVlKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiA9IGRyb3BPcGVyYXRpb24gJiB+RE5ELkRST1BfREVGQVVMVDsKLQkJCQlkZWZhdWx0UGFyZW50LnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JZGVmYXVsdFBhcmVudC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm1hcmdpbldpZHRoID0gMjA7Ci0JZGVmYXVsdFBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkZWZhdWx0UGFyZW50LCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiVmFsdWUgZm9yIGRlZmF1bHQgb3BlcmF0aW9uIGlzOiIpOwotCWIgPSBuZXcgQnV0dG9uKGRlZmF1bHRQYXJlbnQsIFNXVC5SQURJTyk7Ci0JYi5zZXRUZXh0KCJETkQuRFJPUF9NT1ZFIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRGVmYXVsdE9wZXJhdGlvbiA9IERORC5EUk9QX01PVkU7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9NT1ZFOwotCQkJCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24oZGVmYXVsdFBhcmVudCwgU1dULlJBRElPKTsKLQliLnNldFRleHQoIkRORC5EUk9QX0NPUFkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BEZWZhdWx0T3BlcmF0aW9uID0gRE5ELkRST1BfQ09QWTsKLQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX0NPUFk7Ci0JCQkJY29weUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCWIgPSBuZXcgQnV0dG9uKGRlZmF1bHRQYXJlbnQsIFNXVC5SQURJTyk7Ci0JYi5zZXRUZXh0KCJETkQuRFJPUF9MSU5LIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRGVmYXVsdE9wZXJhdGlvbiA9IERORC5EUk9QX0xJTks7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9MSU5LOwotCQkJCWxpbmtCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24oZGVmYXVsdFBhcmVudCwgU1dULlJBRElPKTsKLQliLnNldFRleHQoIkRORC5EUk9QX05PTkUiKTsKLQliLnNldFNlbGVjdGlvbih0cnVlKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BEZWZhdWx0T3BlcmF0aW9uID0gRE5ELkRST1BfTk9ORTsKLQkJCQlkcm9wT3BlcmF0aW9uICY9IH5ETkQuRFJPUF9ERUZBVUxUOwotCQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy8gaW5pdGlhbGl6ZSBzdGF0ZQotCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWNvcHlCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWxpbmtCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWRyb3BPcGVyYXRpb24gPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcm9wVGFyZ2V0KCkgewotCWlmIChkcm9wVGFyZ2V0ICE9IG51bGwpIGRyb3BUYXJnZXQuZGlzcG9zZSgpOwotCWRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldChkcm9wQ29udHJvbCwgZHJvcE9wZXJhdGlvbik7Ci0JZHJvcFRhcmdldC5zZXRUcmFuc2Zlcihkcm9wVHlwZXMpOwotCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiPj5kcmFnRW50ZXJcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBkcm9wRGVmYXVsdE9wZXJhdGlvbjsKLQkJCX0KLQkJCWV2ZW50LmZlZWRiYWNrID0gZHJvcEZlZWRiYWNrOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiPj5kcmFnTGVhdmVcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlkcm9wQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ09wZXJhdGlvbkNoYW5nZWRcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBkcm9wRGVmYXVsdE9wZXJhdGlvbjsKLQkJCX0KLQkJCWV2ZW50LmZlZWRiYWNrID0gZHJvcEZlZWRiYWNrOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZHJvcENvbnNvbGUuYXBwZW5kKCI+PmRyYWdPdmVyXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJZXZlbnQuZmVlZGJhY2sgPSBkcm9wRmVlZGJhY2s7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiPj5kcm9wXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJU3RyaW5nW10gc3RyaW5ncyA9IG51bGw7Ci0JCQlpZiAoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkgfHwKLQkJCSAgICBSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpIHx8Ci0JCQkgICAgSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkgfHwKLQkJCSAgICBVUkxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQkgICAgc3RyaW5ncyA9IG5ldyBTdHJpbmdbXSB7KFN0cmluZylldmVudC5kYXRhfTsKLQkJCX0KLQkJCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotCQkJCXN0cmluZ3MgPSAoU3RyaW5nW10pZXZlbnQuZGF0YTsKLQkJCX0KLQkJCWlmIChzdHJpbmdzID09IG51bGwgfHwgc3RyaW5ncy5sZW5ndGggPT0gMCkgewotCQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiISFJbnZhbGlkIGRhdGEgZHJvcHBlZCIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKHN0cmluZ3MubGVuZ3RoID09IDEgJiYgKGRyb3BDb250cm9sVHlwZSA9PSBUQUJMRSB8fCAKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wQ29udHJvbFR5cGUgPT0gVFJFRSB8fCAKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wQ29udHJvbFR5cGUgPT0gTElTVCkpIHsKLQkJCQkvLyBjb252ZXJ0IHN0cmluZyBzZXBhcmF0ZWQgYnkgIlxuIiBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MgCi0JCQkJU3RyaW5nIHN0cmluZyA9IHN0cmluZ3NbMF07Ci0JCQkJaW50IGNvdW50ID0gMDsKLQkJCQlpbnQgb2Zmc2V0ID0gc3RyaW5nLmluZGV4T2YoIlxuIiwgMCk7Ci0JCQkJd2hpbGUgKG9mZnNldCA+IDApIHsKLQkJCQkJY291bnQrKzsKLQkJCQkJb2Zmc2V0ID0gc3RyaW5nLmluZGV4T2YoIlxuIiwgb2Zmc2V0ICsgMSk7Ci0JCQkJfQotCQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQkJc3RyaW5ncyA9IG5ldyBTdHJpbmdbY291bnQgKyAxXTsKLQkJCQkJaW50IHN0YXJ0ID0gMDsKLQkJCQkJaW50IGVuZCA9IHN0cmluZy5pbmRleE9mKCJcbiIpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLQkJCQkJCXN0cmluZ3NbaW5kZXgrK10gPSBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJCQkJc3RhcnQgPSBlbmQgKyAxOwotCQkJCQkJZW5kID0gc3RyaW5nLmluZGV4T2YoIlxuIiwgc3RhcnQpOwotCQkJCQkJaWYgKGVuZCA9PSAtMSkgZW5kID0gc3RyaW5nLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3dpdGNoKGRyb3BDb250cm9sVHlwZSkgewotCQkJCWNhc2UgQlVUVE9OX0NIRUNLOgotCQkJCWNhc2UgQlVUVE9OX1RPR0dMRToKLQkJCQljYXNlIEJVVFRPTl9SQURJTzogewotCQkJCQlCdXR0b24gYiA9IChCdXR0b24pZHJvcENvbnRyb2w7Ci0JCQkJCWIuc2V0VGV4dChzdHJpbmdzWzBdKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1RZTEVEX1RFWFQ6IHsKLQkJCQkJU3R5bGVkVGV4dCB0ZXh0ID0gKFN0eWxlZFRleHQpZHJvcENvbnRyb2w7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQl0ZXh0Lmluc2VydChzdHJpbmdzW2ldKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBUQUJMRTogewotCQkJCQlUYWJsZSB0YWJsZSA9IChUYWJsZSlkcm9wQ29udHJvbDsKLQkJCQkJUG9pbnQgcCA9IGV2ZW50LmRpc3BsYXkubWFwKG51bGwsIHRhYmxlLCBldmVudC54LCBldmVudC55KTsKLQkJCQkJVGFibGVJdGVtIGRyb3BJdGVtID0gdGFibGUuZ2V0SXRlbShwKTsKLQkJCQkJaW50IGluZGV4ID0gZHJvcEl0ZW0gPT0gbnVsbCA/IHRhYmxlLmdldEl0ZW1Db3VudCgpIDogdGFibGUuaW5kZXhPZihkcm9wSXRlbSk7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQkJCQlpdGVtLnNldFRleHQoMCwgc3RyaW5nc1tpXSk7Ci0JCQkJCQlpdGVtLnNldFRleHQoMSwgImRyb3BwZWQgaXRlbSIpOwotCQkJCQl9Ci0JCQkJCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQljb2x1bW5zW2ldLnBhY2soKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBURVhUOiB7Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KWRyb3BDb250cm9sOwotCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJdGV4dC5hcHBlbmQoc3RyaW5nc1tpXSsiXG4iKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBUUkVFOiB7Ci0JCQkJCVRyZWUgdHJlZSA9IChUcmVlKWRyb3BDb250cm9sOwotCQkJCQlQb2ludCBwID0gZXZlbnQuZGlzcGxheS5tYXAobnVsbCwgdHJlZSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCVRyZWVJdGVtIHBhcmVudEl0ZW0gPSB0cmVlLmdldEl0ZW0ocCk7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlUcmVlSXRlbSBpdGVtID0gcGFyZW50SXRlbSAhPSBudWxsID8gbmV3IFRyZWVJdGVtKHBhcmVudEl0ZW0sIFNXVC5OT05FKSA6IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQkJCQlpdGVtLnNldFRleHQoc3RyaW5nc1tpXSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ0FOVkFTOiB7Ci0JCQkJCWRyb3BDb250cm9sLnNldERhdGEoIlNUUklOR1MiLCBzdHJpbmdzKTsKLQkJCQkJZHJvcENvbnRyb2wucmVkcmF3KCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIExBQkVMOiB7Ci0JCQkJCUxhYmVsIGxhYmVsID0gKExhYmVsKWRyb3BDb250cm9sOwotCQkJCQlsYWJlbC5zZXRUZXh0KHN0cmluZ3NbMF0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBMSVNUOiB7Ci0JCQkJCUxpc3QgbGlzdCA9IChMaXN0KWRyb3BDb250cm9sOwotCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJbGlzdC5hZGQoc3RyaW5nc1tpXSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ09NQk86IHsKLQkJCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pZHJvcENvbnRyb2w7Ci0JCQkJCWNvbWJvLnNldFRleHQoc3RyaW5nc1swXSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgU1dURXJyb3IoU1dULkVSUk9SX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiPj5kcm9wQWNjZXB0XG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQl9Ci0JfSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVGZWVkYmFja1R5cGVzKEdyb3VwIHBhcmVudCkgewotCXBhcmVudC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRkVFREJBQ0tfU0VMRUNUIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX1NFTEVDVDsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcEZlZWRiYWNrICY9IH5ETkQuRkVFREJBQ0tfU0VMRUNUOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRkVFREJBQ0tfU0NST0xMIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX1NDUk9MTDsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcEZlZWRiYWNrICY9IH5ETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRkVFREJBQ0tfSU5TRVJUX0JFRk9SRSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcEZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRkVFREJBQ0tfSU5TRVJUX0FGVEVSIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcEZlZWRiYWNrICY9IH5ETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRkVFREJBQ0tfRVhQQU5EIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0VYUEFORDsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcEZlZWRiYWNrICY9IH5ETkQuRkVFREJBQ0tfRVhQQU5EOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcm9wVHlwZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCXBhcmVudC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpKTsKLQlCdXR0b24gdGV4dEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCXRleHRCdXR0b24uc2V0VGV4dCgiVGV4dCBUcmFuc2ZlciIpOwotCXRleHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJvcFRyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJvcFRyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJSVEYgVHJhbnNmZXIiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWFkZERyb3BUcmFuc2ZlcihSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJvcFRyYW5zZmVyKFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiSFRNTCBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJvcFRyYW5zZmVyKEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJvcFRyYW5zZmVyKEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIlVSTCBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJvcFRyYW5zZmVyKFVSTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoVVJMVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGaWxlIFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcm9wVHJhbnNmZXIoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy8gaW5pdGlhbGl6ZSBzdGF0ZQotCXRleHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWFkZERyb3BUcmFuc2ZlcihUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcm9wV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JY29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsiVG9nZ2xlIEJ1dHRvbiIsICJSYWRpbyBCdXR0b24iLCAiQ2hlY2tib3giLCAiQ2FudmFzIiwgIkxhYmVsIiwgIkxpc3QiLCAiVGFibGUiLCAiVHJlZSIsICJUZXh0IiwgIlN0eWxlZFRleHQiLCAiQ29tYm8ifSk7Ci0JY29tYm8uc2VsZWN0KExBQkVMKTsKLQlkcm9wQ29udHJvbFR5cGUgPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCWRyb3BDb250cm9sID0gY3JlYXRlV2lkZ2V0KGRyb3BDb250cm9sVHlwZSwgcGFyZW50LCAiRHJvcCBUYXJnZXQiKTsKLQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJT2JqZWN0IGRhdGEgPSBkcm9wQ29udHJvbC5nZXRMYXlvdXREYXRhKCk7Ci0JCQlDb21wb3NpdGUgcGFyZW50ID0gZHJvcENvbnRyb2wuZ2V0UGFyZW50KCk7Ci0JCQlkcm9wQ29udHJvbC5kaXNwb3NlKCk7Ci0JCQlDb21ibyBjID0gKENvbWJvKWUud2lkZ2V0OwotCQkJZHJvcENvbnRyb2xUeXBlID0gYy5nZXRTZWxlY3Rpb25JbmRleCgpOyAKLQkJCWRyb3BDb250cm9sID0gY3JlYXRlV2lkZ2V0KGRyb3BDb250cm9sVHlwZSwgcGFyZW50LCAiRHJvcCBUYXJnZXQiKTsKLQkJCWRyb3BDb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlpZiAoZHJvcEVuYWJsZWQpIGNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCXBhcmVudC5sYXlvdXQoKTsKLQkJfQotCX0pOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJEcm9wVGFyZ2V0Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJZHJvcEVuYWJsZWQgPSBiLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZHJvcFRhcmdldCAhPSBudWxsKXsKLQkJCQkJZHJvcFRhcmdldC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWRyb3BUYXJnZXQgPSBudWxsOwotCQkJfQotCQl9Ci0JfSk7Ci0JLy8gaW5pdGlhbGl6ZSBzdGF0ZQotCWIuc2V0U2VsZWN0aW9uKHRydWUpOwotCWRyb3BFbmFibGVkID0gdHJ1ZTsKLQkKLQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZHJvcENvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21ibywgMTApOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLX0KLQotcHJpdmF0ZSBDb250cm9sIGNyZWF0ZVdpZGdldChpbnQgdHlwZSwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHByZWZpeCl7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgQlVUVE9OX0NIRUNLOiB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCQlidXR0b24uc2V0VGV4dChwcmVmaXgrIiBDaGVjayBib3giKTsKLQkJCXJldHVybiBidXR0b247Ci0JCX0KLQkJY2FzZSBCVVRUT05fVE9HR0xFOiB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5UT0dHTEUpOwotCQkJYnV0dG9uLnNldFRleHQocHJlZml4KyIgVG9nZ2xlIGJ1dHRvbiIpOwotCQkJcmV0dXJuIGJ1dHRvbjsKLQkJfQotCQljYXNlIEJVVFRPTl9SQURJTzogewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQkJYnV0dG9uLnNldFRleHQocHJlZml4KyIgUmFkaW8gYnV0dG9uIik7Ci0JCQlyZXR1cm4gYnV0dG9uOwotCQl9Ci0JCWNhc2UgU1RZTEVEX1RFWFQ6IHsKLQkJCVN0eWxlZFRleHQgdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQl0ZXh0LnNldFRleHQocHJlZml4KyIgU3R5bGVkIFRleHQiKTsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWNhc2UgVEFCTEU6IHsKLQkJCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkJVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQkJY29sdW1uMC5zZXRUZXh0KCJOYW1lIik7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuUklHSFQpOwotCQkJY29sdW1uMS5zZXRUZXh0KCJWYWx1ZSIpOwotCQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCQljb2x1bW4yLnNldFRleHQoIkRlc2NyaXB0aW9uIik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCQlpdGVtLnNldFRleHQoMCwgcHJlZml4KyIgbmFtZSAiK2kpOwotCQkJCWl0ZW0uc2V0VGV4dCgxLCBwcmVmaXgrIiB2YWx1ZSAiK2kpOwotCQkJCWl0ZW0uc2V0VGV4dCgyLCBwcmVmaXgrIiBkZXNjcmlwdGlvbiAiK2kpOwotCQkJCWl0ZW0uc2V0SW1hZ2UoaXRlbUltYWdlKTsKLQkJCX0KLQkJCWNvbHVtbjAucGFjaygpOwotCQkJY29sdW1uMS5wYWNrKCk7Ci0JCQljb2x1bW4yLnBhY2soKTsKLQkJCXJldHVybiB0YWJsZTsKLQkJfQotCQljYXNlIFRFWFQ6IHsKLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQl0ZXh0LnNldFRleHQocHJlZml4KyIgVGV4dCIpOwotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJY2FzZSBUUkVFOiB7Ci0JCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkJVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQkJY29sdW1uMC5zZXRUZXh0KCJOYW1lIik7Ci0JCQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuUklHSFQpOwotCQkJY29sdW1uMS5zZXRUZXh0KCJWYWx1ZSIpOwotCQkJVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCQljb2x1bW4yLnNldFRleHQoIkRlc2NyaXB0aW9uIik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dCgwLCBwcmVmaXgrIiBuYW1lICIraSk7Ci0JCQkJaXRlbS5zZXRUZXh0KDEsIHByZWZpeCsiIHZhbHVlICIraSk7Ci0JCQkJaXRlbS5zZXRUZXh0KDIsIHByZWZpeCsiIGRlc2NyaXB0aW9uICIraSk7Ci0JCQkJaXRlbS5zZXRJbWFnZShpdGVtSW1hZ2UpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7Ci0JCQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCQlzdWJJdGVtLnNldFRleHQoMCwgcHJlZml4KyIgbmFtZSAiK2krIiAiK2opOwotCQkJCQlzdWJJdGVtLnNldFRleHQoMSwgcHJlZml4KyIgdmFsdWUgIitpKyIgIitqKTsKLQkJCQkJc3ViSXRlbS5zZXRUZXh0KDIsIHByZWZpeCsiIGRlc2NyaXB0aW9uICIraSsiICIraik7Ci0JCQkJCXN1Ykl0ZW0uc2V0SW1hZ2UoaXRlbUltYWdlKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCAzOyBrKyspIHsKLQkJCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCQkJc3Vic3ViSXRlbS5zZXRUZXh0KDAsIHByZWZpeCsiIG5hbWUgIitpKyIgIitqKyIgIitrKTsKLQkJCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCgxLCBwcmVmaXgrIiB2YWx1ZSAiK2krIiAiK2orIiAiK2spOwotCQkJCQkJc3Vic3ViSXRlbS5zZXRUZXh0KDIsIHByZWZpeCsiIGRlc2NyaXB0aW9uICIraSsiICIraisiICIrayk7Ci0JCQkJCQlzdWJzdWJJdGVtLnNldEltYWdlKGl0ZW1JbWFnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb2x1bW4wLnBhY2soKTsKLQkJCWNvbHVtbjEucGFjaygpOwotCQkJY29sdW1uMi5wYWNrKCk7Ci0JCQlyZXR1cm4gdHJlZTsKLQkJfQotCQljYXNlIENBTlZBUzogewotCQkJQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWNhbnZhcy5zZXREYXRhKCJTVFJJTkdTIiwgbmV3IFN0cmluZ1tdIHtwcmVmaXgrIiBDYW52YXMgd2lkZ2V0In0pOwotCQkJY2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCQlDYW52YXMgYyA9IChDYW52YXMpZS53aWRnZXQ7Ci0JCQkJCUltYWdlIGltYWdlID0gKEltYWdlKWMuZ2V0RGF0YSgiSU1BR0UiKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlLCA1LCA1KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ1tdIHN0cmluZ3MgPSAoU3RyaW5nW10pYy5nZXREYXRhKCJTVFJJTkdTIik7Ci0JCQkJCQlpZiAoc3RyaW5ncyAhPSBudWxsKSB7Ci0JCQkJCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGUuZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJCQkJCQlpbnQgaGVpZ2h0ID0gbWV0cmljcy5nZXRIZWlnaHQoKTsKLQkJCQkJCQlpbnQgeSA9IDU7Ci0JCQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJZS5nYy5kcmF3U3RyaW5nKHN0cmluZ3NbaV0sIDUsIHkpOwotCQkJCQkJCQl5ICs9IGhlaWdodCArIDU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gY2FudmFzOwotCQl9Ci0JCWNhc2UgTEFCRUw6IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCQlsYWJlbC5zZXRUZXh0KHByZWZpeCsiIExhYmVsIik7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQkJY2FzZSBMSVNUOiB7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQkJbGlzdC5zZXRJdGVtcyhuZXcgU3RyaW5nW10ge3ByZWZpeCsiIEl0ZW0gYSIsIHByZWZpeCsiIEl0ZW0gYiIsICBwcmVmaXgrIiBJdGVtIGMiLCAgcHJlZml4KyIgSXRlbSBkIn0pOwotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQkJY2FzZSBDT01CTzp7Ci0JCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCQkJY29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsiSXRlbSBhIiwgIkl0ZW0gYiIsICJJdGVtIGMiLCAiSXRlbSBkIn0pOwotCQkJcmV0dXJuIGNvbWJvOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgU1dURXJyb3IoU1dULkVSUk9SX05PVF9JTVBMRU1FTlRFRCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBvcGVuKERpc3BsYXkgZGlzcGxheSkgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkRyYWcgYW5kIERyb3AgRXhhbXBsZSIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlpdGVtSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIEROREV4YW1wbGUuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgib3BlbkZvbGRlci5naWYiKSk7Ci0KLQlTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShzYywgU1dULk5PTkUpOwotCXNjLnNldENvbnRlbnQocGFyZW50KTsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQotCUxhYmVsIGRyYWdMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQlkcmFnTGFiZWwuc2V0VGV4dCgiRHJhZyBTb3VyY2U6Iik7Ci0JCi0JR3JvdXAgZHJhZ1dpZGdldEdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCWRyYWdXaWRnZXRHcm91cC5zZXRUZXh0KCJXaWRnZXQiKTsKLQljcmVhdGVEcmFnV2lkZ2V0KGRyYWdXaWRnZXRHcm91cCk7Ci0JCi0JQ29tcG9zaXRlIGNMZWZ0ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljTGVmdC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQlHcm91cCBkcmFnT3BlcmF0aW9uc0dyb3VwID0gbmV3IEdyb3VwKGNMZWZ0LCBTV1QuTk9ORSk7Ci0JZHJhZ09wZXJhdGlvbnNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOwotCWRyYWdPcGVyYXRpb25zR3JvdXAuc2V0VGV4dCgiQWxsb3dlZCBPcGVyYXRpb24ocyk6Iik7Ci0JY3JlYXRlRHJhZ09wZXJhdGlvbnMoZHJhZ09wZXJhdGlvbnNHcm91cCk7Ci0JCi0JR3JvdXAgZHJhZ1R5cGVzR3JvdXAgPSBuZXcgR3JvdXAoY0xlZnQsIFNXVC5OT05FKTsKLQlkcmFnVHlwZXNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsKLQlkcmFnVHlwZXNHcm91cC5zZXRUZXh0KCJUcmFuc2ZlciBUeXBlKHMpOiIpOwotCWNyZWF0ZURyYWdUeXBlcyhkcmFnVHlwZXNHcm91cCk7Ci0JCi0JZHJhZ0NvbnNvbGUgPSBuZXcgVGV4dChjTGVmdCwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIgfFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSSk7Ci0JZHJhZ0NvbnNvbGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0ICgiQ2xlYXIiKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlkcmFnQ29uc29sZS5zZXRUZXh0KCIiKTsKLQkJfQotCX0pOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5DSEVDSyk7Ci0JaXRlbS5zZXRUZXh0ICgiU2hvdyBFdmVudCBkZXRhaWwiKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKWUud2lkZ2V0OwotCQkJZHJhZ0V2ZW50RGV0YWlsID0gaXRlbS5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCX0pOwotCWRyYWdDb25zb2xlLnNldE1lbnUobWVudSk7Ci0JCi0JTGFiZWwgZHJvcExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCWRyb3BMYWJlbC5zZXRUZXh0KCJEcm9wIFRhcmdldDoiKTsKLQkKLQlHcm91cCBkcm9wV2lkZ2V0R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JZHJvcFdpZGdldEdyb3VwLnNldFRleHQoIldpZGdldCIpOwotCWNyZWF0ZURyb3BXaWRnZXQoZHJvcFdpZGdldEdyb3VwKTsKLQkKLQlDb21wb3NpdGUgY1JpZ2h0ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljUmlnaHQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JR3JvdXAgZHJvcE9wZXJhdGlvbnNHcm91cCA9IG5ldyBHcm91cChjUmlnaHQsIFNXVC5OT05FKTsKLQlkcm9wT3BlcmF0aW9uc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlLCAxLCAyKSk7Ci0JZHJvcE9wZXJhdGlvbnNHcm91cC5zZXRUZXh0KCJBbGxvd2VkIE9wZXJhdGlvbihzKToiKTsKLQljcmVhdGVEcm9wT3BlcmF0aW9ucyhkcm9wT3BlcmF0aW9uc0dyb3VwKTsKLQkKLQlHcm91cCBkcm9wVHlwZXNHcm91cCA9IG5ldyBHcm91cChjUmlnaHQsIFNXVC5OT05FKTsKLQlkcm9wVHlwZXNHcm91cC5zZXRUZXh0KCJUcmFuc2ZlciBUeXBlKHMpOiIpOwotCWNyZWF0ZURyb3BUeXBlcyhkcm9wVHlwZXNHcm91cCk7Ci0JCi0JR3JvdXAgZmVlZGJhY2tUeXBlc0dyb3VwID0gbmV3IEdyb3VwKGNSaWdodCwgU1dULk5PTkUpOwotCWZlZWRiYWNrVHlwZXNHcm91cC5zZXRUZXh0KCJGZWVkYmFjayBUeXBlKHMpOiIpOwotCWNyZWF0ZUZlZWRiYWNrVHlwZXMoZmVlZGJhY2tUeXBlc0dyb3VwKTsKLQkKLQlkcm9wQ29uc29sZSA9IG5ldyBUZXh0KGNSaWdodCwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIgfFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSSk7Ci0JZHJvcENvbnNvbGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAoIkNsZWFyIik7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJZHJvcENvbnNvbGUuc2V0VGV4dCgiIik7Ci0JCX0KLQl9KTsKLQlpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuQ0hFQ0spOwotCWl0ZW0uc2V0VGV4dCAoIlNob3cgRXZlbnQgZGV0YWlsIik7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSllLndpZGdldDsKLQkJCWRyb3BFdmVudERldGFpbCA9IGl0ZW0uZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQl9KTsKLQlkcm9wQ29uc29sZS5zZXRNZW51KG1lbnUpOwotCQotCWlmIChkcmFnRW5hYmxlZCkgY3JlYXRlRHJhZ1NvdXJjZSgpOwotCWlmIChkcm9wRW5hYmxlZCkgY3JlYXRlRHJvcFRhcmdldCgpOwotCQotCWludCBoZWlnaHQgPSAyMDA7Ci0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRyYWdMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkcmFnTGFiZWwsIDEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIC0xMCk7Ci0JZGF0YS5oZWlnaHQgPSBoZWlnaHQ7Ci0JZHJhZ1dpZGdldEdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRyYWdXaWRnZXRHcm91cCwgMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgLTEwKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JY0xlZnQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMZWZ0LCAxMCk7Ci0JZHJvcExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRyb3BMYWJlbCwgMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGVmdCwgMTApOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRhdGEuaGVpZ2h0ID0gaGVpZ2h0OwotCWRyb3BXaWRnZXRHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkcm9wV2lkZ2V0R3JvdXAsIDEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xlZnQsIDEwKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JY1JpZ2h0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCXNjLnNldE1pblNpemUocGFyZW50LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCXNjLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0Jc2Muc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCi0JUG9pbnQgc2l6ZSA9IHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUmVjdGFuZ2xlIG1vbml0b3JBcmVhID0gc2hlbGwuZ2V0TW9uaXRvcigpLmdldENsaWVudEFyZWEoKTsKLQlzaGVsbC5zZXRTaXplKE1hdGgubWluKHNpemUueCwgbW9uaXRvckFyZWEud2lkdGggLSAyMCksIE1hdGgubWluKHNpemUueSwgbW9uaXRvckFyZWEuaGVpZ2h0IC0gMjApKTsKLQlzaGVsbC5vcGVuKCk7Ci0JCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JaXRlbUltYWdlLmRpc3Bvc2UoKTsKLX0KLQotcHJpdmF0ZSB2b2lkIHByaW50RXZlbnQoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQlpZiAoIWRyYWdFdmVudERldGFpbCkgcmV0dXJuOwotCWRyYWdDb25zb2xlLmFwcGVuZChlLnRvU3RyaW5nKCkgKyAiXG4iKTsKLX0KLQotcHJpdmF0ZSB2b2lkIHByaW50RXZlbnQoRHJvcFRhcmdldEV2ZW50IGUpIHsKLQlpZiAoIWRyb3BFdmVudERldGFpbCkgcmV0dXJuOwotCWRyb3BDb25zb2xlLmFwcGVuZChlLnRvU3RyaW5nKCkgKyAiXG4iKTsKLX0KLQotcHJpdmF0ZSB2b2lkIHJlbW92ZURyYWdUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JaWYgKGRyYWdUeXBlcy5sZW5ndGggPT0gMSkgewotCQlkcmFnVHlwZXMgPSBuZXcgVHJhbnNmZXJbMF07Ci0JfSBlbHNlIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBkcmFnVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkcmFnVHlwZXNbaV0gPT0gdHJhbnNmZXIpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ID09IC0xKSByZXR1cm47Ci0JCVRyYW5zZmVyW10gbmV3VHlwZXMgPSBuZXcgVHJhbnNmZXJbZHJhZ1R5cGVzLmxlbmd0aCAtIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRyYWdUeXBlcywgMCwgbmV3VHlwZXMsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShkcmFnVHlwZXMsIGluZGV4ICsgMSwgbmV3VHlwZXMsIGluZGV4LCBkcmFnVHlwZXMubGVuZ3RoIC0gaW5kZXggLSAxKTsKLQkJZHJhZ1R5cGVzID0gbmV3VHlwZXM7Ci0JfQotCWlmIChkcmFnU291cmNlICE9IG51bGwpIHsKLQkJZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihkcmFnVHlwZXMpOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIHJlbW92ZURyb3BUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JaWYgKGRyb3BUeXBlcy5sZW5ndGggPT0gMSkgewotCQlkcm9wVHlwZXMgPSBuZXcgVHJhbnNmZXJbMF07Ci0JfSBlbHNlIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBkcm9wVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkcm9wVHlwZXNbaV0gPT0gdHJhbnNmZXIpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ID09IC0xKSByZXR1cm47Ci0JCVRyYW5zZmVyW10gbmV3VHlwZXMgPSBuZXcgVHJhbnNmZXJbZHJvcFR5cGVzLmxlbmd0aCAtIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRyb3BUeXBlcywgMCwgbmV3VHlwZXMsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShkcm9wVHlwZXMsIGluZGV4ICsgMSwgbmV3VHlwZXMsIGluZGV4LCBkcm9wVHlwZXMubGVuZ3RoIC0gaW5kZXggLSAxKTsKLQkJZHJvcFR5cGVzID0gbmV3VHlwZXM7Ci0JfQotCWlmIChkcm9wVGFyZ2V0ICE9IG51bGwpIHsKLQkJZHJvcFRhcmdldC5zZXRUcmFuc2Zlcihkcm9wVHlwZXMpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9vcGVuRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9vcGVuRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5OTQzZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9kbmQvb3BlbkZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ZpbGVWaWV3ZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvRmlsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzNkOGMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvRmlsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmZpbGV2aWV3ZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogRmlsZSBWaWV3ZXIgZXhhbXBsZQotICovCi1wdWJsaWMgY2xhc3MgRmlsZVZpZXdlciB7IAotIAlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfZmlsZXZpZXdlciIpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERSSVZFX0EgPSAiYToiICsgRmlsZS5zZXBhcmF0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERSSVZFX0IgPSAiYjoiICsgRmlsZS5zZXBhcmF0b3I7Ci0KLQkvKiBVSSBlbGVtZW50cyAqLyAJCi0JcHJpdmF0ZSBEaXNwbGF5IGRpc3BsYXk7IAotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JcHJpdmF0ZSBUb29sQmFyIHRvb2xCYXI7Ci0KLQlwcml2YXRlIExhYmVsIG51bU9iamVjdHNMYWJlbDsKLQlwcml2YXRlIExhYmVsIGRpc2tTcGFjZUxhYmVsOwotCQotCXByaXZhdGUgRmlsZSBjdXJyZW50RGlyZWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbCA9IHRydWU7Ci0JCi0JLyogRHJhZyBhbmQgZHJvcCBvcHRpbWl6YXRpb25zICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gaWYgdGhpcyBhcHAgaXMgZHJhZ2dpbmcKLQlwcml2YXRlIGJvb2xlYW4gaXNEcm9wcGluZyA9IGZhbHNlOyAvLyBpZiB0aGlzIGFwcCBpcyBkcm9wcGluZwotCi0JcHJpdmF0ZSBGaWxlW10gIHByb2Nlc3NlZERyb3BGaWxlcyA9IG51bGw7IC8vIHNvIERyYWcgb25seSBkZWxldGVzIHdoYXQgaXQgbmVlZHMgdG8KLQlwcml2YXRlIEZpbGVbXSAgZGVmZXJyZWRSZWZyZXNoRmlsZXMgPSBudWxsOyAgICAgIC8vIHRvIGRlZmVyIG5vdGlmeVJlZnJlc2hGaWxlcyB3aGlsZSB3ZSBkbyBETkQKLQlwcml2YXRlIGJvb2xlYW4gZGVmZXJyZWRSZWZyZXNoUmVxdWVzdGVkID0gZmFsc2U7IC8vIHRvIGRlZmVyIG5vdGlmeVJlZnJlc2hGaWxlcyB3aGlsZSB3ZSBkbyBETkQKLQlwcml2YXRlIFByb2dyZXNzRGlhbG9nIHByb2dyZXNzRGlhbG9nID0gbnVsbDsgLy8gcHJvZ3Jlc3MgZGlhbG9nIGZvciBsb2NhbGx5LWluaXRpYXRlZCBvcGVyYXRpb25zCi0KLQkvKiBDb21ibyB2aWV3ICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTUJPREFUQV9ST09UUyA9ICJDb21iby5yb290cyI7Ci0JCS8vIEZpbGVbXTogQXJyYXkgb2YgZmlsZXMgd2hvc2UgcGF0aHMgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIGNvbWJvCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTUJPREFUQV9MQVNUVEVYVCA9ICJDb21iby5sYXN0VGV4dCI7Ci0JCS8vIFN0cmluZzogUHJldmlvdXMgc2VsZWN0aW9uIHRleHQgc3RyaW5nCi0KLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCi0JLyogVHJlZSB2aWV3ICovCi0JcHJpdmF0ZSBJY29uQ2FjaGUgaWNvbkNhY2hlID0gbmV3IEljb25DYWNoZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFSVRFTURBVEFfRklMRSA9ICJUcmVlSXRlbS5maWxlIjsKLQkJLy8gRmlsZTogRmlsZSBhc3NvY2lhdGVkIHdpdGggdHJlZSBpdGVtCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVJVEVNREFUQV9JTUFHRUVYUEFOREVEID0gIlRyZWVJdGVtLmltYWdlRXhwYW5kZWQiOwotCQkvLyBJbWFnZTogc2hvd24gd2hlbiBpdGVtIGlzIGV4cGFuZGVkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVJVEVNREFUQV9JTUFHRUNPTExBUFNFRCA9ICJUcmVlSXRlbS5pbWFnZUNvbGxhcHNlZCI7Ci0JCS8vIEltYWdlOiBzaG93biB3aGVuIGl0ZW0gaXMgY29sbGFwc2VkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVJVEVNREFUQV9TVFVCID0gIlRyZWVJdGVtLnN0dWIiOwotCQkvLyBPYmplY3Q6IGlmIG5vdCBwcmVzZW50IG9yIG51bGwgdGhlbiB0aGUgaXRlbSBoYXMgbm90IGJlZW4gcG9wdWxhdGVkCi0KLQlwcml2YXRlIFRyZWUgdHJlZTsKLQlwcml2YXRlIExhYmVsIHRyZWVTY29wZUxhYmVsOwotCi0JLyogVGFibGUgdmlldyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgKLQkJRGF0ZUZvcm1hdC5NRURJVU0sIERhdGVGb3JtYXQuTUVESVVNKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVJVEVNREFUQV9GSUxFID0gIlRhYmxlSXRlbS5maWxlIjsKLQkJLy8gRmlsZTogRmlsZSBhc3NvY2lhdGVkIHdpdGggdGFibGUgcm93Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFREFUQV9ESVIgPSAiVGFibGUuZGlyIjsKLQkJLy8gRmlsZTogQ3VycmVudGx5IHZpc2libGUgZGlyZWN0b3J5Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gdGFibGVXaWR0aHMgPSBuZXcgaW50W10gezE1MCwgNjAsIDc1LCAxNTB9OwotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gdGFibGVUaXRsZXMgPSBuZXcgU3RyaW5nIFtdIHsKLQkJRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygidGFibGUuTmFtZS50aXRsZSIpLAotCQlGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJ0YWJsZS5TaXplLnRpdGxlIiksCi0JCUZpbGVWaWV3ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInRhYmxlLlR5cGUudGl0bGUiKSwKLQkJRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygidGFibGUuTW9kaWZpZWQudGl0bGUiKQotCX07Ci0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIExhYmVsIHRhYmxlQ29udGVudHNPZkxhYmVsOwotCi0JLyogVGFibGUgdXBkYXRlIHdvcmtlciAqLwotCS8vIENvbnRyb2wgZGF0YQotCXByaXZhdGUgZmluYWwgT2JqZWN0IHdvcmtlckxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0JCS8vIExvY2sgZm9yIGFsbCB3b3JrZXIgY29udHJvbCBkYXRhIGFuZCBzdGF0ZQotCXByaXZhdGUgdm9sYXRpbGUgVGhyZWFkICB3b3JrZXJUaHJlYWQgPSBudWxsOwotCQkvLyBUaGUgd29ya2VyJ3MgdGhyZWFkCi0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHdvcmtlclN0b3BwZWQgPSBmYWxzZTsKLQkJLy8gVHJ1ZSBpZiB0aGUgd29ya2VyIG11c3QgZXhpdCBvbiBjb21wbGV0aW9uIG9mIHRoZSBjdXJyZW50IGN5Y2xlCi0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHdvcmtlckNhbmNlbGxlZCA9IGZhbHNlOwotCQkvLyBUcnVlIGlmIHRoZSB3b3JrZXIgbXVzdCBjYW5jZWwgaXRzIG9wZXJhdGlvbnMgcHJlbWF0dXJlbHkgcGVyaGFwcyBkdWUgdG8gYSBzdGF0ZSB1cGRhdGUKLQotCS8vIFdvcmtlciBzdGF0ZSBpbmZvcm1hdGlvbiAtLSB0aGlzIGlzIHdoYXQgZ2V0cyBzeW5jaHJvbml6ZWQgYnkgYW4gdXBkYXRlCi0JcHJpdmF0ZSB2b2xhdGlsZSBGaWxlIHdvcmtlclN0YXRlRGlyID0gbnVsbDsKLQotCS8vIFN0YXRlIGluZm9ybWF0aW9uIHRvIHVzZSBmb3IgdGhlIG5leHQgY3ljbGUKLQlwcml2YXRlIHZvbGF0aWxlIEZpbGUgd29ya2VyTmV4dERpciA9IG51bGw7Ci0KLQkvKiBTaW11bGF0ZSBvbmx5IGZsYWcgKi8KLQkvLyB3aGVuIHRydWUsIGRpc2FibGVzIGFjdHVhbCBmaWxlc3lzdGVtIG1hbmlwdWxhdGlvbnMgYW5kIG91dHB1dHMgcmVzdWx0cyB0byBzdGFuZGFyZCBvdXQKLQlwcml2YXRlIGJvb2xlYW4gc2ltdWxhdGVPbmx5ID0gdHJ1ZTsKLQotCS8qKgotCSAqIFJ1bnMgbWFpbiBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQkJRmlsZVZpZXdlciBhcHBsaWNhdGlvbiA9IG5ldyBGaWxlVmlld2VyKCk7Ci0JCVNoZWxsIHNoZWxsID0gYXBwbGljYXRpb24ub3BlbihkaXNwbGF5KTsKLQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJYXBwbGljYXRpb24uY2xvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIG1haW4gcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgU2hlbGwgb3BlbihEaXNwbGF5IGRpc3BsYXkpIHsJCQotCQkvLyBDcmVhdGUgdGhlIHdpbmRvdwotCQl0aGlzLmRpc3BsYXkgPSBkaXNwbGF5OwotCQlpY29uQ2FjaGUuaW5pdFJlc291cmNlcyhkaXNwbGF5KTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJY3JlYXRlU2hlbGxDb250ZW50cygpOwotCQlub3RpZnlSZWZyZXNoRmlsZXMobnVsbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgbWFpbiBwcm9ncmFtLgotCSAqLwotCXZvaWQgY2xvc2UoKSB7Ci0JCXdvcmtlclN0b3AoKTsKLQkJaWNvbkNhY2hlLmZyZWVSZXNvdXJjZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB0aGUgVUkKLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBTaGVsbENvbnRhaW5lciBtYW5hZ2luZyB0aGUgU2hlbGwgd2UgYXJlIHJlbmRlcmluZyBpbnNpZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2hlbGxDb250ZW50cygpIHsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiLCBuZXcgT2JqZWN0W10geyAiIiB9KSk7CQotCQlzaGVsbC5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLnNoZWxsSWNvbl0pOwotCQlNZW51IGJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJc2hlbGwuc2V0TWVudUJhcihiYXIpOwotCQljcmVhdGVGaWxlTWVudShiYXIpOwotCQljcmVhdGVIZWxwTWVudShiYXIpOwotCi0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXNoZWxsLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxODU7Ci0JCWNyZWF0ZUNvbWJvVmlldyhzaGVsbCwgZ3JpZERhdGEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNyZWF0ZVRvb2xCYXIoc2hlbGwsIGdyaWREYXRhKTsKLQotCQlTYXNoRm9ybSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShzaGVsbCwgU1dULk5PTkUpOwotCQlzYXNoRm9ybS5zZXRPcmllbnRhdGlvbihTV1QuSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNhc2hGb3JtLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljcmVhdGVUcmVlVmlldyhzYXNoRm9ybSk7Ci0JCWNyZWF0ZVRhYmxlVmlldyhzYXNoRm9ybSk7Ci0JCXNhc2hGb3JtLnNldFdlaWdodHMobmV3IGludFtdIHsgMiwgNSB9KTsKLQotCQludW1PYmplY3RzTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTg1OwotCQludW1PYmplY3RzTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlkaXNrU3BhY2VMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRpc2tTcGFjZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBGaWxlIE1lbnUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG1lbnUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRmlsZU1lbnUoTWVudSBwYXJlbnQpIHsKLQkJTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQkJTWVudUl0ZW0gaGVhZGVyID0gbmV3IE1lbnVJdGVtKHBhcmVudCwgU1dULkNBU0NBREUpOwotCQloZWFkZXIuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygibWVudS5GaWxlLnRleHQiKSk7Ci0JCWhlYWRlci5zZXRNZW51KG1lbnUpOwotCi0JCWZpbmFsIE1lbnVJdGVtIHNpbXVsYXRlSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0hFQ0spOwotCQlzaW11bGF0ZUl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygibWVudS5GaWxlLlNpbXVsYXRlT25seS50ZXh0IikpOwotCQlzaW11bGF0ZUl0ZW0uc2V0U2VsZWN0aW9uKHNpbXVsYXRlT25seSk7Ci0JCXNpbXVsYXRlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2ltdWxhdGVPbmx5ID0gc2ltdWxhdGVJdGVtLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJtZW51LkZpbGUuQ2xvc2UudGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEhlbHAgTWVudS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgbWVudQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVIZWxwTWVudShNZW51IHBhcmVudCkgewotCQlNZW51IG1lbnUgPSBuZXcgTWVudShwYXJlbnQpOwotCQlNZW51SXRlbSBoZWFkZXIgPSBuZXcgTWVudUl0ZW0ocGFyZW50LCBTV1QuQ0FTQ0FERSk7Ci0JCWhlYWRlci5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJtZW51LkhlbHAudGV4dCIpKTsKLQkJaGVhZGVyLnNldE1lbnUobWVudSk7Ci0KLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygibWVudS5IZWxwLkFib3V0LnRleHQiKSk7CQkKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fSU5GT1JNQVRJT04gfCBTV1QuT0spOwotCQkJCWJveC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuQWJvdXQudGl0bGUiKSk7Ci0JCQkJYm94LnNldE1lc3NhZ2UoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5BYm91dC5kZXNjcmlwdGlvbiIsCi0JCQkJCW5ldyBPYmplY3RbXSB7IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpIH0pKTsKLQkJCQlib3gub3BlbigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0b29sYmFyCi0JICogCi0JICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCBvbiB3aGljaCB0byBhdHRhY2ggdGhlIHRvb2xiYXIKLQkgKiBAcGFyYW0gbGF5b3V0RGF0YSB0aGUgbGF5b3V0IGRhdGEKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVG9vbEJhcihmaW5hbCBTaGVsbCBzaGVsbCwgT2JqZWN0IGxheW91dERhdGEpIHsKLQkJdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXRvb2xCYXIuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRQYXJlbnRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5QYXJlbnQudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZG9QYXJlbnQoKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kUmVmcmVzaF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLlJlZnJlc2gudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZG9SZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCQlTZWxlY3Rpb25BZGFwdGVyIHVuaW1wbGVtZW50ZWRMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0lORk9STUFUSU9OIHwgU1dULk9LKTsKLQkJCQlib3guc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLk5vdEltcGxlbWVudGVkLnRpdGxlIikpOwotCQkJCWJveC5zZXRNZXNzYWdlKGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuQWN0aW9uTm90SW1wbGVtZW50ZWQuZGVzY3JpcHRpb24iKSk7Ci0JCQkJYm94Lm9wZW4oKTsKLQkJCX0KLQkJfTsKLQotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZEN1dF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLkN1dC50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHVuaW1wbGVtZW50ZWRMaXN0ZW5lcik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kQ29weV0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLkNvcHkudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1bmltcGxlbWVudGVkTGlzdGVuZXIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZFBhc3RlXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUGFzdGUudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1bmltcGxlbWVudGVkTGlzdGVuZXIpOwotCi0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kRGVsZXRlXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuRGVsZXRlLnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRSZW5hbWVdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5SZW5hbWUudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1bmltcGxlbWVudGVkTGlzdGVuZXIpOwotCi0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kU2VhcmNoXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuU2VhcmNoLnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRQcmludF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLlByaW50LnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb21ibyBib3ggdmlldy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDb21ib1ZpZXcoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IGxheW91dERhdGEpIHsKLQkJY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbWJvLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbmFsIEZpbGVbXSByb290cyA9IChGaWxlW10pIGNvbWJvLmdldERhdGEoQ09NQk9EQVRBX1JPT1RTKTsKLQkJCQlpZiAocm9vdHMgPT0gbnVsbCkgcmV0dXJuOwotCQkJCWludCBzZWxlY3Rpb24gPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCWlmIChzZWxlY3Rpb24gPj0gMCAmJiBzZWxlY3Rpb24gPCByb290cy5sZW5ndGgpIHsKLQkJCQkJbm90aWZ5U2VsZWN0ZWREaXJlY3Rvcnkocm9vdHNbc2VsZWN0aW9uXSk7Ci0JCQkJfQotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaW5hbCBTdHJpbmcgbGFzdFRleHQgPSAoU3RyaW5nKSBjb21iby5nZXREYXRhKENPTUJPREFUQV9MQVNUVEVYVCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRleHQgPT0gbnVsbCkgcmV0dXJuOwotCQkJCWlmIChsYXN0VGV4dCAhPSBudWxsICYmIGxhc3RUZXh0LmVxdWFscyh0ZXh0KSkgcmV0dXJuOwotCQkJCWNvbWJvLnNldERhdGEoQ09NQk9EQVRBX0xBU1RURVhULCB0ZXh0KTsKLQkJCQlub3RpZnlTZWxlY3RlZERpcmVjdG9yeShuZXcgRmlsZSh0ZXh0KSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGZpbGUgdHJlZSB2aWV3LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRyZWVWaWV3KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCWdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJdHJlZVNjb3BlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdHJlZVNjb3BlTGFiZWwuc2V0VGV4dChGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJkZXRhaWxzLkFsbEZvbGRlcnMudGV4dCIpKTsKLQkJdHJlZVNjb3BlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCi0JCXRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0KLQkJdHJlZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtW10gc2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCAhPSAwKSB7Ci0JCQkJCVRyZWVJdGVtIGl0ZW0gPSBzZWxlY3Rpb25bMF07Ci0JCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUpOwotCQkJCQotCQkJCQlub3RpZnlTZWxlY3RlZERpcmVjdG9yeShmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5sZW5ndGggIT0gMCkgewotCQkJCQlUcmVlSXRlbSBpdGVtID0gc2VsZWN0aW9uWzBdOwotCQkJCQlpdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCQkJCQl0cmVlRXhwYW5kSXRlbShpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl0cmVlLmFkZFRyZWVMaXN0ZW5lcihuZXcgVHJlZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IChJbWFnZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9JTUFHRUVYUEFOREVEKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQkJdHJlZUV4cGFuZEl0ZW0oaXRlbSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VDT0xMQVBTRUQpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCX0KLQkJfSk7Ci0JCWNyZWF0ZVRyZWVEcmFnU291cmNlKHRyZWUpOwotCQljcmVhdGVUcmVlRHJvcFRhcmdldCh0cmVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEcmFnICYgRHJvcCBEcmFnU291cmNlIGZvciBpdGVtcyBiZWluZyBkcmFnZ2VkIGZyb20gdGhlIHRyZWUuCi0JICogCi0JICogQHJldHVybiB0aGUgRHJhZ1NvdXJjZSBmb3IgdGhlIHRyZWUKLQkgKi8KLQlwcml2YXRlIERyYWdTb3VyY2UgY3JlYXRlVHJlZURyYWdTb3VyY2UoZmluYWwgVHJlZSB0cmVlKXsKLQkJRHJhZ1NvdXJjZSBkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UodHJlZSwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkpOwotCQlkcmFnU291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0JCWRyYWdTb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0JCQlUcmVlSXRlbVtdIGRuZFNlbGVjdGlvbiA9IG51bGw7Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KXsKLQkJCQlkbmRTZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJCXNvdXJjZU5hbWVzID0gbnVsbDsKLQkJCQlldmVudC5kb2l0ID0gZG5kU2VsZWN0aW9uLmxlbmd0aCA+IDA7Ci0JCQkJaXNEcmFnZ2luZyA9IHRydWU7Ci0JCQkJcHJvY2Vzc2VkRHJvcEZpbGVzID0gbnVsbDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpewotCQkJCWRyYWdTb3VyY2VIYW5kbGVEcmFnRmluaXNoZWQoZXZlbnQsIHNvdXJjZU5hbWVzKTsKLQkJCQlkbmRTZWxlY3Rpb24gPSBudWxsOwotCQkJCXNvdXJjZU5hbWVzID0gbnVsbDsKLQkJCQlpc0RyYWdnaW5nID0gZmFsc2U7Ci0JCQkJcHJvY2Vzc2VkRHJvcEZpbGVzID0gbnVsbDsKLQkJCQloYW5kbGVEZWZlcnJlZFJlZnJlc2goKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCl7Ci0JCQkJaWYgKGRuZFNlbGVjdGlvbiA9PSBudWxsIHx8IGRuZFNlbGVjdGlvbi5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJCWlmICghIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHJldHVybjsKLQkJCQkKLQkJCQlzb3VyY2VOYW1lcyAgPSBuZXcgU3RyaW5nW2RuZFNlbGVjdGlvbi5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZG5kU2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBkbmRTZWxlY3Rpb25baV0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQkJCXNvdXJjZU5hbWVzW2ldID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQkJZXZlbnQuZGF0YSA9IHNvdXJjZU5hbWVzOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGRyYWdTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRHJhZyAmIERyb3AgRHJvcFRhcmdldCBmb3IgaXRlbXMgYmVpbmcgZHJvcHBlZCBvbnRvIHRoZSB0cmVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERyb3BUYXJnZXQgZm9yIHRoZSB0cmVlCi0JICovCi0JcHJpdmF0ZSBEcm9wVGFyZ2V0IGNyZWF0ZVRyZWVEcm9wVGFyZ2V0KGZpbmFsIFRyZWUgdHJlZSkgewotCQlEcm9wVGFyZ2V0IGRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0cmVlLCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSk7Ci0JCWRyb3BUYXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQkJZHJvcFRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWlzRHJvcHBpbmcgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWlzRHJvcHBpbmcgPSBmYWxzZTsKLQkJCQloYW5kbGVEZWZlcnJlZFJlZnJlc2goKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWRyb3BUYXJnZXRWYWxpZGF0ZShldmVudCwgZ2V0VGFyZ2V0RmlsZShldmVudCkpOwotCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19FWFBBTkQgfCBETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlIHRhcmdldEZpbGUgPSBnZXRUYXJnZXRGaWxlKGV2ZW50KTsKLQkJCQlpZiAoZHJvcFRhcmdldFZhbGlkYXRlKGV2ZW50LCB0YXJnZXRGaWxlKSkKLQkJCQkJZHJvcFRhcmdldEhhbmRsZURyb3AoZXZlbnQsIHRhcmdldEZpbGUpOwotCQkJfQotCQkJcHJpdmF0ZSBGaWxlIGdldFRhcmdldEZpbGUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gRGV0ZXJtaW5lIHRoZSB0YXJnZXQgRmlsZSBmb3IgdGhlIGRyb3AgCi0JCQkJVHJlZUl0ZW0gaXRlbSA9IHRyZWUuZ2V0SXRlbSh0cmVlLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpKTsKLQkJCQlGaWxlIHRhcmdldEZpbGUgPSBudWxsOwotCQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJLy8gV2UgYXJlIG92ZXIgYSBwYXJ0aWN1bGFyIGl0ZW0gaW4gdGhlIHRyZWUsIHVzZSB0aGUgaXRlbSdzIGZpbGUKLQkJCQkJdGFyZ2V0RmlsZSA9IChGaWxlKSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUpOwotCQkJCX0KLQkJCQlyZXR1cm4gdGFyZ2V0RmlsZTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBkcm9wVGFyZ2V0OwkKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGV4cGFuZCBldmVudHMgb24gYSB0cmVlIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGl0ZW0gdGhlIFRyZWVJdGVtIHRvIGZpbGwgaW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJlZUV4cGFuZEl0ZW0oVHJlZUl0ZW0gaXRlbSkgewotCQlzaGVsbC5zZXRDdXJzb3IoaWNvbkNhY2hlLnN0b2NrQ3Vyc29yc1tpY29uQ2FjaGUuY3Vyc29yV2FpdF0pOwotCQlmaW5hbCBPYmplY3Qgc3R1YiA9IGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfU1RVQik7Ci0JCWlmIChzdHViID09IG51bGwpIHRyZWVSZWZyZXNoSXRlbShpdGVtLCB0cnVlKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKGljb25DYWNoZS5zdG9ja0N1cnNvcnNbaWNvbkNhY2hlLmN1cnNvckRlZmF1bHRdKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhdmVyc2UgdGhlIGVudGlyZSB0cmVlIGFuZCB1cGRhdGUgb25seSB3aGF0IGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSByb290cyB0aGUgcm9vdCBkaXJlY3RvcnkgbGlzdGluZwotCSAqLwotCXByaXZhdGUgdm9pZCB0cmVlUmVmcmVzaChGaWxlW10gbWFzdGVyRmlsZXMpIHsKLQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWUuZ2V0SXRlbXMoKTsKLQkJaW50IG1hc3RlckluZGV4ID0gMDsKLQkJaW50IGl0ZW1JbmRleCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCWZpbmFsIEZpbGUgaXRlbUZpbGUgPSAoRmlsZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCWlmICgoaXRlbUZpbGUgPT0gbnVsbCkgfHwgKG1hc3RlckluZGV4ID09IG1hc3RlckZpbGVzLmxlbmd0aCkpIHsKLQkJCQkvLyByZW1vdmUgYmFkIGl0ZW0gb3IgcGxhY2Vob2xkZXIKLQkJCQlpdGVtLmRpc3Bvc2UoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWZpbmFsIEZpbGUgbWFzdGVyRmlsZSA9IG1hc3RlckZpbGVzW21hc3RlckluZGV4XTsKLQkJCWludCBjb21wYXJlID0gY29tcGFyZUZpbGVzKG1hc3RlckZpbGUsIGl0ZW1GaWxlKTsKLQkJCWlmIChjb21wYXJlID09IDApIHsKLQkJCQkvLyBzYW1lIGZpbGUsIHVwZGF0ZSBpdAotCQkJCXRyZWVSZWZyZXNoSXRlbShpdGVtLCBmYWxzZSk7Ci0JCQkJKytpdGVtSW5kZXg7Ci0JCQkJKyttYXN0ZXJJbmRleDsKLQkJCX0gZWxzZSBpZiAoY29tcGFyZSA8IDApIHsKLQkJCQkvLyBzaG91bGQgYXBwZWFyIGJlZm9yZSBmaWxlLCBpbnNlcnQgaXQKLQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FLCBpdGVtSW5kZXgpOwotCQkJCXRyZWVJbml0Vm9sdW1lKG5ld0l0ZW0sIG1hc3RlckZpbGUpOwotCQkJCW5ldyBUcmVlSXRlbShuZXdJdGVtLCBTV1QuTk9ORSk7IC8vIHBsYWNlaG9sZGVyIGNoaWxkIGl0ZW0gdG8gZ2V0ICJleHBhbmQiIGJ1dHRvbgotCQkJCSsraXRlbUluZGV4OwotCQkJCSsrbWFzdGVySW5kZXg7Ci0JCQkJLS1pOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzaG91bGQgYXBwZWFyIGFmdGVyIGZpbGUsIGRlbGV0ZSBzdGFsZSBpdGVtCi0JCQkJaXRlbS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJZm9yICg7bWFzdGVySW5kZXggPCBtYXN0ZXJGaWxlcy5sZW5ndGg7ICsrbWFzdGVySW5kZXgpIHsKLQkJCWZpbmFsIEZpbGUgbWFzdGVyRmlsZSA9IG1hc3RlckZpbGVzW21hc3RlckluZGV4XTsKLQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJdHJlZUluaXRWb2x1bWUobmV3SXRlbSwgbWFzdGVyRmlsZSk7Ci0JCQluZXcgVHJlZUl0ZW0obmV3SXRlbSwgU1dULk5PTkUpOyAvLyBwbGFjZWhvbGRlciBjaGlsZCBpdGVtIHRvIGdldCAiZXhwYW5kIiBidXR0b24KLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIFRyYXZlcnNlIGFuIGl0ZW0gaW4gdGhlIHRyZWUgYW5kIHVwZGF0ZSBvbmx5IHdoYXQgaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGRpckl0ZW0gdGhlIHRyZWUgaXRlbSBvZiB0aGUgZGlyZWN0b3J5Ci0JICogQHBhcmFtIGZvcmNlUG9wdWxhdGUgdHJ1ZSBpZmYgd2Ugc2hvdWxkIHBvcHVsYXRlIG5vbi1leHBhbmRlZCBpdGVtcyBhcyB3ZWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyZWVSZWZyZXNoSXRlbShUcmVlSXRlbSBkaXJJdGVtLCBib29sZWFuIGZvcmNlUG9wdWxhdGUpIHsKLQkJZmluYWwgRmlsZSBkaXIgPSAoRmlsZSkgZGlySXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCi0JCWlmICghIGZvcmNlUG9wdWxhdGUgJiYgISBkaXJJdGVtLmdldEV4cGFuZGVkKCkpIHsKLQkJCS8vIFJlZnJlc2ggbm9uLWV4cGFuZGVkIGl0ZW0KLQkJCWlmIChkaXJJdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX1NUVUIpICE9IG51bGwpIHsKLQkJCQl0cmVlSXRlbVJlbW92ZUFsbChkaXJJdGVtKTsKLQkJCQluZXcgVHJlZUl0ZW0oZGlySXRlbSwgU1dULk5PTkUpOyAvLyBwbGFjZWhvbGRlciBjaGlsZCBpdGVtIHRvIGdldCAiZXhwYW5kIiBidXR0b24KLQkJCQlkaXJJdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX1NUVUIsIG51bGwpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIFJlZnJlc2ggZXhwYW5kZWQgaXRlbQotCQlkaXJJdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX1NUVUIsIHRoaXMpOyAvLyBjbGVhciBzdHViIGZsYWcKLQotCQkvKiBHZXQgZGlyZWN0b3J5IGxpc3RpbmcgKi8KLQkJRmlsZVtdIHN1YkZpbGVzID0gKGRpciAhPSBudWxsKSA/IEZpbGVWaWV3ZXIuZ2V0RGlyZWN0b3J5TGlzdChkaXIpIDogbnVsbDsKLQkJaWYgKHN1YkZpbGVzID09IG51bGwgfHwgc3ViRmlsZXMubGVuZ3RoID09IDApIHsKLQkJCS8qIEVycm9yIG9yIG5vIGNvbnRlbnRzICovCi0JCQl0cmVlSXRlbVJlbW92ZUFsbChkaXJJdGVtKTsKLQkJCWRpckl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogUmVmcmVzaCBzdWItaXRlbXMgKi8KLQkJVHJlZUl0ZW1bXSBpdGVtcyA9IGRpckl0ZW0uZ2V0SXRlbXMoKTsKLQkJZmluYWwgRmlsZVtdIG1hc3RlckZpbGVzID0gc3ViRmlsZXM7Ci0JCWludCBtYXN0ZXJJbmRleCA9IDA7Ci0JCWludCBpdGVtSW5kZXggPSAwOwotCQlGaWxlIG1hc3RlckZpbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0JCQl3aGlsZSAoKG1hc3RlckZpbGUgPT0gbnVsbCkgJiYgKG1hc3RlckluZGV4IDwgbWFzdGVyRmlsZXMubGVuZ3RoKSkgewotCQkJCW1hc3RlckZpbGUgPSBtYXN0ZXJGaWxlc1ttYXN0ZXJJbmRleCsrXTsKLQkJCQlpZiAoISBtYXN0ZXJGaWxlLmlzRGlyZWN0b3J5KCkpIG1hc3RlckZpbGUgPSBudWxsOwotCQkJfQotCi0JCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlmaW5hbCBGaWxlIGl0ZW1GaWxlID0gKEZpbGUpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQlpZiAoKGl0ZW1GaWxlID09IG51bGwpIHx8IChtYXN0ZXJGaWxlID09IG51bGwpKSB7Ci0JCQkJLy8gcmVtb3ZlIGJhZCBpdGVtIG9yIHBsYWNlaG9sZGVyCi0JCQkJaXRlbS5kaXNwb3NlKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpbnQgY29tcGFyZSA9IGNvbXBhcmVGaWxlcyhtYXN0ZXJGaWxlLCBpdGVtRmlsZSk7Ci0JCQlpZiAoY29tcGFyZSA9PSAwKSB7Ci0JCQkJLy8gc2FtZSBmaWxlLCB1cGRhdGUgaXQKLQkJCQl0cmVlUmVmcmVzaEl0ZW0oaXRlbSwgZmFsc2UpOwotCQkJCW1hc3RlckZpbGUgPSBudWxsOwotCQkJCSsraXRlbUluZGV4OwotCQkJfSBlbHNlIGlmIChjb21wYXJlIDwgMCkgewotCQkJCS8vIHNob3VsZCBhcHBlYXIgYmVmb3JlIGZpbGUsIGluc2VydCBpdAotCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0oZGlySXRlbSwgU1dULk5PTkUsIGl0ZW1JbmRleCk7Ci0JCQkJdHJlZUluaXRGb2xkZXIobmV3SXRlbSwgbWFzdGVyRmlsZSk7Ci0JCQkJbmV3IFRyZWVJdGVtKG5ld0l0ZW0sIFNXVC5OT05FKTsgLy8gYWRkIGEgcGxhY2Vob2xkZXIgY2hpbGQgaXRlbSBzbyB3ZSBnZXQgdGhlICJleHBhbmQiIGJ1dHRvbgotCQkJCW1hc3RlckZpbGUgPSBudWxsOwotCQkJCSsraXRlbUluZGV4OwotCQkJCS0taTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc2hvdWxkIGFwcGVhciBhZnRlciBmaWxlLCBkZWxldGUgc3RhbGUgaXRlbQotCQkJCWl0ZW0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXdoaWxlICgobWFzdGVyRmlsZSAhPSBudWxsKSB8fCAobWFzdGVySW5kZXggPCBtYXN0ZXJGaWxlcy5sZW5ndGgpKSB7Ci0JCQlpZiAobWFzdGVyRmlsZSAhPSBudWxsKSB7Ci0JCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShkaXJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJdHJlZUluaXRGb2xkZXIobmV3SXRlbSwgbWFzdGVyRmlsZSk7Ci0JCQkJbmV3IFRyZWVJdGVtKG5ld0l0ZW0sIFNXVC5OT05FKTsgLy8gYWRkIGEgcGxhY2Vob2xkZXIgY2hpbGQgaXRlbSBzbyB3ZSBnZXQgdGhlICJleHBhbmQiIGJ1dHRvbgotCQkJCWlmIChtYXN0ZXJJbmRleCA9PSBtYXN0ZXJGaWxlcy5sZW5ndGgpIGJyZWFrOwotCQkJfQotCQkJbWFzdGVyRmlsZSA9IG1hc3RlckZpbGVzW21hc3RlckluZGV4KytdOwotCQkJaWYgKCEgbWFzdGVyRmlsZS5pc0RpcmVjdG9yeSgpKSBtYXN0ZXJGaWxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcmVpZ24gbWV0aG9kOiByZW1vdmVzIGFsbCBjaGlsZHJlbiBvZiBhIFRyZWVJdGVtLgotCSAqIEBwYXJhbSB0cmVlSXRlbSB0aGUgVHJlZUl0ZW0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHRyZWVJdGVtUmVtb3ZlQWxsKFRyZWVJdGVtIHRyZWVJdGVtKSB7Ci0JCWZpbmFsIFRyZWVJdGVtW10gY2hpbGRyZW4gPSB0cmVlSXRlbS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JCQljaGlsZHJlbltpXS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBhIGZvbGRlciBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBpdGVtIHRoZSBUcmVlSXRlbSB0byBpbml0aWFsaXplCi0JICogQHBhcmFtIGZvbGRlciB0aGUgRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBUcmVlSXRlbQotCSAqLwotCXByaXZhdGUgdm9pZCB0cmVlSW5pdEZvbGRlcihUcmVlSXRlbSBpdGVtLCBGaWxlIGZvbGRlcikgewotCQlpdGVtLnNldFRleHQoZm9sZGVyLmdldE5hbWUoKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSwgZm9sZGVyKTsKLQkJaXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9JTUFHRUVYUEFOREVELCBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25PcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VDT0xMQVBTRUQsIGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbkNsb3NlZEZvbGRlcl0pOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGEgdm9sdW1lIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGl0ZW0gdGhlIFRyZWVJdGVtIHRvIGluaXRpYWxpemUKLQkgKiBAcGFyYW0gdm9sdW1lIHRoZSBGaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRyZWVJdGVtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyZWVJbml0Vm9sdW1lKFRyZWVJdGVtIGl0ZW0sIEZpbGUgdm9sdW1lKSB7Ci0JCWl0ZW0uc2V0VGV4dCh2b2x1bWUuZ2V0UGF0aCgpKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25DbG9zZWREcml2ZV0pOwotCQlpdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUsIHZvbHVtZSk7Ci0JCWl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VFWFBBTkRFRCwgaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uT3BlbkRyaXZlXSk7Ci0JCWl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VDT0xMQVBTRUQsIGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbkNsb3NlZERyaXZlXSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZmlsZSBkZXRhaWxzIHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQlncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQl0YWJsZUNvbnRlbnRzT2ZMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl0YWJsZUNvbnRlbnRzT2ZMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0KLQkJdGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVUaXRsZXMubGVuZ3RoOyArK2kpIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQkJY29sdW1uLnNldFRleHQodGFibGVUaXRsZXNbaV0pOwotCQkJY29sdW1uLnNldFdpZHRoKHRhYmxlV2lkdGhzW2ldKTsKLQkJfQotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbm90aWZ5U2VsZWN0ZWRGaWxlcyhnZXRTZWxlY3RlZEZpbGVzKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZG9EZWZhdWx0RmlsZUFjdGlvbihnZXRTZWxlY3RlZEZpbGVzKCkpOwotCQkJfQotCQkJcHJpdmF0ZSBGaWxlW10gZ2V0U2VsZWN0ZWRGaWxlcygpIHsKLQkJCQlmaW5hbCBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJCWZpbmFsIEZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlW2l0ZW1zLmxlbmd0aF07Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewotCQkJCQlmaWxlc1tpXSA9IChGaWxlKSBpdGVtc1tpXS5nZXREYXRhKFRBQkxFSVRFTURBVEFfRklMRSk7Ci0JCQkJfQotCQkJCXJldHVybiBmaWxlczsKLQkJCX0KLQkJfSk7Ci0KLQkJY3JlYXRlVGFibGVEcmFnU291cmNlKHRhYmxlKTsKLQkJY3JlYXRlVGFibGVEcm9wVGFyZ2V0KHRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEcmFnICYgRHJvcCBEcmFnU291cmNlIGZvciBpdGVtcyBiZWluZyBkcmFnZ2VkIGZyb20gdGhlIHRhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERyYWdTb3VyY2UgZm9yIHRoZSB0YWJsZQotCSAqLwotCXByaXZhdGUgRHJhZ1NvdXJjZSBjcmVhdGVUYWJsZURyYWdTb3VyY2UoZmluYWwgVGFibGUgdGFibGUpIHsKLQkJRHJhZ1NvdXJjZSBkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UodGFibGUsIERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZKTsKLQkJZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQlkcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCQkJVGFibGVJdGVtW10gZG5kU2VsZWN0aW9uID0gbnVsbDsKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gbnVsbDsKLQkJCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpewotCQkJCWRuZFNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJCXNvdXJjZU5hbWVzID0gbnVsbDsKLQkJCQlldmVudC5kb2l0ID0gZG5kU2VsZWN0aW9uLmxlbmd0aCA+IDA7Ci0JCQkJaXNEcmFnZ2luZyA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KXsKLQkJCQlkcmFnU291cmNlSGFuZGxlRHJhZ0ZpbmlzaGVkKGV2ZW50LCBzb3VyY2VOYW1lcyk7Ci0JCQkJZG5kU2VsZWN0aW9uID0gbnVsbDsKLQkJCQlzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQkJaXNEcmFnZ2luZyA9IGZhbHNlOwotCQkJCWhhbmRsZURlZmVycmVkUmVmcmVzaCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KXsKLQkJCQlpZiAoZG5kU2VsZWN0aW9uID09IG51bGwgfHwgZG5kU2VsZWN0aW9uLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQkJaWYgKCEgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgcmV0dXJuOwotCQkJCQotCQkJCXNvdXJjZU5hbWVzICA9IG5ldyBTdHJpbmdbZG5kU2VsZWN0aW9uLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkbmRTZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBmaWxlID0gKEZpbGUpIGRuZFNlbGVjdGlvbltpXS5nZXREYXRhKFRBQkxFSVRFTURBVEFfRklMRSk7Ci0JCQkJCXNvdXJjZU5hbWVzW2ldID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQkJZXZlbnQuZGF0YSA9IHNvdXJjZU5hbWVzOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGRyYWdTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRHJhZyAmIERyb3AgRHJvcFRhcmdldCBmb3IgaXRlbXMgYmVpbmcgZHJvcHBlZCBvbnRvIHRoZSB0YWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBEcm9wVGFyZ2V0IGZvciB0aGUgdGFibGUKLQkgKi8KLQlwcml2YXRlIERyb3BUYXJnZXQgY3JlYXRlVGFibGVEcm9wVGFyZ2V0KGZpbmFsIFRhYmxlIHRhYmxlKXsKLQkJRHJvcFRhcmdldCBkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGFibGUsIERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZKTsKLQkJZHJvcFRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQlkcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJaXNEcm9wcGluZyA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJaXNEcm9wcGluZyA9IGZhbHNlOwotCQkJCWhhbmRsZURlZmVycmVkUmVmcmVzaCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJZHJvcFRhcmdldFZhbGlkYXRlKGV2ZW50LCBnZXRUYXJnZXRGaWxlKGV2ZW50KSk7Ci0JCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0VYUEFORCB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCUZpbGUgdGFyZ2V0RmlsZSA9IGdldFRhcmdldEZpbGUoZXZlbnQpOwotCQkJCWlmIChkcm9wVGFyZ2V0VmFsaWRhdGUoZXZlbnQsIHRhcmdldEZpbGUpKQotCQkJCQlkcm9wVGFyZ2V0SGFuZGxlRHJvcChldmVudCwgdGFyZ2V0RmlsZSk7Ci0JCQl9Ci0JCQlwcml2YXRlIEZpbGUgZ2V0VGFyZ2V0RmlsZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBEZXRlcm1pbmUgdGhlIHRhcmdldCBGaWxlIGZvciB0aGUgZHJvcCAKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0odGFibGUudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSkpOwotCQkJCUZpbGUgdGFyZ2V0RmlsZSA9IG51bGw7Ci0JCQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJCQkvLyBXZSBhcmUgb3ZlciBhbiB1bm9jY3VwaWVkIGFyZWEgb2YgdGhlIHRhYmxlLgotCQkJCQkvLyBJZiBpdCBpcyBhIENPUFksIHdlIGNhbiB1c2UgdGhlIHRhYmxlJ3Mgcm9vdCBmaWxlLgotCQkJCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0NPUFkpIHsKLQkJCQkJCXRhcmdldEZpbGUgPSAoRmlsZSkgdGFibGUuZ2V0RGF0YShUQUJMRURBVEFfRElSKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFdlIGFyZSBvdmVyIGEgcGFydGljdWxhciBpdGVtIGluIHRoZSB0YWJsZSwgdXNlIHRoZSBpdGVtJ3MgZmlsZQotCQkJCQl0YXJnZXRGaWxlID0gKEZpbGUpIGl0ZW0uZ2V0RGF0YShUQUJMRUlURU1EQVRBX0ZJTEUpOwotCQkJCX0KLQkJCQlyZXR1cm4gdGFyZ2V0RmlsZTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBkcm9wVGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnRzIHRoYXQgYSBuZXcgY3VycmVudCBkaXJlY3RvcnkgaGFzIGJlZW4gc2VsZWN0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgdGhhdCB3YXMgc2VsZWN0ZWQsIG51bGwgaXMgaWdub3JlZAotCSAqLwotCXZvaWQgbm90aWZ5U2VsZWN0ZWREaXJlY3RvcnkoRmlsZSBkaXIpIHsKLQkJaWYgKGRpciA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChjdXJyZW50RGlyZWN0b3J5ICE9IG51bGwgJiYgZGlyLmVxdWFscyhjdXJyZW50RGlyZWN0b3J5KSkgcmV0dXJuOwotCQljdXJyZW50RGlyZWN0b3J5ID0gZGlyOwotCQlub3RpZnlTZWxlY3RlZEZpbGVzKG51bGwpOwotCQkKLQkJLyogU2hlbGw6Ci0JCSAqIFNldHMgdGhlIHRpdGxlIHRvIGluZGljYXRlIHRoZSBzZWxlY3RlZCBkaXJlY3RvcnkKLQkJICovCi0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIiwgbmV3IE9iamVjdFtdIHsgY3VycmVudERpcmVjdG9yeS5nZXRQYXRoKCkgfSkpOwotCi0JCS8qIFRhYmxlIHZpZXc6Ci0JCSAqIERpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5LgotCQkgKi8KLQkJd29ya2VyVXBkYXRlKGRpciwgZmFsc2UpOwotCi0JCS8qIENvbWJvIHZpZXc6Ci0JCSAqIFNldHMgdGhlIGNvbWJvIGJveCB0byBwb2ludCB0byB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5LgotCQkgKi8KLQkJZmluYWwgRmlsZVtdIGNvbWJvUm9vdHMgPSAoRmlsZVtdKSBjb21iby5nZXREYXRhKENPTUJPREFUQV9ST09UUyk7Ci0JCWludCBjb21ib0VudHJ5ID0gLTE7Ci0JCWlmIChjb21ib1Jvb3RzICE9IG51bGwpIHsJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21ib1Jvb3RzLmxlbmd0aDsgKytpKSB7Ci0JCQkJaWYgKGRpci5lcXVhbHMoY29tYm9Sb290c1tpXSkpIHsKLQkJCQkJY29tYm9FbnRyeSA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY29tYm9FbnRyeSA9PSAtMSkgY29tYm8uc2V0VGV4dChkaXIuZ2V0UGF0aCgpKTsKLQkJZWxzZSBjb21iby5zZWxlY3QoY29tYm9FbnRyeSk7Ci0KLQkJLyogVHJlZSB2aWV3OgotCQkgKiBJZiBub3QgYWxyZWFkeSBleHBhbmRlZCwgcmVjdXJzaXZlbHkgZXhwYW5kcyB0aGUgcGFyZW50cyBvZiB0aGUgc3BlY2lmaWVkCi0JCSAqIGRpcmVjdG9yeSB1bnRpbCBpdCBpcyB2aXNpYmxlLgotCQkgKi8KLQkJVmVjdG9yIC8qIG9mIEZpbGUgKi8gcGF0aCA9IG5ldyBWZWN0b3IoKTsKLQkJLy8gQnVpbGQgYSBzdGFjayBvZiBwYXRocyBmcm9tIHRoZSByb290IG9mIHRoZSB0cmVlCi0JCXdoaWxlIChkaXIgIT0gbnVsbCkgewotCQkJcGF0aC5hZGQoZGlyKTsKLQkJCWRpciA9IGRpci5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQkJLy8gUmVjdXJzaXZlbHkgZXhwYW5kIHRoZSB0cmVlIHRvIGdldCB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRJdGVtcygpOwotCQlUcmVlSXRlbSBsYXN0SXRlbSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSBwYXRoLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0JCQlmaW5hbCBGaWxlIHBhdGhFbGVtZW50ID0gKEZpbGUpIHBhdGguZWxlbWVudEF0KGkpOwotCi0JCQkvLyBTZWFyY2ggZm9yIGEgcGFydGljdWxhciBGaWxlIGluIHRoZSBhcnJheSBvZiB0cmVlIGl0ZW1zCi0JCQkvLyBObyBndWFyYW50ZWUgdGhhdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBpbiBhbnkgcmVjb2duaXphYmxlIGZhc2hpb24sIHNvIHdlJ2xsCi0JCQkvLyBqdXN0IHNlcXVlbnRpYWwgc2Nhbi4gIFRoZXJlIHNob3VsZG4ndCBiZSBtb3JlIHRoYW4gYSBmZXcgdGhvdXNhbmQgZW50cmllcy4KLQkJCVRyZWVJdGVtIGl0ZW0gPSBudWxsOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBpdGVtcy5sZW5ndGg7ICsraykgewotCQkJCWl0ZW0gPSBpdGVtc1trXTsKLQkJCQlpZiAoaXRlbS5pc0Rpc3Bvc2VkKCkpIGNvbnRpbnVlOwotCQkJCWZpbmFsIEZpbGUgaXRlbUZpbGUgPSAoRmlsZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCQlpZiAoaXRlbUZpbGUgIT0gbnVsbCAmJiBpdGVtRmlsZS5lcXVhbHMocGF0aEVsZW1lbnQpKSBicmVhazsKLQkJCX0KLQkJCWlmIChpdGVtID09IG51bGwpIGJyZWFrOwotCQkJbGFzdEl0ZW0gPSBpdGVtOwotCQkJaWYgKGkgIT0gMCAmJiAhaXRlbS5nZXRFeHBhbmRlZCgpKSB7Ci0JCQkJdHJlZUV4cGFuZEl0ZW0oaXRlbSk7Ci0JCQkJaXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCX0KLQkJCWl0ZW1zID0gaXRlbS5nZXRJdGVtcygpOwotCQl9Ci0JCXRyZWUuc2V0U2VsZWN0aW9uKChsYXN0SXRlbSAhPSBudWxsKSA/IG5ldyBUcmVlSXRlbVtdIHsgbGFzdEl0ZW0gfSA6IG5ldyBUcmVlSXRlbVswXSk7Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnRzIHRoYXQgZmlsZXMgaGF2ZSBiZWVuIHNlbGVjdGVkCi0JICogCi0JICogQHBhcmFtIGZpbGVzIHRoZSBmaWxlcyB0aGF0IHdlcmUgc2VsZWN0ZWQsIG51bGwgb3IgZW1wdHkgYXJyYXkgaW5kaWNhdGVzIG5vIGFjdGl2ZSBzZWxlY3Rpb24KLQkgKi8KLQl2b2lkIG5vdGlmeVNlbGVjdGVkRmlsZXMoRmlsZVtdIGZpbGVzKSB7Ci0JCS8qIERldGFpbHM6Ci0JCSAqIFVwZGF0ZSB0aGUgZGV0YWlscyB0aGF0IGFyZSB2aXNpYmxlIG9uIHNjcmVlbi4KLQkJICovCi0JCWlmICgoZmlsZXMgIT0gbnVsbCkgJiYgKGZpbGVzLmxlbmd0aCAhPSAwKSkgewotCQkJbnVtT2JqZWN0c0xhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRldGFpbHMuTnVtYmVyT2ZTZWxlY3RlZEZpbGVzLnRleHQiLAotCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGZpbGVzLmxlbmd0aCkgfSkpOwotCQkJbG9uZyBmaWxlU2l6ZSA9IDBMOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbGVTaXplICs9IGZpbGVzW2ldLmxlbmd0aCgpOwotCQkJfQotCQkJZGlza1NwYWNlTGFiZWwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGV0YWlscy5GaWxlU2l6ZS50ZXh0IiwKLQkJCQluZXcgT2JqZWN0W10geyBuZXcgTG9uZyhmaWxlU2l6ZSkgfSkpOwotCQl9IGVsc2UgewotCQkJLy8gTm8gZmlsZXMgc2VsZWN0ZWQKLQkJCWRpc2tTcGFjZUxhYmVsLnNldFRleHQoIiIpOwotCQkJaWYgKGN1cnJlbnREaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJCWludCBudW1PYmplY3RzID0gZ2V0RGlyZWN0b3J5TGlzdChjdXJyZW50RGlyZWN0b3J5KS5sZW5ndGg7Ci0JCQkJbnVtT2JqZWN0c0xhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRldGFpbHMuRGlyTnVtYmVyT2ZPYmplY3RzLnRleHQiLAotCQkJCQluZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihudW1PYmplY3RzKSB9KSk7Ci0JCQl9IGVsc2UgewotCQkJCW51bU9iamVjdHNMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnRzIHRoYXQgZmlsZXMgbXVzdCBiZSByZWZyZXNoZWQKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMgdGhlIGZpbGVzIHRoYXQgbmVlZCByZWZyZXNoaW5nLCBlbXB0eSBhcnJheSBpcyBhIG5vLW9wLCBudWxsIHJlZnJlc2hlcyBhbGwKLQkgKi8KLQl2b2lkIG5vdGlmeVJlZnJlc2hGaWxlcyhGaWxlW10gZmlsZXMpIHsKLQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID09IDApIHJldHVybjsKLQotCQlpZiAoKGRlZmVycmVkUmVmcmVzaFJlcXVlc3RlZCkgJiYgKGRlZmVycmVkUmVmcmVzaEZpbGVzICE9IG51bGwpICYmIChmaWxlcyAhPSBudWxsKSkgewotCQkJLy8gbWVyZ2UgcmVxdWVzdHMKLQkJCUZpbGVbXSBuZXdSZXF1ZXN0ID0gbmV3IEZpbGVbZGVmZXJyZWRSZWZyZXNoRmlsZXMubGVuZ3RoICsgZmlsZXMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGVmZXJyZWRSZWZyZXNoRmlsZXMsIDAsIG5ld1JlcXVlc3QsIDAsIGRlZmVycmVkUmVmcmVzaEZpbGVzLmxlbmd0aCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZpbGVzLCAwLCBuZXdSZXF1ZXN0LCBkZWZlcnJlZFJlZnJlc2hGaWxlcy5sZW5ndGgsIGZpbGVzLmxlbmd0aCk7Ci0JCQlkZWZlcnJlZFJlZnJlc2hGaWxlcyA9IG5ld1JlcXVlc3Q7Ci0JCX0gZWxzZSB7Ci0JCQlkZWZlcnJlZFJlZnJlc2hGaWxlcyA9IGZpbGVzOwotCQkJZGVmZXJyZWRSZWZyZXNoUmVxdWVzdGVkID0gdHJ1ZTsKLQkJfQotCQloYW5kbGVEZWZlcnJlZFJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGRlZmVycmVkIFJlZnJlc2ggbm90aWZpY2F0aW9ucyAoZHVlIHRvIERyYWcgJiBEcm9wKQotCSAqLwotCXZvaWQgaGFuZGxlRGVmZXJyZWRSZWZyZXNoKCkgewotCQlpZiAoaXNEcmFnZ2luZyB8fCBpc0Ryb3BwaW5nIHx8ICEgZGVmZXJyZWRSZWZyZXNoUmVxdWVzdGVkKSByZXR1cm47Ci0JCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQlwcm9ncmVzc0RpYWxvZy5jbG9zZSgpOwotCQkJcHJvZ3Jlc3NEaWFsb2cgPSBudWxsOwotCQl9Ci0KLQkJZGVmZXJyZWRSZWZyZXNoUmVxdWVzdGVkID0gZmFsc2U7Ci0JCUZpbGVbXSBmaWxlcyA9IGRlZmVycmVkUmVmcmVzaEZpbGVzOwotCQlkZWZlcnJlZFJlZnJlc2hGaWxlcyA9IG51bGw7Ci0KLQkJc2hlbGwuc2V0Q3Vyc29yKGljb25DYWNoZS5zdG9ja0N1cnNvcnNbaWNvbkNhY2hlLmN1cnNvcldhaXRdKTsKLQotCQkvKiBUYWJsZSB2aWV3OgotCQkgKiBSZWZyZXNoZXMgaW5mb3JtYXRpb24gYWJvdXQgYW55IGZpbGVzIGluIHRoZSBsaXN0IGFuZCB0aGVpciBjaGlsZHJlbi4KLQkJICovCi0JCWJvb2xlYW4gcmVmcmVzaFRhYmxlID0gZmFsc2U7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0JCQkJaWYgKGZpbGUuZXF1YWxzKGN1cnJlbnREaXJlY3RvcnkpKSB7Ci0JCQkJCXJlZnJlc2hUYWJsZSA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlGaWxlIHBhcmVudEZpbGUgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQlpZiAoKHBhcmVudEZpbGUgIT0gbnVsbCkgJiYgKHBhcmVudEZpbGUuZXF1YWxzKGN1cnJlbnREaXJlY3RvcnkpKSkgewotCQkJCQlyZWZyZXNoVGFibGUgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSByZWZyZXNoVGFibGUgPSB0cnVlOwotCQlpZiAocmVmcmVzaFRhYmxlKSB3b3JrZXJVcGRhdGUoY3VycmVudERpcmVjdG9yeSwgdHJ1ZSk7Ci0KLQkJLyogQ29tYm8gdmlldzoKLQkJICogUmVmcmVzaGVzIHRoZSBsaXN0IG9mIHJvb3RzCi0JCSAqLwotCQlmaW5hbCBGaWxlW10gcm9vdHMgPSBnZXRSb290cygpOwotCi0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQlib29sZWFuIHJlZnJlc2hDb21ibyA9IGZhbHNlOwotCQkJZmluYWwgRmlsZVtdIGNvbWJvUm9vdHMgPSAoRmlsZVtdKSBjb21iby5nZXREYXRhKENPTUJPREFUQV9ST09UUyk7Ci0JCQotCQkJaWYgKChjb21ib1Jvb3RzICE9IG51bGwpICYmIChjb21ib1Jvb3RzLmxlbmd0aCA9PSByb290cy5sZW5ndGgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7ICsraSkgewotCQkJCQlpZiAoISByb290c1tpXS5lcXVhbHMoY29tYm9Sb290c1tpXSkpIHsKLQkJCQkJCXJlZnJlc2hDb21ibyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSByZWZyZXNoQ29tYm8gPSB0cnVlOwotCi0JCQlpZiAocmVmcmVzaENvbWJvKSB7Ci0JCQkJY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJY29tYm8uc2V0RGF0YShDT01CT0RBVEFfUk9PVFMsIHJvb3RzKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCWZpbmFsIEZpbGUgZmlsZSA9IHJvb3RzW2ldOwotCQkJCQljb21iby5hZGQoZmlsZS5nZXRQYXRoKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qIFRyZWUgdmlldzoKLQkJICogUmVmcmVzaGVzIGluZm9ybWF0aW9uIGFib3V0IGFueSBmaWxlcyBpbiB0aGUgbGlzdCBhbmQgdGhlaXIgY2hpbGRyZW4uCi0JCSAqLwotCQl0cmVlUmVmcmVzaChyb290cyk7Ci0JCQotCQkvLyBSZW1pbmQgZXZlcnlvbmUgd2hlcmUgd2UgYXJlIGluIHRoZSBmaWxlc3lzdGVtCi0JCWZpbmFsIEZpbGUgZGlyID0gY3VycmVudERpcmVjdG9yeTsKLQkJY3VycmVudERpcmVjdG9yeSA9IG51bGw7Ci0JCW5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KGRpcik7Ci0KLQkJc2hlbGwuc2V0Q3Vyc29yKGljb25DYWNoZS5zdG9ja0N1cnNvcnNbaWNvbkNhY2hlLmN1cnNvckRlZmF1bHRdKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgZGVmYXVsdCBhY3Rpb24gb24gYSBzZXQgb2YgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIGZpbGVzIHRoZSBhcnJheSBvZiBmaWxlcyB0byBwcm9jZXNzCi0JICovCi0Jdm9pZCBkb0RlZmF1bHRGaWxlQWN0aW9uKEZpbGVbXSBmaWxlcykgewotCQkvLyBvbmx5IHVzZXMgdGhlIDFzdCBmaWxlIChmb3Igbm93KQotCQlpZiAoZmlsZXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJZmluYWwgRmlsZSBmaWxlID0gZmlsZXNbMF07Ci0KLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJbm90aWZ5U2VsZWN0ZWREaXJlY3RvcnkoZmlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlmaW5hbCBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJaWYgKCEgUHJvZ3JhbS5sYXVuY2goZmlsZU5hbWUpKSB7CQotCQkJCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SIHwgU1dULk9LKTsKLQkJCQlkaWFsb2cuc2V0TWVzc2FnZShnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuRmFpbGVkTGF1bmNoLm1lc3NhZ2UiLCBuZXcgT2JqZWN0W10geyBmaWxlTmFtZSB9KSk7Ci0JCQkJZGlhbG9nLnNldFRleHQoc2hlbGwuZ2V0VGV4dCAoKSk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5hdmlnYXRlcyB0byB0aGUgcGFyZW50IGRpcmVjdG9yeQotCSAqLwotCXZvaWQgZG9QYXJlbnQoKSB7Ci0JCWlmIChjdXJyZW50RGlyZWN0b3J5ID09IG51bGwpIHJldHVybjsKLQkJRmlsZSBwYXJlbnREaXJlY3RvcnkgPSBjdXJyZW50RGlyZWN0b3J5LmdldFBhcmVudEZpbGUoKTsKLQkJbm90aWZ5U2VsZWN0ZWREaXJlY3RvcnkocGFyZW50RGlyZWN0b3J5KTsKLQl9Ci0JIAotCS8qKgotCSAqIFBlcmZvcm1zIGEgcmVmcmVzaAotCSAqLwotCXZvaWQgZG9SZWZyZXNoKCkgewotCQlub3RpZnlSZWZyZXNoRmlsZXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIGEgZHJvcCB0YXJnZXQgYXMgYSBjYW5kaWRhdGUgZm9yIGEgZHJvcCBvcGVyYXRpb24uCi0JICogPHA+Ci0JICogVXNlZCBpbiBkcmFnT3ZlcigpIGFuZCBkcm9wQWNjZXB0KCkuPGJyPgotCSAqIE5vdGUgZXZlbnQuZGV0YWlsIGlzIHNldCB0byBETkQuRFJPUF9OT05FIGJ5IHRoaXMgbWV0aG9kIGlmIHRoZSB0YXJnZXQgaXMgbm90IHZhbGlkLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gZXZlbnQgdGhlIERyb3BUYXJnZXRFdmVudCB0byB2YWxpZGF0ZQotCSAqIEBwYXJhbSB0YXJnZXRGaWxlIHRoZSBGaWxlIHJlcHJlc2VudGluZyB0aGUgZHJvcCB0YXJnZXQgbG9jYXRpb24KLQkgKiAgICAgICAgdW5kZXIgaW5zcGVjdGlvbiwgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRyb3BUYXJnZXRWYWxpZGF0ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIEZpbGUgdGFyZ2V0RmlsZSkgewotCQlpZiAodGFyZ2V0RmlsZSAhPSBudWxsICYmIHRhcmdldEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBETkQuRFJPUF9DT1BZICYmIGV2ZW50LmRldGFpbCAhPSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCX0KLQkJcmV0dXJuIGV2ZW50LmRldGFpbCAhPSBETkQuRFJPUF9OT05FOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBkcm9wIG9uIGEgZHJvcFRhcmdldC4KLQkgKiA8cD4KLQkgKiBVc2VkIGluIGRyb3AoKS48YnI+Ci0JICogTm90ZSBldmVudC5kZXRhaWwgaXMgbW9kaWZpZWQgYnkgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIEBwYXJhbSBldmVudCB0aGUgRHJvcFRhcmdldEV2ZW50IHBhc3NlZCBhcyBwYXJhbWV0ZXIgdG8gdGhlIGRyb3AoKSBtZXRob2QKLQkgKiBAcGFyYW0gdGFyZ2V0RmlsZSB0aGUgRmlsZSByZXByZXNlbnRpbmcgdGhlIGRyb3AgdGFyZ2V0IGxvY2F0aW9uCi0JICogICAgICAgIHVuZGVyIGluc3BlY3Rpb24sIG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXByaXZhdGUgdm9pZCBkcm9wVGFyZ2V0SGFuZGxlRHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIEZpbGUgdGFyZ2V0RmlsZSkgewotCQkvLyBHZXQgZHJvcHBlZCBkYXRhIChhbiBhcnJheSBvZiBmaWxlbmFtZXMpCi0JCWlmICghIGRyb3BUYXJnZXRWYWxpZGF0ZShldmVudCwgdGFyZ2V0RmlsZSkpIHJldHVybjsKLQkJZmluYWwgU3RyaW5nW10gc291cmNlTmFtZXMgPSAoU3RyaW5nW10pIGV2ZW50LmRhdGE7Ci0JCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKSBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHJldHVybjsKLQotCQkvLyBPcGVuIHByb2dyZXNzIGRpYWxvZwotCQlwcm9ncmVzc0RpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyhzaGVsbCwKLQkJCShldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkgPyBQcm9ncmVzc0RpYWxvZy5NT1ZFIDogUHJvZ3Jlc3NEaWFsb2cuQ09QWSk7Ci0JCXByb2dyZXNzRGlhbG9nLnNldFRvdGFsV29ya1VuaXRzKHNvdXJjZU5hbWVzLmxlbmd0aCk7Ci0JCXByb2dyZXNzRGlhbG9nLm9wZW4oKTsKLQotCQkvLyBDb3B5IGVhY2ggZmlsZQotCQlWZWN0b3IgLyogb2YgRmlsZSAqLyBwcm9jZXNzZWRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IChpIDwgc291cmNlTmFtZXMubGVuZ3RoKSAmJiAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKTsgaSsrKXsKLQkJCWZpbmFsIEZpbGUgc291cmNlID0gbmV3IEZpbGUoc291cmNlTmFtZXNbaV0pOwotCQkJZmluYWwgRmlsZSBkZXN0ID0gbmV3IEZpbGUodGFyZ2V0RmlsZSwgc291cmNlLmdldE5hbWUoKSk7Ci0JCQlpZiAoc291cmNlLmVxdWFscyhkZXN0KSkgY29udGludWU7IC8vIGlnbm9yZSBpZiBpbiBzYW1lIGxvY2F0aW9uCi0KLQkJCXByb2dyZXNzRGlhbG9nLnNldERldGFpbEZpbGUoc291cmNlLCBQcm9ncmVzc0RpYWxvZy5DT1BZKTsKLQkJCXdoaWxlICghIHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQlpZiAoY29weUZpbGVTdHJ1Y3R1cmUoc291cmNlLCBkZXN0KSkgewotCQkJCQlwcm9jZXNzZWRGaWxlcy5hZGQoc291cmNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmICghIHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFICYmICghaXNEcmFnZ2luZykpIHsKLQkJCQkJCS8vIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBub3RpZnkgYW4gZXh0ZXJuYWwgZHJhZyBzb3VyY2UgdGhhdCBhIGRyb3AKLQkJCQkJCS8vIG9wZXJhdGlvbiB3YXMgb25seSBwYXJ0aWFsbHkgc3VjY2Vzc2Z1bC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGEKLQkJCQkJCS8vIHByb2JsZW0gZm9yIERST1BfTU9WRSBvcGVyYXRpb25zIHNpbmNlIHVubGVzcyB0aGUgc291cmNlIGdldHMKLQkJCQkJCS8vIERST1BfTk9ORSwgaXQgd2lsbCBkZWxldGUgdGhlIG9yaWdpbmFsIGRhdGEgaW5jbHVkaW5nIGJpdHMgdGhhdAotCQkJCQkJLy8gbWF5IG5vdCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgc3VjY2Vzc2Z1bGx5LgotCQkJCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IgfCBTV1QuUkVUUlkgfCBTV1QuQ0FOQ0VMKTsKLQkJCQkJCWJveC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuRmFpbGVkQ29weS50aXRsZSIpKTsKLQkJCQkJCWJveC5zZXRNZXNzYWdlKGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuRmFpbGVkQ29weS5kZXNjcmlwdGlvbiIsCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgc291cmNlLCBkZXN0IH0pKTsKLQkJCQkJCWludCBidXR0b24gPSBib3gub3BlbigpOwotCQkJCQkJaWYgKGJ1dHRvbiA9PSBTV1QuQ0FOQ0VMKSB7Ci0JCQkJCQkJaSA9IHNvdXJjZU5hbWVzLmxlbmd0aDsKLQkJCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gV2UgY2FuIHJlY292ZXIgZ3JhY2VmdWxseSBmcm9tIGVycm9ycyBpZiB0aGUgZHJhZyBzb3VyY2UgYmVsb25ncwotCQkJCQkJLy8gdG8gdGhpcyBhcHBsaWNhdGlvbiBzaW5jZSBpdCB3aWxsIGxvb2sgYXQgcHJvY2Vzc2VkRHJvcEZpbGVzLgotCQkJCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IgfCBTV1QuQUJPUlQgfCBTV1QuUkVUUlkgfCBTV1QuSUdOT1JFKTsKLQkJCQkJCWJveC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuRmFpbGVkQ29weS50aXRsZSIpKTsKLQkJCQkJCWJveC5zZXRNZXNzYWdlKGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuRmFpbGVkQ29weS5kZXNjcmlwdGlvbiIsCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgc291cmNlLCBkZXN0IH0pKTsKLQkJCQkJCWludCBidXR0b24gPSBib3gub3BlbigpOwotCQkJCQkJaWYgKGJ1dHRvbiA9PSBTV1QuQUJPUlQpIGkgPSBzb3VyY2VOYW1lcy5sZW5ndGg7Ci0JCQkJCQlpZiAoYnV0dG9uICE9IFNXVC5SRVRSWSkgYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcHJvZ3Jlc3NEaWFsb2cuYWRkUHJvZ3Jlc3MoMSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzRHJhZ2dpbmcpIHsKLQkJCS8vIFJlbWVtYmVyIGV4YWN0bHkgd2hpY2ggZmlsZXMgd2UgcHJvY2Vzc2VkCi0JCQlwcm9jZXNzZWREcm9wRmlsZXMgPSAoKEZpbGVbXSkgcHJvY2Vzc2VkRmlsZXMudG9BcnJheShuZXcgRmlsZVtwcm9jZXNzZWRGaWxlcy5zaXplKCldKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9ncmVzc0RpYWxvZy5jbG9zZSgpOwotCQkJcHJvZ3Jlc3NEaWFsb2cgPSBudWxsOwotCQl9Ci0JCW5vdGlmeVJlZnJlc2hGaWxlcyhuZXcgRmlsZVtdIHsgdGFyZ2V0RmlsZSB9KTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIHRoZSBjb21wbGV0aW9uIG9mIGEgZHJhZyBvbiBhIGRyYWdTb3VyY2UuCi0JICogPHA+Ci0JICogVXNlZCBpbiBkcmFnRmluaXNoZWQoKS48YnI+Ci0JICogPC9wPgotCSAqIEBwYXJhbSBldmVudCB0aGUgRHJhZ1NvdXJjZUV2ZW50IHBhc3NlZCBhcyBwYXJhbWV0ZXIgdG8gdGhlIGRyYWdGaW5pc2hlZCgpIG1ldGhvZAotCSAqIEBwYXJhbSBzb3VyY2VOYW1lcyB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRoYXQgd2VyZSBkcmFnZ2VkIChldmVudC5kYXRhIGlzIGludmFsaWQpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRyYWdTb3VyY2VIYW5kbGVEcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50LCBTdHJpbmdbXSBzb3VyY2VOYW1lcykgewotCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoZXZlbnQuZGV0YWlsICE9IERORC5EUk9QX01PVkUpIHJldHVybjsKLQotCQkvLyBHZXQgYXJyYXkgb2YgZmlsZXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHRyYW5zZmVycmVkCi0JCWZpbmFsIEZpbGVbXSBzb3VyY2VGaWxlczsKLQkJaWYgKHByb2Nlc3NlZERyb3BGaWxlcyAhPSBudWxsKSB7Ci0JCQlzb3VyY2VGaWxlcyA9IHByb2Nlc3NlZERyb3BGaWxlczsKLQkJfSBlbHNlIHsKLQkJCXNvdXJjZUZpbGVzID0gbmV3IEZpbGVbc291cmNlTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyArK2kpCi0JCQkJc291cmNlRmlsZXNbaV0gPSBuZXcgRmlsZShzb3VyY2VOYW1lc1tpXSk7Ci0JCX0JCi0JCWlmIChwcm9ncmVzc0RpYWxvZyA9PSBudWxsKQotCQkJcHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coc2hlbGwsIFByb2dyZXNzRGlhbG9nLk1PVkUpOwotCQlwcm9ncmVzc0RpYWxvZy5zZXRUb3RhbFdvcmtVbml0cyhzb3VyY2VGaWxlcy5sZW5ndGgpOwotCQlwcm9ncmVzc0RpYWxvZy5zZXRQcm9ncmVzcygwKTsKLQkJcHJvZ3Jlc3NEaWFsb2cub3BlbigpOwotCi0JCS8vIERlbGV0ZSBlYWNoIGZpbGUKLQkJZm9yIChpbnQgaSA9IDA7IChpIDwgc291cmNlRmlsZXMubGVuZ3RoKSAmJiAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKTsgaSsrKXsKLQkJCWZpbmFsIEZpbGUgc291cmNlID0gc291cmNlRmlsZXNbaV07Ci0JCQlwcm9ncmVzc0RpYWxvZy5zZXREZXRhaWxGaWxlKHNvdXJjZSwgUHJvZ3Jlc3NEaWFsb2cuREVMRVRFKTsKLQkJCXdoaWxlICghIHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQlpZiAoZGVsZXRlRmlsZVN0cnVjdHVyZShzb3VyY2UpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SIHwgU1dULkFCT1JUIHwgU1dULlJFVFJZIHwgU1dULklHTk9SRSk7Ci0JCQkJCWJveC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuRmFpbGVkRGVsZXRlLnRpdGxlIikpOwotCQkJCQlib3guc2V0TWVzc2FnZShnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZERlbGV0ZS5kZXNjcmlwdGlvbiIsCi0JCQkJCQluZXcgT2JqZWN0W10geyBzb3VyY2UgfSkpOwotCQkJCQlpbnQgYnV0dG9uID0gYm94Lm9wZW4oKTsKLQkJCQkJaWYgKGJ1dHRvbiA9PSBTV1QuQUJPUlQpIGkgPSBzb3VyY2VOYW1lcy5sZW5ndGg7Ci0JCQkJCWlmIChidXR0b24gPT0gU1dULlJFVFJZKSBicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlwcm9ncmVzc0RpYWxvZy5hZGRQcm9ncmVzcygxKTsKLQkJfQotCQlub3RpZnlSZWZyZXNoRmlsZXMoc291cmNlRmlsZXMpOwotCQlwcm9ncmVzc0RpYWxvZy5jbG9zZSgpOwotCQlwcm9ncmVzc0RpYWxvZyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBmaWxlc3lzdGVtIHJvb3QgZW50cmllcwotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgRmlsZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcm9vdCBkaXJlY3RvcmllcyBvbiB0aGUgcGxhdGZvcm0sCi0JICogICAgICAgICBtYXkgYmUgZW1wdHkgYnV0IG5vdCBudWxsCi0JICovCi0JRmlsZVtdIGdldFJvb3RzKCkgewotCQkvKgotCQkgKiBPbiBKREsgMS4yMiBvbmx5Li4uCi0JCSAqLwotCQkvLyByZXR1cm4gRmlsZS5saXN0Um9vdHMoKTsKLQotCQkvKgotCQkgKiBPbiBKREsgMS4xLjcgYW5kIGJleW9uZC4uLgotCQkgKiAtLSBQT1JUQUJJTElUWSBJU1NVRVMgSEVSRSAtLQotCQkgKi8KLQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSAoIm9zLm5hbWUiKS5pbmRleE9mICgiV2luZG93cyIpICE9IC0xKSB7Ci0JCQlWZWN0b3IgLyogb2YgRmlsZSAqLyBsaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJbGlzdC5hZGQobmV3IEZpbGUoRFJJVkVfQSkpOwotCQkJbGlzdC5hZGQobmV3IEZpbGUoRFJJVkVfQikpOwotCQkJZm9yIChjaGFyIGkgPSAnYyc7IGkgPD0gJ3onOyArK2kpIHsKLQkJCQlGaWxlIGRyaXZlID0gbmV3IEZpbGUoaSArICI6IiArIEZpbGUuc2VwYXJhdG9yKTsKLQkJCQlpZiAoZHJpdmUuaXNEaXJlY3RvcnkoKSAmJiBkcml2ZS5leGlzdHMoKSkgewotCQkJCQlsaXN0LmFkZChkcml2ZSk7Ci0JCQkJCWlmIChpbml0aWFsICYmIGkgPT0gJ2MnKSB7Ci0JCQkJCQljdXJyZW50RGlyZWN0b3J5ID0gZHJpdmU7Ci0JCQkJCQlpbml0aWFsID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlGaWxlW10gcm9vdHMgPSAoRmlsZVtdKSBsaXN0LnRvQXJyYXkobmV3IEZpbGVbbGlzdC5zaXplKCldKTsKLQkJCXNvcnRGaWxlcyhyb290cyk7Ci0JCQlyZXR1cm4gcm9vdHM7Ci0JCX0KLQkJRmlsZSByb290ID0gbmV3IEZpbGUoRmlsZS5zZXBhcmF0b3IpOwotCQlpZiAoaW5pdGlhbCkgewotCQkJY3VycmVudERpcmVjdG9yeSA9IHJvb3Q7Ci0JCQlpbml0aWFsID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBGaWxlW10geyByb290IH07Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGRpcmVjdG9yeSBsaXN0aW5nCi0JICogCi0JICogQHBhcmFtIGZpbGUgdGhlIGRpcmVjdG9yeSB0byBiZSBsaXN0ZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZpbGVzIHRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zLCBtYXkgYmUgZW1wdHkgYnV0IG5vdCBudWxsCi0JICovCi0Jc3RhdGljIEZpbGVbXSBnZXREaXJlY3RvcnlMaXN0KEZpbGUgZmlsZSkgewotCQlGaWxlW10gbGlzdCA9IGZpbGUubGlzdEZpbGVzKCk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHJldHVybiBuZXcgRmlsZVswXTsKLQkJc29ydEZpbGVzKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIGEgZmlsZSBvciBlbnRpcmUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkRmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIG9sZCBmaWxlIG9yIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBuZXdGaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmV3IGZpbGUgb3IgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0cnVlIGlmZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIHdpdGhvdXQgZXJyb3JzCi0JICovCi0JYm9vbGVhbiBjb3B5RmlsZVN0cnVjdHVyZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlpZiAob2xkRmlsZSA9PSBudWxsIHx8IG5ld0ZpbGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkKLQkJLy8gZW5zdXJlIHRoYXQgbmV3RmlsZSBpcyBub3QgYSBjaGlsZCBvZiBvbGRGaWxlIG9yIGEgZHVwZQotCQlGaWxlIHNlYXJjaEZpbGUgPSBuZXdGaWxlOwotCQlkbyB7Ci0JCQlpZiAob2xkRmlsZS5lcXVhbHMoc2VhcmNoRmlsZSkpIHJldHVybiBmYWxzZTsKLQkJCXNlYXJjaEZpbGUgPSBzZWFyY2hGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJfSB3aGlsZSAoc2VhcmNoRmlsZSAhPSBudWxsKTsKLQkJCi0JCWlmIChvbGRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCS8qCi0JCQkgKiBDb3B5IGEgZGlyZWN0b3J5Ci0JCQkgKi8KLQkJCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NEaWFsb2cuc2V0RGV0YWlsRmlsZShvbGRGaWxlLCBQcm9ncmVzc0RpYWxvZy5DT1BZKTsKLQkJCX0KLQkJCWlmIChzaW11bGF0ZU9ubHkpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihnZXRSZXNvdXJjZVN0cmluZygic2ltdWxhdGUuRGlyZWN0b3JpZXNDcmVhdGVkLnRleHQiLAotCQkJCS8vCW5ldyBPYmplY3RbXSB7IG5ld0ZpbGUuZ2V0UGF0aCgpIH0pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCEgbmV3RmlsZS5ta2RpcnMoKSkgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJRmlsZVtdIHN1YkZpbGVzID0gb2xkRmlsZS5saXN0RmlsZXMoKTsKLQkJCWlmIChzdWJGaWxlcyAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCQkJcHJvZ3Jlc3NEaWFsb2cuYWRkV29ya1VuaXRzKHN1YkZpbGVzLmxlbmd0aCk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBvbGRTdWJGaWxlID0gc3ViRmlsZXNbaV07Ci0JCQkJCUZpbGUgbmV3U3ViRmlsZSA9IG5ldyBGaWxlKG5ld0ZpbGUsIG9sZFN1YkZpbGUuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKCEgY29weUZpbGVTdHJ1Y3R1cmUob2xkU3ViRmlsZSwgbmV3U3ViRmlsZSkpIHJldHVybiBmYWxzZTsKLQkJCQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCQkJCXByb2dyZXNzRGlhbG9nLmFkZFByb2dyZXNzKDEpOwotCQkJCQkJaWYgKHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpIHJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBDb3B5IGEgZmlsZQotCQkJICovCi0JCQlpZiAoc2ltdWxhdGVPbmx5KSB7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oZ2V0UmVzb3VyY2VTdHJpbmcoInNpbXVsYXRlLkNvcHlGcm9tVG8udGV4dCIsCi0JCQkJLy8JbmV3IE9iamVjdFtdIHsgb2xkRmlsZS5nZXRQYXRoKCksIG5ld0ZpbGUuZ2V0UGF0aCgpIH0pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRmlsZVJlYWRlciBpbiA9IG51bGw7Ci0JCQkJRmlsZVdyaXRlciBvdXQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWluID0gbmV3IEZpbGVSZWFkZXIob2xkRmlsZSk7Ci0JCQkJCW91dCA9IG5ldyBGaWxlV3JpdGVyKG5ld0ZpbGUpOwotCQkJCi0JCQkJCWludCBjb3VudDsKLQkJCQkJd2hpbGUgKChjb3VudCA9IGluLnJlYWQoKSkgIT0gLTEpIG91dC53cml0ZShjb3VudCk7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoaW4gIT0gbnVsbCkgaW4uY2xvc2UoKTsKLQkJCQkJCWlmIChvdXQgIT0gbnVsbCkgb3V0LmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGEgZmlsZSBvciBlbnRpcmUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkRmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIG9sZCBmaWxlIG9yIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyB3aXRob3V0IGVycm9ycwotCSAqLwotCWJvb2xlYW4gZGVsZXRlRmlsZVN0cnVjdHVyZShGaWxlIG9sZEZpbGUpIHsKLQkJaWYgKG9sZEZpbGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwkJCi0JCWlmIChvbGRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCS8qCi0JCQkgKiBEZWxldGUgYSBkaXJlY3RvcnkKLQkJCSAqLwotCQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCQlwcm9ncmVzc0RpYWxvZy5zZXREZXRhaWxGaWxlKG9sZEZpbGUsIFByb2dyZXNzRGlhbG9nLkRFTEVURSk7Ci0JCQl9Ci0JCQlGaWxlW10gc3ViRmlsZXMgPSBvbGRGaWxlLmxpc3RGaWxlcygpOwotCQkJaWYgKHN1YkZpbGVzICE9IG51bGwpIHsKLQkJCQlpZiAocHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgewotCQkJCQlwcm9ncmVzc0RpYWxvZy5hZGRXb3JrVW5pdHMoc3ViRmlsZXMubGVuZ3RoKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIG9sZFN1YkZpbGUgPSBzdWJGaWxlc1tpXTsKLQkJCQkJaWYgKCEgZGVsZXRlRmlsZVN0cnVjdHVyZShvbGRTdWJGaWxlKSkgcmV0dXJuIGZhbHNlOwotCQkJCQlpZiAocHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgewotCQkJCQkJcHJvZ3Jlc3NEaWFsb2cuYWRkUHJvZ3Jlc3MoMSk7Ci0JCQkJCQlpZiAocHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSkgcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzaW11bGF0ZU9ubHkpIHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKGdldFJlc291cmNlU3RyaW5nKCJzaW11bGF0ZS5EZWxldGUudGV4dCIsCi0JCQkvLwluZXcgT2JqZWN0W10geyBvbGRGaWxlLmdldFBhdGgoKSwgb2xkRmlsZS5nZXRQYXRoKCkgfSkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIG9sZEZpbGUuZGVsZXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIFNvcnRzIGZpbGVzIGxleGljb2dyYXBoaWNhbGx5IGJ5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIGZpbGVzIHRoZSBhcnJheSBvZiBGaWxlcyB0byBiZSBzb3J0ZWQKLQkgKi8KLQlzdGF0aWMgdm9pZCBzb3J0RmlsZXMoRmlsZVtdIGZpbGVzKSB7Ci0JCS8qIFZlcnkgbGF6eSBtZXJnZSBzb3J0IGFsZ29yaXRobSAqLwotCQlzb3J0QmxvY2soZmlsZXMsIDAsIGZpbGVzLmxlbmd0aCAtIDEsIG5ldyBGaWxlW2ZpbGVzLmxlbmd0aF0pOwotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNvcnRCbG9jayhGaWxlW10gZmlsZXMsIGludCBzdGFydCwgaW50IGVuZCwgRmlsZVtdIG1lcmdlVGVtcCkgewotCQlmaW5hbCBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQgKyAxOwotCQlpZiAobGVuZ3RoIDwgOCkgewotCQkJZm9yIChpbnQgaSA9IGVuZDsgaSA+IHN0YXJ0OyAtLWkpIHsKLQkJCQlmb3IgKGludCBqID0gZW5kOyBqID4gc3RhcnQ7IC0taikgIHsKLQkJCQkJaWYgKGNvbXBhcmVGaWxlcyhmaWxlc1tqIC0gMV0sIGZpbGVzW2pdKSA+IDApIHsKLQkJCQkJICAgIGZpbmFsIEZpbGUgdGVtcCA9IGZpbGVzW2pdOyAKLQkJCQkJICAgIGZpbGVzW2pdID0gZmlsZXNbai0xXTsgCi0JCQkJCSAgICBmaWxlc1tqLTFdID0gdGVtcDsKLQkJCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlmaW5hbCBpbnQgbWlkID0gKHN0YXJ0ICsgZW5kKSAvIDI7Ci0JCXNvcnRCbG9jayhmaWxlcywgc3RhcnQsIG1pZCwgbWVyZ2VUZW1wKTsKLQkJc29ydEJsb2NrKGZpbGVzLCBtaWQgKyAxLCBlbmQsIG1lcmdlVGVtcCk7Ci0JCWludCB4ID0gc3RhcnQ7Ci0JCWludCB5ID0gbWlkICsgMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotCQkJaWYgKCh4ID4gbWlkKSB8fCAoKHkgPD0gZW5kKSAmJiBjb21wYXJlRmlsZXMoZmlsZXNbeF0sIGZpbGVzW3ldKSA+IDApKSB7Ci0JCQkJbWVyZ2VUZW1wW2ldID0gZmlsZXNbeSsrXTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVyZ2VUZW1wW2ldID0gZmlsZXNbeCsrXTsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBmaWxlc1tpICsgc3RhcnRdID0gbWVyZ2VUZW1wW2ldOwotCX0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY29tcGFyZUZpbGVzKEZpbGUgYSwgRmlsZSBiKSB7Ci0vLwkJYm9vbGVhbiBhSXNEaXIgPSBhLmlzRGlyZWN0b3J5KCk7Ci0vLwkJYm9vbGVhbiBiSXNEaXIgPSBiLmlzRGlyZWN0b3J5KCk7Ci0vLwkJaWYgKGFJc0RpciAmJiAhIGJJc0RpcikgcmV0dXJuIC0xOwotLy8JCWlmIChiSXNEaXIgJiYgISBhSXNEaXIpIHJldHVybiAxOwotCi0JCS8vIHNvcnQgY2FzZS1zZW5zaXRpdmUgZmlsZXMgaW4gYSBjYXNlLWluc2Vuc2l0aXZlIG1hbm5lcgotCQlpbnQgY29tcGFyZSA9IGEuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoYi5nZXROYW1lKCkpOwotCQlpZiAoY29tcGFyZSA9PSAwKSBjb21wYXJlID0gYS5nZXROYW1lKCkuY29tcGFyZVRvKGIuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGNvbXBhcmU7Ci0JfQotCQotCS8qCi0JICogVGhpcyB3b3JrZXIgdXBkYXRlcyB0aGUgdGFibGUgd2l0aCBmaWxlIGluZm9ybWF0aW9uIGluIHRoZSBiYWNrZ3JvdW5kLgotCSAqIDxwPgotCSAqIEltcGxlbWVudGF0aW9uIG5vdGVzOgotCSAqIDx1bD4KLQkgKiA8bGk+IEl0IGlzIGRlc2lnbmVkIHN1Y2ggdGhhdCBpdCBjYW4gYmUgaW50ZXJydXB0ZWQgY2xlYW5seS4KLQkgKiA8bGk+IEl0IHVzZXMgYXN5bmNFeGVjKCkgaW4gc29tZSBwbGFjZXMgdG8gZW5zdXJlIHRoYXQgU1dUIFdpZGdldHMgYXJlIG1hbmlwdWxhdGVkIGluIHRoZQotCSAqICAgICAgcmlnaHQgdGhyZWFkLiAgRXhjbHVzaXZlIHVzZSBvZiBzeW5jRXhlYygpIHdvdWxkIGJlIGluYXBwcm9wcmlhdGUgYXMgaXQgd291bGQgcmVxdWlyZSBhIHBhaXIKLQkgKiAgICAgIG9mIGNvbnRleHQgc3dpdGNoZXMgYmV0d2VlbiBlYWNoIHRhYmxlIHVwZGF0ZSBvcGVyYXRpb24uCi0JICogPC91bD4KLQkgKiA8L3A+Ci0JICovCi0KLQkvKioKLQkgKiBTdG9wcyB0aGUgd29ya2VyIGFuZCB3YWl0cyBmb3IgaXQgdG8gdGVybWluYXRlLgotCSAqLwotCXZvaWQgd29ya2VyU3RvcCgpIHsKLQkJaWYgKHdvcmtlclRocmVhZCA9PSBudWxsKSByZXR1cm47Ci0JCXN5bmNocm9uaXplZCh3b3JrZXJMb2NrKSB7Ci0JCQl3b3JrZXJDYW5jZWxsZWQgPSB0cnVlOwotCQkJd29ya2VyU3RvcHBlZCA9IHRydWU7Ci0JCQl3b3JrZXJMb2NrLm5vdGlmeUFsbCgpOwotCQl9Ci0JCXdoaWxlICh3b3JrZXJUaHJlYWQgIT0gbnVsbCkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHdvcmtlciB0aGF0IGl0IHNob3VsZCB1cGRhdGUgaXRzZWxmIHdpdGggbmV3IGRhdGEuCi0JICogQ2FuY2VscyBhbnkgcHJldmlvdXMgb3BlcmF0aW9uIGFuZCBiZWdpbnMgYSBuZXcgb25lLgotCSAqIAotCSAqIEBwYXJhbSBkaXIgdGhlIG5ldyBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHRhYmxlLCBudWxsIGlzIGlnbm9yZWQKLQkgKiBAcGFyYW0gZm9yY2UgaWYgdHJ1ZSBjYXVzZXMgYSByZWZyZXNoIGV2ZW4gaWYgdGhlIGRhdGEgaXMgdGhlIHNhbWUKLQkgKi8KLQl2b2lkIHdvcmtlclVwZGF0ZShGaWxlIGRpciwgYm9vbGVhbiBmb3JjZSkgewotCQlpZiAoZGlyID09IG51bGwpIHJldHVybjsKLQkJaWYgKCghZm9yY2UpICYmICh3b3JrZXJOZXh0RGlyICE9IG51bGwpICYmICh3b3JrZXJOZXh0RGlyLmVxdWFscyhkaXIpKSkgcmV0dXJuOwotCi0JCXN5bmNocm9uaXplZCh3b3JrZXJMb2NrKSB7Ci0JCQl3b3JrZXJOZXh0RGlyID0gZGlyOwotCQkJd29ya2VyU3RvcHBlZCA9IGZhbHNlOwotCQkJd29ya2VyQ2FuY2VsbGVkID0gdHJ1ZTsKLQkJCXdvcmtlckxvY2subm90aWZ5QWxsKCk7Ci0JCX0KLQkJaWYgKHdvcmtlclRocmVhZCA9PSBudWxsKSB7Ci0JCQl3b3JrZXJUaHJlYWQgPSBuZXcgVGhyZWFkKHdvcmtlclJ1bm5hYmxlKTsKLQkJCXdvcmtlclRocmVhZC5zdGFydCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFuYWdlcyB0aGUgd29ya2VyJ3MgdGhyZWFkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSB3b3JrZXJSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJd2hpbGUgKCEgd29ya2VyU3RvcHBlZCkgewotCQkJCXN5bmNocm9uaXplZCh3b3JrZXJMb2NrKSB7Ci0JCQkJCXdvcmtlckNhbmNlbGxlZCA9IGZhbHNlOwotCQkJCQl3b3JrZXJTdGF0ZURpciA9IHdvcmtlck5leHREaXI7Ci0JCQkJfQotCQkJCXdvcmtlckV4ZWN1dGUoKTsKLQkJCQlzeW5jaHJvbml6ZWQod29ya2VyTG9jaykgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKCghd29ya2VyQ2FuY2VsbGVkKSAmJiAod29ya2VyU3RhdGVEaXIgPT0gd29ya2VyTmV4dERpcikpIHdvcmtlckxvY2sud2FpdCgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl3b3JrZXJUaHJlYWQgPSBudWxsOwotCQkJLy8gd2FrZSB1cCBVSSB0aHJlYWQgaW4gY2FzZSBpdCBpcyBpbiBhIG1vZGFsIGxvb3AgYXdhaXRpbmcgdGhyZWFkIHRlcm1pbmF0aW9uCi0JCQkvLyAoc2VlIHdvcmtlclN0b3AoKSkKLQkJCWRpc3BsYXkud2FrZSgpOwotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSB0YWJsZSdzIGNvbnRlbnRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdvcmtlckV4ZWN1dGUoKSB7Ci0JCUZpbGVbXSBkaXJMaXN0OwotCQkvLyBDbGVhciBleGlzdGluZyBpbmZvcm1hdGlvbgotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0YWJsZUNvbnRlbnRzT2ZMYWJlbC5zZXRUZXh0KEZpbGVWaWV3ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoImRldGFpbHMuQ29udGVudHNPZi50ZXh0IiwKLQkJCQkJbmV3IE9iamVjdFtdIHsgd29ya2VyU3RhdGVEaXIuZ2V0UGF0aCgpIH0pKTsKLQkJCQl0YWJsZS5yZW1vdmVBbGwoKTsKLQkJCQl0YWJsZS5zZXREYXRhKFRBQkxFREFUQV9ESVIsIHdvcmtlclN0YXRlRGlyKTsKLQkJCX0KLQkJfSk7Ci0JCWRpckxpc3QgPSBnZXREaXJlY3RvcnlMaXN0KHdvcmtlclN0YXRlRGlyKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyAoISB3b3JrZXJDYW5jZWxsZWQpICYmIChpIDwgZGlyTGlzdC5sZW5ndGgpOyBpKyspIHsKLQkJCXdvcmtlckFkZEZpbGVEZXRhaWxzKGRpckxpc3RbaV0pOwotCQl9Ci0KLQl9Ci0JCQotCS8qKgotCSAqIEFkZHMgYSBmaWxlJ3MgZGV0YWlsIGluZm9ybWF0aW9uIHRvIHRoZSBkaXJlY3RvcnkgbGlzdAotCSAqLwotCXByaXZhdGUgdm9pZCB3b3JrZXJBZGRGaWxlRGV0YWlscyhmaW5hbCBGaWxlIGZpbGUpIHsKLQkJZmluYWwgU3RyaW5nIG5hbWVTdHJpbmcgPSBmaWxlLmdldE5hbWUoKTsKLQkJZmluYWwgU3RyaW5nIGRhdGVTdHJpbmcgPSBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZShmaWxlLmxhc3RNb2RpZmllZCgpKSk7Ci0JCWZpbmFsIFN0cmluZyBzaXplU3RyaW5nOwotCQlmaW5hbCBTdHJpbmcgdHlwZVN0cmluZzsKLQkJZmluYWwgSW1hZ2UgaWNvbkltYWdlOwotCQkKLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJdHlwZVN0cmluZyA9IGdldFJlc291cmNlU3RyaW5nKCJmaWxldHlwZS5Gb2xkZXIiKTsKLQkJCXNpemVTdHJpbmcgPSAiIjsKLQkJCWljb25JbWFnZSA9IGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbkNsb3NlZEZvbGRlcl07Ci0JCX0gZWxzZSB7Ci0JCQlzaXplU3RyaW5nID0gZ2V0UmVzb3VyY2VTdHJpbmcoImZpbGVzaXplLktCIiwKLQkJCQluZXcgT2JqZWN0W10geyBuZXcgTG9uZygoZmlsZS5sZW5ndGgoKSArIDUxMikgLyAxMDI0KSB9KTsKLQkJCQotCQkJaW50IGRvdCA9IG5hbWVTdHJpbmcubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChkb3QgIT0gLTEpIHsKLQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gbmFtZVN0cmluZy5zdWJzdHJpbmcoZG90KTsKLQkJCQlQcm9ncmFtIHByb2dyYW0gPSBQcm9ncmFtLmZpbmRQcm9ncmFtKGV4dGVuc2lvbik7Ci0JCQkJaWYgKHByb2dyYW0gIT0gbnVsbCkgewotCQkJCQl0eXBlU3RyaW5nID0gcHJvZ3JhbS5nZXROYW1lKCk7Ci0JCQkJCWljb25JbWFnZSA9IGljb25DYWNoZS5nZXRJY29uRnJvbVByb2dyYW0ocHJvZ3JhbSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHlwZVN0cmluZyA9IGdldFJlc291cmNlU3RyaW5nKCJmaWxldHlwZS5Vbmtub3duIiwgbmV3IE9iamVjdFtdIHsgZXh0ZW5zaW9uLnRvVXBwZXJDYXNlKCkgfSk7Ci0JCQkJCWljb25JbWFnZSA9IGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbkZpbGVdOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdHlwZVN0cmluZyA9IGdldFJlc291cmNlU3RyaW5nKCJmaWxldHlwZS5Ob25lIik7Ci0JCQkJaWNvbkltYWdlID0gaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uRmlsZV07Ci0JCQl9Ci0JCX0KLQkJZmluYWwgU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbXSB7IG5hbWVTdHJpbmcsIHNpemVTdHJpbmcsIHR5cGVTdHJpbmcsIGRhdGVTdHJpbmcgfTsKLQotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQkJLy8gZ3VhcmQgYWdhaW5zdCB0aGUgc2hlbGwgYmVpbmcgY2xvc2VkIGJlZm9yZSB0aGlzIHJ1bnMKLQkJCQlpZiAoc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQkJCXRhYmxlSXRlbS5zZXRUZXh0KHN0cmluZ3MpOwotCQkJCXRhYmxlSXRlbS5zZXRJbWFnZShpY29uSW1hZ2UpOwotCQkJCXRhYmxlSXRlbS5zZXREYXRhKFRBQkxFSVRFTURBVEFfRklMRSwgZmlsZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBtYW5hZ2UgYSBwcm9ncmVzcyBkaWFsb2cgZm9yIGZpbGUgb3BlcmF0aW9ucy4KLQkgKi8KLQljbGFzcyBQcm9ncmVzc0RpYWxvZyB7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPUFkgPSAwOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUxFVEUgPSAxOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBNT1ZFID0gMjsKLQotCQlTaGVsbCBzaGVsbDsKLQkJTGFiZWwgbWVzc2FnZUxhYmVsLCBkZXRhaWxMYWJlbDsKLQkJUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXI7Ci0JCUJ1dHRvbiBjYW5jZWxCdXR0b247Ci0JCWJvb2xlYW4gaXNDYW5jZWxsZWQgPSBmYWxzZTsKLQotCQlmaW5hbCBTdHJpbmcgb3BlcmF0aW9uS2V5TmFtZVtdID0gewotCQkJIkNvcHkiLAotCQkJIkRlbGV0ZSIsCi0JCQkiTW92ZSIKLQkJfTsKLQkKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBwcm9ncmVzcyBkaWFsb2cgYnV0IGRvZXMgbm90IG9wZW4gaXQgaW1tZWRpYXRlbHkuCi0JCSAqIAotCQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgU2hlbGwKLQkJICogQHBhcmFtIHN0eWxlIG9uZSBvZiBDT1BZLCBNT1ZFCi0JCSAqLwotCQlwdWJsaWMgUHJvZ3Jlc3NEaWFsb2coU2hlbGwgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJCXNoZWxsID0gbmV3IFNoZWxsKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5USVRMRSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJc2hlbGwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygicHJvZ3Jlc3NEaWFsb2cuIiArIG9wZXJhdGlvbktleU5hbWVbc3R5bGVdICsgIi50aXRsZSIpKTsKLQkJCXNoZWxsLmFkZFNoZWxsTGlzdGVuZXIobmV3IFNoZWxsQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHsKLQkJCQkJaXNDYW5jZWxsZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5IT1JJWk9OVEFMKTsKLQkJCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQltZXNzYWdlTGFiZWwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygicHJvZ3Jlc3NEaWFsb2cuIiArIG9wZXJhdGlvbktleU5hbWVbc3R5bGVdICsgIi5kZXNjcmlwdGlvbiIpKTsKLQkJCQotCQkJcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc2hlbGwsIFNXVC5IT1JJWk9OVEFMIHwgU1dULldSQVApOwotCQkJcHJvZ3Jlc3NCYXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkJcHJvZ3Jlc3NCYXIuc2V0TWluaW11bSgwKTsKLQkJCXByb2dyZXNzQmFyLnNldE1heGltdW0oMCk7Ci0JCQkKLQkJCWRldGFpbExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQkJZGV0YWlsTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkKLQkJCWNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJCWNhbmNlbEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCWNhbmNlbEJ1dHRvbi5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJwcm9ncmVzc0RpYWxvZy5jYW5jZWxCdXR0b24udGV4dCIpKTsKLQkJCWNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlzQ2FuY2VsbGVkID0gdHJ1ZTsKLQkJCQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCS8qKgotCQkgKiBTZXRzIHRoZSBkZXRhaWwgdGV4dCB0byBzaG93IHRoZSBmaWxlbmFtZSBhbG9uZyB3aXRoIGEgc3RyaW5nCi0JCSAqIHJlcHJlc2VudGluZyB0aGUgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCBvbiB0aGF0IGZpbGUuCi0JCSAqIAotCQkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBiZSBkZXRhaWxlZAotCQkgKiBAcGFyYW0gb3BlcmF0aW9uIG9uZSBvZiBDT1BZLCBERUxFVEUKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldERldGFpbEZpbGUoRmlsZSBmaWxlLCBpbnQgb3BlcmF0aW9uKSB7Ci0JCQlkZXRhaWxMYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJwcm9ncmVzc0RpYWxvZy4iICsgb3BlcmF0aW9uS2V5TmFtZVtvcGVyYXRpb25dICsgIi5vcGVyYXRpb24iLAotCQkJCW5ldyBPYmplY3RbXSB7IGZpbGUgfSkpOwotCQl9Ci0JCS8qKgotCQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENhbmNlbCBidXR0b24gd2FzIGJlZW4gY2xpY2tlZC4KLQkJICogCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgQ2FuY2VsIGJ1dHRvbiB3YXMgY2xpY2tlZC4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQkJcmV0dXJuIGlzQ2FuY2VsbGVkOwotCQl9Ci0JCS8qKgotCQkgKiBTZXRzIHRoZSB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cyB0byBiZSBwZXJmb3JtZWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gd29yayB0aGUgdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFRvdGFsV29ya1VuaXRzKGludCB3b3JrKSB7Ci0JCQlwcm9ncmVzc0Jhci5zZXRNYXhpbXVtKHdvcmspOwotCQl9Ci0JCS8qKgotCQkgKiBBZGRzIHRvIHRoZSB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cyB0byBiZSBwZXJmb3JtZWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gd29yayB0aGUgbnVtYmVyIG9mIHdvcmsgdW5pdHMgdG8gYWRkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRXb3JrVW5pdHMoaW50IHdvcmspIHsKLQkJCXNldFRvdGFsV29ya1VuaXRzKHByb2dyZXNzQmFyLmdldE1heGltdW0oKSArIHdvcmspOwotCQl9Ci0JCS8qKgotCQkgKiBTZXRzIHRoZSBwcm9ncmVzcyBvZiBjb21wbGV0aW9uIG9mIHRoZSB0b3RhbCB3b3JrIHVuaXRzLgotCQkgKiAKLQkJICogQHBhcmFtIHdvcmsgdGhlIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzIGNvbXBsZXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3MoaW50IHdvcmspIHsKLQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbih3b3JrKTsKLQkJCXdoaWxlIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7fSAvLyBlbmFibGUgZXZlbnQgcHJvY2Vzc2luZwotCQl9Ci0JCS8qKgotCQkgKiBBZGRzIHRvIHRoZSBwcm9ncmVzcyBvZiBjb21wbGV0aW9uIG9mIHRoZSB0b3RhbCB3b3JrIHVuaXRzLgotCQkgKiAKLQkJICogQHBhcmFtIHdvcmsgdGhlIG51bWJlciBvZiB3b3JrIHVuaXRzIGNvbXBsZXRlZCB0byBhZGQKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZFByb2dyZXNzKGludCB3b3JrKSB7Ci0JCQlzZXRQcm9ncmVzcyhwcm9ncmVzc0Jhci5nZXRTZWxlY3Rpb24oKSArIHdvcmspOwotCQl9Ci0JCS8qKgotCQkgKiBPcGVucyB0aGUgZGlhbG9nLgotCQkgKi8KLQkJcHVibGljIHZvaWQgb3BlbigpIHsKLQkJCXNoZWxsLnBhY2soKTsKLQkJCWZpbmFsIFNoZWxsIHBhcmVudFNoZWxsID0gKFNoZWxsKSBzaGVsbC5nZXRQYXJlbnQoKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gcGFyZW50U2hlbGwuZ2V0Qm91bmRzKCk7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0JCQlib3VuZHMueCA9IHJlY3QueCArIChyZWN0LndpZHRoIC0gYm91bmRzLndpZHRoKSAvIDI7Ci0JCQlib3VuZHMueSA9IHJlY3QueSArIChyZWN0LmhlaWdodCAtIGJvdW5kcy5oZWlnaHQpIC8gMjsKLQkJCXNoZWxsLnNldEJvdW5kcyhib3VuZHMpOwotCQkJc2hlbGwub3BlbigpOwotCQl9Ci0JCS8qKgotCQkgKiBDbG9zZXMgdGhlIGRpYWxvZyBhbmQgZGlzcG9zZXMgaXRzIHJlc291cmNlcy4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCXNoZWxsID0gbnVsbDsKLQkJCW1lc3NhZ2VMYWJlbCA9IG51bGw7Ci0JCQlkZXRhaWxMYWJlbCA9IG51bGw7Ci0JCQlwcm9ncmVzc0JhciA9IG51bGw7Ci0JCQljYW5jZWxCdXR0b24gPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9JY29uQ2FjaGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvSWNvbkNhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxNGRjOTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9JY29uQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmZpbGV2aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogTWFuYWdlcyBpY29ucyBmb3IgdGhlIGFwcGxpY2F0aW9uLgotICogVGhpcyBpcyBuZWNlc3NhcnkgYXMgd2UgY291bGQgZWFzaWx5IGVuZCB1cCBjcmVhdGluZyB0aG91c2FuZHMgb2YgaWNvbnMKLSAqIGJlYXJpbmcgdGhlIHNhbWUgaW1hZ2UuCi0gKi8KLWNsYXNzIEljb25DYWNoZSB7Ci0JLy8gU3RvY2sgaW1hZ2VzCi0JcHVibGljIGZpbmFsIGludAotCQlzaGVsbEljb24gPSAwLAotCQlpY29uQ2xvc2VkRHJpdmUgPSAxLAotCQlpY29uQ2xvc2VkRm9sZGVyID0gMiwKLQkJaWNvbkZpbGUgPSAzLAotCQlpY29uT3BlbkRyaXZlID0gNCwKLQkJaWNvbk9wZW5Gb2xkZXIgPSA1LAotCQljbWRDb3B5ID0gNiwKLQkJY21kQ3V0ID0gNywKLQkJY21kRGVsZXRlID0gOCwKLQkJY21kUGFyZW50ID0gOSwKLQkJY21kUGFzdGUgPSAxMCwKLQkJY21kUHJpbnQgPSAxMSwKLQkJY21kUmVmcmVzaCA9IDEyLAotCQljbWRSZW5hbWUgPSAxMywKLQkJY21kU2VhcmNoID0gMTQ7Ci0JcHVibGljIGZpbmFsIFN0cmluZ1tdIHN0b2NrSW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCSJnZW5lcmljX2V4YW1wbGUuZ2lmIiwKLQkJImljb25fQ2xvc2VkRHJpdmUuZ2lmIiwKLQkJImljb25fQ2xvc2VkRm9sZGVyLmdpZiIsCi0JCSJpY29uX0ZpbGUuZ2lmIiwKLQkJImljb25fT3BlbkRyaXZlLmdpZiIsCi0JCSJpY29uX09wZW5Gb2xkZXIuZ2lmIiwKLQkJImNtZF9Db3B5LmdpZiIsCi0JCSJjbWRfQ3V0LmdpZiIsCi0JCSJjbWRfRGVsZXRlLmdpZiIsCi0JCSJjbWRfUGFyZW50LmdpZiIsCi0JCSJjbWRfUGFzdGUuZ2lmIiwKLQkJImNtZF9QcmludC5naWYiLAotCQkiY21kX1JlZnJlc2guZ2lmIiwKLQkJImNtZF9SZW5hbWUuZ2lmIiwKLQkJImNtZF9TZWFyY2guZ2lmIgotCX07Ci0JcHVibGljIEltYWdlIHN0b2NrSW1hZ2VzW107Ci0JCi0JLy8gU3RvY2sgY3Vyc29ycwotCXB1YmxpYyBmaW5hbCBpbnQKLQkJY3Vyc29yRGVmYXVsdCA9IDAsCi0JCWN1cnNvcldhaXQgPSAxOwotCXB1YmxpYyBDdXJzb3Igc3RvY2tDdXJzb3JzW107Ci0JLy8gQ2FjaGVkIGljb25zCi0JcHJpdmF0ZSBIYXNodGFibGUgaWNvbkNhY2hlOyAvKiBtYXAgUHJvZ3JhbSB0byBJbWFnZSAqLwotCQotCXB1YmxpYyBJY29uQ2FjaGUoKSB7Ci0JfQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMKLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheSB0aGUgZGlzcGxheQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRSZXNvdXJjZXMoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWlmIChzdG9ja0ltYWdlcyA9PSBudWxsKSB7Ci0JCQlzdG9ja0ltYWdlcyA9IG5ldyBJbWFnZVtzdG9ja0ltYWdlTG9jYXRpb25zLmxlbmd0aF07Ci0JCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0b2NrSW1hZ2VMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IGNyZWF0ZVN0b2NrSW1hZ2UoZGlzcGxheSwgc3RvY2tJbWFnZUxvY2F0aW9uc1tpXSk7Ci0JCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJZnJlZVJlc291cmNlcygpOwotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotCQkJCQkJRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzIikpOwotCQkJCX0KLQkJCQlzdG9ja0ltYWdlc1tpXSA9IGltYWdlOwotCQkJfQotCQl9CQotCQlpZiAoc3RvY2tDdXJzb3JzID09IG51bGwpIHsKLQkJCXN0b2NrQ3Vyc29ycyA9IG5ldyBDdXJzb3JbXSB7Ci0JCQkJbnVsbCwKLQkJCQluZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCkKLQkJCX07Ci0JCX0KLQkJaWNvbkNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCX0KLQkvKioKLQkgKiBGcmVlcyB0aGUgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIHZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJaWYgKHN0b2NrSW1hZ2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RvY2tJbWFnZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IHN0b2NrSW1hZ2VzW2ldOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlzdG9ja0ltYWdlcyA9IG51bGw7Ci0JCX0KLQkJaWYgKGljb25DYWNoZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGl0ID0gaWNvbkNhY2hlLmVsZW1lbnRzKCk7IGl0Lmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaXQubmV4dEVsZW1lbnQoKTsKLQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHN0b2NrQ3Vyc29ycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0b2NrQ3Vyc29ycy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEN1cnNvciBjdXJzb3IgPSBzdG9ja0N1cnNvcnNbaV07Ci0JCQkJaWYgKGN1cnNvciAhPSBudWxsKSBjdXJzb3IuZGlzcG9zZSgpOwotCQkJfQotCQkJc3RvY2tDdXJzb3JzID0gbnVsbDsKLQkJfQotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc3RvY2sgaW1hZ2UKLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheSB0aGUgZGlzcGxheQotCSAqIEBwYXJhbSBwYXRoIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBpY29uCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVTdG9ja0ltYWdlKERpc3BsYXkgZGlzcGxheSwgU3RyaW5nIHBhdGgpIHsKLQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gSWNvbkNhY2hlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0gKHBhdGgpOwotCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSAoc3RyZWFtKTsKLQkJSW1hZ2VEYXRhIG1hc2sgPSBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzayAoKTsKLQkJSW1hZ2UgcmVzdWx0ID0gbmV3IEltYWdlIChkaXNwbGF5LCBpbWFnZURhdGEsIG1hc2spOwotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlICgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSAoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBHZXRzIGFuIGltYWdlIGZvciBhIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvZ3JhbQotCSAqCi0JICogQHBhcmFtIHByb2dyYW0gdGhlIFByb2dyYW0KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbkZyb21Qcm9ncmFtKFByb2dyYW0gcHJvZ3JhbSkgewotCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaWNvbkNhY2hlLmdldChwcm9ncmFtKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBwcm9ncmFtLmdldEltYWdlRGF0YSgpOwotCQkJaWYgKGltYWdlRGF0YSAhPSBudWxsKSB7Ci0JCQkJaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgaW1hZ2VEYXRhLCBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzaygpKTsKLQkJCQlpY29uQ2FjaGUucHV0KHByb2dyYW0sIGltYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW1hZ2UgPSBzdG9ja0ltYWdlc1tpY29uRmlsZV07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0NvcHkuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfQ29weS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyNzRiMDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfQ29weS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9DdXQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfQ3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWI5NDhiOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9DdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfRGVsZXRlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0RlbGV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmNjQ3NjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfRGVsZXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1BhcmVudC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QYXJlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjI3OGU2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1BhcmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QYXN0ZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QYXN0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1ZTBhYjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUGFzdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUHJpbnQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUHJpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZGZhOGNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1ByaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1JlZnJlc2guZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUmVmcmVzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwNjNjMjMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUmVmcmVzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9SZW5hbWUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUmVuYW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjViMTMyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9SZW5hbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfU2VhcmNoLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1NlYXJjaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkYzNlYmUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfU2VhcmNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvZ2VuZXJpY19leGFtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvZ2VuZXJpY19leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjlmYjZiMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2dlbmVyaWNfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fQ2xvc2VkRHJpdmUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0Nsb3NlZERyaXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRlNTMwZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fQ2xvc2VkRHJpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0Nsb3NlZEZvbGRlci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fQ2xvc2VkRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmViNmVkMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fQ2xvc2VkRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9GaWxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9GaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmI4NmQwNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fT3BlbkRyaXZlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9PcGVuRHJpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjJiNjMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9PcGVuRHJpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX09wZW5Gb2xkZXIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX09wZW5Gb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOWM3NzczNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fT3BlbkZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9BZHZhbmNlZEdyYXBoaWNzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9BZHZhbmNlZEdyYXBoaWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYWIxYzEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQWR2YW5jZWRHcmFwaGljcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLS8qIAotICogRHJhd2luZyB3aXRoIHRyYW5zZm9ybWF0aW9ucywgcGF0aHMgYW5kIGFscGhhIGJsZW5kaW5nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBBZHZhbmNlZEdyYXBoaWNzIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2dyYXBoaWNzIik7Ci0JCi0Jc3RhdGljIEltYWdlIGxvYWRJbWFnZSAoRGV2aWNlIGRldmljZSwgQ2xhc3MgY2xhenosIFN0cmluZyBzdHJpbmcpIHsKLQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbSAoc3RyaW5nKTsKLQkJaWYgKHN0cmVhbSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQl0cnkgewotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UgKGRldmljZSwgc3RyZWFtKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS5jbG9zZSAoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7fQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgU2hlbGwgb3BlbihmaW5hbCBEaXNwbGF5IGRpc3BsYXkpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZygiQWR2YW5jZWRHcmFwaGljcyIpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlzcGxheSk7Ci0JCQlwYXRoLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1dBUk5JTkcgfCBTV1QuT0spOwotCQkJZGlhbG9nLnNldFRleHQoUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZygiV2FybmluZyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZGlhbG9nLnNldE1lc3NhZ2UoUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZygiTGliTm90Rm91bmQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlGb250RGF0YSBmZCA9IHNoZWxsLmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCQlmaW5hbCBGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmZC5nZXROYW1lKCksIDk2LCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGxvYWRJbWFnZShkaXNwbGF5LCBBZHZhbmNlZEdyYXBoaWNzLmNsYXNzLCAiaXJtYW9zLmpwZyIpOwotCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsJCQkJCi0JCQkJVHJhbnNmb3JtIHRyID0gbmV3IFRyYW5zZm9ybShkaXNwbGF5KTsKLQkJCQl0ci50cmFuc2xhdGUocmVjdC53aWR0aCAvIDQsIHJlY3QuaGVpZ2h0IC8gMik7Ci0JCQkJdHIucm90YXRlKC0zMCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJCX0KLQkJCQlnYy5zZXRBbHBoYSgxMDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cik7Ci0JCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlzcGxheSk7Ci0JCQkJcGF0aC5hZGRTdHJpbmcoIlNXVCIsIDAsIDAsIGZvbnQpOwotCQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQkJCQlnYy5maWxsUGF0aChwYXRoKTsKLQkJCQlnYy5kcmF3UGF0aChwYXRoKTsKLQkJCQl0ci5kaXNwb3NlKCk7Ci0JCQkJcGF0aC5kaXNwb3NlKCk7Ci0JCQl9CQkJCi0JCX0pOwotCQlzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQlmb250LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7CQotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgQWR2YW5jZWRHcmFwaGljcygpLm9wZW4oZGlzcGxheSk7Ci0JCXdoaWxlIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQWxwaGFUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FscGhhVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTA4YWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQWxwaGFUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgYWxwaGEgYmxlbmRpbmcuIEl0IGRyYXdzIHZhcmlvdXMgc2hhcGVzIGFuZCBpbWFnZXMgYXMKLSAqIGFscGhhIHZhbHVlcyBjaGFuZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbHBoYVRhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCS8qKgotCSAqIFZhbHVlIHVzZWQgaW4gc2V0QWxwaGEgQVBJIGNhbGwuIEdvZXMgZnJvbSAwIHRvIDI1NSBhbmQgdGhlbiBzdGFydHMgb3Zlci4KLQkgKi8KLQlpbnQgYWxwaGFWYWx1ZTsKLQkKLQkvKioKLQkgKiBWYWx1ZSB1c2VkIGluIHNldEFscGhhIEFQSSBjYWxsLiBHb2VzIGZyb20gMCB0byAyNTUsIHRoZW4gZnJvbSAyNTUgdG8gMAotCSAqIGFuZCB0aGVuIHN0YXJ0cyBvdmVyLgotCSAqLwotCWludCBhbHBoYVZhbHVlMjsKLQotCWJvb2xlYW4gcmVhY2hlZE1heCA9IGZhbHNlOwotCWludCBkaWFtZXRlcjsKLQkKLQkvKiogcmFuZG9tIG51bWJlcnMgdXNlZCBmb3IgcG9zaXRpb25pbmcgIlNXVCIgKi8KLQlpbnQgcmFuZFgsIHJhbmRZOwotCUltYWdlIGFscGhhSW1nMSwgYWxwaGFJbWcyOwotCi0JcHVibGljIEFscGhhVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0JCXN1cGVyKGV4YW1wbGUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbHBoYSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbHBoYSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFscGhhRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgaW50IGdldEluaXRpYWxBbmltYXRpb25UaW1lKCkgewotCQlyZXR1cm4gMjA7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChhbHBoYUltZzEgIT0gbnVsbCkgewotCQkJYWxwaGFJbWcxLmRpc3Bvc2UoKTsKLQkJCWFscGhhSW1nMSA9IG51bGw7Ci0JCX0KLQkJaWYgKGFscGhhSW1nMiAhPSBudWxsKSB7Ci0JCQlhbHBoYUltZzIuZGlzcG9zZSgpOwotCQkJYWxwaGFJbWcyID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWFscGhhVmFsdWUgPSAoYWxwaGFWYWx1ZSs1KSUyNTU7Ci0JCQotCQlhbHBoYVZhbHVlMiA9IHJlYWNoZWRNYXggPyBhbHBoYVZhbHVlMiAtIDUgOiBhbHBoYVZhbHVlMiArIDU7Ci0JCQkKLQkJaWYgKGFscGhhVmFsdWUyID09IDI1NSkgewotCQkJcmVhY2hlZE1heCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoYWxwaGFWYWx1ZTIgPT0gMCkgewotCQkJcmVhY2hlZE1heCA9IGZhbHNlOwotCQl9Ci0JCQotCQlkaWFtZXRlciA9IChkaWFtZXRlciArIDEwKSUod2lkdGggPiBoZWlnaHQgPyB3aWR0aCA6IGhlaWdodCk7Ci0JfQotCi0JLyoqIAotCSAqIFBhaW50IHRoZSByZWNlaXZlciBpbnRvIHRoZSBzcGVjaWZpZWQgR0MuIAotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQotCQlpZiAoYWxwaGFJbWcxID09IG51bGwpIHsKLQkJCWFscGhhSW1nMSA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJhbHBoYV9pbWcxLnBuZyIpOwotCQkJYWxwaGFJbWcyID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImFscGhhX2ltZzIucG5nIik7CQotCQl9Ci0KLQkJUmVjdGFuZ2xlIHJlY3QgPSBhbHBoYUltZzEuZ2V0Qm91bmRzKCk7Ci0JCQotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlKTsKLQkJZ2MuZHJhd0ltYWdlKGFscGhhSW1nMSwgcmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAKLQkJCQl3aWR0aC8yLCBoZWlnaHQvMiwgd2lkdGgvNCwgaGVpZ2h0LzQpOwotCQkKLQkJZ2MuZHJhd0ltYWdlKGFscGhhSW1nMSwgcmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAKLQkJCQkwLCAwLCB3aWR0aC80LCBoZWlnaHQvNCk7Ci0KLQkJZ2Muc2V0QWxwaGEoMjU1LWFscGhhVmFsdWUpOwotCQlnYy5kcmF3SW1hZ2UoYWxwaGFJbWcyLCByZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIAotCQkJCXdpZHRoLzIsIDAsIHdpZHRoLzQsIGhlaWdodC80KTsKLQkJCi0JCWdjLmRyYXdJbWFnZShhbHBoYUltZzIsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgCi0JCQkJMCwgMypoZWlnaHQvNCwgd2lkdGgvNCwgaGVpZ2h0LzQpOwotCQkKLQkJLy8gcGVudGFnb24KLQkJZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfTUFHRU5UQSkpOwotCQlnYy5maWxsUG9seWdvbihuZXcgaW50IFtdIHt3aWR0aC8xMCwgaGVpZ2h0LzIsIDMqd2lkdGgvMTAsIGhlaWdodC8yLXdpZHRoLzYsIDUqd2lkdGgvMTAsIGhlaWdodC8yLCAKLQkJCQk0KndpZHRoLzEwLCBoZWlnaHQvMit3aWR0aC82LCAyKndpZHRoLzEwLCBoZWlnaHQvMit3aWR0aC82fSk7Ci0KLQkJZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCi0JCS8vIHNxdWFyZQotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSh3aWR0aC8yLCBoZWlnaHQtNzUsIDc1LCA3NSk7Ci0JCQotCQkvLyB0cmlhbmdsZQotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlICsgMTUpOwotCQlnYy5maWxsUG9seWdvbihuZXcgaW50W117d2lkdGgvMis3NSwgaGVpZ2h0LSgyKjc1KSwgd2lkdGgvMis3NSwgaGVpZ2h0LTc1LCB3aWR0aC8yKygyKjc1KSwgaGVpZ2h0LTc1fSk7Ci0JCQotCQkvLyB0cmlhbmdsZQotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlICsgMzApOwotCQlnYy5maWxsUG9seWdvbihuZXcgaW50W117d2lkdGgvMis4MCwgaGVpZ2h0LSgyKjc1KSwgd2lkdGgvMisoMio3NSksIGhlaWdodC0oMio3NSksIHdpZHRoLzIrKDIqNzUpLCBoZWlnaHQtODB9KTsKLQkJCi0JCS8vIHRyaWFuZ2xlCi0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUgKyA0NSk7Ci0JCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnRbXXt3aWR0aC8yKygyKjc1KSwgaGVpZ2h0LSgyKjc1KSwgd2lkdGgvMisoMyo3NSksIGhlaWdodC0oMio3NSksIHdpZHRoLzIrKDMqNzUpLCBoZWlnaHQtKDMqNzUpfSk7Ci0JCQotCQkvLyB0cmlhbmdsZQotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlICsgNjApOwotCQlnYy5maWxsUG9seWdvbihuZXcgaW50W117d2lkdGgvMisoMio3NSksIGhlaWdodC0oKDIqNzUpKzUpLCB3aWR0aC8yKygyKjc1KSwgaGVpZ2h0LSgzKjc1KSwgd2lkdGgvMisoKDMqNzUpLTUpLCBoZWlnaHQtKDMqNzUpfSk7Ci0JCQotCQkvLyBzcXVhcmUKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZSArIDc1KTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSh3aWR0aC8yKygzKjc1KSwgaGVpZ2h0LSg0Kjc1KSwgNzUsIDc1KTsKLQkJCi0JCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCQkKLQkJLy8gY2lyY2xlIGluIHRvcCByaWdodCBjb3JuZXIKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZTIpOwotCQlnYy5maWxsT3ZhbCh3aWR0aC0xMDAsIDAsIDEwMCwgMTAwKTsKLQkJCi0JCS8vIHRyaWFuZ2xlCi0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUgKyA5MCk7Ci0JCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnRbXXt3aWR0aC0zMDAsIDEwLCB3aWR0aC0xMDAsIDEwLCB3aWR0aC0yNzUsIDUwfSk7Ci0JCi0JCS8vIHRyaWFuZ2xlCi0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUgKyAxMDUpOwotCQlnYy5maWxsUG9seWdvbihuZXcgaW50W117d2lkdGgtMTAsIDEwMCwgd2lkdGgtMTAsIDMwMCwgd2lkdGgtNTAsIDI3NX0pOwotCQkKLQkJLy8gcXVhZHJpbGF0ZXJhbCBzaGFwZQotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlICsgMTIwKTsKLQkJZ2MuZmlsbFBvbHlnb24obmV3IGludFtde3dpZHRoLTEwMCwgMTAwLCB3aWR0aC0yMDAsIDE1MCwgd2lkdGgtMjAwLCAyMDAsIHdpZHRoLTE1MCwgMjAwfSk7Ci0JCQotCQkvLyBibHVlIGNpcmNsZXMKLQkJZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQkJaW50IHNpemUgPSA1MDsKLQkJaW50IGFscGhhID0gMjA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZSArIGFscGhhKTsKLQkJCWlmIChpICUgMiA+IDApIHsKLQkJCQlnYy5maWxsT3ZhbCh3aWR0aC0oKGkrMSkqc2l6ZSksIGhlaWdodC1zaXplLCBzaXplLCBzaXplKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ2MuZmlsbE92YWwod2lkdGgtKChpKzEpKnNpemUpLCBoZWlnaHQtKDMqc2l6ZS8yKSwgc2l6ZSwgc2l6ZSk7Ci0JCQl9Ci0JCQlhbHBoYSA9IGFscGhhICsgMjA7Ci0JCX0KLQkJCi0JCS8vIFNXVCBzdHJpbmcgYXBwZWFyaW5nIHJhbmRvbWx5Ci0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUyKTsKLQkJU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpOwotCQlGb250IGZvbnQgPSBjcmVhdGVGb250KGRldmljZSwgMTAwLCBTV1QuTk9ORSk7Ci0JCWdjLnNldEZvbnQoZm9udCk7Ci0JCQotCQlQb2ludCB0ZXh0U2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQkJaW50IHRleHRXaWR0aCA9IHRleHRTaXplLng7Ci0JCWludCB0ZXh0SGVpZ2h0ID0gdGV4dFNpemUueTsKLQkJCi0JCWlmIChhbHBoYVZhbHVlMiA9PSAwKXsKLQkJCXJhbmRYID0gKGludCkod2lkdGgqTWF0aC5yYW5kb20oKSk7Ci0JCQlyYW5kWSA9IChpbnQpKGhlaWdodCpNYXRoLnJhbmRvbSgpKTsKLQkJCXJhbmRYID0gKHJhbmRYID4gdGV4dFdpZHRoKSA/IHJhbmRYIC0gdGV4dFdpZHRoIDogcmFuZFg7Ci0JCQlyYW5kWSA9IChyYW5kWSA+IHRleHRIZWlnaHQpID8gcmFuZFkgLSB0ZXh0SGVpZ2h0IDogcmFuZFk7Ci0JCX0KLQkJCi0JCWdjLmRyYXdTdHJpbmcodGV4dCwgcmFuZFgsIHJhbmRZLCB0cnVlKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCQotCQkvLyBncmF5IGRvbnV0Ci0JCWdjLnNldEFscGhhKDEwMCk7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGguYWRkQXJjKCh3aWR0aC1kaWFtZXRlcikvMiwgKGhlaWdodC1kaWFtZXRlcikvMiwgZGlhbWV0ZXIsIGRpYW1ldGVyLCAwLCAzNjApOwotCQlwYXRoLmNsb3NlKCk7Ci0JCXBhdGguYWRkQXJjKCh3aWR0aC1kaWFtZXRlcisyNSkvMiwgKGhlaWdodC1kaWFtZXRlcisyNSkvMiwgZGlhbWV0ZXItMjUsIGRpYW1ldGVyLTI1LCAwLCAzNjApOwotCQlwYXRoLmNsb3NlKCk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKSk7Ci0JCWdjLmZpbGxQYXRoKHBhdGgpOwotCQlnYy5kcmF3UGF0aChwYXRoKTsKLQkJcGF0aC5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBmb250IHVzaW5nIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCByZXR1cm5zIGl0LgotCSAqIFRoaXMgbWV0aG9kIHRha2VzIGludG8gYWNjb3VudCB0aGUgcmVzaWRlbnQgcGxhdGZvcm0uCi0JICogCi0JICogQHBhcmFtIGZhY2UKLQkgKiAJCQlUaGUgbmFtZSBvZiB0aGUgZm9udAotCSAqIEBwYXJhbSBwb2ludHMKLQkgKiAJCQlUaGUgc2l6ZSBvZiB0aGUgZm9udCBpbiBwb2ludAotCSAqIEBwYXJhbSBzdHlsZQotCSAqIAkJCVRoZSBzdHlsZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBmb250Ci0JICovCi0Jc3RhdGljIEZvbnQgY3JlYXRlRm9udChEZXZpY2UgZGV2aWNlLCBpbnQgcG9pbnRzLCBpbnQgc3R5bGUpIHsJCQotCQlpZihTV1QuZ2V0UGxhdGZvcm0oKSA9PSAid2luMzIiKSB7Ci0JCQlyZXR1cm4gbmV3IEZvbnQoZGV2aWNlLCAiVmVyZGFuYSIsIHBvaW50cywgc3R5bGUpOwkKLQkJfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAibW90aWYiKSB7Ci0JCQlyZXR1cm4gbmV3IEZvbnQoZGV2aWNlLCAiVGltZXMiLCBwb2ludHMsIHN0eWxlKTsJCQotCQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJndGsiKSB7Ci0JCQlyZXR1cm4gbmV3IEZvbnQoZGV2aWNlLCAiQmFla211ayBCYXRhbmciLCBwb2ludHMsIHN0eWxlKTsJCQotCQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJjYXJib24iKSB7Ci0JCQlyZXR1cm4gbmV3IEZvbnQoZGV2aWNlLCAiVmVyZGFuYSIsIHBvaW50cywgc3R5bGUpOwotCQl9IGVsc2UgeyAvLyBwaG90b24KLQkJCXJldHVybiBuZXcgRm9udChkZXZpY2UsICJWZXJkYW5hIiwgcG9pbnRzLCBzdHlsZSk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FuaW1hdGVkR3JhcGhpY3NUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FuaW1hdGVkR3JhcGhpY3NUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0NDJmMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9BbmltYXRlZEdyYXBoaWNzVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBleHRlbmRzIHRoZSBHcmFwaGljc1RhYiBjbGFzcyB0byBjcmVhdGUgYW5pbWF0ZWQgZ3JhcGhpY3MuCi0gKiAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFuaW1hdGVkR3JhcGhpY3NUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0KLQlUb29sQmFyIHRvb2xCYXI7Ci0JVG9vbEl0ZW0gcGxheUl0ZW0sIHBhdXNlSXRlbTsKLQlTcGlubmVyIHRpbWVyU3Bpbm5lcjsJCS8vIHRvIGlucHV0IHRoZSBzcGVlZCBvZiB0aGUgYW5pbWF0aW9uIAotCXByaXZhdGUgYm9vbGVhbiBhbmltYXRlOwkvLyBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGFuaW1hdGUgdGhlIGdyYXBoaWMKLQotCXB1YmxpYyBBbmltYXRlZEdyYXBoaWNzVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0JCXN1cGVyKGV4YW1wbGUpOwotCQlhbmltYXRlID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYXlvdXQgb2YgdGhlIGNvbXBvc2l0ZSB0byBSb3dMYXlvdXQgYW5kIGNyZWF0ZXMgdGhlIHRvb2xiYXIuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjY3JlYXRlQ29udHJvbFBhbmVsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJLy8gc2V0dXAgbGF5b3V0Ci0JCVJvd0xheW91dCBsYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0JCWxheW91dC53cmFwID0gdHJ1ZTsKLQkJbGF5b3V0LnNwYWNpbmcgPSA4OwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQljcmVhdGVUb29sQmFyKHBhcmVudCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRvb2xiYXIgY29udHJvbHM6IHBsYXksIHBhdXNlIGFuZCBhbmltYXRpb24gdGltZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBBIGNvbXBvc2l0ZQotCSAqLwotCXZvaWQgY3JlYXRlVG9vbEJhcihmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCQkJCi0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihwYXJlbnQsIFNXVC5GTEFUKTsKLQkJTGlzdGVuZXIgdG9vbEJhckxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQkJY2FzZSBTV1QuU2VsZWN0aW9uOiB7Ci0JCQkJCQlpZiAoZXZlbnQud2lkZ2V0ID09IHBsYXlJdGVtKSB7Ci0JCQkJCQkJYW5pbWF0ZSA9IHRydWU7Ci0JCQkJCQkJcGxheUl0ZW0uc2V0RW5hYmxlZCghYW5pbWF0ZSk7Ci0JCQkJCQkJcGF1c2VJdGVtLnNldEVuYWJsZWQoYW5pbWF0ZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBwYXVzZUl0ZW0pIHsKLQkJCQkJCQlhbmltYXRlID0gZmFsc2U7Ci0JCQkJCQkJcGxheUl0ZW0uc2V0RW5hYmxlZCghYW5pbWF0ZSk7Ci0JCQkJCQkJcGF1c2VJdGVtLnNldEVuYWJsZWQoYW5pbWF0ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJLy8gcGxheSB0b29sIGl0ZW0KLQkJcGxheUl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlwbGF5SXRlbS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGxheSIpKTsgLy8kTk9OLU5MUy0xJAotCQlwbGF5SXRlbS5zZXRJbWFnZShleGFtcGxlLmxvYWRJbWFnZShkaXNwbGF5LCAicGxheS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGxheUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdG9vbEJhckxpc3RlbmVyKTsKLQkJCi0JCS8vIHBhdXNlIHRvb2wgaXRlbQotCQlwYXVzZUl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlwYXVzZUl0ZW0uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdXNlIikpOyAvLyROT04tTkxTLTEkCi0JCXBhdXNlSXRlbS5zZXRJbWFnZShleGFtcGxlLmxvYWRJbWFnZShkaXNwbGF5LCAicGF1c2UuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXBhdXNlSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0b29sQmFyTGlzdGVuZXIpOwotCQkKLQkJLy8gdGltZXIgc3Bpbm5lcgotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJY29tcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUik7Ci0JCWxhYmVsLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbmltYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGltZXJTcGlubmVyID0gbmV3IFNwaW5uZXIoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQkJdGltZXJTcGlubmVyLnNldE1heGltdW0oMTAwMCk7Ci0JCQotCQlwbGF5SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYW5pbWF0ZSA9IHRydWU7Ci0KLQkJdGltZXJTcGlubmVyLnNldFNlbGVjdGlvbihnZXRJbml0aWFsQW5pbWF0aW9uVGltZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogIEFuc3dlciB3aGV0aGVyIHRoZSByZWNlaXZlcidzIGRyYXdpbmcgc2hvdWxkIGJlIGRvdWJsZSBidWZmZXJlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREb3VibGVCdWZmZXJlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGluaXRpYWwgYW5pbWF0aW9uIHRpbWUgdG8gYmUgdXNlZCBieSB0aGUgdGFiLiBBbmltYXRpb24gdGltZToKLQkgKiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gdGhlIGN1cnJlbnQgZHJhd2luZyBhbmQgdGhlIG5leHQgKHRoZSB0aW1lCi0JICogaW50ZXJ2YWwgYmV0d2VlbiBjYWxscyB0byB0aGUgbmV4dCBtZXRob2QpLiBTaG91bGQgYmUgb3ZlcnJpZGRlbiB0bwotCSAqIHJldHVybiBhIHZhbHVlIHRoYXQgaXMgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHRhYi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluaXRpYWxBbmltYXRpb25UaW1lKCkgewotCQlyZXR1cm4gMzA7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGFuaW1hdGlvbiB0aW1lIHRoYXQgaXMgc2VsZWN0ZWQgaW4gdGhlIHNwaW5uZXIuIEFuaW1hdGlvbiB0aW1lOgotCSAqIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgY3VycmVudCBkcmF3aW5nIGFuZCB0aGUgbmV4dCAodGhlIHRpbWUKLQkgKiBpbnRlcnZhbCBiZXR3ZWVuIGNhbGxzIHRvIHRoZSBuZXh0IG1ldGhvZCkuIFNob3VsZCBiZSBvdmVycmlkZGVuIHRvCi0JICogcmV0dXJuIGEgdmFsdWUgdGhhdCBpcyBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgdGFiLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QW5pbWF0aW9uVGltZSgpIHsKLQkJcmV0dXJuIHRpbWVyU3Bpbm5lci5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHJ1ZSBpZiB0aGUgdGFiIGlzIGN1cnJlbnRseSBhbmltYXRlZDsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEFuaW1hdGlvbigpIHsKLQkJcmV0dXJuIGFuaW1hdGU7Ci0JfQotCQotCS8qKgotCSAqIENhdXNlcyB0aGUgYW5pbWF0aW9uIHRvIHN0b3Agb3Igc3RhcnQuCi0JICogCi0JICogQHBhcmFtIGZsYWcKLQkgKiAgICAgICAgICAgIHRydWUgc3RhcnRzIHRoZSBhbmltYXRpb247IGZhbHNlIHN0b3BzIHRoZSBhbmltYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW5pbWF0aW9uKGJvb2xlYW4gZmxhZykgewotCQlhbmltYXRlID0gZmxhZzsKLQkJcGxheUl0ZW0uc2V0RW5hYmxlZCghZmxhZyk7Ci0JCXBhdXNlSXRlbS5zZXRFbmFibGVkKGZsYWcpOwotCX0KLQotCS8qKgotCSAqIEFkdmFuY2UgdGhlIGFuaW1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9CYWxsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9CYWxsVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNGJlNzEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQmFsbFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlRyYW5zZm9ybTsKLQotLyoqCi0gKiBUaGlzIHRhYiB1c2VzIGFscGhhIGJsZW5kaW5nIHRvIHNpbXVsYXRlICJnaG9zdGluZyIgb2YgYSBiYWxsIGluIG1vdmVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgQmFsbFRhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCi0JQmFsbENvbGxlY3Rpb25bXSBiYzsKLQotCS8qKgotCSAqIFRoaXMgaW5uZXIgY2xhc3Mgc2VydmVzIGFzIGEgY29udGFpbmVyIGZvciB0aGUgZGF0YSBuZWVkZWQgdG8gZGlzcGxheSBhCi0JICogY29sbGVjdGlvbiBvZiBiYWxscy4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgQmFsbENvbGxlY3Rpb24gewotCQlmbG9hdCB4LCB5OyAvLyBwb3NpdGlvbiBvZiBiYWxsCi0JCWZsb2F0IGluY1gsIGluY1k7IC8vIHZhbHVlcyBieSB3aGljaCB0byBtb3ZlIHRoZSBiYWxsCi0JCWludCBiYWxsX3NpemU7IC8vIHNpemUgKGRpYW1ldGVyKSBvZiB0aGUgYmFsbAotCQlpbnQgY2FwYWNpdHk7IC8vIG51bWJlciBvZiBiYWxscyBpbiB0aGUgY29sbGVjdGlvbgotCQlMaW5rZWRMaXN0IHByZXZ4LCBwcmV2eTsgLy8gY29sbGVjdGlvbiBvZiBwcmV2aW91cyB4IGFuZCB5IHBvc2l0aW9ucwotCQkJCQkJCQkgLy8gb2YgYmFsbAotCQlDb2xvcltdIGNvbG9yczsgLy8gY29sb3JzIHVzZWQgZm9yIHRoaXMgYmFsbCBjb2xsZWN0aW9uCi0KLQkJcHVibGljIEJhbGxDb2xsZWN0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IGluY1gsIGZsb2F0IGluY1ksCi0JCQkJaW50IGJhbGxfc2l6ZSwgaW50IGNhcGFjaXR5LCBDb2xvcltdIGNvbG9ycykgewotCQkJdGhpcy54ID0geDsKLQkJCXRoaXMueSA9IHk7Ci0JCQl0aGlzLmluY1ggPSBpbmNYOwotCQkJdGhpcy5pbmNZID0gaW5jWTsKLQkJCXRoaXMuYmFsbF9zaXplID0gYmFsbF9zaXplOwotCQkJdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5OwotCQkJcHJldnggPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJcHJldnkgPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJdGhpcy5jb2xvcnMgPSBjb2xvcnM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQliY1swXSA9IGJjWzFdID0gYmNbMl0gPSBiY1szXSA9IGJjWzRdID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQmFsbFRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCQlzdXBlcihleGFtcGxlKTsKLQkJYmMgPSBuZXcgQmFsbENvbGxlY3Rpb25bNV07Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQWxwaGEiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmFsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmFsbERlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIGludCBnZXRJbml0aWFsQW5pbWF0aW9uVGltZSgpIHsKLQkJcmV0dXJuIDEwOwotCX0KLQotCXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChiY1tpXSA9PSBudWxsKSByZXR1cm47Ci0JCQlpZiAoYmNbaV0ucHJldnguc2l6ZSgpID09IDApIHsKLQkJCQliY1tpXS5wcmV2eC5hZGRMYXN0KG5ldyBGbG9hdChiY1tpXS54KSk7Ci0JCQkJYmNbaV0ucHJldnkuYWRkTGFzdChuZXcgRmxvYXQoYmNbaV0ueSkpOwotCQkJfSBlbHNlIGlmIChiY1tpXS5wcmV2eC5zaXplKCkgPT0gYmNbaV0uY2FwYWNpdHkpIHsKLQkJCQliY1tpXS5wcmV2eC5yZW1vdmVGaXJzdCgpOwotCQkJCWJjW2ldLnByZXZ5LnJlbW92ZUZpcnN0KCk7Ci0JCQl9Ci0KLQkJCWJjW2ldLnggKz0gYmNbaV0uaW5jWDsKLQkJCWJjW2ldLnkgKz0gYmNbaV0uaW5jWTsKLQotCQkJZmxvYXQgcmFuZG9tID0gKGZsb2F0KSBNYXRoLnJhbmRvbSgpOwotCi0JCQkvLyByaWdodAotCQkJaWYgKGJjW2ldLnggKyBiY1tpXS5iYWxsX3NpemUgPiB3aWR0aCkgewotCQkJCWJjW2ldLnggPSB3aWR0aCAtIGJjW2ldLmJhbGxfc2l6ZTsKLQkJCQliY1tpXS5pbmNYID0gcmFuZG9tICogLXdpZHRoIC8gMTYgLSAxOwotCQkJfQotCQkJLy8gbGVmdAotCQkJaWYgKGJjW2ldLnggPCAwKSB7Ci0JCQkJYmNbaV0ueCA9IDA7Ci0JCQkJYmNbaV0uaW5jWCA9IHJhbmRvbSAqIHdpZHRoIC8gMTYgKyAxOwotCQkJfQotCQkJLy8gYm90dG9tCi0JCQlpZiAoYmNbaV0ueSArIGJjW2ldLmJhbGxfc2l6ZSA+IGhlaWdodCkgewotCQkJCWJjW2ldLnkgPSAoaGVpZ2h0IC0gYmNbaV0uYmFsbF9zaXplKSAtIDI7Ci0JCQkJYmNbaV0uaW5jWSA9IHJhbmRvbSAqIC1oZWlnaHQgLyAxNiAtIDE7Ci0JCQl9Ci0JCQkvLyB0b3AKLQkJCWlmIChiY1tpXS55IDwgMCkgewotCQkJCWJjW2ldLnkgPSAwOwotCQkJCWJjW2ldLmluY1kgPSByYW5kb20gKiBoZWlnaHQgLyAxNiArIDE7Ci0JCQl9Ci0JCQliY1tpXS5wcmV2eC5hZGRMYXN0KG5ldyBGbG9hdChiY1tpXS54KSk7Ci0JCQliY1tpXS5wcmV2eS5hZGRMYXN0KG5ldyBGbG9hdChiY1tpXS55KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0KLQkJaWYgKGJjWzBdID09IG51bGwpIHsKLQkJCWJjWzBdID0gbmV3IEJhbGxDb2xsZWN0aW9uKDAsIDAsIDUsIDUsIDIwLCAyMCwgbmV3IENvbG9yW10geyBkZXZpY2UKLQkJCQkJLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikgfSk7Ci0JCQliY1sxXSA9IG5ldyBCYWxsQ29sbGVjdGlvbig1MCwgMzAwLCAxMCwgLTUsIDUwLCAxMCwKLQkJCQkJbmV3IENvbG9yW10geyBkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpIH0pOwotCQkJYmNbMl0gPSBuZXcgQmFsbENvbGxlY3Rpb24oMjUwLCAxMDAsIC01LCA4LCAyNSwgMTIsCi0JCQkJCW5ldyBDb2xvcltdIHsgZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpIH0pOwotCQkJYmNbM10gPSBuZXcgQmFsbENvbGxlY3Rpb24oMTUwLCA0MDAsIDUsIDgsIDM1LCAxNCwKLQkJCQkJbmV3IENvbG9yW10geyBkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSB9KTsKLQkJCWJjWzRdID0gbmV3IEJhbGxDb2xsZWN0aW9uKDEwMCwgMjUwLCAtNSwgLTE4LCAxMDAsIDUsCi0JCQkJCW5ldyBDb2xvcltdIHsgZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9NQUdFTlRBKSB9KTsKLQkJfQotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgYmMubGVuZ3RoOyBqKyspIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYmNbal0ucHJldnguc2l6ZSgpOyBpKyspIHsKLQkJCQlUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCQkJCXRyYW5zZm9ybS50cmFuc2xhdGUoKChGbG9hdCkgYmNbal0ucHJldnguZ2V0KGJjW2pdLnByZXZ4LnNpemUoKQotCQkJCQkJLSAoaSArIDEpKSkuZmxvYXRWYWx1ZSgpLCAoKEZsb2F0KSBiY1tqXS5wcmV2eQotCQkJCQkJLmdldChiY1tqXS5wcmV2eS5zaXplKCkgLSAoaSArIDEpKSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCi0JCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJCQlwYXRoLmFkZEFyYygwLCAwLCBiY1tqXS5iYWxsX3NpemUsIGJjW2pdLmJhbGxfc2l6ZSwgMCwgMzYwKTsKLQkJCQlnYy5zZXRBbHBoYSgyNTUgLSBpICogKDI1NSAvIGJjW2pdLmNhcGFjaXR5KSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChiY1tqXS5jb2xvcnNbMF0pOwotCQkJCWdjLmZpbGxQYXRoKHBhdGgpOwotCQkJCWdjLmRyYXdQYXRoKHBhdGgpOwotCQkJCXBhdGguZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQmxhY2tIb2xlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9CbGFja0hvbGVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwMWEzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9CbGFja0hvbGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEJsYWNrSG9sZVRhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCQotCWludCBzaXplID0gMTsKLQkKLXB1YmxpYyBCbGFja0hvbGVUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJsYWNrSG9sZSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmxhY2tIb2xlRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmIChzaXplID4gd2lkdGggKiAzIC8gMikgc2l6ZSA9IDA7Ci0JZWxzZSBzaXplICs9IDEwOwotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCWdjLmZpbGxPdmFsKCh3aWR0aCAtIHNpemUpIC8gMiwgKGhlaWdodCAtIHNpemUpIC8gMiwgc2l6ZSwgc2l6ZSk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DYXJkc1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ2FyZHNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmNTQ3ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DYXJkc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRlbW9uc3RyYXRlcyB2YXJpb3VzIHRyYW5zZm9ybWF0aW9ucywgc3VjaCBhcyBzY2FsaW5nLCByb3RhdGlvbiwgYW5kCi0gKiB0cmFuc2xhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIENhcmRzVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JCi0JZmxvYXQgbW92Q2x1YlgsIG1vdkNsdWJZLCBtb3ZEaWFtb25kWCwgbW92RGlhbW9uZFksIG1vdkhlYXJ0LCBtb3ZTcGFkZTsKLQlmbG9hdCBpbmNfY2x1YiA9IDUuMGY7Ci0JZmxvYXQgaW5jX2RpYW1vbmQgPSA1LjBmOwotCWZsb2F0IGluY19oZWFydHMgPSA1LjBmOwotCWZsb2F0IGluY19zcGFkZSA9IDUuMGY7Ci0JZmxvYXQgc2NhbGUsIHNjYWxlV2lkdGg7Ci0JaW50IHJvdGF0aW9uQW5nbGUgPSAwOwotCWZsb2F0IHNjYWxlQXJnID0gMDsKLQlmbG9hdCBoZWFydFNjYWxlID0gMC41ZjsKLQlmbG9hdCBzcGFkZVNjYWxlID0gMC4zMzNmOwotCWludCBjbHViV2lkdGgsIGRpYW1vbmRXaWR0aCwgaGVhcnRXaWR0aCwgc3BhZGVIZWlnaHQ7IAotCQotCUltYWdlIGFjZV9jbHViLCBhY2Vfc3BhZGUsIGFjZV9kaWFtb25kLCBhY2VfaGVhcnRzOwotCi0vKioKLSAqIENvbnN0cnVjdG9yCi0gKiBAcGFyYW0gZXhhbXBsZSBBIEdyYXBoaWNzRXhhbXBsZQotICovCi1wdWJsaWMgQ2FyZHNUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUcmFuc2Zvcm0iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2FyZHMiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNhcmRzRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChhY2VfY2x1YiAhPSBudWxsKSB7Ci0JCWFjZV9jbHViLmRpc3Bvc2UoKTsKLQkJYWNlX2NsdWIgPSBudWxsOwotCQlhY2Vfc3BhZGUuZGlzcG9zZSgpOwotCQlhY2Vfc3BhZGUgPSBudWxsOwotCQlhY2VfZGlhbW9uZC5kaXNwb3NlKCk7Ci0JCWFjZV9kaWFtb25kID0gbnVsbDsKLQkJYWNlX2hlYXJ0cy5kaXNwb3NlKCk7Ci0JCWFjZV9oZWFydHMgPSBudWxsOwotCX0KLX0KLXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0Jcm90YXRpb25BbmdsZSA9IChyb3RhdGlvbkFuZ2xlKzEwKSUzNjA7Ci0KLQkvLyBzY2FsZVZhbCBnb2VzIGZyb20gMCB0byAxLCB0aGVuIDEgdG8gMCwgdGhlbiBzdGFydHMgb3ZlcgotCXNjYWxlQXJnID0gKGZsb2F0KSgoc2NhbGVBcmcgPT0gMSkgPyBzY2FsZUFyZyAtIDAuMSA6IHNjYWxlQXJnICsgMC4xKTsKLQlzY2FsZSA9IChmbG9hdClNYXRoLmNvcyhzY2FsZUFyZyk7Ci0JCi0JbW92Q2x1YlggKz0gaW5jX2NsdWI7Ci0JbW92RGlhbW9uZFggKz0gaW5jX2RpYW1vbmQ7Ci0JbW92SGVhcnQgKz0gaW5jX2hlYXJ0czsKLQltb3ZTcGFkZSArPSBpbmNfc3BhZGU7Ci0JCi0Jc2NhbGVXaWR0aCA9IChmbG9hdCkgKChtb3ZDbHViWS9oZWlnaHQpKjAuMzUgKyAwLjE1KTsKLQltb3ZDbHViWSA9IDIqaGVpZ2h0LzUgKiAoZmxvYXQpTWF0aC5zaW4oMC4wMSptb3ZDbHViWCAtIDkwKSArIDIqaGVpZ2h0LzU7Ci0gICAgbW92RGlhbW9uZFkgPSAyKmhlaWdodC81ICogKGZsb2F0KU1hdGguY29zKDAuMDEqbW92RGlhbW9uZFgpICsgMipoZWlnaHQvNTsKLSAgICAKLSAgICBpZiAobW92Q2x1YlggKyBjbHViV2lkdGgqc2NhbGVXaWR0aCA+IHdpZHRoKSB7Ci0gICAgCW1vdkNsdWJYID0gd2lkdGggLSBjbHViV2lkdGgqc2NhbGVXaWR0aDsKLSAgICAgICAgaW5jX2NsdWIgPSAtaW5jX2NsdWI7Ci0gICAgfQotICAgIGlmIChtb3ZDbHViWCA8IDApIHsKLSAgICAgICAgbW92Q2x1YlggPSAwOwotICAgICAgICBpbmNfY2x1YiA9IC1pbmNfY2x1YjsKLSAgICB9Ci0gICAgaWYgKG1vdkRpYW1vbmRYICsgZGlhbW9uZFdpZHRoKnNjYWxlV2lkdGggPiB3aWR0aCkgewotCSAgICBtb3ZEaWFtb25kWCA9IHdpZHRoIC0gZGlhbW9uZFdpZHRoKnNjYWxlV2lkdGg7Ci0gICAgICAgIGluY19kaWFtb25kID0gLWluY19kaWFtb25kOwotICAgIH0KLSAgICBpZiAobW92RGlhbW9uZFggPCAwKSB7Ci0JICAgIG1vdkRpYW1vbmRYID0gMDsKLSAgICAgICAgaW5jX2RpYW1vbmQgPSAtaW5jX2RpYW1vbmQ7Ci0gICAgfQotICAgIGlmIChtb3ZIZWFydCArIGhlYXJ0V2lkdGgqaGVhcnRTY2FsZSA+IHdpZHRoKSB7Ci0gICAgCW1vdkhlYXJ0ID0gd2lkdGggLSBoZWFydFdpZHRoKmhlYXJ0U2NhbGU7Ci0gICAgCWluY19oZWFydHMgPSAtaW5jX2hlYXJ0czsKLSAgICB9Ci0gICAgaWYgKG1vdkhlYXJ0IDwgMCkgewotICAgIAltb3ZIZWFydCA9IDA7Ci0gICAgCWluY19oZWFydHMgPSAtaW5jX2hlYXJ0czsKLSAgICB9Ci0gICAgaWYgKG1vdlNwYWRlICsgc3BhZGVIZWlnaHQqc3BhZGVTY2FsZSA+IGhlaWdodCkgewotICAgIAltb3ZTcGFkZSA9IGhlaWdodCAtIHNwYWRlSGVpZ2h0KnNwYWRlU2NhbGU7Ci0gICAgCWluY19zcGFkZSA9IC1pbmNfc3BhZGU7Ci0gICAgfQotICAgIGlmIChtb3ZTcGFkZSA8IDApIHsKLSAgICAJbW92U3BhZGUgPSAwOwotICAgIAlpbmNfc3BhZGUgPSAtaW5jX3NwYWRlOwotICAgIH0KLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQlpZiAoYWNlX2NsdWIgPT0gbnVsbCkgewotCQlhY2VfY2x1YiA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJhY2VfY2x1Yi5qcGciKTsKLQkJYWNlX3NwYWRlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImFjZV9zcGFkZS5qcGciKTsKLQkJYWNlX2RpYW1vbmQgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAiYWNlX2RpYW1vbmQuanBnIik7Ci0JCWFjZV9oZWFydHMgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAiYWNlX2hlYXJ0cy5qcGciKTsKLQl9Ci0JCi0JY2x1YldpZHRoID0gYWNlX2NsdWIuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JZGlhbW9uZFdpZHRoID0gYWNlX2RpYW1vbmQuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JaGVhcnRXaWR0aCA9IGFjZV9oZWFydHMuZ2V0Qm91bmRzKCkud2lkdGg7Ci0Jc3BhZGVIZWlnaHQgPSBhY2Vfc3BhZGUuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCi0JVHJhbnNmb3JtIHRyYW5zZm9ybTsKLQkKLQkvLyBhY2Ugb2YgY2x1YnMJCQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKChpbnQpbW92Q2x1YlgsIChpbnQpbW92Q2x1YlkpOwkKLQl0cmFuc2Zvcm0uc2NhbGUoc2NhbGVXaWR0aCwgc2NhbGVXaWR0aCk7Ci0JCi0JLy8gcm90YXRlIG9uIGNlbnRlciBvZiBpbWFnZQotCVJlY3RhbmdsZSByZWN0ID0gYWNlX2NsdWIuZ2V0Qm91bmRzKCk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZShyZWN0LndpZHRoLzIsIHJlY3QuaGVpZ2h0LzIpOwotCXRyYW5zZm9ybS5yb3RhdGUocm90YXRpb25BbmdsZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgtcmVjdC53aWR0aC8yLCAtcmVjdC5oZWlnaHQvMik7Ci0KLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCWdjLmRyYXdJbWFnZShhY2VfY2x1YiwgMCwgMCk7Ci0JCi0JLy8gYWNlIG9mIGRpYW1vbmRzCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoKGludCltb3ZEaWFtb25kWCwgKGludCltb3ZEaWFtb25kWSk7Ci0JdHJhbnNmb3JtLnNjYWxlKHNjYWxlV2lkdGgsIHNjYWxlV2lkdGgpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JZ2MuZHJhd0ltYWdlKGFjZV9kaWFtb25kLCAwLCAwKTsKLQotCS8vIGFjZSBvZiBoZWFydHMKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZShtb3ZIZWFydCwgaGVpZ2h0LzIpOwotCXRyYW5zZm9ybS5zY2FsZShoZWFydFNjYWxlLCAwLjVmKnNjYWxlKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCWdjLmRyYXdJbWFnZShhY2VfaGVhcnRzLCAwLCAwKTsKLQkKLQkvLyBhY2Ugb2Ygc3BhZGVzCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUobW92U3BhZGUsIG1vdlNwYWRlKTsKLQl0cmFuc2Zvcm0uc2NhbGUoMC41ZipzY2FsZSwgc3BhZGVTY2FsZSk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQlnYy5kcmF3SW1hZ2UoYWNlX3NwYWRlLCAwLCAwKTsKLX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ29sb3JMaXN0ZW5lci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ29sb3JMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJkODA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NvbG9yTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotLyoqCi0gKiBVc2VkIHRvIHBlcmZvcm0gYW4gYWN0aW9uIGFmdGVyIGFuIGl0ZW0gaW4gYSBNZW51IGhhcyBiZWVuIHNlbGVjdGVkLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5Db2xvck1lbnUuamF2YQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NCYWNrZ3JvdW5kLmphdmEKLSAqLwotcHVibGljIGludGVyZmFjZSBDb2xvckxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYik7Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NvbG9yTWVudS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ29sb3JNZW51LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWQwN2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ29sb3JNZW51LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgdXRpbGl6ZXMgdGhlIGZhY3RvcnkgZGVzaWduIHBhdHRlcm4gdG8gY3JlYXRlIG1lbnVzIHRoYXQgbWF5Ci0gKiBjb250YWluIGNvbG9yIGl0ZW1zLCBwYXR0ZXJuIGl0ZW1zIGFuZCBncmFkaWVudCBpdGVtcy4gVG8gY3JlYXRlIGEgbWVudToKLSAqIGZpcnN0IHNldCB0aGUgbWVudSBpdGVtcyB0aGF0IHlvdSB3aXNoIHRvIGhhdmUgYXBwZWFyIGluIHRoZSBtZW51IGJ5IGNhbGxpbmcKLSAqIHRoZSBzZXR0ZXJzIChzZXRDb2xvckl0ZW1zKCksIHNldFBhdHRlcm5JdGVtcygpLCBzZXRHcmFkaWVudEl0ZW1zKCkpLCBhbmQKLSAqIHRoZW4gY2FsbCBjcmVhdGVNZW51KCkgdG8gZ2V0IGFuIGluc3RhbmNlIG9mIGEgbWVudS4gQnkgZGVmYXVsdCwgdGhlIG1lbnUKLSAqIHdpbGwgY29udGFpbiBjb2xvciBpdGVtcy4KLSAqLwotcHVibGljIGNsYXNzIENvbG9yTWVudSB7Ci0KLQlib29sZWFuIGVuYWJsZUNvbG9ySXRlbXMsIGVuYWJsZVBhdHRlcm5JdGVtcywgZW5hYmxlR3JhZGllbnRJdGVtczsKLQkKLQlwdWJsaWMgQ29sb3JNZW51KCkgewotCQllbmFibGVDb2xvckl0ZW1zID0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCB0aGUgY29sb3IgbWVudSBpdGVtcyB3aWxsIGFwcGVhciBpbgotCSAqIHRoZSBtZW51LgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGUKLQkgKiAgICAgICAgICAgIEEgYm9vbGVhbiBmbGFnIC0gdHJ1ZSB0byBtYWtlIHRoZSBjb2xvciBtZW51IGl0ZW1zIHZpc2libGUgaW4KLQkgKiAgICAgICAgICAgIHRoZSBtZW51OyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sb3JJdGVtcyhib29sZWFuIGVuYWJsZSkgewotCQllbmFibGVDb2xvckl0ZW1zID0gZW5hYmxlOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgY29sb3IgbWVudSBpdGVtcyBhcmUgY29udGFpbmVkIGluIHRoZSBtZW51OyBmYWxzZSBvdGhlcndpc2UuCi0JICogKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb2xvckl0ZW1zKCkgewotCQlyZXR1cm4gZW5hYmxlQ29sb3JJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCB0aGUgcGF0dGVybiBtZW51IGl0ZW1zIHdpbGwgYXBwZWFyCi0JICogaW4gdGhlIG1lbnUuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZQotCSAqICAgICAgICAgICAgQSBib29sZWFuIGZsYWcgLSB0cnVlIHRvIG1ha2UgdGhlIHBhdHRlcm4gbWVudSBpdGVtcyB2aXNpYmxlCi0JICogICAgICAgICAgICBpbiB0aGUgbWVudTsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdHRlcm5JdGVtcyhib29sZWFuIGVuYWJsZSkgewotCQllbmFibGVQYXR0ZXJuSXRlbXMgPSBlbmFibGU7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBwYXR0ZXJuIG1lbnUgaXRlbXMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgbWVudTsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UGF0dGVybkl0ZW1zKCkgewotCQlyZXR1cm4gZW5hYmxlUGF0dGVybkl0ZW1zOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHRoZSBncmFkaWVudCBtZW51IGl0ZW1zIHdpbGwgYXBwZWFyCi0JICogaW4gdGhlIG1lbnUuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZQotCSAqICAgICAgICAgICAgQSBib29sZWFuIGZsYWcgLSB0cnVlIHRvIG1ha2UgdGhlIGdyYWRpZW50IG1lbnUgaXRlbXMgdmlzaWJsZQotCSAqICAgICAgICAgICAgaW4gdGhlIG1lbnU7IGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFkaWVudEl0ZW1zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWVuYWJsZUdyYWRpZW50SXRlbXMgPSBlbmFibGU7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBncmFkaWVudCBtZW51IGl0ZW1zIGFyZSBjb250YWluZWQgaW4gdGhlIG1lbnU7IGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRHcmFkaWVudEl0ZW1zKCkgewotCQlyZXR1cm4gZW5hYmxlR3JhZGllbnRJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgbWVudSBiYXNlZCBvbiB0aGUgc2V0dGluZ3MgcHJvdmlkZWQgdmlhCi0JICogc2V0Q29sb3JJdGVtcygpLCBzZXRQYXR0ZXJuSXRlbXMoKSBhbmQgc2V0R3JhZGllbnRJdGVtcygpCi0JICogCi0JICogQHJldHVybiBBIG1lbnUgYmFzZWQgb24gdGhlIHNldHRpbmdzCi0JICovCi0JcHVibGljIE1lbnUgY3JlYXRlTWVudShDb250cm9sIHBhcmVudCwgQ29sb3JMaXN0ZW5lciBjbCkgewotCQlNZW51IG1lbnUgPSBuZXcgTWVudShwYXJlbnQpOwotCQotCQlNZW51SXRlbUxpc3RlbmVyIG1lbnVJdGVtTGlzdGVuZXIgPSBjcmVhdGVNZW51SXRlbUxpc3RlbmVyKHBhcmVudCk7Ci0JCW1lbnUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbWVudUl0ZW1MaXN0ZW5lcik7Ci0JCW1lbnUuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIG1lbnVJdGVtTGlzdGVuZXIpOwotCQltZW51SXRlbUxpc3RlbmVyLnNldENvbG9yTGlzdGVuZXIoY2wpOwotCi0JCWlmIChlbmFibGVDb2xvckl0ZW1zKSB7Ci0JCQlhZGRDb2xvckl0ZW1zKG1lbnUsIG1lbnVJdGVtTGlzdGVuZXIsIG1lbnVJdGVtTGlzdGVuZXIuZ2V0TWVudVJlc291cmNlcygpKTsKLQkJfQotCQlpZiAoZW5hYmxlUGF0dGVybkl0ZW1zKSB7Ci0JCQlhZGRQYXR0ZXJuSXRlbXMobWVudSwgbWVudUl0ZW1MaXN0ZW5lciwgbWVudUl0ZW1MaXN0ZW5lci5nZXRNZW51UmVzb3VyY2VzKCkpOwotCQl9Ci0JCWlmIChlbmFibGVHcmFkaWVudEl0ZW1zKSB7Ci0JCQlhZGRHcmFkaWVudEl0ZW1zKG1lbnUsIG1lbnVJdGVtTGlzdGVuZXIpOwotCQl9Ci0JCXJldHVybiBtZW51OwotCX0KLQkKLQkvKiogQWRkcyB0aGUgY29sb3JzIGl0ZW1zIHRvIHRoZSBtZW51LiAqLwotCXByaXZhdGUgdm9pZCBhZGRDb2xvckl0ZW1zKE1lbnUgbWVudSwgTWVudUl0ZW1MaXN0ZW5lciBtZW51TGlzdGVuZXIsCi0JCQlBcnJheUxpc3QgbWVudVJlc291cmNlcykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBtZW51LmdldERpc3BsYXkoKTsKLQkJCi0JCWlmIChtZW51LmdldEl0ZW1Db3VudCgpICE9IDApIHsKLQkJCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJfQotCQkKLQkJLy8gY29sb3IgbmFtZXMKLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW117Ci0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIldoaXRlIiksIC8vJE5PTi1OTFMtMSQKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmxhY2siKSwgLy8kTk9OLU5MUy0xJAotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZWQiKSwgLy8kTk9OLU5MUy0xJAotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmVlbiIpLCAvLyROT04tTkxTLTEkCi0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJsdWUiKSwgLy8kTk9OLU5MUy0xJAotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJZZWxsb3ciKSwgLy8kTk9OLU5MUy0xJAotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDeWFuIiksIC8vJE5PTi1OTFMtMSQKLQkJfTsKLQkJCi0JCS8vIGNvbG9ycyBuZWVkZWQgZm9yIHRoZSBiYWNrZ3JvdW5kIG1lbnUKLQkJQ29sb3JbXSBjb2xvcnMgPSBuZXcgQ29sb3JbXXsKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSwKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSwKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCksCi0JCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTiksCi0JCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSwKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVyksCi0JCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9DWUFOKSwKLQkJfTsKLQkKLQkJLy8gYWRkIHN0YW5kYXJkIGNvbG9yIGl0ZW1zIHRvIG1lbnUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQobmFtZXNbaV0pOwotCQkJaXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBtZW51TGlzdGVuZXIpOwotCQkJQ29sb3IgY29sb3IgPSBjb2xvcnNbaV07Ci0JCQlHcmFwaGljc0JhY2tncm91bmQgZ2IgPSBuZXcgR3JhcGhpY3NCYWNrZ3JvdW5kKCk7Ci0JCQlJbWFnZSBpbWFnZSA9IEdyYXBoaWNzRXhhbXBsZS5jcmVhdGVJbWFnZShkaXNwbGF5LCBjb2xvcik7Ci0JCQlnYi5zZXRCZ0NvbG9yMShjb2xvcik7Ci0JCQlnYi5zZXRCZ0ltYWdlKGltYWdlKTsKLQkJCWdiLnNldFRodW1iTmFpbChpbWFnZSk7Ci0JCQltZW51UmVzb3VyY2VzLmFkZChpbWFnZSk7Ci0JCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCWl0ZW0uc2V0RGF0YShnYik7Ci0JCX0KLQkJCi0JCS8vIGFkZCBjdXN0b20gY29sb3IgaXRlbSB0byBtZW51Ci0JCW1lbnVMaXN0ZW5lci5jdXN0b21Db2xvck1JID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJbWVudUxpc3RlbmVyLmN1c3RvbUNvbG9yTUkuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1c3RvbUNvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JCW1lbnVMaXN0ZW5lci5jdXN0b21Db2xvck1JLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG1lbnVMaXN0ZW5lcik7Ci0JCUdyYXBoaWNzQmFja2dyb3VuZCBnYiA9IG5ldyBHcmFwaGljc0JhY2tncm91bmQoKTsKLQkJbWVudUxpc3RlbmVyLmN1c3RvbUNvbG9yTUkuc2V0RGF0YShnYik7CQkKLQl9Ci0JCi0JLyoqIEFkZHMgdGhlIHBhdHRlcm4gaXRlbXMgdG8gdGhlIG1lbnUuICovCi0JcHJpdmF0ZSB2b2lkIGFkZFBhdHRlcm5JdGVtcyhNZW51IG1lbnUsIE1lbnVJdGVtTGlzdGVuZXIgbWVudUxpc3RlbmVyLAotCQkJQXJyYXlMaXN0IG1lbnVSZXNvdXJjZXMpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbWVudS5nZXREaXNwbGF5KCk7Ci0JCQotCQlpZiAobWVudS5nZXRJdGVtQ291bnQoKSAhPSAwKSB7Ci0JCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCX0KLQkJCi0JCS8vIHBhdHRlcm4gbmFtZXMKLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW117Ci0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdHRlcm4xIiksIC8vJE5PTi1OTFMtMSQKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGF0dGVybjIiKSwgLy8kTk9OLU5MUy0xJAotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXR0ZXJuMyIpLCAvLyROT04tTkxTLTEkCi0JCX07Ci0JCQotCQkvLyBwYXR0ZXJuIGltYWdlcwotCQlJbWFnZVtdIGltYWdlcyA9IG5ldyBJbWFnZVtdewotCQkJbG9hZEltYWdlKGRpc3BsYXksICJwYXR0ZXJuMS5qcGciLCBtZW51UmVzb3VyY2VzKSwJCi0JCQlsb2FkSW1hZ2UoZGlzcGxheSwgInBhdHRlcm4yLmpwZyIsIG1lbnVSZXNvdXJjZXMpLAotCQkJbG9hZEltYWdlKGRpc3BsYXksICJwYXR0ZXJuMy5qcGciLCBtZW51UmVzb3VyY2VzKSwKLQkJfTsKLQkJCi0JCS8vIGFkZCB0aGUgcHJlLWRlZmluZWQgcGF0dGVybnMgdG8gdGhlIG1lbnUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQobmFtZXNbaV0pOwotCQkJaXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBtZW51TGlzdGVuZXIpOwotCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbaV07Ci0JCQlHcmFwaGljc0JhY2tncm91bmQgZ2IgPSBuZXcgR3JhcGhpY3NCYWNrZ3JvdW5kKCk7CQkJCi0JCQlnYi5zZXRCZ0ltYWdlKGltYWdlKTsKLQkJCWdiLnNldFRodW1iTmFpbChpbWFnZSk7Ci0JCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCWl0ZW0uc2V0RGF0YShnYik7Ci0JCX0KLQkJCi0JCS8vIGFkZCB0aGUgY3VzdG9tIHBhdHRlcm4gaXRlbQkKLQkJbWVudUxpc3RlbmVyLmN1c3RvbVBhdHRlcm5NSSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCW1lbnVMaXN0ZW5lci5jdXN0b21QYXR0ZXJuTUkuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1c3RvbVBhdHRlcm4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJbWVudUxpc3RlbmVyLmN1c3RvbVBhdHRlcm5NSS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBtZW51TGlzdGVuZXIpOwotCQlHcmFwaGljc0JhY2tncm91bmQgZ2IgPSBuZXcgR3JhcGhpY3NCYWNrZ3JvdW5kKCk7Ci0JCW1lbnVMaXN0ZW5lci5jdXN0b21QYXR0ZXJuTUkuc2V0RGF0YShnYik7CQkJCi0JfQotCQotCS8qKiBBZGRzIHRoZSBncmFkaWVudCBtZW51IGl0ZW0uICovCi0JcHJpdmF0ZSB2b2lkIGFkZEdyYWRpZW50SXRlbXMoTWVudSBtZW51LCBNZW51SXRlbUxpc3RlbmVyIG1lbnVMaXN0ZW5lcikgewotCQlpZiAobWVudS5nZXRJdGVtQ291bnQoKSAhPSAwKSB7Ci0JCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCX0KLQkJbWVudUxpc3RlbmVyLmN1c3RvbUdyYWRpZW50TUkgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQltZW51TGlzdGVuZXIuY3VzdG9tR3JhZGllbnRNSS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JhZGllbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbWVudUxpc3RlbmVyLmN1c3RvbUdyYWRpZW50TUkuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbWVudUxpc3RlbmVyKTsKLQkJR3JhcGhpY3NCYWNrZ3JvdW5kIGdiID0gbmV3IEdyYXBoaWNzQmFja2dyb3VuZCgpOwotCQltZW51TGlzdGVuZXIuY3VzdG9tR3JhZGllbnRNSS5zZXREYXRhKGdiKTsKLQl9Ci0JCi0JLyoqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGxpc3RlbmVyIGZvciBtZW51IGl0ZW1zLiAqLwotCXByaXZhdGUgTWVudUl0ZW1MaXN0ZW5lciBjcmVhdGVNZW51SXRlbUxpc3RlbmVyKGZpbmFsIENvbnRyb2wgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTWVudUl0ZW1MaXN0ZW5lcihwYXJlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIEltYWdlIHVzaW5nIG9uIHRoZSBwYXRoIG9mIGFuIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5Ci0JICogICAgICAgICAgICBBIERpc3BsYXkKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIHBhdGggb2YgdGhlIGltYWdlIGZpbGUKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogICAgICAgICAgICBUaGUgbGlzdCBvZiByZXNvdXJjZXMgb2YgdGhlIG1lbnUKLQkgKi8KLQlwcml2YXRlIEltYWdlIGxvYWRJbWFnZShEaXNwbGF5IGRpc3BsYXksIFN0cmluZyBuYW1lLCBBcnJheUxpc3QgcmVzb3VyY2VzKSB7Ci0JCUltYWdlIGltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkaXNwbGF5LCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsIG5hbWUpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgcmVzb3VyY2VzLmFkZChpbWFnZSk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBBbiBpbm5lciBjbGFzcyB1c2VkIGFzIGEgbGlzdGVuZXIgZm9yIE1lbnVJdGVtcyBhZGRlZCB0byB0aGUgbWVudS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTWVudUl0ZW1MaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQkJTWVudUl0ZW0gY3VzdG9tQ29sb3JNSSwgY3VzdG9tUGF0dGVybk1JLCBjdXN0b21HcmFkaWVudE1JOwkvLyBjdXN0b20gbWVudSBpdGVtcwotCQlDb250cm9sIHBhcmVudDsKLQkJSW1hZ2UgY3VzdG9tSW1hZ2UsIGN1c3RvbUltYWdlVGh1bWI7Ci0JCUNvbG9yIGN1c3RvbUNvbG9yOwotCQlHcmFwaGljc0JhY2tncm91bmQgYmFja2dyb3VuZDsJLy8gdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFja2dyb3VuZAotCQlDb2xvckxpc3RlbmVyIGNvbG9yTGlzdGVuZXI7Ci0JCUFycmF5TGlzdCByZXNvdXJjZXM7Ci0JCQotCQlwdWJsaWMgTWVudUl0ZW1MaXN0ZW5lcihDb250cm9sIHBhcmVudCl7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsgCi0JCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJLyoqCi0JCSAqIE1ldGhvZCB1c2VkIHRvIHNldCB0aGUgQ29sb3JMaXN0ZW5lcgotCQkgKiAKLQkJICogQHBhcmFtIGNsCi0JCSAqICAgICAgICAgICAgQSBDb2xvckxpc3RlbmVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkNvbG9yTGlzdGVuZXIuamF2YQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0Q29sb3JMaXN0ZW5lcihDb2xvckxpc3RlbmVyIGNsKSB7Ci0JCQl0aGlzLmNvbG9yTGlzdGVuZXIgPSBjbDsKLQkJfQotCQkKLQkJcHVibGljIEFycmF5TGlzdCBnZXRNZW51UmVzb3VyY2VzKCkgewotCQkJcmV0dXJuIHJlc291cmNlczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQotCQkJY2FzZSBTV1QuRGlzcG9zZToKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJCQkoKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpKS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULlNlbGVjdGlvbjoKLQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBldmVudC5kaXNwbGF5OwotCQkJCU1lbnVJdGVtIGl0ZW0gPSAoTWVudUl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCQlpZiAoY3VzdG9tQ29sb3JNSSA9PSBpdGVtKSB7Ci0JCQkJCUNvbG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhwYXJlbnQuZ2V0U2hlbGwoKSk7Ci0JCQkJCWlmIChjdXN0b21Db2xvciAhPSBudWxsICYmICFjdXN0b21Db2xvci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCWRpYWxvZy5zZXRSR0IoY3VzdG9tQ29sb3IuZ2V0UkdCKCkpOwotCQkJCQl9Ci0JCQkJCVJHQiByZ2IgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCQkJaWYgKGN1c3RvbUNvbG9yICE9IG51bGwpIGN1c3RvbUNvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJY3VzdG9tQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdiKTsKLQkJCQkJaWYgKGN1c3RvbVBhdHRlcm5NSSAhPSBudWxsKSBjdXN0b21QYXR0ZXJuTUkuc2V0SW1hZ2UobnVsbCk7Ci0JCQkJCWlmIChjdXN0b21HcmFkaWVudE1JICE9IG51bGwpIGN1c3RvbUdyYWRpZW50TUkuc2V0SW1hZ2UobnVsbCk7Ci0JCQkJCWlmIChjdXN0b21JbWFnZSAhPSBudWxsKSBjdXN0b21JbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCWN1c3RvbUltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmNyZWF0ZUltYWdlKGRpc3BsYXksIGN1c3RvbUNvbG9yKTsKLQkJCQkJR3JhcGhpY3NCYWNrZ3JvdW5kIGdiID0gbmV3IEdyYXBoaWNzQmFja2dyb3VuZCgpOwotCQkJCQlnYi5zZXRCZ0ltYWdlKGN1c3RvbUltYWdlKTsKLQkJCQkJZ2Iuc2V0VGh1bWJOYWlsKGN1c3RvbUltYWdlKTsKLQkJCQkJZ2Iuc2V0QmdDb2xvcjEoY3VzdG9tQ29sb3IpOwotCQkJCQlpdGVtLnNldERhdGEoZ2IpOwotCQkJCQlpdGVtLnNldEltYWdlKGN1c3RvbUltYWdlKTsKLQkJCQkJcmVzb3VyY2VzLmFkZChjdXN0b21Db2xvcik7Ci0JCQkJCXJlc291cmNlcy5hZGQoY3VzdG9tSW1hZ2UpOwotCQkJCX0gZWxzZSBpZiAoY3VzdG9tUGF0dGVybk1JID09IGl0ZW0pIHsKLQkJCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhwYXJlbnQuZ2V0U2hlbGwoKSk7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLmpwZyIsICIqLmdpZiIsCSIqLioiIH0pOwotCQkJCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChuYW1lID09IG51bGwpIHJldHVybjsKLQkJCQkJaWYgKGN1c3RvbUNvbG9yTUkgIT0gbnVsbCkgY3VzdG9tQ29sb3JNSS5zZXRJbWFnZShudWxsKTsKLQkJCQkJaWYgKGN1c3RvbUdyYWRpZW50TUkgIT0gbnVsbCkgY3VzdG9tR3JhZGllbnRNSS5zZXRJbWFnZShudWxsKTsKLQkJCQkJaWYgKGN1c3RvbUNvbG9yICE9IG51bGwpIGN1c3RvbUNvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJaWYgKGN1c3RvbUltYWdlICE9IG51bGwpIGN1c3RvbUltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJaWYgKGN1c3RvbUltYWdlVGh1bWIgIT0gbnVsbCkgY3VzdG9tSW1hZ2VUaHVtYi5kaXNwb3NlKCk7Ci0JCQkJCWN1c3RvbUltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIG5hbWUpOwotCQkJCQljdXN0b21JbWFnZVRodW1iID0gR3JhcGhpY3NFeGFtcGxlLmNyZWF0ZVRodW1ibmFpbChkaXNwbGF5LCBuYW1lKTsKLQkJCQkJR3JhcGhpY3NCYWNrZ3JvdW5kIGdiID0gbmV3IEdyYXBoaWNzQmFja2dyb3VuZCgpOwotCQkJCQlnYi5zZXRCZ0ltYWdlKGN1c3RvbUltYWdlKTsKLQkJCQkJZ2Iuc2V0VGh1bWJOYWlsKGN1c3RvbUltYWdlVGh1bWIpOwotCQkJCQlpdGVtLnNldERhdGEoZ2IpOwotCQkJCQlpdGVtLnNldEltYWdlKGN1c3RvbUltYWdlVGh1bWIpOwotCQkJCQlyZXNvdXJjZXMuYWRkKGN1c3RvbUltYWdlVGh1bWIpOwotCQkJCX0gZWxzZSBpZiAoY3VzdG9tR3JhZGllbnRNSSA9PSBpdGVtKSB7Ci0JCQkJCUdyYWRpZW50RGlhbG9nIGRpYWxvZyA9IG5ldyBHcmFkaWVudERpYWxvZyhwYXJlbnQuZ2V0U2hlbGwoKSk7Ci0JCQkJCWlmIChiYWNrZ3JvdW5kICE9IG51bGwpIHsKLQkJCQkJCWlmIChiYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkKLQkJCQkJCQlkaWFsb2cuc2V0Rmlyc3RSR0IoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpLmdldFJHQigpKTsKLQkJCQkJCWlmIChiYWNrZ3JvdW5kLmdldEJnQ29sb3IyKCkgIT0gbnVsbCkKLQkJCQkJCQlkaWFsb2cuc2V0U2Vjb25kUkdCKGJhY2tncm91bmQuZ2V0QmdDb2xvcjIoKS5nZXRSR0IoKSk7CQkJCQkJCi0JCQkJCX0JCQkJCQotCQkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBTV1QuT0spIHJldHVybjsKLQkJCQkJQ29sb3IgY29sb3JBID0gbmV3IENvbG9yKGRpc3BsYXksIGRpYWxvZy5nZXRGaXJzdFJHQigpKTsKLQkJCQkJQ29sb3IgY29sb3JCID0gbmV3IENvbG9yKGRpc3BsYXksIGRpYWxvZy5nZXRTZWNvbmRSR0IoKSk7Ci0JCQkJCWlmIChjb2xvckEgPT0gbnVsbCB8fCBjb2xvckIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlpZiAoY3VzdG9tQ29sb3JNSSAhPSBudWxsKSBjdXN0b21Db2xvck1JLnNldEltYWdlKG51bGwpOwotCQkJCQlpZiAoY3VzdG9tUGF0dGVybk1JICE9IG51bGwpIGN1c3RvbVBhdHRlcm5NSS5zZXRJbWFnZShudWxsKTsKLQkJCQkJaWYgKGN1c3RvbUNvbG9yICE9IG51bGwpIGN1c3RvbUNvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJaWYgKGN1c3RvbUltYWdlICE9IG51bGwpIGN1c3RvbUltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJY3VzdG9tSW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUuY3JlYXRlSW1hZ2UoZGlzcGxheSwgY29sb3JBLCAKLQkJCQkJCQljb2xvckIsIDE2LCAxNik7Ci0JCQkJCUdyYXBoaWNzQmFja2dyb3VuZCBnYiA9IG5ldyBHcmFwaGljc0JhY2tncm91bmQoKTsKLQkJCQkJZ2Iuc2V0QmdJbWFnZShjdXN0b21JbWFnZSk7Ci0JCQkJCWdiLnNldFRodW1iTmFpbChjdXN0b21JbWFnZSk7Ci0JCQkJCWdiLnNldEJnQ29sb3IxKGNvbG9yQSk7Ci0JCQkJCWdiLnNldEJnQ29sb3IyKGNvbG9yQik7Ci0JCQkJCWl0ZW0uc2V0RGF0YShnYik7Ci0JCQkJCWl0ZW0uc2V0SW1hZ2UoY3VzdG9tSW1hZ2UpOwotCQkJCQlyZXNvdXJjZXMuYWRkKGNvbG9yQSk7Ci0JCQkJCXJlc291cmNlcy5hZGQoY29sb3JCKTsKLQkJCQkJcmVzb3VyY2VzLmFkZChjdXN0b21JbWFnZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGN1c3RvbUNvbG9yTUkgIT0gbnVsbCkgY3VzdG9tQ29sb3JNSS5zZXRJbWFnZShudWxsKTsKLQkJCQkJaWYgKGN1c3RvbVBhdHRlcm5NSSAhPSBudWxsKSBjdXN0b21QYXR0ZXJuTUkuc2V0SW1hZ2UobnVsbCk7Ci0JCQkJCWlmIChjdXN0b21HcmFkaWVudE1JICE9IG51bGwpIGN1c3RvbUdyYWRpZW50TUkuc2V0SW1hZ2UobnVsbCk7Ci0JCQkJfQotCQkJCWJhY2tncm91bmQgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKSBpdGVtLmdldERhdGEoKTsKLQkJCQljb2xvckxpc3RlbmVyLnNldENvbG9yKGJhY2tncm91bmQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ291bnREb3duVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Db3VudERvd25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4MzUzOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Db3VudERvd25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBwcmVzZW50cyBhIGNvdW50IGRvd24gZnJvbSA1IHRvIDEsIHRoZW4gZGlzcGxheXMgU1dULgotICogKi8KLXB1YmxpYyBjbGFzcyBDb3VudERvd25UYWIgZXh0ZW5kcyBBbmltYXRlZEdyYXBoaWNzVGFiIHsKLQotCWZpbmFsIGludCBzdGFydE51bWJlciA9IDU7CQkJLy8gbnVtYmVyIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBjb3VudGRvd24KLQlpbnQgbmV4dE51bWJlciA9IHN0YXJ0TnVtYmVyOwkJLy8gbmV4dCBudW1iZXIgdG8gYmUgZGlzcGxheWVkCi0JaW50IGFuZ2xlID0gLTkwOwkJCQkJLy8gYW5nbGUgdXNlZCB0byByb3RhdGUgdGhlIGJhcgotCi0JU3Bpbm5lciBsaW5lV2lkdGhTcGlubmVyOwkJCS8vIHNwaW5uZXIgZm9yIGxpbmUgd2lkdGgKLQlDb21ibyBhbGlhc0NvbWJvLCBsaW5lQ2FwQ29tYm87CQkvLyBjb21ibyBmb3IgYWxpYXMgdHlwZSBhbmQgbGluZSBjYXAKLQlpbnQgYW50aWFsaWFzLCBsaW5lQ2FwOwkJCQkvLyBhbnRpYWxpYXMgYW5kIGxpbmVjYXAgdmFsdWVzCi0JaW50W10gY2FwVmFsdWVzID0geyBTV1QuQ0FQX0ZMQVQsIFNXVC5DQVBfU1FVQVJFLCBTV1QuQ0FQX1JPVU5EIH07Ci0JaW50W10gYWxpYXNWYWx1ZXMgPSB7IFNXVC5ERUZBVUxULCBTV1QuT0ZGLCBTV1QuT04gfTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGV4YW1wbGUKLQkgKiAgICAgICAgICAgIEEgR3JhcGhpY3NFeGFtcGxlCi0JICovCi0JcHVibGljIENvdW50RG93blRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCQlzdXBlcihleGFtcGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIHRoZSBjb250cm9scyBzcGVjaWZpYyB0byB0aGUgdGFiLiBUaGUgY2FsbCB0byB0aGUKLQkgKiBjcmVhdGVDb250cm9sUGFuZWwgbWV0aG9kIGluIHRoZSBzdXBlciBjbGFzcyBjcmVhdGUgdGhlIGNvbnRyb2xzIHRoYXQgYXJlCi0JICogZGVmaW5lZCBpbiB0aGUgc3VwZXIgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sUGFuZWwocGFyZW50KTsKLQotCQlpZiAobmV4dE51bWJlciA8IDEpCi0JCQluZXh0TnVtYmVyID0gc3RhcnROdW1iZXI7Ci0KLQkJLy8gYWRkIHNlbGVjdGlvbiBsaXN0ZW5lciB0byByZXNldCBuZXh0TnVtYmVyIGFmdGVyCi0JCS8vIHRoZSBzZXF1ZW5jZSBoYXMgY29tcGxldGVkCi0JCXBsYXlJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKG5leHROdW1iZXIgPCAxKQotCQkJCQluZXh0TnVtYmVyID0gc3RhcnROdW1iZXI7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbXBvc2l0ZSBjb21wOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0KLQkJLy8gY3JlYXRlIHNwaW5uZXIgZm9yIGxpbmUgd2lkdGgKLQkJY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVXaWR0aCIpKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5lV2lkdGhTcGlubmVyID0gbmV3IFNwaW5uZXIoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQkJbGluZVdpZHRoU3Bpbm5lci5zZXRTZWxlY3Rpb24oMjApOwotCQlsaW5lV2lkdGhTcGlubmVyLnNldE1pbmltdW0oMSk7Ci0JCWxpbmVXaWR0aFNwaW5uZXIuc2V0TWF4aW11bSgxMDApOwotCQlsaW5lV2lkdGhTcGlubmVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFwYXVzZUl0ZW0uaXNFbmFibGVkKCkpIHsKLQkJCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSBkcm9wIGRvd24gY29tYm8gZm9yIGFudGlhbGlhc2luZwotCQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygiQW50aWFsaWFzaW5nIikpOyAvLyROT04tTkxTLTEkCi0JCWFsaWFzQ29tYm8gPSBuZXcgQ29tYm8oY29tcCwgU1dULkRST1BfRE9XTik7Ci0JCWFsaWFzQ29tYm8uYWRkKCJERUZBVUxUIik7Ci0JCWFsaWFzQ29tYm8uYWRkKCJPRkYiKTsKLQkJYWxpYXNDb21iby5hZGQoIk9OIik7Ci0JCWFsaWFzQ29tYm8uc2VsZWN0KDApOwotCQlhbnRpYWxpYXMgPSBhbGlhc1ZhbHVlc1swXTsKLQkJYWxpYXNDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWFudGlhbGlhcyA9IGFsaWFzVmFsdWVzW2FsaWFzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0JCQkJaWYgKCFwYXVzZUl0ZW0uaXNFbmFibGVkKCkpIHsKLQkJCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSBkcm9wIGRvd24gY29tYm8gZm9yIGxpbmUgY2FwCi0JCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJMaW5lQ2FwIikpOyAvLyROT04tTkxTLTEkCi0JCWxpbmVDYXBDb21ibyA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOKTsKLQkJbGluZUNhcENvbWJvLmFkZCgiRkxBVCIpOwotCQlsaW5lQ2FwQ29tYm8uYWRkKCJTUVVBUkUiKTsKLQkJbGluZUNhcENvbWJvLmFkZCgiUk9VTkQiKTsKLQkJbGluZUNhcENvbWJvLnNlbGVjdCgwKTsKLQkJbGluZUNhcCA9IGNhcFZhbHVlc1swXTsKLQkJbGluZUNhcENvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJbGluZUNhcCA9IGNhcFZhbHVlc1tsaW5lQ2FwQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0JCQkJaWYgKCFwYXVzZUl0ZW0uaXNFbmFibGVkKCkpIHsKLQkJCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1pc2MiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ291bnRkb3duIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ291bnRkb3duRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkFuaW1hdGVkR3JhcGhpY3NUYWIjZ2V0QW5pbWF0aW9uVGltZSgpCi0JICovCi0JcHVibGljIGludCBnZXRJbml0aWFsQW5pbWF0aW9uVGltZSgpIHsKLQkJcmV0dXJuIDI4OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkFuaW1hdGVkR3JhcGhpY3NUYWIjbmV4dChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCi0JCWlmIChhbmdsZSA9PSAyNzApIHsKLQkJCW5leHROdW1iZXItLTsKLQkJCWlmIChuZXh0TnVtYmVyIDwgMSkgewotCQkJCS8vIHN0b3AgYW5pbWF0aW9uCi0JCQkJc2V0QW5pbWF0aW9uKGZhbHNlKTsKLQkJCX0KLQkJCWFuZ2xlID0gLTkwOwotCQl9Ci0JCWFuZ2xlICs9IDEwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywKLQkgKiAgICAgIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQotCQkvLyBkaWFtZXRlciBvZiB0aGUgY2lyY2xlIGluIHBpeGVscwotCQlpbnQgZGlhbWV0ZXIgPSAoKHdpZHRoIDwgaGVpZ2h0KSA/IHdpZHRoIC0gMjUgOiBoZWlnaHQgLSAyNSk7Ci0KLQkJaWYgKCFnZXRBbmltYXRpb24oKSAmJiBuZXh0TnVtYmVyID09IDApIHsKLQkJCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZSgxKSwgZGlhbWV0ZXIvMiwKLQkJCQkJU1dULk5PTkUpOwotCQkJZ2Muc2V0Rm9udChmb250KTsKLQotCQkJLy8gZGlzcGxheSAiU1dUIgotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfQkxVRSkpOwotCQkJZ2Muc2V0VGV4dEFudGlhbGlhcyhTV1QuT04pOwotCi0JCQkvLyBkZXRlcm1pbmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHdvcmQKLQkJCVN0cmluZyB0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTV1QiKTsKLQkJCVBvaW50IHBvaW50ID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCQkJaW50IHRleHRXaWR0aCA9IHBvaW50Lng7Ci0JCQlpbnQgdGV4dEhlaWdodCA9IHBvaW50Lnk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC10ZXh0V2lkdGgpLzIsCi0JCQkJCShoZWlnaHQtdGV4dEhlaWdodCkvMiwgdHJ1ZSk7Ci0JCQlmb250LmRpc3Bvc2UoKTsKLQotCQl9IGVsc2UgewotCi0JCQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udEZhY2UoMCksCi0JCQkJCTYqZGlhbWV0ZXIvMTAsIFNXVC5OT05FKTsKLQkJCWdjLnNldEZvbnQoZm9udCk7Ci0KLQkJCS8vIHNldCBhdHRyaWJ1dGVzIGZyb20gY29udHJvbHMKLQkJCWdjLnNldExpbmVXaWR0aChsaW5lV2lkdGhTcGlubmVyLmdldFNlbGVjdGlvbigpKTsKLQkJCWdjLnNldExpbmVDYXAobGluZUNhcCk7IC8vIHJvdW5kIGxpbmUgZW5kcwotCQkJZ2Muc2V0QW50aWFsaWFzKGFudGlhbGlhcyk7IC8vIHNtb290aCBqYWdnZWQgZWRnZXMKLQkJCWdjLnNldFRleHRBbnRpYWxpYXMoYW50aWFsaWFzKTsgLy8gc21vb3RoIGphZ2dlZCBlZGdlcwotCi0JCQkvLyBkcmF3IHRoZSBjaXJjbGVzCi0JCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCQkJcGF0aC5hZGRBcmMoKHdpZHRoLWRpYW1ldGVyKS8yLCAoaGVpZ2h0LWRpYW1ldGVyKS8yLAotCQkJCQlkaWFtZXRlciwgZGlhbWV0ZXIsIDAsIDM2MCk7Ci0JCQlwYXRoLmFkZEFyYygod2lkdGgtZGlhbWV0ZXIrNTApLzIsCi0JCQkJCShoZWlnaHQtZGlhbWV0ZXIrNTApLzIsIGRpYW1ldGVyLTUwLCBkaWFtZXRlci01MCwKLQkJCQkJMCwgMzYwKTsKLQkJCWdjLmRyYXdQYXRoKHBhdGgpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQkJZ2MuZmlsbFBhdGgocGF0aCk7Ci0JCQlwYXRoLmRpc3Bvc2UoKTsKLQotCQkJUG9pbnQgcG9pbnQgPSBnYy5zdHJpbmdFeHRlbnQobmV3IEludGVnZXIobmV4dE51bWJlcikudG9TdHJpbmcoKSk7Ci0JCQlpbnQgdGV4dFdpZHRoID0gcG9pbnQueDsKLQkJCWludCB0ZXh0SGVpZ2h0ID0gcG9pbnQueTsKLQotCQkJLy8gZHJhdyB0aGUgbnVtYmVyCi0JCQlnYy5kcmF3U3RyaW5nKG5ldyBJbnRlZ2VyKG5leHROdW1iZXIpLnRvU3RyaW5nKCksCi0JCQkJCSh3aWR0aC10ZXh0V2lkdGgpLzIsIChoZWlnaHQtdGV4dEhlaWdodCkvMiwgdHJ1ZSk7Ci0KLQkJCS8vIGRyYXcgdGhlIHJvdGF0aW5nIGFybQotCQkJVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQkJCXRyYW5zZm9ybS50cmFuc2xhdGUod2lkdGgvMiwgaGVpZ2h0LzIpOwotCQkJdHJhbnNmb3JtLnJvdGF0ZShhbmdsZSk7Ci0JCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJCWdjLmRyYXdMaW5lKDAsIDAsIGRpYW1ldGVyLzIsIDApOwotCQkJdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgdmFsaWQgZm9udCBmb3IgdGhlIHJlc2lkZW50IHBsYXRmb3JtLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW5kZXggaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGZvbnQgZmFjZQotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250RmFjZShpbnQgaW5kZXgpIHsKLQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3aW4zMiIpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW10geyAiQ291cmllciIsICJJbXBhY3QiIH1baW5kZXhdOwotCQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJtb3RpZiIpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW10geyAiQ291cmllciIsICJVUlcgR290aGljIEwiIH1baW5kZXhdOwotCQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJndGsiKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIkNvdXJpZXIiLCAiQmFla211ayBIZWFkbGluZSIgfVtpbmRleF07Ci0JCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImNhcmJvbiIpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW10geyAiQ291cmllciIsICJJbXBhY3QiIH1baW5kZXhdOwotCQl9IGVsc2UgeyAvLyBwaG90b24sIGV0YyAuLi4KLQkJCXJldHVybiBuZXcgU3RyaW5nW10geyAiQ291cmllciIsICJWZXJkYW5hIiB9W2luZGV4XTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1cnZlc1NXVFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VydmVzU1dUVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmU3YWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VydmVzU1dUVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgcHJlc2VudHMgY3ViaWMgYW5kIHF1YWRyYXRpYyBjdXJ2ZXMgdGhhdCBjYW4gYmUgZHJhd24uIEFzIGEKLSAqIGRlbW9uc3RyYXRpb24sIGN1YmljIGFuZCBxdWFkcmF0aWMgY3VydmVzIGFyZSB1c2VkIHRvIHNwZWxsIG91dCAiU1dUIi4KLSAqIFRoZSB1c2VyIG1heSByZXBvc2l0aW9uIHRoZSBjdWJpYyBhbmQgcXVhZHJhdGljIGhhbmRsZXMuIAotICovCi1wdWJsaWMgY2xhc3MgQ3VydmVzU1dUVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCS8qKiBUaGVzZSByZWN0YW5nbGVzIHJlcHJlc2VudCB0aGUgaGFuZGxlcyBvbiB0aGUgY3VydmVzLiAqLwotCXByaXZhdGUgUmVjdGFuZ2xlIHNSZWN0MSwgc1JlY3QyLCB3UmVjdDEsIHdSZWN0MiwgdFRvcFJlY3QxLCB0VG9wUmVjdDIsIAotCQkJdEJvdHRvbVJlY3QxLCB0Qm90dG9tUmVjdDI7Ci0JCi0JLyoqIFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIHBvc2l0aW9ucyBvZiB0aGUgY3VydmVzLiAqLwotCXByaXZhdGUgZmxvYXQgc1hQb3MsIHNZUG9zLCB3WFBvcywgd1lQb3MsIHRvcFRYUG9zLCB0b3BUWVBvcywgCi0JCQlib3RUWFBvcywgYm90VFlQb3M7Ci0JCi0JLyoqIFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIHggYW5kIHkgZGlzcGxhY2VtZW50IG9mIGVhY2ggaGFuZGxlLiAqLwotCXByaXZhdGUgZmxvYXQgc0RpZmZYMSwgc0RpZmZZMSwgc0RpZmZYMiwgc0RpZmZZMjsKLQlwcml2YXRlIGZsb2F0IHdEaWZmWDEsIHdEaWZmWTEsIHdEaWZmWDIsIHdEaWZmWTI7Ci0JcHJpdmF0ZSBmbG9hdCB0VG9wRGlmZlgxLCB0VG9wRGlmZlkxLCB0VG9wRGlmZlgyLCB0VG9wRGlmZlkyOwotCXByaXZhdGUgZmxvYXQgdEJvdERpZmZYMSwgdEJvdERpZmZZMSwgdEJvdERpZmZYMiwgdEJvdERpZmZZMjsKLQkKLQkvKiogVGhlc2UgYXJlIGZsYWdzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBvciBub3QgYSBoYW5kbGUgaGFzIGJlZW4gbW92ZWQuICovCi0JcHJpdmF0ZSBib29sZWFuIHNMZWZ0UHRNb3ZlZCwgc1JpZ2h0UHRNb3ZlZCwgd1B0MU1vdmVkLCB3UHQyTW92ZWQsCi0JCQl0VG9wUHQxTW92ZWQsIHRUb3BQdDJNb3ZlZCwgdEJvdFB0MU1vdmVkLCB0Qm90UHQyTW92ZWQ7Ci0JCi0JcHJpdmF0ZSBNb3VzZU1vdmVMaXN0ZW5lciBtb3VzZU1vdmVMaXN0ZW5lcjsKLQlwcml2YXRlIE1vdXNlTGlzdGVuZXIgbW91c2VMaXN0ZW5lcjsKLQlwcml2YXRlIEN1cnNvciBjdXJzb3I7Ci0JCi0JLyoqIHRydWUgaWYgaG92ZXJpbmcgb3ZlciBhIGhhbmRsZSwgZmFsc2Ugb3RoZXJ3aXNlICovCi0JcHJpdmF0ZSBib29sZWFuIGhvdmVyaW5nID0gZmFsc2U7Ci0JCi0JLyoqIHRydWUgaWYgbGVmdCBtb3VzZSBidXR0b24gaXMgaGVsZCBkb3duLCBmYWxzZSBvdGhlcndpc2UgKi8KLQlwcml2YXRlIGJvb2xlYW4gbW91c2VEb3duID0gZmFsc2U7Ci0KLQkKLXB1YmxpYyBDdXJ2ZXNTV1RUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLQlzUmVjdDEgPSBuZXcgUmVjdGFuZ2xlKC03NSwgNTAsIDUsIDUpOwotCXNSZWN0MiA9IG5ldyBSZWN0YW5nbGUoNzUsIDEwMCwgNSwgNSk7Ci0Jc0RpZmZYMSA9IHNEaWZmWTEgPSAwOwotCXNEaWZmWDIgPSBzRGlmZlkyID0gMDsKLQl3UmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDgwLCAzMDAsIDUsIDUpOwotCXdSZWN0MiA9IG5ldyBSZWN0YW5nbGUoMTIwLCAzMDAsIDUsIDUpOwotCXdEaWZmWDEgPSB3RGlmZlkxID0gd0RpZmZYMiA9IHdEaWZmWTIgPSAwOwotCXRUb3BSZWN0MSA9IG5ldyBSZWN0YW5nbGUoMzMsIC0yMCwgNSwgNSk7Ci0JdFRvcFJlY3QyID0gbmV3IFJlY3RhbmdsZSg2NiwgMjAsIDUsIDUpOwotCXRUb3BEaWZmWDEgPSB0VG9wRGlmZlkxID0gdFRvcERpZmZYMiA9IHRUb3BEaWZmWTIgPSAwOwotCXRCb3R0b21SZWN0MSA9IG5ldyBSZWN0YW5nbGUoLTMzLCA1MCwgNSwgNSk7Ci0JdEJvdHRvbVJlY3QyID0gbmV3IFJlY3RhbmdsZSgzMywgMTAwLCA1LCA1KTsKLQl0Qm90RGlmZlgxID0gdEJvdERpZmZZMSA9IHRCb3REaWZmWDIgPSB0Qm90RGlmZlkyID0gMDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXJ2ZXMiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU1dUIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXJ2ZXNTV1REZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBib29sZWFuIGdldERvdWJsZUJ1ZmZlcmVkKCkgewotCXJldHVybiB0cnVlOwotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtb3VzZUxpc3RlbmVyICE9IG51bGwpCi0JCWV4YW1wbGUuY2FudmFzLnJlbW92ZU1vdXNlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci0JCi0JaWYgKG1vdXNlTW92ZUxpc3RlbmVyICE9IG51bGwpCi0JCWV4YW1wbGUuY2FudmFzLnJlbW92ZU1vdXNlTW92ZUxpc3RlbmVyKG1vdXNlTW92ZUxpc3RlbmVyKTsKLQkKLQlpZiAoY3Vyc29yICE9IG51bGwpIHsKLQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJY3Vyc29yID0gbnVsbDsKLQl9Ci19Ci0KLQkvKioKLQkgKiBUaGlzIGhlbHBlciBtZXRob2QgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQKLQkgKiBvdmVyIGEgaGFuZGxlLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBBIE1vdXNlRXZlbnQKLQkgKiBAcmV0dXJuIHRydWUgaWYgY3Vyc29yIGlzIHBvc2l0aW9uZWQgb3ZlciBhIGhhbmRsZTsgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi1wcml2YXRlIGJvb2xlYW4gaXNIb3ZlcmluZyhNb3VzZUV2ZW50IGUpIHsKLQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKHNSZWN0MS54ICsgKGludClzWFBvcyAtIDEsIHNSZWN0MS55ICsgKGludClzWVBvcyAtIDEsIHNSZWN0MS53aWR0aCsyLCBzUmVjdDEuaGVpZ2h0KzIpOwotCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoc1JlY3QyLnggKyAoaW50KXNYUG9zIC0gMSwgc1JlY3QyLnkgKyAoaW50KXNZUG9zIC0gMSwgc1JlY3QyLndpZHRoKzIsIHNSZWN0Mi5oZWlnaHQrMik7Ci0JUmVjdGFuZ2xlIHcxID0gbmV3IFJlY3RhbmdsZSh3UmVjdDEueCArIChpbnQpd1hQb3MgLSAxLCB3UmVjdDEueSArIChpbnQpd1lQb3MgLSAxLCB3UmVjdDEud2lkdGgrMiwgd1JlY3QxLmhlaWdodCsyKTsKLQlSZWN0YW5nbGUgdzIgPSBuZXcgUmVjdGFuZ2xlKHdSZWN0Mi54ICsgKGludCl3WFBvcyAtIDEsIHdSZWN0Mi55ICsgKGludCl3WVBvcyAtIDEsIHdSZWN0Mi53aWR0aCsyLCB3UmVjdDIuaGVpZ2h0KzIpOwotCVJlY3RhbmdsZSB0VG9wMSA9IG5ldyBSZWN0YW5nbGUodFRvcFJlY3QxLnggKyAoaW50KXRvcFRYUG9zIC0gMSwgdFRvcFJlY3QxLnkgKyAoaW50KXRvcFRZUG9zIC0gMSwgdFRvcFJlY3QxLndpZHRoKzIsIHRUb3BSZWN0MS5oZWlnaHQrMik7Ci0JUmVjdGFuZ2xlIHRUb3AyID0gbmV3IFJlY3RhbmdsZSh0VG9wUmVjdDIueCArIChpbnQpdG9wVFhQb3MgLSAxLCB0VG9wUmVjdDIueSArIChpbnQpdG9wVFlQb3MgLSAxLCB0VG9wUmVjdDIud2lkdGgrMiwgdFRvcFJlY3QyLmhlaWdodCsyKTsKLQlSZWN0YW5nbGUgdEJvdDEgPSBuZXcgUmVjdGFuZ2xlKHRCb3R0b21SZWN0MS54ICsgKGludClib3RUWFBvcyAtIDEsIHRCb3R0b21SZWN0MS55ICsgKGludClib3RUWVBvcyAtIDEsIHRCb3R0b21SZWN0MS53aWR0aCsyLCB0Qm90dG9tUmVjdDEuaGVpZ2h0KzIpOwotCVJlY3RhbmdsZSB0Qm90MiA9IG5ldyBSZWN0YW5nbGUodEJvdHRvbVJlY3QyLnggKyAoaW50KWJvdFRYUG9zIC0gMSwgdEJvdHRvbVJlY3QyLnkgKyAoaW50KWJvdFRZUG9zIC0gMSwgdEJvdHRvbVJlY3QyLndpZHRoKzIsIHRCb3R0b21SZWN0Mi5oZWlnaHQrMik7Ci0JCi0JcmV0dXJuICggcjEuY29udGFpbnMoZS54LCBlLnkpIHx8IHIyLmNvbnRhaW5zKGUueCwgZS55KSAKLQkJIHx8IHcxLmNvbnRhaW5zKGUueCwgZS55KSB8fCB3Mi5jb250YWlucyhlLngsIGUueSkgCi0JCSB8fCB0VG9wMS5jb250YWlucyhlLngsIGUueSkgfHwgdFRvcDIuY29udGFpbnMoZS54LCBlLnkpIAotCQkgfHwgdEJvdDEuY29udGFpbnMoZS54LCBlLnkpIHx8IHRCb3QyLmNvbnRhaW5zKGUueCwgZS55KSApOwotfQotLyoqIAotICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRyYXdpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JaWYgKGN1cnNvciA9PSBudWxsKSB7IAotCQljdXJzb3IgPSBuZXcgQ3Vyc29yKHBhcmVudC5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfSEFORCk7Ci0JfQotCi0JbW91c2VNb3ZlTGlzdGVuZXIgPSBuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCQotCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCQlpZiAoaG92ZXJpbmcgJiYgbW91c2VEb3duKSB7Ci0JCQkJZXhhbXBsZS5jYW52YXMuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCQl9IGVsc2UgaWYgKGlzSG92ZXJpbmcoZSkpIHsKLQkJCQlleGFtcGxlLmNhbnZhcy5zZXRDdXJzb3IoY3Vyc29yKTsKLQkJCQlob3ZlcmluZyA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWV4YW1wbGUuY2FudmFzLnNldEN1cnNvcihudWxsKTsKLQkJCQlob3ZlcmluZyA9IGZhbHNlOwotCQkJfQotCi0JCQlpZiAoc0xlZnRQdE1vdmVkKSB7Ci0JCQkJc0RpZmZYMSA9IHNEaWZmWDEgKyBlLnggLSAoaW50KXNYUG9zIC0gc1JlY3QxLng7Ci0JCQkJc0RpZmZZMSA9IHNEaWZmWTEgKyBlLnkgLSAoaW50KXNZUG9zIC0gc1JlY3QxLnk7Ci0JCQkJc1JlY3QxLnggPSBlLnggLSAoaW50KXNYUG9zOwotCQkJCXNSZWN0MS55ID0gZS55IC0gKGludClzWVBvczsKLQkJCX0gZWxzZSBpZiAoc1JpZ2h0UHRNb3ZlZCkgewotCQkJCXNEaWZmWDIgPSBzRGlmZlgyICsgZS54IC0gKGludClzWFBvcyAtIHNSZWN0Mi54OwotCQkJCXNEaWZmWTIgPSBzRGlmZlkyICsgZS55IC0gKGludClzWVBvcyAtIHNSZWN0Mi55OwotCQkJCXNSZWN0Mi54ID0gZS54IC0gKGludClzWFBvczsKLQkJCQlzUmVjdDIueSA9IGUueSAtIChpbnQpc1lQb3M7Ci0JCQl9IGVsc2UgaWYgKHdQdDFNb3ZlZCkgewotCQkJCXdEaWZmWDEgPSB3RGlmZlgxICsgZS54IC0gKGludCl3WFBvcyAtIHdSZWN0MS54OwotCQkJCXdEaWZmWTEgPSB3RGlmZlkxICsgZS55IC0gKGludCl3WVBvcyAtIHdSZWN0MS55OwotCQkJCXdSZWN0MS54ID0gZS54IC0gKGludCl3WFBvczsKLQkJCQl3UmVjdDEueSA9IGUueSAtIChpbnQpd1lQb3M7CQkJCQotCQkJfSBlbHNlIGlmICh3UHQyTW92ZWQpIHsKLQkJCQl3RGlmZlgyID0gd0RpZmZYMiArIGUueCAtIChpbnQpd1hQb3MgLSB3UmVjdDIueDsKLQkJCQl3RGlmZlkyID0gd0RpZmZZMiArIGUueSAtIChpbnQpd1lQb3MgLSB3UmVjdDIueTsKLQkJCQl3UmVjdDIueCA9IGUueCAtIChpbnQpd1hQb3M7Ci0JCQkJd1JlY3QyLnkgPSBlLnkgLSAoaW50KXdZUG9zOwkKLQkJCX0gZWxzZSBpZiAodFRvcFB0MU1vdmVkKSB7Ci0JCQkJdFRvcERpZmZYMSA9IHRUb3BEaWZmWDEgKyBlLnggLSAoaW50KXRvcFRYUG9zIC0gdFRvcFJlY3QxLng7Ci0JCQkJdFRvcERpZmZZMSA9IHRUb3BEaWZmWTEgKyBlLnkgLSAoaW50KXRvcFRZUG9zIC0gdFRvcFJlY3QxLnk7Ci0JCQkJdFRvcFJlY3QxLnggPSBlLnggLSAoaW50KXRvcFRYUG9zOwotCQkJCXRUb3BSZWN0MS55ID0gZS55IC0gKGludCl0b3BUWVBvczsJCi0JCQl9IGVsc2UgaWYgKHRUb3BQdDJNb3ZlZCkgewotCQkJCXRUb3BEaWZmWDIgPSB0VG9wRGlmZlgyICsgZS54IC0gKGludCl0b3BUWFBvcyAtIHRUb3BSZWN0Mi54OwotCQkJCXRUb3BEaWZmWTIgPSB0VG9wRGlmZlkyICsgZS55IC0gKGludCl0b3BUWVBvcyAtIHRUb3BSZWN0Mi55OwotCQkJCXRUb3BSZWN0Mi54ID0gZS54IC0gKGludCl0b3BUWFBvczsKLQkJCQl0VG9wUmVjdDIueSA9IGUueSAtIChpbnQpdG9wVFlQb3M7Ci0JCQl9IGVsc2UgaWYgKHRCb3RQdDFNb3ZlZCkgewotCQkJCXRCb3REaWZmWDEgPSB0Qm90RGlmZlgxICsgZS54IC0gKGludClib3RUWFBvcyAtIHRCb3R0b21SZWN0MS54OwotCQkJCXRCb3REaWZmWTEgPSB0Qm90RGlmZlkxICsgZS55IC0gKGludClib3RUWVBvcyAtIHRCb3R0b21SZWN0MS55OwotCQkJCXRCb3R0b21SZWN0MS54ID0gZS54IC0gKGludClib3RUWFBvczsKLQkJCQl0Qm90dG9tUmVjdDEueSA9IGUueSAtIChpbnQpYm90VFlQb3M7CQotCQkJfSBlbHNlIGlmICh0Qm90UHQyTW92ZWQpIHsKLQkJCQl0Qm90RGlmZlgyID0gdEJvdERpZmZYMiArIGUueCAtIChpbnQpYm90VFhQb3MgLSB0Qm90dG9tUmVjdDIueDsKLQkJCQl0Qm90RGlmZlkyID0gdEJvdERpZmZZMiArIGUueSAtIChpbnQpYm90VFlQb3MgLSB0Qm90dG9tUmVjdDIueTsKLQkJCQl0Qm90dG9tUmVjdDIueCA9IGUueCAtIChpbnQpYm90VFhQb3M7Ci0JCQkJdEJvdHRvbVJlY3QyLnkgPSBlLnkgLSAoaW50KWJvdFRZUG9zOwotCQkJfQotCQkJZXhhbXBsZS5yZWRyYXcoKTsJCQkKLQkJfQotCX07Ci0JCi0JbW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7fQotCi0JCS8qKgotCQkgKiBTZW50IHdoZW4gYSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZC4KLQkJICoKLQkJICogQHBhcmFtIGUgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW91c2UgYnV0dG9uIHByZXNzCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7ICAKLQkJCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoc1JlY3QxLnggKyAoaW50KXNYUG9zIC0gMSwgc1JlY3QxLnkgKyAoaW50KXNZUG9zIC0gMSwgc1JlY3QxLndpZHRoKzIsIHNSZWN0MS5oZWlnaHQrMik7Ci0JCQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKHNSZWN0Mi54ICsgKGludClzWFBvcyAtIDEsIHNSZWN0Mi55ICsgKGludClzWVBvcyAtIDEsIHNSZWN0Mi53aWR0aCsyLCBzUmVjdDIuaGVpZ2h0KzIpOwotCQkJUmVjdGFuZ2xlIHcxID0gbmV3IFJlY3RhbmdsZSh3UmVjdDEueCArIChpbnQpd1hQb3MgLSAxLCB3UmVjdDEueSArIChpbnQpd1lQb3MgLSAxLCB3UmVjdDEud2lkdGgrMiwgd1JlY3QxLmhlaWdodCsyKTsKLQkJCVJlY3RhbmdsZSB3MiA9IG5ldyBSZWN0YW5nbGUod1JlY3QyLnggKyAoaW50KXdYUG9zIC0gMSwgd1JlY3QyLnkgKyAoaW50KXdZUG9zIC0gMSwgd1JlY3QyLndpZHRoKzIsIHdSZWN0Mi5oZWlnaHQrMik7Ci0JCQlSZWN0YW5nbGUgdFRvcDEgPSBuZXcgUmVjdGFuZ2xlKHRUb3BSZWN0MS54ICsgKGludCl0b3BUWFBvcyAtIDEsIHRUb3BSZWN0MS55ICsgKGludCl0b3BUWVBvcyAtIDEsIHRUb3BSZWN0MS53aWR0aCsyLCB0VG9wUmVjdDEuaGVpZ2h0KzIpOwotCQkJUmVjdGFuZ2xlIHRUb3AyID0gbmV3IFJlY3RhbmdsZSh0VG9wUmVjdDIueCArIChpbnQpdG9wVFhQb3MgLSAxLCB0VG9wUmVjdDIueSArIChpbnQpdG9wVFlQb3MgLSAxLCB0VG9wUmVjdDIud2lkdGgrMiwgdFRvcFJlY3QyLmhlaWdodCsyKTsKLQkJCVJlY3RhbmdsZSB0Qm90MSA9IG5ldyBSZWN0YW5nbGUodEJvdHRvbVJlY3QxLnggKyAoaW50KWJvdFRYUG9zIC0gMSwgdEJvdHRvbVJlY3QxLnkgKyAoaW50KWJvdFRZUG9zIC0gMSwgdEJvdHRvbVJlY3QxLndpZHRoKzIsIHRCb3R0b21SZWN0MS5oZWlnaHQrMik7Ci0JCQlSZWN0YW5nbGUgdEJvdDIgPSBuZXcgUmVjdGFuZ2xlKHRCb3R0b21SZWN0Mi54ICsgKGludClib3RUWFBvcyAtIDEsIHRCb3R0b21SZWN0Mi55ICsgKGludClib3RUWVBvcyAtIDEsIHRCb3R0b21SZWN0Mi53aWR0aCsyLCB0Qm90dG9tUmVjdDIuaGVpZ2h0KzIpOwotCi0JCQlpZiAocjEuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJc0xlZnRQdE1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfSBlbHNlIGlmIChyMi5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQlzUmlnaHRQdE1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfSBlbHNlIGlmICh3MS5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQl3UHQxTW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHcyLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCXdQdDJNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAodFRvcDEuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJdFRvcFB0MU1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfSBlbHNlIGlmICh0VG9wMi5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQl0VG9wUHQyTW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHRCb3QxLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCXRCb3RQdDFNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAodEJvdDIuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJdEJvdFB0Mk1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFNlbnQgd2hlbiBhIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZC4KLQkJICoKLQkJICogQHBhcmFtIGUgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW91c2UgYnV0dG9uIHJlbGVhc2UKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQltb3VzZURvd24gPSBmYWxzZTsKLQkJCWlmIChpc0hvdmVyaW5nKGUpKSB7Ci0JCQkJZXhhbXBsZS5jYW52YXMuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCQl9IGVsc2UgewotCQkJCWV4YW1wbGUuY2FudmFzLnNldEN1cnNvcihudWxsKTsKLQkJCX0KLQkJCWlmIChzTGVmdFB0TW92ZWQpCi0JCQkJc0xlZnRQdE1vdmVkID0gZmFsc2U7Ci0JCQlpZiAoc1JpZ2h0UHRNb3ZlZCkKLQkJCQlzUmlnaHRQdE1vdmVkID0gZmFsc2U7Ci0JCQlpZiAod1B0MU1vdmVkKQotCQkJCXdQdDFNb3ZlZCA9IGZhbHNlOwotCQkJaWYgKHdQdDJNb3ZlZCkKLQkJCQl3UHQyTW92ZWQgPSBmYWxzZTsKLQkJCWlmICh0VG9wUHQxTW92ZWQpCi0JCQkJdFRvcFB0MU1vdmVkID0gZmFsc2U7CQotCQkJaWYgKHRUb3BQdDJNb3ZlZCkKLQkJCQl0VG9wUHQyTW92ZWQgPSBmYWxzZTsJCi0JCQlpZiAodEJvdFB0MU1vdmVkKQotCQkJCXRCb3RQdDFNb3ZlZCA9IGZhbHNlOwkKLQkJCWlmICh0Qm90UHQyTW92ZWQpCi0JCQkJdEJvdFB0Mk1vdmVkID0gZmFsc2U7Ci0JCQkKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9OwotCWV4YW1wbGUuY2FudmFzLmFkZE1vdXNlTW92ZUxpc3RlbmVyKG1vdXNlTW92ZUxpc3RlbmVyKTsKLQlleGFtcGxlLmNhbnZhcy5hZGRNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250KCksIDE2LCBTV1QuSVRBTElDKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCWdjLnNldExpbmVXaWR0aCgyKTsKLQkKLQlUcmFuc2Zvcm0gdHJhbnNmb3JtOwotCQotCS8vIC0tLS0tIGxldHRlciBzIC0tLS0tCQotCXNYUG9zID0gNCp3aWR0aC8xNjsKLQlzWVBvcyA9IChoZWlnaHQtMTUwKS8yOwotCQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHNYUG9zLCBzWVBvcyk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0JMVUUpKTsKLQlnYy5kcmF3U3RyaW5nKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3ViaWMiKSwgMCwgMTc1LCB0cnVlKTsKLQkKLQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguY3ViaWNUbygtMjAwICsgc0RpZmZYMSwgNTAgKyBzRGlmZlkxLCAyMDAgKyBzRGlmZlgyLCAxMDAgKyBzRGlmZlkyLCAwLCAxNTApOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQotCS8vIGRyYXcgdGhlIHNwbGluZSBwb2ludHMKLQlnYy5zZXRUcmFuc2Zvcm0obnVsbCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZShzUmVjdDEueCArIChpbnQpc1hQb3MsIHNSZWN0MS55ICsgKGludClzWVBvcywgc1JlY3QxLndpZHRoLCBzUmVjdDEuaGVpZ2h0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlKHNSZWN0Mi54ICsgKGludClzWFBvcywgc1JlY3QyLnkgKyAoaW50KXNZUG9zLCBzUmVjdDIud2lkdGgsIHNSZWN0Mi5oZWlnaHQpOwotCQotCS8vIC0tLS0tIGxldHRlciB3IC0tLS0tCi0Jd1hQb3MgPSA2KndpZHRoLzE2OwotCXdZUG9zID0gKGhlaWdodC0xNTApLzI7Ci0JCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUod1hQb3MsIHdZUG9zKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKSk7Ci0JZ2MuZHJhd1N0cmluZyhHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlF1YWRyYXRpYyIpLCAwLCAtNTAsIHRydWUpOwotCWdjLmRyYXdTdHJpbmcoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJRdWFkcmF0aWMiKSwgMTEwLCAtNTAsIHRydWUpOwotCQotCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGgucXVhZFRvKDEwMCArIHdEaWZmWDEsIDMwMCArIHdEaWZmWTEsIDEwMCwgMCk7Ci0JcGF0aC5xdWFkVG8oMTAwK3dEaWZmWDIsIDMwMCt3RGlmZlkyLCAyMDAsIDApOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQotCWdjLnNldFRyYW5zZm9ybShudWxsKTsJCi0JZ2MuZHJhd1JlY3RhbmdsZSh3UmVjdDEueCArIChpbnQpd1hQb3MsIHdSZWN0MS55ICsgKGludCl3WVBvcywgd1JlY3QxLndpZHRoLCB3UmVjdDEuaGVpZ2h0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlKHdSZWN0Mi54ICsgKGludCl3WFBvcywgd1JlY3QyLnkgKyAoaW50KXdZUG9zLCB3UmVjdDIud2lkdGgsIHdSZWN0Mi5oZWlnaHQpOwotCQotCQotCS8vIC0tLS0tIHRvcCBvZiBsZXR0ZXIgdCAtLS0tLQotCXRvcFRYUG9zID0gMTEqd2lkdGgvMTY7Ci0JdG9wVFlQb3MgPSAoaGVpZ2h0LTE1MCkvMjsKLQkKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSh0b3BUWFBvcywgdG9wVFlQb3MpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCWdjLmRyYXdTdHJpbmcoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdWJpYyIpLCAyNSwgLTUwLCB0cnVlKTsKLQkKLQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmN1YmljVG8oMzMgKyB0VG9wRGlmZlgxLCAtMjAgKyB0VG9wRGlmZlkxLCA2NiArIHRUb3BEaWZmWDIsIDIwICsgdFRvcERpZmZZMiwgMTAwLCAwKTsKLQlnYy5kcmF3UGF0aChwYXRoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLQotCWdjLnNldFRyYW5zZm9ybShudWxsKTsKLQlnYy5kcmF3UmVjdGFuZ2xlKHRUb3BSZWN0MS54ICsgKGludCl0b3BUWFBvcywgdFRvcFJlY3QxLnkgKyAoaW50KXRvcFRZUG9zLCB0VG9wUmVjdDEud2lkdGgsIHRUb3BSZWN0MS5oZWlnaHQpOwotCWdjLmRyYXdSZWN0YW5nbGUodFRvcFJlY3QyLnggKyAoaW50KXRvcFRYUG9zLCB0VG9wUmVjdDIueSArIChpbnQpdG9wVFlQb3MsIHRUb3BSZWN0Mi53aWR0aCwgdFRvcFJlY3QyLmhlaWdodCk7Ci0JCi0KLQkvLyAtLS0tLSB2ZXJ0aWNhbCBiYXIgb2YgbGV0dGVyIHQgLS0tLS0KLQlib3RUWFBvcyA9IDEyKndpZHRoLzE2OwotCWJvdFRZUG9zID0gKGhlaWdodC0xNTApLzI7Ci0KLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZShib3RUWFBvcywgYm90VFlQb3MpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCWdjLmRyYXdTdHJpbmcoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdWJpYyIpLCAwLCAxNzUsIHRydWUpOwotCQotCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguY3ViaWNUbygtMzMgKyB0Qm90RGlmZlgxLCA1MCArIHRCb3REaWZmWTEsIDMzICsgdEJvdERpZmZYMiwgMTAwICsgdEJvdERpZmZZMiwgMCwgMTUwKTsKLQlnYy5kcmF3UGF0aChwYXRoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLQkKLQlnYy5zZXRUcmFuc2Zvcm0obnVsbCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZSh0Qm90dG9tUmVjdDEueCArIChpbnQpYm90VFhQb3MsIHRCb3R0b21SZWN0MS55ICsgKGludClib3RUWVBvcywgdEJvdHRvbVJlY3QxLndpZHRoLCB0Qm90dG9tUmVjdDEuaGVpZ2h0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlKHRCb3R0b21SZWN0Mi54ICsgKGludClib3RUWFBvcywgdEJvdHRvbVJlY3QyLnkgKyAoaW50KWJvdFRZUG9zLCB0Qm90dG9tUmVjdDIud2lkdGgsIHRCb3R0b21SZWN0Mi5oZWlnaHQpOwotCi0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiBhIHZhbGlkIGZvbnQgZm9yIHRoZSByZXNpZGVudCBwbGF0Zm9ybS4KLSAqLwotc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybUZvbnQoKSB7Ci0JaWYoU1dULmdldFBsYXRmb3JtKCkgPT0gIndpbjMyIikgewotCQlyZXR1cm4gIkFyaWFsIjsJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAibW90aWYiKSB7Ci0JCXJldHVybiAiSGVsdmV0aWNhIjsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImd0ayIpIHsKLQkJcmV0dXJuICJCYWVrbXVrIEJhdGFuZyI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJjYXJib24iKSB7Ci0JCXJldHVybiAiQXJpYWwiOwotCX0gZWxzZSB7IC8vIHBob3RvbiwgZXRjIC4uLgotCQlyZXR1cm4gIlZlcmRhbmEiOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1cnZlc1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VydmVzVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODQxNTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VydmVzVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgcHJlc2VudHMgY3ViaWMgYW5kIHF1YWRyYXRpYyBjdXJ2ZXMgdGhhdCBjYW4gYmUgZHJhd24uCi0gKiBUaGUgdXNlciBtYXkgcmVwb3NpdGlvbiB0aGUgY3ViaWMgYW5kIHF1YWRyYXRpYyBoYW5kbGVzLiAKLSAqLwotcHVibGljIGNsYXNzIEN1cnZlc1RhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQkvKiogVGhlc2UgcmVjdGFuZ2xlcyByZXByZXNlbnQgdGhlIGhhbmRsZXMgb24gdGhlIGN1cnZlcy4gKi8KLQlwcml2YXRlIFJlY3RhbmdsZSBxdWFkSG5kbCwgcXVhZEVuZEhuZGwsIGN1YkhuZGwxLCBjdWJIbmRsMiwgY3ViRW5kSG5kbDsKLQkKLQkvKiogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgcG9zaXRpb25zIG9mIHRoZSBjdXJ2ZXMuICovCi0JcHJpdmF0ZSBmbG9hdCBxdWFkWFBvcywgcXVhZFlQb3MsIGN1YlhQb3MsIGN1YllQb3M7Ci0JCi0JLyoqIFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIHggYW5kIHkgZGlzcGxhY2VtZW50IG9mIGVhY2ggaGFuZGxlLiAqLwotCXByaXZhdGUgZmxvYXQgcXVhZERpZmZYLCBxdWFkRGlmZlksIHF1YWRFbmREaWZmWCwgcXVhZEVuZERpZmZZOwotCXByaXZhdGUgZmxvYXQgY3ViRGlmZlgxLCBjdWJEaWZmWTEsIGN1YkRpZmZYMiwgY3ViRGlmZlkyLCBjdWJFbmREaWZmWCwgY3ViRW5kRGlmZlk7Ci0JCi0JLyoqIFRoZXNlIGFyZSBmbGFncyB0aGF0IGluZGljYXRlIHdoZXRoZXIgb3Igbm90IGEgaGFuZGxlIGhhcyBiZWVuIG1vdmVkLiAqLwotCXByaXZhdGUgYm9vbGVhbiBxdWFkUHRNb3ZlZCwgcXVhZEVuZFB0TW92ZWQsIGN1YlB0MU1vdmVkLCBjdWJQdDJNb3ZlZCwgY3ViRW5kUHRNb3ZlZDsKLQotCXByaXZhdGUgTW91c2VNb3ZlTGlzdGVuZXIgbW91c2VNb3ZlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIG1vdXNlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBDdXJzb3IgY3Vyc29yOwotCi0JLyoqIHRydWUgaWYgaG92ZXJpbmcgb3ZlciBhIGhhbmRsZSwgZmFsc2Ugb3RoZXJ3aXNlICovCi0JcHJpdmF0ZSBib29sZWFuIGhvdmVyaW5nID0gZmFsc2U7Ci0JCi0JLyoqIHRydWUgaWYgbGVmdCBtb3VzZSBidXR0b24gaXMgaGVsZCBkb3duLCBmYWxzZSBvdGhlcndpc2UgKi8KLQlwcml2YXRlIGJvb2xlYW4gbW91c2VEb3duID0gZmFsc2U7Ci0KLQkKLXB1YmxpYyBDdXJ2ZXNUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLQlxdWFkSG5kbCA9IG5ldyBSZWN0YW5nbGUoMjAwLCAxNTAsIDUsIDUpOwotCXF1YWRFbmRIbmRsID0gbmV3IFJlY3RhbmdsZSg0MDAsIDAsIDUsIDUpOwotCXF1YWREaWZmWCA9IHF1YWREaWZmWSA9IHF1YWRFbmREaWZmWCA9IHF1YWRFbmREaWZmWSA9IDA7Ci0JY3ViSG5kbDEgPSBuZXcgUmVjdGFuZ2xlKDEzMywgLTYwLCA1LCA1KTsKLQljdWJIbmRsMiA9IG5ldyBSZWN0YW5nbGUoMjY2LCA2MCwgNSwgNSk7Ci0JY3ViRGlmZlgxID0gY3ViRGlmZlkxID0gY3ViRGlmZlgyID0gY3ViRGlmZlkyID0gMDsKLQljdWJFbmRIbmRsID0gbmV3IFJlY3RhbmdsZSg0MDAsIDAsIDUsIDUpOwotCWN1YkVuZERpZmZYID0gY3ViRW5kRGlmZlkgPSAwOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1cnZlcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXJ2ZXMiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1cnZlc0Rlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIGJvb2xlYW4gZ2V0RG91YmxlQnVmZmVyZWQoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1vdXNlTGlzdGVuZXIgIT0gbnVsbCkKLQkJZXhhbXBsZS5jYW52YXMucmVtb3ZlTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLQkKLQlpZiAobW91c2VNb3ZlTGlzdGVuZXIgIT0gbnVsbCkKLQkJZXhhbXBsZS5jYW52YXMucmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXIobW91c2VNb3ZlTGlzdGVuZXIpOwotCQotCWlmIChjdXJzb3IgIT0gbnVsbCkgewotCQljdXJzb3IuZGlzcG9zZSgpOwotCQljdXJzb3IgPSBudWxsOwotCX0KLX0KLQotLyoqCi0gKiBUaGlzIGhlbHBlciBtZXRob2QgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQKLSAqIG92ZXIgYSBoYW5kbGUuCi0gKiAKLSAqIEBwYXJhbSBlCi0gKiAgICAgICAgICAgIEEgTW91c2VFdmVudAotICogQHJldHVybiB0cnVlIGlmIGN1cnNvciBpcyBwb3NpdGlvbmVkIG92ZXIgYSBoYW5kbGU7IGZhbHNlIG90aGVyd2lzZQotICovCi1wcml2YXRlIGJvb2xlYW4gaXNIb3ZlcmluZyhNb3VzZUV2ZW50IGUpIHsKLQlSZWN0YW5nbGUgcXVhZCA9IG5ldyBSZWN0YW5nbGUocXVhZEhuZGwueCArIChpbnQpcXVhZFhQb3MgLSAxLCBxdWFkSG5kbC55ICsgKGludClxdWFkWVBvcyAtIDEsIHF1YWRIbmRsLndpZHRoKzIsIHF1YWRIbmRsLmhlaWdodCsyKTsKLQlSZWN0YW5nbGUgcXVhZEVuZCA9IG5ldyBSZWN0YW5nbGUocXVhZEVuZEhuZGwueCArIChpbnQpcXVhZFhQb3MgLSAxLCBxdWFkRW5kSG5kbC55ICsgKGludClxdWFkWVBvcyAtIDEsIHF1YWRFbmRIbmRsLndpZHRoKzIsIHF1YWRFbmRIbmRsLmhlaWdodCsyKTsKLQlSZWN0YW5nbGUgY3ViMSA9IG5ldyBSZWN0YW5nbGUoY3ViSG5kbDEueCArIChpbnQpY3ViWFBvcyAtIDEsIGN1YkhuZGwxLnkgKyAoaW50KWN1YllQb3MgLSAxLCBjdWJIbmRsMS53aWR0aCsyLCBjdWJIbmRsMS5oZWlnaHQrMik7Ci0JUmVjdGFuZ2xlIGN1YjIgPSBuZXcgUmVjdGFuZ2xlKGN1YkhuZGwyLnggKyAoaW50KWN1YlhQb3MgLSAxLCBjdWJIbmRsMi55ICsgKGludCljdWJZUG9zIC0gMSwgY3ViSG5kbDIud2lkdGgrMiwgY3ViSG5kbDIuaGVpZ2h0KzIpOwotCVJlY3RhbmdsZSBjdWJFbmQgPSBuZXcgUmVjdGFuZ2xlKGN1YkVuZEhuZGwueCArIChpbnQpY3ViWFBvcyAtIDEsIGN1YkVuZEhuZGwueSArIChpbnQpY3ViWVBvcyAtIDEsIGN1YkVuZEhuZGwud2lkdGgrMiwgY3ViRW5kSG5kbC5oZWlnaHQrMik7Ci0KLQlyZXR1cm4gKCBxdWFkLmNvbnRhaW5zKGUueCwgZS55KSB8fCBxdWFkRW5kLmNvbnRhaW5zKGUueCwgZS55KSAKLQkJIHx8IGN1YjEuY29udGFpbnMoZS54LCBlLnkpIHx8IGN1YjIuY29udGFpbnMoZS54LCBlLnkpIAotCQkgfHwgY3ViRW5kLmNvbnRhaW5zKGUueCwgZS55KSk7Ci19Ci0vKiogCi0gKiBDcmVhdGVzIHRoZSB3aWRnZXRzIHVzZWQgdG8gY29udHJvbCB0aGUgZHJhd2luZy4KLSAqLwotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlpZiAoY3Vyc29yID09IG51bGwpIHsgCi0JCWN1cnNvciA9IG5ldyBDdXJzb3IocGFyZW50LmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9IQU5EKTsKLQl9Ci0KLQltb3VzZU1vdmVMaXN0ZW5lciA9IG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJCi0JCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLQkJCWlmIChob3ZlcmluZyAmJiBtb3VzZURvd24pIHsKLQkJCQlleGFtcGxlLmNhbnZhcy5zZXRDdXJzb3IoY3Vyc29yKTsKLQkJCX0gZWxzZSBpZiAoaXNIb3ZlcmluZyhlKSkgewotCQkJCWV4YW1wbGUuY2FudmFzLnNldEN1cnNvcihjdXJzb3IpOwotCQkJCWhvdmVyaW5nID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXhhbXBsZS5jYW52YXMuc2V0Q3Vyc29yKG51bGwpOwotCQkJCWhvdmVyaW5nID0gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChxdWFkUHRNb3ZlZCkgewotCQkJCXF1YWREaWZmWCA9IHF1YWREaWZmWCArIGUueCAtIChpbnQpcXVhZFhQb3MgLSBxdWFkSG5kbC54OwotCQkJCXF1YWREaWZmWSA9IHF1YWREaWZmWSArIGUueSAtIChpbnQpcXVhZFlQb3MgLSBxdWFkSG5kbC55OwotCQkJCXF1YWRIbmRsLnggPSBlLnggLSAoaW50KXF1YWRYUG9zOwotCQkJCXF1YWRIbmRsLnkgPSBlLnkgLSAoaW50KXF1YWRZUG9zOwkJCQkKLQkJCX0gZWxzZSBpZiAocXVhZEVuZFB0TW92ZWQpIHsKLQkJCQlxdWFkRW5kRGlmZlggPSBxdWFkRW5kRGlmZlggKyBlLnggLSAoaW50KXF1YWRYUG9zIC0gcXVhZEVuZEhuZGwueDsKLQkJCQlxdWFkRW5kRGlmZlkgPSBxdWFkRW5kRGlmZlkgKyBlLnkgLSAoaW50KXF1YWRZUG9zIC0gcXVhZEVuZEhuZGwueTsKLQkJCQlxdWFkRW5kSG5kbC54ID0gZS54IC0gKGludClxdWFkWFBvczsKLQkJCQlxdWFkRW5kSG5kbC55ID0gZS55IC0gKGludClxdWFkWVBvczsJCi0JCQl9IGVsc2UgaWYgKGN1YlB0MU1vdmVkKSB7Ci0JCQkJY3ViRGlmZlgxID0gY3ViRGlmZlgxICsgZS54IC0gKGludCljdWJYUG9zIC0gY3ViSG5kbDEueDsKLQkJCQljdWJEaWZmWTEgPSBjdWJEaWZmWTEgKyBlLnkgLSAoaW50KWN1YllQb3MgLSBjdWJIbmRsMS55OwotCQkJCWN1YkhuZGwxLnggPSBlLnggLSAoaW50KWN1YlhQb3M7Ci0JCQkJY3ViSG5kbDEueSA9IGUueSAtIChpbnQpY3ViWVBvczsJCi0JCQl9IGVsc2UgaWYgKGN1YlB0Mk1vdmVkKSB7Ci0JCQkJY3ViRGlmZlgyID0gY3ViRGlmZlgyICsgZS54IC0gKGludCljdWJYUG9zIC0gY3ViSG5kbDIueDsKLQkJCQljdWJEaWZmWTIgPSBjdWJEaWZmWTIgKyBlLnkgLSAoaW50KWN1YllQb3MgLSBjdWJIbmRsMi55OwotCQkJCWN1YkhuZGwyLnggPSBlLnggLSAoaW50KWN1YlhQb3M7Ci0JCQkJY3ViSG5kbDIueSA9IGUueSAtIChpbnQpY3ViWVBvczsKLQkJCX0gZWxzZSBpZiAoY3ViRW5kUHRNb3ZlZCkgewotCQkJCWN1YkVuZERpZmZYID0gY3ViRW5kRGlmZlggKyBlLnggLSAoaW50KWN1YlhQb3MgLSBjdWJFbmRIbmRsLng7Ci0JCQkJY3ViRW5kRGlmZlkgPSBjdWJFbmREaWZmWSArIGUueSAtIChpbnQpY3ViWVBvcyAtIGN1YkVuZEhuZGwueTsKLQkJCQljdWJFbmRIbmRsLnggPSBlLnggLSAoaW50KWN1YlhQb3M7Ci0JCQkJY3ViRW5kSG5kbC55ID0gZS55IC0gKGludCljdWJZUG9zOwotCQkJfQotCQkJZXhhbXBsZS5yZWRyYXcoKTsJCQkKLQkJfQotCX07Ci0JCi0JbW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7fQotCi0JCS8qKgotCQkgKiBTZW50IHdoZW4gYSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZC4KLQkJICoKLQkJICogQHBhcmFtIGUgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW91c2UgYnV0dG9uIHByZXNzCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7ICAKLQkJCVJlY3RhbmdsZSBxdWFkID0gbmV3IFJlY3RhbmdsZShxdWFkSG5kbC54ICsgKGludClxdWFkWFBvcyAtIDEsIHF1YWRIbmRsLnkgKyAoaW50KXF1YWRZUG9zIC0gMSwgcXVhZEhuZGwud2lkdGgrMiwgcXVhZEhuZGwuaGVpZ2h0KzIpOwotCQkJUmVjdGFuZ2xlIHF1YWRFbmQgPSBuZXcgUmVjdGFuZ2xlKHF1YWRFbmRIbmRsLnggKyAoaW50KXF1YWRYUG9zIC0gMSwgcXVhZEVuZEhuZGwueSArIChpbnQpcXVhZFlQb3MgLSAxLCBxdWFkRW5kSG5kbC53aWR0aCsyLCBxdWFkRW5kSG5kbC5oZWlnaHQrMik7Ci0JCQlSZWN0YW5nbGUgY3ViMSA9IG5ldyBSZWN0YW5nbGUoY3ViSG5kbDEueCArIChpbnQpY3ViWFBvcyAtIDEsIGN1YkhuZGwxLnkgKyAoaW50KWN1YllQb3MgLSAxLCBjdWJIbmRsMS53aWR0aCsyLCBjdWJIbmRsMS5oZWlnaHQrMik7Ci0JCQlSZWN0YW5nbGUgY3ViMiA9IG5ldyBSZWN0YW5nbGUoY3ViSG5kbDIueCArIChpbnQpY3ViWFBvcyAtIDEsIGN1YkhuZGwyLnkgKyAoaW50KWN1YllQb3MgLSAxLCBjdWJIbmRsMi53aWR0aCsyLCBjdWJIbmRsMi5oZWlnaHQrMik7Ci0JCQlSZWN0YW5nbGUgY3ViRW5kID0gbmV3IFJlY3RhbmdsZShjdWJFbmRIbmRsLnggKyAoaW50KWN1YlhQb3MgLSAxLCBjdWJFbmRIbmRsLnkgKyAoaW50KWN1YllQb3MgLSAxLCBjdWJFbmRIbmRsLndpZHRoKzIsIGN1YkVuZEhuZGwuaGVpZ2h0KzIpOwotCQkJCi0JCQlpZiAocXVhZC5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQlxdWFkUHRNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAocXVhZEVuZC5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQlxdWFkRW5kUHRNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoY3ViMS5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQljdWJQdDFNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoY3ViMi5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQljdWJQdDJNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoY3ViRW5kLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCWN1YkVuZFB0TW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU2VudCB3aGVuIGEgbW91c2UgYnV0dG9uIGlzIHJlbGVhc2VkLgotCQkgKgotCQkgKiBAcGFyYW0gZSBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb3VzZSBidXR0b24gcmVsZWFzZQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCW1vdXNlRG93biA9IGZhbHNlOwotCQkJaWYgKGlzSG92ZXJpbmcoZSkpIHsKLQkJCQlleGFtcGxlLmNhbnZhcy5zZXRDdXJzb3IoY3Vyc29yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXhhbXBsZS5jYW52YXMuc2V0Q3Vyc29yKG51bGwpOwotCQkJfQotCi0JCQlpZiAocXVhZFB0TW92ZWQpCi0JCQkJcXVhZFB0TW92ZWQgPSBmYWxzZTsKLQkJCWlmIChxdWFkRW5kUHRNb3ZlZCkKLQkJCQlxdWFkRW5kUHRNb3ZlZCA9IGZhbHNlOwotCQkJaWYgKGN1YlB0MU1vdmVkKQotCQkJCWN1YlB0MU1vdmVkID0gZmFsc2U7CQotCQkJaWYgKGN1YlB0Mk1vdmVkKQotCQkJCWN1YlB0Mk1vdmVkID0gZmFsc2U7Ci0JCQlpZiAoY3ViRW5kUHRNb3ZlZCkKLQkJCQljdWJFbmRQdE1vdmVkID0gZmFsc2U7Ci0JCQkKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9OwotCWV4YW1wbGUuY2FudmFzLmFkZE1vdXNlTW92ZUxpc3RlbmVyKG1vdXNlTW92ZUxpc3RlbmVyKTsKLQlleGFtcGxlLmNhbnZhcy5hZGRNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250KCksIDE2LCBTV1QuSVRBTElDKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCWdjLnNldExpbmVXaWR0aCg1KTsKLQkKLQlUcmFuc2Zvcm0gdHJhbnNmb3JtOwotCi0JLy8gLS0tLS0gY3ViaWMgY3VydmUgLS0tLS0KLQljdWJYUG9zID0gd2lkdGgvNTsKLQljdWJZUG9zID0gaGVpZ2h0LzM7Ci0JCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoY3ViWFBvcywgY3ViWVBvcyk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZHJhd1N0cmluZyhHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1YmljIiksIDI1LCAtNzAsIHRydWUpOwotCQotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5jdWJpY1RvKDEzMyArIGN1YkRpZmZYMSwgLTYwICsgY3ViRGlmZlkxLCAyNjYgKyBjdWJEaWZmWDIsIDYwICsgY3ViRGlmZlkyLCA0MDAgKyBjdWJFbmREaWZmWCwgMCArIGN1YkVuZERpZmZZKTsKLQlnYy5kcmF3UGF0aChwYXRoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLQotCWdjLnNldFRyYW5zZm9ybShudWxsKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19CTFVFKSk7Ci0JZ2MuZHJhd1JlY3RhbmdsZShjdWJIbmRsMS54ICsgKGludCljdWJYUG9zLCBjdWJIbmRsMS55ICsgKGludCljdWJZUG9zLCBjdWJIbmRsMS53aWR0aCwgY3ViSG5kbDEuaGVpZ2h0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlKGN1YkhuZGwyLnggKyAoaW50KWN1YlhQb3MsIGN1YkhuZGwyLnkgKyAoaW50KWN1YllQb3MsIGN1YkhuZGwyLndpZHRoLCBjdWJIbmRsMi5oZWlnaHQpOwotCWdjLmRyYXdSZWN0YW5nbGUoY3ViRW5kSG5kbC54ICsgKGludCljdWJYUG9zLCBjdWJFbmRIbmRsLnkgKyAoaW50KWN1YllQb3MsIGN1YkVuZEhuZGwud2lkdGgsIGN1YkVuZEhuZGwuaGVpZ2h0KTsKLQkKLQkvLyAtLS0tLSBxdWFkcmF0aWMgY3VydmUgLS0tLS0KLQlxdWFkWFBvcyA9IHdpZHRoLzU7Ci0JcXVhZFlQb3MgPSAyKmhlaWdodC8zOwotCQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHF1YWRYUG9zLCBxdWFkWVBvcyk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQlnYy5kcmF3U3RyaW5nKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUXVhZHJhdGljIiksIDAsIC01MCwgdHJ1ZSk7Ci0JCi0JcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5xdWFkVG8oMjAwICsgcXVhZERpZmZYLCAxNTAgKyBxdWFkRGlmZlksIDQwMCArIHF1YWRFbmREaWZmWCwgMCArIHF1YWRFbmREaWZmWSk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JCi0JZ2Muc2V0VHJhbnNmb3JtKG51bGwpOwotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKSk7Ci0JZ2MuZHJhd1JlY3RhbmdsZShxdWFkSG5kbC54ICsgKGludClxdWFkWFBvcywgcXVhZEhuZGwueSArIChpbnQpcXVhZFlQb3MsIHF1YWRIbmRsLndpZHRoLCBxdWFkSG5kbC5oZWlnaHQpOwotCWdjLmRyYXdSZWN0YW5nbGUocXVhZEVuZEhuZGwueCArIChpbnQpcXVhZFhQb3MsIHF1YWRFbmRIbmRsLnkgKyAoaW50KXF1YWRZUG9zLCBxdWFkRW5kSG5kbC53aWR0aCwgcXVhZEVuZEhuZGwuaGVpZ2h0KTsKLQotCWZvbnQuZGlzcG9zZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSB2YWxpZCBmb250IGZvciB0aGUgcmVzaWRlbnQgcGxhdGZvcm0uCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250KCkgewotCWlmKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3aW4zMiIpIHsKLQkJcmV0dXJuICJBcmlhbCI7CQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQlyZXR1cm4gIkhlbHZldGljYSI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJndGsiKSB7Ci0JCXJldHVybiAiQmFla211ayBCYXRhbmciOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQlyZXR1cm4gIkFyaWFsIjsKLQl9IGVsc2UgeyAvLyBwaG90b24sIGV0YyAuLi4KLQkJcmV0dXJuICJWZXJkYW5hIjsKLQl9Ci19Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VzdG9tQWxwaGFUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1c3RvbUFscGhhVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NmZjNWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VzdG9tQWxwaGFUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBhbHBoYSBibGVuZGluZy4gSXQgYWxsb3dzIGEgdXNlciB0byBzcGVjaWZ5Ci0gKiBhIGN1c3RvbSBhbHBoYSB2YWx1ZS4KLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUFscGhhVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JCi0JcHJpdmF0ZSBTcGlubmVyIGFscGhhU3Bpbm5lcjsKLQlwcml2YXRlIEJ1dHRvbiBjb2xvckJ1dHRvbjsKLQlwcml2YXRlIEdyYXBoaWNzQmFja2dyb3VuZCBiYWNrZ3JvdW5kOwotCXByaXZhdGUgTWVudSBtZW51OwotCXByaXZhdGUgaW50IGFuZ2xlOwotCi1wdWJsaWMgQ3VzdG9tQWxwaGFUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbHBoYSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXN0b21BbHBoYSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tQWxwaGFEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1lbnUgIT0gbnVsbCkgewotCQltZW51LmRpc3Bvc2UoKTsKLQkJbWVudSA9IG51bGw7Ci0JfQotfQotCi0vKiogCi0gKiBDcmVhdGVzIHRoZSB3aWRnZXRzIHVzZWQgdG8gY29udHJvbCB0aGUgZHJhd2luZy4KLSAqLwotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlzdXBlci5jcmVhdGVDb250cm9sUGFuZWwocGFyZW50KTsKLQkKLQkvLyBjcmVhdGUgZHJvcCBkb3duIGNvbWJvIGZvciBjaG9vc2luZyBjbGlwcGluZwotCUNvbXBvc2l0ZSBjb21wOwotCQotCS8vIGNyZWF0ZSBzcGlubmVyIGZvciBsaW5lIHdpZHRoCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkFscGhhIikpOyAvLyROT04tTkxTLTEkCi0JYWxwaGFTcGlubmVyID0gbmV3IFNwaW5uZXIoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlhbHBoYVNwaW5uZXIuc2V0TWluaW11bSgwKTsKLQlhbHBoYVNwaW5uZXIuc2V0TWF4aW11bSgyNTUpOwotCWFscGhhU3Bpbm5lci5zZXRTZWxlY3Rpb24oMTI3KTsKLQlhbHBoYVNwaW5uZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjb2xvciBtZW51Ci0JQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCWNtLnNldFBhdHRlcm5JdGVtcyhleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKTsKLQltZW51ID0gY20uY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCWJhY2tncm91bmQgPSBnYjsJCQotCQkJY29sb3JCdXR0b24uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCi0JLy8gaW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB0byB0aGUgNXRoIGl0ZW0gaW4gdGhlIG1lbnUgKGJsdWUpCi0JYmFja2dyb3VuZCA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudS5nZXRJdGVtKDQpLmdldERhdGEoKTsKLQkKLQkvLyBjb2xvciBidXR0b24KLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCWNvbG9yQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JY29sb3JCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbi5zZXRJbWFnZShiYWNrZ3JvdW5kLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotfQotCi1wdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQotCWFuZ2xlID0gKGFuZ2xlKzEpJTM2MDsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQotCVBhdHRlcm4gcGF0dGVybiA9IG51bGw7Ci0JaWYgKGJhY2tncm91bmQuZ2V0QmdDb2xvcjEoKSAhPSBudWxsKSB7Ci0JCWdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpKTsKLQl9IGVsc2UgaWYgKGJhY2tncm91bmQuZ2V0QmdJbWFnZSgpICE9IG51bGwpIHsKLQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgYmFja2dyb3VuZC5nZXRCZ0ltYWdlKCkpOwotCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQl9Ci0JCi0JZ2Muc2V0QW50aWFsaWFzKFNXVC5PTik7Ci0JZ2Muc2V0QWxwaGEoYWxwaGFTcGlubmVyLmdldFNlbGVjdGlvbigpKTsKLQkKLQkvLyByb3RhdGUgb24gY2VudGVyCi0JVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdpZHRoLzIsIGhlaWdodC8yKTsKLQl0cmFuc2Zvcm0ucm90YXRlKC1hbmdsZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgtd2lkdGgvMiwgLWhlaWdodC8yKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCS8vIGNob29zZSB0aGUgc21hbGxlc3QgYmV0d2VlbiBoZWlnaHQgYW5kIHdpZHRoCi0JaW50IGRpYW1ldGVyID0gKGhlaWdodCA8IHdpZHRoKSA/IGhlaWdodCA6IHdpZHRoOwotCQotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5hZGRBcmMoKHdpZHRoLWRpYW1ldGVyLzUpLzIsIChoZWlnaHQtZGlhbWV0ZXIvNSkvMiwgZGlhbWV0ZXIvNSwgZGlhbWV0ZXIvNSwgMCwgMzYwKTsKLQlwYXRoLmFkZEFyYyg1Kih3aWR0aC1kaWFtZXRlci84KS8xMiwgNCooaGVpZ2h0LWRpYW1ldGVyLzgpLzEyLCBkaWFtZXRlci84LCBkaWFtZXRlci84LCAwLCAzNjApOwotCXBhdGguYWRkQXJjKDcqKHdpZHRoLWRpYW1ldGVyLzgpLzEyLCA4KihoZWlnaHQtZGlhbWV0ZXIvOCkvMTIsIGRpYW1ldGVyLzgsIGRpYW1ldGVyLzgsIDAsIDM2MCk7Ci0JcGF0aC5hZGRBcmMoNiood2lkdGgtZGlhbWV0ZXIvMTIpLzEyLCAzKihoZWlnaHQtZGlhbWV0ZXIvMTIpLzEyLCBkaWFtZXRlci8xMiwgZGlhbWV0ZXIvMTIsIDAsIDM2MCk7Ci0JcGF0aC5hZGRBcmMoNiood2lkdGgtZGlhbWV0ZXIvMTIpLzEyLCA5KihoZWlnaHQtZGlhbWV0ZXIvMTIpLzEyLCBkaWFtZXRlci8xMiwgZGlhbWV0ZXIvMTIsIDAsIDM2MCk7Ci0JcGF0aC5hZGRBcmMoMTEuNWYqKHdpZHRoLWRpYW1ldGVyLzE4KS8yMCwgNSooaGVpZ2h0LWRpYW1ldGVyLzE4KS8xOCwgZGlhbWV0ZXIvMTgsIGRpYW1ldGVyLzE4LCAwLCAzNjApOwkKLQlwYXRoLmFkZEFyYyg4LjVmKih3aWR0aC1kaWFtZXRlci8xOCkvMjAsIDEzKihoZWlnaHQtZGlhbWV0ZXIvMTgpLzE4LCBkaWFtZXRlci8xOCwgZGlhbWV0ZXIvMTgsIDAsIDM2MCk7Ci0JcGF0aC5hZGRBcmMoNjJmKih3aWR0aC1kaWFtZXRlci8yNSkvMTAwLCAzMiooaGVpZ2h0LWRpYW1ldGVyLzI1KS8xMDAsIGRpYW1ldGVyLzI1LCBkaWFtZXRlci8yNSwgMCwgMzYwKTsKLQlwYXRoLmFkZEFyYygzOWYqKHdpZHRoLWRpYW1ldGVyLzI1KS8xMDAsIDY3KihoZWlnaHQtZGlhbWV0ZXIvMjUpLzEwMCwgZGlhbWV0ZXIvMjUsIGRpYW1ldGVyLzI1LCAwLCAzNjApOwotCQkKLQlnYy5maWxsUGF0aChwYXRoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLQkJCQotICAgIGlmIChwYXR0ZXJuICE9IG51bGwpIHBhdHRlcm4uZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VzdG9tRm9udFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VzdG9tRm9udFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjhkMjgzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1c3RvbUZvbnRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRlbW9uc3RyYXRlcyB2YXJpb3VzIHRleHQgZm9udHMuIEl0IGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IGZvbnQKLSAqIHBhcmFtZXRlcnMgc3VjaCBhcyBmYWNlLCBzdHlsZSBhbmQgc2l6ZS4KLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUZvbnRUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0KLQlTdHJpbmcgdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU1dUIik7Ci0JR3JhcGhpY3NCYWNrZ3JvdW5kIGZvbnRGb3JlZ3JvdW5kOwotCUNvbWJvIGZvbnRGYWNlQ2IsIGZvbnRTdHlsZUNiOwotCVNwaW5uZXIgZm9udFBvaW50U3Bpbm5lcjsKLQlCdXR0b24gY29sb3JCdXR0b247Ci0JQXJyYXlMaXN0IGZvbnROYW1lczsKLQlpbnQgW10gc3R5bGVWYWx1ZXM7Ci0JU3RyaW5nIFtdIGZvbnRTdHlsZXM7Ci0JTWVudSBtZW51OwotCQotcHVibGljIEN1c3RvbUZvbnRUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLQkKLQkvLyBjcmVhdGUgbGlzdCBvZiBmb250cyBmb3IgdGhpcyBwbGF0Zm9ybQotCUZvbnREYXRhIFtdIGZvbnREYXRhID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Rm9udExpc3QobnVsbCwgdHJ1ZSk7Ci0JZm9udE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCWZvciAoaW50IGk9MDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCS8vIHJlbW92ZSBkdXBsaWNhdGVzIGFuZCBzb3J0Ci0JCVN0cmluZyBuZXh0TmFtZSA9IGZvbnREYXRhW2ldLmdldE5hbWUoKTsKLQkJaWYgKCFmb250TmFtZXMuY29udGFpbnMobmV4dE5hbWUpKSB7Ci0JCQlpbnQgaiA9IDA7Ci0JCQl3aGlsZShqIDwgZm9udE5hbWVzLnNpemUoKSAmJiBuZXh0TmFtZS5jb21wYXJlVG8oKFN0cmluZylmb250TmFtZXMuZ2V0KGopKSA+IDApIHsKLQkJCQlqKys7Ci0JCQl9Ci0JCQlmb250TmFtZXMuYWRkKGosIG5leHROYW1lKTsKLQkJfQotCX0KLQlmb250U3R5bGVzID0gbmV3IFN0cmluZyBbXSB7Ci0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZ3VsYXIiKSwgLy8kTk9OLU5MUy0xJAotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJdGFsaWMiKSwgLy8kTk9OLU5MUy0xJAotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCb2xkIiksIC8vJE5PTi1OTFMtMSQKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQm9sZEl0YWxpYyIpIC8vJE5PTi1OTFMtMSQKLQl9OwotCXN0eWxlVmFsdWVzID0gbmV3IGludCBbXSB7U1dULk5PUk1BTCwgU1dULklUQUxJQywgU1dULkJPTEQsIFNXVC5CT0xEIHwgU1dULklUQUxJQ307Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udCIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXN0b21Gb250Iik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXN0b21Gb250RGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLQotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCUNvbXBvc2l0ZSBtYWluQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JbWFpbkNvbXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCi0JLy8gY3JlYXRlIGNvbWJvIGZvciBmb250IGZhY2UKLQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXAsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCW5ldyBMYWJlbChjb21wLCBTV1QuTEVGVCkuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnRGYWNlIikpOyAvLyROT04tTkxTLTEkCi0JZm9udEZhY2VDYiA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOKTsKLQlmb3IgKGludCBpPTA7IGkgPCBmb250TmFtZXMuc2l6ZSgpOyBpKyspIHsKLQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWZvbnROYW1lcy5nZXQoaSk7Ci0JCWZvbnRGYWNlQ2IuYWRkKG5hbWUpOwotCX0KLQlmb250RmFjZUNiLnNlbGVjdCgwKTsKLQlmb250RmFjZUNiLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gY3JlYXRlIGNvbWJvIGZvciBmb250IHN0eWxlCi0JY29tcCA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXAsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCW5ldyBMYWJlbChjb21wLCBTV1QuTEVGVCkuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnRTdHlsZSIpKTsgLy8kTk9OLU5MUy0xJAotCWZvbnRTdHlsZUNiID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCWZvciAoaW50IGk9MDsgaSA8IGZvbnRTdHlsZXMubGVuZ3RoOyBpKyspIHsKLQkJZm9udFN0eWxlQ2IuYWRkKGZvbnRTdHlsZXNbaV0pOwotCX0KLQlmb250U3R5bGVDYi5zZWxlY3QoMCk7Ci0JZm9udFN0eWxlQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjcmVhdGUgc3Bpbm5lciBmb3IgZm9udCBzaXplIChwb2ludHMpCi0JY29tcCA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXAsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCW5ldyBMYWJlbChjb21wLCBTV1QuTEVGVCkuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnRTaXplIikpOyAvLyROT04tTkxTLTEkCi0JZm9udFBvaW50U3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JZm9udFBvaW50U3Bpbm5lci5zZXRNaW5pbXVtKDEpOwotCWZvbnRQb2ludFNwaW5uZXIuc2V0TWF4aW11bSgxMDAwKTsKLQlmb250UG9pbnRTcGlubmVyLnNldFNlbGVjdGlvbigyMDApOwotCWZvbnRQb2ludFNwaW5uZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCUNvbG9yTWVudSBjbSA9IG5ldyBDb2xvck1lbnUoKTsKLQljbS5zZXRDb2xvckl0ZW1zKHRydWUpOwotCWNtLnNldFBhdHRlcm5JdGVtcyhleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKTsKLQltZW51ID0gY20uY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCWZvbnRGb3JlZ3JvdW5kID0gZ2I7Ci0JCQljb2xvckJ1dHRvbi5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gaW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB0byB0aGUgMm5kIGl0ZW0gaW4gdGhlIG1lbnUgKGJsYWNrKQotCWZvbnRGb3JlZ3JvdW5kID0gKEdyYXBoaWNzQmFja2dyb3VuZCltZW51LmdldEl0ZW0oMSkuZ2V0RGF0YSgpOwotCQotCS8vIGNyZWF0ZSBjb2xvciBidXR0b24KLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbi5zZXRJbWFnZShmb250Rm9yZWdyb3VuZC5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQlTdHJpbmcgZm9udEZhY2UgPSAoU3RyaW5nKWZvbnROYW1lcy5nZXQoZm9udEZhY2VDYi5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQlpbnQgcG9pbnRzID0gZm9udFBvaW50U3Bpbm5lci5nZXRTZWxlY3Rpb24oKTsKLQlpbnQgc3R5bGUgPSBzdHlsZVZhbHVlc1tmb250U3R5bGVDYi5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLQkKLQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGZvbnRGYWNlLCBwb2ludHMsIHN0eWxlKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCWdjLnNldFRleHRBbnRpYWxpYXMoU1dULk9OKTsKLQotCVBvaW50IHNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JaW50IHRleHRXaWR0aCA9IHNpemUueDsKLQlpbnQgdGV4dEhlaWdodCA9IHNpemUueTsKLQotCVBhdHRlcm4gcGF0dGVybiA9IG51bGw7Ci0JaWYgKGZvbnRGb3JlZ3JvdW5kLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKGZvbnRGb3JlZ3JvdW5kLmdldEJnQ29sb3IxKCkpOwotCX0gZWxzZSBpZiAoZm9udEZvcmVncm91bmQuZ2V0QmdJbWFnZSgpICE9IG51bGwpIHsKLQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgZm9udEZvcmVncm91bmQuZ2V0QmdJbWFnZSgpKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JfQotCQotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXRleHRXaWR0aCkvMiwgKGhlaWdodC10ZXh0SGVpZ2h0KS8yLCB0cnVlKTsKLQotCWZvbnQuZGlzcG9zZSgpOwotCWlmIChwYXR0ZXJuICE9IG51bGwpIHBhdHRlcm4uZGlzcG9zZSgpOwkKLX0KLQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Gb250Qm91bmNlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Gb250Qm91bmNlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NDE4Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvRm9udEJvdW5jZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGlzIGFuIGFuaW1hdGVkIGdyYXBoaWMuIEl0IHByZXNlbnRzIHRoZSB3b3JkIFNXVCBpbiBkaWZmZXJlbnQgZm9udHMKLSAqIGFzIGl0IGJvdW5jZXMgYXJvdW5kIHRoZSBzY3JlZW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250Qm91bmNlVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JCi0JZmxvYXQgeCwgeTsKLQlmbG9hdCBpbmNYID0gMTAuMGY7CQkJCS8vIHVuaXRzIGJ5IHdoaWNoIHRvIG1vdmUgdGhlIHdvcmQgYWxvbmcgWCBheGlzCi0JZmxvYXQgaW5jWSA9IDUuMGY7CQkJCS8vIHVuaXRzIGJ5IHdoaWNoIHRvIG1vdmUgdGhlIHdvcmQgYWxvbmcgWSBheGlzIAotCWludCB0ZXh0V2lkdGgsIHRleHRIZWlnaHQ7CQkvLyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSB3b3JkIFNXVAotCVN0cmluZyB0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTV1QiKTsKLQlpbnQgZm9udFNpemUgPSAxMDA7Ci0JaW50IGZvbnRGYWNlID0gMDsgCi0JaW50IGZvcmVHcmRDb2xvciwgZmlsbENvbG9yOwkvLyBmb250IGNvbG9ycwotCWludCBmb250U3R5bGU7CQkJCS8vIHJlcHJlc2VudHMgdmFyaW91cyBzdHlsZSBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgdG8gYSBGb250Ci0JCi1wdWJsaWMgRm9udEJvdW5jZVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnQiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQm91bmNlIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250Qm91bmNlRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5BbmltYXRlZEdyYXBoaWNzVGFiI25leHQoaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JeCArPSBpbmNYOwotICAgIHkgKz0gaW5jWTsKLQlmbG9hdCByYW5kb20gPSAoZmxvYXQpTWF0aC5yYW5kb20oKTsKLQkKLQkvLyBjb2xsaXNpb24gd2l0aCByaWdodCBzaWRlIG9mIHNjcmVlbiAKLSAgICBpZiAoeCArIHRleHRXaWR0aCA+IHdpZHRoKSB7Ci0gICAgICAgIHggPSB3aWR0aCAtIHRleHRXaWR0aDsKLSAgICAgICAgaW5jWCA9IHJhbmRvbSAqIC13aWR0aCAvIDE2IC0gMTsKLSAgICAgICAgZm9udEZhY2UgPSAwOwotICAgICAgICBmb250U2l6ZSA9IDEyNTsKLSAgICAgICAgZmlsbENvbG9yID0gU1dULkNPTE9SX0RBUktfQkxVRTsgIAotICAgICAgICBmb3JlR3JkQ29sb3IgPSBTV1QuQ09MT1JfWUVMTE9XOwotICAgICAgICBmb250U3R5bGUgPSBTV1QuSVRBTElDOwotICAgIH0KLQkvLyBjb2xsaXNpb24gd2l0aCBsZWZ0IHNpZGUgb2Ygc2NyZWVuCi0gICAgaWYgKHggPCAwKSB7Ci0gICAgICAgIHggPSAwOwotICAgICAgICBpbmNYID0gcmFuZG9tICogd2lkdGggLyAxNiArIDE7Ci0gICAgICAgIGZvbnRGYWNlID0gMTsKLSAgICAgICAgZm9udFNpemUgPSA4MDsKLSAgICAgICAgZmlsbENvbG9yID0gU1dULkNPTE9SX0RBUktfTUFHRU5UQTsKLSAgICAgICAgZm9yZUdyZENvbG9yID0gU1dULkNPTE9SX0NZQU47Ci0gICAgICAgIGZvbnRTdHlsZSA9IFNXVC5OT05FOwotICAgIH0KLQkvLyBjb2xsaXNpb24gd2l0aCBib3R0b20gc2lkZSBvZiBzY3JlZW4KLSAgICBpZiAoeSArIHRleHRIZWlnaHQgPiBoZWlnaHQpIHsKLSAgICAgICAgeSA9IChoZWlnaHQgLSB0ZXh0SGVpZ2h0KS0gMjsKLSAgICAgICAgaW5jWSA9IHJhbmRvbSAqIC1oZWlnaHQgLyAxNiAtIDE7Ci0gICAgICAgIGZvbnRGYWNlID0gMjsKLSAgICAgICAgZm9udFNpemUgPSAxMDA7Ci0gICAgICAgIGZpbGxDb2xvciA9IFNXVC5DT0xPUl9ZRUxMT1c7Ci0gICAgICAgIGZvcmVHcmRDb2xvciA9IFNXVC5DT0xPUl9CTEFDSzsKLSAgICAgICAgZm9udFN0eWxlID0gU1dULkJPTEQ7Ci0gICAgfQotCS8vIGNvbGxpc2lvbiB3aXRoIHRvcCBzaWRlIG9mIHNjcmVlbgotICAgIGlmICh5IDwgMCkgewotICAgICAgICB5ID0gMDsKLSAgICAgICAgaW5jWSA9IHJhbmRvbSAqIGhlaWdodCAvIDE2ICsgMTsKLSAgICAgICAgZm9udEZhY2UgPSAzOwotICAgICAgICBmb250U2l6ZSA9IDEyMDsKLSAgICAgICAgZmlsbENvbG9yID0gU1dULkNPTE9SX0dSRUVOOwotICAgICAgICBmb3JlR3JkQ29sb3IgPSBTV1QuQ09MT1JfR1JBWTsKLSAgICAgICAgZm9udFN0eWxlID0gU1dULk5PTkU7Ci0gICAgfQotfQotCi0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JRm9udCBmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBnZXRQbGF0Zm9ybUZvbnRGYWNlKGZvbnRGYWNlKSwgZm9udFNpemUsIGZvbnRTdHlsZSk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQkKLQlQb2ludCBzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCXRleHRXaWR0aCA9IHNpemUueDsKLQl0ZXh0SGVpZ2h0ID0gc2l6ZS55OwotCQotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5hZGRTdHJpbmcodGV4dCwgeCwgeSwgZm9udCk7Ci0KLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihmb3JlR3JkQ29sb3IpKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihmaWxsQ29sb3IpKTsKLQotCWdjLmZpbGxQYXRoKHBhdGgpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCWZvbnQuZGlzcG9zZSgpOwotCXBhdGguZGlzcG9zZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZvbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAqIFRoaXMgbWV0aG9kIHRha2VzIGludG8gYWNjb3VudCB0aGUgcmVzaWRlbnQgcGxhdGZvcm0uCi0gKiAKLSAqIEBwYXJhbSBpbmRleAotICogCQkJVGhlIGluZGV4IG9mIHRoZSBmb250IHRvIGJlIHVzZWQKLSAqLwotc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybUZvbnRGYWNlKGludCBpbmRleCkgewkKLQlpZihTV1QuZ2V0UGxhdGZvcm0oKSA9PSAid2luMzIiKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiQXJpYWwiLCAiSW1wYWN0IiwgIlRpbWVzIiwgIlZlcmRhbmEifSBbaW5kZXhdOwkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJtb3RpZiIpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyJVUlcgQ2hhbmNlcnkgTCIsICJVUlcgR290aGljIEwiLCAiVGltZXMiLCAicXViIn0gW2luZGV4XTsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImd0ayIpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyJVUlcgQ2hhbmNlcnkgTCIsICJCYWVrbXVrIEJhdGFuZyIsICJCYWVrbXVrIEhlYWRsaW5lIiwgIkthY3NUaXRsZUwifSBbaW5kZXhdOwotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImNhcmJvbiIpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyJBcmlhbCIsICJJbXBhY3QiLCAiVGltZXMiLCAiVmVyZGFuYSJ9IFtpbmRleF07Ci0JfSBlbHNlIHsgLy8gcGhvdG9uLCBldGMgLi4uCi0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiQXJpYWwiLCAiSW1wYWN0IiwgIlRpbWVzIiwgIlZlcmRhbmEifSBbaW5kZXhdOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYWRpZW50RGlhbG9nLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFkaWVudERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjhhNjg1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYWRpZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyB1c2VkIGZvciBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gc2VsZWN0IHR3byBjb2xvcnMgZm9yIHRoZQotICogY3JlYXRpb24gb2YgYSBncmFkaWVudC4KLSAqLwotcHVibGljIGNsYXNzIEdyYWRpZW50RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCUNhbnZhcyBjYW52YXM7Ci0KLQlCdXR0b24gY29sb3JCdXR0b24xLCBjb2xvckJ1dHRvbjI7CQkvLyBjb2xvciBidXR0b25zCi0KLQlCdXR0b24gb2tCdXR0b24sIGNhbmNlbEJ1dHRvbjsKLQotCU1lbnUgbWVudTEsIG1lbnUyOwotCQotCVJHQiByZ2IxLCByZ2IyOwkJCS8vIGZpcnN0IGFuZCBzZWNvbmQgY29sb3IgdXNlZCBpbiBncmFkaWVudAotCWludCByZXR1cm5WYWw7IAkJCS8vIHZhbHVlIHRvIGJlIHJldHVybmVkIGJ5IG9wZW4oKSwgc2V0IHRvIFNXVC5PSyAKLQkJCQkJCQkvLyBpZiB0aGUgb2sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQJCQotCUFycmF5TGlzdCByZXNvdXJjZXM7Ci0JCQkKLQlwdWJsaWMgR3JhZGllbnREaWFsb2coU2hlbGwgcGFyZW50KSB7CQkKLQkJdGhpcyAocGFyZW50LCBTV1QuUFJJTUFSWV9NT0RBTCk7Ci0JfQotCQotCXB1YmxpYyBHcmFkaWVudERpYWxvZyhTaGVsbCBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJcmdiMSA9IHJnYjIgPSBudWxsOwotCQlyZXR1cm5WYWwgPSBTV1QuQ0FOQ0VMOwotCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGRpYWxvZyBhbmQgb3BlbnMgaXQuCi0JICogKi8KLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbChnZXRQYXJlbnQoKSwgU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSB8IGdldFN0eWxlKCkpOwotCQlkaWFsb2cuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYWRpZW50IikpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkgICAgZGlhbG9nLnNldExheW91dChncmlkTGF5b3V0KTsKLQkgICAgCi0JICAgIC8vIGNyZWF0ZSB0aGUgY29udHJvbHMgaW4gdGhlIGRpYWxvZwotCSAgICBjcmVhdGVEaWFsb2dDb250cm9scyhkaWFsb2cpOwotCQkKLQkJZGlhbG9nLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqID0gcmVzb3VyY2VzLmdldChpKTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCQkoKFJlc291cmNlKSBvYmopLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlkaWFsb2cuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsJCi0KLQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24gKG9rQnV0dG9uKTsKLQkJZGlhbG9nLnBhY2sgKCk7Ci0JCVJlY3RhbmdsZSByZWN0ID0gZ2V0UGFyZW50KCkuZ2V0TW9uaXRvcigpLmdldEJvdW5kcygpOwotCQlSZWN0YW5nbGUgYm91bmRzID0gZGlhbG9nLmdldEJvdW5kcygpOwotCQlkaWFsb2cuc2V0TG9jYXRpb24ocmVjdC54ICsgKHJlY3Qud2lkdGggLSBib3VuZHMud2lkdGgpIC8gMiwgcmVjdC55ICsgKHJlY3QuaGVpZ2h0IC0gYm91bmRzLmhlaWdodCkgLyAyKTsKLQkJZGlhbG9nLnNldE1pbmltdW1TaXplKGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCQotCQlkaWFsb2cub3BlbiAoKTsKLQkJCi0JCURpc3BsYXkgZGlzcGxheSA9IGdldFBhcmVudCgpLmdldERpc3BsYXkoKTsKLQkJd2hpbGUgKCFkaWFsb2cuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQkKLQkJaWYgKG1lbnUxICE9IG51bGwpIHsKLQkJCW1lbnUxLmRpc3Bvc2UoKTsKLQkJCW1lbnUxID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKG1lbnUyICE9IG51bGwpIHsKLQkJCW1lbnUyLmRpc3Bvc2UoKTsKLQkJCW1lbnUyID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiByZXR1cm5WYWw7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2xzIG9mIHRoZSBkaWFsb2cuCi0JICogKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVEaWFsb2dDb250cm9scyhmaW5hbCBTaGVsbCBwYXJlbnQpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQkJCi0JCS8vIG1lc3NhZ2UKLQkJTGFiZWwgbWVzc2FnZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsgCi0JCW1lc3NhZ2Uuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYWRpZW50RGxnTXNnIikpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCW1lc3NhZ2Uuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQkvLyBkZWZhdWx0IGNvbG9ycyBhcmUgd2hpdGUgYW5kIGJsYWNrCi0JCWlmIChyZ2IxID09IG51bGwgfHwgcmdiMiA9PSBudWxsKSB7Ci0JCQlyZ2IxID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpLmdldFJHQigpOwotCQkJcmdiMiA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKS5nZXRSR0IoKTsKLQkJfQkJCQotCi0JCS8vIGNhbnZhcwotCQljYW52YXMgPSBuZXcgQ2FudmFzKHBhcmVudCwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDA7Ci0JCWNhbnZhcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY2FudmFzLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJCUltYWdlIHByZXZpZXcgPSBudWxsOwotCQkJCVBvaW50IHNpemUgPSBjYW52YXMuZ2V0U2l6ZSgpOwotCQkJCUNvbG9yIGNvbG9yMSA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IxKTsKLQkJCQlDb2xvciBjb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdiMik7Ci0JCQkJcHJldmlldyA9IEdyYXBoaWNzRXhhbXBsZS5jcmVhdGVJbWFnZShkaXNwbGF5LCBjb2xvcjEsIGNvbG9yMiwgc2l6ZS54LCBzaXplLnkpOwotCQkJCWlmIChwcmV2aWV3ICE9IG51bGwpIHsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UgKHByZXZpZXcsIDAsIDApOwotCQkJCX0KLQkJCQlwcmV2aWV3LmRpc3Bvc2UoKTsKLQkJCQljb2xvcjEuZGlzcG9zZSgpOwotCQkJCWNvbG9yMi5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gY29tcG9zaXRlIHVzZWQgZm9yIGJvdGggY29sb3IgYnV0dG9ucwotCQlDb21wb3NpdGUgY29sb3JCdXR0b25Db21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCi0JCS8vIGxheW91dCBidXR0b25zCi0JCVJvd0xheW91dCBsYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7OwotCQlsYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDsKLQkJbGF5b3V0LnBhY2sgPSBmYWxzZTsKLQkJY29sb3JCdXR0b25Db21wLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIHBvc2l0aW9uIGNvbXBvc2l0ZQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCSAgICBjb2xvckJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JICAgIAotCQlDb2xvck1lbnUgY29sb3JNZW51ID0gbmV3IENvbG9yTWVudSgpOwotCQkKLQkJLy8gY29sb3IgY29udHJvbHM6IGZpcnN0IGNvbG9yCi0JCWNvbG9yQnV0dG9uMSA9IG5ldyBCdXR0b24oY29sb3JCdXR0b25Db21wLCBTV1QuUFVTSCk7Ci0JCWNvbG9yQnV0dG9uMS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JhZGllbnREbGdCdXR0b24xIikpOwotCQlDb2xvciBjb2xvcjEgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdiMSk7Ci0JCUltYWdlIGltZzEgPSBHcmFwaGljc0V4YW1wbGUuY3JlYXRlSW1hZ2UoZGlzcGxheSwgY29sb3IxKTsKLQkJY29sb3IxLmRpc3Bvc2UoKTsKLQkJY29sb3JCdXR0b24xLnNldEltYWdlKGltZzEpOwotCQlyZXNvdXJjZXMuYWRkKGltZzEpOwotCQltZW51MSA9IGNvbG9yTWVudS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCQlyZ2IxID0gZ2IuZ2V0QmdDb2xvcjEoKS5nZXRSR0IoKTsKLQkJCQljb2xvckJ1dHRvbjEuc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJCWlmIChjYW52YXMgIT0gbnVsbCkgY2FudmFzLnJlZHJhdygpOwotCQkJfQotCQl9KTsKLQkJY29sb3JCdXR0b24xLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJCW1lbnUxLnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCQltZW51MS5zZXRWaXNpYmxlKHRydWUpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIGNvbG9yIGNvbnRyb2xzOiBzZWNvbmQgY29sb3IgCi0JCWNvbG9yQnV0dG9uMiA9IG5ldyBCdXR0b24oY29sb3JCdXR0b25Db21wLCBTV1QuUFVTSCk7Ci0JCWNvbG9yQnV0dG9uMi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JhZGllbnREbGdCdXR0b24yIikpOwotCQlDb2xvciBjb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdiMik7Ci0JCUltYWdlIGltZzIgPSBHcmFwaGljc0V4YW1wbGUuY3JlYXRlSW1hZ2UoZGlzcGxheSwgY29sb3IyKTsKLQkJY29sb3IyLmRpc3Bvc2UoKTsKLQkJY29sb3JCdXR0b24yLnNldEltYWdlKGltZzIpOwotCQlyZXNvdXJjZXMuYWRkKGltZzIpOwotCQltZW51MiA9IGNvbG9yTWVudS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCQlyZ2IyID0gZ2IuZ2V0QmdDb2xvcjEoKS5nZXRSR0IoKTsKLQkJCQljb2xvckJ1dHRvbjIuc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJCWlmIChjYW52YXMgIT0gbnVsbCkgY2FudmFzLnJlZHJhdygpOwotCQkJfQotCQl9KTsKLQkJY29sb3JCdXR0b24yLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJCW1lbnUyLnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCQltZW51Mi5zZXRWaXNpYmxlKHRydWUpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIGNvbXBvc2l0ZSB1c2VkIGZvciBvayBhbmQgY2FuY2VsIGJ1dHRvbnMKLQkJQ29tcG9zaXRlIG9rQ2FuY2VsQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJLy8gbGF5b3V0IGJ1dHRvbnMKLQkJUm93TGF5b3V0IHJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLQkJcm93TGF5b3V0LnBhY2sgPSBmYWxzZTsKLQkJcm93TGF5b3V0Lm1hcmdpblRvcCA9IDU7Ci0JCW9rQ2FuY2VsQ29tcC5zZXRMYXlvdXQocm93TGF5b3V0KTsKLQotCQkvLyBwb3NpdGlvbiBjb21wb3NpdGUKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCSAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JICAgIG9rQ2FuY2VsQ29tcC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JICAgIC8vIE9LIGJ1dHRvbgotCQlva0J1dHRvbiA9IG5ldyBCdXR0b24gKG9rQ2FuY2VsQ29tcCwgU1dULlBVU0gpOwotCQlva0J1dHRvbi5zZXRUZXh0KCImT0siKTsKLQkJb2tCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlyZXR1cm5WYWwgPSBTV1QuT0s7Ci0JCQkJcGFyZW50LmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gY2FuY2VsIGJ1dHRvbgotCQljYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uIChva0NhbmNlbENvbXAsIFNXVC5QVVNIKTsKLQkJY2FuY2VsQnV0dG9uLnNldFRleHQoIiZDYW5jZWwiKTsKLQkJY2FuY2VsQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJcGFyZW50LmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBSR0Igc2VsZWN0ZWQgYnkgdGhlIHVzZXIuCi0JICogKi8KLQlwdWJsaWMgUkdCIGdldEZpcnN0UkdCKCkgewotCQlyZXR1cm4gcmdiMTsJCQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmaXJzdCBSR0IuCi0JICogQHBhcmFtIHJnYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpcnN0UkdCKFJHQiByZ2IpIHsKLQkJdGhpcy5yZ2IxID0gcmdiOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWNvbmQgUkdCIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgotCSAqICovCi0JcHVibGljIFJHQiBnZXRTZWNvbmRSR0IoKSB7Ci0JCXJldHVybiByZ2IyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlY29uZCBSR0IuCi0JICogQHBhcmFtIHJnYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY29uZFJHQihSR0IgcmdiKSB7Ci0JCXRoaXMucmdiMiA9IHJnYjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFkaWVudFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhZGllbnRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMzRiYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFkaWVudFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkcmF3cyBhbiBpbWFnZSBjb25zaXN0aW5nIG9mIGdyYWRpZW50cyBvZiB0d28gY29sb3JzLgotICogKi8KLXB1YmxpYyBjbGFzcyBHcmFkaWVudFRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQkKLQlUb29sQmFyIHRvb2xCYXI7Ci0JVG9vbEl0ZW0gY29sb3JJdGVtMSwgY29sb3JJdGVtMjsKLQlNZW51IG1lbnUxLCBtZW51MjsKLQlHcmFwaGljc0JhY2tncm91bmQgY29sb3JHQjEsIGNvbG9yR0IyOwotCUFycmF5TGlzdCByZXNvdXJjZXM7CQkvLyByZXNvdXJjZXMgdG8gYmUgZGlzcG9zZWQgd2hlbiB0aGUgZGlwb3NlKCkgbWV0aG9kIGlzIGludm9rZWQKLQkKLQotcHVibGljIEdyYWRpZW50VGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci0JcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotfQotCi0vKioKLSAqIERpc3Bvc2UgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhpcyB0YWIuCi0gKiAqLwotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQlPYmplY3Qgb2JqID0gcmVzb3VyY2VzLmdldChpKTsKLQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFJlc291cmNlKSAKLQkJCSgoUmVzb3VyY2UpIG9iaikuZGlzcG9zZSgpOwotCX0KLQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JaWYgKG1lbnUxICE9IG51bGwpIHsKLQkJbWVudTEuZGlzcG9zZSgpOwotCQltZW51MSA9IG51bGw7Ci0JfQotCWlmIChtZW51MiAhPSBudWxsKSB7Ci0JCW1lbnUyLmRpc3Bvc2UoKTsKLQkJbWVudTIgPSBudWxsOwotCX0KLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmFkaWVudCIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmFkSW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYWRpZW50SW1hZ2VEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI2NyZWF0ZUNvbnRyb2xQYW5lbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQkKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuRkxBVCk7Ci0JCi0JQ29sb3JNZW51IGNvbG9yTWVudSA9IG5ldyBDb2xvck1lbnUoKTsKLQotCS8vIG1lbnUgZm9yIGNvbG9ySXRlbTEKLQltZW51MSA9IGNvbG9yTWVudS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJY29sb3JHQjEgPSBnYjsKLQkJCWNvbG9ySXRlbTEuc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgdG8gdGhlIDV0aCBpdGVtIGluIHRoZSBtZW51IChibHVlKQotCWNvbG9yR0IxID0gKEdyYXBoaWNzQmFja2dyb3VuZCltZW51MS5nZXRJdGVtKDQpLmdldERhdGEoKTsKLQkKLQkvLyB0b29sYmFyIGl0ZW0gZm9yIGNvbG9yMQotCWNvbG9ySXRlbTEgPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCWNvbG9ySXRlbTEuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYWRpZW50VGFiSXRlbTEiKSk7Ci0JY29sb3JJdGVtMS5zZXRJbWFnZShjb2xvckdCMS5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JJdGVtMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKXsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIFRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBUb29sQmFyICB0b29sQmFyID0gdG9vbEl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQlSZWN0YW5nbGUgdG9vbEl0ZW1Cb3VuZHMgPSB0b29sSXRlbS5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gdG9vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KHRvb2xJdGVtQm91bmRzLngsIHRvb2xJdGVtQm91bmRzLnkpKTsKLQkJCW1lbnUxLnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyB0b29sSXRlbUJvdW5kcy5oZWlnaHQpOwotCQkJbWVudTEuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotCQotCS8vIG1lbnUgZm9yIGNvbG9ySXRlbTIKLQltZW51MiA9IGNvbG9yTWVudS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJY29sb3JHQjIgPSBnYjsKLQkJCWNvbG9ySXRlbTIuc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgdG8gdGhlIDNyZCBpdGVtIGluIHRoZSBtZW51IChyZWQpCi0JY29sb3JHQjIgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUyLmdldEl0ZW0oMikuZ2V0RGF0YSgpOwotCQotCS8vIHRvb2xiYXIgaXRlbSBmb3IgY29sb3IyCi0JY29sb3JJdGVtMiA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JY29sb3JJdGVtMi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JhZGllbnRUYWJJdGVtMiIpKTsKLQljb2xvckl0ZW0yLnNldEltYWdlKGNvbG9yR0IyLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckl0ZW0yLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgVG9vbEl0ZW0gdG9vbEl0ZW0gPSAoVG9vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIFRvb2xCYXIgIHRvb2xCYXIgPSB0b29sSXRlbS5nZXRQYXJlbnQoKTsKLQkJCVJlY3RhbmdsZSB0b29sSXRlbUJvdW5kcyA9IHRvb2xJdGVtLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEl0ZW1Cb3VuZHMueCwgdG9vbEl0ZW1Cb3VuZHMueSkpOwotCQkJbWVudTIuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIHRvb2xJdGVtQm91bmRzLmhlaWdodCk7Ci0JCQltZW51Mi5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gdG9vbGJhciBpdGVtIGZvciBzd2FwcGluZyBjb2xvcnMKLQlUb29sSXRlbSBzd2FwSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0Jc3dhcEl0ZW0uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN3YXBDb2xvcnMiKSk7IC8vJE5PTi1OTFMtMSQKLQlzd2FwSXRlbS5zZXRJbWFnZShleGFtcGxlLmxvYWRJbWFnZShkaXNwbGF5LCAic3dhcC5naWYiKSk7Ci0Jc3dhcEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCl7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlHcmFwaGljc0JhY2tncm91bmQgdG1wID0gY29sb3JHQjE7Ci0JCQljb2xvckdCMSA9IGNvbG9yR0IyOwotCQkJY29sb3JHQjIgPSB0bXA7Ci0JCQljb2xvckl0ZW0xLnNldEltYWdlKGNvbG9yR0IxLmdldFRodW1iTmFpbCgpKTsKLQkJCWNvbG9ySXRlbTIuc2V0SW1hZ2UoY29sb3JHQjIuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotfQotCi0vKioKLSAqIFRoaXMgbWV0aG9kIGRyYXdzIHRoZSBncmFkaWVudCBwYXR0ZXJucyB0aGF0IG1ha2UgdXAgdGhlIGltYWdlLiBUaGUgaW1hZ2UKLSAqIGNvbnNpc3RzIG9mIDQgcm93cywgZWFjaCBjb25zaXN0aW5nIG9mIDQgZ3JhZGllbnQgcGF0dGVybnMgKHRvdGFsIG9mIDE2KS4KLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQlJbWFnZSBpbWFnZSA9IGNyZWF0ZUltYWdlKGRldmljZSwgY29sb3JHQjEuZ2V0QmdDb2xvcjEoKSwgY29sb3JHQjIuZ2V0QmdDb2xvcjEoKSwgd2lkdGgsIGhlaWdodCk7Ci0JUGF0dGVybiBwID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocCk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQotCXAuZGlzcG9zZSgpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotCi0vKioKLSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYW4gaW1hZ2UgbWFkZSB1cCBvZiBncmFkaWVudCBwYXR0ZXJucy4gVGhlIGltYWdlIHRha2VzIHVwCi0gKiBhIHF1YXJ0ZXIgb2YgdGhlIGFyZWEgb2YgdGhlIHRvdGFsIGRyYXdpbmcgc3VyZmFjZS4KLSAqIAotICogQHBhcmFtIGRldmljZQotICogICAgICAgICAgICBBIERldmljZQotICogQHBhcmFtIGNvbG9yMQotICogICAgICAgICAgICBBIENvbG9yCi0gKiBAcGFyYW0gY29sb3IyCi0gKiAgICAgICAgICAgIEEgQ29sb3IKLSAqIEBwYXJhbSB3aWR0aAotICogICAgICAgICAgICBXaWR0aCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlCi0gKiBAcGFyYW0gaGVpZ2h0Ci0gKiAgICAgICAgICAgIEhlaWdodCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlCi0gKi8KLUltYWdlIGNyZWF0ZUltYWdlKERldmljZSBkZXZpY2UsIENvbG9yIGNvbG9yMSwgQ29sb3IgY29sb3IyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkZXZpY2UsIHdpZHRoLzIsIGhlaWdodC8yKTsKLQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkKLQlQYXR0ZXJuIHBhdHRlcm4xID0gbmV3IFBhdHRlcm4oZGV2aWNlLCByZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aC8yZiwgcmVjdC5oZWlnaHQvMmYsIGNvbG9yMSwgY29sb3IyKTsKLQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuMSk7CQotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5hZGRSZWN0YW5nbGUoMCwgMCwgd2lkdGgvNGYsIGhlaWdodC80Zik7Ci0JcGF0aC5hZGRSZWN0YW5nbGUod2lkdGgvNGYsIGhlaWdodC80Ziwgd2lkdGgvNGYsIGhlaWdodC80Zik7Ci0JZ2MuZmlsbFBhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JCi0JUGF0dGVybiBwYXR0ZXJuMiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgcmVjdC53aWR0aCwgMCwgcmVjdC53aWR0aC8yZiwgcmVjdC5oZWlnaHQvMmYsIGNvbG9yMSwgY29sb3IyKTsKLQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuMik7Ci0JcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5hZGRSZWN0YW5nbGUod2lkdGgvNGYsIDAsIHdpZHRoLzRmLCBoZWlnaHQvNGYpOwotCXBhdGguYWRkUmVjdGFuZ2xlKDAsIGhlaWdodC80Ziwgd2lkdGgvNGYsIGhlaWdodC80Zik7Ci0JZ2MuZmlsbFBhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7CQotCi0JZ2MuZGlzcG9zZSgpOwotCXBhdHRlcm4xLmRpc3Bvc2UoKTsKLQlwYXR0ZXJuMi5kaXNwb3NlKCk7Ci0JcmV0dXJuIGltYWdlOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljQW50aWFsaWFzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljQW50aWFsaWFzVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MmY3MDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY0FudGlhbGlhc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRlbW9uc3RyYXRlcyBhbnRpYWxpYXNpbmcgZm9yIGdyYXBoaWNzLiBBbnRpYWxpYXNpbmcgaXMgdXNlZCBmb3IKLSAqIHNtb290aGluZyBqYWdnZWQgZWRnZXMgaW4gZ3JhcGhpY3MuIFRoaXMgdGFiIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlCi0gKiBlZmZlY3RzIG9mIGRpZmZlcmVudCBhbnRpYWxpYXNpbmcgdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY0FudGlhbGlhc1RhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQotCUNvbWJvIGFsaWFzQ29tYm87Ci0JaW50W10gYWxpYXNWYWx1ZXMgPSB7IFNXVC5PRkYsIFNXVC5ERUZBVUxULCBTV1QuT04gfTsKLQkKLQlCdXR0b24gY29sb3JCdXR0b247Ci0JTWVudSBtZW51OwotCUdyYXBoaWNzQmFja2dyb3VuZCBvdmFsQ29sb3JHQjsKLQotCQotcHVibGljIEdyYXBoaWNBbnRpYWxpYXNUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbnRpYWxpYXNpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JhcGhpY3MiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFudGlhbGlhc2luZ0dyYXBoaWNzRGVzYyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1lbnUgIT0gbnVsbCkgewotCQltZW51LmRpc3Bvc2UoKTsKLQkJbWVudSA9IG51bGw7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JQ29tcG9zaXRlIGNvbXA7Ci0JCi0JLy8gY3JlYXRlIGRyb3AgZG93biBjb21ibyBmb3IgYW50aWFsaWFzaW5nCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygiQW50aWFsaWFzaW5nIikpOyAvLyROT04tTkxTLTEkCi0JYWxpYXNDb21ibyA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOKTsKLQlhbGlhc0NvbWJvLmFkZCgiT0ZGIik7Ci0JYWxpYXNDb21iby5hZGQoIkRFRkFVTFQiKTsKLQlhbGlhc0NvbWJvLmFkZCgiT04iKTsKLQlhbGlhc0NvbWJvLnNlbGVjdCgwKTsKLQlhbGlhc0NvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0KLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JY20uc2V0Q29sb3JJdGVtcyh0cnVlKTsKLQltZW51ID0gY20uY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCW92YWxDb2xvckdCID0gZ2I7Ci0JCQljb2xvckJ1dHRvbi5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gY3JlYXRlIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotICAgIC8vIGluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgdG8gdGhlIDV0aCBpdGVtIGluIHRoZSBtZW51IChibHVlKQotCW92YWxDb2xvckdCID0gKEdyYXBoaWNzQmFja2dyb3VuZCltZW51LmdldEl0ZW0oNCkuZ2V0RGF0YSgpOwotCQotCS8vIGNvbG9yIGJ1dHRvbgotCWNvbG9yQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JY29sb3JCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24uc2V0SW1hZ2Uob3ZhbENvbG9yR0IuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9yQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JaWYgKG92YWxDb2xvckdCICE9IG51bGwgJiYgb3ZhbENvbG9yR0IuZ2V0QmdDb2xvcjEoKSAhPSBudWxsKQotCQlnYy5zZXRCYWNrZ3JvdW5kKG92YWxDb2xvckdCLmdldEJnQ29sb3IxKCkpOwotCQotCWdjLnNldEFudGlhbGlhcyhhbGlhc1ZhbHVlc1thbGlhc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldKTsKLQotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JZmxvYXQgb2Zmc2V0WCA9IDIqd2lkdGgvM2YsIG9mZnNldFkgPSBoZWlnaHQvM2Y7Ci0JZm9yKGludCBpPTA7IGkgPCAyNTsgaSsrKSB7Ci0JCXBhdGguYWRkQXJjKG9mZnNldFgtKDUwKmkpLCBvZmZzZXRZLSgyNSppKSwgNTArKDEwMCppKSwgMjUrKDUwKmkpLCAwLCAzNjApOwotCX0KLQlnYy5maWxsUGF0aChwYXRoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NCYWNrZ3JvdW5kLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc0JhY2tncm91bmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5OWZlYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc0JhY2tncm91bmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIGZvciBzdG9yaW5nIGRhdGEgcmVsZXZhbnQgdG8gYSBiYWNrZ3JvdW5kLgotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY3NCYWNrZ3JvdW5kIHsKLQkKLQlwcml2YXRlIEltYWdlIGJnSW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSB0aHVtYk5haWw7Ci0JcHJpdmF0ZSBDb2xvciBiZ0NvbG9yMTsKLQlwcml2YXRlIENvbG9yIGJnQ29sb3IyOwotCQotCXB1YmxpYyBHcmFwaGljc0JhY2tncm91bmQoKSB7Ci0JCWJnSW1hZ2UgPSBudWxsOwotCQl0aHVtYk5haWwgPSBudWxsOwotCQliZ0NvbG9yMSA9IG51bGw7Ci0JCWJnQ29sb3IyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0QmdJbWFnZSgpIHsKLQkJcmV0dXJuIGJnSW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmdJbWFnZShJbWFnZSBiZ0ltYWdlKSB7Ci0JCXRoaXMuYmdJbWFnZSA9IGJnSW1hZ2U7Ci0JfQotCi0JcHVibGljIENvbG9yIGdldEJnQ29sb3IxKCkgewotCQlyZXR1cm4gYmdDb2xvcjE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmdDb2xvcjEoQ29sb3IgYmdDb2xvcjEpIHsKLQkJdGhpcy5iZ0NvbG9yMSA9IGJnQ29sb3IxOwotCX0KLQotCXB1YmxpYyBDb2xvciBnZXRCZ0NvbG9yMigpIHsKLQkJcmV0dXJuIGJnQ29sb3IyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJnQ29sb3IyKENvbG9yIGJnQ29sb3IyKSB7Ci0JCXRoaXMuYmdDb2xvcjIgPSBiZ0NvbG9yMjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0VGh1bWJOYWlsKCkgewotCQlyZXR1cm4gdGh1bWJOYWlsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRodW1iTmFpbChJbWFnZSB0aHVtYk5haWwpIHsKLQkJdGhpcy50aHVtYk5haWwgPSB0aHVtYk5haWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc0V4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2MTg3OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc0V4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgbWFpbiBjbGFzcyBvZiB0aGUgZ3JhcGhpY3MgYXBwbGljYXRpb24uIFZhcmlvdXMgInRhYnMiIGFyZQotICogY3JlYXRlZCBhbmQgbWFkZSB2aXNpYmxlIGJ5IHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaGljc0V4YW1wbGUgewotCQkKLQlDb21wb3NpdGUgcGFyZW50OwotCUdyYXBoaWNzVGFiW10gdGFiczsJCQkJLy8gdGFicyB0byBiZSBmb3VuZCBpbiB0aGUgYXBwbGljYXRpb24KLQlHcmFwaGljc1RhYiB0YWI7CQkJCS8vIHRoZSBjdXJyZW50IHRhYgotCUdyYXBoaWNzQmFja2dyb3VuZCBiYWNrZ3JvdW5kOwkvLyB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWNrZ3JvdW5kCi0JCi0JVG9vbEJhciB0b29sQmFyOwkJCQkvLyB0b29sYmFyIHRoYXQgY29udGFpbnMgYmFja0l0ZW0gYW5kIGRiSXRlbQotCVRyZWUgdGFiTGlzdDsJCQkJCS8vIHRyZWUgc3RydWN0dXJlIG9mIHRhYnMKLQlUZXh0IHRhYkRlc2M7CQkJCQkvLyBtdWx0aS1saW5lIHRleHQgd2lkZ2V0IHRoYXQgZGlzcGxheXMgYSB0YWIgZGVzY3JpcHRpb24KLQlTYXNoIGhTYXNoLCB2U2FzaDsKLQlDYW52YXMgY2FudmFzOwotCUNvbXBvc2l0ZSB0YWJDb250cm9sUGFuZWw7Ci0JVG9vbEl0ZW0gYmFja0l0ZW0sIGRiSXRlbTsJCS8vIGJhY2tncm91bmQsIGRvdWJsZSBidWZmZXIgaXRlbXMKLQlNZW51IGJhY2tNZW51OwkJCQkJLy8gYmFja2dyb3VuZCBtZW51IGl0ZW0KLQkKLQlBcnJheUxpc3QgcmVzb3VyY2VzOwkJCS8vIHN0b3JlcyByZXNvdXJjZXMgdGhhdCB3aWxsIGJlIGRpc3Bvc2VkCi0JQXJyYXlMaXN0IHRhYnNfaW5fb3JkZXI7CQkvLyBzdG9yZXMgR3JhcGhpY3NUYWJzIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSB0cmVlCi0JYm9vbGVhbiBhbmltYXRlID0gdHJ1ZTsJCQkvLyB3aGV0aGVyIGFuaW1hdGlvbiBzaG91bGQgaGFwcGVuCi0KLQlzdGF0aWMgYm9vbGVhbiBhZHZhbmNlR3JhcGhpY3MsIGFkdmFuY2VHcmFwaGljc0luaXQ7Ci0JCi0Jc3RhdGljIGZpbmFsIGludCBNQVJHSU4gPSA1OwotCXN0YXRpYyBmaW5hbCBpbnQgU0FTSF9TUEFDSU5HID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IFRJTUVSID0gMzA7Ci0Jc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfZ3JhcGhpY3MiKTsgLy8kTk9OLU5MUy0xJAotCi0vKgotICogRGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBuZWVkZWQgc28gdGhhdCBleGFtcGxlIGxhdW5jaGVyIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2UuIAotICovCi1wdWJsaWMgR3JhcGhpY3NFeGFtcGxlKCkgewotCXN1cGVyKCk7Ci19Ci0KLXB1YmxpYyBHcmFwaGljc0V4YW1wbGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCXRoaXMucGFyZW50ID0gcGFyZW50OwotCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQljcmVhdGVDb250cm9scyhwYXJlbnQpOwotCXNldFRhYih0YWIpOwotCXN0YXJ0QW5pbWF0aW9uVGltZXIoKTsKLX0KLQotYm9vbGVhbiBjaGVja0FkdmFuY2VkR3JhcGhpY3MoKSB7Ci0JaWYgKGFkdmFuY2VHcmFwaGljc0luaXQpIHJldHVybiBhZHZhbmNlR3JhcGhpY3M7Ci0JYWR2YW5jZUdyYXBoaWNzSW5pdCA9IHRydWU7Ci0JRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQl0cnkgewotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJcGF0aC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCksIG5ld1NoZWxsID0gbnVsbDsKLQkJaWYgKHNoZWxsID09IG51bGwpIHNoZWxsID0gbmV3U2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1dBUk5JTkcgfCBTV1QuT0spOwotCQlkaWFsb2cuc2V0VGV4dChSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKCJXYXJuaW5nIikpOyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5zZXRNZXNzYWdlKFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoIkxpYk5vdEZvdW5kIikpOyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5vcGVuKCk7Ci0JCWlmIChuZXdTaGVsbCAhPSBudWxsKSBuZXdTaGVsbC5kaXNwb3NlKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIGFkdmFuY2VHcmFwaGljcyA9IHRydWU7Ci19Ci0KLXZvaWQgY3JlYXRlQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCXRhYnMgPSBjcmVhdGVUYWJzKCk7Ci0JY3JlYXRlVG9vbEJhcihwYXJlbnQpOwotCWNyZWF0ZVRhYkxpc3QocGFyZW50KTsKLQloU2FzaCA9IG5ldyBTYXNoKHBhcmVudCwgU1dULkhPUklaT05UQUwpOwotCWNyZWF0ZVRhYkRlc2MocGFyZW50KTsJCi0JdlNhc2ggPSBuZXcgU2FzaChwYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0JY3JlYXRlQ2FudmFzKHBhcmVudCk7Ci0JY3JlYXRlQ29udHJvbFBhbmVsKHBhcmVudCk7Ci0JCi0JRm9ybURhdGEgZGF0YTsKLQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgTUFSR0lOKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBNQVJHSU4pOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtTUFSR0lOKTsKLQl0b29sQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIE1BUkdJTik7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9vbEJhciwgTUFSR0lOKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHZTYXNoLCAtU0FTSF9TUEFDSU5HKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChoU2FzaCwgLVNBU0hfU1BBQ0lORyk7Ci0JdGFiTGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBNQVJHSU4pOwotCWludCBvZmZzZXQgPSBwYXJlbnQuZ2V0Qm91bmRzKCkuaGVpZ2h0IC0gdGFiRGVzYy5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgdGFiRGVzYy5nZXRMaW5lSGVpZ2h0KCkgKiAxMCkueTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChudWxsLCBvZmZzZXQpOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodlNhc2gsIC1TQVNIX1NQQUNJTkcpOwotCWhTYXNoLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIE1BUkdJTik7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoaFNhc2gsIFNBU0hfU1BBQ0lORyk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCh2U2FzaCwgLVNBU0hfU1BBQ0lORyk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtTUFSR0lOKTsKLQl0YWJEZXNjLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChudWxsLCB0YWJMaXN0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueCArIDUwKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0b29sQmFyLCBNQVJHSU4pOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLU1BUkdJTik7Ci0JdlNhc2guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodlNhc2gsIFNBU0hfU1BBQ0lORyk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9vbEJhciwgTUFSR0lOKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLU1BUkdJTik7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFiQ29udHJvbFBhbmVsKTsKLQljYW52YXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodlNhc2gsIFNBU0hfU1BBQ0lORyk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1NQVJHSU4pOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLU1BUkdJTik7Ci0JdGFiQ29udHJvbFBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JdlNhc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBoU2FzaC5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQlldmVudC54ID0gTWF0aC5taW4gKE1hdGgubWF4IChldmVudC54LCA2MCksIHJlY3Qud2lkdGggLSA2MCk7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsICE9IFNXVC5EUkFHKSB7Ci0JCQkJRm9ybURhdGEgZGF0YSA9IChGb3JtRGF0YSl2U2FzaC5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZGF0YS5sZWZ0Lm9mZnNldCA9IGV2ZW50Lng7Ci0JCQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJCQlhbmltYXRlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYW5pbWF0ZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfSk7Ci0JaFNhc2guYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSB2U2FzaC5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQlldmVudC55ID0gTWF0aC5taW4gKE1hdGgubWF4IChldmVudC55LCB0YWJMaXN0LmdldExvY2F0aW9uKCkueSArIDYwKSwgcmVjdC5oZWlnaHQgLSA2MCk7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsICE9IFNXVC5EUkFHKSB7Ci0JCQkJRm9ybURhdGEgZGF0YSA9IChGb3JtRGF0YSloU2FzaC5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZGF0YS50b3Aub2Zmc2V0ID0gZXZlbnQueTsKLQkJCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLXZvaWQgY3JlYXRlQ2FudmFzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlpbnQgc3R5bGUgPSBTV1QuTk9fQkFDS0dST1VORDsKLQlpZiAoZGJJdGVtLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuRE9VQkxFX0JVRkZFUkVEOwotCWNhbnZhcyA9IG5ldyBDYW52YXMocGFyZW50LCBzdHlsZSk7Ci0JY2FudmFzLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCVJlY3RhbmdsZSByZWN0ID0gY2FudmFzLmdldENsaWVudEFyZWEoKTsJCQkKLQkJCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkJCVBhdHRlcm4gcGF0dGVybiA9IG51bGw7Ci0JCQlpZiAoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpICE9IG51bGwpIHsKLQkJCQlpZiAoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMigpICE9IG51bGwpIHsgLy8gZ3JhZGllbnQKLQkJCQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgMCwgMCwgcmVjdC53aWR0aCwgCi0JCQkJCQkJcmVjdC5oZWlnaHQsCi0JCQkJCQkJYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpLAotCQkJCQkJCWJhY2tncm91bmQuZ2V0QmdDb2xvcjIoKSk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCQkJCX0gZWxzZSB7CS8vIHNvbGlkIGNvbG9yCi0JCQkJCWdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGJhY2tncm91bmQuZ2V0QmdJbWFnZSgpICE9IG51bGwpIHsJCS8vIGltYWdlCi0JCQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgYmFja2dyb3VuZC5nZXRCZ0ltYWdlKCkpOwotCQkJCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCQkJfQotCQkJZ2MuZmlsbFJlY3RhbmdsZShyZWN0KTsKLQkJCUdyYXBoaWNzVGFiIHRhYiA9IGdldFRhYigpOwotCQkJaWYgKHRhYiAhPSBudWxsKSB0YWIucGFpbnQoZ2MsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCWlmIChwYXR0ZXJuICE9IG51bGwpIHBhdHRlcm4uZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci19Ci0KLXZvaWQgcmVjcmVhdGVDYW52YXMoKSB7Ci0JaWYgKGRiSXRlbS5nZXRTZWxlY3Rpb24oKSA9PSAoKGNhbnZhcy5nZXRTdHlsZSgpICYgU1dULkRPVUJMRV9CVUZGRVJFRCkgIT0gMCkpIHJldHVybjsKLQlPYmplY3QgZGF0YSA9IGNhbnZhcy5nZXRMYXlvdXREYXRhKCk7Ci0JaWYgKGNhbnZhcyAhPSBudWxsKSBjYW52YXMuZGlzcG9zZSgpOwotCWNyZWF0ZUNhbnZhcyhwYXJlbnQpOwotCWNhbnZhcy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyB0aGUgY29udHJvbCBwYW5lbCAKLSAqIEBwYXJhbSBwYXJlbnQKLSAqLwotdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCUdyb3VwIGdyb3VwOwotCXRhYkNvbnRyb2xQYW5lbCA9IGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCWdyb3VwLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCi0JdGFiQ29udHJvbFBhbmVsLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotfQotCi12b2lkIGNyZWF0ZVRvb2xCYXIoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCi0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHBhcmVudCwgU1dULkZMQVQpOwotCQotCVRvb2xJdGVtICBiYWNrID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQliYWNrLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2siKSk7IC8vJE5PTi1OTFMtMSQKLQliYWNrLnNldEltYWdlKGxvYWRJbWFnZShkaXNwbGF5LCAiYmFjay5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkKLQliYWNrLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpbmRleCA9IHRhYnNfaW5fb3JkZXIuaW5kZXhPZih0YWIpIC0gMTsKLQkJCWlmIChpbmRleCA8IDApCi0JCQkJaW5kZXggPSB0YWJzX2luX29yZGVyLnNpemUoKSAtIDE7Ci0JCQlzZXRUYWIoKEdyYXBoaWNzVGFiKXRhYnNfaW5fb3JkZXIuZ2V0KGluZGV4KSk7Ci0JCX0KLQl9KTsKLQkKLQlUb29sSXRlbSAgbmV4dCA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JbmV4dC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJOZXh0IikpOyAvLyROT04tTkxTLTEkCi0JbmV4dC5zZXRJbWFnZShsb2FkSW1hZ2UoZGlzcGxheSwgIm5leHQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JbmV4dC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgaW5kZXggPSAodGFic19pbl9vcmRlci5pbmRleE9mKHRhYikgKyAxKSV0YWJzX2luX29yZGVyLnNpemUoKTsKLQkJCXNldFRhYigoR3JhcGhpY3NUYWIpdGFic19pbl9vcmRlci5nZXQoaW5kZXgpKTsKLQkJfQotCX0pOwotCQotCUNvbG9yTWVudSBjb2xvck1lbnUgPSBuZXcgQ29sb3JNZW51KCk7Ci0JCi0JLy8gc2V0dXAgaXRlbXMgdG8gYmUgY29udGFpbmVkIGluIHRoZSBiYWNrZ3JvdW5kIG1lbnUKLQljb2xvck1lbnUuc2V0Q29sb3JJdGVtcyh0cnVlKTsKLQljb2xvck1lbnUuc2V0UGF0dGVybkl0ZW1zKGNoZWNrQWR2YW5jZWRHcmFwaGljcygpKTsKLQljb2xvck1lbnUuc2V0R3JhZGllbnRJdGVtcyhjaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JCi0JLy8gY3JlYXRlIHRoZSBiYWNrZ3JvdW5kIG1lbnUKLQliYWNrTWVudSA9IGNvbG9yTWVudS5jcmVhdGVNZW51KHBhcmVudCwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJYmFja2dyb3VuZCA9IGdiOwotCQkJYmFja0l0ZW0uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJaWYgKGNhbnZhcyAhPSBudWxsKSBjYW52YXMucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBpbml0aWFsaXplIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBtZW51Ci0JYmFja2dyb3VuZCA9IChHcmFwaGljc0JhY2tncm91bmQpYmFja01lbnUuZ2V0SXRlbSgwKS5nZXREYXRhKCk7Ci0JCi0JLy8gYmFja2dyb3VuZCB0b29sIGl0ZW0KLQliYWNrSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JYmFja0l0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiQmFja2dyb3VuZCIpKTsgLy8kTk9OLU5MUy0xJAotCWJhY2tJdGVtLnNldEltYWdlKGJhY2tncm91bmQuZ2V0VGh1bWJOYWlsKCkpOwotCWJhY2tJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC53aWRnZXQgPT0gYmFja0l0ZW0pIHsKLQkJCQlmaW5hbCBUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJCWZpbmFsIFRvb2xCYXIgIHRvb2xCYXIgPSB0b29sSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQlSZWN0YW5nbGUgdG9vbEl0ZW1Cb3VuZHMgPSB0b29sSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQlQb2ludCBwb2ludCA9IHRvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sSXRlbUJvdW5kcy54LCB0b29sSXRlbUJvdW5kcy55KSk7Ci0JCQkJYmFja01lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIHRvb2xJdGVtQm91bmRzLmhlaWdodCk7Ci0JCQkJYmFja01lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vIGRvdWJsZSBidWZmZXIgdG9vbCBpdGVtCi0JZGJJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JZGJJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkRvdWJsZUJ1ZmZlciIpKTsgLy8kTk9OLU5MUy0xJAotCWRiSXRlbS5zZXRJbWFnZShsb2FkSW1hZ2UoZGlzcGxheSwgImRiLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCWRiSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzZXREb3VibGVCdWZmZXJlZChkYkl0ZW0uZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHRodW1ibmFpbCBpbWFnZS4KLSAqIAotICogQHBhcmFtIGRldmljZQotICogCQkJYSBkZXZpY2UKLSAqIEBwYXJhbSBuYW1lCi0gKiAJCQlmaWxlbmFtZSBvZiB0aGUgaW1hZ2UKLSAqLwotc3RhdGljIEltYWdlIGNyZWF0ZVRodW1ibmFpbChEZXZpY2UgZGV2aWNlLCBTdHJpbmcgbmFtZSkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRldmljZSwgbmFtZSk7Ci0JUmVjdGFuZ2xlIHNyYyA9IGltYWdlLmdldEJvdW5kcygpOwotCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JaWYgKHNyYy53aWR0aCAhPSAxNiB8fCBzcmMuaGVpZ2h0ICE9IDE2KSB7Ci0JCXJlc3VsdCA9IG5ldyBJbWFnZShkZXZpY2UsIDE2LCAxNik7Ci0JCUdDIGdjID0gbmV3IEdDKHJlc3VsdCk7Ci0JCVJlY3RhbmdsZSBkZXN0ID0gcmVzdWx0LmdldEJvdW5kcygpOwotCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIHNyYy54LCBzcmMueSwgc3JjLndpZHRoLCBzcmMuaGVpZ2h0LCBkZXN0LngsIGRlc3QueSwgZGVzdC53aWR0aCwgZGVzdC5oZWlnaHQpOwotCQlnYy5kaXNwb3NlKCk7CQkJCQotCX0KLQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhbiBpbWFnZSBiYXNlZCBvbiBhIGdyYWRpZW50IHBhdHRlcm4gbWFkZSB1cCBvZiB0d28gY29sb3JzLgotICogCi0gKiBAcGFyYW0gZGV2aWNlIC0gVGhlIERldmljZQotICogQHBhcmFtIGNvbG9yMSAtIFRoZSBmaXJzdCBjb2xvciB1c2VkIHRvIGNyZWF0ZSB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBjb2xvcjIgLSBUaGUgc2Vjb25kIGNvbG9yIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQotICogCi0gKiAqLwotc3RhdGljIEltYWdlIGNyZWF0ZUltYWdlKERldmljZSBkZXZpY2UsIENvbG9yIGNvbG9yMSwgQ29sb3IgY29sb3IyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkZXZpY2UsIHdpZHRoLCBoZWlnaHQpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCVBhdHRlcm4gcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgcmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGggLSAxLAotCQkJCXJlY3QuaGVpZ2h0IC0gMSwgY29sb3IxLCBjb2xvcjIpOwotCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCWdjLmZpbGxSZWN0YW5nbGUocmVjdCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZShyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCAtIDEsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0JZ2MuZGlzcG9zZSgpOwotCXBhdHRlcm4uZGlzcG9zZSgpOwotCXJldHVybiBpbWFnZTsKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGFuIGltYWdlIGJhc2VkIG9uIHRoZSBjb2xvciBwcm92aWRlZCBhbmQgcmV0dXJucyBpdC4KLSAqIAotICogQHBhcmFtIGRldmljZSAtIFRoZSBEZXZpY2UKLSAqIEBwYXJhbSBjb2xvciAtIFRoZSBjb2xvciB1c2VkIHRvIGNyZWF0ZSB0aGUgaW1hZ2UKLSAqIAotICogKi8KLXN0YXRpYyBJbWFnZSBjcmVhdGVJbWFnZShEZXZpY2UgZGV2aWNlLCBDb2xvciBjb2xvcikgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRldmljZSwgMTYsIDE2KTsKLQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlnYy5maWxsUmVjdGFuZ2xlKHJlY3QpOwotCWlmIChjb2xvci5lcXVhbHMoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpKSB7Ci0JCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCX0KLQlnYy5kcmF3UmVjdGFuZ2xlKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoIC0gMSwgcmVjdC5oZWlnaHQgLSAxKTsKLQlnYy5kaXNwb3NlKCk7Ci0JcmV0dXJuIGltYWdlOwotfQotCi12b2lkIGNyZWF0ZVRhYkxpc3QoQ29tcG9zaXRlIHBhcmVudCkgewotCXRhYkxpc3QgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQlBcnJheXMuc29ydCh0YWJzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCB0YWIwLCBPYmplY3QgdGFiMSkgewotCQkJcmV0dXJuICgoR3JhcGhpY3NUYWIpdGFiMCkuZ2V0VGV4dCgpLmNvbXBhcmVUbygoKEdyYXBoaWNzVGFiKXRhYjEpLmdldFRleHQoKSk7Ci0JCX0KLQl9KTsKLQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7Ci0JCUdyYXBoaWNzVGFiIHRhYiA9IHRhYnNbaV07Ci0JCXNldC5hZGQodGFiLmdldENhdGVnb3J5KCkpOwotCX0KLQlTdHJpbmdbXSBjYXRlZ29yaWVzID0gbmV3IFN0cmluZ1tzZXQuc2l6ZSgpXTsKLQlzZXQudG9BcnJheShjYXRlZ29yaWVzKTsKLQlBcnJheXMuc29ydChjYXRlZ29yaWVzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIHRleHQgPSBjYXRlZ29yaWVzW2ldOwotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRhYkxpc3QsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KHRleHQpOwotCX0KLQl0YWJzX2luX29yZGVyID0gbmV3IEFycmF5TGlzdCgpOwotCVRyZWVJdGVtW10gaXRlbXMgPSB0YWJMaXN0LmdldEl0ZW1zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgdGFicy5sZW5ndGg7IGorKykgewotCQkJR3JhcGhpY3NUYWIgdGFiID0gdGFic1tqXTsKLQkJCWlmIChpdGVtLmdldFRleHQoKS5lcXVhbHModGFiLmdldENhdGVnb3J5KCkpKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCWl0ZW0xLnNldFRleHQodGFiLmdldFRleHQoKSk7Ci0JCQkJaXRlbTEuc2V0RGF0YSh0YWIpOwotCQkJCXRhYnNfaW5fb3JkZXIuYWRkKHRhYik7Ci0JCQl9Ci0JCX0KLQl9Ci0JdGFiTGlzdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJR3JhcGhpY3NUYWIgZ3QgPSAoR3JhcGhpY3NUYWIpaXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKGd0ID09IHRhYikgcmV0dXJuOwotCQkJCXNldFRhYigoR3JhcGhpY3NUYWIpaXRlbS5nZXREYXRhKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyB0aGUgbXVsdGktbGluZSB0ZXh0IHdpZGdldCB0aGF0IHdpbGwgY29udGFpbiB0aGUgdGFiIGRlc2NyaXB0aW9uLiAKLSAqICovCi12b2lkIGNyZWF0ZVRhYkRlc2MoQ29tcG9zaXRlIHBhcmVudCkgewotCXRhYkRlc2MgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5XUkFQIHwgU1dULkJPUkRFUik7Ci0JdGFiRGVzYy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JdGFiRGVzYy5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotfQotCi0vKioKLSAqIEluaXRpYWxpemVzIHRoZSBHcmFwaGljc1RhYiBpbnN0YW5jZXMgdGhhdCB3aWxsIGJlIGNvbnRhaW5lZCBpbiBHcmFwaGljc0V4YW1wbGUuCi0gKiAqLwotR3JhcGhpY3NUYWJbXSBjcmVhdGVUYWJzKCkgewotCXJldHVybiBuZXcgR3JhcGhpY3NUYWJbXSB7Ci0JCW5ldyBMaW5lVGFiKHRoaXMpLAotCQluZXcgU3RhclBvbHlUYWIodGhpcyksCi0JCXRhYiA9IG5ldyBJbnRyb1RhYih0aGlzKSwKLQkJbmV3IEJsYWNrSG9sZVRhYih0aGlzKSwKLQkJbmV3IEFscGhhVGFiKHRoaXMpLAotCQluZXcgQmFsbFRhYih0aGlzKSwKLQkJbmV3IENvdW50RG93blRhYih0aGlzKSwKLQkJbmV3IEN1cnZlc1NXVFRhYih0aGlzKSwKLQkJbmV3IEN1cnZlc1RhYih0aGlzKSwKLQkJbmV3IEN1c3RvbUZvbnRUYWIodGhpcyksCi0JCW5ldyBGb250Qm91bmNlVGFiKHRoaXMpLAotCQluZXcgR3JhZGllbnRUYWIodGhpcyksCi0JCW5ldyBJbWFnZVRyYW5zZm9ybVRhYih0aGlzKSwKLQkJbmV3IFNoYXBlc1RhYih0aGlzKSwKLQkJbmV3IE1hemVUYWIodGhpcyksCi0JCW5ldyBSR0JUYWIodGhpcyksCi0JCW5ldyBTcGlyYWxUYWIodGhpcyksCi0JCW5ldyBDYXJkc1RhYih0aGlzKSwKLQkJbmV3IExpbmVDYXBUYWIodGhpcyksCi0JCW5ldyBJbnRlcnBvbGF0aW9uVGFiKHRoaXMpLAotCQluZXcgUGF0aENsaXBwaW5nVGFiKHRoaXMpLAotCQluZXcgUGF0aENsaXBwaW5nQW5pbVRhYih0aGlzKSwKLQkJbmV3IExpbmVTdHlsZVRhYih0aGlzKSwKLQkJbmV3IExpbmVKb2luVGFiKHRoaXMpLAotCQluZXcgUmVnaW9uQ2xpcHBpbmdUYWIodGhpcyksCi0JCW5ldyBDdXN0b21BbHBoYVRhYih0aGlzKSwKLQkJbmV3IFRleHRBbnRpYWxpYXNUYWIodGhpcyksCi0JCW5ldyBHcmFwaGljQW50aWFsaWFzVGFiKHRoaXMpLAotCQluZXcgSW1hZ2VGbGlwVGFiKHRoaXMpLAotCQluZXcgSW1hZ2VTY2FsZVRhYih0aGlzKSwKLQkJbmV3IFBhdGhUYWIodGhpcyksCi0JfTsKLX0KLQotLyoqCi0gKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhlIHJlY2VpdmVyLgotICovCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmICh0YWJzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlHcmFwaGljc1RhYiB0YWIgPSB0YWJzW2ldOwotCQkJdGFiLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQl0YWJzID0gbnVsbDsKLQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChyZXNvdXJjZXMuZ2V0KGkpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkoKFJlc291cmNlKXJlc291cmNlcy5nZXQoaSkpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQlyZXNvdXJjZXMgPSBudWxsOwotCQotCWlmIChiYWNrTWVudSAhPSBudWxsKSB7Ci0JCWJhY2tNZW51LmRpc3Bvc2UoKTsKLQkJYmFja01lbnUgPSBudWxsOwotCX0KLX0KLQotVHJlZUl0ZW0gZmluZEl0ZW1CeURhdGEoVHJlZUl0ZW1bXSBpdGVtcywgT2JqZWN0IGRhdGEpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJaWYgKGl0ZW0uZ2V0RGF0YSgpID09IGRhdGEpIHJldHVybiBpdGVtOwotCQlpdGVtID0gZmluZEl0ZW1CeURhdGEoaXRlbS5nZXRJdGVtcygpLCBkYXRhKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkgcmV0dXJuIGl0ZW07Ci0JfQotCXJldHVybiBudWxsOwotfQotCi0vKioKLSAqIEdldHMgdGhlIGN1cnJlbnQgdGFiLgotICovCi1wdWJsaWMgR3JhcGhpY3NUYWIgZ2V0VGFiKCkgewotCXJldHVybiB0YWI7Ci19Ci0KLS8qKgotICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLSAqIFJldHVybnMgdGhlIGtleSBpZiBub3QgZm91bmQuCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCXRyeSB7Ci0JCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIGtleTsKLQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiAiISIgKyBrZXkgKyAiISI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0JCQkKLX0KLQotc3RhdGljIEltYWdlIGxvYWRJbWFnZSAoRGV2aWNlIGRldmljZSwgQ2xhc3MgY2xhenosIFN0cmluZyBzdHJpbmcpIHsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtIChzdHJpbmcpOwotCWlmIChzdHJlYW0gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlIChkZXZpY2UsIHN0cmVhbSk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSAoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHt9Ci0JfQotCXJldHVybiBpbWFnZTsKLX0KLQotSW1hZ2UgbG9hZEltYWdlKERldmljZSBkZXZpY2UsIFN0cmluZyBuYW1lKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBsb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsIG5hbWUpOwotCWlmIChpbWFnZSAhPSBudWxsKSByZXNvdXJjZXMuYWRkKGltYWdlKTsKLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuKGZpbmFsIERpc3BsYXkgZGlzcGxheSkgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYXBoaWNzRXhhbXBsZSIpKTsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlID0gbmV3IEdyYXBoaWNzRXhhbXBsZShzaGVsbCk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlleGFtcGxlLmRpc3Bvc2UoKTsKLQkJfQotCX0pOwkKLQlzaGVsbC5vcGVuKCk7Ci0JcmV0dXJuIHNoZWxsOwotfQotCi0vKioKLSAqIFJlZHJhd3MgdGhlIGN1cnJlbnQgdGFiLgotICovCi1wdWJsaWMgdm9pZCByZWRyYXcoKSB7Ci0JY2FudmFzLnJlZHJhdygpOwotfQotCi0vKioKLSAqIFNldHMgd2hldGVyIHRoZSBjYW52YXMgaXMgZG91YmxlIGJ1ZmZlcmVkIG9yIG5vdC4KLSAqLwotcHVibGljIHZvaWQgc2V0RG91YmxlQnVmZmVyZWQoYm9vbGVhbiBkb3VibGVCdWZmZXJlZCkgewotCWRiSXRlbS5zZXRTZWxlY3Rpb24oZG91YmxlQnVmZmVyZWQpOwotCXJlY3JlYXRlQ2FudmFzKCk7Ci19Ci0KLS8qKgotICogR3JhYnMgaW5wdXQgZm9jdXMuCi0gKi8KLXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCXRhYkxpc3Quc2V0Rm9jdXMoKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBjdXJyZW50IHRhYi4KLSAqLwotcHVibGljIHZvaWQgc2V0VGFiKEdyYXBoaWNzVGFiIHRhYikgewotCUNvbnRyb2xbXSBjaGlsZHJlbiA9IHRhYkNvbnRyb2xQYW5lbC5nZXRDaGlsZHJlbigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW5baV07Ci0JCWNvbnRyb2wuZGlzcG9zZSgpOwotCX0KLQlpZiAodGhpcy50YWIgIT0gbnVsbCkgdGhpcy50YWIuZGlzcG9zZSgpOwotCXRoaXMudGFiID0gdGFiOwotCWlmICh0YWIgIT0gbnVsbCkgewotCQlzZXREb3VibGVCdWZmZXJlZCh0YWIuZ2V0RG91YmxlQnVmZmVyZWQoKSk7Ci0JCXRhYi5jcmVhdGVDb250cm9sUGFuZWwodGFiQ29udHJvbFBhbmVsKTsKLQkJdGFiRGVzYy5zZXRUZXh0KHRhYi5nZXREZXNjcmlwdGlvbigpKTsKLQl9IGVsc2UgewotCQl0YWJEZXNjLnNldFRleHQoIiIpOwotCX0KLQlGb3JtRGF0YSBkYXRhID0gKEZvcm1EYXRhKXRhYkNvbnRyb2xQYW5lbC5nZXRMYXlvdXREYXRhKCk7Ci0JY2hpbGRyZW4gPSB0YWJDb250cm9sUGFuZWwuZ2V0Q2hpbGRyZW4oKTsKLQlpZiAoY2hpbGRyZW4ubGVuZ3RoICE9IDApIHsKLQkJZGF0YS50b3AgPSBudWxsOwotCX0gZWxzZSB7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLU1BUkdJTik7Ci0JfQotCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JaWYgKHRhYiAhPSBudWxsKSB7Ci0JCVRyZWVJdGVtW10gc2VsZWN0aW9uID0gdGFiTGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCB8fCBzZWxlY3Rpb25bMF0uZ2V0RGF0YSgpICE9IHRhYikgewotCQkJVHJlZUl0ZW0gaXRlbSA9IGZpbmRJdGVtQnlEYXRhKHRhYkxpc3QuZ2V0SXRlbXMoKSwgdGFiKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHRhYkxpc3Quc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW19KTsKLQkJfQotCX0KLQljYW52YXMucmVkcmF3KCk7Ci19Ci0KLS8qKgotICogU3RhcnRzIHRoZSBhbmltYXRpb24gaWYgdGhlIGFuaW1hdGUgZmxhZyBpcyBzZXQuCi0gKi8KLXZvaWQgc3RhcnRBbmltYXRpb25UaW1lcigpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCWRpc3BsYXkudGltZXJFeGVjKFRJTUVSLCBuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChjYW52YXMuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQlpbnQgdGltZW91dCA9IFRJTUVSOwotCQkJR3JhcGhpY3NUYWIgdGFiID0gZ2V0VGFiKCk7Ci0JCQlpZiAodGFiIGluc3RhbmNlb2YgQW5pbWF0ZWRHcmFwaGljc1RhYikgewotCQkJCUFuaW1hdGVkR3JhcGhpY3NUYWIgYW5pbVRhYiA9IChBbmltYXRlZEdyYXBoaWNzVGFiKSB0YWI7CQotCQkJCWlmIChhbmltYXRlICYmIGFuaW1UYWIuZ2V0QW5pbWF0aW9uKCkpIHsKLQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCQlhbmltVGFiLm5leHQocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJCQljYW52YXMucmVkcmF3KCk7Ci0JCQkJCWNhbnZhcy51cGRhdGUoKTsKLQkJCQl9Ci0JCQkJdGltZW91dCA9ICBhbmltVGFiLmdldEFuaW1hdGlvblRpbWUoKTsKLQkJCX0KLQkJCWRpc3BsYXkudGltZXJFeGVjKHRpbWVvdXQsIHRoaXMpOwotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEdyYXBoaWNzRXhhbXBsZSgpLm9wZW4oZGlzcGxheSk7Ci0Jd2hpbGUgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMmRhZGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIG9uZSB1c2VkIGZvciBjcmVhdGluZyBhIGdyYXBoaWMuIE92ZXJyaWRlIHRoZSBwYWludCgpCi0gKiBtZXRob2QgdG8gY3JlYXRlIHRoZSBkcmF3aW5nLiBUbyBjcmVhdGUgYW4gYW5pbWF0ZWQgZ3JhcGhpYywgdXNlIHRoZQotICogQW5pbWF0ZWRHcmFwaGljc1RhYiBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYXBoaWNzVGFiIHsKLQkKLUdyYXBoaWNzRXhhbXBsZSBleGFtcGxlOwotCi1wdWJsaWMgR3JhcGhpY3NUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQl0aGlzLmV4YW1wbGUgPSBleGFtcGxlOwotfQotCi0vKiogCi0gKiBDcmVhdGVzIHRoZSB3aWRnZXRzIHVzZWQgdG8gY29udHJvbCB0aGUgZHJhd2luZy4KLSAqLwotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLX0KLQotLyoqIAotICogRGlzcG9zZXMgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhlIHJlY2VpdmVyLgotICovCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotfQotCi0vKiogCi0gKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgbmFtZS4KLSAqLwotcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUZXh0KCk7Ci0KLS8qKiAKLSAqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBjYXRlZ29yeS4KLSAqLwotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNaXNjIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotLyoqCi0gKiAgQW5zd2VyIHRoZSByZWNlaXZlcidzIGRlc2NyaXB0aW9uLgotICogKi8KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuICIiOwotfQotCi0vKioKLSAqICBBbnN3ZXIgd2hldGhlciB0aGUgcmVjZWl2ZXIncyBkcmF3aW5nIHNob3VsZCBiZSBkb3VibGUgYnVmZmVyZXIuCi0gKi8KLXB1YmxpYyBib29sZWFuIGdldERvdWJsZUJ1ZmZlcmVkKCkgewotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqIAotICogUGFpbnQgdGhlIHJlY2VpdmVyIGludG8gdGhlIHNwZWNpZmllZCBHQy4gCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW1hZ2VGbGlwVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbWFnZUZsaXBUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5NTc5Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbWFnZUZsaXBUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgaG93IGFuIGltYWdlIGNhbiBiZSBmbGlwcGVkIGluIHZhcmlvdXMgZmFzaGlvbnMuIAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VGbGlwVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCi1wdWJsaWMgSW1hZ2VGbGlwVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmxpcCIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmxpcERlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQlJbWFnZSBpbWFnZSA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJob3VzZXMucG5nIik7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCQotCS8vIHRvcAotCVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgod2lkdGgtYm91bmRzLndpZHRoKS8yLCAoaGVpZ2h0LWJvdW5kcy5oZWlnaHQpLzIpOwotCXRyYW5zZm9ybS5zY2FsZSgxLCAtMSk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQotCS8vIGRyYXcgdGhlIG9yaWdpbmFsIGltYWdlCi0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQkKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCS8vIGJvdHRvbQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKCh3aWR0aC1ib3VuZHMud2lkdGgpLzIsIDIqYm91bmRzLmhlaWdodCArIChoZWlnaHQtYm91bmRzLmhlaWdodCkvMik7Ci0JdHJhbnNmb3JtLnNjYWxlKDEsIC0xKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkKLQkvLyBkcmF3IHRoZSBvcmlnaW5hbCBpbWFnZQotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JCi0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQkvLyBsZWZ0Ci0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoKHdpZHRoLWJvdW5kcy53aWR0aCkvMiwgKGhlaWdodC1ib3VuZHMuaGVpZ2h0KS8yKTsKLQl0cmFuc2Zvcm0uc2NhbGUoLTEsIDEpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQotCS8vIGRyYXcgdGhlIG9yaWdpbmFsIGltYWdlCi0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQkKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCS8vIHJpZ2h0Ci0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoMipib3VuZHMud2lkdGggKyAod2lkdGgtYm91bmRzLndpZHRoKS8yLCAoaGVpZ2h0LWJvdW5kcy5oZWlnaHQpLzIpOwotCXRyYW5zZm9ybS5zY2FsZSgtMSwgMSk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCi0JLy8gZHJhdyB0aGUgb3JpZ2luYWwgaW1hZ2UKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCQotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JZ2Muc2V0VHJhbnNmb3JtKG51bGwpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgKHdpZHRoLWJvdW5kcy53aWR0aCkvMiwgKGhlaWdodC1ib3VuZHMuaGVpZ2h0KS8yKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiBhIHZhbGlkIGZvbnQgZm9yIHRoZSBob3N0IHBsYXRmb3JtLgotICovCi1zdGF0aWMgU3RyaW5nIGdldFBsYXRmb3JtRm9udCgpIHsKLQlpZihTV1QuZ2V0UGxhdGZvcm0oKSA9PSAid2luMzIiKSB7Ci0JCXJldHVybiAiQXJpYWwiOwkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJtb3RpZiIpIHsKLQkJcmV0dXJuICJIZWx2ZXRpY2EiOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiZ3RrIikgewotCQlyZXR1cm4gIkJhZWttdWsgQmF0YW5nIjsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImNhcmJvbiIpIHsKLQkJcmV0dXJuICJBcmlhbCI7Ci0JfSBlbHNlIHsgLy8gcGhvdG9uLCBldGMgLi4uCi0JCXJldHVybiAiVmVyZGFuYSI7Ci0JfQotfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbWFnZVNjYWxlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbWFnZVNjYWxlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NWY4Y2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW1hZ2VTY2FsZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIGhvdyBhbiBpbWFnZSBjYW4gYmUgc2NhbGVkLiAKLSAqLwotcHVibGljIGNsYXNzIEltYWdlU2NhbGVUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0KLXB1YmxpYyBJbWFnZVNjYWxlVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2NhbGUiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNjYWxlRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCUltYWdlIGltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImhvdXNlcy5wbmciKTsKLQkKLQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JUmVjdGFuZ2xlIGNhbnZhc0JvdW5kcyA9IGV4YW1wbGUuY2FudmFzLmdldEJvdW5kcygpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCAwLCAwLCBjYW52YXNCb3VuZHMud2lkdGgsIGNhbnZhc0JvdW5kcy5oZWlnaHQpOwotCQotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW1hZ2VUcmFuc2Zvcm1UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ltYWdlVHJhbnNmb3JtVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTc3NGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW1hZ2VUcmFuc2Zvcm1UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdHJhbnNmb3JtYXRpb25zLCBzdWNoIGFzIHNjYWxpbmcsIHJvdGF0aW9uLCBhbmQKLSAqIGludmVydC4gIEl0IGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IHZhbHVlcyBmb3Igc2NhbGluZyBhbmQgcm90YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZVRyYW5zZm9ybVRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQotCXByaXZhdGUgU3Bpbm5lciByb3RhdGVTcGlubmVyLCBzY2FsZVNwaW5uZXJYLCBzY2FsZVNwaW5uZXJZOwotCXByaXZhdGUgQnV0dG9uIGludmVydEJ1dHRvbjsKLQotLyoqCi0gKiBDb25zdHJ1Y3RvcgotICogQHBhcmFtIGV4YW1wbGUgQSBHcmFwaGljc0V4YW1wbGUKLSAqLwotcHVibGljIEltYWdlVHJhbnNmb3JtVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHJhbnNmb3JtIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUcmFuc2Zvcm1JbWdEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLS8qKgotICogVGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhlIHRhYi4gVGhlIGNhbGwgdG8gdGhlCi0gKiBjcmVhdGVDb250cm9sUGFuZWwgbWV0aG9kIGluIHRoZSBzdXBlciBjbGFzcyBjcmVhdGUgdGhlIGNvbnRyb2xzIHRoYXQgYXJlCi0gKiBkZWZpbmVkIGluIHRoZSBzdXBlciBjbGFzcy4KLSAqIAotICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbXBvc2l0ZSAKLSAqLwotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkKLQlDb21wb3NpdGUgY29tcDsKLQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCi0JLy8gY3JlYXRlIHNwaW5uZXIgZm9yIHRoZSByb3RhdGlvbiBhbmdsZQotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotIAotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUm90YXRlIikpOyAvLyROT04tTkxTLTEkCi0Jcm90YXRlU3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0Jcm90YXRlU3Bpbm5lci5zZXRTZWxlY3Rpb24oMCk7Ci0Jcm90YXRlU3Bpbm5lci5zZXRNaW5pbXVtKDApOwotCXJvdGF0ZVNwaW5uZXIuc2V0TWF4aW11bSgzNjApOwotCXJvdGF0ZVNwaW5uZXIuc2V0SW5jcmVtZW50KDEwKTsKLQlyb3RhdGVTcGlubmVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsJCi0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNyZWF0ZSBhIHNsaWRlciBmb3Igc2NhbGluZyBhbG9uZyB0aGUgeCBheGlzCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ4c2NhbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQlzY2FsZVNwaW5uZXJYID0gbmV3IFNwaW5uZXIoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlzY2FsZVNwaW5uZXJYLnNldERpZ2l0cygyKTsKLQlzY2FsZVNwaW5uZXJYLnNldE1pbmltdW0oMSk7Ci0Jc2NhbGVTcGlubmVyWC5zZXRNYXhpbXVtKDUwMCk7Ci0Jc2NhbGVTcGlubmVyWC5zZXRTZWxlY3Rpb24oNzUpOwotCXNjYWxlU3Bpbm5lclguYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewkKLQkJCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gY3JlYXRlIGEgc2xpZGVyIGZvciBzY2FsaW5nIGFsb25nIHRoZSB5IGF4aXMKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygieXNjYWxlIikpOyAvLyROT04tTkxTLTEkCi0Jc2NhbGVTcGlubmVyWSA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0Jc2NhbGVTcGlubmVyWS5zZXREaWdpdHMoMik7Ci0Jc2NhbGVTcGlubmVyWS5zZXRNaW5pbXVtKDEpOwotCXNjYWxlU3Bpbm5lclkuc2V0TWF4aW11bSg1MDApOwotCXNjYWxlU3Bpbm5lclkuc2V0U2VsZWN0aW9uKDc1KTsKLQlzY2FsZVNwaW5uZXJZLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsJCi0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNyZWF0ZSBhIGJ1dHRvbiBmb3IgImludmVydCIKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlpbnZlcnRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5UT0dHTEUpOwotCWludmVydEJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW52ZXJ0IikpOyAvLyROT04tTkxTLTEkCi0JaW52ZXJ0QnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsJCi0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5HcmFwaGljc1RhYiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsIGludCwgaW50KQotICovCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JSW1hZ2UgaW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAiYWNlX2NsdWIuanBnIik7IAotCi0JVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQkKLQkvLyBzY2FsZSBpbWFnZQotCXRyYW5zZm9ybS5zY2FsZShzY2FsZVNwaW5uZXJYLmdldFNlbGVjdGlvbigpLzEwMGYsIHNjYWxlU3Bpbm5lclkuZ2V0U2VsZWN0aW9uKCkvMTAwZik7Ci0JCi0JLy8gcm90YXRlIG9uIGNlbnRlciBvZiBpbWFnZQotCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZShyZWN0LndpZHRoLzIsIHJlY3QuaGVpZ2h0LzIpOwotCXRyYW5zZm9ybS5yb3RhdGUocm90YXRlU3Bpbm5lci5nZXRTZWxlY3Rpb24oKSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgtcmVjdC53aWR0aC8yLCAtcmVjdC5oZWlnaHQvMik7Ci0JCi0JaWYoaW52ZXJ0QnV0dG9uLmdldFNlbGVjdGlvbigpKXsKLQkJdHJhbnNmb3JtLmludmVydCgpOwotCX0KLQkKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCWdjLmRyYXdSb3VuZFJlY3RhbmdsZSgwLCAwLCBpbWFnZS5nZXRCb3VuZHMoKS53aWR0aCwgCi0JCQkJCQkJCWltYWdlLmdldEJvdW5kcygpLmhlaWdodCwgMjIsIDIyKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW50ZXJwb2xhdGlvblRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW50ZXJwb2xhdGlvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWVlZjg2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ludGVycG9sYXRpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBzaG93cyB0aGUgZWZmZWN0cyBvZiBhcHBseWluZyB2YXJpb3VzIGludGVycG9sYXRpb24gYWxnb3JpdGhtcyB0bwotICogaW1hZ2VzIHRoYXQgaGF2ZSBiZWVuIHN0cmV0Y2hlZCBvciBzaHJ1bmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcnBvbGF0aW9uVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCQotCUNvbWJvIGltYWdlQ2I7CS8vIGNvbWJvIGZvciBzZWxlY3RpbmcgaW1hZ2VzCi0KLXB1YmxpYyBJbnRlcnBvbGF0aW9uVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW50ZXJwb2xhdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VJbnRlcnBvbGF0aW9uRGVzYyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCi0JQ29tcG9zaXRlIGNvbXA7Ci0JR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQotCS8vIGNyZWF0ZSBkcm9wIGRvd24gY29tYm8gCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZSIpKTsgLy8kTk9OLU5MUy0xJAotCWltYWdlQ2IgPSBuZXcgQ29tYm8oY29tcCwgU1dULkRST1BfRE9XTik7Ci0JaW1hZ2VDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJIb3VzZSIpKTsgLy8kTk9OLU5MUy0xJAotCWltYWdlQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUXVlc3Rpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQlpbWFnZUNiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhc2siKSk7IC8vJE5PTi1OTFMtMSQKLQlpbWFnZUNiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQlpbWFnZUNiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1YmUiKSk7IC8vJE5PTi1OTFMtMSQKLQlpbWFnZUNiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpKTsgLy8kTk9OLU5MUy0xJAotCWltYWdlQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3ZhbHMiKSk7IC8vJE5PTi1OTFMtMSQKLQlpbWFnZUNiLnNlbGVjdCgwKTsKLQlpbWFnZUNiLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0KLQlmbG9hdCBzY2FsZVggPSAxMGY7Ci0JZmxvYXQgc2NhbGVZID0gMTBmOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQlzd2l0Y2ggKGltYWdlQ2IuZ2V0U2VsZWN0aW9uSW5kZXgoKSkgewotCQotCWNhc2UgMDoKLQkJaW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAiaG9tZV9uYXYuZ2lmIik7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJaW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAiaGVscC5naWYiKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpbWFnZSA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJ0YXNrLmdpZiIpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCWltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImZvbnQuZ2lmIik7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJaW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAiY3ViZS5wbmciKTsKLQkJc2NhbGVYID0gMC43NWY7Ci0JCXNjYWxlWSA9IDAuNWY7Ci0JCWJyZWFrOwotCWNhc2UgNToKLQkJaW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAic3d0LnBuZyIpOwotCQlzY2FsZVggPSAwLjRmOwotCQlzY2FsZVkgPSAwLjhmOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCWltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgIm92YWxzLnBuZyIpOwotCQlzY2FsZVggPSAxLjFmOwotCQlzY2FsZVkgPSAwLjVmOwotCQlicmVhazsKLQl9Ci0JCi0JUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCQotCS8vIGRyYXcgdGhlIG9yaWdpbmFsIGltYWdlCi0JZ2MuZHJhd0ltYWdlKGltYWdlLCAod2lkdGgtYm91bmRzLndpZHRoKS8yLCAyMCk7CQotCQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250KCksIDIwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCQotCS8vIHdyaXRlIHNvbWUgdGV4dCBiZWxvdyB0aGUgb3JpZ2luYWwgaW1hZ2UKLQlTdHJpbmcgdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3JpZ2luYWxJbWciKTsgLy8kTk9OLU5MUy0xJAotCVBvaW50IHNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7CQotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgMjUgKyBib3VuZHMuaGVpZ2h0LCB0cnVlKTsKLQkKLQlUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoKHdpZHRoIC0gKGJvdW5kcy53aWR0aCAqIHNjYWxlWCArIDEwKSAqIDQpIC8gMiwgMjUgKyBib3VuZHMuaGVpZ2h0ICsgc2l6ZS55ICsKLQkJCQkoaGVpZ2h0IC0gKDI1ICsgYm91bmRzLmhlaWdodCArIHNpemUueSArIGJvdW5kcy5oZWlnaHQqc2NhbGVZKSkgLyAyKTsKLQl0cmFuc2Zvcm0uc2NhbGUoc2NhbGVYLCBzY2FsZVkpOwotCi0JLy8gLS0tIGRyYXcgc3RyaW5ncyAtLS0KLQlmbG9hdFtdIHBvaW50ID0gbmV3IGZsb2F0WzJdOwotCXRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vbmUiKTsgLy8kTk9OLU5MUy0xJAotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7CQotCXBvaW50WzBdID0gKHNjYWxlWCpib3VuZHMud2lkdGggKyA1IC0gc2l6ZS54KS8oMipzY2FsZVgpOwotCXBvaW50WzFdID0gYm91bmRzLmhlaWdodDsKLQl0cmFuc2Zvcm0udHJhbnNmb3JtKHBvaW50KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsIChpbnQpcG9pbnRbMF0sIChpbnQpcG9pbnRbMV0sIHRydWUpOwotCQotCXRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxvdyIpOyAvLyROT04tTkxTLTEkCi0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlwb2ludFswXSA9IChzY2FsZVgqYm91bmRzLndpZHRoICsgNSAtIHNpemUueCkvKDIqc2NhbGVYKSArIGJvdW5kcy53aWR0aDsKLQlwb2ludFsxXSA9IGJvdW5kcy5oZWlnaHQ7Ci0JdHJhbnNmb3JtLnRyYW5zZm9ybShwb2ludCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAoaW50KXBvaW50WzBdLCAoaW50KXBvaW50WzFdLCB0cnVlKTsKLQkKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEZWZhdWx0Iik7IC8vJE5PTi1OTFMtMSQKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCXBvaW50WzBdID0gKHNjYWxlWCpib3VuZHMud2lkdGggKyA1IC0gc2l6ZS54KS8oMipzY2FsZVgpICsgMipib3VuZHMud2lkdGg7Ci0JcG9pbnRbMV0gPSBib3VuZHMuaGVpZ2h0OwotCXRyYW5zZm9ybS50cmFuc2Zvcm0ocG9pbnQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKGludClwb2ludFswXSwgKGludClwb2ludFsxXSwgdHJ1ZSk7Ci0JCi0JdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSGlnaCIpOyAvLyROT04tTkxTLTEkCi0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlwb2ludFswXSA9IChzY2FsZVgqYm91bmRzLndpZHRoICsgNSAtIHNpemUueCkvKDIqc2NhbGVYKSArIDMqYm91bmRzLndpZHRoOwotCXBvaW50WzFdID0gYm91bmRzLmhlaWdodDsKLQl0cmFuc2Zvcm0udHJhbnNmb3JtKHBvaW50KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsIChpbnQpcG9pbnRbMF0sIChpbnQpcG9pbnRbMV0sIHRydWUpOwotCi0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQotCS8vIC0tLSBkcmF3IGltYWdlcyAtLS0KLQkKLQkvLyBubyBpbnRlcnBvbGF0aW9uCi0JZ2Muc2V0SW50ZXJwb2xhdGlvbihTV1QuTk9ORSk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQkKLQkvLyBsb3cgaW50ZXJwb2xhdGlvbgotCWdjLnNldEludGVycG9sYXRpb24oU1dULkxPVyk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlLCBib3VuZHMud2lkdGgsIDApOwotCi0JLy8gZGVmYXVsdCBpbnRlcnBvbGF0aW9uCi0JZ2Muc2V0SW50ZXJwb2xhdGlvbihTV1QuREVGQVVMVCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlLCAyKmJvdW5kcy53aWR0aCwgMCk7Ci0JCi0JLy8gaGlnaCBpbnRlcnBvbGF0aW9uCi0JZ2Muc2V0SW50ZXJwb2xhdGlvbihTV1QuSElHSCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlLCAzKmJvdW5kcy53aWR0aCwgMCk7Ci0KLQlmb250LmRpc3Bvc2UoKTsKLQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSB2YWxpZCBmb250IGZvciB0aGUgaG9zdCBwbGF0Zm9ybS4KLSAqLwotc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybUZvbnQoKSB7Ci0JaWYoU1dULmdldFBsYXRmb3JtKCkgPT0gIndpbjMyIikgewotCQlyZXR1cm4gIkFyaWFsIjsJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAibW90aWYiKSB7Ci0JCXJldHVybiAiSGVsdmV0aWNhIjsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImd0ayIpIHsKLQkJcmV0dXJuICJCYWVrbXVrIEJhdGFuZyI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJjYXJib24iKSB7Ci0JCXJldHVybiAiQXJpYWwiOwotCX0gZWxzZSB7IC8vIHBob3RvbiwgZXRjIC4uLgotCQlyZXR1cm4gIlZlcmRhbmEiOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ludHJvVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbnRyb1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzE2ZWZmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ludHJvVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEludHJvVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JCi0JRm9udCBmb250OwotCUltYWdlIGltYWdlOwotCVJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0JZmxvYXQgeCwgeTsKLSAgICBmbG9hdCBpbmNYID0gMTAuMGY7Ci0JZmxvYXQgaW5jWSA9IDUuMGY7Ci0JaW50IHRleHRXaWR0aCwgdGV4dEhlaWdodDsKLQlTdHJpbmcgdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU1dUIik7Ci0JCi1wdWJsaWMgSW50cm9UYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCWltYWdlID0gbnVsbDsKLQlpZiAoZm9udCAhPSBudWxsKSBmb250LmRpc3Bvc2UoKTsKLQlmb250ID0gbnVsbDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbnRyb2R1Y3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU1dUIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbnRyb2R1Y3Rpb25EZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgeCArPSBpbmNYOwotICAgIHkgKz0gaW5jWTsKLQlmbG9hdCByYW5kb20gPSAoZmxvYXQpTWF0aC5yYW5kb20oKTsgCi0gICAgaWYgKHggKyB0ZXh0V2lkdGggPiB3aWR0aCkgewotICAgICAgICB4ID0gd2lkdGggLSB0ZXh0V2lkdGg7Ci0gICAgICAgIGluY1ggPSByYW5kb20gKiAtd2lkdGggLyAxNiAtIDE7Ci0gICAgfQotICAgIGlmICh4IDwgMCkgewotICAgICAgICB4ID0gMDsKLSAgICAgICAgaW5jWCA9IHJhbmRvbSAqIHdpZHRoIC8gMTYgKyAxOwotICAgIH0KLSAgICBpZiAoeSArIHRleHRIZWlnaHQgPiBoZWlnaHQpIHsKLSAgICAgICAgeSA9IChoZWlnaHQgLSB0ZXh0SGVpZ2h0KS0gMjsKLSAgICAgICAgaW5jWSA9IHJhbmRvbSAqIC1oZWlnaHQgLyAxNiAtIDE7Ci0gICAgfQotICAgIGlmICh5IDwgMCkgewotICAgICAgICB5ID0gMDsKLSAgICAgICAgaW5jWSA9IHJhbmRvbSAqIGhlaWdodCAvIDE2ICsgMTsKLSAgICB9Ci19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JaWYgKGltYWdlID09IG51bGwpIHsKLQkJaW1hZ2UgPSBleGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsICJpcm1hb3MuanBnIik7Ci0JCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCUZvbnREYXRhIGZkID0gZGV2aWNlLmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCQlmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBmZC5nZXROYW1lKCksIHJlY3QuaGVpZ2h0IC8gNCwgU1dULkJPTEQpOwotCQlnYy5zZXRGb250KGZvbnQpOwotCQlQb2ludCBzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCQl0ZXh0V2lkdGggPSBzaXplLng7Ci0JCXRleHRIZWlnaHQgPSBzaXplLnk7Ci0JfQotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5hZGRTdHJpbmcodGV4dCwgeCwgeSwgZm9udCk7Ci0JZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQlnYy5zZXRDbGlwcGluZygoUmVjdGFuZ2xlKW51bGwpOwotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lQ2FwVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lQ2FwVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOGZmYTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZUNhcFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRlbW9uc3RyYXRlcyB2YXJpb3VzIGxpbmUgY2FwcyBhcHBsaWNhYmxlIHRvIGEgbGluZS4KLSAqLwotcHVibGljIGNsYXNzIExpbmVDYXBUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0KLQlCdXR0b24gY29sb3JCdXR0b247Ci0JR3JhcGhpY3NCYWNrZ3JvdW5kIGZvcmVncm91bmQ7Ci0JTWVudSBtZW51OwotCi1wdWJsaWMgTGluZUNhcFRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVDYXAiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVDYXBEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1lbnUgIT0gbnVsbCkgewotCQltZW51LmRpc3Bvc2UoKTsKLQkJbWVudSA9IG51bGw7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQotCUNvbXBvc2l0ZSBjb21wOwotCQkKLQkvLyBjcmVhdGUgY29sb3IgYnV0dG9uCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCi0JQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCWNtLnNldFBhdHRlcm5JdGVtcyhleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKTsKLQltZW51ID0gY20uY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCWZvcmVncm91bmQgPSBnYjsJCQotCQkJY29sb3JCdXR0b24uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCi0JLy8gaW5pdGlhbGl6ZSB0aGUgZm9yZWdyb3VuZCB0byB0aGUgM3JkIGl0ZW0gaW4gdGhlIG1lbnUgKHJlZCkKLQlmb3JlZ3JvdW5kID0gKEdyYXBoaWNzQmFja2dyb3VuZCltZW51LmdldEl0ZW0oMikuZ2V0RGF0YSgpOwotCQotCS8vIGNvbG9yIGJ1dHRvbgotCWNvbG9yQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JY29sb3JCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbi5zZXRJbWFnZShmb3JlZ3JvdW5kLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQotCS8vIGRyYXcgc2lkZSBsaW5lcwotCWdjLnNldExpbmVXaWR0aCgxKTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfRE9UKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQlnYy5kcmF3TGluZSgzKndpZHRoLzE2LCBoZWlnaHQvNiwgMyp3aWR0aC8xNiwgNSpoZWlnaHQvNik7Ci0JZ2MuZHJhd0xpbmUoMTMqd2lkdGgvMTYsIGhlaWdodC82LCAxMyp3aWR0aC8xNiwgNSpoZWlnaHQvNik7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQkKLQkvLyBkcmF3IGxhYmVscwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250KCksIDIwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCi0JU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZsYXQiKTsgLy8kTk9OLU5MUy0xJAotCVBvaW50IHNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCAzKmhlaWdodC8xMiwgdHJ1ZSk7Ci0JdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3F1YXJlIik7IC8vJE5PTi1OTFMtMSQKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwkKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIDUqaGVpZ2h0LzEyLCB0cnVlKTsKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSb3VuZCIpOyAvLyROT04tTkxTLTEkCi0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIDcqaGVpZ2h0LzEyLCB0cnVlKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCVBhdHRlcm4gcGF0dGVybiA9IG51bGw7Ci0JaWYgKGZvcmVncm91bmQuZ2V0QmdDb2xvcjEoKSAhPSBudWxsKSB7Ci0JCWdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZC5nZXRCZ0NvbG9yMSgpKTsKLQl9IGVsc2UgaWYgKGZvcmVncm91bmQuZ2V0QmdJbWFnZSgpICE9IG51bGwpIHsKLQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgZm9yZWdyb3VuZC5nZXRCZ0ltYWdlKCkpOwotCQlnYy5zZXRGb3JlZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQl9Ci0JCi0JLy8gZHJhdyBsaW5lcyB3aXRoIGNhcHMKLQlnYy5zZXRMaW5lV2lkdGgoMjApOwotCWdjLnNldExpbmVDYXAoU1dULkNBUF9GTEFUKTsKLQlnYy5kcmF3TGluZSgzKndpZHRoLzE2LCAyKmhlaWdodC82LCAxMyp3aWR0aC8xNiwgMipoZWlnaHQvNik7Ci0JZ2Muc2V0TGluZUNhcChTV1QuQ0FQX1NRVUFSRSk7Ci0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgMypoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDMqaGVpZ2h0LzYpOwotCWdjLnNldExpbmVDYXAoU1dULkNBUF9ST1VORCk7Ci0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgNCpoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDQqaGVpZ2h0LzYpOwotCQotCWlmIChwYXR0ZXJuICE9IG51bGwpIHBhdHRlcm4uZGlzcG9zZSgpOwkKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgdmFsaWQgZm9udCBmb3IgdGhlIHJlc2lkZW50IHBsYXRmb3JtLgotICovCi1zdGF0aWMgU3RyaW5nIGdldFBsYXRmb3JtRm9udCgpIHsKLQlpZihTV1QuZ2V0UGxhdGZvcm0oKSA9PSAid2luMzIiKSB7Ci0JCXJldHVybiAiQXJpYWwiOwkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJtb3RpZiIpIHsKLQkJcmV0dXJuICJIZWx2ZXRpY2EiOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiZ3RrIikgewotCQlyZXR1cm4gIkJhZWttdWsgQmF0YW5nIjsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImNhcmJvbiIpIHsKLQkJcmV0dXJuICJBcmlhbCI7Ci0JfSBlbHNlIHsgLy8gcGhvdG9uLCBldGMgLi4uCi0JCXJldHVybiAiVmVyZGFuYSI7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZUpvaW5UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVKb2luVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZGM4Y2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZUpvaW5UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdmFyaW91cyBsaW5lIGpvaW5zLiBJdCBhbGxvd3MgYSB1c2VyIHRvIGNob29zZSBmcm9tCi0gKiBiZXZlbCwgbWl0ZXIgYW5kIHJvdW5kLgotICovCi1wdWJsaWMgY2xhc3MgTGluZUpvaW5UYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0JCi0JcHJpdmF0ZSBDb21ibyBqb2luQ2I7Ci0JcHJpdmF0ZSBCdXR0b24gY29sb3JCdXR0b247Ci0JcHJpdmF0ZSBHcmFwaGljc0JhY2tncm91bmQgc2hhcGVDb2xvcjsKLQlwcml2YXRlIE1lbnUgbWVudTsKLQlwcml2YXRlIGludCBbXSBqb2luVmFsdWVzID0gbmV3IGludCBbXSB7U1dULkpPSU5fQkVWRUwsIFNXVC5KT0lOX01JVEVSLCBTV1QuSk9JTl9ST1VORH07Ci0KLXB1YmxpYyBMaW5lSm9pblRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVKb2luIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lSm9pbkRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCW1lbnUuZGlzcG9zZSgpOwotCQltZW51ID0gbnVsbDsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCi0JLy8gY3JlYXRlIGRyb3AgZG93biBjb21ibyBmb3IgY2hvb3NpbmcgY2xpcHBpbmcKLQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVKb2luIikpOyAvLyROT04tTkxTLTEkCi0Jam9pbkNiID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCWpvaW5DYi5hZGQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoImJldmVsIikpOyAvLyROT04tTkxTLTEkCi0Jam9pbkNiLmFkZChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygibWl0ZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQlqb2luQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJyb3VuZCIpKTsgLy8kTk9OLU5MUy0xJAotCWpvaW5DYi5zZWxlY3QoMSk7Ci0Jam9pbkNiLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gY29sb3IgbWVudQotCUNvbG9yTWVudSBjbSA9IG5ldyBDb2xvck1lbnUoKTsKLQljbS5zZXRQYXR0ZXJuSXRlbXMoZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQlzaGFwZUNvbG9yID0gZ2I7CQkKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGluaXRpYWxpemUgdGhlIHNoYXBlIGNvbG9yIHRvIHRoZSA0dGggaXRlbSBpbiB0aGUgbWVudSAoZ3JlZW4pCi0Jc2hhcGVDb2xvciA9KEdyYXBoaWNzQmFja2dyb3VuZCltZW51LmdldEl0ZW0oMykuZ2V0RGF0YSgpOwotCQotCS8vIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJDb2xvciIpKTsgLy8kTk9OLU5MUy0xJAotCWNvbG9yQnV0dG9uLnNldEltYWdlKHNoYXBlQ29sb3IuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9yQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci0KLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQotCWdjLnNldExpbmVXaWR0aCgyMCk7Ci0JZ2Muc2V0TGluZUpvaW4oam9pblZhbHVlc1tqb2luQ2IuZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOwotCQotCS8vIHNldCB0aGUgZm9yZWdyb3VuZCBjb2xvciBvciBwYXR0ZXJuCi0JUGF0dGVybiBwYXR0ZXJuID0gbnVsbDsKLQlpZiAoc2hhcGVDb2xvci5nZXRCZ0NvbG9yMSgpICE9IG51bGwpIHsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChzaGFwZUNvbG9yLmdldEJnQ29sb3IxKCkpOwotCX0gZWxzZSBpZiAoc2hhcGVDb2xvci5nZXRCZ0ltYWdlKCkgIT0gbnVsbCkgewotCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBzaGFwZUNvbG9yLmdldEJnSW1hZ2UoKSk7Ci0JCWdjLnNldEZvcmVncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCX0KLQkKLQkvLyBkcmF3IHRoZSBzaGFwZQotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5tb3ZlVG8od2lkdGgvMiwgMjUpOwotCXBhdGgubGluZVRvKDIqd2lkdGgvMywgaGVpZ2h0LzMpOwotCXBhdGgubGluZVRvKHdpZHRoLTI1LCBoZWlnaHQvMik7Ci0JcGF0aC5saW5lVG8oMip3aWR0aC8zLCAyKmhlaWdodC8zKTsKLQlwYXRoLmxpbmVUbyh3aWR0aC8yLCBoZWlnaHQtMjUpOwotCXBhdGgubGluZVRvKHdpZHRoLzMsIDIqaGVpZ2h0LzMpOwotCXBhdGgubGluZVRvKDI1LCBoZWlnaHQvMik7Ci0JcGF0aC5saW5lVG8od2lkdGgvMywgaGVpZ2h0LzMpOwotCXBhdGgubGluZVRvKHdpZHRoLzIsIDI1KTsKLQlwYXRoLmNsb3NlKCk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JCi0JaWYgKHBhdHRlcm4gIT0gbnVsbCkgcGF0dGVybi5kaXNwb3NlKCk7Ci19Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lU3R5bGVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVTdHlsZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThjN2EyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVTdHlsZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRlbW9uc3RyYXRlcyBsaW5lIHN0eWxlcyBhcHBsaWNhYmxlIHRvIGEgbGluZS4gIEl0IHNob3dzIHRoZSB1c2Ugb2YgdGhlCi0gKiA8Y29kZT5HQy5zZXRMaW5lU3R5bGUoKTwvY29kZT4gbWV0aG9kLgotICovCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCi0JQnV0dG9uIGNvbG9yQnV0dG9uOwotCUdyYXBoaWNzQmFja2dyb3VuZCBsaW5lQ29sb3I7Ci0JTWVudSBtZW51OwotCVNwaW5uZXIgbGluZVdpZHRoU3Bpbm5lcjsKLQotcHVibGljIExpbmVTdHlsZVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVTdHlsZXMiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVTdHlsZXNEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1lbnUgIT0gbnVsbCkgewotCQltZW51LmRpc3Bvc2UoKTsKLQkJbWVudSA9IG51bGw7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQotCUNvbXBvc2l0ZSBjb21wOwotCQotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVXaWR0aCIpKTsgLy8kTk9OLU5MUy0xJAotCWxpbmVXaWR0aFNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxpbmVXaWR0aFNwaW5uZXIuc2V0U2VsZWN0aW9uKDEwKTsKLQlsaW5lV2lkdGhTcGlubmVyLnNldE1pbmltdW0oMSk7Ci0JbGluZVdpZHRoU3Bpbm5lci5zZXRNYXhpbXVtKDMwKTsKLQlsaW5lV2lkdGhTcGlubmVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCQotCUNvbG9yTWVudSBjbSA9IG5ldyBDb2xvck1lbnUoKTsKLQljbS5zZXRQYXR0ZXJuSXRlbXMoZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQlsaW5lQ29sb3IgPSBnYjsJCQotCQkJY29sb3JCdXR0b24uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCi0JLy8gY3JlYXRlIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCS8vIGluaXRpYWxpemUgdGhlIGZvcmVncm91bmQgdG8gdGhlIDV0aCBpdGVtIGluIHRoZSBtZW51IChibHVlKQotCWxpbmVDb2xvciA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudS5nZXRJdGVtKDQpLmdldERhdGEoKTsKLQkKLQkvLyBjb2xvciBidXR0b24KLQljb2xvckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24uc2V0SW1hZ2UobGluZUNvbG9yLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JUGF0dGVybiBwYXR0ZXJuID0gbnVsbDsKLQlpZiAobGluZUNvbG9yLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKGxpbmVDb2xvci5nZXRCZ0NvbG9yMSgpKTsKLQl9IGVsc2UgaWYgKGxpbmVDb2xvci5nZXRCZ0ltYWdlKCkgIT0gbnVsbCkgewotCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBsaW5lQ29sb3IuZ2V0QmdJbWFnZSgpKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JfQotCQotCS8vIHNldCBsaW5lIHdpZHRoCi0JZ2Muc2V0TGluZVdpZHRoKGxpbmVXaWR0aFNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQotCS8vIGRyYXcgbGluZXMgd2l0aCBjYXBzCi0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgMSpoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDEqaGVpZ2h0LzYpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIKTsKLQlnYy5kcmF3TGluZSgzKndpZHRoLzE2LCAyKmhlaWdodC82LCAxMyp3aWR0aC8xNiwgMipoZWlnaHQvNik7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RPVCk7Ci0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgMypoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDMqaGVpZ2h0LzYpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIRE9UKTsKLQlnYy5kcmF3TGluZSgzKndpZHRoLzE2LCA0KmhlaWdodC82LCAxMyp3aWR0aC8xNiwgNCpoZWlnaHQvNik7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RBU0hET1RET1QpOwotCWdjLmRyYXdMaW5lKDMqd2lkdGgvMTYsIDUqaGVpZ2h0LzYsIDEzKndpZHRoLzE2LCA1KmhlaWdodC82KTsKLQkKLQkvLyBkcmF3IGxhYmVscwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250KCksIDIwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCi0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCi0JU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNvbGlkIik7IC8vJE5PTi1OTFMtMSQKLQlQb2ludCBzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgMSpoZWlnaHQvMTIsIHRydWUpOwotCXRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhc2giKTsgLy8kTk9OLU5MUy0xJAotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7CQotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgMypoZWlnaHQvMTIsIHRydWUpOwotCXRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRvdCIpOyAvLyROT04tTkxTLTEkCi0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIDUqaGVpZ2h0LzEyLCB0cnVlKTsKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEYXNoRG90Iik7IC8vJE5PTi1OTFMtMSQKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgNypoZWlnaHQvMTIsIHRydWUpOwotCXRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhc2hEb3REb3QiKTsgLy8kTk9OLU5MUy0xJAotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCA5KmhlaWdodC8xMiwgdHJ1ZSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiBhIHZhbGlkIGZvbnQgZm9yIHRoZSByZXNpZGVudCBwbGF0Zm9ybS4KLSAqLwotc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybUZvbnQoKSB7Ci0JaWYoU1dULmdldFBsYXRmb3JtKCkgPT0gIndpbjMyIikgewotCQlyZXR1cm4gIkFyaWFsIjsJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAibW90aWYiKSB7Ci0JCXJldHVybiAiSGVsdmV0aWNhIjsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImd0ayIpIHsKLQkJcmV0dXJuICJCYWVrbXVrIEJhdGFuZyI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJjYXJib24iKSB7Ci0JCXJldHVybiAiQXJpYWwiOwotCX0gZWxzZSB7IC8vIHBob3RvbiwgZXRjIC4uLgotCQlyZXR1cm4gIlZlcmRhbmEiOwotCX0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjVmODU3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIExpbmVUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0KLXB1YmxpYyBMaW5lVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGluZXMiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGluZSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGluZURlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWdjLmRyYXdMaW5lKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCWdjLmRyYXdMaW5lKHdpZHRoLCAwLCAwLCBoZWlnaHQpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTWF6ZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTWF6ZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzRlMTQ1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL01hemVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgc2hvd3MgdGhyZWUgY2lyY2xlcywgZWFjaCBmb2xsb3dpbmcgYSBkaWZmZXJlbnQgcGF0aCBpbiBhIG1hemUuCi0gKiBPbmx5IG9uZSBvZiB0aGUgdGhyZWUgY2lyY2xlcyBmb2xsb3dzIHRoZSBjb3JyZWN0IHBhdGguCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXplVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0KLQlpbnQgbmV4dEluZGV4LCBuZXh0SW5kZXgyLCBuZXh0SW5kZXgzOwotCWludCB4Y29vcmQsIHljb29yZCwgeGNvb3JkMiwgeWNvb3JkMiwgeGNvb3JkMywgeWNvb3JkMzsKLQlBcnJheUxpc3QgbmV4dENvb3JkLCBuZXh0Q29vcmQyLCBuZXh0Q29vcmQzOwotCWJvb2xlYW4gaXNEb25lLCBpc0RvbmUyLCBpc0RvbmUzOwotCUltYWdlIGltYWdlOwotCi0vKioKLSAqIENvbnN0cnVjdG9yCi0gKiBAcGFyYW0gZXhhbXBsZSBBIEdyYXBoaWNzRXhhbXBsZQotICovCi1wdWJsaWMgTWF6ZVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotCi0JLy8gY29ycmVjdCBwYXRoCi0JbmV4dENvb3JkID0gbmV3IEFycmF5TGlzdCgpOwotCW5leHRDb29yZC5hZGRBbGwobW92ZURvd24oMjAsIC01MCwgMjAsIDExMCwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVSaWdodCgzMCwgMTEwLCAxMzAsIDExMCwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVVcCgxMzUsIDEwMCwgMTM1LCAxNSwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVSaWdodCgxNDAsIDE1LCAyMTAsIDE1LCAxMCkpOwotCW5leHRDb29yZC5hZGRBbGwobW92ZURvd24oMjEwLCAyNSwgMjEwLCA3NSwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVSaWdodCgyMjAsIDc1LCAzMjAsIDc1LCAxMCkpOwotCW5leHRDb29yZC5hZGRBbGwobW92ZVVwKDMyMCwgNjUsIDMyMCwgNTUsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlUmlnaHQoMzMwLCA1MCwgNDc1LCA1MCwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVEb3duKDQ3NSwgNjAsIDQ3NSwgMjI1LCAxMCkpOwotCW5leHRDb29yZC5hZGRBbGwobW92ZUxlZnQoNDY1LCAyMjUsIDIwMCwgMjI1LCAxMCkpOwotCW5leHRDb29yZC5hZGRBbGwobW92ZVVwKDIwMCwgMjE1LCAyMDAsIDE4MCwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVMZWZ0KDE5MCwgMTgwLCAxMjAsIDE4MCwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVEb3duKDEyMCwgMTkwLCAxMjAsIDMyMCwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVSaWdodCgxMzAsIDMyMCwgNDc1LCAzMjAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlRG93big0NzUsIDMzMCwgNDc1LCA0MzUsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlTGVmdCg0NjUsIDQzNSwgMjAsIDQzNSwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVEb3duKDIwLCA0NDUsIDIwLCA0OTUsIDEwKSk7Ci0JCi0JbmV4dEluZGV4ID0gMDsKLQl4Y29vcmQgPSAoKEludGVnZXIpbmV4dENvb3JkLmdldChuZXh0SW5kZXgpKS5pbnRWYWx1ZSgpOwotCXljb29yZCA9ICgoSW50ZWdlciluZXh0Q29vcmQuZ2V0KG5leHRJbmRleCsxKSkuaW50VmFsdWUoKTsKLQkKLQkvLyB3cm9uZyBwYXRoIDEKLQluZXh0Q29vcmQyID0gbmV3IEFycmF5TGlzdCgpOwotCW5leHRDb29yZDIuYWRkQWxsKG1vdmVEb3duKDIwLCAtMjUsIDIwLCAxMTAsIDEwKSk7Ci0JbmV4dENvb3JkMi5hZGRBbGwobW92ZVJpZ2h0KDMwLCAxMTAsIDEzMCwgMTEwLCAxMCkpOwotCW5leHRDb29yZDIuYWRkQWxsKG1vdmVVcCgxMzUsIDEwMCwgMTM1LCAxNSwgMTApKTsKLQluZXh0Q29vcmQyLmFkZEFsbChtb3ZlUmlnaHQoMTQwLCAxNSwgNTIwLCAxNSwgMTApKTsKLQluZXh0Q29vcmQyLmFkZEFsbChtb3ZlRG93big1MjUsIDE1LCA1MjUsIDQ4MCwgMTApKTsKLQluZXh0Q29vcmQyLmFkZEFsbChtb3ZlTGVmdCg1MTUsIDQ4MCwgNzAsIDQ4MCwgMTApKTsKLQkKLQluZXh0SW5kZXgyID0gMDsKLQl4Y29vcmQyID0gKChJbnRlZ2VyKW5leHRDb29yZDIuZ2V0KG5leHRJbmRleDIpKS5pbnRWYWx1ZSgpOwotCXljb29yZDIgPSAoKEludGVnZXIpbmV4dENvb3JkMi5nZXQobmV4dEluZGV4MisxKSkuaW50VmFsdWUoKTsKLQkKLQkvLyB3cm9uZyBwYXRoIDIKLQluZXh0Q29vcmQzID0gbmV3IEFycmF5TGlzdCgpOwotCW5leHRDb29yZDMuYWRkQWxsKG1vdmVEb3duKDIwLCAwLCAyMCwgMTEwLCAxMCkpOwotCW5leHRDb29yZDMuYWRkQWxsKG1vdmVSaWdodCgzMCwgMTEwLCAxMzAsIDExMCwgMTApKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlVXAoMTM1LCAxMDAsIDEzNSwgMTUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZVJpZ2h0KDE0MCwgMTUsIDIxMCwgMTUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZURvd24oMjEwLCAyNSwgMjEwLCA3NSwgMTApKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlUmlnaHQoMjIwLCA3NSwgMzIwLCA3NSwgMTApKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlVXAoMzIwLCA2NSwgMzIwLCA1NSwgMTApKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlUmlnaHQoMzMwLCA1MCwgNDc1LCA1MCwgMTApKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlRG93big0NzUsIDYwLCA0NzUsIDIyNSwgMTApKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlTGVmdCg0NjUsIDIyNSwgNDI1LCAyMjUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZVVwKDQyMCwgMjI1LCA0MjAsIDE1MCwgMTApKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlTGVmdCg0MjAsIDE0NSwgNzAsIDE0NSwgMTApKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlRG93big3MCwgMTUwLCA3MCwgMzIwLCAxMCkpOwotCQotCW5leHRJbmRleDMgPSAwOwotCXhjb29yZDMgPSAoKEludGVnZXIpbmV4dENvb3JkMy5nZXQobmV4dEluZGV4MykpLmludFZhbHVlKCk7Ci0JeWNvb3JkMyA9ICgoSW50ZWdlciluZXh0Q29vcmQzLmdldChuZXh0SW5kZXgzKzEpKS5pbnRWYWx1ZSgpOwotCQotCWlzRG9uZSA9IGlzRG9uZTIgPSBpc0RvbmUzID0gZmFsc2U7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWlzYyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNYXplIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNYXplRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgaW50IGdldEluaXRpYWxBbmltYXRpb25UaW1lKCkgewotCXJldHVybiA1MDsKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlID0gbnVsbDsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0Jc3VwZXIuY3JlYXRlQ29udHJvbFBhbmVsKHBhcmVudCk7Ci0JCi0JLy8gYWRkIHNlbGVjdGlvbiBsaXN0ZW5lciB0byByZXNldCBuZXh0TnVtYmVyIGFmdGVyIAotCS8vIHRoZSBzZXF1ZW5jZSBoYXMgY29tcGxldGVkCi0JcGxheUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKGlzRG9uZSl7Ci0JCQkJbmV4dEluZGV4ID0gbmV4dEluZGV4MiA9IG5leHRJbmRleDMgPSAwOwotCQkJCWlzRG9uZSA9IGlzRG9uZTIgPSBpc0RvbmUzID0gZmFsc2U7IAotCQkJfQotCQl9Ci0JfSk7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkFuaW1hdGVkR3JhcGhpY3NUYWIjbmV4dChpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQotCWlmIChuZXh0SW5kZXgrMiA8IG5leHRDb29yZC5zaXplKCkpIHsKLQkJbmV4dEluZGV4ID0gKG5leHRJbmRleCsyKSVuZXh0Q29vcmQuc2l6ZSgpOwotCQl4Y29vcmQgPSAoKEludGVnZXIpbmV4dENvb3JkLmdldChuZXh0SW5kZXgpKS5pbnRWYWx1ZSgpOwotCQl5Y29vcmQgPSAoKEludGVnZXIpbmV4dENvb3JkLmdldChuZXh0SW5kZXgrMSkpLmludFZhbHVlKCk7Ci0JfSBlbHNlIHsKLQkJLy8gc3RvcCBhbmltYXRpb24KLQkJc2V0QW5pbWF0aW9uKGZhbHNlKTsKLQkJaXNEb25lID0gdHJ1ZTsKLQl9Ci0JCi0JaWYgKG5leHRJbmRleDIrMiA8IG5leHRDb29yZDIuc2l6ZSgpKSB7Ci0JCW5leHRJbmRleDIgPSAobmV4dEluZGV4MisyKSVuZXh0Q29vcmQyLnNpemUoKTsKLQkJeGNvb3JkMiA9ICgoSW50ZWdlciluZXh0Q29vcmQyLmdldChuZXh0SW5kZXgyKSkuaW50VmFsdWUoKTsKLQkJeWNvb3JkMiA9ICgoSW50ZWdlciluZXh0Q29vcmQyLmdldChuZXh0SW5kZXgyKzEpKS5pbnRWYWx1ZSgpOwotCX0gZWxzZSB7Ci0JCWlzRG9uZTIgPSB0cnVlOwotCX0KLQkKLQlpZiAobmV4dEluZGV4MysyIDwgbmV4dENvb3JkMy5zaXplKCkpIHsKLQkJbmV4dEluZGV4MyA9IChuZXh0SW5kZXgzKzIpJW5leHRDb29yZDMuc2l6ZSgpOwotCQl4Y29vcmQzID0gKChJbnRlZ2VyKW5leHRDb29yZDMuZ2V0KG5leHRJbmRleDMpKS5pbnRWYWx1ZSgpOwotCQl5Y29vcmQzID0gKChJbnRlZ2VyKW5leHRDb29yZDMuZ2V0KG5leHRJbmRleDMrMSkpLmludFZhbHVlKCk7Ci0JfSBlbHNlIHsKLQkJaXNEb25lMyA9IHRydWU7Ci0JfQotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5HcmFwaGljc1RhYiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsIGludCwgaW50KQotICovCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQotCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCWltYWdlID0gZXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCAibWF6ZS5ibXAiKTsKLQl9Ci0JLy8gZHJhdyBtYXplCi0JUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCWludCB4ID0gKHdpZHRoIC0gYm91bmRzLndpZHRoKSAvIDI7Ci0JaW50IHkgPSAoaGVpZ2h0IC0gYm91bmRzLmhlaWdodCkgLyAyOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgeCwgeSk7Ci0JCi0JLy8gZHJhdyBjb3JyZWN0IG92YWwKLQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZmlsbE92YWwoeCArIHhjb29yZCwgeSArIHljb29yZCwgMTYsIDE2KTsKLQlnYy5kcmF3T3ZhbCh4ICsgeGNvb3JkLCB5ICsgeWNvb3JkLCAxNSwgMTUpOwotCQotCS8vIGRyYXcgd3Jvbmcgb3ZhbCAxCi0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQlnYy5maWxsT3ZhbCh4ICsgeGNvb3JkMiwgeSArIHljb29yZDIsIDE2LCAxNik7Ci0JZ2MuZHJhd092YWwoeCArIHhjb29yZDIsIHkgKyB5Y29vcmQyLCAxNSwgMTUpOwotCQotCS8vIGRyYXcgd3Jvbmcgb3ZhbCAyCi0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JZ2MuZmlsbE92YWwoeCArIHhjb29yZDMsIHkgKyB5Y29vcmQzLCAxNiwgMTYpOwotCWdjLmRyYXdPdmFsKHggKyB4Y29vcmQzLCB5ICsgeWNvb3JkMywgMTUsIDE1KTsKLQotCWlmIChpc0RvbmUyKSB7Ci0JCUltYWdlIGhlbHBJbWcgPSBleGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsICJoZWxwLmdpZiIpOwotCQlnYy5kcmF3SW1hZ2UoaGVscEltZywgeCArIHhjb29yZDIgKyAxNiwgeSArIHljb29yZDIgLSAxNik7Ci0JCWhlbHBJbWcuZGlzcG9zZSgpOwotCX0KLQotCWlmIChpc0RvbmUzKSB7Ci0JCUltYWdlIGhlbHBJbWcgPSBleGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsICJoZWxwLmdpZiIpOwotCQlnYy5kcmF3SW1hZ2UoaGVscEltZywgeCArIHhjb29yZDMgKyAxNiwgeSArIHljb29yZDMgLSAxNik7Ci0JCWhlbHBJbWcuZGlzcG9zZSgpOwotCX0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgbGlzdCBvZiBjb29yZGluYXRlcyBtb3ZpbmcgaW4gYSAibGVmdC1tb3ZpbmciIGZhc2hpb24gZnJvbSB0aGUgc3RhcnQKLSAqIHBvaW50IHRvIHRoZSBlbmQgcG9pbnQgaW5jbHVzaXZlbHkuCi0gKiAKLSAqIEBwYXJhbSB4MQotICogICAgICAgICAgICBYIGNvbXBvbmVudCBvZiB0aGUgc3RhcnQgcG9pbnQKLSAqIEBwYXJhbSB5MQotICogICAgICAgICAgICBZIGNvbXBvbmVudCBvZiB0aGUgc3RhcnQgcG9pbnQKLSAqIEBwYXJhbSB4MgotICogICAgICAgICAgICBYIGNvbXBvbmVudCBvZiB0aGUgZW5kIHBvaW50Ci0gKiBAcGFyYW0geTIKLSAqICAgICAgICAgICAgWSBjb21wb25lbnQgb2YgdGhlIGVuZCBwb2ludAotICogQHBhcmFtIHN0ZXBzaXplCi0gKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgc2VwYXJhdGUgZWFjaCBjb29yZGluYXRlCi0gKi8KLXByaXZhdGUgQXJyYXlMaXN0IG1vdmVMZWZ0KGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IHN0ZXBzaXplKSB7Ci0JQXJyYXlMaXN0IGNvb3JkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgxKSk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MSkpOwotCXdoaWxlKHgxIC0gc3RlcHNpemUgPiB4MikgewotCQl4MSA9IHgxIC0gc3RlcHNpemU7Ci0JCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeDEpKTsKLQkJY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MSkpOwotCX0KLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgyKSk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MikpOwotCXJldHVybiBjb29yZHM7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGxpc3Qgb2YgY29vcmRpbmF0ZXMgbW92aW5nIGluIGEgInJpZ2h0LW1vdmluZyIgZmFzaGlvbiBmcm9tIHRoZSBzdGFydAotICogcG9pbnQgdG8gdGhlIGVuZCBwb2ludCBpbmNsdXNpdmVseS4KLSAqIAotICogQHBhcmFtIHgxCi0gKiAgICAgICAgICAgIFggY29tcG9uZW50IG9mIHRoZSBzdGFydCBwb2ludAotICogQHBhcmFtIHkxCi0gKiAgICAgICAgICAgIFkgY29tcG9uZW50IG9mIHRoZSBzdGFydCBwb2ludAotICogQHBhcmFtIHgyCi0gKiAgICAgICAgICAgIFggY29tcG9uZW50IG9mIHRoZSBlbmQgcG9pbnQKLSAqIEBwYXJhbSB5MgotICogICAgICAgICAgICBZIGNvbXBvbmVudCBvZiB0aGUgZW5kIHBvaW50Ci0gKiBAcGFyYW0gc3RlcHNpemUKLSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCBzZXBhcmF0ZSBlYWNoIGNvb3JkaW5hdGUKLSAqLwotcHJpdmF0ZSBBcnJheUxpc3QgbW92ZVJpZ2h0KGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IHN0ZXBzaXplKSB7Ci0JQXJyYXlMaXN0IGNvb3JkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgxKSk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MSkpOwotCXdoaWxlKHgxICsgc3RlcHNpemUgPCB4MikgewotCQl4MSA9IHgxICsgc3RlcHNpemU7Ci0JCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeDEpKTsKLQkJY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MSkpOwotCX0KLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgyKSk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MikpOwotCXJldHVybiBjb29yZHM7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGxpc3Qgb2YgY29vcmRpbmF0ZXMgbW92aW5nIGluIGFuIHVwd2FyZCBmYXNoaW9uIGZyb20gdGhlIHN0YXJ0Ci0gKiBwb2ludCB0byB0aGUgZW5kIHBvaW50IGluY2x1c2l2ZWx5LgotICogCi0gKiBAcGFyYW0geDEKLSAqICAgICAgICAgICAgWCBjb21wb25lbnQgb2YgdGhlIHN0YXJ0IHBvaW50Ci0gKiBAcGFyYW0geTEKLSAqICAgICAgICAgICAgWSBjb21wb25lbnQgb2YgdGhlIHN0YXJ0IHBvaW50Ci0gKiBAcGFyYW0geDIKLSAqICAgICAgICAgICAgWCBjb21wb25lbnQgb2YgdGhlIGVuZCBwb2ludAotICogQHBhcmFtIHkyCi0gKiAgICAgICAgICAgIFkgY29tcG9uZW50IG9mIHRoZSBlbmQgcG9pbnQKLSAqIEBwYXJhbSBzdGVwc2l6ZQotICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHNlcGFyYXRlIGVhY2ggY29vcmRpbmF0ZQotICovCi1wcml2YXRlIEFycmF5TGlzdCBtb3ZlVXAoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgc3RlcHNpemUpIHsKLQlBcnJheUxpc3QgY29vcmRzID0gbmV3IEFycmF5TGlzdCgpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeDEpKTsKLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHkxKSk7Ci0Jd2hpbGUoeTEgLSBzdGVwc2l6ZSA+IHkyKSB7Ci0JCXkxID0geTEgLSBzdGVwc2l6ZTsKLQkJY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MSkpOwotCQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHkxKSk7Ci0JfQotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeDIpKTsKLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHkyKSk7Ci0JcmV0dXJuIGNvb3JkczsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgbGlzdCBvZiBjb29yZGluYXRlcyBtb3ZpbmcgaW4gYSBkb3dud2FyZCBmYXNoaW9uIGZyb20gdGhlIHN0YXJ0Ci0gKiBwb2ludCB0byB0aGUgZW5kIHBvaW50IGluY2x1c2l2ZWx5LgotICogCi0gKiBAcGFyYW0geDEKLSAqICAgICAgICAgICAgWCBjb21wb25lbnQgb2YgdGhlIHN0YXJ0IHBvaW50Ci0gKiBAcGFyYW0geTEKLSAqICAgICAgICAgICAgWSBjb21wb25lbnQgb2YgdGhlIHN0YXJ0IHBvaW50Ci0gKiBAcGFyYW0geDIKLSAqICAgICAgICAgICAgWCBjb21wb25lbnQgb2YgdGhlIGVuZCBwb2ludAotICogQHBhcmFtIHkyCi0gKiAgICAgICAgICAgIFkgY29tcG9uZW50IG9mIHRoZSBlbmQgcG9pbnQKLSAqIEBwYXJhbSBzdGVwc2l6ZQotICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHNlcGFyYXRlIGVhY2ggY29vcmRpbmF0ZQotICovCi1wcml2YXRlIEFycmF5TGlzdCBtb3ZlRG93bihpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBzdGVwc2l6ZSkgewotCUFycmF5TGlzdCBjb29yZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MSkpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTEpKTsKLQl3aGlsZSh5MSArIHN0ZXBzaXplIDwgeTIpIHsKLQkJeTEgPSB5MSArIHN0ZXBzaXplOwotCQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgxKSk7Ci0JCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTEpKTsKLQl9Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MikpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTIpKTsKLQlyZXR1cm4gY29vcmRzOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9QYXRoQ2xpcHBpbmdBbmltVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9QYXRoQ2xpcHBpbmdBbmltVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0M2M0ZWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aENsaXBwaW5nQW5pbVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgaXMgYW5vdGhlciB0YWIgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBhIHBhdGggY2xpcHBpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoQ2xpcHBpbmdBbmltVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb2xvckJ1dHRvbjsKLQlwcml2YXRlIEdyYXBoaWNzQmFja2dyb3VuZCBiYWNrZ3JvdW5kOwotCXByaXZhdGUgTWVudSBtZW51OwotCXByaXZhdGUgaW50IHJlY3RXaWR0aCA9IDMwMDsKLQlwcml2YXRlIGludCByZWN0SGVpZ2h0ID0gMzAwOwotCXByaXZhdGUgaW50IGluY1dpZHRoID0gNTsKLQlwcml2YXRlIGludCBpbmNIZWlnaHQgPSA1OwotCXByaXZhdGUgYm9vbGVhbiB2ZXJ0aWNhbCA9IGZhbHNlOwotCXByaXZhdGUgaW50IGFuZ2xlOwotCi0JcHVibGljIFBhdGhDbGlwcGluZ0FuaW1UYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQkJc3VwZXIoZXhhbXBsZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2xpcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQW5pbVBhdGhDbGlwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFuaW1QYXRoQ2xpcHBpbmdEZXNjIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCQltZW51LmRpc3Bvc2UoKTsKLQkJCW1lbnUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRyYXdpbmcuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbFBhbmVsKHBhcmVudCk7Ci0KLQkJLy8gY29sb3IgbWVudQotCQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JCWNtLnNldFBhdHRlcm5JdGVtcyhleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKTsKLQkJbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJCWJhY2tncm91bmQgPSBnYjsKLQkJCQljb2xvckJ1dHRvbi5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gaW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB0byB0aGUgNXRoIGl0ZW0gaW4gdGhlIG1lbnUgKGJsdWUpCi0JCWJhY2tncm91bmQgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKSBtZW51LmdldEl0ZW0oNCkuZ2V0RGF0YSgpOwotCi0JCS8vIGNvbG9yIGJ1dHRvbgotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJY29sb3JCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JCWNvbG9yQnV0dG9uLnNldEltYWdlKGJhY2tncm91bmQuZ2V0VGh1bWJOYWlsKCkpOwotCQljb2xvckJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlhbmdsZSA9IChhbmdsZSArIDUpJTM2MDsKLQkJaWYgKHZlcnRpY2FsKSB7Ci0JCQlpZiAocmVjdEhlaWdodCA8PSAwKSB7Ci0JCQkJaW5jSGVpZ2h0ID0gLWluY0hlaWdodDsKLQkJCX0KLQkJCWlmIChyZWN0SGVpZ2h0ID49IGhlaWdodCkgewotCQkJCWluY0hlaWdodCA9IC1pbmNIZWlnaHQ7Ci0JCQkJdmVydGljYWwgPSBmYWxzZTsKLQkJCX0KLQkJCXJlY3RIZWlnaHQgPSByZWN0SGVpZ2h0ICsgaW5jSGVpZ2h0OwotCQl9IGVsc2UgewotCQkJaWYgKHJlY3RXaWR0aCA8PSAwKSB7Ci0JCQkJaW5jV2lkdGggPSAtaW5jV2lkdGg7Ci0JCQl9Ci0JCQlpZiAocmVjdFdpZHRoID49IHdpZHRoKSB7Ci0JCQkJaW5jV2lkdGggPSAtaW5jV2lkdGg7Ci0JCQkJdmVydGljYWwgPSB0cnVlOwotCQkJfQotCQkJcmVjdFdpZHRoID0gcmVjdFdpZHRoICsgaW5jV2lkdGg7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCQotCQkvLyB0b3AgdHJpYW5nbGUKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aC5tb3ZlVG8od2lkdGgvMiwgMCk7Ci0JCXBhdGgubGluZVRvKHdpZHRoLzIrMTAwLCAxNzMpOwotCQlwYXRoLmxpbmVUbyh3aWR0aC8yLTEwMCwgMTczKTsKLQkJcGF0aC5saW5lVG8od2lkdGgvMiwgMCk7Ci0JCQotCQkvLyBib3R0b20gdHJpYW5nbGUKLQkJUGF0aCBwYXRoMiA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGgyLm1vdmVUbyh3aWR0aC8yLCBoZWlnaHQpOwotCQlwYXRoMi5saW5lVG8od2lkdGgvMisxMDAsIGhlaWdodC0xNzMpOwotCQlwYXRoMi5saW5lVG8od2lkdGgvMi0xMDAsIGhlaWdodC0xNzMpOwotCQlwYXRoMi5saW5lVG8od2lkdGgvMiwgaGVpZ2h0KTsKLQkJCi0JCS8vIGxlZnQgdHJpYW5nbGUKLQkJUGF0aCBwYXRoMyA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGgzLm1vdmVUbygwLCBoZWlnaHQvMik7Ci0JCXBhdGgzLmxpbmVUbygxNzMsIGhlaWdodC8yLTEwMCk7Ci0JCXBhdGgzLmxpbmVUbygxNzMsIGhlaWdodC8yKzEwMCk7Ci0JCXBhdGgzLmxpbmVUbygwLCBoZWlnaHQvMik7Ci0JCQotCQkvLyByaWdodCB0cmlhbmdsZQotCQlQYXRoIHBhdGg0ID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDQubW92ZVRvKHdpZHRoLCBoZWlnaHQvMik7Ci0JCXBhdGg0LmxpbmVUbyh3aWR0aC0xNzMsIGhlaWdodC8yLTEwMCk7Ci0JCXBhdGg0LmxpbmVUbyh3aWR0aC0xNzMsIGhlaWdodC8yKzEwMCk7Ci0JCXBhdGg0LmxpbmVUbyh3aWR0aCwgaGVpZ2h0LzIpOwotCQkKLQkJLy8gY2lyY2xlCi0JCVBhdGggcGF0aDUgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoNS5tb3ZlVG8oKHdpZHRoLTIwMCkvMiwgKGhlaWdodC0yMDApLzIpOwotCQlwYXRoNS5hZGRBcmMoKHdpZHRoLTIwMCkvMiwgKGhlaWdodC0yMDApLzIsIDIwMCwgMjAwLCAwLCAzNjApOwotCQkKLQkJLy8gdG9wIHJlY3RhbmdsZQotCQlQYXRoIHBhdGg2ID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDYuYWRkUmVjdGFuZ2xlKCh3aWR0aC00MCkvMiwgMTc1LCA0MCwgKChoZWlnaHQtMjAwKS8yKS0xNzcpOwotCQkKLQkJLy8gYm90dG9tIHJlY3RhbmdsZQotCQlQYXRoIHBhdGg3ID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDcuYWRkUmVjdGFuZ2xlKCh3aWR0aC00MCkvMiwgKChoZWlnaHQtMjAwKS8yKSsyMDIsIDQwLCAoaGVpZ2h0LTE3NSktKCgoaGVpZ2h0LTIwMCkvMikrMjAyKSk7Ci0JCQotCQkvLyBsZWZ0IHJlY3RhbmdsZQotCQlQYXRoIHBhdGg4ID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDguYWRkUmVjdGFuZ2xlKDE3NSwgKGhlaWdodC00MCkvMiwgKCh3aWR0aC0yMDApLzIpLTE3NywgNDApOwotCQkKLQkJLy8gcmlnaHQgcmVjdGFuZ2xlCi0JCVBhdGggcGF0aDkgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoOS5hZGRSZWN0YW5nbGUoKHdpZHRoLTIwMCkvMisyMDIsIChoZWlnaHQtNDApLzIsICh3aWR0aC0xNzUpLSgod2lkdGgtMjAwKS8yKzIwMiksIDQwKTsKLQkJCi0JCXBhdGguYWRkUGF0aChwYXRoMik7Ci0JCXBhdGguYWRkUGF0aChwYXRoMyk7Ci0JCXBhdGguYWRkUGF0aChwYXRoNCk7Ci0JCXBhdGguYWRkUGF0aChwYXRoNSk7Ci0JCXBhdGguYWRkUGF0aChwYXRoNik7Ci0JCXBhdGguYWRkUGF0aChwYXRoNyk7Ci0JCXBhdGguYWRkUGF0aChwYXRoOCk7Ci0JCXBhdGguYWRkUGF0aChwYXRoOSk7Ci0JCWdjLnNldENsaXBwaW5nKHBhdGgpOwotCi0JCVBhdHRlcm4gcGF0dGVybiA9IG51bGw7Ci0JCWlmIChiYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQkJZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCkpOwotCQl9IGVsc2UgaWYgKGJhY2tncm91bmQuZ2V0QmdJbWFnZSgpICE9IG51bGwpIHsKLQkJCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIGJhY2tncm91bmQuZ2V0QmdJbWFnZSgpKTsKLQkJCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCQl9Ci0KLQkJZ2Muc2V0TGluZVdpZHRoKDIpOwotCQlnYy5maWxsUmVjdGFuZ2xlKCh3aWR0aC1yZWN0V2lkdGgpLzIsIChoZWlnaHQtcmVjdEhlaWdodCkvMiwgcmVjdFdpZHRoLCByZWN0SGVpZ2h0KTsKLQkJZ2MuZHJhd1BhdGgocGF0aCk7Ci0JCQotCQlpZiAocGF0dGVybiAhPSBudWxsKQotCQkJcGF0dGVybi5kaXNwb3NlKCk7Ci0JCQotCQlwYXRoOS5kaXNwb3NlKCk7Ci0JCXBhdGg4LmRpc3Bvc2UoKTsKLQkJcGF0aDcuZGlzcG9zZSgpOwotCQlwYXRoNi5kaXNwb3NlKCk7Ci0JCXBhdGg1LmRpc3Bvc2UoKTsKLQkJcGF0aDQuZGlzcG9zZSgpOwotCQlwYXRoMy5kaXNwb3NlKCk7Ci0JCXBhdGgyLmRpc3Bvc2UoKTsKLQkJcGF0aC5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aENsaXBwaW5nVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9QYXRoQ2xpcHBpbmdUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4NzAyOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9QYXRoQ2xpcHBpbmdUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgaG93IHRvIGFwcGx5IGEgcGF0aCBjbGlwcGluZyBhbmQgdGhlIGVmZmVjdHMgb2YKLSAqIGFwcGx5aW5nIG9uZS4KLSAqLwotcHVibGljIGNsYXNzIFBhdGhDbGlwcGluZ1RhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQkKLQlwcml2YXRlIENvbWJvIGNsaXBwaW5nQ2I7Ci0JcHJpdmF0ZSBCdXR0b24gY29sb3JCdXR0b247Ci0JcHJpdmF0ZSBHcmFwaGljc0JhY2tncm91bmQgYmFja2dyb3VuZDsKLQlwcml2YXRlIE1lbnUgbWVudTsKLQotcHVibGljIFBhdGhDbGlwcGluZ1RhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsaXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdGhDbGlwcGluZyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGF0aENsaXBwaW5nRGVzYyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1lbnUgIT0gbnVsbCkgewotCQltZW51LmRpc3Bvc2UoKTsKLQkJbWVudSA9IG51bGw7Ci0JfQotfQotCi0vKiogCi0gKiBDcmVhdGVzIHRoZSB3aWRnZXRzIHVzZWQgdG8gY29udHJvbCB0aGUgZHJhd2luZy4KLSAqLwotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsJCi0JCi0JLy8gY3JlYXRlIGRyb3AgZG93biBjb21ibyBmb3IgY2hvb3NpbmcgY2xpcHBpbmcKLQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsaXBwaW5nIikpOyAvLyROT04tTkxTLTEkCi0JY2xpcHBpbmdDYiA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOKTsKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNpcmNsZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlY3RhbmdsZSIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3ZhbCIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiV29yZCIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3RhciIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHJpYW5nbGVzIikpOyAvLyROT04tTkxTLTEkCi0JY2xpcHBpbmdDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEZWZhdWx0IikpOyAvLyROT04tTkxTLTEkCi0JY2xpcHBpbmdDYi5zZWxlY3QoMCk7Ci0JY2xpcHBpbmdDYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNvbG9yIG1lbnUKLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JY20uc2V0UGF0dGVybkl0ZW1zKGV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpOwotCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJYmFja2dyb3VuZCA9IGdiOwkJCi0JCQljb2xvckJ1dHRvbi5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0KLQkvLyBpbml0aWFsaXplIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSA1dGggaXRlbSBpbiB0aGUgbWVudSAoYmx1ZSkKLQliYWNrZ3JvdW5kID0oR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUuZ2V0SXRlbSg0KS5nZXREYXRhKCk7Ci0JCi0JLy8gY29sb3IgYnV0dG9uCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQljb2xvckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24uc2V0SW1hZ2UoYmFja2dyb3VuZC5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLX0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0KLQlpbnQgY2xpcHBpbmcgPSBjbGlwcGluZ0NiLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0Jc3dpdGNoIChjbGlwcGluZykgewotCQotCWNhc2UgMDoJCS8vIGNpcmNsZXMKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aC5hZGRBcmMoKHdpZHRoLXdpZHRoLzUpLzIsIChoZWlnaHQtaGVpZ2h0LzUpLzIsIHdpZHRoLzUsIGhlaWdodC81LCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYyg1Kih3aWR0aC13aWR0aC84KS8xMiwgNCooaGVpZ2h0LWhlaWdodC84KS8xMiwgd2lkdGgvOCwgaGVpZ2h0LzgsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDcqKHdpZHRoLXdpZHRoLzgpLzEyLCA4KihoZWlnaHQtaGVpZ2h0LzgpLzEyLCB3aWR0aC84LCBoZWlnaHQvOCwgMCwgMzYwKTsKLQkJcGF0aC5hZGRBcmMoNiood2lkdGgtd2lkdGgvMTIpLzEyLCAzKihoZWlnaHQtaGVpZ2h0LzEyKS8xMiwgd2lkdGgvMTIsIGhlaWdodC8xMiwgMCwgMzYwKTsKLQkJcGF0aC5hZGRBcmMoNiood2lkdGgtd2lkdGgvMTIpLzEyLCA5KihoZWlnaHQtaGVpZ2h0LzEyKS8xMiwgd2lkdGgvMTIsIGhlaWdodC8xMiwgMCwgMzYwKTsKLQkJcGF0aC5hZGRBcmMoMTEuNWYqKHdpZHRoLXdpZHRoLzE4KS8yMCwgNSooaGVpZ2h0LWhlaWdodC8xOCkvMTgsIHdpZHRoLzE4LCBoZWlnaHQvMTgsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDguNWYqKHdpZHRoLXdpZHRoLzE4KS8yMCwgMTMqKGhlaWdodC1oZWlnaHQvMTgpLzE4LCB3aWR0aC8xOCwgaGVpZ2h0LzE4LCAwLCAzNjApOwotCQlnYy5zZXRDbGlwcGluZyhwYXRoKTsKLQkJcGF0aC5kaXNwb3NlKCk7Ci0JCWJyZWFrOwotCWNhc2UgMToJCS8vIHJlY3RhbmdsZQotCQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aC5hZGRSZWN0YW5nbGUoMTAwLCAxMDAsIHdpZHRoLTIwMCwgaGVpZ2h0LTIwMCk7Ci0JCXBhdGguYWRkUmVjdGFuZ2xlKDEyMCwgMTIwLCB3aWR0aC0yNDAsIGhlaWdodC0yNDApOwotCQlwYXRoLmFkZFJlY3RhbmdsZSgxNDAsIDE0MCwgd2lkdGgtMjgwLCBoZWlnaHQtMjgwKTsKLQkJZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCQlicmVhazsKLQljYXNlIDI6CQkvLyBjaXJjbGUKLQkJcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGguYWRkQXJjKDEwMCwgMTAwLCB3aWR0aC0yMDAsIGhlaWdodC0yMDAsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKCh3aWR0aC13aWR0aC81KS8yLCAoaGVpZ2h0LWhlaWdodC81KS8yLCB3aWR0aC81LCBoZWlnaHQvNSwgMCwgMzYwKTsKLQkJcGF0aC5hZGRBcmMoNSood2lkdGgtd2lkdGgvOCkvMTIsIDQqKGhlaWdodC1oZWlnaHQvOCkvMTIsIHdpZHRoLzgsIGhlaWdodC84LCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYyg3Kih3aWR0aC13aWR0aC84KS8xMiwgOCooaGVpZ2h0LWhlaWdodC84KS8xMiwgd2lkdGgvOCwgaGVpZ2h0LzgsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDYqKHdpZHRoLXdpZHRoLzEyKS8xMiwgMyooaGVpZ2h0LWhlaWdodC8xMikvMTIsIHdpZHRoLzEyLCBoZWlnaHQvMTIsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDYqKHdpZHRoLXdpZHRoLzEyKS8xMiwgOSooaGVpZ2h0LWhlaWdodC8xMikvMTIsIHdpZHRoLzEyLCBoZWlnaHQvMTIsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDExLjVmKih3aWR0aC13aWR0aC8xOCkvMjAsIDUqKGhlaWdodC1oZWlnaHQvMTgpLzE4LCB3aWR0aC8xOCwgaGVpZ2h0LzE4LCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYyg4LjVmKih3aWR0aC13aWR0aC8xOCkvMjAsIDEzKihoZWlnaHQtaGVpZ2h0LzE4KS8xOCwgd2lkdGgvMTgsIGhlaWdodC8xOCwgMCwgMzYwKTsKLQkJZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCQlicmVhazsKLQljYXNlIDM6CQkvLyB3b3JkCi0JCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCQlTdHJpbmcgdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU1dUIik7IC8vJE5PTi1OTFMtMSQKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGV2aWNlLCAiVGltZXMiLCAyMDAsIFNXVC5OT1JNQUwpOwotCQlnYy5zZXRGb250KGZvbnQpOwotCQlQb2ludCBzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCQlwYXRoLmFkZFN0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCAoaGVpZ2h0LXNpemUueSkvMiwgZm9udCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlnYy5zZXRDbGlwcGluZyhwYXRoKTsKLQkJcGF0aC5kaXNwb3NlKCk7Ci0JCWJyZWFrOwotCWNhc2UgNDoJCS8vIHN0YXIKLQkJcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGgubGluZVRvKHdpZHRoLzIsIDApOwotCQlwYXRoLmxpbmVUbyg1KndpZHRoLzgsIGhlaWdodC8zKTsKLQkJcGF0aC5saW5lVG8od2lkdGgsIGhlaWdodC8zKTsKLQkJcGF0aC5saW5lVG8oMyp3aWR0aC80LCAxMCpoZWlnaHQvMTYpOwotCQlwYXRoLmxpbmVUbyg3KndpZHRoLzgsIGhlaWdodCk7Ci0JCXBhdGgubGluZVRvKHdpZHRoLzIsIDMqaGVpZ2h0LzQpOwotCQlwYXRoLmxpbmVUbyh3aWR0aC84LCBoZWlnaHQpOwotCQlwYXRoLmxpbmVUbyh3aWR0aC80LCAxMCpoZWlnaHQvMTYpOwotCQlwYXRoLmxpbmVUbygwLCBoZWlnaHQvMyk7Ci0JCXBhdGgubGluZVRvKDMqd2lkdGgvOCwgaGVpZ2h0LzMpOwotCQlwYXRoLmxpbmVUbyh3aWR0aC8yLCAwKTsKLQkJCi0JCVBhdGggb3ZhbFBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCQlvdmFsUGF0aC5hZGRBcmMoOTAsIDkwLCB3aWR0aC0xODAsIGhlaWdodC0xODAsIDAsIDM2MCk7Ci0JCQotCQlwYXRoLmFkZFBhdGgob3ZhbFBhdGgpOwotCQlnYy5zZXRDbGlwcGluZyhwYXRoKTsKLQkJb3ZhbFBhdGguZGlzcG9zZSgpOwotCQlwYXRoLmRpc3Bvc2UoKTsKLQkJYnJlYWs7Ci0JY2FzZSA1OgkJLy8gdHJpYW5nbGVzCi0JCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoLmFkZFJlY3RhbmdsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQkJcGF0aC5saW5lVG8od2lkdGgvNCwgMCk7Ci0JCXBhdGgubGluZVRvKHdpZHRoLzQsIGhlaWdodC8yKTsKLQkJcGF0aC5saW5lVG8oMCwgaGVpZ2h0LzIpOwotCQlwYXRoLmxpbmVUbyh3aWR0aC80LCAwKTsKLQkJCi0JCVBhdGggcGF0aDIgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoMi5saW5lVG8od2lkdGgvMiwgMCk7Ci0JCXBhdGgyLmxpbmVUbyh3aWR0aC80LCBoZWlnaHQvMik7Ci0JCXBhdGgyLmxpbmVUbygzKndpZHRoLzQsIGhlaWdodC8yKTsKLQkJcGF0aDIubGluZVRvKHdpZHRoLzIsIDApOwotCQkKLQkJUGF0aCBwYXRoMyA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGgzLmxpbmVUbygzKndpZHRoLzQsIDApOwotCQlwYXRoMy5saW5lVG8oMyp3aWR0aC80LCBoZWlnaHQvMik7Ci0JCXBhdGgzLmxpbmVUbyh3aWR0aCwgaGVpZ2h0LzIpOwotCQlwYXRoMy5saW5lVG8oMyp3aWR0aC80LCAwKTsKLQkJCi0JCVBhdGggcGF0aDQgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoNC5saW5lVG8oMCwgaGVpZ2h0KTsKLQkJcGF0aDQubGluZVRvKHdpZHRoLzQsIGhlaWdodC8yKTsKLQkJcGF0aDQubGluZVRvKHdpZHRoLzIsIGhlaWdodCk7Ci0JCXBhdGg0LmxpbmVUbygwLCBoZWlnaHQpOwotCQkKLQkJUGF0aCBwYXRoNSA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGg1LmxpbmVUbyh3aWR0aC8yLCBoZWlnaHQpOwotCQlwYXRoNS5saW5lVG8oMyp3aWR0aC80LCBoZWlnaHQvMik7Ci0JCXBhdGg1LmxpbmVUbyh3aWR0aCwgaGVpZ2h0KTsKLQkJcGF0aDUubGluZVRvKHdpZHRoLzIsIGhlaWdodCk7Ci0JCQotCQlwYXRoLmFkZFBhdGgocGF0aDIpOwotCQlwYXRoLmFkZFBhdGgocGF0aDMpOwotCQlwYXRoLmFkZFBhdGgocGF0aDQpOwotCQlwYXRoLmFkZFBhdGgocGF0aDUpOwotCQlnYy5zZXRDbGlwcGluZyhwYXRoKTsKLQkJCi0JCXBhdGg1LmRpc3Bvc2UoKTsKLQkJcGF0aDQuZGlzcG9zZSgpOwotCQlwYXRoMy5kaXNwb3NlKCk7Ci0JCXBhdGgyLmRpc3Bvc2UoKTsKLQkJcGF0aC5kaXNwb3NlKCk7Ci0JCWJyZWFrOwotCWNhc2UgNjoJCS8vIGRlZmF1bHQKLQkJZ2Muc2V0Q2xpcHBpbmcoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JCWJyZWFrOwotCX0KLQkKLQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCWlmIChiYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQuZ2V0QmdDb2xvcjEoKSk7Ci0JfSBlbHNlIGlmIChiYWNrZ3JvdW5kLmdldEJnSW1hZ2UoKSAhPSBudWxsKSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIGJhY2tncm91bmQuZ2V0QmdJbWFnZSgpKTsKLQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JfQotICAgIGdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKHBhdHRlcm4gIT0gbnVsbCkgcGF0dGVybi5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9QYXRoVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9QYXRoVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYWFhZWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHBhdGhzLiBJdCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VlIHRoZQotICogZGlmZmVyZW5jZXMgYmV0d2VlbiBmaWxsaW5nLCBkcmF3aW5nIGFuZCBjbG9zaW5nIHBhdGhzLgotICovCi1wdWJsaWMgY2xhc3MgUGF0aFRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQotCUJ1dHRvbiBjb2xvckJ1dHRvbiwgZmlsbEJ1dHRvbiwgZHJhd0J1dHRvbiwgY2xvc2VCdXR0b247Ci0JR3JhcGhpY3NCYWNrZ3JvdW5kIGZpbGxDb2xvcjsKLQlNZW51IG1lbnU7Ci0KLXB1YmxpYyBQYXRoVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGF0aCIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXRoT3BlciIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGF0aE9wZXJEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1lbnUgIT0gbnVsbCkgewotCQltZW51LmRpc3Bvc2UoKTsKLQkJbWVudSA9IG51bGw7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQotCUNvbXBvc2l0ZSBjb21wOwotCi0JLy8gY3JlYXRlIGRyYXcgYnV0dG9uCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCi0JZHJhd0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlRPR0dMRSk7Ci0JZHJhd0J1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRHJhd1BhdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQlkcmF3QnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JZHJhd0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCi0JLy8gY3JlYXRlIGZpbGwgYnV0dG9uCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCi0JZmlsbEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlRPR0dMRSk7Ci0JZmlsbEJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsbFBhdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQlmaWxsQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gY3JlYXRlIGNsb3NlIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCWNsb3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuVE9HR0xFKTsKLQljbG9zZUJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2xvc2VQYXRoIikpOyAvLyROT04tTkxTLTEkCi0JY2xvc2VCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkJCi0JLy8gY3JlYXRlIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCUNvbG9yTWVudSBjbSA9IG5ldyBDb2xvck1lbnUoKTsKLQljbS5zZXRQYXR0ZXJuSXRlbXMoZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQlmaWxsQ29sb3IgPSBnYjsJCQotCQkJY29sb3JCdXR0b24uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCi0JLy8gaW5pdGlhbGl6ZSB0aGUgZm9yZWdyb3VuZCB0byB0aGUgNXRoIGl0ZW0gaW4gdGhlIG1lbnUgKGdyZWVuKQotCWZpbGxDb2xvciA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudS5nZXRJdGVtKDMpLmdldERhdGEoKTsKLQkKLQkvLyBjb2xvciBidXR0b24KLQljb2xvckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxsQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbi5zZXRJbWFnZShmaWxsQ29sb3IuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9yQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0KLQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCWlmIChmaWxsQ29sb3IuZ2V0QmdDb2xvcjEoKSAhPSBudWxsKSB7Ci0JCWdjLnNldEJhY2tncm91bmQoZmlsbENvbG9yLmdldEJnQ29sb3IxKCkpOwotCX0gZWxzZSBpZiAoZmlsbENvbG9yLmdldEJnSW1hZ2UoKSAhPSBudWxsKSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIGZpbGxDb2xvci5nZXRCZ0ltYWdlKCkpOwotCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQl9Ci0KLQlnYy5zZXRMaW5lV2lkdGgoNSk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCi0JLy8gYXJjCi0JUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmFkZEFyYygod2lkdGgtMjUwKS8yLCAoaGVpZ2h0LTQwMCkvMiwgNTAwLCA0MDAsIDkwLCAxODApOwotCWlmIChjbG9zZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgcGF0aC5jbG9zZSgpOwotCWlmIChmaWxsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBnYy5maWxsUGF0aChwYXRoKTsKLQlpZiAoZHJhd0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JCi0JLy8gc2hhcGUgb24gbGVmdAotCVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgod2lkdGgtMjUwKS80LCBoZWlnaHQvMi0xNTApOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5jdWJpY1RvKC0xNTAsIDEwMCwgMTUwLCAyMDAsIDAsIDMwMCk7Ci0JaWYgKGNsb3NlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBwYXRoLmNsb3NlKCk7Ci0JaWYgKGZpbGxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGdjLmZpbGxQYXRoKHBhdGgpOwotCWlmIChkcmF3QnV0dG9uLmdldFNlbGVjdGlvbigpKSBnYy5kcmF3UGF0aChwYXRoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLQlnYy5zZXRUcmFuc2Zvcm0obnVsbCk7Ci0JCi0JLy8gc2hhcGUgb24gcmlnaHQKLQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLm1vdmVUbygzKih3aWR0aC0yNTApLzQgLSAyNSArIDI1MCwgaGVpZ2h0LzIpOwotCXBhdGgubGluZVRvKDMqKHdpZHRoLTI1MCkvNCArIDUwICsgMjUwLCBoZWlnaHQvMiAtIDIwMCk7Ci0JcGF0aC5saW5lVG8oMyood2lkdGgtMjUwKS80ICsgNTAgKyAyNTAsIGhlaWdodC8yICsgNTApOwotCXBhdGgubGluZVRvKDMqKHdpZHRoLTI1MCkvNCAtIDI1ICsgMjUwLCBoZWlnaHQvMiArIDE1MCk7Ci0JcGF0aC5saW5lVG8oMyood2lkdGgtMjUwKS80ICsgMjUgKyAyNTAsIGhlaWdodC8yICsgNTApOwotCWlmIChjbG9zZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgcGF0aC5jbG9zZSgpOwotCWlmIChmaWxsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBnYy5maWxsUGF0aChwYXRoKTsKLQlpZiAoZHJhd0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0KLQlpZiAocGF0dGVybiAhPSBudWxsKSBwYXR0ZXJuLmRpc3Bvc2UoKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9SR0JUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1JHQlRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzBiM2UwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1JHQlRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIE1pc2NlbGxhbmVvdXMgdGFiIHRoYXQgZGVtb25zdHJhdGVzIGVtZXJnaW5nIGNvbG9ycyBmcm9tIGxheWVyaW5nIG90aGVyCi0gKiBjb2xvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSR0JUYWIgZXh0ZW5kcyBBbmltYXRlZEdyYXBoaWNzVGFiIHsKLQkKLQlpbnQgdHJhbnNsYXRlWCwgdHJhbnNsYXRlWTsKLQlmbG9hdCBkaWFnVHJhbnNsYXRlWDEsIGRpYWdUcmFuc2xhdGVYMiwgZGlhZ1RyYW5zbGF0ZVkxLCBkaWFnVHJhbnNsYXRlWTI7Ci0KLS8qKgotICogQ29uc3RydWN0b3IKLSAqIEBwYXJhbSBleGFtcGxlIEEgR3JhcGhpY3NFeGFtcGxlCi0gKi8KLXB1YmxpYyBSR0JUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLQl0cmFuc2xhdGVYID0gdHJhbnNsYXRlWSA9IDA7Ci0JZGlhZ1RyYW5zbGF0ZVgxID0gZGlhZ1RyYW5zbGF0ZVgyID0gZGlhZ1RyYW5zbGF0ZVkxID0gZGlhZ1RyYW5zbGF0ZVkyID0gMDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNaXNjIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInJnYiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygicmdiRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5BbmltYXRlZEdyYXBoaWNzVGFiI25leHQoaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCi0JZmxvYXQgaCA9IGhlaWdodDsKLQlmbG9hdCB3ID0gd2lkdGg7Ci0JCi0JdHJhbnNsYXRlWCA9ICh0cmFuc2xhdGVYKzMpJXdpZHRoOwotCXRyYW5zbGF0ZVkgPSAodHJhbnNsYXRlWSs1KSVoZWlnaHQ7Ci0KLQlkaWFnVHJhbnNsYXRlWDEgPSAoZGlhZ1RyYW5zbGF0ZVgxKzYpJXdpZHRoOwotCWRpYWdUcmFuc2xhdGVZMSA9IGRpYWdUcmFuc2xhdGVYMSooaC93KTsKLQkKLQlkaWFnVHJhbnNsYXRlWDIgPSAoZGlhZ1RyYW5zbGF0ZVgyKzgpJXdpZHRoOwotCWRpYWdUcmFuc2xhdGVZMiA9IC1kaWFnVHJhbnNsYXRlWDIqKGgvdykgKyBoOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5HcmFwaGljc1RhYiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsIGludCwgaW50KQotICovCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQotCS8vIGhvcml6b250YWwgcmVjdGFuZ2xlCi0JVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKDAsIHRyYW5zbGF0ZVkpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmFkZFJlY3RhbmdsZSgwLCAwLCB3aWR0aCwgNTApOwotCVBhdHRlcm4gcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgMCwgMCwgd2lkdGgsIDUwLCAKLQkJCQlkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpLCAweDdmLAotCQkJCWRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSwgMHg3Zik7Ci0JZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JZ2MuZmlsbFBhdGgocGF0aCk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0KLQkvLyB2ZXJ0aWNhbCByZWN0YW5nbGUKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSh0cmFuc2xhdGVYLCAwKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguYWRkUmVjdGFuZ2xlKDAsIDAsIDUwLCBoZWlnaHQpOwotCXBhdHRlcm4uZGlzcG9zZSgpOwotCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIDAsIDAsIDUwLCBoZWlnaHQsIAotCQkJCWRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19DWUFOKSwgMHg3ZiwKLQkJCQlkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSwgMHg3Zik7Ci0JZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JZ2MuZmlsbFBhdGgocGF0aCk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0KLQkvLyBkaWFnb25hbCByZWN0YW5nbGUgZnJvbSBib3R0b20gcmlnaHQgY29ybmVyCi0JUmVjdGFuZ2xlIHJlY3QgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDUwLCBoZWlnaHQpOwotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdpZHRoLWRpYWdUcmFuc2xhdGVYMSwgKGhlaWdodC8yKS1kaWFnVHJhbnNsYXRlWTEpOwotCQotCS8vIHJvdGF0ZSBvbiBjZW50ZXIgb2YgcmVjdGFuZ2xlCi0JdHJhbnNmb3JtLnRyYW5zbGF0ZShyZWN0LndpZHRoLzIsIHJlY3QuaGVpZ2h0LzIpOwotCXRyYW5zZm9ybS5yb3RhdGUoNDUpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoLXJlY3Qud2lkdGgvMiwgLXJlY3QuaGVpZ2h0LzIpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5hZGRSZWN0YW5nbGUocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQlwYXR0ZXJuLmRpc3Bvc2UoKTsKLQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCByZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIAotCQkJZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0dSRUVOKSwgMHg3ZiwKLQkJCWRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19NQUdFTlRBKSwgMHg3Zik7Ci0JZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JZ2MuZmlsbFBhdGgocGF0aCk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JCi0JLy8gZGlhZ29uYWwgcmVjdGFuZ2xlIGZyb20gdG9wIHJpZ2h0IGNvcm5lcgotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdpZHRoLWRpYWdUcmFuc2xhdGVYMiwgKGhlaWdodC8yKS1kaWFnVHJhbnNsYXRlWTIpOwotCQotCS8vIHJvdGF0ZSBvbiBjZW50ZXIgb2YgcmVjdGFuZ2xlCi0JdHJhbnNmb3JtLnRyYW5zbGF0ZShyZWN0LndpZHRoLzIsIHJlY3QuaGVpZ2h0LzIpOwotCXRyYW5zZm9ybS5yb3RhdGUoLTQ1KTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKC1yZWN0LndpZHRoLzIsIC1yZWN0LmhlaWdodC8yKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguYWRkUmVjdGFuZ2xlKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JcGF0dGVybi5kaXNwb3NlKCk7Ci0JcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgcmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAKLQkJCWRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19SRUQpLCAweDdmLAotCQkJZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpLCAweDdmKTsKLQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQlnYy5maWxsUGF0aChwYXRoKTsKLQlnYy5kcmF3UGF0aChwYXRoKTsKLQlwYXR0ZXJuLmRpc3Bvc2UoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUmVnaW9uQ2xpcHBpbmdUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1JlZ2lvbkNsaXBwaW5nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNTM2ZjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUmVnaW9uQ2xpcHBpbmdUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgaG93IHRvIGFwcGx5IGEgcmVnaW9uIGNsaXBwaW5nIGFuZCB0aGUgZWZmZWN0cyBvZgotICogYXBwbHlpbmcgb25lLgotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uQ2xpcHBpbmdUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0JCi0JcHJpdmF0ZSBDb21ibyBjbGlwcGluZ0NiOwotCXByaXZhdGUgQnV0dG9uIGNvbG9yQnV0dG9uMSwgY29sb3JCdXR0b24yOwotCXByaXZhdGUgTWVudSBtZW51MSwgbWVudTI7Ci0JcHJpdmF0ZSBHcmFwaGljc0JhY2tncm91bmQgY29sb3JHQjEsIGNvbG9yR0IyOwotCi1wdWJsaWMgUmVnaW9uQ2xpcHBpbmdUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDbGlwcGluZyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZWdpb25DbGlwcGluZyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVnaW9uQ2xpcHBpbmdEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1lbnUxICE9IG51bGwpIHsKLQkJbWVudTEuZGlzcG9zZSgpOwotCQltZW51MSA9IG51bGw7Ci0JfQotCWlmIChtZW51MiAhPSBudWxsKSB7Ci0JCW1lbnUyLmRpc3Bvc2UoKTsKLQkJbWVudTIgPSBudWxsOwotCX0KLX0KLQotLyoqIAotICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRyYXdpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JLy8gY3JlYXRlIGRyb3AgZG93biBjb21ibyBmb3IgY2hvb3NpbmcgY2xpcHBpbmcKLQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygiQ2xpcHBpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCWNsaXBwaW5nQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVnaW9uMSIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVnaW9uMiIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQWRkIikpOyAvLyROT04tTkxTLTEkCi0JY2xpcHBpbmdDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTdWIiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkludGVyIikpOyAvLyROT04tTkxTLTEkCi0JY2xpcHBpbmdDYi5zZWxlY3QoMCk7Ci0JY2xpcHBpbmdDYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCi0JLy8gY29sb3IgbWVudQotCUNvbG9yTWVudSBjbSA9IG5ldyBDb2xvck1lbnUoKTsKLQltZW51MSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQljb2xvckdCMSA9IGdiOwkJCi0JCQljb2xvckJ1dHRvbjEuc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCW1lbnUyID0gY20uY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCWNvbG9yR0IyID0gZ2I7CQkKLQkJCWNvbG9yQnV0dG9uMi5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gaW5pdGlhbGl6ZSB0aGUgY29sb3IgdG8gYmx1ZQotCWNvbG9yR0IxID0gKEdyYXBoaWNzQmFja2dyb3VuZCltZW51MS5nZXRJdGVtKDQpLmdldERhdGEoKTsKLQkvLyBpbml0aWFsaXplIHRoZSBjb2xvciB0byByZWQKLQljb2xvckdCMiA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudTIuZ2V0SXRlbSgyKS5nZXREYXRhKCk7Ci0JCi0JLy8gY29sb3IgYnV0dG9uIDEKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCWNvbG9yQnV0dG9uMSA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uMS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJDb2xvcjEiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbjEuc2V0SW1hZ2UoY29sb3JHQjEuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9yQnV0dG9uMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51MS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51MS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci0KLQkvLyBjb2xvciBidXR0b24gMgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JY29sb3JCdXR0b24yID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JY29sb3JCdXR0b24yLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yMiIpKTsgLy8kTk9OLU5MUy0xJAotCWNvbG9yQnV0dG9uMi5zZXRJbWFnZShjb2xvckdCMi5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JCdXR0b24yLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCW1lbnUyLnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUyLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQkvLyBhcnJheSBvZiBjb29yZGluYXRlIHBvaW50cyBvZiBwb2x5Z29uIDEgKHJlZ2lvbiAxKQotCWludCBbXSBwb2x5Z29uMSA9IG5ldyBpbnQgW10gezEwLCBoZWlnaHQvMiwgOSp3aWR0aC8xNiwgMTAsIDkqd2lkdGgvMTYsIGhlaWdodC0xMH07Ci0JUmVnaW9uIHJlZ2lvbjEgPSBuZXcgUmVnaW9uKGRldmljZSk7Ci0JcmVnaW9uMS5hZGQocG9seWdvbjEpOwotCi0JLy8gYXJyYXkgb2YgY29vcmRpbmF0ZSBwb2ludHMgb2YgcG9seWdvbiAyIChyZWdpb24gMikKLQlpbnQgW10gcG9seWdvbjIgPSBuZXcgaW50IFtdIHsKLQkJCTkqd2lkdGgvMTYsIDEwLAotCQkJOSp3aWR0aC8xNiwgaGVpZ2h0LzgsCi0JCQk3KndpZHRoLzE2LCAyKmhlaWdodC84LAotCQkJOSp3aWR0aC8xNiwgMypoZWlnaHQvOCwKLQkJCTcqd2lkdGgvMTYsIDQqaGVpZ2h0LzgsCi0JCQk5KndpZHRoLzE2LCA1KmhlaWdodC84LAotCQkJNyp3aWR0aC8xNiwgNipoZWlnaHQvOCwKLQkJCTkqd2lkdGgvMTYsIDcqaGVpZ2h0LzgsCi0JCQk5KndpZHRoLzE2LCBoZWlnaHQtMTAsCi0JCQl3aWR0aC0xMCwgaGVpZ2h0LzIKLQl9OwotCVJlZ2lvbiByZWdpb24yID0gbmV3IFJlZ2lvbihkZXZpY2UpOwotCXJlZ2lvbjIuYWRkKHBvbHlnb24yKTsKLQkKLQlnYy5zZXRBbHBoYSgxMjcpOwotCQotCWludCBjbGlwcGluZ0luZGV4ID0gY2xpcHBpbmdDYi5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQotCXN3aXRjaCAoY2xpcHBpbmdJbmRleCkgewotCWNhc2UgMDoKLQkJLy8gcmVnaW9uIDEKLQkJZ2Muc2V0Q2xpcHBpbmcocmVnaW9uMSk7Ci0JCWdjLnNldEJhY2tncm91bmQoY29sb3JHQjEuZ2V0QmdDb2xvcjEoKSk7Ci0JCWdjLmZpbGxQb2x5Z29uKHBvbHlnb24xKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQkvLyByZWdpb24gMgotCQlnYy5zZXRDbGlwcGluZyhyZWdpb24yKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvckdCMi5nZXRCZ0NvbG9yMSgpKTsKLQkJZ2MuZmlsbFBvbHlnb24ocG9seWdvbjIpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCS8vIGFkZAkJCi0JCXJlZ2lvbjEuYWRkKHJlZ2lvbjIpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCS8vIHN1YgotCQlyZWdpb24xLnN1YnRyYWN0KHJlZ2lvbjIpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCS8vIGludGVyc2VjdAotCQlyZWdpb24xLmludGVyc2VjdChyZWdpb24yKTsKLQkJYnJlYWs7CQkKLQl9Ci0JCi0JaWYgKGNsaXBwaW5nSW5kZXggPiAxKSB7Ci0JCWdjLnNldENsaXBwaW5nKHJlZ2lvbjEpOwotCQkKLQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvckdCMS5nZXRCZ0NvbG9yMSgpKTsKLQkJZ2MuZmlsbFBvbHlnb24ocG9seWdvbjEpOwotCQkKLQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvckdCMi5nZXRCZ0NvbG9yMSgpKTsKLQkgICAgZ2MuZmlsbFBvbHlnb24ocG9seWdvbjIpOwotCX0KLQkKLQlyZWdpb24xLmRpc3Bvc2UoKTsKLQlyZWdpb24yLmRpc3Bvc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TaGFwZXNUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1NoYXBlc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2ViY2RiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1NoYXBlc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRyYXdzIDNEIHNoYXBlcyAoaW4gMkQpIHVzaW5nIHZhcmlvdXMgbGluZSBzdHlsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaGFwZXNUYWIgZXh0ZW5kcyBBbmltYXRlZEdyYXBoaWNzVGFiIHsKLQkKLQlpbnQgdXBEb3duVmFsdWU7Ci0JaW50IGluYyA9IDE7Ci0JCi1wdWJsaWMgU2hhcGVzVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci0JdXBEb3duVmFsdWUgPSAwOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNoYXBlcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2hhcGVzRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCXVwRG93blZhbHVlICs9IGluYzsKLQotCWlmICh1cERvd25WYWx1ZSA+IDUpIGluYyA9IC0xOwotCWlmICh1cERvd25WYWx1ZSA8IC01KSBpbmMgPSAxOwotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JaW50IHNpemUgPSAxMDA7Ci0JCi0JZ2Muc2V0TGluZVdpZHRoKDIpOwotCQotCS8vIC0tLS0tIGN1YmUgLS0tLS0KLQkKLQlUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUod2lkdGgvNCAtIHNpemUsIGhlaWdodC80ICsgLXVwRG93blZhbHVlKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfRE9UKTsKLQotCS8vIGZpbGwgaW4gbGVmdCBmYWNlCi0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnQgW10gezAsIDAsIHNpemUvMywgLXNpemUvMiwgc2l6ZS8zLCBzaXplLzIsIDAsIHNpemV9KTsKLQkKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCQotCS8vIHNxdWFyZQotCWdjLmRyYXdSZWN0YW5nbGUoMCwgMCwgc2l6ZSwgc2l6ZSk7Ci0JCi0JLy8gbmV4dCAzIHNvbGlkIGxpbmVzCi0JZ2MuZHJhd0xpbmUoMCwgMCwgc2l6ZS8zLCAtc2l6ZS8yKTsJCQkvLyBsZWZ0Ci0JZ2MuZHJhd0xpbmUoc2l6ZSwgMCwgNCpzaXplLzMsIC1zaXplLzIpOwkvLyBtaWRkbGUKLQlnYy5kcmF3TGluZShzaXplLCBzaXplLCA0KnNpemUvMywgc2l6ZS8yKTsJLy8gcmlnaHQKLQkKLQkvLyAyIGZ1cnRoZXN0IHNvbGlkIGxpbmVzCi0JZ2MuZHJhd0xpbmUoc2l6ZS8zLCAtc2l6ZS8yLCA0KnNpemUvMywgLXNpemUvMik7ICAJLy8gaG9yaXpvbnRhbAotCWdjLmRyYXdMaW5lKDQqc2l6ZS8zLCBzaXplLzIsIDQqc2l6ZS8zLCAtc2l6ZS8yKTsJLy8gdmVydGljYWwKLQkKLQkvLyAzIGRvdHRlZCBsaW5lcwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9ET1QpOwotCWdjLmRyYXdMaW5lKDAsIHNpemUsIHNpemUvMywgc2l6ZS8yKTsKLQlnYy5kcmF3TGluZShzaXplLzMsIC1zaXplLzIsIHNpemUvMywgc2l6ZS8yKTsKLQlnYy5kcmF3TGluZSg0KnNpemUvMywgc2l6ZS8yLCBzaXplLzMsIHNpemUvMik7Ci0JCi0JLy8gZmlsbCByaWdodCBzaWRlIG9mIGN1YmUKLQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSkpOwotCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnQgW10ge3NpemUsIDAsIDQqc2l6ZS8zLCAtc2l6ZS8yLCA0KnNpemUvMywgc2l6ZS8yLCBzaXplLCBzaXplfSk7Ci0JCi0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQkvLyAtLS0tLSBweXJhbWlkIC0tLS0tCi0JCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUod2lkdGgvMiArIHNpemUvMiwgaGVpZ2h0LzQgKyBzaXplICsgdXBEb3duVmFsdWUpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQotCS8vIGZpbGwgYmFjayBvZiBweXJhbWlkCi0JZ2MuZmlsbFBvbHlnb24obmV3IGludCBbXSB7c2l6ZS8zLCAtc2l6ZS8yLCA2KnNpemUvMTAsIC01KnNpemUvNCwgNCpzaXplLzMsIC1zaXplLzJ9KTsKLQkKLQkvLyBmaWxsIGxlZnQgc2lkZSBvZiBweXJhbWlkCi0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JZ2MuZmlsbFBvbHlnb24obmV3IGludCBbXSB7MCwgMCwgNipzaXplLzEwLCAtNSpzaXplLzQsIHNpemUvMywgLXNpemUvMn0pOwotCQotCS8vIHNlbGVjdCBzb2xpZCBsaW5lIHN0eWxlCi0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQkKLQkvLyAyIHNvbGlkIGxpbmVzIG9mIGJhc2UKLQlnYy5kcmF3TGluZSgwLCAwLCBzaXplLCAwKTsKLQlnYy5kcmF3TGluZShzaXplLCAwLCA0KnNpemUvMywgLXNpemUvMik7Ci0JCi0JLy8gMyBzb2xpZCBsaW5lcyBvZiBweXJhbWlkCi0JZ2MuZHJhd0xpbmUoMCwgMCwgNipzaXplLzEwLCAtNSpzaXplLzQpOwotCWdjLmRyYXdMaW5lKHNpemUsIDAsIDYqc2l6ZS8xMCwgLTUqc2l6ZS80KTsKLQlnYy5kcmF3TGluZSg0KnNpemUvMywgLXNpemUvMiwgNipzaXplLzEwLCAtNSpzaXplLzQpOwotCQotCS8vIHNlbGVjdCBkb3QgbGluZSBzdHlsZQotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9ET1QpOwotCQotCS8vIDMgZG90dGVkIGxpbmVzCi0JZ2MuZHJhd0xpbmUoMCwgMCwgc2l6ZS8zLCAtc2l6ZS8yKTsJCQkJCS8vIGxlZnQgCi0JZ2MuZHJhd0xpbmUoc2l6ZS8zLCAtc2l6ZS8yLCA2KnNpemUvMTAsIC01KnNpemUvNCk7IC8vIHRvIHRvcCBvZiBweXJhbWlkCi0JZ2MuZHJhd0xpbmUoNCpzaXplLzMsIC1zaXplLzIsIHNpemUvMywgLXNpemUvMik7CS8vIHJpZ2h0Ci0KLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCS8vIC0tLS0tIHJlY3Rhbmd1bGFyIHByaXNtIC0tLS0tCi0JCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUod2lkdGgvMiArIHVwRG93blZhbHVlLCBoZWlnaHQvMiArIHNpemUpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQotCS8vIGZpbGwgYm90dG9tCi0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQlnYy5maWxsUG9seWdvbihuZXcgaW50IFtdIHswLCBzaXplLCBzaXplLzMsIHNpemUvMiwgNypzaXplLzMsIHNpemUvMiwgMipzaXplLCBzaXplfSk7Ci0JCi0JLy8gc2VsZWN0IHNvbGlkIGxpbmUgc3R5bGUKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCQotCWdjLmRyYXdSZWN0YW5nbGUoMCwgMCwgMipzaXplLCBzaXplKTsKLQkKLQkvLyBuZXh0IDMgc29saWQgbGluZXMKLQlnYy5kcmF3TGluZSgwLCAwLCBzaXplLzMsIC1zaXplLzIpOwkJCS8vIGxlZnQKLQlnYy5kcmF3TGluZSgyKnNpemUsIDAsIDcqc2l6ZS8zLCAtc2l6ZS8yKTsJLy8gbWlkZGxlCi0JZ2MuZHJhd0xpbmUoMipzaXplLCBzaXplLCA3KnNpemUvMywgc2l6ZS8yKTsJLy8gcmlnaHQKLQkKLQkvLyAyIGZ1cnRoZXN0IHNvbGlkIGxpbmVzCi0JZ2MuZHJhd0xpbmUoc2l6ZS8zLCAtc2l6ZS8yLCA3KnNpemUvMywgLXNpemUvMik7ICAJLy8gaG9yaXpvbnRhbAotCWdjLmRyYXdMaW5lKDcqc2l6ZS8zLCBzaXplLzIsIDcqc2l6ZS8zLCAtc2l6ZS8yKTsJLy8gdmVydGljYWwKLQkKLQkvLyAzIGRvdHRlZCBsaW5lcwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIRE9URE9UKTsKLQlnYy5kcmF3TGluZSgwLCBzaXplLCBzaXplLzMsIHNpemUvMik7Ci0JZ2MuZHJhd0xpbmUoc2l6ZS8zLCAtc2l6ZS8yLCBzaXplLzMsIHNpemUvMik7Ci0JZ2MuZHJhd0xpbmUoNypzaXplLzMsIHNpemUvMiwgc2l6ZS8zLCBzaXplLzIpOwotCQotCS8vIGZpbGwgdG9wCi0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpKTsKLQlnYy5maWxsUG9seWdvbihuZXcgaW50IFtdIHswLCAwLCBzaXplLzMsIC1zaXplLzIsIDcqc2l6ZS8zLCAtc2l6ZS8yLCAyKnNpemUsIDB9KTsKLQotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JLy8gLS0tLS0gdHJpYW5ndWxhciBzaGFwZSAtLS0tLQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdpZHRoLzQgLSBzaXplIC0gdXBEb3duVmFsdWUsIGhlaWdodC8yICsgc2l6ZSArIHVwRG93blZhbHVlKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkKLQkvLyBmaWxsIGJhY2sgb2Ygc2hhcGUgKHRvcCBsZWZ0KQotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQlnYy5maWxsUG9seWdvbihuZXcgaW50IFtdIHswLCAwLCBzaXplLzIsIC1zaXplLCBzaXplLzIsIC1zaXplLzN9KTsKLQotCS8vIGZpbGwgYmFjayBvZiBzaGFwZSAoYm90dG9tIHJpZ2h0KQotCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnQgW10ge3NpemUsIDAsIHNpemUvMiwgc2l6ZSwgc2l6ZS8yLCAtc2l6ZS8zfSk7Ci0JCi0JLy8gc2VsZWN0IHNvbGlkIGxpbmUgc3R5bGUKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCQotCS8vIHNvbGlkIGxpbmVzIG9mIGJvdHRvbSB0cmlhbmdsZQotCWdjLmRyYXdMaW5lKDAsIDAsIHNpemUvMiwgc2l6ZSk7Ci0JZ2MuZHJhd0xpbmUoc2l6ZSwgMCwgc2l6ZS8yLCBzaXplKTsKLQkKLQkvLyBzb2xpZCBsaW5lcyBvZiB0b3AgdHJpYW5nbGUKLQlnYy5kcmF3TGluZSgwLCAwLCBzaXplLzIsIC1zaXplKTsKLQlnYy5kcmF3TGluZShzaXplLCAwLCBzaXplLzIsIC1zaXplKTsKLQkKLQkvLyBzb2xpZCBsaW5lcyBvbiB0b3AKLQlnYy5kcmF3TGluZSgwLCAwLCBzaXplLzIsIC1zaXplLzMpOwotCWdjLmRyYXdMaW5lKHNpemUsIDAsIHNpemUvMiwgLXNpemUvMyk7Ci0JZ2MuZHJhd0xpbmUoc2l6ZS8yLCAtc2l6ZS8zLCBzaXplLzIsIHNpemUpOwotCWdjLmRyYXdMaW5lKHNpemUvMiwgLXNpemUvMywgc2l6ZS8yLCAtc2l6ZSk7Ci0JCi0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLX0KLQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TcGlyYWxUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1NwaXJhbFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTEyMmVmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1NwaXJhbFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIHByZXNlbnRzIGEgc3BpcmFsIGNvbnNpc3Rpbmcgb2YgdGhlIG51bWJlciBvZiBwZXRhbHMgc3BlY2lmaWVkLgotICogKi8KLXB1YmxpYyBjbGFzcyBTcGlyYWxUYWIgZXh0ZW5kcyBBbmltYXRlZEdyYXBoaWNzVGFiIHsKLQkKLQlpbnQgYW5nbGU7CQkJCQkvLyBhbmdsZSBieSB3aGljaCB0byByb3RhdGUgdGhlIHBldGFscwotCVNwaW5uZXIgcGV0YWxTcGlubmVyOwkJLy8gc3Bpbm5lciB0byBjb250cm9sIG51bWJlciBvZiBwZXRhbHMKLQlCdXR0b24gY29sb3JCdXR0b247Ci0JR3JhcGhpY3NCYWNrZ3JvdW5kIGZvcmVncm91bmQ7Ci0JTWVudSBtZW51OwotCQotcHVibGljIFNwaXJhbFRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotCWFuZ2xlID0gLTkwOwotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLS8qKgotICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNwaW5uZXIgZm9yIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBwZXRhbHMuIFRoZSBjYWxsIHRvIHRoZQotICogY3JlYXRlQ29udHJvbFBhbmVsIG1ldGhvZCBpbiB0aGUgc3VwZXIgY2xhc3MgY3JlYXRlIHRoZSBjb250cm9scyB0aGF0IGFyZQotICogZGVmaW5lZCBpbiB0aGUgc3VwZXIgY2xhc3MuCi0gKiAKLSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUgCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0Jc3VwZXIuY3JlYXRlQ29udHJvbFBhbmVsKHBhcmVudCk7Ci0JCQotCS8vIGNyZWF0ZSBzcGlubmVyIG51bWJlciBvZiBwZXRhbHMKLQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygiUGV0YWxzIikpOyAvLyROT04tTkxTLTEkCi0JcGV0YWxTcGlubmVyID0gbmV3IFNwaW5uZXIoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlwZXRhbFNwaW5uZXIuc2V0U2VsZWN0aW9uKDgpOwotCXBldGFsU3Bpbm5lci5zZXRNaW5pbXVtKDMpOwotCXBldGFsU3Bpbm5lci5zZXRNYXhpbXVtKDIwKTsKLQlwZXRhbFNwaW5uZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjcmVhdGUgY29sb3IgYnV0dG9uCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCi0JQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCWNtLnNldFBhdHRlcm5JdGVtcyhleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKTsKLQltZW51ID0gY20uY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCWZvcmVncm91bmQgPSBnYjsJCQotCQkJY29sb3JCdXR0b24uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCi0JLy8gaW5pdGlhbGl6ZSB0aGUgZm9yZWdyb3VuZCB0byB0aGUgMm5kIGl0ZW0gaW4gdGhlIG1lbnUKLQlmb3JlZ3JvdW5kID0gKEdyYXBoaWNzQmFja2dyb3VuZCltZW51LmdldEl0ZW0oMSkuZ2V0RGF0YSgpOwotCQotCS8vIGNvbG9yIGJ1dHRvbgotCWNvbG9yQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JY29sb3JCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbi5zZXRJbWFnZShmb3JlZ3JvdW5kLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1pc2MiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3BpcmFsIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTcGlyYWxEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkFuaW1hdGVkR3JhcGhpY3NUYWIjZ2V0QW5pbWF0aW9uVGltZSgpCi0gKi8KLXB1YmxpYyBpbnQgZ2V0SW5pdGlhbEFuaW1hdGlvblRpbWUoKSB7Ci0JcmV0dXJuIDE1MDsJCi19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkFuaW1hdGVkR3JhcGhpY3NUYWIjbmV4dChpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoYW5nbGUgPT0gMjcwKSB7Ci0JCWFuZ2xlID0gLTkwOwotCX0KLQlhbmdsZSArPSAxMDsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQkvLyBzZXQgbGluZSBhdHRyaWJ1dGVzCi0JZ2Muc2V0TGluZVdpZHRoKDIwKTsKLQlnYy5zZXRMaW5lQ2FwKFNXVC5DQVBfUk9VTkQpOwkvLyByb3VuZCBsaW5lIGVuZHMKLQlnYy5zZXRBbnRpYWxpYXMoU1dULk9OKTsJLy8gc21vb3RoIGphZ2dlZCBlZGdlcwotCQotCVBhdHRlcm4gcGF0dGVybiA9IG51bGw7Ci0JaWYgKGZvcmVncm91bmQuZ2V0QmdDb2xvcjEoKSAhPSBudWxsKSB7Ci0JCWdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZC5nZXRCZ0NvbG9yMSgpKTsKLQl9IGVsc2UgaWYgKGZvcmVncm91bmQuZ2V0QmdJbWFnZSgpICE9IG51bGwpIHsKLQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgZm9yZWdyb3VuZC5nZXRCZ0ltYWdlKCkpOwotCQlnYy5zZXRGb3JlZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQl9Ci0KLQkvLyBkcmF3IHBldGFscyBmb3IgdGhlIHNwaXJhbAotCVRyYW5zZm9ybSB0cmFuc2Zvcm07Ci0JaW50IG4gPSBwZXRhbFNwaW5uZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JZm9yIChpbnQgaT0wOyBpIDwgbjsgaSsrKSB7Ci0JCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQkJdHJhbnNmb3JtLnRyYW5zbGF0ZSh3aWR0aC8yLCBoZWlnaHQvMik7Ci0JCXRyYW5zZm9ybS5yb3RhdGUoLShhbmdsZSArIDM2MC9uICogaSkpOwotCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJZ2MuZHJhd0FyYygwLCAwLCB3aWR0aC8zLCBoZWlnaHQvNiwgMCwgMTgwKTsKLQkJdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JaWYgKHBhdHRlcm4gIT0gbnVsbCkgcGF0dGVybi5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TdGFyUG9seVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU3RhclBvbHlUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiZWUxMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TdGFyUG9seVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTdGFyUG9seVRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQlpbnRbXSByYWRpYWw7Ci0Jc3RhdGljIGZpbmFsIGludCBQT0lOVFMgID0gMTE7Ci0JCi0JQ29tYm8gZmlsbFJ1bGVDYjsKLQotcHVibGljIFN0YXJQb2x5VGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci0JcmFkaWFsID0gbmV3IGludFtQT0lOVFMgKiAyXTsKLX0KLQotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGxSdWxlIikpOyAvLyROT04tTkxTLTEkCi0JZmlsbFJ1bGVDYiA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5EUk9QX0RPV04pOwotCWZpbGxSdWxlQ2IuYWRkKCJGSUxMX0VWRU5fT0REIik7Ci0JZmlsbFJ1bGVDYi5hZGQoIkZJTExfV0lORElORyIpOwotCWZpbGxSdWxlQ2Iuc2VsZWN0KDApOwotCWZpbGxSdWxlQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQb2x5Z29ucyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTdGFyUG9seWdvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3RhclBvbHlnb25EZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICBpbnQgY2VudGVyWCA9IHdpZHRoIC8gMjsKLSAgICBpbnQgY2VudGVyWSA9IGhlaWdodCAvIDI7Ci0gICAgaW50IHBvcyA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQT0lOVFM7ICsraSkgewotICAgICAgICBkb3VibGUgciA9IE1hdGguUEkqMiAqIHBvcy9QT0lOVFM7Ci0gICAgICAgIHJhZGlhbFtpKjJdID0gKGludCkoKDErTWF0aC5jb3MocikpKmNlbnRlclgpOwotICAgICAgICByYWRpYWxbaSoyKzFdID0gKGludCkoKDErTWF0aC5zaW4ocikpKmNlbnRlclkpOwotICAgICAgICBwb3MgPSAocG9zICsgUE9JTlRTLzIpICUgUE9JTlRTOwotICAgIH0KLQlnYy5zZXRGaWxsUnVsZShmaWxsUnVsZUNiLmdldFNlbGVjdGlvbkluZGV4KCkgIT0gMCA/IFNXVC5GSUxMX1dJTkRJTkcgOiBTV1QuRklMTF9FVkVOX09ERCk7Ci0JZ2Muc2V0QmFja2dyb3VuZChnYy5nZXREZXZpY2UoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKSk7Ci0gICAgZ2MuZmlsbFBvbHlnb24ocmFkaWFsKTsKLSAgICBnYy5kcmF3UG9seWdvbihyYWRpYWwpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvVGV4dEFudGlhbGlhc1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvVGV4dEFudGlhbGlhc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWJhMjJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1RleHRBbnRpYWxpYXNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgYW50aWFsaWFzaW5nIGZvciB0ZXh0LiBBbnRpYWxpYXNpbmcgaXMgdXNlZCBmb3IKLSAqIHNtb290aGluZyBqYWdnZWQgZWRnZXMgaW4gZ3JhcGhpY3MuIFRoaXMgdGFiIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlCi0gKiBlZmZlY3RzIG9mIGRpZmZlcmVudCBhbnRpYWxpYXNpbmcgdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dEFudGlhbGlhc1RhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQotCUNvbWJvIGFsaWFzQ29tYm87Ci0Jc3RhdGljIGludFtdIGFsaWFzVmFsdWVzID0geyBTV1QuT0ZGLCBTV1QuREVGQVVMVCwgU1dULk9OIH07Ci0JCi0JQnV0dG9uIGNvbG9yQnV0dG9uOwotCU1lbnUgbWVudTsKLQlHcmFwaGljc0JhY2tncm91bmQgdGV4dENvbG9yOwotCVN0cmluZyB0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTV1QiKTsKLQotCQotcHVibGljIFRleHRBbnRpYWxpYXNUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbnRpYWxpYXNpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGV4dCIpOyAvLyROT04tTkxTLTEkIAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFudGlhbGlhc2luZ1RleHREZXNjIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCW1lbnUuZGlzcG9zZSgpOwotCQltZW51ID0gbnVsbDsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQlDb21wb3NpdGUgY29tcDsKLQkKLQkvLyBjcmVhdGUgZHJvcCBkb3duIGNvbWJvIGZvciBhbnRpYWxpYXNpbmcKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJBbnRpYWxpYXNpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQlhbGlhc0NvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCWFsaWFzQ29tYm8uYWRkKCJPRkYiKTsKLQlhbGlhc0NvbWJvLmFkZCgiREVGQVVMVCIpOwotCWFsaWFzQ29tYm8uYWRkKCJPTiIpOwotCWFsaWFzQ29tYm8uc2VsZWN0KDApOwotCWFsaWFzQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkJCi0JQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCWNtLnNldENvbG9ySXRlbXModHJ1ZSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQl0ZXh0Q29sb3IgPSBnYjsKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjcmVhdGUgY29sb3IgYnV0dG9uCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCi0JLy8gaW5pdGlhbGl6ZSB0aGUgY29sb3IgdG8gYmxhY2sKLQl0ZXh0Q29sb3IgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUuZ2V0SXRlbSgxKS5nZXREYXRhKCk7Ci0JCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbi5zZXRJbWFnZSh0ZXh0Q29sb3IuZ2V0VGh1bWJOYWlsKCkpOwotCQotCWNvbG9yQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JaWYgKHRleHRDb2xvciAhPSBudWxsICYmIHRleHRDb2xvci5nZXRCZ0NvbG9yMSgpICE9IG51bGwpCi0JCWdjLnNldEZvcmVncm91bmQodGV4dENvbG9yLmdldEJnQ29sb3IxKCkpOwotCi0JZ2Muc2V0VGV4dEFudGlhbGlhcyhhbGlhc1ZhbHVlc1thbGlhc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldKTsKLQotCS8vIGNvbHVtbiAxLCByb3cgMQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZSgwKSwgMTAwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCVBvaW50IHNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCB3aWR0aC80IC0gc2l6ZS54LzIsIGhlaWdodC80IC0gc2l6ZS55LzIsIHRydWUpOwotCWZvbnQuZGlzcG9zZSgpOwotCQotCS8vIGNvbHVtbiAxLCByb3cgMgotCWZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udEZhY2UoMSksIDEwMCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgd2lkdGgvNCAtIHNpemUueC8yLCAzKmhlaWdodC80IC0gc2l6ZS55LzIsIHRydWUpOwotCWZvbnQuZGlzcG9zZSgpOwotCQotCS8vIGNvbHVtbiAyLCByb3cgMQotCWZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udEZhY2UoMiksIDUwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCAwLCB0cnVlKTsKLQlmb250LmRpc3Bvc2UoKTsKLQkKLQkvLyBjb2x1bW4gMiwgcm93IDIKLQlmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBnZXRQbGF0Zm9ybUZvbnRGYWNlKDMpLCAxMDAsIFNXVC5JVEFMSUMpOwotCWdjLnNldEZvbnQoZm9udCk7Ci0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIChoZWlnaHQtc2l6ZS55KS8yLCB0cnVlKTsKLQlmb250LmRpc3Bvc2UoKTsKLQkKLQkvLyBjb2x1bW4gMiwgcm93IDMKLQlmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBnZXRQbGF0Zm9ybUZvbnRGYWNlKDQpLCA1MCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgaGVpZ2h0LXNpemUueSwgdHJ1ZSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JCi0JLy8gY29sdW1uIDMsIHJvdyAxCi0JZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZSg1KSwgMTAwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAzKndpZHRoLzQgLSBzaXplLngvMiwgaGVpZ2h0LzQgLSBzaXplLnkvMiwgdHJ1ZSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JCi0JLy8gY29sdW1uIDMsIHJvdyAyCi0JZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZSg2KSwgMTAwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAzKndpZHRoLzQgLSBzaXplLngvMiwgMypoZWlnaHQvNCAtIHNpemUueS8yLCB0cnVlKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgdmFsaWQgZm9udCBmb3IgdGhlIGhvc3QgcGxhdGZvcm0uCi0gKiAKLSAqIEBwYXJhbSBpbmRleAotICogICAgICAgICAgICBpbmRleCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZm9udCBmYWNlCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250RmFjZShpbnQgaW5kZXgpIHsKLQlpZihTV1QuZ2V0UGxhdGZvcm0oKSA9PSAid2luMzIiIHx8IFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3cGYiKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiQm9va21hbiBPbGQgU3R5bGUiLCAiQ2VudHVyeSBHb3RoaWMiLCAiQ29taWMgU2FucyBNUyIsICJJbXBhY3QiLCAiR2FyYW1vbmQiLCAiTHVjaWRhIENvbnNvbGUiLCAiTW9ub3R5cGUgQ29yc2l2YSJ9IFtpbmRleF07CQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7InVydyBwYWxsYWRpbyBsIiwgIkNvdXJpZXIiLCAicXViIiwgIlVSVyBHb3RoaWMgTCIsICJUaW1lcyIsICJMdWNpZGEiLCAiVVJXIENoYW5jZXJ5TCJ9IFtpbmRleF07Ci0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiZ3RrIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7Ikx1eGkgTW9ubyIsICJLYWNzdFRpdGxlTCIsICJCYWVrbXVrIEJhdGFuZyIsICJCYWVrbXVrIEhlYWRsaW5lIiwgIkthY3N0RmFyc2kiLCAiQmFla211ayBHdWxpbSIsICJVUlcgQ2hhbmNlcnkgTCJ9IFtpbmRleF07Ci0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IkFwcGxlIENoYW5jZXJ5IiwgIkJydXNoIFNjcmlwdCBNVCIsICJDb21pYyBTYW5zIE1TIiwgIkltcGFjdCIsICJIZXJjdWxhbnVtIiwgIkx1Y2lkYSBHcmFuZGUiLCAiUGFweXJ1cyJ9IFtpbmRleF07Ci0JfSBlbHNlIHsgLy8gcGhvdG9uLCBldGMgLi4uCi0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiQ291cmllciIsICJWZXJkYW5hIiwgIlZlcmRhbmEiLCAiVmVyZGFuYSIsICJWZXJkYW5hIiwgIlZlcmRhbmEiLCAiVmVyZGFuYSJ9IFtpbmRleF07Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX2NsdWIuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX2NsdWIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDVlYTMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9jbHViLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9kaWFtb25kLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9kaWFtb25kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmMTNmMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9hY2VfZGlhbW9uZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9hY2VfaGVhcnRzLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9oZWFydHMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQzMWIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9oZWFydHMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX3NwYWRlLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9zcGFkZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDkxMTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX3NwYWRlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FscGhhX2ltZzEucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWxwaGFfaW1nMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDEwZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWxwaGFfaW1nMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9hbHBoYV9pbWcyLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FscGhhX2ltZzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzIwMjE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FscGhhX2ltZzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYmFjay5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiNDE1MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2N1YmUucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvY3ViZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNmE0YTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvY3ViZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9kYi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9kYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMTNkOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvZGIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvZm9udC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9mb250LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzODk0OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9mb250LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2hlbHAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaGVscC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzAzMDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaGVscC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9ob21lX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9ob21lX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NzJlOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaG9tZV9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaG91c2VzLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2hvdXNlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTgxNGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaG91c2VzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2lybWFvcy5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9pcm1hb3MuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzUyY2RlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2lybWFvcy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9tYXplLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL21hemUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjg3ZTc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL21hemUuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvbmV4dC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9uZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmOGMzZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9uZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL292YWxzLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL292YWxzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZmU1ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9vdmFscy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXR0ZXJuMS5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXR0ZXJuMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NmE3ZDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF0dGVybjEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF0dGVybjIuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF0dGVybjIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjg5ZWNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdHRlcm4yLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdHRlcm4zLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdHRlcm4zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlMDZhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXR0ZXJuMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXVzZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXVzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWUzZjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF1c2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGxheS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wbGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmNGUyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wbGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3N3YXAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3Mvc3dhcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MDkzNGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3Mvc3dhcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9zd3QucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3Mvc3d0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0OWI1NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9zd3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvdGFzay5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy90YXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkMTBmNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy90YXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWM5OGRjMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb2RlIHJlcXVpcmVkCi0gKiB0byBvcGVuIGFuIFNXVCBTaGVsbCBhbmQgcHJvY2VzcyB0aGUgZXZlbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBIZWxsb1dvcmxkMSAoKS5vcGVuIChkaXNwbGF5KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCXJldHVybiBzaGVsbDsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIwYzhjOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKgotICogVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMSBhbmQgZGVtb25zdHJhdGVzIHRoZSBtaW5pbXVtIGFtb3VudCAKLSAqIG9mIGNvZGUgcmVxdWlyZWQgdG8gb3BlbiBhbiBTV1QgU2hlbGwgd2l0aCBhIExhYmVsIGFuZCBwcm9jZXNzIHRoZSBldmVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkMiB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzSGVsbG8gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2hlbGxvd29ybGQiKTsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEhlbGxvV29ybGQyICgpLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQ0VOVEVSKTsKLQlsYWJlbC5zZXRUZXh0IChyZXNIZWxsby5nZXRTdHJpbmcoIkhlbGxvX3dvcmxkIikpOwotCWxhYmVsLnNldEJvdW5kcyAoc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNjFhZDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qCi0gKiBUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQyIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlc2l6ZSB0aGUgCi0gKiBMYWJlbCB3aGVuIHRoZSBTaGVsbCByZXNpemVzIHVzaW5nIGEgTGlzdGVuZXIgbWVjaGFuaXNtLgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDMgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0hlbGxvID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19oZWxsb3dvcmxkIik7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBIZWxsb1dvcmxkMyAoKS5vcGVuIChkaXNwbGF5KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi1wdWJsaWMgU2hlbGwgb3BlbiAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCAocmVzSGVsbG8uZ2V0U3RyaW5nKCJIZWxsb193b3JsZCIpKTsKLQlsYWJlbC5wYWNrKCk7Ci0Jc2hlbGwuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCWxhYmVsLnNldEJvdW5kcyAoc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwNGY0NTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoKLSAqIFRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDIgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gcmVzaXplIHRoZSAKLSAqIExhYmVsIHdoZW4gdGhlIFNoZWxsIHJlc2l6ZXMgdXNpbmcgYSBMYXlvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkNCB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzSGVsbG8gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2hlbGxvd29ybGQiKTsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEhlbGxvV29ybGQ0ICgpLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCAocmVzSGVsbG8uZ2V0U3RyaW5nKCJIZWxsb193b3JsZCIpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JcmV0dXJuIHNoZWxsOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MzYxMTU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qCi0gKiBUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQxIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIGRyYXcgZGlyZWN0bHkKLSAqIG9uIGFuIFNXVCBDb250cm9sLgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0hlbGxvID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19oZWxsb3dvcmxkIik7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEhlbGxvV29ybGQ1ICgpLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlmaW5hbCBDb2xvciByZWQgPSBuZXcgQ29sb3IoZGlzcGxheSwgMHhGRiwgMCwgMCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCl7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChyZWQpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhKCk7Ci0JCQlnYy5kcmF3UmVjdGFuZ2xlKHJlY3QueCArIDEwLCByZWN0LnkgKyAxMCwgcmVjdC53aWR0aCAtIDIwLCByZWN0LmhlaWdodCAtIDIwKTsKLQkJCWdjLmRyYXdTdHJpbmcocmVzSGVsbG8uZ2V0U3RyaW5nKCJIZWxsb193b3JsZCIpLCByZWN0LnggKyAyMCwgcmVjdC55ICsgMjApOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyIChuZXcgRGlzcG9zZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQgKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQlyZWQuZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvSG92ZXJIZWxwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvSG92ZXJIZWxwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjMTc4NTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL0hvdmVySGVscC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaG92ZXJoZWxwOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0vKioKLSAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGltcGxlbWVudCBob3ZlciBoZWxwIGZlZWRiYWNrCi0gKiB1c2luZyB0aGUgTW91c2VUcmFja0xpc3RlbmVyLgotICovCi1wdWJsaWMgY2xhc3MgSG92ZXJIZWxwIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfaG92ZXJoZWxwIik7Ci0JCi0Jc3RhdGljIGZpbmFsIGludAotCQloaGlJbmZvcm1hdGlvbiA9IDAsCi0JCWhoaVdhcm5pbmcgPSAxOwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbWFnZUxvY2F0aW9ucyA9IHsKLQkJImluZm9ybWF0aW9uLmdpZiIsCi0JCSJ3YXJuaW5nLmdpZiIKLQl9OwotCUltYWdlIGltYWdlc1tdOwotCi0JLyoqCi0JICogUnVucyBtYWluIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IEhvdmVySGVscCgpLm9wZW4oZGlzcGxheSk7Ci0JCS8vIEV2ZW50IGxvb3AKLQkJd2hpbGUgKHNoZWxsICE9IG51bGwgJiYgISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQkvLyBDbGVhbnVwCi0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCi0JfQotCQotCS8qKgotCSAqIE9wZW5zIHRoZSBtYWluIHByb2dyYW0uCi0JICovCi0JcHVibGljIFNoZWxsIG9wZW4oRGlzcGxheSBkaXNwbGF5KSB7CQkKLQkJLy8gTG9hZCB0aGUgaW1hZ2VzCi0JCUNsYXNzIGNsYXp6ID0gSG92ZXJIZWxwLmNsYXNzOwotCQl0cnkgewotCQkJaWYgKGltYWdlcyA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VzID0gbmV3IEltYWdlW2ltYWdlTG9jYXRpb25zLmxlbmd0aF07Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKGltYWdlTG9jYXRpb25zW2ldKTsKLQkJCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJCQlpbWFnZXNbaV0gPSBuZXcgSW1hZ2UoZGlzcGxheSwgc291cmNlLCBtYXNrKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIsCi0JCQkJbmV3IE9iamVjdFtdIHsgZXguZ2V0TWVzc2FnZSgpIH0pKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSB3aW5kb3cKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJY3JlYXRlUGFydENvbnRyb2woc2hlbGwpOwotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJLyogRnJlZSByZXNvdXJjZXMgKi8KLQkJCQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWZpbmFsIEltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQlpbWFnZXMgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJZmluYWwgVG9vbFRpcEhhbmRsZXIgdG9vbHRpcCA9IG5ldyBUb29sVGlwSGFuZGxlcihmcmFtZS5nZXRTaGVsbCgpKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlmcmFtZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQkJU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtKCk7Ci0JCVN0cmluZyBoZWxwS2V5ID0gIkYxIjsKLQkJaWYgKHBsYXRmb3JtLmVxdWFscygiZ3RrIikpIGhlbHBLZXkgPSAiQ3RybCtGMSI7Ci0JCWlmIChwbGF0Zm9ybS5lcXVhbHMoImNhcmJvbiIpIHx8IHBsYXRmb3JtLmVxdWFscygiY29jb2EiKSkgaGVscEtleSA9ICJIZWxwIjsKLQotCQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyIChmcmFtZSwgU1dULkJPUkRFUik7Ci0JCWZvciAoaW50IGk9MDsgaTw1OyBpKyspIHsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZygiVG9vbEl0ZW0udGV4dCIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGkpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9URVhUIiwgZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2xJdGVtLnRvb2x0aXAiLAotCQkJCW5ldyBPYmplY3RbXSB7IGl0ZW0uZ2V0VGV4dCgpLCBoZWxwS2V5IH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9IRUxQVEVYVEhBTkRMRVIiLCBuZXcgVG9vbFRpcEhlbHBUZXh0SGFuZGxlcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldEhlbHBUZXh0KFdpZGdldCB3aWRnZXQpIHsKLQkJCQkJSXRlbSBpdGVtID0gKEl0ZW0pIHdpZGdldDsKLQkJCQkJcmV0dXJuIGdldFJlc291cmNlU3RyaW5nKCJUb29sSXRlbS5oZWxwIiwgbmV3IE9iamVjdFtdIHsgaXRlbS5nZXRUZXh0KCkgfSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQliYXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRvb2x0aXAuYWN0aXZhdGVIb3ZlckhlbHAoYmFyKTsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoZnJhbWUsIFNXVC5CT1JERVIpOwotCQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQgKGdldFJlc291cmNlU3RyaW5nKCJJdGVtIiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoaSkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX0lNQUdFIiwgaW1hZ2VzW2hoaUluZm9ybWF0aW9uXSk7Ci0JCQlpdGVtLnNldFRleHQgKGdldFJlc291cmNlU3RyaW5nKCJUYWJsZUl0ZW0udGV4dCIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGkpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9URVhUIiwgZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlSXRlbS50b29sdGlwIiwKLQkJCQluZXcgT2JqZWN0W10geyBpdGVtLmdldFRleHQoKSwgaGVscEtleSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfSEVMUFRFWFRIQU5ETEVSIiwgbmV3IFRvb2xUaXBIZWxwVGV4dEhhbmRsZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRIZWxwVGV4dChXaWRnZXQgd2lkZ2V0KSB7Ci0JCQkJCUl0ZW0gaXRlbSA9IChJdGVtKSB3aWRnZXQ7Ci0JCQkJCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZygiVGFibGVJdGVtLmhlbHAiLCBuZXcgT2JqZWN0W10geyBpdGVtLmdldFRleHQoKSB9KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXRvb2x0aXAuYWN0aXZhdGVIb3ZlckhlbHAodGFibGUpOwotCQotCQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAoZnJhbWUsIFNXVC5CT1JERVIpOwotCQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQgKGdldFJlc291cmNlU3RyaW5nKCJJdGVtIiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoaSkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX0lNQUdFIiwgaW1hZ2VzW2hoaVdhcm5pbmddKTsKLQkJCWl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIlRyZWVJdGVtLnRleHQiLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihpKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfVEVYVCIsIGdldFJlc291cmNlU3RyaW5nKCJUcmVlSXRlbS50b29sdGlwIiwKLQkJCQluZXcgT2JqZWN0W10geyBpdGVtLmdldFRleHQoKSwgaGVscEtleX0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9IRUxQVEVYVEhBTkRMRVIiLCBuZXcgVG9vbFRpcEhlbHBUZXh0SGFuZGxlcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldEhlbHBUZXh0KFdpZGdldCB3aWRnZXQpIHsKLQkJCQkJSXRlbSBpdGVtID0gKEl0ZW0pIHdpZGdldDsKLQkJCQkJcmV0dXJuIGdldFJlc291cmNlU3RyaW5nKCJUcmVlSXRlbS5oZWxwIiwgbmV3IE9iamVjdFtdIHsgaXRlbS5nZXRUZXh0KCkgfSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXRvb2x0aXAuYWN0aXZhdGVIb3ZlckhlbHAodHJlZSk7Ci0JCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChmcmFtZSwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIkhlbGxvLnRleHQiKSk7Ci0JCWJ1dHRvbi5zZXREYXRhICgiVElQX1RFWFQiLCBnZXRSZXNvdXJjZVN0cmluZygiSGVsbG8udG9vbHRpcCIpKTsKLQkJdG9vbHRpcC5hY3RpdmF0ZUhvdmVySGVscChidXR0b24pOwotCX0KLQotCS8qKgotCSAqIEVtdWxhdGVkIHRvb2x0aXAgaGFuZGxlcgotCSAqIE5vdGljZSB0aGF0IHdlIGNvdWxkIGRpc3BsYXkgYW55dGhpbmcgaW4gYSB0b29sdGlwIGJlc2lkZXMgdGV4dCBhbmQgaW1hZ2VzLgotCSAqIEZvciBpbnN0YW5jZSwgaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBlbWJlZCBsYXJnZSB0YWJsZXMgb2YgZGF0YSBvciBidXR0b25zIGxpbmtpbmcKLQkgKiBkYXRhIHVuZGVyIGluc3BlY3Rpb24gdG8gbWF0ZXJpYWwgZWxzZXdoZXJlLCBvciBwZXJmb3JtIGR5bmFtaWMgbG9va3VwIGZvciBjcmVhdGluZwotCSAqIHRvb2x0aXAgdGV4dCBvbiB0aGUgZmx5LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVG9vbFRpcEhhbmRsZXIgewotCQlwcml2YXRlIFNoZWxsICBwYXJlbnRTaGVsbDsKLQkJcHJpdmF0ZSBTaGVsbCAgdGlwU2hlbGw7Ci0JCXByaXZhdGUgTGFiZWwgIHRpcExhYmVsSW1hZ2UsIHRpcExhYmVsVGV4dDsKLQkJcHJpdmF0ZSBXaWRnZXQgdGlwV2lkZ2V0OyAvLyB3aWRnZXQgdGhpcyB0b29sdGlwIGlzIGhvdmVyaW5nIG92ZXIKLQkJcHJpdmF0ZSBQb2ludCAgdGlwUG9zaXRpb247IC8vIHRoZSBwb3NpdGlvbiBiZWluZyBob3ZlcmVkIG92ZXIKLQkKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgdG9vbHRpcCBoYW5kbGVyCi0JCSAqCi0JCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBTaGVsbAotCQkgKi8JCi0JCXB1YmxpYyBUb29sVGlwSGFuZGxlcihTaGVsbCBwYXJlbnQpIHsKLQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCQl0aGlzLnBhcmVudFNoZWxsID0gcGFyZW50OwotCQotCQkJdGlwU2hlbGwgPSBuZXcgU2hlbGwocGFyZW50LCBTV1QuT05fVE9QIHwgU1dULlRPT0wpOwotCQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKLQkJCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMjsKLQkJCXRpcFNoZWxsLnNldExheW91dChncmlkTGF5b3V0KTsKLQkKLQkJCXRpcFNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCQkKLQkJCXRpcExhYmVsSW1hZ2UgPSBuZXcgTGFiZWwodGlwU2hlbGwsIFNXVC5OT05FKTsKLQkJCXRpcExhYmVsSW1hZ2Uuc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLQkJCXRpcExhYmVsSW1hZ2Uuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCXRpcExhYmVsSW1hZ2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwKLQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKLQkKLQkJCXRpcExhYmVsVGV4dCA9IG5ldyBMYWJlbCh0aXBTaGVsbCwgU1dULk5PTkUpOwotCQkJdGlwTGFiZWxUZXh0LnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EKSk7Ci0JCQl0aXBMYWJlbFRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCXRpcExhYmVsVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfAotCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBFbmFibGVzIGN1c3RvbWl6ZWQgaG92ZXIgaGVscCBmb3IgYSBzcGVjaWZpZWQgY29udHJvbAotCQkgKiAKLQkJICogQGNvbnRyb2wgdGhlIGNvbnRyb2wgb24gd2hpY2ggdG8gZW5hYmxlIGhvdmVyaGVscAotCQkgKi8KLQkJcHVibGljIHZvaWQgYWN0aXZhdGVIb3ZlckhlbHAoZmluYWwgQ29udHJvbCBjb250cm9sKSB7Ci0JCQkvKgotCQkJICogR2V0IG91dCBvZiB0aGUgd2F5IGlmIHdlIGF0dGVtcHQgdG8gYWN0aXZhdGUgdGhlIGNvbnRyb2wgdW5kZXJuZWF0aCB0aGUgdG9vbHRpcAotCQkJICovCi0JCQljb250cm9sLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW91c2VEb3duIChNb3VzZUV2ZW50IGUpIHsKLQkJCQkJaWYgKHRpcFNoZWxsLmlzVmlzaWJsZSgpKSB0aXBTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQl9CQotCQkJfSk7Ci0JCi0JCQkvKgotCQkJICogVHJhcCBob3ZlciBldmVudHMgdG8gcG9wLXVwIHRvb2x0aXAKLQkJCSAqLwotCQkJY29udHJvbC5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tBZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7Ci0JCQkJCWlmICh0aXBTaGVsbC5pc1Zpc2libGUoKSkgdGlwU2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCXRpcFdpZGdldCA9IG51bGw7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIgKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQlXaWRnZXQgd2lkZ2V0ID0gZXZlbnQud2lkZ2V0OwotCQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVG9vbEJhcikgewotCQkJCQkJVG9vbEJhciB3ID0gKFRvb2xCYXIpIHdpZGdldDsKLQkJCQkJCXdpZGdldCA9IHcuZ2V0SXRlbSAocHQpOwotCQkJCQl9Ci0JCQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZSkgewotCQkJCQkJVGFibGUgdyA9IChUYWJsZSkgd2lkZ2V0OwotCQkJCQkJd2lkZ2V0ID0gdy5nZXRJdGVtIChwdCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWUpIHsKLQkJCQkJCVRyZWUgdyA9IChUcmVlKSB3aWRnZXQ7Ci0JCQkJCQl3aWRnZXQgPSB3LmdldEl0ZW0gKHB0KTsKLQkJCQkJfQotCQkJCQlpZiAod2lkZ2V0ID09IG51bGwpIHsKLQkJCQkJCXRpcFNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQkJdGlwV2lkZ2V0ID0gbnVsbDsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAod2lkZ2V0ID09IHRpcFdpZGdldCkgcmV0dXJuOwotCQkJCQl0aXBXaWRnZXQgPSB3aWRnZXQ7Ci0JCQkJCXRpcFBvc2l0aW9uID0gY29udHJvbC50b0Rpc3BsYXkocHQpOwotCQkJCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIHdpZGdldC5nZXREYXRhKCJUSVBfVEVYVCIpOwotCQkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgd2lkZ2V0LmdldERhdGEoIlRJUF9JTUFHRSIpOwotCQkJCQl0aXBMYWJlbFRleHQuc2V0VGV4dCh0ZXh0ICE9IG51bGwgPyB0ZXh0IDogIiIpOwotCQkJCQl0aXBMYWJlbEltYWdlLnNldEltYWdlKGltYWdlKTsgLy8gYWNjZXB0cyBudWxsCi0JCQkJCXRpcFNoZWxsLnBhY2soKTsKLQkJCQkJc2V0SG92ZXJMb2NhdGlvbih0aXBTaGVsbCwgdGlwUG9zaXRpb24pOwotCQkJCQl0aXBTaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCQotCQkJLyoKLQkJCSAqIFRyYXAgRjEgSGVscCB0byBwb3AgdXAgYSBjdXN0b20gaGVscCBib3gKLQkJCSAqLwotCQkJY29udHJvbC5hZGRIZWxwTGlzdGVuZXIobmV3IEhlbHBMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGVscFJlcXVlc3RlZChIZWxwRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKHRpcFdpZGdldCA9PSBudWxsKSByZXR1cm47Ci0JCQkJCVRvb2xUaXBIZWxwVGV4dEhhbmRsZXIgaGFuZGxlciA9IChUb29sVGlwSGVscFRleHRIYW5kbGVyKQotCQkJCQkJdGlwV2lkZ2V0LmdldERhdGEoIlRJUF9IRUxQVEVYVEhBTkRMRVIiKTsKLQkJCQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlTdHJpbmcgdGV4dCA9IGhhbmRsZXIuZ2V0SGVscFRleHQodGlwV2lkZ2V0KTsKLQkJCQkJaWYgKHRleHQgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQkKLQkJCQkJaWYgKHRpcFNoZWxsLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQl0aXBTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCVNoZWxsIGhlbHBTaGVsbCA9IG5ldyBTaGVsbChwYXJlbnRTaGVsbCwgU1dULlNIRUxMX1RSSU0pOwotCQkJCQkJaGVscFNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGhlbHBTaGVsbCwgU1dULk5PTkUpOwotCQkJCQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJCQkJCWhlbHBTaGVsbC5wYWNrKCk7Ci0JCQkJCQlzZXRIb3ZlckxvY2F0aW9uKGhlbHBTaGVsbCwgdGlwUG9zaXRpb24pOwotCQkJCQkJaGVscFNoZWxsLm9wZW4oKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQkvKioKLQkJICogU2V0cyB0aGUgbG9jYXRpb24gZm9yIGEgaG92ZXJpbmcgc2hlbGwKLQkJICogQHBhcmFtIHNoZWxsIHRoZSBvYmplY3QgdGhhdCBpcyB0byBob3ZlcgotCQkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIG9mIGEgd2lkZ2V0IHRvIGhvdmVyIG92ZXIKLQkJICogQHJldHVybiB0aGUgdG9wLWxlZnQgbG9jYXRpb24gZm9yIGEgaG92ZXJpbmcgYm94Ci0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0SG92ZXJMb2NhdGlvbihTaGVsbCBzaGVsbCwgUG9pbnQgcG9zaXRpb24pIHsKLQkJCVJlY3RhbmdsZSBkaXNwbGF5Qm91bmRzID0gc2hlbGwuZ2V0RGlzcGxheSgpLmdldEJvdW5kcygpOwotCQkJUmVjdGFuZ2xlIHNoZWxsQm91bmRzID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0JCQlzaGVsbEJvdW5kcy54ID0gTWF0aC5tYXgoTWF0aC5taW4ocG9zaXRpb24ueCwgZGlzcGxheUJvdW5kcy53aWR0aCAtIHNoZWxsQm91bmRzLndpZHRoKSwgMCk7Ci0JCQlzaGVsbEJvdW5kcy55ID0gTWF0aC5tYXgoTWF0aC5taW4ocG9zaXRpb24ueSArIDE2LCBkaXNwbGF5Qm91bmRzLmhlaWdodCAtIHNoZWxsQm91bmRzLmhlaWdodCksIDApOwotCQkJc2hlbGwuc2V0Qm91bmRzKHNoZWxsQm91bmRzKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUb29sVGlwIGhlbHAgaGFuZGxlcgotCSAqLwotCXByb3RlY3RlZCBpbnRlcmZhY2UgVG9vbFRpcEhlbHBUZXh0SGFuZGxlciB7Ci0JCS8qKgotCQkgKiBHZXQgaGVscCB0ZXh0Ci0JCSAqIEBwYXJhbSB3aWRnZXQgdGhlIHdpZGdldCB0aGF0IGlzIHVuZGVyIGhlbHAKLQkJICogQHJldHVybiBhIGhlbHAgdGV4dCBzdHJpbmcKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SGVscFRleHQoV2lkZ2V0IHdpZGdldCk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC9pbmZvcm1hdGlvbi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvaW5mb3JtYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNmM3NDc3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC9pbmZvcm1hdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvd2FybmluZy5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvd2FybmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmNGZkZjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL3dhcm5pbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaW1hZ2VhbmFseXplci9JbWFnZUFuYWx5emVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9pbWFnZWFuYWx5emVyL0ltYWdlQW5hbHl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2NiMDg5NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9pbWFnZWFuYWx5emVyL0ltYWdlQW5hbHl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5pbWFnZWFuYWx5emVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VBbmFseXplciB7Ci0Jc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfaW1hZ2VzIik7Ci0JRGlzcGxheSBkaXNwbGF5OwotCVNoZWxsIHNoZWxsOwotCUNhbnZhcyBpbWFnZUNhbnZhcywgcGFsZXR0ZUNhbnZhczsKLQlMYWJlbCB0eXBlTGFiZWwsIHNpemVMYWJlbCwgZGVwdGhMYWJlbCwgdHJhbnNwYXJlbnRQaXhlbExhYmVsLAotCQl0aW1lVG9Mb2FkTGFiZWwsIHNjcmVlblNpemVMYWJlbCwgYmFja2dyb3VuZFBpeGVsTGFiZWwsCi0JCWxvY2F0aW9uTGFiZWwsIGRpc3Bvc2FsTWV0aG9kTGFiZWwsIGRlbGF5VGltZUxhYmVsLAotCQlyZXBlYXRDb3VudExhYmVsLCBwYWxldHRlTGFiZWwsIGRhdGFMYWJlbCwgc3RhdHVzTGFiZWw7Ci0JQ29tYm8gYmFja2dyb3VuZENvbWJvLCBzY2FsZVhDb21ibywgc2NhbGVZQ29tYm8sIGFscGhhQ29tYm87Ci0JQnV0dG9uIGluY3JlbWVudGFsQ2hlY2ssIHRyYW5zcGFyZW50Q2hlY2ssIG1hc2tDaGVjaywgYmFja2dyb3VuZENoZWNrOwotCUJ1dHRvbiBwcmV2aW91c0J1dHRvbiwgbmV4dEJ1dHRvbiwgYW5pbWF0ZUJ1dHRvbjsKLQlTdHlsZWRUZXh0IGRhdGFUZXh0OwotCVNhc2ggc2FzaDsKLQlDb2xvciB3aGl0ZUNvbG9yLCBibGFja0NvbG9yLCByZWRDb2xvciwgZ3JlZW5Db2xvciwgYmx1ZUNvbG9yLCBjYW52YXNCYWNrZ3JvdW5kOwotCUZvbnQgZml4ZWRXaWR0aEZvbnQ7Ci0JQ3Vyc29yIGNyb3NzQ3Vyc29yOwotCUdDIGltYWdlQ2FudmFzR0M7Ci0JUHJpbnRlckRhdGEgcHJpbnRlckRhdGE7Ci0JCi0JaW50IHBhbGV0dGVXaWR0aCA9IDE0MDsgLy8gcmVjYWxjdWxhdGVkIGFuZCB1c2VkIGFzIGEgd2lkdGggaGludAotCWludCBpeCA9IDAsIGl5ID0gMCwgcHkgPSAwOyAvLyB1c2VkIHRvIHNjcm9sbCB0aGUgaW1hZ2UgYW5kIHBhbGV0dGUKLQlmbG9hdCB4c2NhbGUgPSAxLCB5c2NhbGUgPSAxOyAvLyB1c2VkIHRvIHNjYWxlIHRoZSBpbWFnZQotCWludCBhbHBoYSA9IDI1NTsgLy8gdXNlZCB0byBtb2RpZnkgdGhlIGFscGhhIHZhbHVlIG9mIHRoZSBpbWFnZQotCWJvb2xlYW4gaW5jcmVtZW50YWwgPSBmYWxzZTsgLy8gdXNlZCB0byBpbmNyZW1lbnRhbGx5IGRpc3BsYXkgYW4gaW1hZ2UKLQlib29sZWFuIHRyYW5zcGFyZW50ID0gdHJ1ZTsgLy8gdXNlZCB0byBkaXNwbGF5IGFuIGltYWdlIHdpdGggdHJhbnNwYXJlbmN5Ci0JYm9vbGVhbiBzaG93TWFzayA9IGZhbHNlOyAvLyB1c2VkIHRvIGRpc3BsYXkgYW4gaWNvbiBtYXNrIG9yIHRyYW5zcGFyZW50IGltYWdlIG1hc2sKLQlib29sZWFuIHNob3dCYWNrZ3JvdW5kID0gZmFsc2U7IC8vIHVzZWQgdG8gZGlzcGxheSB0aGUgYmFja2dyb3VuZCBvZiBhbiBhbmltYXRlZCBpbWFnZQotCWJvb2xlYW4gYW5pbWF0ZSA9IGZhbHNlOyAvLyB1c2VkIHRvIGFuaW1hdGUgYSBtdWx0aS1pbWFnZSBmaWxlCi0JVGhyZWFkIGFuaW1hdGVUaHJlYWQ7IC8vIGRyYXdzIGFuaW1hdGVkIGltYWdlcwotCVRocmVhZCBpbmNyZW1lbnRhbFRocmVhZDsgLy8gZHJhd3MgaW5jcmVtZW50YWwgaW1hZ2VzCi0JU3RyaW5nIGxhc3RQYXRoOyAvLyB1c2VkIHRvIHNlZWQgdGhlIGZpbGUgZGlhbG9nCi0JU3RyaW5nIGN1cnJlbnROYW1lOyAvLyB0aGUgY3VycmVudCBpbWFnZSBmaWxlIG9yIFVSTCBuYW1lCi0JU3RyaW5nIGZpbGVOYW1lOyAvLyB0aGUgY3VycmVudCBpbWFnZSBmaWxlCi0JSW1hZ2VMb2FkZXIgbG9hZGVyOyAvLyB0aGUgbG9hZGVyIGZvciB0aGUgY3VycmVudCBpbWFnZSBmaWxlCi0JSW1hZ2VEYXRhW10gaW1hZ2VEYXRhQXJyYXk7IC8vIGFsbCBpbWFnZSBkYXRhIHJlYWQgZnJvbSB0aGUgY3VycmVudCBmaWxlCi0JaW50IGltYWdlRGF0YUluZGV4OyAvLyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgaW1hZ2UgZGF0YQotCUltYWdlRGF0YSBpbWFnZURhdGE7IC8vIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlIGRhdGEKLQlJbWFnZSBpbWFnZTsgLy8gdGhlIGN1cnJlbnRseS1kaXNwbGF5ZWQgaW1hZ2UKLQlWZWN0b3IgaW5jcmVtZW50YWxFdmVudHM7IC8vIGluY3JlbWVudGFsIGltYWdlIGV2ZW50cwotCWxvbmcgbG9hZFRpbWUgPSAwOyAvLyB0aGUgdGltZSBpdCB0b29rIHRvIGxvYWQgdGhlIGN1cnJlbnQgaW1hZ2UKLQkKLQlzdGF0aWMgZmluYWwgaW50IElOREVYX0RJR0lUUyA9IDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBBTFBIQV9DSEFSUyA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBBTFBIQV9DT05TVEFOVCA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBBTFBIQV9YID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IEFMUEhBX1kgPSAyOwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPUEVOX0ZJTFRFUl9FWFRFTlNJT05TID0gbmV3IFN0cmluZ1tdIHsKLQkJCSIqLmJtcDsgKi5naWY7ICouaWNvOyAqLmpmaWY7ICouanBlZzsgKi5qcGc7ICoucG5nOyAqLnRpZjsgKi50aWZmIiwKLQkJCSIqLmJtcCIsICIqLmdpZiIsICIqLmljbyIsICIqLmpwZzsgKi5qcGVnOyAqLmpmaWYiLCAiKi5wbmciLCAiKi50aWY7ICoudGlmZiIgfTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gT1BFTl9GSUxURVJfTkFNRVMgPSBuZXcgU3RyaW5nW10gewotCQkJYnVuZGxlLmdldFN0cmluZygiQWxsX2ltYWdlcyIpICsgIiAoYm1wLCBnaWYsIGljbywgamZpZiwganBlZywganBnLCBwbmcsIHRpZiwgdGlmZikiLAotCQkJIkJNUCAoKi5ibXApIiwgIkdJRiAoKi5naWYpIiwgIklDTyAoKi5pY28pIiwgIkpQRUcgKCouanBnLCAqLmpwZWcsICouamZpZikiLAotCQkJIlBORyAoKi5wbmcpIiwgIlRJRkYgKCoudGlmLCAqLnRpZmYpIiB9OwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTQVZFX0ZJTFRFUl9FWFRFTlNJT05TID0gbmV3IFN0cmluZ1tdIHsKLQkJCSIqLmJtcCIsICIqLmJtcCIsICIqLmdpZiIsICIqLmljbyIsICIqLmpwZyIsICIqLnBuZyIsICIqLnRpZiIsICIqLmJtcCIgfTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gU0FWRV9GSUxURVJfTkFNRVMgPSBuZXcgU3RyaW5nW10gewotCQkJIlVuY29tcHJlc3NlZCBCTVAgKCouYm1wKSIsICJSTEUgQ29tcHJlc3NlZCBCTVAgKCouYm1wKSIsICJHSUYgKCouZ2lmKSIsCi0JCQkiSUNPICgqLmljbykiLCAiSlBFRyAoKi5qcGcpIiwgIlBORyAoKi5wbmcpIiwKLQkJCSJUSUZGICgqLnRpZikiLCAiT1MvMiBCTVAgKCouYm1wKSIgfTsKLQotCWNsYXNzIFRleHRQcm9tcHRlciBleHRlbmRzIERpYWxvZyB7Ci0JCVN0cmluZyBtZXNzYWdlID0gIiI7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTaGVsbCBkaWFsb2c7Ci0JCVRleHQgdGV4dDsKLQkJcHVibGljIFRleHRQcm9tcHRlciAoU2hlbGwgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsKLQkJfQotCQlwdWJsaWMgVGV4dFByb21wdGVyIChTaGVsbCBwYXJlbnQpIHsKLQkJCXRoaXMgKHBhcmVudCwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UgKCkgewotCQkJcmV0dXJuIG1lc3NhZ2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TWVzc2FnZSAoU3RyaW5nIHN0cmluZykgewotCQkJbWVzc2FnZSA9IHN0cmluZzsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIG9wZW4gKCkgewotCQkJZGlhbG9nID0gbmV3IFNoZWxsKGdldFBhcmVudCgpLCBnZXRTdHlsZSgpKTsKLQkJCWRpYWxvZy5zZXRUZXh0KGdldFRleHQoKSk7Ci0JCQlkaWFsb2cuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl0ZXh0ID0gbmV3IFRleHQoZGlhbG9nLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCUNvbXBvc2l0ZSBidXR0b25zID0gbmV3IENvbXBvc2l0ZShkaWFsb2csIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgZ3JpZCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlncmlkLm51bUNvbHVtbnMgPSAyOwotCQkJYnV0dG9ucy5zZXRMYXlvdXQoZ3JpZCk7Ci0JCQlidXR0b25zLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiT0siKSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDc1OwotCQkJb2suc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcmVzdWx0ID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCQljYW5jZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJDYW5jZWwiKSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDc1OwotCQkJY2FuY2VsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljYW5jZWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlkaWFsb2cuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24ob2spOwotCQkJZGlhbG9nLnBhY2soKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl3aGlsZSAoIWRpYWxvZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlJbWFnZUFuYWx5emVyIGltYWdlQW5hbHl6ZXIgPSBuZXcgSW1hZ2VBbmFseXplcigpOwotCQlTaGVsbCBzaGVsbCA9IGltYWdlQW5hbHl6ZXIub3BlbihkaXNwbGF5KTsKLQkJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBTaGVsbCBvcGVuKERpc3BsYXkgZHB5KSB7Ci0JCS8vIENyZWF0ZSBhIHdpbmRvdyBhbmQgc2V0IGl0cyB0aXRsZS4KLQkJdGhpcy5kaXNwbGF5ID0gZHB5OwotCQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJJbWFnZV9hbmFseXplciIpKTsKLQkJCi0JCS8vIEhvb2sgcmVzaXplIGFuZCBkaXNwb3NlIGxpc3RlbmVycy4KLQkJc2hlbGwuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgewotCQkJCXJlc2l6ZVNoZWxsKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLmFkZFNoZWxsTGlzdGVuZXIobmV3IFNoZWxsQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQkJCWFuaW1hdGUgPSBmYWxzZTsgLy8gc3RvcCBhbnkgYW5pbWF0aW9uIGluIHByb2dyZXNzCi0JCQkJaWYgKGFuaW1hdGVUaHJlYWQgIT0gbnVsbCkgewotCQkJCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGRpZSBiZWZvcmUgZGlzcG9zaW5nIHRoZSBzaGVsbC4KLQkJCQkJd2hpbGUgKGFuaW1hdGVUaHJlYWQuaXNBbGl2ZSgpKSB7Ci0JCQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllLmRvaXQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCS8vIENsZWFuIHVwLgotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJd2hpdGVDb2xvci5kaXNwb3NlKCk7Ci0JCQkJYmxhY2tDb2xvci5kaXNwb3NlKCk7Ci0JCQkJcmVkQ29sb3IuZGlzcG9zZSgpOwotCQkJCWdyZWVuQ29sb3IuZGlzcG9zZSgpOwotCQkJCWJsdWVDb2xvci5kaXNwb3NlKCk7Ci0JCQkJZml4ZWRXaWR0aEZvbnQuZGlzcG9zZSgpOwotCQkJCWNyb3NzQ3Vyc29yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQ3JlYXRlIGNvbG9ycyBhbmQgZm9udHMuCi0JCXdoaXRlQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDI1NSk7Ci0JCWJsYWNrQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMCwgMCk7Ci0JCXJlZENvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JCWdyZWVuQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMjU1LCAwKTsKLQkJYmx1ZUNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDI1NSk7Ci0JCWZpeGVkV2lkdGhGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgImNvdXJpZXIiLCAxMCwgMCk7Ci0JCWNyb3NzQ3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0NST1NTKTsKLQkJCi0JCS8vIEFkZCBhIG1lbnUgYmFyIGFuZCB3aWRnZXRzLgotCQljcmVhdGVNZW51QmFyKCk7Ci0JCWNyZWF0ZVdpZGdldHMoKTsKLQkJc2hlbGwucGFjaygpOwotCQkKLQkJLy8gQ3JlYXRlIGEgR0MgZm9yIGRyYXdpbmcsIGFuZCBob29rIHRoZSBsaXN0ZW5lciB0byBkaXNwb3NlIGl0LgotCQlpbWFnZUNhbnZhc0dDID0gbmV3IEdDKGltYWdlQ2FudmFzKTsKLQkJaW1hZ2VDYW52YXMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWltYWdlQ2FudmFzR0MuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIE9wZW4gdGhlIHdpbmRvdwotCQlzaGVsbC5vcGVuKCk7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQl2b2lkIGNyZWF0ZVdpZGdldHMoKSB7Ci0JCS8vIEFkZCB0aGUgd2lkZ2V0cyB0byB0aGUgc2hlbGwgaW4gYSBncmlkIGxheW91dC4KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBBZGQgYSBjb21wb3NpdGUgdG8gY29udGFpbiBzb21lIGNvbnRyb2wgd2lkZ2V0cyBhY3Jvc3MgdGhlIHRvcC4KLQkJQ29tcG9zaXRlIGNvbnRyb2xzID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQlSb3dMYXlvdXQgcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotCQlyb3dMYXlvdXQubWFyZ2luVG9wID0gNTsKLQkJcm93TGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDU7Ci0JCXJvd0xheW91dC5zcGFjaW5nID0gODsKLQkJY29udHJvbHMuc2V0TGF5b3V0KHJvd0xheW91dCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJY29udHJvbHMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQkvLyBDb21ibyB0byBjaGFuZ2UgdGhlIGJhY2tncm91bmQuCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xzLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlncm91cC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmQiKSk7Ci0JCWJhY2tncm91bmRDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQliYWNrZ3JvdW5kQ29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsKLQkJCWJ1bmRsZS5nZXRTdHJpbmcoIk5vbmUiKSwKLQkJCWJ1bmRsZS5nZXRTdHJpbmcoIldoaXRlIiksCi0JCQlidW5kbGUuZ2V0U3RyaW5nKCJCbGFjayIpLAotCQkJYnVuZGxlLmdldFN0cmluZygiUmVkIiksCi0JCQlidW5kbGUuZ2V0U3RyaW5nKCJHcmVlbiIpLAotCQkJYnVuZGxlLmdldFN0cmluZygiQmx1ZSIpfSk7Ci0JCWJhY2tncm91bmRDb21iby5zZWxlY3QoYmFja2dyb3VuZENvbWJvLmluZGV4T2YoYnVuZGxlLmdldFN0cmluZygiV2hpdGUiKSkpOwotCQliYWNrZ3JvdW5kQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWNoYW5nZUJhY2tncm91bmQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBDb21ibyB0byBjaGFuZ2UgdGhlIHggc2NhbGUuCi0JCVN0cmluZ1tdIHZhbHVlcyA9IHsKLQkJCSIwLjEiLCAiMC4yIiwgIjAuMyIsICIwLjQiLCAiMC41IiwgIjAuNiIsICIwLjciLCAiMC44IiwgIjAuOSIsICIxIiwKLQkJCSIxLjEiLCAiMS4yIiwgIjEuMyIsICIxLjQiLCAiMS41IiwgIjEuNiIsICIxLjciLCAiMS44IiwgIjEuOSIsICIyIiwKLQkJCSIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjEwIix9OwotCQlncm91cCA9IG5ldyBHcm91cChjb250cm9scywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3JvdXAuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJYX3NjYWxlIikpOwotCQlzY2FsZVhDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULkRST1BfRE9XTik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzY2FsZVhDb21iby5hZGQodmFsdWVzW2ldKTsKLQkJfQotCQlzY2FsZVhDb21iby5zZWxlY3Qoc2NhbGVYQ29tYm8uaW5kZXhPZigiMSIpKTsKLQkJc2NhbGVYQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjYWxlWCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIENvbWJvIHRvIGNoYW5nZSB0aGUgeSBzY2FsZS4KLQkJZ3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbHMsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiWV9zY2FsZSIpKTsKLQkJc2NhbGVZQ29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5EUk9QX0RPV04pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJc2NhbGVZQ29tYm8uYWRkKHZhbHVlc1tpXSk7Ci0JCX0KLQkJc2NhbGVZQ29tYm8uc2VsZWN0KHNjYWxlWUNvbWJvLmluZGV4T2YoIjEiKSk7Ci0JCXNjYWxlWUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzY2FsZVkoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBDb21ibyB0byBjaGFuZ2UgdGhlIGFscGhhIHZhbHVlLgotCQlncm91cCA9IG5ldyBHcm91cChjb250cm9scywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3JvdXAuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJBbHBoYV9LIikpOwotCQlhbHBoYUNvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDw9IDI1NTsgaSArPSA1KSB7Ci0JCQlhbHBoYUNvbWJvLmFkZChTdHJpbmcudmFsdWVPZihpKSk7Ci0JCX0KLQkJYWxwaGFDb21iby5zZWxlY3QoYWxwaGFDb21iby5pbmRleE9mKCIyNTUiKSk7Ci0JCWFscGhhQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWFscGhhKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gQ2hlY2sgYm94IHRvIHJlcXVlc3QgaW5jcmVtZW50YWwgZGlzcGxheS4KLQkJZ3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbHMsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiRGlzcGxheSIpKTsKLQkJaW5jcmVtZW50YWxDaGVjayA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWluY3JlbWVudGFsQ2hlY2suc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJJbmNyZW1lbnRhbCIpKTsKLQkJaW5jcmVtZW50YWxDaGVjay5zZXRTZWxlY3Rpb24oaW5jcmVtZW50YWwpOwotCQlpbmNyZW1lbnRhbENoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpbmNyZW1lbnRhbCA9ICgoQnV0dG9uKWV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENoZWNrIGJveCB0byByZXF1ZXN0IHRyYW5zcGFyZW50IGRpc3BsYXkuCi0JCXRyYW5zcGFyZW50Q2hlY2sgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0cmFuc3BhcmVudENoZWNrLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiVHJhbnNwYXJlbnQiKSk7Ci0JCXRyYW5zcGFyZW50Q2hlY2suc2V0U2VsZWN0aW9uKHRyYW5zcGFyZW50KTsKLQkJdHJhbnNwYXJlbnRDaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJhbnNwYXJlbnQgPSAoKEJ1dHRvbilldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCWltYWdlQ2FudmFzLnJlZHJhdygpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQ2hlY2sgYm94IHRvIHJlcXVlc3QgbWFzayBkaXNwbGF5LgotCQltYXNrQ2hlY2sgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQltYXNrQ2hlY2suc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJNYXNrIikpOwotCQltYXNrQ2hlY2suc2V0U2VsZWN0aW9uKHNob3dNYXNrKTsKLQkJbWFza0NoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzaG93TWFzayA9ICgoQnV0dG9uKWV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBDaGVjayBib3ggdG8gcmVxdWVzdCBiYWNrZ3JvdW5kIGRpc3BsYXkuCi0JCWJhY2tncm91bmRDaGVjayA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJhY2tncm91bmRDaGVjay5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmQiKSk7Ci0JCWJhY2tncm91bmRDaGVjay5zZXRTZWxlY3Rpb24oc2hvd0JhY2tncm91bmQpOwotCQliYWNrZ3JvdW5kQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNob3dCYWNrZ3JvdW5kID0gKChCdXR0b24pZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gR3JvdXAgdGhlIGFuaW1hdGlvbiBidXR0b25zLgotCQlncm91cCA9IG5ldyBHcm91cChjb250cm9scywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3JvdXAuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJBbmltYXRpb24iKSk7Ci0KLQkJLy8gUHVzaCBidXR0b24gdG8gZGlzcGxheSB0aGUgcHJldmlvdXMgaW1hZ2UgaW4gYSBtdWx0aS1pbWFnZSBmaWxlLgotCQlwcmV2aW91c0J1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJcHJldmlvdXNCdXR0b24uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJQcmV2aW91cyIpKTsKLQkJcHJldmlvdXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXByZXZpb3VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlwcmV2aW91cygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBQdXNoIGJ1dHRvbiB0byBkaXNwbGF5IHRoZSBuZXh0IGltYWdlIGluIGEgbXVsdGktaW1hZ2UgZmlsZS4KLQkJbmV4dEJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJbmV4dEJ1dHRvbi5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk5leHQiKSk7Ci0JCW5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCW5leHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW5leHQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gUHVzaCBidXR0b24gdG8gdG9nZ2xlIGFuaW1hdGlvbiBvZiBhIG11bHRpLWltYWdlIGZpbGUuCi0JCWFuaW1hdGVCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCWFuaW1hdGVCdXR0b24uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJBbmltYXRlIikpOwotCQlhbmltYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlhbmltYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlhbmltYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGltYWdlIGZpbGUgdHlwZS4KLQkJdHlwZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXR5cGVMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlR5cGVfaW5pdGlhbCIpKTsKLQkJdHlwZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIENhbnZhcyB0byBzaG93IHRoZSBpbWFnZS4KLQkJaW1hZ2VDYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTk9fUkVEUkFXX1JFU0laRSB8IFNXVC5OT19CQUNLR1JPVU5EKTsKLQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZCh3aGl0ZUNvbG9yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWltYWdlQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlpbWFnZUNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2VDYW52YXMuZ2V0Qm91bmRzKCk7Ci0JCQkJCWV2ZW50LmdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlwYWludEltYWdlKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlpbWFnZUNhbnZhcy5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCXNob3dDb2xvckF0KGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gU2V0IHVwIHRoZSBpbWFnZSBjYW52YXMgc2Nyb2xsIGJhcnMuCi0JCVNjcm9sbEJhciBob3Jpem9udGFsID0gaW1hZ2VDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlob3Jpem9udGFsLnNldFZpc2libGUodHJ1ZSk7Ci0JCWhvcml6b250YWwuc2V0TWluaW11bSgwKTsKLQkJaG9yaXpvbnRhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaG9yaXpvbnRhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2Nyb2xsSG9yaXpvbnRhbGx5KChTY3JvbGxCYXIpZXZlbnQud2lkZ2V0KTsKLQkJCX0KLQkJfSk7Ci0JCVNjcm9sbEJhciB2ZXJ0aWNhbCA9IGltYWdlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCXZlcnRpY2FsLnNldFZpc2libGUodHJ1ZSk7Ci0JCXZlcnRpY2FsLnNldE1pbmltdW0oMCk7Ci0JCXZlcnRpY2FsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl2ZXJ0aWNhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2Nyb2xsVmVydGljYWxseSgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGltYWdlIHNpemUuCi0JCXNpemVMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlzaXplTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTaXplX2luaXRpYWwiKSk7Ci0JCXNpemVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBpbWFnZSBkZXB0aC4KLQkJZGVwdGhMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlkZXB0aExhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiRGVwdGhfaW5pdGlhbCIpKTsKLQkJZGVwdGhMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSB0cmFuc3BhcmVudCBwaXhlbC4KLQkJdHJhbnNwYXJlbnRQaXhlbExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXRyYW5zcGFyZW50UGl4ZWxMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlRyYW5zcGFyZW50X3BpeGVsX2luaXRpYWwiKSk7Ci0JCXRyYW5zcGFyZW50UGl4ZWxMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSB0aW1lIHRvIGxvYWQuCi0JCXRpbWVUb0xvYWRMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQl0aW1lVG9Mb2FkTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJUaW1lX3RvX2xvYWRfaW5pdGlhbCIpKTsKLQkJdGltZVRvTG9hZExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIFNlcGFyYXRlIHRoZSBhbmltYXRpb24gZmllbGRzIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcy4KLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgbG9naWNhbCBzY3JlZW4gc2l6ZSBmb3IgYW5pbWF0aW9uLgotCQlzY3JlZW5TaXplTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJc2NyZWVuU2l6ZUxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQW5pbWF0aW9uX3NpemVfaW5pdGlhbCIpKTsKLQkJc2NyZWVuU2l6ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGJhY2tncm91bmQgcGl4ZWwuCi0JCWJhY2tncm91bmRQaXhlbExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJhY2tncm91bmRQaXhlbExhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQmFja2dyb3VuZF9waXhlbF9pbml0aWFsIikpOwotCQliYWNrZ3JvdW5kUGl4ZWxMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBpbWFnZSBsb2NhdGlvbiAoeCwgeSkuCi0JCWxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJbG9jYXRpb25MYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkltYWdlX2xvY2F0aW9uX2luaXRpYWwiKSk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgaW1hZ2UgZGlzcG9zYWwgbWV0aG9kLgotCQlkaXNwb3NhbE1ldGhvZExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRpc3Bvc2FsTWV0aG9kTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJEaXNwb3NhbF9pbml0aWFsIikpOwotCQlkaXNwb3NhbE1ldGhvZExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGltYWdlIGRlbGF5IHRpbWUuCi0JCWRlbGF5VGltZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRlbGF5VGltZUxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiRGVsYXlfaW5pdGlhbCIpKTsKLQkJZGVsYXlUaW1lTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgYmFja2dyb3VuZCBwaXhlbC4KLQkJcmVwZWF0Q291bnRMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlyZXBlYXRDb3VudExhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiUmVwZWF0c19pbml0aWFsIikpOwotCQlyZXBlYXRDb3VudExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIFNlcGFyYXRlIHRoZSBhbmltYXRpb24gZmllbGRzIGZyb20gdGhlIHBhbGV0dGUuCi0JCXNlcGFyYXRvciA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgaWYgdGhlIGltYWdlIGhhcyBhIGRpcmVjdCBvciBpbmRleGVkIHBhbGV0dGUuCi0JCXBhbGV0dGVMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlwYWxldHRlTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJQYWxldHRlX2luaXRpYWwiKSk7Ci0JCXBhbGV0dGVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBDYW52YXMgdG8gc2hvdyB0aGUgaW1hZ2UncyBwYWxldHRlLgotCQlwYWxldHRlQ2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5OT19SRURSQVdfUkVTSVpFKTsKLQkJcGFsZXR0ZUNhbnZhcy5zZXRGb250KGZpeGVkV2lkdGhGb250KTsKLQkJcGFsZXR0ZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpLnNldFZpc2libGUodHJ1ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCUdDIGdjID0gbmV3IEdDKHBhbGV0dGVMYWJlbCk7Ci0JCXBhbGV0dGVXaWR0aCA9IGdjLnN0cmluZ0V4dGVudChidW5kbGUuZ2V0U3RyaW5nKCJNYXhfbGVuZ3RoX3N0cmluZyIpKS54OwotCQlnYy5kaXNwb3NlKCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHBhbGV0dGVXaWR0aDsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDE2ICogMTE7IC8vIHNob3cgYXQgbGVhc3QgMTYgY29sb3JzCi0JCXBhbGV0dGVDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXBhbGV0dGVDYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCXBhaW50UGFsZXR0ZShldmVudCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIFNldCB1cCB0aGUgcGFsZXR0ZSBjYW52YXMgc2Nyb2xsIGJhci4KLQkJdmVydGljYWwgPSBwYWxldHRlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCXZlcnRpY2FsLnNldFZpc2libGUodHJ1ZSk7Ci0JCXZlcnRpY2FsLnNldE1pbmltdW0oMCk7Ci0JCXZlcnRpY2FsLnNldEluY3JlbWVudCgxMCk7Ci0JCXZlcnRpY2FsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl2ZXJ0aWNhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2Nyb2xsUGFsZXR0ZSgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIFNhc2ggdG8gc2VlIG1vcmUgb2YgaW1hZ2Ugb3IgaW1hZ2UgZGF0YS4KLQkJc2FzaCA9IG5ldyBTYXNoKHNoZWxsLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXNhc2guc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXNhc2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5kZXRhaWwgIT0gU1dULkRSQUcpIHsKLQkJCQkJKChHcmlkRGF0YSlwYWxldHRlQ2FudmFzLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IFNXVC5ERUZBVUxUOwotCQkJCQlSZWN0YW5nbGUgcGFsZXR0ZUNhbnZhc0JvdW5kcyA9IHBhbGV0dGVDYW52YXMuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBtaW5ZID0gcGFsZXR0ZUNhbnZhc0JvdW5kcy55ICsgMjA7Ci0JCQkJCVJlY3RhbmdsZSBkYXRhTGFiZWxCb3VuZHMgPSBkYXRhTGFiZWwuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBtYXhZID0gc3RhdHVzTGFiZWwuZ2V0Qm91bmRzKCkueSAtIGRhdGFMYWJlbEJvdW5kcy5oZWlnaHQgLSAyMDsKLQkJCQkJaWYgKGV2ZW50LnkgPiBtaW5ZICYmIGV2ZW50LnkgPCBtYXhZKSB7Ci0JCQkJCQlSZWN0YW5nbGUgb2xkU2FzaCA9IHNhc2guZ2V0Qm91bmRzKCk7Ci0JCQkJCQlzYXNoLnNldEJvdW5kcyhldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0KTsKLQkJCQkJCWludCBkaWZmID0gZXZlbnQueSAtIG9sZFNhc2gueTsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZUNhbnZhcy5nZXRCb3VuZHMoKTsKLQkJCQkJCWltYWdlQ2FudmFzLnNldEJvdW5kcyhib3VuZHMueCwgYm91bmRzLnksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCArIGRpZmYpOwotCQkJCQkJYm91bmRzID0gcGFsZXR0ZUNhbnZhc0JvdW5kczsKLQkJCQkJCXBhbGV0dGVDYW52YXMuc2V0Qm91bmRzKGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0ICsgZGlmZik7Ci0JCQkJCQlib3VuZHMgPSBkYXRhTGFiZWxCb3VuZHM7Ci0JCQkJCQlkYXRhTGFiZWwuc2V0Qm91bmRzKGJvdW5kcy54LCBib3VuZHMueSArIGRpZmYsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCQkJCQlib3VuZHMgPSBkYXRhVGV4dC5nZXRCb3VuZHMoKTsKLQkJCQkJCWRhdGFUZXh0LnNldEJvdW5kcyhib3VuZHMueCwgYm91bmRzLnkgKyBkaWZmLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQgLSBkaWZmKTsKLQkJCQkJCS8vc2hlbGwubGF5b3V0KHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBMYWJlbCB0byBzaG93IGRhdGEtc3BlY2lmaWMgZmllbGRzLgotCQlkYXRhTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJZGF0YUxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiUGl4ZWxfZGF0YV9pbml0aWFsIikpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQkvLyBUZXh0IHRvIHNob3cgYSBkdW1wIG9mIHRoZSBkYXRhLgotCQlkYXRhVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCWRhdGFUZXh0LnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLQkJZGF0YVRleHQuc2V0Rm9udChmaXhlZFdpZHRoRm9udCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEyODsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlkYXRhVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZGF0YVRleHQuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiBldmVudC5idXR0b24gPT0gMSkgewotCQkJCQlzaG93Q29sb3JGb3JEYXRhKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZGF0YVRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJc2hvd0NvbG9yRm9yRGF0YSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBMYWJlbCB0byBzaG93IHN0YXR1cyBhbmQgY3Vyc29yIGxvY2F0aW9uIGluIGltYWdlLgotCQlzdGF0dXNMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlzdGF0dXNMYWJlbC5zZXRUZXh0KCIiKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc3RhdHVzTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCU1lbnUgY3JlYXRlTWVudUJhcigpIHsKLQkJLy8gTWVudSBiYXIuCi0JCU1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJY3JlYXRlRmlsZU1lbnUobWVudUJhcik7Ci0JCWNyZWF0ZUFscGhhTWVudShtZW51QmFyKTsKLQkJcmV0dXJuIG1lbnVCYXI7Ci0JfQotCQotCXZvaWQgY3JlYXRlRmlsZU1lbnUoTWVudSBtZW51QmFyKSB7Ci0JCS8vIEZpbGUgbWVudQotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkZpbGUiKSk7Ci0JCU1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0TWVudShmaWxlTWVudSk7Ci0KLQkJLy8gRmlsZSAtPiBPcGVuIEZpbGUuLi4KLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiT3BlbkZpbGUiKSk7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnTycpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51T3BlbkZpbGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBGaWxlIC0+IE9wZW4gVVJMLi4uCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk9wZW5VUkwiKSk7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnVScpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51T3BlblVSTCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIEZpbGUgLT4gUmVvcGVuCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlJlb3BlbiIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVJlb3BlbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCW5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlNFUEFSQVRPUik7Ci0KLQkJLy8gRmlsZSAtPiBMb2FkIEZpbGUuLi4gKG5hdGl2ZWx5KQotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJMb2FkRmlsZSIpKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdMJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVMb2FkKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCi0JCS8vIEZpbGUgLT4gU2F2ZQotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlIikpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ1MnKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVNhdmUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBGaWxlIC0+IFNhdmUgQXMuLi4KLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU2F2ZV9hcyIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVNhdmVBcygpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIEZpbGUgLT4gU2F2ZSBNYXNrIEFzLi4uCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfbWFza19hcyIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVNhdmVNYXNrQXMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQluZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQkKLQkJLy8gRmlsZSAtPiBQcmludAotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJQcmludCIpKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdQJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVQcmludCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCW5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlNFUEFSQVRPUik7Ci0KLQkJLy8gRmlsZSAtPiBFeGl0Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkV4aXQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQotCX0KLQotCXZvaWQgY3JlYXRlQWxwaGFNZW51KE1lbnUgbWVudUJhcikgewotCQkvLyBBbHBoYSBtZW51Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQWxwaGEiKSk7Ci0JCU1lbnUgYWxwaGFNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldE1lbnUoYWxwaGFNZW51KTsKLQotCQkvLyBBbHBoYSAtPiBLCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oYWxwaGFNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiSyIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51Q29tcG9zZUFscGhhKEFMUEhBX0NPTlNUQU5UKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWxwaGEgLT4gKEsgKyB4KSAlIDI1NgotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGFscGhhTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIihLICsgeCkgJSAyNTYiKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUNvbXBvc2VBbHBoYShBTFBIQV9YKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWxwaGEgLT4gKEsgKyB5KSAlIDI1NgotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGFscGhhTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIihLICsgeSkgJSAyNTYiKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUNvbXBvc2VBbHBoYShBTFBIQV9ZKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0Jdm9pZCBtZW51Q29tcG9zZUFscGhhKGludCBhbHBoYV9vcCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCXRyeSB7Ci0JCQlpZiAoYWxwaGFfb3AgPT0gQUxQSEFfQ09OU1RBTlQpIHsKLQkJCQlpbWFnZURhdGEuYWxwaGEgPSBhbHBoYTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW1hZ2VEYXRhLmFscGhhID0gLTE7Ci0JCQkJc3dpdGNoIChhbHBoYV9vcCkgewotCQkJCQljYXNlIEFMUEhBX1g6IAotCQkJCQkJZm9yIChpbnQgeSA9IDA7IHkgPCBpbWFnZURhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCQkJCWZvciAoaW50IHggPSAwOyB4IDwgaW1hZ2VEYXRhLndpZHRoOyB4KyspIHsKLQkJCQkJCQlpbWFnZURhdGEuc2V0QWxwaGEoeCwgeSwgKHggKyBhbHBoYSkgJSAyNTYpOwotCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQUxQSEFfWTogCi0JCQkJCQlmb3IgKGludCB5ID0gMDsgeSA8IGltYWdlRGF0YS5oZWlnaHQ7IHkrKykgewotCQkJCQkJZm9yIChpbnQgeCA9IDA7IHggPCBpbWFnZURhdGEud2lkdGg7IHgrKykgewotCQkJCQkJCWltYWdlRGF0YS5zZXRBbHBoYSh4LCB5LCAoeSArIGFscGhhKSAlIDI1Nik7Ci0JCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDogYnJlYWs7Ci0JCQkJfQkJCQkJCi0JCQl9CQkJCi0JCQlkaXNwbGF5SW1hZ2UoaW1hZ2VEYXRhKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qIEp1c3QgdXNlIEltYWdlKGRldmljZSwgZmlsZW5hbWUpIHRvIGxvYWQgYW4gaW1hZ2UgZmlsZS4gKi8KLQl2b2lkIG1lbnVMb2FkKCkgewotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCQkKLQkJLy8gR2V0IHRoZSB1c2VyIHRvIGNob29zZSBhbiBpbWFnZSBmaWxlLgotCQlGaWxlRGlhbG9nIGZpbGVDaG9vc2VyID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJaWYgKGxhc3RQYXRoICE9IG51bGwpCi0JCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJQYXRoKGxhc3RQYXRoKTsKLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyRXh0ZW5zaW9ucyhPUEVOX0ZJTFRFUl9FWFRFTlNJT05TKTsKLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyTmFtZXMoT1BFTl9GSUxURVJfTkFNRVMpOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlQ2hvb3Nlci5vcGVuKCk7Ci0JCWxhc3RQYXRoID0gZmlsZUNob29zZXIuZ2V0RmlsdGVyUGF0aCgpOwotCQlpZiAoZmlsZW5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCXRyeSB7Ci0JCQkvLyBSZWFkIHRoZSBuZXcgaW1hZ2UgZnJvbSB0aGUgY2hvc2VuIGZpbGUuCi0JCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJSW1hZ2UgbmV3SW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZmlsZW5hbWUpOwotCQkJbG9hZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZTsgLy8gZG9uJ3QgaW5jbHVkZSBnZXRJbWFnZURhdGEgaW4gbG9hZCB0aW1lCi0JCQlpbWFnZURhdGEgPSBuZXdJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQotCQkJLy8gQ2FjaGUgdGhlIGZpbGVuYW1lLgotCQkJY3VycmVudE5hbWUgPSBmaWxlbmFtZTsKLQkJCWZpbGVOYW1lID0gZmlsZW5hbWU7Ci0JCQkKLQkJCS8vIEZpbGwgaW4gYXJyYXkgYW5kIGxvYWRlciBkYXRhLgotCQkJbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQlpbWFnZURhdGFBcnJheSA9IG5ldyBJbWFnZURhdGFbXSB7aW1hZ2VEYXRhfTsKLQkJCWxvYWRlci5kYXRhID0gaW1hZ2VEYXRhQXJyYXk7Ci0JCQkJCi0JCQkvLyBEaXNwbGF5IHRoZSBpbWFnZS4KLQkJCWltYWdlRGF0YUluZGV4ID0gMDsKLQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGEpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIkxvYWRpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiTG9hZGluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCX0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIkxvYWRpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXZvaWQgbWVudU9wZW5GaWxlKCkgewotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCQkKLQkJLy8gR2V0IHRoZSB1c2VyIHRvIGNob29zZSBhbiBpbWFnZSBmaWxlLgotCQlGaWxlRGlhbG9nIGZpbGVDaG9vc2VyID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJaWYgKGxhc3RQYXRoICE9IG51bGwpCi0JCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJQYXRoKGxhc3RQYXRoKTsKLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyRXh0ZW5zaW9ucyhPUEVOX0ZJTFRFUl9FWFRFTlNJT05TKTsKLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyTmFtZXMoT1BFTl9GSUxURVJfTkFNRVMpOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlQ2hvb3Nlci5vcGVuKCk7Ci0JCWxhc3RQYXRoID0gZmlsZUNob29zZXIuZ2V0RmlsdGVyUGF0aCgpOwotCQlpZiAoZmlsZW5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCUltYWdlTG9hZGVyIG9sZExvYWRlciA9IGxvYWRlcjsKLQkJdHJ5IHsKLQkJCWxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJaWYgKGluY3JlbWVudGFsKSB7Ci0JCQkJLy8gUHJlcGFyZSB0byBoYW5kbGUgaW5jcmVtZW50YWwgZXZlbnRzLgotCQkJCWxvYWRlci5hZGRJbWFnZUxvYWRlckxpc3RlbmVyKG5ldyBJbWFnZUxvYWRlckxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBpbWFnZURhdGFMb2FkZWQoSW1hZ2VMb2FkZXJFdmVudCBldmVudCkgewotCQkJCQkJaW5jcmVtZW50YWxEYXRhTG9hZGVkKGV2ZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWluY3JlbWVudGFsVGhyZWFkU3RhcnQoKTsKLQkJCX0KLQkJCS8vIFJlYWQgdGhlIG5ldyBpbWFnZShzKSBmcm9tIHRoZSBjaG9zZW4gZmlsZS4KLQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlpbWFnZURhdGFBcnJheSA9IGxvYWRlci5sb2FkKGZpbGVuYW1lKTsKLQkJCWxvYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQlpZiAoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCS8vIENhY2hlIHRoZSBmaWxlbmFtZS4KLQkJCQljdXJyZW50TmFtZSA9IGZpbGVuYW1lOwotCQkJCWZpbGVOYW1lID0gZmlsZW5hbWU7Ci0JCQkJCi0JCQkJLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGltYWdlcyBpbiB0aGUgZmlsZSAodHlwaWNhbGx5IEdJRikKLQkJCQkvLyB0aGVuIGVuYWJsZSB0aGUgUHJldmlvdXMsIE5leHQgYW5kIEFuaW1hdGUgYnV0dG9ucy4KLQkJCQlwcmV2aW91c0J1dHRvbi5zZXRFbmFibGVkKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpOwotCQkJCW5leHRCdXR0b24uc2V0RW5hYmxlZChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKTsKLQkJCQlhbmltYXRlQnV0dG9uLnNldEVuYWJsZWQoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSAmJiBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoID4gMCAmJiBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCA+IDApOwotCQotCQkJCS8vIERpc3BsYXkgdGhlIGZpcnN0IGltYWdlIGluIHRoZSBmaWxlLgotCQkJCWltYWdlRGF0YUluZGV4ID0gMDsKLQkJCQlkaXNwbGF5SW1hZ2UoaW1hZ2VEYXRhQXJyYXlbaW1hZ2VEYXRhSW5kZXhdKTsKLQkJCX0KLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJMb2FkaW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJCWxvYWRlciA9IG9sZExvYWRlcjsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIkxvYWRpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQkJbG9hZGVyID0gb2xkTG9hZGVyOwotCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJMb2FkaW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJCWxvYWRlciA9IG9sZExvYWRlcjsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQl2b2lkIG1lbnVPcGVuVVJMKCkgewotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCQkKLQkJLy8gR2V0IHRoZSB1c2VyIHRvIGNob29zZSBhbiBpbWFnZSBVUkwuCi0JCVRleHRQcm9tcHRlciB0ZXh0UHJvbXB0ZXIgPSBuZXcgVGV4dFByb21wdGVyKHNoZWxsLCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuRElBTE9HX1RSSU0pOwotCQl0ZXh0UHJvbXB0ZXIuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJPcGVuVVJMRGlhbG9nIikpOwotCQl0ZXh0UHJvbXB0ZXIuc2V0TWVzc2FnZShidW5kbGUuZ2V0U3RyaW5nKCJFbnRlclVSTCIpKTsKLQkJU3RyaW5nIHVybG5hbWUgPSB0ZXh0UHJvbXB0ZXIub3BlbigpOwotCQlpZiAodXJsbmFtZSA9PSBudWxsKSByZXR1cm47Ci0KLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlJbWFnZUxvYWRlciBvbGRMb2FkZXIgPSBsb2FkZXI7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCh1cmxuYW1lKTsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQlsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCWlmIChpbmNyZW1lbnRhbCkgewotCQkJCS8vIFByZXBhcmUgdG8gaGFuZGxlIGluY3JlbWVudGFsIGV2ZW50cy4KLQkJCQlsb2FkZXIuYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lcihuZXcgSW1hZ2VMb2FkZXJMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaW1hZ2VEYXRhTG9hZGVkKEltYWdlTG9hZGVyRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWluY3JlbWVudGFsRGF0YUxvYWRlZChldmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlpbmNyZW1lbnRhbFRocmVhZFN0YXJ0KCk7Ci0JCQl9Ci0JCQkvLyBSZWFkIHRoZSBuZXcgaW1hZ2UocykgZnJvbSB0aGUgY2hvc2VuIFVSTC4KLQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlpbWFnZURhdGFBcnJheSA9IGxvYWRlci5sb2FkKHN0cmVhbSk7Ci0JCQlsb2FkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOwotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQlpZiAoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCWN1cnJlbnROYW1lID0gdXJsbmFtZTsKLQkJCQlmaWxlTmFtZSA9IG51bGw7Ci0JCQkJCi0JCQkJLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGltYWdlcyAodHlwaWNhbGx5IEdJRikKLQkJCQkvLyB0aGVuIGVuYWJsZSB0aGUgUHJldmlvdXMsIE5leHQgYW5kIEFuaW1hdGUgYnV0dG9ucy4KLQkJCQlwcmV2aW91c0J1dHRvbi5zZXRFbmFibGVkKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpOwotCQkJCW5leHRCdXR0b24uc2V0RW5hYmxlZChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKTsKLQkJCQlhbmltYXRlQnV0dG9uLnNldEVuYWJsZWQoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSAmJiBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoID4gMCAmJiBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCA+IDApOwotCQotCQkJCS8vIERpc3BsYXkgdGhlIGZpcnN0IGltYWdlLgotCQkJCWltYWdlRGF0YUluZGV4ID0gMDsKLQkJCQlkaXNwbGF5SW1hZ2UoaW1hZ2VEYXRhQXJyYXlbaW1hZ2VEYXRhSW5kZXhdKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJMb2FkaW5nX2xjIiksIHVybG5hbWUsIGUpOwotCQkJbG9hZGVyID0gb2xkTG9hZGVyOwotCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJMb2FkaW5nX2xjIiksIHVybG5hbWUsIGUpOwotCQkJbG9hZGVyID0gb2xkTG9hZGVyOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgdG8gc3RhcnQgYSB0aHJlYWQgdGhhdCBkcmF3cyBpbmNyZW1lbnRhbCBpbWFnZXMKLQkgKiBhcyB0aGV5IGFyZSBsb2FkZWQuCi0JICovCi0Jdm9pZCBpbmNyZW1lbnRhbFRocmVhZFN0YXJ0KCkgewotCQlpbmNyZW1lbnRhbEV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLQkJaW5jcmVtZW50YWxUaHJlYWQgPSBuZXcgVGhyZWFkKCJJbmNyZW1lbnRhbCIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBEcmF3IHRoZSBmaXJzdCBJbWFnZURhdGEgaW5jcmVtZW50LgotCQkJCXdoaWxlIChpbmNyZW1lbnRhbEV2ZW50cyAhPSBudWxsKSB7Ci0JCQkJCS8vIFN5bmNocm9uaXplIHNvIHdlIGRvbid0IHRyeSB0byByZW1vdmUgd2hlbiB0aGUgdmVjdG9yIGlzIG51bGwuCi0JCQkJCXN5bmNocm9uaXplZCAoSW1hZ2VBbmFseXplci50aGlzKSB7Ci0JCQkJCQlpZiAoaW5jcmVtZW50YWxFdmVudHMgIT0gbnVsbCkgewotCQkJCQkJCWlmIChpbmNyZW1lbnRhbEV2ZW50cy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJCUltYWdlTG9hZGVyRXZlbnQgZXZlbnQgPSAoSW1hZ2VMb2FkZXJFdmVudCkgaW5jcmVtZW50YWxFdmVudHMucmVtb3ZlKDApOwotCQkJCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQkJCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBldmVudC5pbWFnZURhdGEpOwotCQkJCQkJCQlpbWFnZURhdGEgPSBldmVudC5pbWFnZURhdGE7Ci0JCQkJCQkJCWltYWdlQ2FudmFzR0MuZHJhd0ltYWdlKAotCQkJCQkJCQkJaW1hZ2UsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCQkJCWltYWdlRGF0YS55LAotCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJeWllbGQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZGlzcGxheS53YWtlKCk7Ci0JCQl9Ci0JCX07Ci0JCWluY3JlbWVudGFsVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJaW5jcmVtZW50YWxUaHJlYWQuc3RhcnQoKTsKLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiBpbmNyZW1lbnRhbCBpbWFnZSBkYXRhIGhhcyBiZWVuIGxvYWRlZCwKLQkgKiBmb3IgZXhhbXBsZSwgZm9yIGludGVybGFjZWQgR0lGL1BORyBvciBwcm9ncmVzc2l2ZSBKUEVHLgotCSAqLwotCXZvaWQgaW5jcmVtZW50YWxEYXRhTG9hZGVkKEltYWdlTG9hZGVyRXZlbnQgZXZlbnQpIHsKLQkJLy8gU3luY2hyb25pemUgc28gdGhhdCB3ZSBkbyBub3QgdHJ5IHRvIGFkZCB3aGlsZQotCQkvLyB0aGUgaW5jcmVtZW50YWwgZHJhd2luZyB0aHJlYWQgaXMgcmVtb3ZpbmcuCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaW5jcmVtZW50YWxFdmVudHMuYWRkRWxlbWVudChldmVudCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBtZW51U2F2ZSgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQotCQkvLyBJZiB0aGUgaW1hZ2UgZmlsZSB0eXBlIGlzIHVua25vd24sIHdlIGNhbid0ICdTYXZlJywKLQkJLy8gc28gd2UgaGF2ZSB0byB1c2UgJ1NhdmUgQXMuLi4nLgotCQlpZiAoaW1hZ2VEYXRhLnR5cGUgPT0gU1dULklNQUdFX1VOREVGSU5FRCB8fCBmaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQltZW51U2F2ZUFzKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCXRyeSB7Ci0JCQkvLyBTYXZlIHRoZSBjdXJyZW50IGltYWdlIHRvIHRoZSBjdXJyZW50IGZpbGUuCi0JCQlsb2FkZXIuZGF0YSA9IG5ldyBJbWFnZURhdGFbXSB7aW1hZ2VEYXRhfTsKLQkJCWxvYWRlci5zYXZlKGZpbGVOYW1lLCBpbWFnZURhdGEudHlwZSk7Ci0JCQkKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZU5hbWUsIGUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiU2F2aW5nX2xjIiksIGZpbGVOYW1lLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudVNhdmVBcygpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQotCQkvLyBHZXQgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZmlsZSBuYW1lIGFuZCB0eXBlIHRvIHNhdmUuCi0JCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULlNBVkUpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJQYXRoKGxhc3RQYXRoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gZmlsZU5hbWU7Ci0JCQlpbnQgbmFtZVN0YXJ0ID0gbmFtZS5sYXN0SW5kZXhPZihqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCQlpZiAobmFtZVN0YXJ0ID4gLTEpIHsKLQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZVN0YXJ0ICsgMSk7Ci0JCQl9Ci0JCQlmaWxlQ2hvb3Nlci5zZXRGaWxlTmFtZShuYW1lKTsKLQkJfQotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJFeHRlbnNpb25zKFNBVkVfRklMVEVSX0VYVEVOU0lPTlMpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJOYW1lcyhTQVZFX0ZJTFRFUl9OQU1FUyk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJbGFzdFBhdGggPSBmaWxlQ2hvb3Nlci5nZXRGaWx0ZXJQYXRoKCk7Ci0JCWlmIChmaWxlbmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEZpZ3VyZSBvdXQgd2hhdCBmaWxlIHR5cGUgdGhlIHVzZXIgd2FudHMgc2F2ZWQuCi0JCWludCBmaWxldHlwZSA9IGZpbGVDaG9vc2VyLmdldEZpbHRlckluZGV4KCk7Ci0JCWlmIChmaWxldHlwZSA9PSAtMSkgewotCQkJLyogVGhlIHBsYXRmb3JtIGZpbGUgZGlhbG9nIGRvZXMgbm90IHN1cHBvcnQgdXNlci1zZWxlY3RhYmxlIGZpbGUgZmlsdGVycy4KLQkJCSAqIERldGVybWluZSB0aGUgZGVzaXJlZCB0eXBlIGJ5IGxvb2tpbmcgYXQgdGhlIGZpbGUgZXh0ZW5zaW9uLiAKLQkJCSAqLwotCQkJZmlsZXR5cGUgPSBkZXRlcm1pbmVGaWxlVHlwZShmaWxlbmFtZSk7Ci0JCQlpZiAoZmlsZXR5cGUgPT0gU1dULklNQUdFX1VOREVGSU5FRCkgewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQkJCQlib3guc2V0TWVzc2FnZShjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiVW5rbm93bl9leHRlbnNpb24iKSwgCi0JCQkJCWZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpICsgMSkpKTsKLQkJCQlib3gub3BlbigpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5ldyBqYXZhLmlvLkZpbGUoZmlsZW5hbWUpLmV4aXN0cygpKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9RVUVTVElPTiB8IFNXVC5PSyB8IFNXVC5DQU5DRUwpOwotCQkJYm94LnNldE1lc3NhZ2UoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk92ZXJ3cml0ZSIpLCBmaWxlbmFtZSkpOwotCQkJaWYgKGJveC5vcGVuKCkgPT0gU1dULkNBTkNFTCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJdHJ5IHsKLQkJCS8vIFNhdmUgdGhlIGN1cnJlbnQgaW1hZ2UgdG8gdGhlIHNwZWNpZmllZCBmaWxlLgotCQkJYm9vbGVhbiBtdWx0aSA9IGZhbHNlOwotCQkJaWYgKGxvYWRlci5kYXRhLmxlbmd0aCA+IDEpIHsKLQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9RVUVTVElPTiB8IFNXVC5ZRVMgfCBTV1QuTk8gfCBTV1QuQ0FOQ0VMKTsKLQkJCQlib3guc2V0TWVzc2FnZShjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiU2F2ZV9hbGwiKSwgbmV3IEludGVnZXIobG9hZGVyLmRhdGEubGVuZ3RoKSkpOwotCQkJCWludCByZXN1bHQgPSBib3gub3BlbigpOwotCQkJCWlmIChyZXN1bHQgPT0gU1dULkNBTkNFTCkgcmV0dXJuOwotCQkJCWlmIChyZXN1bHQgPT0gU1dULllFUykgbXVsdGkgPSB0cnVlOwotCQkJfQotCQkJLyogSWYgdGhlIGltYWdlIGhhcyB0cmFuc3BhcmVuY3kgYnV0IHRoZSB1c2VyIGhhcyB0cmFuc3BhcmVuY3kgdHVybmVkIG9mZiwKLQkJCSAqIHR1cm4gaXQgb2ZmIGluIHRoZSBzYXZlZCBpbWFnZS4gKi8KLQkJCWludCB0cmFuc3BhcmVudFBpeGVsID0gaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWw7Ci0JCQlpZiAoIW11bHRpICYmIHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEgJiYgIXRyYW5zcGFyZW50KSB7Ci0JCQkJaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAtMTsKLQkJCX0KLQkJCQotCQkJaWYgKCFtdWx0aSkgbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhW10ge2ltYWdlRGF0YX07Ci0JCQlsb2FkZXIuc2F2ZShmaWxlbmFtZSwgZmlsZXR5cGUpOwotCQkJCi0JCQkvKiBSZXN0b3JlIHRoZSBwcmV2aW91cyB0cmFuc3BhcmVuY3kgc2V0dGluZy4gKi8KLQkJCWlmICghbXVsdGkgJiYgdHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IHRyYW5zcGFyZW50UGl4ZWw7Ci0JCQl9Ci0KLQkJCS8vIFVwZGF0ZSB0aGUgc2hlbGwgdGl0bGUgYW5kIGZpbGUgdHlwZSBsYWJlbCwKLQkJCS8vIGFuZCB1c2UgdGhlIG5ldyBmaWxlLgotCQkJZmlsZU5hbWUgPSBmaWxlbmFtZTsKLQkJCXNoZWxsLnNldFRleHQoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkFuYWx5emVyX29uIiksIGZpbGVuYW1lKSk7Ci0JCQl0eXBlTGFiZWwuc2V0VGV4dChjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiVHlwZV9zdHJpbmciKSwgZmlsZVR5cGVTdHJpbmcoZmlsZXR5cGUpKSk7Ci0KLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiU2F2aW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudVNhdmVNYXNrQXMoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsIHx8ICFzaG93TWFzaykgcmV0dXJuOwotCQlpZiAoaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSA9PSBTV1QuVFJBTlNQQVJFTkNZX05PTkUpIHJldHVybjsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQotCQkvLyBHZXQgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZmlsZSBuYW1lIGFuZCB0eXBlIHRvIHNhdmUuCi0JCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULlNBVkUpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJQYXRoKGxhc3RQYXRoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIGZpbGVDaG9vc2VyLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyRXh0ZW5zaW9ucyhTQVZFX0ZJTFRFUl9FWFRFTlNJT05TKTsKLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyTmFtZXMoU0FWRV9GSUxURVJfTkFNRVMpOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlQ2hvb3Nlci5vcGVuKCk7Ci0JCWxhc3RQYXRoID0gZmlsZUNob29zZXIuZ2V0RmlsdGVyUGF0aCgpOwotCQlpZiAoZmlsZW5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBGaWd1cmUgb3V0IHdoYXQgZmlsZSB0eXBlIHRoZSB1c2VyIHdhbnRzIHNhdmVkLgotCQlpbnQgZmlsZXR5cGUgPSBmaWxlQ2hvb3Nlci5nZXRGaWx0ZXJJbmRleCgpOwotCQlpZiAoZmlsZXR5cGUgPT0gLTEpIHsKLQkJCS8qIFRoZSBwbGF0Zm9ybSBmaWxlIGRpYWxvZyBkb2VzIG5vdCBzdXBwb3J0IHVzZXItc2VsZWN0YWJsZSBmaWxlIGZpbHRlcnMuCi0JCQkgKiBEZXRlcm1pbmUgdGhlIGRlc2lyZWQgdHlwZSBieSBsb29raW5nIGF0IHRoZSBmaWxlIGV4dGVuc2lvbi4gCi0JCQkgKi8KLQkJCWZpbGV0eXBlID0gZGV0ZXJtaW5lRmlsZVR5cGUoZmlsZW5hbWUpOwotCQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9VTkRFRklORUQpIHsKLQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUik7Ci0JCQkJYm94LnNldE1lc3NhZ2UoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlVua25vd25fZXh0ZW5zaW9uIiksIAotCQkJCQlmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpKSk7Ci0JCQkJYm94Lm9wZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZXcgamF2YS5pby5GaWxlKGZpbGVuYW1lKS5leGlzdHMoKSkgewotCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fUVVFU1RJT04gfCBTV1QuT0sgfCBTV1QuQ0FOQ0VMKTsKLQkJCWJveC5zZXRNZXNzYWdlKGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJPdmVyd3JpdGUiKSwgZmlsZW5hbWUpKTsKLQkJCWlmIChib3gub3BlbigpID09IFNXVC5DQU5DRUwpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCXRyeSB7Ci0JCQkvLyBTYXZlIHRoZSBtYXNrIG9mIHRoZSBjdXJyZW50IGltYWdlIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkJCUltYWdlRGF0YSBtYXNrSW1hZ2VEYXRhID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHttYXNrSW1hZ2VEYXRhfTsKLQkJCWxvYWRlci5zYXZlKGZpbGVuYW1lLCBmaWxldHlwZSk7Ci0JCQkKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiU2F2aW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudVByaW50KCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQkvLyBBc2sgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgcHJpbnRlci4KLQkJCVByaW50RGlhbG9nIGRpYWxvZyA9IG5ldyBQcmludERpYWxvZyhzaGVsbCwgU1dULk5PTkUpOwotCQkJaWYgKHByaW50ZXJEYXRhICE9IG51bGwpIGRpYWxvZy5zZXRQcmludGVyRGF0YShwcmludGVyRGF0YSk7Ci0JCQlwcmludGVyRGF0YSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocHJpbnRlckRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQkJCi0JCQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihwcmludGVyRGF0YSk7Ci0JCQlQb2ludCBzY3JlZW5EUEkgPSBkaXNwbGF5LmdldERQSSgpOwotCQkJUG9pbnQgcHJpbnRlckRQSSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JCQlpbnQgc2NhbGVGYWN0b3IgPSBwcmludGVyRFBJLnggLyBzY3JlZW5EUEkueDsKLQkJCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJCWlmIChwcmludGVyLnN0YXJ0Sm9iKGN1cnJlbnROYW1lKSkgewotCQkJCWlmIChwcmludGVyLnN0YXJ0UGFnZSgpKSB7Ci0JCQkJCUdDIGdjID0gbmV3IEdDKHByaW50ZXIpOwotCQkJCQlpbnQgdHJhbnNwYXJlbnRQaXhlbCA9IGltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsOwotCQkJCQlpZiAodHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCQkJCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gLTE7Ci0JCQkJCX0KLQkJCQkJSW1hZ2UgcHJpbnRlckltYWdlID0gbmV3IEltYWdlKHByaW50ZXIsIGltYWdlRGF0YSk7Ci0JCQkJCWdjLmRyYXdJbWFnZSgKLQkJCQkJCXByaW50ZXJJbWFnZSwKLQkJCQkJCTAsCi0JCQkJCQkwLAotCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCS10cmltLngsCi0JCQkJCQktdHJpbS55LAotCQkJCQkJc2NhbGVGYWN0b3IgKiBpbWFnZURhdGEud2lkdGgsCi0JCQkJCQlzY2FsZUZhY3RvciAqIGltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQlpZiAodHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCQkJCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gdHJhbnNwYXJlbnRQaXhlbDsKLQkJCQkJfQotCQkJCQlwcmludGVySW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJCXByaW50ZXIuZW5kUGFnZSgpOwotCQkJCX0KLQkJCQlwcmludGVyLmVuZEpvYigpOwotCQkJfQotCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQkJCWJveC5zZXRNZXNzYWdlKGJ1bmRsZS5nZXRTdHJpbmcoIlByaW50aW5nX2Vycm9yIikgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlib3gub3BlbigpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51UmVvcGVuKCkgewotCQlpZiAoY3VycmVudE5hbWUgPT0gbnVsbCkgcmV0dXJuOwotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCUltYWdlRGF0YVtdIG5ld0ltYWdlRGF0YTsKLQkJCWlmIChmaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJVVJMIHVybCA9IG5ldyBVUkwoY3VycmVudE5hbWUpOwotCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQluZXdJbWFnZURhdGEgPSBsb2FkZXIubG9hZChzdHJlYW0pOwotCQkJCWxvYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJbmV3SW1hZ2VEYXRhID0gbG9hZGVyLmxvYWQoZmlsZU5hbWUpOwotCQkJCWxvYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQl9Ci0JCQlpbWFnZURhdGFJbmRleCA9IDA7Ci0JCQlkaXNwbGF5SW1hZ2UobmV3SW1hZ2VEYXRhW2ltYWdlRGF0YUluZGV4XSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJSZWxvYWRpbmdfbGMiKSwgY3VycmVudE5hbWUsIGUpOwotCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJSZWxvYWRpbmdfbGMiKSwgY3VycmVudE5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewkKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQl2b2lkIGNoYW5nZUJhY2tncm91bmQoKSB7Ci0JCVN0cmluZyBiYWNrZ3JvdW5kID0gYmFja2dyb3VuZENvbWJvLmdldFRleHQoKTsKLQkJaWYgKGJhY2tncm91bmQuZXF1YWxzKGJ1bmRsZS5nZXRTdHJpbmcoIldoaXRlIikpKSB7Ci0JCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKHdoaXRlQ29sb3IpOwotCQl9IGVsc2UgaWYgKGJhY2tncm91bmQuZXF1YWxzKGJ1bmRsZS5nZXRTdHJpbmcoIkJsYWNrIikpKSB7Ci0JCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKGJsYWNrQ29sb3IpOwotCQl9IGVsc2UgaWYgKGJhY2tncm91bmQuZXF1YWxzKGJ1bmRsZS5nZXRTdHJpbmcoIlJlZCIpKSkgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZChyZWRDb2xvcik7Ci0JCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5lcXVhbHMoYnVuZGxlLmdldFN0cmluZygiR3JlZW4iKSkpIHsKLQkJCWltYWdlQ2FudmFzLnNldEJhY2tncm91bmQoZ3JlZW5Db2xvcik7Ci0JCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5lcXVhbHMoYnVuZGxlLmdldFN0cmluZygiQmx1ZSIpKSkgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZChibHVlQ29sb3IpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZChudWxsKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBTY2FsZVggY29tYm8gc2VsZWN0aW9uIGNoYW5nZXMuCi0JICovCi0Jdm9pZCBzY2FsZVgoKSB7Ci0JCXRyeSB7Ci0JCQl4c2NhbGUgPSBGbG9hdC5wYXJzZUZsb2F0KHNjYWxlWENvbWJvLmdldFRleHQoKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl4c2NhbGUgPSAxOwotCQkJc2NhbGVYQ29tYm8uc2VsZWN0KHNjYWxlWENvbWJvLmluZGV4T2YoIjEiKSk7Ci0JCX0KLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCXJlc2l6ZVNjcm9sbEJhcnMoKTsKLQkJCWltYWdlQ2FudmFzLnJlZHJhdygpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIFNjYWxlWSBjb21ibyBzZWxlY3Rpb24gY2hhbmdlcy4KLQkgKi8KLQl2b2lkIHNjYWxlWSgpIHsKLQkJdHJ5IHsKLQkJCXlzY2FsZSA9IEZsb2F0LnBhcnNlRmxvYXQoc2NhbGVZQ29tYm8uZ2V0VGV4dCgpKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXlzY2FsZSA9IDE7Ci0JCQlzY2FsZVlDb21iby5zZWxlY3Qoc2NhbGVZQ29tYm8uaW5kZXhPZigiMSIpKTsKLQkJfQotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJcmVzaXplU2Nyb2xsQmFycygpOwotCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgQWxwaGEgY29tYm8gc2VsZWN0aW9uIGNoYW5nZXMuCi0JICovCi0Jdm9pZCBhbHBoYSgpIHsKLQkJdHJ5IHsKLQkJCWFscGhhID0gSW50ZWdlci5wYXJzZUludChhbHBoYUNvbWJvLmdldFRleHQoKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlhbHBoYUNvbWJvLnNlbGVjdChhbHBoYUNvbWJvLmluZGV4T2YoIjI1NSIpKTsKLQkJCWFscGhhID0gMjU1OwotCQl9Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIG1vdXNlIG1vdmVzIGluIHRoZSBpbWFnZSBjYW52YXMuCi0JICogU2hvdyB0aGUgY29sb3Igb2YgdGhlIGltYWdlIGF0IHRoZSBwb2ludCB1bmRlciB0aGUgbW91c2UuCi0JICovCi0Jdm9pZCBzaG93Q29sb3JBdChpbnQgbXgsIGludCBteSkgewotCQlpbnQgeCA9IG14IC0gaW1hZ2VEYXRhLnggLSBpeDsKLQkJaW50IHkgPSBteSAtIGltYWdlRGF0YS55IC0gaXk7Ci0JCXNob3dDb2xvckZvclBpeGVsKHgsIHkpOwotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIGEgbW91c2UgZG93biBvciBrZXkgcHJlc3MgaXMgZGV0ZWN0ZWQKLQkgKiBpbiB0aGUgZGF0YSB0ZXh0LiBTaG93IHRoZSBjb2xvciBvZiB0aGUgcGl4ZWwgYXQKLQkgKiB0aGUgY2FyZXQgcG9zaXRpb24gaW4gdGhlIGRhdGEgdGV4dC4KLQkgKi8KLQl2b2lkIHNob3dDb2xvckZvckRhdGEoKSB7Ci0JCWludCBkZWxpbWl0ZXJMZW5ndGggPSBkYXRhVGV4dC5nZXRMaW5lRGVsaW1pdGVyKCkubGVuZ3RoKCk7Ci0JCWludCBjaGFyYWN0ZXJzUGVyTGluZSA9IDYgKyAzICogaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZSArIGRlbGltaXRlckxlbmd0aDsKLQkJaW50IHBvc2l0aW9uID0gZGF0YVRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJaW50IHkgPSBwb3NpdGlvbiAvIGNoYXJhY3RlcnNQZXJMaW5lOwotCQlpZiAoKHBvc2l0aW9uIC0geSAqIGNoYXJhY3RlcnNQZXJMaW5lKSA8IDYgfHwgKCh5ICsgMSkgKiBjaGFyYWN0ZXJzUGVyTGluZSAtIHBvc2l0aW9uKSA8PSBkZWxpbWl0ZXJMZW5ndGgpIHsKLQkJCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBkYXRhUG9zaXRpb24gPSBwb3NpdGlvbiAtIDYgKiAoeSArIDEpIC0gZGVsaW1pdGVyTGVuZ3RoICogeTsKLQkJaW50IGJ5dGVOdW1iZXIgPSBkYXRhUG9zaXRpb24gLyAzOwotCQlpbnQgd2hlcmUgPSBkYXRhUG9zaXRpb24gLSBieXRlTnVtYmVyICogMzsKLQkJaW50IHhCeXRlID0gYnl0ZU51bWJlciAlIGltYWdlRGF0YS5ieXRlc1BlckxpbmU7Ci0JCWludCB4ID0gLTE7Ci0JCWludCBkZXB0aCA9IGltYWdlRGF0YS5kZXB0aDsKLQkJaWYgKGRlcHRoID09IDEpIHsgLy8gOCBwaXhlbHMgcGVyIGJ5dGUgKGNhbiBvbmx5IHNob3cgMyBvZiA4KQotCQkJaWYgKHdoZXJlID09IDApIHggPSB4Qnl0ZSAqIDg7Ci0JCQlpZiAod2hlcmUgPT0gMSkgeCA9IHhCeXRlICogOCArIDM7Ci0JCQlpZiAod2hlcmUgPT0gMikgeCA9IHhCeXRlICogOCArIDc7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDIpIHsgLy8gNCBwaXhlbHMgcGVyIGJ5dGUgKGNhbiBvbmx5IHNob3cgMyBvZiA0KQotCQkJaWYgKHdoZXJlID09IDApIHggPSB4Qnl0ZSAqIDQ7Ci0JCQlpZiAod2hlcmUgPT0gMSkgeCA9IHhCeXRlICogNCArIDE7Ci0JCQlpZiAod2hlcmUgPT0gMikgeCA9IHhCeXRlICogNCArIDM7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDQpIHsgLy8gMiBwaXhlbHMgcGVyIGJ5dGUKLQkJCWlmICh3aGVyZSA9PSAwKSB4ID0geEJ5dGUgKiAyOwotCQkJaWYgKHdoZXJlID09IDEpIHggPSB4Qnl0ZSAqIDI7Ci0JCQlpZiAod2hlcmUgPT0gMikgeCA9IHhCeXRlICogMiArIDE7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDgpIHsgLy8gMSBieXRlIHBlciBwaXhlbAotCQkJeCA9IHhCeXRlOwotCQl9Ci0JCWlmIChkZXB0aCA9PSAxNikgeyAvLyAyIGJ5dGVzIHBlciBwaXhlbAotCQkJeCA9IHhCeXRlIC8gMjsKLQkJfQotCQlpZiAoZGVwdGggPT0gMjQpIHsgLy8gMyBieXRlcyBwZXIgcGl4ZWwKLQkJCXggPSB4Qnl0ZSAvIDM7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDMyKSB7IC8vIDQgYnl0ZXMgcGVyIHBpeGVsCi0JCQl4ID0geEJ5dGUgLyA0OwotCQl9Ci0JCWlmICh4ICE9IC0xKSB7Ci0JCQlzaG93Q29sb3JGb3JQaXhlbCh4LCB5KTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOwotCQl9Ci0JfQotCQotCS8qCi0JICogU2V0IHRoZSBzdGF0dXMgbGFiZWwgdG8gc2hvdyBjb2xvciBpbmZvcm1hdGlvbgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoZSBpbWFnZS4KLQkgKi8KLQl2b2lkIHNob3dDb2xvckZvclBpeGVsKGludCB4LCBpbnQgeSkgewotCQlpZiAoeCA+PSAwICYmIHggPCBpbWFnZURhdGEud2lkdGggJiYgeSA+PSAwICYmIHkgPCBpbWFnZURhdGEuaGVpZ2h0KSB7Ci0JCQlpbnQgcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoeCwgeSk7Ci0JCQlSR0IgcmdiID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKHBpeGVsKTsKLQkJCWJvb2xlYW4gaGFzQWxwaGEgPSBmYWxzZTsKLQkJCWludCBhbHBoYVZhbHVlID0gMDsKLQkJCWlmIChpbWFnZURhdGEuYWxwaGFEYXRhICE9IG51bGwgJiYgaW1hZ2VEYXRhLmFscGhhRGF0YS5sZW5ndGggPiAwKSB7Ci0JCQkJaGFzQWxwaGEgPSB0cnVlOwotCQkJCWFscGhhVmFsdWUgPSBpbWFnZURhdGEuZ2V0QWxwaGEoeCwgeSk7Ci0JCQl9Ci0JCQlTdHJpbmcgcmdiTWVzc2FnZUZvcm1hdCA9IGJ1bmRsZS5nZXRTdHJpbmcoaGFzQWxwaGEgPyAiUkdCQSIgOiAiUkdCIik7Ci0JCQlPYmplY3RbXSByZ2JBcmdzID0gewotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKHJnYi5yZWQpLAotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKHJnYi5ncmVlbiksCi0JCQkJCUludGVnZXIudG9TdHJpbmcocmdiLmJsdWUpLAotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGFscGhhVmFsdWUpCi0JCQl9OwotCQkJT2JqZWN0W10gcmdiSGV4QXJncyA9IHsKLQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhyZ2IucmVkKSwKLQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhyZ2IuZ3JlZW4pLAotCQkJCQlJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5ibHVlKSwKLQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhhbHBoYVZhbHVlKQotCQkJfTsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7Ci0JCQkJCW5ldyBJbnRlZ2VyKHgpLAotCQkJCQluZXcgSW50ZWdlcih5KSwKLQkJCQkJbmV3IEludGVnZXIocGl4ZWwpLAotCQkJCQlJbnRlZ2VyLnRvSGV4U3RyaW5nKHBpeGVsKSwKLQkJCQkJY3JlYXRlTXNnKHJnYk1lc3NhZ2VGb3JtYXQsIHJnYkFyZ3MpLAotCQkJCQljcmVhdGVNc2cocmdiTWVzc2FnZUZvcm1hdCwgcmdiSGV4QXJncyksCi0JCQkJCShwaXhlbCA9PSBpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCkgPyBidW5kbGUuZ2V0U3RyaW5nKCJDb2xvcl9hdF90cmFuc3BhcmVudCIpIDogIiJ9OwotCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQ29sb3JfYXQiKSwgYXJncykpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgQW5pbWF0ZSBidXR0b24gaXMgcHJlc3NlZC4KLQkgKi8KLQl2b2lkIGFuaW1hdGUoKSB7Ci0JCWFuaW1hdGUgPSAhYW5pbWF0ZTsKLQkJaWYgKGFuaW1hdGUgJiYgaW1hZ2UgIT0gbnVsbCAmJiBpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQlhbmltYXRlVGhyZWFkID0gbmV3IFRocmVhZChidW5kbGUuZ2V0U3RyaW5nKCJBbmltYXRpb24iKSkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gUHJlLWFuaW1hdGlvbiB3aWRnZXQgc2V0dXAuCi0JCQkJCXByZUFuaW1hdGlvbigpOwotCQkJCQkKLQkJCQkJLy8gQW5pbWF0ZS4KLQkJCQkJdHJ5IHsKLQkJCQkJCWFuaW1hdGVMb29wKCk7Ci0JCQkJCX0gY2F0Y2ggKGZpbmFsIFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXNob3dFcnJvckRpYWxvZyhjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQ3JlYXRpbmdfaW1hZ2UiKSwgCi0JCQkJCQkJCQkJICAgIG5ldyBJbnRlZ2VyKGltYWdlRGF0YUluZGV4KzEpKSwKLQkJCQkJCQkJCQkgICAgY3VycmVudE5hbWUsIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBQb3N0IGFuaW1hdGlvbiB3aWRnZXQgcmVzZXQuCi0JCQkJCXBvc3RBbmltYXRpb24oKTsKLQkJCQl9Ci0JCQl9OwotCQkJYW5pbWF0ZVRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCQlhbmltYXRlVGhyZWFkLnN0YXJ0KCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBpbWFnZXMgaW4gYSBtdWx0aS1pbWFnZSBmaWxlCi0JICogYW5kIGRpc3BsYXkgdGhlbSBvbmUgYWZ0ZXIgYW5vdGhlci4KLQkgKi8KLQl2b2lkIGFuaW1hdGVMb29wKCkgewotCQkvLyBDcmVhdGUgYW4gb2ZmLXNjcmVlbiBpbWFnZSB0byBkcmF3IG9uLCBhbmQgYSBHQyB0byBkcmF3IHdpdGguCi0JCS8vIEJvdGggYXJlIGRpc3Bvc2VkIGFmdGVyIHRoZSBhbmltYXRpb24uCi0JCUltYWdlIG9mZlNjcmVlbkltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgsIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJR0Mgb2ZmU2NyZWVuSW1hZ2VHQyA9IG5ldyBHQyhvZmZTY3JlZW5JbWFnZSk7Ci0JCQotCQl0cnkgewotCQkJLy8gVXNlIHN5bmNFeGVjIHRvIGdldCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgaW1hZ2VDYW52YXMuCi0JCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWNhbnZhc0JhY2tncm91bmQgPSBpbWFnZUNhbnZhcy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCS8vIEZpbGwgdGhlIG9mZi1zY3JlZW4gaW1hZ2Ugd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY2FudmFzLgotCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKGNhbnZhc0JhY2tncm91bmQpOwotCQkJb2ZmU2NyZWVuSW1hZ2VHQy5maWxsUmVjdGFuZ2xlKAotCQkJCTAsCi0JCQkJMCwKLQkJCQlsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoLAotCQkJCWxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJCQkJCi0JCQkvLyBEcmF3IHRoZSBjdXJyZW50IGltYWdlIG9udG8gdGhlIG9mZi1zY3JlZW4gaW1hZ2UuCi0JCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQlpbWFnZSwKLQkJCQkwLAotCQkJCTAsCi0JCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJaW1hZ2VEYXRhLngsCi0JCQkJaW1hZ2VEYXRhLnksCi0JCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCi0JCQlpbnQgcmVwZWF0Q291bnQgPSBsb2FkZXIucmVwZWF0Q291bnQ7Ci0JCQl3aGlsZSAoYW5pbWF0ZSAmJiAobG9hZGVyLnJlcGVhdENvdW50ID09IDAgfHwgcmVwZWF0Q291bnQgPiAwKSkgewotCQkJCWlmIChpbWFnZURhdGEuZGlzcG9zYWxNZXRob2QgPT0gU1dULkRNX0ZJTExfQkFDS0dST1VORCkgewotCQkJCQkvLyBGaWxsIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgYmVmb3JlIGRyYXdpbmcuCi0JCQkJCUNvbG9yIGJnQ29sb3IgPSBudWxsOwotCQkJCQlpbnQgYmFja2dyb3VuZFBpeGVsID0gbG9hZGVyLmJhY2tncm91bmRQaXhlbDsKLQkJCQkJaWYgKHNob3dCYWNrZ3JvdW5kICYmIGJhY2tncm91bmRQaXhlbCAhPSAtMSkgewotCQkJCQkJLy8gRmlsbCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgotCQkJCQkJUkdCIGJhY2tncm91bmRSR0IgPSBpbWFnZURhdGEucGFsZXR0ZS5nZXRSR0IoYmFja2dyb3VuZFBpeGVsKTsKLQkJCQkJCWJnQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgYmFja2dyb3VuZFJHQik7Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCW9mZlNjcmVlbkltYWdlR0Muc2V0QmFja2dyb3VuZChiZ0NvbG9yICE9IG51bGwgPyBiZ0NvbG9yIDogY2FudmFzQmFja2dyb3VuZCk7Ci0JCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmZpbGxSZWN0YW5nbGUoCi0JCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKGJnQ29sb3IgIT0gbnVsbCkgYmdDb2xvci5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCA9PSBTV1QuRE1fRklMTF9QUkVWSU9VUykgewotCQkJCQkvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyBpbWFnZSBiZWZvcmUgZHJhd2luZy4KLQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJCQlpbWFnZSwKLQkJCQkJCTAsCi0JCQkJCQkwLAotCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJCQkJCQkKLQkJCQkvLyBHZXQgdGhlIG5leHQgaW1hZ2UgZGF0YS4KLQkJCQlpbWFnZURhdGFJbmRleCA9IChpbWFnZURhdGFJbmRleCArIDEpICUgaW1hZ2VEYXRhQXJyYXkubGVuZ3RoOwotCQkJCWltYWdlRGF0YSA9IGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XTsKLQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJCQkKLQkJCQkvLyBEcmF3IHRoZSBuZXcgaW1hZ2UgZGF0YS4KLQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQkJaW1hZ2UsCi0JCQkJCTAsCi0JCQkJCTAsCi0JCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCWltYWdlRGF0YS55LAotCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQotCQkJCS8vIERyYXcgdGhlIG9mZi1zY3JlZW4gaW1hZ2UgdG8gdGhlIHNjcmVlbi4KLQkJCQlpbWFnZUNhbnZhc0dDLmRyYXdJbWFnZShvZmZTY3JlZW5JbWFnZSwgMCwgMCk7Ci0JCQkJCi0JCQkJLy8gU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgZGVsYXkgdGltZSBiZWZvcmUgZHJhd2luZyBhZ2Fpbi4KLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAodmlzaWJsZURlbGF5KGltYWdlRGF0YS5kZWxheVRpbWUgKiAxMCkpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gSWYgd2UgaGF2ZSBqdXN0IGRyYXduIHRoZSBsYXN0IGltYWdlIGluIHRoZSBzZXQsCi0JCQkJLy8gdGhlbiBkZWNyZW1lbnQgdGhlIHJlcGVhdCBjb3VudC4KLQkJCQlpZiAoaW1hZ2VEYXRhSW5kZXggPT0gaW1hZ2VEYXRhQXJyYXkubGVuZ3RoIC0gMSkgcmVwZWF0Q291bnQtLTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW9mZlNjcmVlbkltYWdlLmRpc3Bvc2UoKTsKLQkJCW9mZlNjcmVlbkltYWdlR0MuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBQcmUgYW5pbWF0aW9uIHNldHVwLgotCSAqLwotCXZvaWQgcHJlQW5pbWF0aW9uKCkgewotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBDaGFuZ2UgdGhlIGxhYmVsIG9mIHRoZSBBbmltYXRlIGJ1dHRvbiB0byAnU3RvcCcuCi0JCQkJYW5pbWF0ZUJ1dHRvbi5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlN0b3AiKSk7Ci0JCQkJCi0JCQkJLy8gRGlzYWJsZSBhbnl0aGluZyB3ZSBkb24ndCB3YW50IHRoZSB1c2VyCi0JCQkJLy8gdG8gc2VsZWN0IGR1cmluZyB0aGUgYW5pbWF0aW9uLgotCQkJCXByZXZpb3VzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJYmFja2dyb3VuZENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXNjYWxlWENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXNjYWxlWUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWFscGhhQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaW5jcmVtZW50YWxDaGVjay5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl0cmFuc3BhcmVudENoZWNrLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW1hc2tDaGVjay5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkvLyBsZWF2ZSBiYWNrZ3JvdW5kQ2hlY2sgZW5hYmxlZAotCQkJCi0JCQkJLy8gUmVzZXQgdGhlIHNjYWxlIGNvbWJvcyBhbmQgc2Nyb2xsYmFycy4KLQkJCQlyZXNldFNjYWxlQ29tYm9zKCk7Ci0JCQkJcmVzZXRTY3JvbGxCYXJzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogUG9zdCBhbmltYXRpb24gcmVzZXQuCi0JICovCi0Jdm9pZCBwb3N0QW5pbWF0aW9uKCkgewotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBFbmFibGUgYW55dGhpbmcgd2UgZGlzYWJsZWQgYmVmb3JlIHRoZSBhbmltYXRpb24uCi0JCQkJcHJldmlvdXNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQluZXh0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJYmFja2dyb3VuZENvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJc2NhbGVYQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlzY2FsZVlDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJCWFscGhhQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlpbmNyZW1lbnRhbENoZWNrLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJdHJhbnNwYXJlbnRDaGVjay5zZXRFbmFibGVkKHRydWUpOwotCQkJCW1hc2tDaGVjay5zZXRFbmFibGVkKHRydWUpOwotCQkJCi0JCQkJLy8gUmVzZXQgdGhlIGxhYmVsIG9mIHRoZSBBbmltYXRlIGJ1dHRvbi4KLQkJCQlhbmltYXRlQnV0dG9uLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQW5pbWF0ZSIpKTsKLQkJCQotCQkJCWlmIChhbmltYXRlKSB7Ci0JCQkJCS8vIElmIGFuaW1hdGUgaXMgc3RpbGwgdHJ1ZSwgd2UgZmluaXNoZWQgdGhlCi0JCQkJCS8vIGZ1bGwgbnVtYmVyIG9mIHJlcGVhdHMuIExlYXZlIHRoZSBpbWFnZSBhcy1pcy4KLQkJCQkJYW5pbWF0ZSA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFJlZGlzcGxheSB0aGUgY3VycmVudCBpbWFnZSBhbmQgaXRzIHBhbGV0dGUuCi0JCQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgUHJldmlvdXMgYnV0dG9uIGlzIHByZXNzZWQuCi0JICogRGlzcGxheSB0aGUgcHJldmlvdXMgaW1hZ2UgaW4gYSBtdWx0aS1pbWFnZSBmaWxlLgotCSAqLwotCXZvaWQgcHJldmlvdXMoKSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsICYmIGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCWlmIChpbWFnZURhdGFJbmRleCA9PSAwKSB7Ci0JCQkJaW1hZ2VEYXRhSW5kZXggPSBpbWFnZURhdGFBcnJheS5sZW5ndGg7Ci0JCQl9Ci0JCQlpbWFnZURhdGFJbmRleCA9IGltYWdlRGF0YUluZGV4IC0gMTsKLQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF0pOwotCQl9CQotCX0KLQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIE5leHQgYnV0dG9uIGlzIHByZXNzZWQuCi0JICogRGlzcGxheSB0aGUgbmV4dCBpbWFnZSBpbiBhIG11bHRpLWltYWdlIGZpbGUuCi0JICovCi0Jdm9pZCBuZXh0KCkgewotCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiBpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQlpbWFnZURhdGFJbmRleCA9IChpbWFnZURhdGFJbmRleCArIDEpICUgaW1hZ2VEYXRhQXJyYXkubGVuZ3RoOwotCQkJZGlzcGxheUltYWdlKGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XSk7Ci0JCX0JCi0JfQotCi0Jdm9pZCBkaXNwbGF5SW1hZ2UoSW1hZ2VEYXRhIG5ld0ltYWdlRGF0YSkgewotCQlyZXNldFNjYWxlQ29tYm9zKCk7Ci0JCWlmIChpbmNyZW1lbnRhbCAmJiBpbmNyZW1lbnRhbFRocmVhZCAhPSBudWxsKSB7Ci0JCQkvLyBUZWxsIHRoZSBpbmNyZW1lbnRhbCB0aHJlYWQgdG8gc3RvcCBkcmF3aW5nLgotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaW5jcmVtZW50YWxFdmVudHMgPSBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBXYWl0IHVudGlsIHRoZSBpbmNyZW1lbnRhbCB0aHJlYWQgaXMgZG9uZS4KLQkJCXdoaWxlIChpbmNyZW1lbnRhbFRocmVhZC5pc0FsaXZlKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfQotCQkJCQkKLQkJLy8gRGlzcG9zZSBvZiB0aGUgb2xkIGltYWdlLCBpZiB0aGVyZSB3YXMgb25lLgotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCi0JCXRyeSB7Ci0JCQkvLyBDYWNoZSB0aGUgbmV3IGltYWdlIGFuZCBpbWFnZURhdGEuCi0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBuZXdJbWFnZURhdGEpOwotCQkJaW1hZ2VEYXRhID0gbmV3SW1hZ2VEYXRhOwotCi0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiQ3JlYXRpbmdfZnJvbSIpICsgIiAiLCBjdXJyZW50TmFtZSwgZSk7Ci0JCQlpbWFnZSA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIHdpZGdldHMgd2l0aCB0aGUgbmV3IGltYWdlIGluZm8uCi0JCVN0cmluZyBzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQW5hbHl6ZXJfb24iKSwgY3VycmVudE5hbWUpOwotCQlzaGVsbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJaWYgKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUeXBlX2luZGV4IiksIAotCQkJICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ZmlsZVR5cGVTdHJpbmcoaW1hZ2VEYXRhLnR5cGUpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoaW1hZ2VEYXRhSW5kZXggKyAxKSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKGltYWdlRGF0YUFycmF5Lmxlbmd0aCl9KTsKLQkJfSBlbHNlIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUeXBlX3N0cmluZyIpLCBmaWxlVHlwZVN0cmluZyhpbWFnZURhdGEudHlwZSkpOwotCQl9Ci0JCXR5cGVMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlNpemVfdmFsdWUiKSwgCi0JCQkJCSBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGltYWdlRGF0YS53aWR0aCksCi0JCQkJCQkJICAgbmV3IEludGVnZXIoaW1hZ2VEYXRhLmhlaWdodCl9KTsKLQkJc2l6ZUxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRGVwdGhfdmFsdWUiKSwgbmV3IEludGVnZXIoaW1hZ2VEYXRhLmRlcHRoKSk7Ci0JCWRlcHRoTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUcmFuc3BhcmVudF9waXhlbF92YWx1ZSIpLCBwaXhlbEluZm8oaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwpKTsKLQkJdHJhbnNwYXJlbnRQaXhlbExhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiVGltZV90b19sb2FkX3ZhbHVlIiksIG5ldyBMb25nKGxvYWRUaW1lKSk7Ci0JCXRpbWVUb0xvYWRMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkFuaW1hdGlvbl9zaXplX3ZhbHVlIiksIAotCQkgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoKSwKLQkJCQkJCQkJbmV3IEludGVnZXIobG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQpfSk7Ci0JCXNjcmVlblNpemVMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmRfcGl4ZWxfdmFsdWUiKSwgcGl4ZWxJbmZvKGxvYWRlci5iYWNrZ3JvdW5kUGl4ZWwpKTsKLQkJYmFja2dyb3VuZFBpeGVsTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJJbWFnZV9sb2NhdGlvbl92YWx1ZSIpLCAKLQkJICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW1hZ2VEYXRhLngpLCBuZXcgSW50ZWdlcihpbWFnZURhdGEueSl9KTsKLQkJbG9jYXRpb25MYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkRpc3Bvc2FsX3ZhbHVlIiksCi0JCSAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCksCi0JCQkJCQkJICAgICAgZGlzcG9zYWxTdHJpbmcoaW1hZ2VEYXRhLmRpc3Bvc2FsTWV0aG9kKX0pOwotCQlkaXNwb3NhbE1ldGhvZExhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlpbnQgZGVsYXkgPSBpbWFnZURhdGEuZGVsYXlUaW1lICogMTA7Ci0JCWludCBkZWxheVVzZWQgPSB2aXNpYmxlRGVsYXkoZGVsYXkpOwotCQlpZiAoZGVsYXkgIT0gZGVsYXlVc2VkKSB7Ci0JCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRGVsYXlfdmFsdWUiKSwgCi0JCQkgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihkZWxheSksIG5ldyBJbnRlZ2VyKGRlbGF5VXNlZCl9KTsKLQkJfSBlbHNlIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJEZWxheV91c2VkIiksIG5ldyBJbnRlZ2VyKGRlbGF5KSk7Ci0JCX0KLQkJZGVsYXlUaW1lTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCWlmIChsb2FkZXIucmVwZWF0Q291bnQgPT0gMCkgewotCQkJc3RyaW5nID0gY3JlYXRlTXNnKCBidW5kbGUuZ2V0U3RyaW5nKCJSZXBlYXRzX2ZvcmV2ZXIiKSwgbmV3IEludGVnZXIobG9hZGVyLnJlcGVhdENvdW50KSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiUmVwZWF0c192YWx1ZSIpLCBuZXcgSW50ZWdlcihsb2FkZXIucmVwZWF0Q291bnQpKTsKLQkJfQotCQlyZXBlYXRDb3VudExhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlpZiAoaW1hZ2VEYXRhLnBhbGV0dGUuaXNEaXJlY3QpIHsKLQkJCXN0cmluZyA9IGJ1bmRsZS5nZXRTdHJpbmcoIlBhbGV0dGVfZGlyZWN0Iik7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiUGFsZXR0ZV92YWx1ZSIpLCBuZXcgSW50ZWdlcihpbWFnZURhdGEucGFsZXR0ZS5nZXRSR0JzKCkubGVuZ3RoKSk7Ci0JCX0KLQkJcGFsZXR0ZUxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coCi0JCQkJYnVuZGxlLmdldFN0cmluZygiUGl4ZWxfZGF0YV92YWx1ZSIpLAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQluZXcgSW50ZWdlcihpbWFnZURhdGEuYnl0ZXNQZXJMaW5lKSwKLQkJCQkJCW5ldyBJbnRlZ2VyKGltYWdlRGF0YS5zY2FubGluZVBhZCksCi0JCQkJCQlkZXB0aEluZm8oaW1hZ2VEYXRhLmRlcHRoKSwKLQkJCQkJCShpbWFnZURhdGEuYWxwaGFEYXRhICE9IG51bGwgJiYgaW1hZ2VEYXRhLmFscGhhRGF0YS5sZW5ndGggPiAwKSA/Ci0JCQkJCQkJCWJ1bmRsZS5nZXRTdHJpbmcoIlNjcm9sbF9mb3JfYWxwaGEiKSA6ICIiIH0pOwotCQlkYXRhTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCVN0cmluZyBkYXRhID0gZGF0YUhleER1bXAoZGF0YVRleHQuZ2V0TGluZURlbGltaXRlcigpKTsKLQkJZGF0YVRleHQuc2V0VGV4dChkYXRhKTsKLQkJCi0JCS8vIGJvbGQgdGhlIGZpcnN0IGNvbHVtbiBhbGwgdGhlIHdheSBkb3duCi0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlKChpbmRleCA9IGRhdGEuaW5kZXhPZignOicsIGluZGV4KzEpKSAhPSAtMSkgewotCQkJaW50IHN0YXJ0ID0gaW5kZXggLSBJTkRFWF9ESUdJVFM7Ci0JCQlpbnQgbGVuZ3RoID0gSU5ERVhfRElHSVRTOwotCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcihkYXRhLmNoYXJBdChpbmRleC0xKSkpIHsKLQkJCQlzdGFydCA9IGluZGV4IC0gQUxQSEFfQ0hBUlM7Ci0JCQkJbGVuZ3RoID0gQUxQSEFfQ0hBUlM7Ci0JCQl9Ci0JCQlkYXRhVGV4dC5zZXRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBsZW5ndGgsIGRhdGFUZXh0LmdldEZvcmVncm91bmQoKSwgZGF0YVRleHQuZ2V0QmFja2dyb3VuZCgpLCBTV1QuQk9MRCkpOwotCQl9Ci0KLQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7Ci0KLQkJLy8gUmVkcmF3IGJvdGggY2FudmFzZXMuCi0JCXJlc2V0U2Nyb2xsQmFycygpOwotCQlwYWxldHRlQ2FudmFzLnJlZHJhdygpOwotCQlpbWFnZUNhbnZhcy5yZWRyYXcoKTsKLQl9Ci0KLQl2b2lkIHBhaW50SW1hZ2UoUGFpbnRFdmVudCBldmVudCkgewotCQlHQyBnYyA9IGV2ZW50LmdjOwotCQlJbWFnZSBwYWludEltYWdlID0gaW1hZ2U7Ci0JCQotCQkvKiBJZiB0aGUgdXNlciB3YW50cyB0byBzZWUgdGhlIHRyYW5zcGFyZW50IHBpeGVsIGluIGl0cyBhY3R1YWwgY29sb3IsCi0JCSAqIHRoZW4gdGVtcG9yYXJpbHkgdHVybiBvZmYgdHJhbnNwYXJlbmN5LgotCQkgKi8KLQkJaW50IHRyYW5zcGFyZW50UGl4ZWwgPSBpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbDsKLQkJaWYgKHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEgJiYgIXRyYW5zcGFyZW50KSB7Ci0JCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IC0xOwotCQkJcGFpbnRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQl9Ci0JCQotCQkvKiBTY2FsZSB0aGUgaW1hZ2Ugd2hlbiBkcmF3aW5nLCB1c2luZyB0aGUgdXNlcidzIHNlbGVjdGVkIHNjYWxpbmcgZmFjdG9yLiAqLwotCQlpbnQgdyA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLndpZHRoICogeHNjYWxlKTsKLQkJaW50IGggPSBNYXRoLnJvdW5kKGltYWdlRGF0YS5oZWlnaHQgKiB5c2NhbGUpOwotCQkKLQkJLyogSWYgYW55IG9mIHRoZSBiYWNrZ3JvdW5kIGlzIHZpc2libGUsIGZpbGwgaXQgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvci4gKi8KLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlQ2FudmFzLmdldEJvdW5kcygpOwotCQlpZiAoaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSAhPSBTV1QuVFJBTlNQQVJFTkNZX05PTkUpIHsKLQkJCS8qIElmIHRoZXJlIGlzIGFueSB0cmFuc3BhcmVuY3kgYXQgYWxsLCBmaWxsIHRoZSB3aG9sZSBiYWNrZ3JvdW5kLiAqLwotCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQl9IGVsc2UgewotCQkJLyogT3RoZXJ3aXNlLCBqdXN0IGZpbGwgaW4gdGhlIGJhY2t3YXJkcyBMLiAqLwotCQkJaWYgKGl4ICsgdyA8IGJvdW5kcy53aWR0aCkgZ2MuZmlsbFJlY3RhbmdsZShpeCArIHcsIDAsIGJvdW5kcy53aWR0aCAtIChpeCArIHcpLCBib3VuZHMuaGVpZ2h0KTsKLQkJCWlmIChpeSArIGggPCBib3VuZHMuaGVpZ2h0KSBnYy5maWxsUmVjdGFuZ2xlKDAsIGl5ICsgaCwgaXggKyB3LCBib3VuZHMuaGVpZ2h0IC0gKGl5ICsgaCkpOwotCQl9Ci0JCQotCQkvKiBEcmF3IHRoZSBpbWFnZSAqLwotCQlnYy5kcmF3SW1hZ2UoCi0JCQlwYWludEltYWdlLAotCQkJMCwKLQkJCTAsCi0JCQlpbWFnZURhdGEud2lkdGgsCi0JCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJaXggKyBpbWFnZURhdGEueCwKLQkJCWl5ICsgaW1hZ2VEYXRhLnksCi0JCQl3LAotCQkJaCk7Ci0JCQotCQkvKiBJZiB0aGVyZSBpcyBhIG1hc2sgYW5kIHRoZSB1c2VyIHdhbnRzIHRvIHNlZSBpdCwgZHJhdyBpdC4gKi8KLQkJaWYgKHNob3dNYXNrICYmIChpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5VHlwZSgpICE9IFNXVC5UUkFOU1BBUkVOQ1lfTk9ORSkpIHsKLQkJCUltYWdlRGF0YSBtYXNrSW1hZ2VEYXRhID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCUltYWdlIG1hc2tJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBtYXNrSW1hZ2VEYXRhKTsKLQkJCWdjLmRyYXdJbWFnZSgKLQkJCQltYXNrSW1hZ2UsCi0JCQkJMCwKLQkJCQkwLAotCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCXcgKyAxMCArIGl4ICsgaW1hZ2VEYXRhLngsCi0JCQkJaXkgKyBpbWFnZURhdGEueSwKLQkJCQl3LAotCQkJCWgpOwotCQkJbWFza0ltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJLyogSWYgdHJhbnNwYXJlbmN5IHdhcyB0ZW1wb3JhcmlseSBkaXNhYmxlZCwgcmVzdG9yZSBpdC4gKi8KLQkJaWYgKHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEgJiYgIXRyYW5zcGFyZW50KSB7Ci0JCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IHRyYW5zcGFyZW50UGl4ZWw7Ci0JCQlwYWludEltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgcGFpbnRQYWxldHRlKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJZ2MuZmlsbFJlY3RhbmdsZShwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKSk7Ci0JCWlmIChpbWFnZURhdGEucGFsZXR0ZS5pc0RpcmVjdCkgewotCQkJLy8gRm9yIGEgZGlyZWN0IHBhbGV0dGUsIGRpc3BsYXkgdGhlIG1hc2tzLgotCQkJaW50IHkgPSBweSArIDEwOwotCQkJaW50IHhUYWIgPSA1MDsKLQkJCWdjLmRyYXdTdHJpbmcoInJNc2siLCAxMCwgeSwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRvSGV4NEJ5dGVTdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUucmVkTWFzayksIHhUYWIsIHksIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZygiZ01zayIsIDEwLCB5Kz0xMiwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRvSGV4NEJ5dGVTdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUuZ3JlZW5NYXNrKSwgeFRhYiwgeSwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKCJiTXNrIiwgMTAsIHkrPTEyLCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcodG9IZXg0Qnl0ZVN0cmluZyhpbWFnZURhdGEucGFsZXR0ZS5ibHVlTWFzayksIHhUYWIsIHksIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZygiclNoZiIsIDEwLCB5Kz0xMiwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKEludGVnZXIudG9TdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUucmVkU2hpZnQpLCB4VGFiLCB5LCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoImdTaGYiLCAxMCwgeSs9MTIsIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGltYWdlRGF0YS5wYWxldHRlLmdyZWVuU2hpZnQpLCB4VGFiLCB5LCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoImJTaGYiLCAxMCwgeSs9MTIsIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGltYWdlRGF0YS5wYWxldHRlLmJsdWVTaGlmdCksIHhUYWIsIHksIHRydWUpOwotCQl9IGVsc2UgewotCQkJLy8gRm9yIGFuIGluZGV4ZWQgcGFsZXR0ZSwgZGlzcGxheSB0aGUgcGFsZXR0ZSBjb2xvcnMgYW5kIGluZGljZXMuCi0JCQlSR0JbXSByZ2JzID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCcygpOwotCQkJaWYgKHJnYnMgIT0gbnVsbCkgewotCQkJCWludCB4VGFiMSA9IDQwLCB4VGFiMiA9IDEwMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJnYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IHkgPSAoaSsxKSAqIDEwICsgcHk7Ci0JCQkJCWdjLmRyYXdTdHJpbmcoU3RyaW5nLnZhbHVlT2YoaSksIDEwLCB5LCB0cnVlKTsKLQkJCQkJZ2MuZHJhd1N0cmluZyh0b0hleEJ5dGVTdHJpbmcocmdic1tpXS5yZWQpICsgdG9IZXhCeXRlU3RyaW5nKHJnYnNbaV0uZ3JlZW4pICsgdG9IZXhCeXRlU3RyaW5nKHJnYnNbaV0uYmx1ZSksIHhUYWIxLCB5LCB0cnVlKTsKLQkJCQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdic1tpXSk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJCQlnYy5maWxsUmVjdGFuZ2xlKHhUYWIyLCB5KzIsIDEwLCAxMCk7Ci0JCQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0Jdm9pZCByZXNpemVTaGVsbChDb250cm9sRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGltYWdlID09IG51bGwgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlyZXNpemVTY3JvbGxCYXJzKCk7Ci0JfQotCi0JLy8gUmVzZXQgdGhlIHNjYWxlIGNvbWJvcyB0byAxLgotCXZvaWQgcmVzZXRTY2FsZUNvbWJvcygpIHsKLQkJeHNjYWxlID0gMTsgeXNjYWxlID0gMTsKLQkJc2NhbGVYQ29tYm8uc2VsZWN0KHNjYWxlWENvbWJvLmluZGV4T2YoIjEiKSk7Ci0JCXNjYWxlWUNvbWJvLnNlbGVjdChzY2FsZVlDb21iby5pbmRleE9mKCIxIikpOwotCX0KLQkKLQkvLyBSZXNldCB0aGUgc2Nyb2xsIGJhcnMgdG8gMC4KLQl2b2lkIHJlc2V0U2Nyb2xsQmFycygpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJaXggPSAwOyBpeSA9IDA7IHB5ID0gMDsKLQkJcmVzaXplU2Nyb2xsQmFycygpOwotCQlpbWFnZUNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCkuc2V0U2VsZWN0aW9uKDApOwotCQlpbWFnZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpLnNldFNlbGVjdGlvbigwKTsKLQkJcGFsZXR0ZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpLnNldFNlbGVjdGlvbigwKTsKLQl9Ci0JCi0Jdm9pZCByZXNpemVTY3JvbGxCYXJzKCkgewotCQkvLyBTZXQgdGhlIG1heCBhbmQgdGh1bWIgZm9yIHRoZSBpbWFnZSBjYW52YXMgc2Nyb2xsIGJhcnMuCi0JCVNjcm9sbEJhciBob3Jpem9udGFsID0gaW1hZ2VDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlTY3JvbGxCYXIgdmVydGljYWwgPSBpbWFnZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQlSZWN0YW5nbGUgY2FudmFzQm91bmRzID0gaW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLnJvdW5kKGltYWdlRGF0YS53aWR0aCAqIHhzY2FsZSk7Ci0JCWlmICh3aWR0aCA+IGNhbnZhc0JvdW5kcy53aWR0aCkgewotCQkJLy8gVGhlIGltYWdlIGlzIHdpZGVyIHRoYW4gdGhlIGNhbnZhcy4KLQkJCWhvcml6b250YWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWhvcml6b250YWwuc2V0TWF4aW11bSh3aWR0aCk7Ci0JCQlob3Jpem9udGFsLnNldFRodW1iKGNhbnZhc0JvdW5kcy53aWR0aCk7Ci0JCQlob3Jpem9udGFsLnNldFBhZ2VJbmNyZW1lbnQoY2FudmFzQm91bmRzLndpZHRoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRoZSBjYW52YXMgaXMgd2lkZXIgdGhhbiB0aGUgaW1hZ2UuCi0JCQlob3Jpem9udGFsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKGl4ICE9IDApIHsKLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGltYWdlIGlzIGNvbXBsZXRlbHkgdmlzaWJsZS4KLQkJCQlpeCA9IDA7Ci0JCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQl9Ci0JCX0KLQkJaW50IGhlaWdodCA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLmhlaWdodCAqIHlzY2FsZSk7Ci0JCWlmIChoZWlnaHQgPiBjYW52YXNCb3VuZHMuaGVpZ2h0KSB7Ci0JCQkvLyBUaGUgaW1hZ2UgaXMgdGFsbGVyIHRoYW4gdGhlIGNhbnZhcy4KLQkJCXZlcnRpY2FsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl2ZXJ0aWNhbC5zZXRNYXhpbXVtKGhlaWdodCk7Ci0JCQl2ZXJ0aWNhbC5zZXRUaHVtYihjYW52YXNCb3VuZHMuaGVpZ2h0KTsKLQkJCXZlcnRpY2FsLnNldFBhZ2VJbmNyZW1lbnQoY2FudmFzQm91bmRzLmhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGUgY2FudmFzIGlzIHRhbGxlciB0aGFuIHRoZSBpbWFnZS4KLQkJCXZlcnRpY2FsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKGl5ICE9IDApIHsKLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGltYWdlIGlzIGNvbXBsZXRlbHkgdmlzaWJsZS4KLQkJCQlpeSA9IDA7Ci0JCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTZXQgdGhlIG1heCBhbmQgdGh1bWIgZm9yIHRoZSBwYWxldHRlIGNhbnZhcyBzY3JvbGwgYmFyLgotCQl2ZXJ0aWNhbCA9IHBhbGV0dGVDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJaWYgKGltYWdlRGF0YS5wYWxldHRlLmlzRGlyZWN0KSB7Ci0JCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsgLy8gaW5kZXhlZCBwYWxldHRlCi0JCQljYW52YXNCb3VuZHMgPSBwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJCWludCBwYWxldHRlSGVpZ2h0ID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCcygpLmxlbmd0aCAqIDEwICsgMjA7IC8vIDEwIHBpeGVscyBlYWNoIGluZGV4ICsgMjAgZm9yIG1hcmdpbnMuCi0JCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKHRydWUpOwotCQkJdmVydGljYWwuc2V0TWF4aW11bShwYWxldHRlSGVpZ2h0KTsKLQkJCXZlcnRpY2FsLnNldFRodW1iKGNhbnZhc0JvdW5kcy5oZWlnaHQpOwotCQkJdmVydGljYWwuc2V0UGFnZUluY3JlbWVudChjYW52YXNCb3VuZHMuaGVpZ2h0KTsKLQkJfQotCX0KLQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIGltYWdlIGNhbnZhcycgaG9yaXpvbnRhbCBzY3JvbGxiYXIgaXMgc2VsZWN0ZWQuCi0JICovCi0Jdm9pZCBzY3JvbGxIb3Jpem9udGFsbHkoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlSZWN0YW5nbGUgY2FudmFzQm91bmRzID0gaW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLnJvdW5kKGltYWdlRGF0YS53aWR0aCAqIHhzY2FsZSk7Ci0JCWludCBoZWlnaHQgPSBNYXRoLnJvdW5kKGltYWdlRGF0YS5oZWlnaHQgKiB5c2NhbGUpOwotCQlpZiAod2lkdGggPiBjYW52YXNCb3VuZHMud2lkdGgpIHsKLQkJCS8vIE9ubHkgc2Nyb2xsIGlmIHRoZSBpbWFnZSBpcyBiaWdnZXIgdGhhbiB0aGUgY2FudmFzLgotCQkJaW50IHggPSAtc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHggKyB3aWR0aCA8IGNhbnZhc0JvdW5kcy53aWR0aCkgewotCQkJCS8vIERvbid0IHNjcm9sbCBwYXN0IHRoZSBlbmQgb2YgdGhlIGltYWdlLgotCQkJCXggPSBjYW52YXNCb3VuZHMud2lkdGggLSB3aWR0aDsKLQkJCX0KLQkJCWltYWdlQ2FudmFzLnNjcm9sbCh4LCBpeSwgaXgsIGl5LCB3aWR0aCwgaGVpZ2h0LCBmYWxzZSk7Ci0JCQlpeCA9IHg7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgY2FudmFzJyB2ZXJ0aWNhbCBzY3JvbGxiYXIgaXMgc2VsZWN0ZWQuCi0JICovCi0Jdm9pZCBzY3JvbGxWZXJ0aWNhbGx5KFNjcm9sbEJhciBzY3JvbGxCYXIpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJUmVjdGFuZ2xlIGNhbnZhc0JvdW5kcyA9IGltYWdlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5yb3VuZChpbWFnZURhdGEud2lkdGggKiB4c2NhbGUpOwotCQlpbnQgaGVpZ2h0ID0gTWF0aC5yb3VuZChpbWFnZURhdGEuaGVpZ2h0ICogeXNjYWxlKTsKLQkJaWYgKGhlaWdodCA+IGNhbnZhc0JvdW5kcy5oZWlnaHQpIHsKLQkJCS8vIE9ubHkgc2Nyb2xsIGlmIHRoZSBpbWFnZSBpcyBiaWdnZXIgdGhhbiB0aGUgY2FudmFzLgotCQkJaW50IHkgPSAtc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHkgKyBoZWlnaHQgPCBjYW52YXNCb3VuZHMuaGVpZ2h0KSB7Ci0JCQkJLy8gRG9uJ3Qgc2Nyb2xsIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW1hZ2UuCi0JCQkJeSA9IGNhbnZhc0JvdW5kcy5oZWlnaHQgLSBoZWlnaHQ7Ci0JCQl9Ci0JCQlpbWFnZUNhbnZhcy5zY3JvbGwoaXgsIHksIGl4LCBpeSwgd2lkdGgsIGhlaWdodCwgZmFsc2UpOwotCQkJaXkgPSB5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcGFsZXR0ZSBjYW52YXMnIHZlcnRpY2FsIHNjcm9sbGJhciBpcyBzZWxlY3RlZC4KLQkgKi8KLQl2b2lkIHNjcm9sbFBhbGV0dGUoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlSZWN0YW5nbGUgY2FudmFzQm91bmRzID0gcGFsZXR0ZUNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCWludCBwYWxldHRlSGVpZ2h0ID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCcygpLmxlbmd0aCAqIDEwICsgMjA7Ci0JCWlmIChwYWxldHRlSGVpZ2h0ID4gY2FudmFzQm91bmRzLmhlaWdodCkgewotCQkJLy8gT25seSBzY3JvbGwgaWYgdGhlIHBhbGV0dGUgaXMgYmlnZ2VyIHRoYW4gdGhlIGNhbnZhcy4KLQkJCWludCB5ID0gLXNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICh5ICsgcGFsZXR0ZUhlaWdodCA8IGNhbnZhc0JvdW5kcy5oZWlnaHQpIHsKLQkJCQkvLyBEb24ndCBzY3JvbGwgcGFzdCB0aGUgZW5kIG9mIHRoZSBwYWxldHRlLgotCQkJCXkgPSBjYW52YXNCb3VuZHMuaGVpZ2h0IC0gcGFsZXR0ZUhlaWdodDsKLQkJCX0KLQkJCXBhbGV0dGVDYW52YXMuc2Nyb2xsKDAsIHksIDAsIHB5LCBwYWxldHRlV2lkdGgsIHBhbGV0dGVIZWlnaHQsIGZhbHNlKTsKLQkJCXB5ID0geTsKLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgU3RyaW5nIGNvbnRhaW5pbmcgYSBsaW5lLWJ5LWxpbmUgZHVtcCBvZgotCSAqIHRoZSBkYXRhIGluIHRoZSBjdXJyZW50IGltYWdlRGF0YS4gVGhlIGxpbmVEZWxpbWl0ZXIKLQkgKiBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMSBvciAyLgotCSAqLwotCVN0cmluZyBkYXRhSGV4RHVtcChTdHJpbmcgbGluZURlbGltaXRlcikgewotCQlmaW5hbCBpbnQgTUFYX0RVTVAgPSAxMDI0ICogMTAyNDsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybiAiIjsKLQkJYm9vbGVhbiB0cnVuY2F0ZWQgPSBmYWxzZTsKLQkJY2hhcltdIGR1bXAgPSBudWxsOwotCQlieXRlW10gYWxwaGFzID0gaW1hZ2VEYXRhLmFscGhhRGF0YTsKLQkJdHJ5IHsKLQkJCWludCBsZW5ndGggPSBpbWFnZURhdGEuaGVpZ2h0ICogKDYgKyAzICogaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZSArIGxpbmVEZWxpbWl0ZXIubGVuZ3RoKCkpOwotCQkJaWYgKGFscGhhcyAhPSBudWxsICYmIGFscGhhcy5sZW5ndGggPiAwKSB7Ci0JCQkJbGVuZ3RoICs9IGltYWdlRGF0YS5oZWlnaHQgKiAoNiArIDMgKiBpbWFnZURhdGEud2lkdGggKyBsaW5lRGVsaW1pdGVyLmxlbmd0aCgpKSArIDYgKyBsaW5lRGVsaW1pdGVyLmxlbmd0aCgpOwotCQkJfQotCQkJZHVtcCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCX0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewotCQkJLyogVG9vIG11Y2ggZGF0YSB0byBkdW1wIC0gdHJ1bmNhdGUuICovCi0JCQlkdW1wID0gbmV3IGNoYXJbTUFYX0RVTVBdOwotCQkJdHJ1bmNhdGVkID0gdHJ1ZTsKLQkJfQotCQlpbnQgaW5kZXggPSAwOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICUgaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZSA9PSAwKSB7Ci0JCQkJCWludCBsaW5lID0gaSAvIGltYWdlRGF0YS5ieXRlc1BlckxpbmU7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAvIDEwMDAgJSAxMCwgMTApOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMDAgJSAxMCwgMTApOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMCAlIDEwLCAxMCk7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAlIDEwLCAxMCk7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSAnOic7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJfQotCQkJCWJ5dGUgYiA9IGltYWdlRGF0YS5kYXRhW2ldOwotCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQoKGIgJiAweEYwKSA+PiA0LCAxNik7Ci0JCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChiICYgMHgwRiwgMTYpOwotCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJaWYgKChpICsgMSkgJSBpbWFnZURhdGEuYnl0ZXNQZXJMaW5lID09IDApIHsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDApOwotCQkJCQlpZiAobGluZURlbGltaXRlci5sZW5ndGgoKSA+IDEpIHsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChhbHBoYXMgIT0gbnVsbCAmJiBhbHBoYXMubGVuZ3RoID4gMCkgewotCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgwKTsKLQkJCQlpZiAobGluZURlbGltaXRlci5sZW5ndGgoKSA+IDEpIHsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDEpOwotCQkJCX0KLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5ldyBjaGFyW117J0EnLCdsJywncCcsJ2gnLCdhJywnOid9LCAwLCBkdW1wLCBpbmRleCwgNik7Ci0JCQkJaW5kZXggKz02OwotCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgwKTsKLQkJCQlpZiAobGluZURlbGltaXRlci5sZW5ndGgoKSA+IDEpIHsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDEpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFscGhhcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAlIGltYWdlRGF0YS53aWR0aCA9PSAwKSB7Ci0JCQkJCQlpbnQgbGluZSA9IGkgLyBpbWFnZURhdGEud2lkdGg7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMDAwICUgMTAsIDEwKTsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAvIDEwMCAlIDEwLCAxMCk7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMCAlIDEwLCAxMCk7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgJSAxMCwgMTApOwotCQkJCQkJZHVtcFtpbmRleCsrXSA9ICc6JzsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJCX0KLQkJCQkJYnl0ZSBiID0gYWxwaGFzW2ldOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KChiICYgMHhGMCkgPj4gNCwgMTYpOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGIgJiAweDBGLCAxNik7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJCWlmICgoaSArIDEpICUgaW1hZ2VEYXRhLndpZHRoID09IDApIHsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgwKTsKLQkJCQkJCWlmIChsaW5lRGVsaW1pdGVyLmxlbmd0aCgpID4gMSkgewotCQkJCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7fQotCQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBuZXcgU3RyaW5nKGR1bXApOwotCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLQkJCS8qIFRvbyBtdWNoIGRhdGEgdG8gZGlzcGxheSBpbiB0aGUgdGV4dCB3aWRnZXQgLSB0cnVuY2F0ZS4gKi8KLQkJCXJlc3VsdCA9IG5ldyBTdHJpbmcoZHVtcCwgMCwgTUFYX0RVTVApOwotCQkJdHJ1bmNhdGVkID0gdHJ1ZTsKLQkJfQotCQlpZiAodHJ1bmNhdGVkKSByZXN1bHQgKz0gIlxuIC4uLmRhdGEgZHVtcCB0cnVuY2F0ZWQgYXQgIiArIE1BWF9EVU1QICsgImJ5dGVzLi4uIjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoKLQkgKiBPcGVuIGFuIGVycm9yIGRpYWxvZyBkaXNwbGF5aW5nIHRoZSBzcGVjaWZpZWQgaW5mb3JtYXRpb24uCi0JICovCi0Jdm9pZCBzaG93RXJyb3JEaWFsb2coU3RyaW5nIG9wZXJhdGlvbiwgU3RyaW5nIGZpbGVuYW1lLCBUaHJvd2FibGUgZSkgewotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUik7Ci0JCVN0cmluZyBtZXNzYWdlID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkVycm9yIiksIG5ldyBTdHJpbmdbXSB7b3BlcmF0aW9uLCBmaWxlbmFtZX0pOwotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gIiI7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgU1dURXhjZXB0aW9uKSB7Ci0JCQkJU1dURXhjZXB0aW9uIHN3dGUgPSAoU1dURXhjZXB0aW9uKSBlOwotCQkJCWVycm9yTWVzc2FnZSA9IHN3dGUuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChzd3RlLnRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSArPSAiOlxuIiArIHN3dGUudGhyb3dhYmxlLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgU1dURXJyb3IpIHsKLQkJCQlTV1RFcnJvciBzd3RlID0gKFNXVEVycm9yKSBlOwotCQkJCWVycm9yTWVzc2FnZSA9IHN3dGUuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChzd3RlLnRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSArPSAiOlxuIiArIHN3dGUudGhyb3dhYmxlLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBlLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJYm94LnNldE1lc3NhZ2UobWVzc2FnZSArIGVycm9yTWVzc2FnZSk7Ci0JCWJveC5vcGVuKCk7Ci0JfQotCQotCS8qCi0JICogT3BlbiBhIGRpYWxvZyBhc2tpbmcgdGhlIHVzZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHR5cGUgb2YgQk1QIGZpbGUgdG8gc2F2ZS4KLQkgKi8KLQlpbnQgc2hvd0JNUERpYWxvZygpIHsKLQkJZmluYWwgaW50IFtdIGJtcFR5cGUgPSBuZXcgaW50WzFdOwotCQlibXBUeXBlWzBdID0gU1dULklNQUdFX0JNUDsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgcmFkaW9TZWxlY3RlZCA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJ1dHRvbiByYWRpbyA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCQlpZiAocmFkaW8uZ2V0U2VsZWN0aW9uKCkpIGJtcFR5cGVbMF0gPSAoKEludGVnZXIpcmFkaW8uZ2V0RGF0YSgpKS5pbnRWYWx1ZSgpOwotCQkJfQotCQl9OwotCQkvLyBuZWVkIHRvIGV4dGVybmFsaXplIHN0cmluZ3MKLQkJZmluYWwgU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0pOwotCi0JCWRpYWxvZy5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXNfdHlwZSIpKTsKLQkJZGlhbG9nLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRpYWxvZywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXNfdHlwZV9sYWJlbCIpKTsKLQkJCi0JCUJ1dHRvbiByYWRpbyA9IG5ldyBCdXR0b24oZGlhbG9nLCBTV1QuUkFESU8pOwotCQlyYWRpby5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXNfdHlwZV9ub19jb21wcmVzcyIpKTsKLQkJcmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlyYWRpby5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9CTVApKTsKLQkJcmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIocmFkaW9TZWxlY3RlZCk7Ci0KLQkJcmFkaW8gPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlJBRElPKTsKLQkJcmFkaW8uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FzX3R5cGVfcmxlX2NvbXByZXNzIikpOwotCQlyYWRpby5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9CTVBfUkxFKSk7Ci0JCXJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJhZGlvU2VsZWN0ZWQpOwotCQkKLQkJcmFkaW8gPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlJBRElPKTsKLQkJcmFkaW8uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FzX3R5cGVfb3MyIikpOwotCQlyYWRpby5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9PUzJfQk1QKSk7Ci0JCXJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJhZGlvU2VsZWN0ZWQpOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKGRpYWxvZywgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlBVU0gpOwotCQlvay5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk9LIikpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWRhdGEud2lkdGhIaW50ID0gNzU7Ci0JCW9rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRpYWxvZy5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWRpYWxvZy5wYWNrKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXdoaWxlICghZGlhbG9nLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJcmV0dXJuIGJtcFR5cGVbMF07Ci0JfQkKLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIGhvdyB0byBhbmFseXplIHRoZSBieXRlcwotCSAqIGluIHRoZSBoZXggZHVtcC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGRlcHRoSW5mbyhpbnQgZGVwdGgpIHsKLQkJT2JqZWN0W10gYXJncyA9IHtuZXcgSW50ZWdlcihkZXB0aCksICIifTsKLQkJc3dpdGNoIChkZXB0aCkgewotCQkJY2FzZSAxOgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfcGl4ZWxzIiksIAotCQkJCSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcig4KSwgIiBbMDEyMzQ1NjddIn0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfcGl4ZWxzIiksCi0JCQkJICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKDQpLCAiWzAwMTEyMjMzXSJ9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlhcmdzWzFdID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk11bHRpX3BpeGVscyIpLAotCQkJCSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcigyKSwgIlswMDAwMTExMV0ifSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDg6Ci0JCQkJYXJnc1sxXSA9IGJ1bmRsZS5nZXRTdHJpbmcoIk9uZV9ieXRlIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfYnl0ZXMiKSwgbmV3IEludGVnZXIoMikpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQlhcmdzWzFdID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk11bHRpX2J5dGVzIiksIG5ldyBJbnRlZ2VyKDMpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJYXJnc1sxXSA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJNdWx0aV9ieXRlcyIpLCBuZXcgSW50ZWdlcig0KSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWFyZ3NbMV0gPSBidW5kbGUuZ2V0U3RyaW5nKCJVbnN1cHBvcnRlZF9sYyIpOwotCQl9Ci0JCXJldHVybiBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRGVwdGhfaW5mbyIpLCBhcmdzKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgotCSAqIElmIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpcyB0b28gc21hbGwKLQkgKiB0byBzZWUgYSB2aXN1YWwgY2hhbmdlLCB0aGVuIHJldHVybiBhIGhpZ2hlciBudW1iZXIuCi0JICovCi0Jc3RhdGljIGludCB2aXNpYmxlRGVsYXkoaW50IG1zKSB7Ci0JCWlmIChtcyA8IDIwKSByZXR1cm4gbXMgKyAzMDsKLQkJaWYgKG1zIDwgMzApIHJldHVybiBtcyArIDEwOwotCQlyZXR1cm4gbXM7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBieXRlIHZhbHVlIGFzIGEgaGV4IHN0cmluZywKLQkgKiBwcmVzZXJ2aW5nIGxlYWRpbmcgMCdzLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgdG9IZXhCeXRlU3RyaW5nKGludCBpKSB7Ci0JCWlmIChpIDw9IDB4MGYpCi0JCQlyZXR1cm4gIjAiICsgSW50ZWdlci50b0hleFN0cmluZyhpKTsKLQkJcmV0dXJuIEludGVnZXIudG9IZXhTdHJpbmcoaSAmIDB4ZmYpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgNC1ieXRlIHZhbHVlIGFzIGEgaGV4IHN0cmluZywKLQkgKiBwcmVzZXJ2aW5nIGxlYWRpbmcgMCdzLgotCSAqIChhIGJpdCAnYnJ1dGUgZm9yY2UnLi4uIHNob3VsZCBwcm9iYWJseSB1c2UgYSBsb29wLi4uKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgdG9IZXg0Qnl0ZVN0cmluZyhpbnQgaSkgewotCQlTdHJpbmcgaGV4ID0gSW50ZWdlci50b0hleFN0cmluZyhpKTsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSAxKQotCQkJcmV0dXJuICIwMDAwMDAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSAyKQotCQkJcmV0dXJuICIwMDAwMDAiICsgaGV4OwotCQlpZiAoaGV4Lmxlbmd0aCgpID09IDMpCi0JCQlyZXR1cm4gIjAwMDAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSA0KQotCQkJcmV0dXJuICIwMDAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSA1KQotCQkJcmV0dXJuICIwMDAiICsgaGV4OwotCQlpZiAoaGV4Lmxlbmd0aCgpID09IDYpCi0JCQlyZXR1cm4gIjAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSA3KQotCQkJcmV0dXJuICIwIiArIGhleDsKLQkJcmV0dXJuIGhleDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBTdHJpbmcgZGVzY3JpYmluZyB0aGUgc3BlY2lmaWVkCi0JICogdHJhbnNwYXJlbnQgb3IgYmFja2dyb3VuZCBwaXhlbC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIHBpeGVsSW5mbyhpbnQgcGl4ZWwpIHsKLQkJaWYgKHBpeGVsID09IC0xKSB7Ci0JCQlyZXR1cm4gcGl4ZWwgKyAiICgiICsgYnVuZGxlLmdldFN0cmluZygiTm9uZV9sYyIpICsgIikiOwotCQl9Ci0JCXJldHVybiBwaXhlbCArICIgKDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcocGl4ZWwpICsgIikiOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVjaWZpZWQgZGlzcG9zYWwgbWV0aG9kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZGlzcG9zYWxTdHJpbmcoaW50IGRpc3Bvc2FsTWV0aG9kKSB7Ci0JCXN3aXRjaCAoZGlzcG9zYWxNZXRob2QpIHsKLQkJCWNhc2UgU1dULkRNX0ZJTExfTk9ORTogcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoIk5vbmVfbGMiKTsKLQkJCWNhc2UgU1dULkRNX0ZJTExfQkFDS0dST1VORDogcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmRfbGMiKTsKLQkJCWNhc2UgU1dULkRNX0ZJTExfUFJFVklPVVM6IHJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJQcmV2aW91c19sYyIpOwotCQl9Ci0JCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJVbnNwZWNpZmllZF9sYyIpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVjaWZpZWQgaW1hZ2UgZmlsZSB0eXBlLgotCSAqLwotCVN0cmluZyBmaWxlVHlwZVN0cmluZyhpbnQgZmlsZXR5cGUpIHsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9CTVApCi0JCQlyZXR1cm4gIkJNUCI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfQk1QX1JMRSkKLQkJCXJldHVybiAiUkxFIiArIGltYWdlRGF0YS5kZXB0aCArICIgQk1QIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9PUzJfQk1QKQotCQkJcmV0dXJuICJPUy8yIEJNUCI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfR0lGKQotCQkJcmV0dXJuICJHSUYiOwotCQlpZiAoZmlsZXR5cGUgPT0gU1dULklNQUdFX0lDTykKLQkJCXJldHVybiAiSUNPIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9KUEVHKQotCQkJcmV0dXJuICJKUEVHIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9QTkcpCi0JCQlyZXR1cm4gIlBORyI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfVElGRikKLQkJCXJldHVybiAiVElGRiI7Ci0JCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJVbmtub3duX2FjIik7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZmlsZSdzIGltYWdlIHR5cGUsIGJhc2VkIG9uIGl0cyBleHRlbnNpb24uCi0JICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgdmVyeSByb2J1c3Qgd2F5IHRvIGRldGVybWluZSBpbWFnZSB0eXBlLAotCSAqIGFuZCBpdCBpcyBvbmx5IHRvIGJlIHVzZWQgaW4gdGhlIGFic2VuY2Ugb2YgYW55IGJldHRlciBtZXRob2QuCi0JICovCi0JaW50IGRldGVybWluZUZpbGVUeXBlKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmcgZXh0ID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJibXAiKSkgewotCQkJcmV0dXJuIHNob3dCTVBEaWFsb2coKTsKLQkJfQotCQlpZiAoZXh0LmVxdWFsc0lnbm9yZUNhc2UoImdpZiIpKQotCQkJcmV0dXJuIFNXVC5JTUFHRV9HSUY7Ci0JCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgiaWNvIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX0lDTzsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqcGciKSB8fCBleHQuZXF1YWxzSWdub3JlQ2FzZSgianBlZyIpIHx8IGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqZmlmIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX0pQRUc7Ci0JCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgicG5nIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX1BORzsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJ0aWYiKSB8fCBleHQuZXF1YWxzSWdub3JlQ2FzZSgidGlmZiIpKQotCQkJcmV0dXJuIFNXVC5JTUFHRV9USUZGOwotCQlyZXR1cm4gU1dULklNQUdFX1VOREVGSU5FRDsKLQl9Ci0JCi0Jc3RhdGljIFN0cmluZyBjcmVhdGVNc2coU3RyaW5nIG1zZywgT2JqZWN0W10gYXJncykgewotCQlNZXNzYWdlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBNZXNzYWdlRm9ybWF0KG1zZyk7Ci0JCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGFyZ3MpOwotCX0KLQkKLQlzdGF0aWMgU3RyaW5nIGNyZWF0ZU1zZyhTdHJpbmcgbXNnLCBPYmplY3QgYXJnKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgZm9ybWF0dGVyID0gbmV3IE1lc3NhZ2VGb3JtYXQobXNnKTsKLQkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQobmV3IE9iamVjdFtde2FyZ30pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YUxpbmVTdHlsZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YUxpbmVTdHlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQ4ZTg1MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9qYXZhdmlld2VyL0phdmFMaW5lU3R5bGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLWNsYXNzIEphdmFMaW5lU3R5bGVyIGltcGxlbWVudHMgTGluZVN0eWxlTGlzdGVuZXIgewotCUphdmFTY2FubmVyIHNjYW5uZXIgPSBuZXcgSmF2YVNjYW5uZXIoKTsKLQlpbnRbXSB0b2tlbkNvbG9yczsKLQlDb2xvcltdIGNvbG9yczsKLQlWZWN0b3IgYmxvY2tDb21tZW50cyA9IG5ldyBWZWN0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRj0gLTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9MPSAxMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdPUkQ9CQkwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdISVRFPQkJMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVk9CQkJMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UPQkJMzsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HPQkJNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVEhFUj0JCTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSPQkJNzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fVE9LRU49IDg7Ci0KLXB1YmxpYyBKYXZhTGluZVN0eWxlcigpIHsKLQlpbml0aWFsaXplQ29sb3JzKCk7Ci0Jc2Nhbm5lciA9IG5ldyBKYXZhU2Nhbm5lcigpOwotfQotCi1Db2xvciBnZXRDb2xvcihpbnQgdHlwZSkgewotCWlmICh0eXBlIDwgMCB8fCB0eXBlID49IHRva2VuQ29sb3JzLmxlbmd0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGNvbG9yc1t0b2tlbkNvbG9yc1t0eXBlXV07Ci19Ci0KLWJvb2xlYW4gaW5CbG9ja0NvbW1lbnQoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JZm9yIChpbnQgaT0wOyBpPGJsb2NrQ29tbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJaW50W10gb2Zmc2V0cyA9IChpbnRbXSlibG9ja0NvbW1lbnRzLmVsZW1lbnRBdChpKTsKLQkJLy8gc3RhcnQgb2YgY29tbWVudCBpbiB0aGUgbGluZQotCQlpZiAoKG9mZnNldHNbMF0gPj0gc3RhcnQpICYmIChvZmZzZXRzWzBdIDw9IGVuZCkpIHJldHVybiB0cnVlOwotCQkvLyBlbmQgb2YgY29tbWVudCBpbiB0aGUgbGluZQotCQlpZiAoKG9mZnNldHNbMV0gPj0gc3RhcnQpICYmIChvZmZzZXRzWzFdIDw9IGVuZCkpIHJldHVybiB0cnVlOwotCQlpZiAoKG9mZnNldHNbMF0gPD0gc3RhcnQpICYmIChvZmZzZXRzWzFdID49IGVuZCkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZUNvbG9ycygpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQljb2xvcnM9IG5ldyBDb2xvcltdIHsKLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMCwgMCwgMCkpLAkJLy8gYmxhY2sKLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMjU1LCAwLCAwKSksCS8vIHJlZAotCQluZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigwLCAyNTUsIDApKSwJLy8gZ3JlZW4KLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMCwgICAwLCAyNTUpKQkvLyBibHVlCi0JfTsKLQl0b2tlbkNvbG9ycz0gbmV3IGludFtNQVhJTVVNX1RPS0VOXTsKLQl0b2tlbkNvbG9yc1tXT1JEXT0JCTA7Ci0JdG9rZW5Db2xvcnNbV0hJVEVdPQkJMDsKLQl0b2tlbkNvbG9yc1tLRVldPQkJMzsgCi0JdG9rZW5Db2xvcnNbQ09NTUVOVF09CTE7IAotCXRva2VuQ29sb3JzW1NUUklOR109IAkyOyAKLQl0b2tlbkNvbG9yc1tPVEhFUl09CQkwOwotCXRva2VuQ29sb3JzW05VTUJFUl09CTA7Ci19Ci0KLXZvaWQgZGlzcG9zZUNvbG9ycygpIHsKLQlmb3IgKGludCBpPTA7aTxjb2xvcnMubGVuZ3RoO2krKykgewotCQljb2xvcnNbaV0uZGlzcG9zZSgpOwotCX0KLX0KLQotLyoqCi0gKiBFdmVudC5kZXRhaWwJCQlsaW5lIHN0YXJ0IG9mZnNldCAoaW5wdXQpCQotICogRXZlbnQudGV4dCAJCQlsaW5lIHRleHQgKGlucHV0KQotICogTGluZVN0eWxlRXZlbnQuc3R5bGVzIAlFbnVtZXJhdGlvbiBvZiBTdHlsZVJhbmdlcywgbmVlZCB0byBiZSBpbiBvcmRlci4gKG91dHB1dCkKLSAqIExpbmVTdHlsZUV2ZW50LmJhY2tncm91bmQgCWxpbmUgYmFja2dyb3VuZCBjb2xvciAob3V0cHV0KQotICovCi1wdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQlWZWN0b3Igc3R5bGVzID0gbmV3IFZlY3RvcigpOwotCWludCB0b2tlbjsKLQlTdHlsZVJhbmdlIGxhc3RTdHlsZTsKLQkvLyBJZiB0aGUgbGluZSBpcyBwYXJ0IG9mIGEgYmxvY2sgY29tbWVudCwgY3JlYXRlIG9uZSBzdHlsZSBmb3IgdGhlIGVudGlyZSBsaW5lLgotCWlmIChpbkJsb2NrQ29tbWVudChldmVudC5saW5lT2Zmc2V0LCBldmVudC5saW5lT2Zmc2V0ICsgZXZlbnQubGluZVRleHQubGVuZ3RoKCkpKSB7Ci0JCXN0eWxlcy5hZGRFbGVtZW50KG5ldyBTdHlsZVJhbmdlKGV2ZW50LmxpbmVPZmZzZXQsIGV2ZW50LmxpbmVUZXh0Lmxlbmd0aCgpLCBnZXRDb2xvcihDT01NRU5UKSwgbnVsbCkpOwotCQlldmVudC5zdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtzdHlsZXMuc2l6ZSgpXTsKLQkJc3R5bGVzLmNvcHlJbnRvKGV2ZW50LnN0eWxlcyk7Ci0JCXJldHVybjsKLQl9Ci0JQ29sb3IgZGVmYXVsdEZnQ29sb3IgPSAoKENvbnRyb2wpZXZlbnQud2lkZ2V0KS5nZXRGb3JlZ3JvdW5kKCk7Ci0Jc2Nhbm5lci5zZXRSYW5nZShldmVudC5saW5lVGV4dCk7Ci0JdG9rZW4gPSBzY2FubmVyLm5leHRUb2tlbigpOwotCXdoaWxlICh0b2tlbiAhPSBFT0YpIHsKLQkJaWYgKHRva2VuID09IE9USEVSKSB7Ci0JCQkvLyBkbyBub3RoaW5nIGZvciBub24tY29sb3JlZCB0b2tlbnMKLQkJfSBlbHNlIGlmICh0b2tlbiAhPSBXSElURSkgewotCQkJQ29sb3IgY29sb3IgPSBnZXRDb2xvcih0b2tlbik7Ci0JCQkvLyBPbmx5IGNyZWF0ZSBhIHN0eWxlIGlmIHRoZSB0b2tlbiBjb2xvciBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgCi0JCQkvLyB3aWRnZXQncyBkZWZhdWx0IGZvcmVncm91bmQgY29sb3IgYW5kIHRoZSB0b2tlbidzIHN0eWxlIGlzIG5vdCAKLQkJCS8vIGJvbGQuICBLZXl3b3JkcyBhcmUgYm9sZGVkLgotCQkJaWYgKCghY29sb3IuZXF1YWxzKGRlZmF1bHRGZ0NvbG9yKSkgfHwgKHRva2VuID09IEtFWSkpIHsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2Uoc2Nhbm5lci5nZXRTdGFydE9mZnNldCgpICsgZXZlbnQubGluZU9mZnNldCwgc2Nhbm5lci5nZXRMZW5ndGgoKSwgY29sb3IsIG51bGwpOwotCQkJCWlmICh0b2tlbiA9PSBLRVkpIHsKLQkJCQkJc3R5bGUuZm9udFN0eWxlID0gU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChzdHlsZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCXN0eWxlcy5hZGRFbGVtZW50KHN0eWxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBNZXJnZSBzaW1pbGFyIHN0eWxlcy4gIERvaW5nIHNvIHdpbGwgaW1wcm92ZSBwZXJmb3JtYW5jZS4KLQkJCQkJbGFzdFN0eWxlID0gKFN0eWxlUmFuZ2Upc3R5bGVzLmxhc3RFbGVtZW50KCk7Ci0JCQkJCWlmIChsYXN0U3R5bGUuc2ltaWxhclRvKHN0eWxlKSAmJiAobGFzdFN0eWxlLnN0YXJ0ICsgbGFzdFN0eWxlLmxlbmd0aCA9PSBzdHlsZS5zdGFydCkpIHsKLQkJCQkJCWxhc3RTdHlsZS5sZW5ndGggKz0gc3R5bGUubGVuZ3RoOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3R5bGVzLmFkZEVsZW1lbnQoc3R5bGUpOyAKLQkJCQkJfQotCQkJCX0gCi0JCQl9IAotCQl9IGVsc2UgaWYgKCghc3R5bGVzLmlzRW1wdHkoKSkgJiYgKChsYXN0U3R5bGU9KFN0eWxlUmFuZ2Upc3R5bGVzLmxhc3RFbGVtZW50KCkpLmZvbnRTdHlsZSA9PSBTV1QuQk9MRCkpIHsKLQkJCWludCBzdGFydCA9IHNjYW5uZXIuZ2V0U3RhcnRPZmZzZXQoKSArIGV2ZW50LmxpbmVPZmZzZXQ7Ci0JCQlsYXN0U3R5bGUgPSAoU3R5bGVSYW5nZSlzdHlsZXMubGFzdEVsZW1lbnQoKTsKLQkJCS8vIEEgZm9udCBzdHlsZSBvZiBTV1QuQk9MRCBpbXBsaWVzIHRoYXQgdGhlIGxhc3Qgc3R5bGUKLQkJCS8vIHJlcHJlc2VudHMgYSBqYXZhIGtleXdvcmQuCi0JCQlpZiAobGFzdFN0eWxlLnN0YXJ0ICsgbGFzdFN0eWxlLmxlbmd0aCA9PSBzdGFydCkgewotCQkJCS8vIEhhdmUgdGhlIHdoaXRlIHNwYWNlIHRha2Ugb24gdGhlIHN0eWxlIGJlZm9yZSBpdCB0byAKLQkJCQkvLyBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIHN0eWxlIHJhbmdlcyBjcmVhdGVkIGFuZCB0aGUKLQkJCQkvLyBudW1iZXIgb2YgZm9udCBzdHlsZSBjaGFuZ2VzIGR1cmluZyByZW5kZXJpbmcuCi0JCQkJbGFzdFN0eWxlLmxlbmd0aCArPSBzY2FubmVyLmdldExlbmd0aCgpOwotCQkJfQotCQl9IAotCQl0b2tlbj0gc2Nhbm5lci5uZXh0VG9rZW4oKTsKLQl9Ci0JZXZlbnQuc3R5bGVzID0gbmV3IFN0eWxlUmFuZ2Vbc3R5bGVzLnNpemUoKV07Ci0Jc3R5bGVzLmNvcHlJbnRvKGV2ZW50LnN0eWxlcyk7Ci19Ci1wdWJsaWMgdm9pZCBwYXJzZUJsb2NrQ29tbWVudHMoU3RyaW5nIHRleHQpIHsKLQlibG9ja0NvbW1lbnRzID0gbmV3IFZlY3RvcigpOwotCVN0cmluZ1JlYWRlciBidWZmZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHRleHQpOwotCWludCBjaDsKLQlib29sZWFuIGJsa0NvbW1lbnQgPSBmYWxzZTsKLQlpbnQgY250ID0gMDsKLQlpbnRbXSBvZmZzZXRzID0gbmV3IGludFsyXTsKLQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkKLQl0cnkgewotCXdoaWxlICghZG9uZSkgewotCQlzd2l0Y2ggKGNoID0gYnVmZmVyLnJlYWQoKSkgewotCQkJY2FzZSAtMSA6IHsKLQkJCQlpZiAoYmxrQ29tbWVudCkgewotCQkJCQlvZmZzZXRzWzFdID0gY250OwotCQkJCQlibG9ja0NvbW1lbnRzLmFkZEVsZW1lbnQob2Zmc2V0cyk7Ci0JCQkJfQotCQkJCWRvbmUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSAnLycgOiB7Ci0JCQkJY2ggPSBidWZmZXIucmVhZCgpOwotCQkJCWlmICgoY2ggPT0gJyonKSAmJiAoIWJsa0NvbW1lbnQpKSB7Ci0JCQkJCW9mZnNldHMgPSBuZXcgaW50WzJdOwotCQkJCQlvZmZzZXRzWzBdID0gY250OwotCQkJCQlibGtDb21tZW50ID0gdHJ1ZTsKLQkJCQkJY250Kys7CQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNudCsrOwotCQkJCX0JCQkJCQkKLQkJCQljbnQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgJyonIDogewotCQkJCWlmIChibGtDb21tZW50KSB7Ci0JCQkJCWNoID0gYnVmZmVyLnJlYWQoKTsKLQkJCQkJY250Kys7Ci0JCQkJCWlmIChjaCA9PSAnLycpIHsKLQkJCQkJCWJsa0NvbW1lbnQgPSBmYWxzZTsJCi0JCQkJCQlvZmZzZXRzWzFdID0gY250OwotCQkJCQkJYmxvY2tDb21tZW50cy5hZGRFbGVtZW50KG9mZnNldHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNudCsrOwkKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJY250Kys7CQkJCQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQkJCi0JfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIGlnbm9yZSBlcnJvcnMKLQl9Ci19Ci0KLS8qKgotICogQSBzaW1wbGUgZnV6enkgc2Nhbm5lciBmb3IgSmF2YQotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNjYW5uZXIgewotCi0JcHJvdGVjdGVkIEhhc2h0YWJsZSBmZ0tleXM9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBmQnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBmRG9jOwotCXByb3RlY3RlZCBpbnQgZlBvczsKLQlwcm90ZWN0ZWQgaW50IGZFbmQ7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnRUb2tlbjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmRW9mU2Vlbj0gZmFsc2U7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGZnS2V5d29yZHM9IHsgCi0JCSJhYnN0cmFjdCIsCi0JCSJib29sZWFuIiwgImJyZWFrIiwgImJ5dGUiLAotCQkiY2FzZSIsICJjYXRjaCIsICJjaGFyIiwgImNsYXNzIiwgImNvbnRpbnVlIiwKLQkJImRlZmF1bHQiLCAiZG8iLCAiZG91YmxlIiwKLQkJImVsc2UiLCAiZXh0ZW5kcyIsCi0JCSJmYWxzZSIsICJmaW5hbCIsICJmaW5hbGx5IiwgImZsb2F0IiwgImZvciIsCi0JCSJpZiIsICJpbXBsZW1lbnRzIiwgImltcG9ydCIsICJpbnN0YW5jZW9mIiwgImludCIsICJpbnRlcmZhY2UiLAotCQkibG9uZyIsCi0JCSJuYXRpdmUiLCAibmV3IiwgIm51bGwiLAotCQkicGFja2FnZSIsICJwcml2YXRlIiwgInByb3RlY3RlZCIsICJwdWJsaWMiLAotCQkicmV0dXJuIiwKLQkJInNob3J0IiwgInN0YXRpYyIsICJzdXBlciIsICJzd2l0Y2giLCAic3luY2hyb25pemVkIiwKLQkJInRoaXMiLCAidGhyb3ciLCAidGhyb3dzIiwgInRyYW5zaWVudCIsICJ0cnVlIiwgInRyeSIsCi0JCSJ2b2lkIiwgInZvbGF0aWxlIiwKLQkJIndoaWxlIgotCX07Ci0KLQlwdWJsaWMgSmF2YVNjYW5uZXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmRpbmcgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlBvcyAtIGZTdGFydFRva2VuOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGxvb2t1cCB0YWJsZS4KLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZnS2V5cz0gbmV3IEhhc2h0YWJsZSgpOwotCQlJbnRlZ2VyIGs9IG5ldyBJbnRlZ2VyKEtFWSk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmZ0tleXdvcmRzLmxlbmd0aDsgaSsrKQotCQkJZmdLZXlzLnB1dChmZ0tleXdvcmRzW2ldLCBrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCB0b2tlbiBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGZTdGFydFRva2VuOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgbGV4aWNhbCB0b2tlbiBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBuZXh0VG9rZW4oKSB7Ci0JCWludCBjOwotCQlmU3RhcnRUb2tlbj0gZlBvczsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCXN3aXRjaCAoYz0gcmVhZCgpKSB7CQkJCi0JCQljYXNlIEVPRjoKLQkJCQlyZXR1cm4gRU9GOwkJCQkKLQkJCWNhc2UgJy8nOgkvLyBjb21tZW50Ci0JCQkJYz0gcmVhZCgpOwotCQkJCWlmIChjID09ICcvJykgewotCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQkJaWYgKChjID09IEVPRikgfHwgKGMgPT0gRU9MKSkgewotCQkJCQkJCXVucmVhZChjKTsKLQkJCQkJCQlyZXR1cm4gQ09NTUVOVDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQl1bnJlYWQoYyk7Ci0JCQkJcmV0dXJuIE9USEVSOwotCQkJY2FzZSAnXCcnOgkvLyBjaGFyIGNvbnN0Ci0JCQkJd2hpbGUodHJ1ZSkgewotCQkJCQljPSByZWFkKCk7Ci0JCQkJCXN3aXRjaCAoYykgewotCQkJCQkJY2FzZSAnXCcnOgotCQkJCQkJCXJldHVybiBTVFJJTkc7Ci0JCQkJCQljYXNlIEVPRjoKLQkJCQkJCQl1bnJlYWQoYyk7Ci0JCQkJCQkJcmV0dXJuIFNUUklORzsKLQkJCQkJCWNhc2UgJ1xcJzoKLQkJCQkJCQljPSByZWFkKCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJfQotCi0JCQljYXNlICciJzoJLy8gc3RyaW5nCi0JCQkJd2hpbGUodHJ1ZSkgewotCQkJCQljPSByZWFkKCk7Ci0JCQkJCXN3aXRjaCAoYykgewotCQkJCQkJY2FzZSAnIic6Ci0JCQkJCQkJcmV0dXJuIFNUUklORzsKLQkJCQkJCWNhc2UgRU9GOgotCQkJCQkJCXVucmVhZChjKTsKLQkJCQkJCQlyZXR1cm4gU1RSSU5HOwotCQkJCQkJY2FzZSAnXFwnOgotCQkJCQkJCWM9IHJlYWQoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQl9Ci0KLQkJCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQkJCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkJCQlkbyB7Ci0JCQkJCWM9IHJlYWQoKTsKLQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKWMpKTsKLQkJCQl1bnJlYWQoYyk7Ci0JCQkJcmV0dXJuIE5VTUJFUjsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpYykpIHsKLQkJCQkJZG8gewotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpYykpOwotCQkJCQl1bnJlYWQoYyk7Ci0JCQkJCXJldHVybiBXSElURTsKLQkJCQl9Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoKGNoYXIpYykpIHsKLQkJCQkJZkJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JCQkJCWRvIHsKLQkJCQkJCWZCdWZmZXIuYXBwZW5kKChjaGFyKWMpOwotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydCgoY2hhciljKSk7Ci0JCQkJCXVucmVhZChjKTsKLQkJCQkJSW50ZWdlciBpPSAoSW50ZWdlcikgZmdLZXlzLmdldChmQnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoaSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGkuaW50VmFsdWUoKTsKLQkJCQkJCXJldHVybiBXT1JEOwotCQkJCX0KLQkJCQlyZXR1cm4gT1RIRVI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG5leHQgY2hhcmFjdGVyLgotCSAqLwotCXByb3RlY3RlZCBpbnQgcmVhZCgpIHsKLQkJaWYgKGZQb3MgPD0gZkVuZCkgewotCQkJcmV0dXJuIGZEb2MuY2hhckF0KGZQb3MrKyk7Ci0JCX0KLQkJcmV0dXJuIEVPRjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSYW5nZShTdHJpbmcgdGV4dCkgewotCQlmRG9jPSB0ZXh0OwotCQlmUG9zPSAwOwotCQlmRW5kPSBmRG9jLmxlbmd0aCgpIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVucmVhZChpbnQgYykgewotCQlpZiAoYyAhPSBFT0YpCi0JICAgIAlmUG9zLS07Ci0JfQotfQotCi0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YVZpZXdlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvamF2YXZpZXdlci9KYXZhVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzMWY1N2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvamF2YXZpZXdlci9KYXZhVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVmlld2VyIHsgIAotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgdGV4dDsKLQlKYXZhTGluZVN0eWxlciBsaW5lU3R5bGVyID0gbmV3IEphdmFMaW5lU3R5bGVyKCk7Ci0JRmlsZURpYWxvZyBmaWxlRGlhbG9nOwotCXN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZXMgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2phdmF2aWV3ZXIiKTsKLQotTWVudSBjcmVhdGVGaWxlTWVudSgpIHsKLQlNZW51IGJhciA9IHNoZWxsLmdldE1lbnVCYXIgKCk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKGJhcik7Ci0JTWVudUl0ZW0gaXRlbTsKLQotCS8vIE9wZW4gCi0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiT3Blbl9tZW51aXRlbSIpKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ08nKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJb3BlbkZpbGUoKTsKLQkJfQotCX0pOwotCi0JLy8gRXhpdAotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIkV4aXRfbWVudWl0ZW0iKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbWVudUZpbGVFeGl0ICgpOwotCQl9Ci0JfSk7Ci0JcmV0dXJuIG1lbnU7Ci19Ci0KLXZvaWQgY3JlYXRlTWVudUJhciAoKSB7Ci0JTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0KLQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZmlsZUl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRmlsZV9tZW51aXRlbSIpKTsKLQlmaWxlSXRlbS5zZXRNZW51IChjcmVhdGVGaWxlTWVudSAoKSk7Ci0KLX0KLQotdm9pZCBjcmVhdGVTaGVsbCAoRGlzcGxheSBkaXNwbGF5KSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIldpbmRvd190aXRsZSIpKTsJCi0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyIChuZXcgU2hlbGxBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQgKFNoZWxsRXZlbnQgZSkgewotCQkJbGluZVN0eWxlci5kaXNwb3NlQ29sb3JzKCk7Ci0JCQl0ZXh0LnJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKGxpbmVTdHlsZXIpOwotCQl9Ci0JfSk7Ci19Ci12b2lkIGNyZWF0ZVN0eWxlZFRleHQoKSB7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0Jc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQl0ZXh0LnNldExheW91dERhdGEoc3BlYyk7Ci0JdGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihsaW5lU3R5bGVyKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlDb2xvciBiZyA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKTsKLQl0ZXh0LnNldEJhY2tncm91bmQoYmcpOwotfQotCi12b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgbXNnKSB7Ci0JTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCWJveC5zZXRNZXNzYWdlKG1zZyk7Ci0JYm94Lm9wZW4oKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlKYXZhVmlld2VyIGV4YW1wbGUgPSBuZXcgSmF2YVZpZXdlciAoKTsKLQlTaGVsbCBzaGVsbCA9IGV4YW1wbGUub3BlbiAoZGlzcGxheSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKQotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCWNyZWF0ZVNoZWxsIChkaXNwbGF5KTsKLQljcmVhdGVNZW51QmFyICgpOwotCWNyZWF0ZVN0eWxlZFRleHQgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci0KLXZvaWQgb3BlbkZpbGUoKSB7CQotCWlmIChmaWxlRGlhbG9nID09IG51bGwpIHsKLQkJZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JfQotCi0JZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouamF2YSIsICIqLioifSk7Ci0JU3RyaW5nIG5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQkKLQlvcGVuKG5hbWUpOwotfQotCi12b2lkIG9wZW4oU3RyaW5nIG5hbWUpIHsKLQlmaW5hbCBTdHJpbmcgdGV4dFN0cmluZzsKLQkKLQlpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHJldHVybjsKLQotCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5hbWUpOwotCWlmICghZmlsZS5leGlzdHMoKSkgewotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHJlc291cmNlcy5nZXRTdHJpbmcoIkVycl9maWxlX25vX2V4aXN0IiksIG5ldyBTdHJpbmdbXSB7ZmlsZS5nZXROYW1lKCl9KTsKLQkJZGlzcGxheUVycm9yKG1lc3NhZ2UpOwotCQlyZXR1cm47Ci0JfQotCi0JdHJ5IHsKLQkJRmlsZUlucHV0U3RyZWFtIHN0cmVhbT0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlLmdldFBhdGgoKSk7Ci0JCXRyeSB7Ci0JCQlSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotCQkJY2hhcltdIHJlYWRCdWZmZXI9IG5ldyBjaGFyWzIwNDhdOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigoaW50KSBmaWxlLmxlbmd0aCgpKTsKLQkJCWludCBuOwotCQkJd2hpbGUgKChuID0gaW4ucmVhZChyZWFkQnVmZmVyKSkgPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCX0KLQkJCXRleHRTdHJpbmcgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBFcnJfZmlsZV9pbwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJFcnJfZmlsZV9pbyIpLCBuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0TmFtZSgpfSk7Ci0JCQlkaXNwbGF5RXJyb3IobWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocmVzb3VyY2VzLmdldFN0cmluZygiRXJyX25vdF9mb3VuZCIpLCBuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0TmFtZSgpfSk7Ci0JCWRpc3BsYXlFcnJvcihtZXNzYWdlKTsKLQkJcmV0dXJuOwotCX0KLQkvLyBHdWFyZCBhZ2FpbnN0IHN1cGVyZmx1b3VzIG1vdXNlIG1vdmUgZXZlbnRzIC0tIGRlZmVyIGFjdGlvbiB1bnRpbCBsYXRlcgotCURpc3BsYXkgZGlzcGxheSA9IHRleHQuZ2V0RGlzcGxheSgpOwotCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCQl9Ci0JfSk7CQotCQotCS8vIHBhcnNlIHRoZSBibG9jayBjb21tZW50cyB1cCBmcm9udCBzaW5jZSBibG9jayBjb21tZW50cyBjYW4gZ28gYWNyb3NzCi0JLy8gbGluZXMgLSBpbmVmZmljaWVudCB3YXkgb2YgZG9pbmcgdGhpcwotCWxpbmVTdHlsZXIucGFyc2VCbG9ja0NvbW1lbnRzKHRleHRTdHJpbmcpOwotfQotCi12b2lkIG1lbnVGaWxlRXhpdCAoKSB7Ci0Jc2hlbGwuY2xvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0ZpbGxMYXlvdXRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRmlsbExheW91dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmNjNGYzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRmlsbExheW91dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgRmlsbExheW91dFRhYiBleHRlbmRzIFRhYiB7Ci0JLyogQ29udHJvbHMgZm9yIHNldHRpbmcgbGF5b3V0IHBhcmFtZXRlcnMgKi8KLQlCdXR0b24gaG9yaXpvbnRhbCwgdmVydGljYWw7Ci0JU3Bpbm5lciBtYXJnaW5XaWR0aCwgbWFyZ2luSGVpZ2h0LCBzcGFjaW5nOwotCS8qIFRoZSBleGFtcGxlIGxheW91dCBpbnN0YW5jZSAqLwotCUZpbGxMYXlvdXQgZmlsbExheW91dDsKLQkvKiBUYWJsZUVkaXRvcnMgYW5kIHJlbGF0ZWQgY29udHJvbHMqLwotCVRhYmxlRWRpdG9yIGNvbWJvRWRpdG9yLCBuYW1lRWRpdG9yOwotCUNDb21ibyBjb21ibzsKLQlUZXh0IG5hbWVUZXh0OwotCWZpbmFsIGludCBOQU1FX0NPTCA9IDA7Ci0JZmluYWwgaW50IFRPVEFMX0NPTFMgPSAyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCUZpbGxMYXlvdXRUYWIoTGF5b3V0RXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgaW4gdGhlICJjaGlsZCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZFdpZGdldHMgKCkgewotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQkJCi0JCS8qIEFkZCBUYWJsZUVkaXRvcnMgKi8KLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJbmFtZUVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl0YWJsZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCWluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQkJaWYgKGluZGV4ID09IC0xKSByZXR1cm47Ci0JCQkJVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotCQkJCW5ld0l0ZW0gPSB0YWJsZS5nZXRJdGVtIChpbmRleCk7Ci0JCQkJaWYgKG5ld0l0ZW0gPT0gb2xkSXRlbSB8fCBuZXdJdGVtICE9IGxhc3RTZWxlY3RlZCkgewotCQkJCQlsYXN0U2VsZWN0ZWQgPSBuZXdJdGVtOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRhYmxlLnNob3dTZWxlY3Rpb24gKCk7Ci0JCQkJCi0JCQkJY29tYm8gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULlJFQURfT05MWSk7Ci0JCQkJY3JlYXRlQ29tYm9FZGl0b3IgKGNvbWJvLCBjb21ib0VkaXRvcik7Ci0JCQkJCi0JCQkJbmFtZVRleHQgPSBuZXcgVGV4dCh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJbmFtZVRleHQuc2V0VGV4dCgoKFN0cmluZ1tdKWRhdGEuZWxlbWVudEF0KGluZGV4KSlbTkFNRV9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yKG5hbWVUZXh0LCBuYW1lRWRpdG9yLCBOQU1FX0NPTCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCS8qIENvbnRyb2xzIHRoZSB0eXBlIG9mIEZpbGxMYXlvdXQgKi8KLQkJR3JvdXAgdHlwZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJdHlwZUdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUeXBlIikpOwotCQl0eXBlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXR5cGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQkJaG9yaXpvbnRhbCA9IG5ldyBCdXR0b24gKHR5cGVHcm91cCwgU1dULlJBRElPKTsKLQkJaG9yaXpvbnRhbC5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJaG9yaXpvbnRhbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWhvcml6b250YWwuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlob3Jpem9udGFsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXZlcnRpY2FsID0gbmV3IEJ1dHRvbiAodHlwZUdyb3VwLCBTV1QuUkFESU8pOwotCQl2ZXJ0aWNhbC5zZXRUZXh0ICgiU1dULlZFUlRJQ0FMIik7Ci0JCXZlcnRpY2FsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJdmVydGljYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsgCi0JCQotCQkvKiBDb250cm9scyB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyBvZiB0aGUgRmlsbExheW91dCAqLwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWFyZ2luc19TcGFjaW5nIikpOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luV2lkdGgiKTsKLQkJbWFyZ2luV2lkdGggPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpbldpZHRoLnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luV2lkdGguYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJtYXJnaW5IZWlnaHQiKTsKLQkJbWFyZ2luSGVpZ2h0ID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5IZWlnaHQuc2V0U2VsZWN0aW9uKDApOwotCQltYXJnaW5IZWlnaHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCW1hcmdpbkhlaWdodC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJzcGFjaW5nIik7Ci0JCXNwYWNpbmcgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCXNwYWNpbmcuc2V0U2VsZWN0aW9uKDApOwotCQlzcGFjaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCi0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwotCXZvaWQgY3JlYXRlTGF5b3V0ICgpIHsKLQkJZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0ICgpOwotCQlsYXlvdXRDb21wb3NpdGUuc2V0TGF5b3V0IChmaWxsTGF5b3V0KTsKLQl9Ci0JCi0JLyoqIAotCSAqIERpc3Bvc2VzIHRoZSBlZGl0b3JzIHdpdGhvdXQgcGxhY2luZyB0aGVpciBjb250ZW50cwotCSAqIGludG8gdGhlIHRhYmxlLgotCSAqLwotCXZvaWQgZGlzcG9zZUVkaXRvcnMgKCkgewotCQljb21ib0VkaXRvci5zZXRFZGl0b3IgKG51bGwsIG51bGwsIC0xKTsKLQkJY29tYm8uZGlzcG9zZSAoKTsKLQkJbmFtZVRleHQuZGlzcG9zZSgpOwotCX0KLQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0JU3RyaW5nQnVmZmVyIGdlbmVyYXRlTGF5b3V0Q29kZSAoKSB7Ci0JCVN0cmluZ0J1ZmZlciBjb2RlID0gbmV3IFN0cmluZ0J1ZmZlciAoKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0RmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQgKCk7XG4iKTsKLQkJaWYgKGZpbGxMYXlvdXQudHlwZSA9PSBTV1QuVkVSVElDQUwpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGZpbGxMYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDtcbiIpOwotCQl9Ci0JCWlmIChmaWxsTGF5b3V0Lm1hcmdpbldpZHRoICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kKCJcdFx0ZmlsbExheW91dC5tYXJnaW5XaWR0aCA9ICIgKyBmaWxsTGF5b3V0Lm1hcmdpbldpZHRoICsgIjtcbiIpOwotCQl9Ci0JCWlmIChmaWxsTGF5b3V0Lm1hcmdpbkhlaWdodCAhPSAwKSB7Ci0JCQljb2RlLmFwcGVuZCgiXHRcdGZpbGxMYXlvdXQubWFyZ2luSGVpZ2h0ID0gIiArIGZpbGxMYXlvdXQubWFyZ2luSGVpZ2h0ICsgIjtcbiIpOwotCQl9Ci0JCWlmIChmaWxsTGF5b3V0LnNwYWNpbmcgIT0gMCkgewotCQkJY29kZS5hcHBlbmQoIlx0XHRmaWxsTGF5b3V0LnNwYWNpbmcgPSAiICsgZmlsbExheW91dC5zcGFjaW5nICsgIjtcbiIpOwotCQl9Ci0JCWNvZGUuYXBwZW5kKCJcdFx0c2hlbGwuc2V0TGF5b3V0IChmaWxsTGF5b3V0KTtcbiIpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuW2ldOwotCQkJY29kZS5hcHBlbmQoZ2V0Q2hpbGRDb2RlKGNvbnRyb2wsIGkpKTsKLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHRvIGluc2VydCB3aGVuIGEgbmV3IGNoaWxkIGNvbnRyb2wgaXMgYWRkZWQgdG8gdGhlIHRhYmxlLgotCSAqLwotCVN0cmluZ1tdIGdldEluc2VydFN0cmluZyAoU3RyaW5nIG5hbWUsIFN0cmluZyBjb250cm9sVHlwZSkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7bmFtZSwgY29udHJvbFR5cGV9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyAiQ29udHJvbCBOYW1lIiwgIkNvbnRyb2wgVHlwZSIgfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiRmlsbExheW91dCI7Ci0JfQotCQotCS8qKgotCSAqIFRha2VzIGluZm9ybWF0aW9uIGZyb20gVGFibGVFZGl0b3JzIGFuZCBzdG9yZXMgaXQuCi0JICovCi0Jdm9pZCByZXNldEVkaXRvcnMgKGJvb2xlYW4gdGFiKSB7Ci0JCVRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChudWxsLCBudWxsLCAtMSk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCXRyeSB7CQkJCQotCQkJCW5ldyBTdHJpbmcgKG5hbWVUZXh0LmdldFRleHQgKCkpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQluYW1lVGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKE5BTUVfQ09MKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgW10gaW5zZXJ0ID0gbmV3IFN0cmluZyBbXSB7bmFtZVRleHQuZ2V0VGV4dCAoKSwgY29tYm8uZ2V0VGV4dCAoKX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgVE9UQUxfQ09MUzsgaSsrKSB7Ci0JCQkJb2xkSXRlbS5zZXRUZXh0IChpLCAoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAocm93KSkgW2ldKTsKLQkJCX0KLQkJCWlmICghdGFiKSBkaXNwb3NlRWRpdG9ycyAoKTsKLQkJfQotCQlzZXRMYXlvdXRTdGF0ZSAoKTsKLQkJcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLmxheW91dCAodHJ1ZSk7Ci0JCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXRTdGF0ZSAoKSB7Ci0JCWlmICh2ZXJ0aWNhbC5nZXRTZWxlY3Rpb24oKSkgewotCQkJZmlsbExheW91dC50eXBlID0gU1dULlZFUlRJQ0FMOwotCQl9IGVsc2UgewotCQkJZmlsbExheW91dC50eXBlID0gU1dULkhPUklaT05UQUw7Ci0JCX0KLQkJCi0JCS8qIFNldCB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyAqLwotCQlmaWxsTGF5b3V0Lm1hcmdpbldpZHRoID0gbWFyZ2luV2lkdGguZ2V0U2VsZWN0aW9uKCk7CQkKLQkJZmlsbExheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQuZ2V0U2VsZWN0aW9uKCk7CQkKLQkJZmlsbExheW91dC5zcGFjaW5nID0gc3BhY2luZy5nZXRTZWxlY3Rpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0Zvcm1MYXlvdXRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRm9ybUxheW91dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWEwY2JjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRm9ybUxheW91dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotY2xhc3MgRm9ybUxheW91dFRhYiBleHRlbmRzIFRhYiB7Ci0JLyogQ29udHJvbHMgZm9yIHNldHRpbmcgbGF5b3V0IHBhcmFtZXRlcnMgKi8KLQlTcGlubmVyIG1hcmdpbldpZHRoLCBtYXJnaW5IZWlnaHQsIG1hcmdpbkxlZnQsIG1hcmdpblJpZ2h0LCBtYXJnaW5Ub3AsIG1hcmdpbkJvdHRvbSwgc3BhY2luZzsKLQkvKiBUaGUgZXhhbXBsZSBsYXlvdXQgaW5zdGFuY2UgKi8KLQlGb3JtTGF5b3V0IGZvcm1MYXlvdXQ7Ci0JLyogVGFibGVFZGl0b3JzIGFuZCByZWxhdGVkIGNvbnRyb2xzKi8KLQlUYWJsZUVkaXRvciBuYW1lRWRpdG9yLCBjb21ib0VkaXRvciwgd2lkdGhFZGl0b3IsIGhlaWdodEVkaXRvcjsKLQlUYWJsZUVkaXRvciBsZWZ0RWRpdG9yLCByaWdodEVkaXRvciwgdG9wRWRpdG9yLCBib3R0b21FZGl0b3I7Ci0JQ0NvbWJvIGNvbWJvOwotCVRleHQgbmFtZVRleHQsIHdpZHRoVGV4dCwgaGVpZ2h0VGV4dDsKLQlCdXR0b24gbGVmdEF0dGFjaCwgcmlnaHRBdHRhY2gsIHRvcEF0dGFjaCwgYm90dG9tQXR0YWNoOwotCQotCS8qIENvbnN0YW50cyAqLwotCWZpbmFsIGludCBOQU1FX0NPTCA9IDA7Ci0JZmluYWwgaW50IENPTUJPX0NPTCA9IDE7Ci0JZmluYWwgaW50IFdJRFRIX0NPTCA9IDI7Ci0JZmluYWwgaW50IEhFSUdIVF9DT0wgPSAzOwotCWZpbmFsIGludCBMRUZUX0NPTCA9IDQ7Ci0JZmluYWwgaW50IFJJR0hUX0NPTCA9IDU7Ci0JZmluYWwgaW50IFRPUF9DT0wgPSA2OwotCWZpbmFsIGludCBCT1RUT01fQ09MID0gNzsKLQkKLQlmaW5hbCBpbnQgTU9ESUZZX0NPTFMgPSA0OwkvLyBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgd2l0aCBjb21ibyBvciB0ZXh0IGVkaXRvcnMKLQlmaW5hbCBpbnQgVE9UQUxfQ09MUyA9IDg7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgTGF5b3V0RXhhbXBsZS4KLQkgKi8KLQlGb3JtTGF5b3V0VGFiKExheW91dEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25zdGFudCBmb3IgdGhlIGFsaWdubWVudCBmb3IgYW4KLQkgKiBhdHRhY2htZW50IGdpdmVuIGEgc3RyaW5nLgotCSAqLwotCWludCBhbGlnbm1lbnRDb25zdGFudCAoU3RyaW5nIGFsaWduKSB7Ci0JCWlmIChhbGlnbi5lcXVhbHMoIkxFRlQiKSkgcmV0dXJuIFNXVC5MRUZUOwotCQlpZiAoYWxpZ24uZXF1YWxzKCJSSUdIVCIpKSByZXR1cm4gU1dULlJJR0hUOwotCQlpZiAoYWxpZ24uZXF1YWxzKCJUT1AiKSkgcmV0dXJuIFNXVC5UT1A7Ci0JCWlmIChhbGlnbi5lcXVhbHMoIkJPVFRPTSIpKSByZXR1cm4gU1dULkJPVFRPTTsKLQkJaWYgKGFsaWduLmVxdWFscygiQ0VOVEVSIikpIHJldHVybiBTV1QuQ0VOVEVSOwotCQlyZXR1cm4gU1dULkRFRkFVTFQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhbGlnbm1lbnQgZm9yIGFuCi0JICogYXR0YWNobWVudCBnaXZlbiBhIGNvbnN0YW50LgotCSAqLwotCVN0cmluZyBhbGlnbm1lbnRTdHJpbmcgKGludCBhbGlnbikgewotCQlzd2l0Y2ggKGFsaWduKSB7Ci0JCQljYXNlIFNXVC5MRUZUOiByZXR1cm4gIkxFRlQiOwotCQkJY2FzZSBTV1QuUklHSFQ6IHJldHVybiAiUklHSFQiOwotCQkJY2FzZSBTV1QuVE9QOiByZXR1cm4gIlRPUCI7Ci0JCQljYXNlIFNXVC5CT1RUT006IHJldHVybiAiQk9UVE9NIjsKLQkJCWNhc2UgU1dULkNFTlRFUjogcmV0dXJuICJDRU5URVIiOwotCQl9Ci0JCXJldHVybiAiREVGQVVMVCI7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgYXR0YWNobWVudCBmaWVsZCBpbiBjYXNlIHRoZSB0eXBlIG9mIGNvbnRyb2wKLQkgKiBoYXMgY2hhbmdlZC4gCi0JICovCi0JU3RyaW5nIGNoZWNrQXR0YWNobWVudCAoU3RyaW5nIG9sZEF0dGFjaCwgRm9ybUF0dGFjaG1lbnQgbmV3QXR0YWNoKSB7Ci0JCVN0cmluZyBjb250cm9sQ2xhc3MgPSBuZXdBdHRhY2guY29udHJvbC5nZXRDbGFzcygpLnRvU3RyaW5nICgpOwotCQlTdHJpbmcgY29udHJvbFR5cGUgPSBjb250cm9sQ2xhc3Muc3Vic3RyaW5nIChjb250cm9sQ2xhc3MubGFzdEluZGV4T2YgKCcuJykgKyAxKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG9sZEF0dGFjaC5sZW5ndGggKCkgJiYgIUNoYXJhY3Rlci5pc0RpZ2l0KG9sZEF0dGFjaC5jaGFyQXQgKGkpKSkgewotCQkJaSsrOwotCQl9Ci0JCVN0cmluZyBpbmRleCA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKGksIG9sZEF0dGFjaC5pbmRleE9mICgnLCcpKTsKLQkJcmV0dXJuIGNvbnRyb2xUeXBlICsgaW5kZXggKyAiLCIgKyBuZXdBdHRhY2gub2Zmc2V0ICsgIjoiICsgYWxpZ25tZW50U3RyaW5nIChuZXdBdHRhY2guYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyBpbiB0aGUgImNoaWxkIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkV2lkZ2V0cyAoKSB7Ci0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ2hpbGRXaWRnZXRzICgpOwotCQkKLQkJLyogUmVzaXplIHRoZSBjb2x1bW5zICovCi0JCXRhYmxlLmdldENvbHVtbiAoTEVGVF9DT0wpLnNldFdpZHRoICg5MCk7Ci0JCXRhYmxlLmdldENvbHVtbiAoUklHSFRfQ09MKS5zZXRXaWR0aCAoOTApOwotCQl0YWJsZS5nZXRDb2x1bW4gKFRPUF9DT0wpLnNldFdpZHRoICg5MCk7Ci0JCXRhYmxlLmdldENvbHVtbiAoQk9UVE9NX0NPTCkuc2V0V2lkdGggKDkwKTsKLQkJCQkKLQkJLyogQWRkIFRhYmxlRWRpdG9ycyAqLwotCQluYW1lRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWNvbWJvRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXdpZHRoRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWhlaWdodEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlsZWZ0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXJpZ2h0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXRvcEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlib3R0b21FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdGFibGUuYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJcmVzZXRFZGl0b3JzKCk7Ci0JCQkJaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZS54LCBlLnkpOwotICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSB0YWJsZS5nZXRJdGVtIChwdCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW0gPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3SXRlbSA9PSBvbGRJdGVtIHx8IG5ld0l0ZW0gIT0gbGFzdFNlbGVjdGVkKSB7Ci0JCQkJCWxhc3RTZWxlY3RlZCA9IG5ld0l0ZW07Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdGFibGUuc2hvd1NlbGVjdGlvbiAoKTsKLQkJCQkKLQkJCQljb21ibyA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuUkVBRF9PTkxZKTsKLQkJCQljcmVhdGVDb21ib0VkaXRvciAoY29tYm8sIGNvbWJvRWRpdG9yKTsKLQkJCQkKLQkJCQluYW1lVGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJbmFtZVRleHQuc2V0VGV4dCAoKChTdHJpbmdbXSlkYXRhLmVsZW1lbnRBdChpbmRleCkpW05BTUVfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvcihuYW1lVGV4dCwgbmFtZUVkaXRvciwgTkFNRV9DT0wpOwotCQkJCQotCQkJCXdpZHRoVGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtXSURUSF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yICh3aWR0aFRleHQsIHdpZHRoRWRpdG9yLCBXSURUSF9DT0wpOwotCQkJCQotCQkJCWhlaWdodFRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCWhlaWdodFRleHQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW0hFSUdIVF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yIChoZWlnaHRUZXh0LCBoZWlnaHRFZGl0b3IsIEhFSUdIVF9DT0wpOwotCQkJCQotCQkJCWxlZnRBdHRhY2ggPSBuZXcgQnV0dG9uICh0YWJsZSwgU1dULlBVU0gpOwotCQkJCWxlZnRBdHRhY2guc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkF0dGFjaF9FZGl0IikpOwotCQkJCWxlZnRFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWxlZnRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWxlZnRFZGl0b3IubWluaW11bVdpZHRoID0gbGVmdEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCWxlZnRFZGl0b3Iuc2V0RWRpdG9yIChsZWZ0QXR0YWNoLCBuZXdJdGVtLCBMRUZUX0NPTCk7Ci0JCQkJbGVmdEF0dGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJU2hlbGwgc2hlbGwgPSB0YWJGb2xkZXJQYWdlLmdldFNoZWxsICgpOwotCQkJCQkJQXR0YWNoRGlhbG9nIGRpYWxvZyA9IG5ldyBBdHRhY2hEaWFsb2cgKHNoZWxsKTsKLQkJCQkJCWRpYWxvZy5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiTGVmdF9BdHRhY2htZW50IikpOwotCQkJCQkJZGlhbG9nLnNldENvbHVtbiAoTEVGVF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChMRUZUX0NPTCwgYXR0YWNoKTsKLQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJCXJpZ2h0QXR0YWNoID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5QVVNIKTsKLQkJCQlyaWdodEF0dGFjaC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQXR0YWNoX0VkaXQiKSk7Ci0JCQkJcmlnaHRFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCXJpZ2h0RWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQlyaWdodEVkaXRvci5taW5pbXVtV2lkdGggPSByaWdodEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCXJpZ2h0RWRpdG9yLnNldEVkaXRvciAocmlnaHRBdHRhY2gsIG5ld0l0ZW0sIFJJR0hUX0NPTCk7Ci0JCQkJcmlnaHRBdHRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyUGFnZS5nZXRTaGVsbCAoKTsKLQkJCQkJCUF0dGFjaERpYWxvZyBkaWFsb2cgPSBuZXcgQXR0YWNoRGlhbG9nIChzaGVsbCk7Ci0JCQkJCQlkaWFsb2cuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlJpZ2h0X0F0dGFjaG1lbnQiKSk7Ci0JCQkJCQlkaWFsb2cuc2V0Q29sdW1uIChSSUdIVF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChSSUdIVF9DT0wsIGF0dGFjaCk7Ci0JCQkJCQlpZiAobmV3SXRlbS5nZXRUZXh0IChMRUZUX0NPTCkuZW5kc1dpdGggKCIpIikpIG5ld0l0ZW0uc2V0VGV4dCAoTEVGVF9DT0wsICIiKTsKLQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJCXRvcEF0dGFjaCA9IG5ldyBCdXR0b24gKHRhYmxlLCBTV1QuUFVTSCk7Ci0JCQkJdG9wQXR0YWNoLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJBdHRhY2hfRWRpdCIpKTsKLQkJCQl0b3BFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCXRvcEVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJdG9wRWRpdG9yLm1pbmltdW1XaWR0aCA9IHRvcEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCXRvcEVkaXRvci5zZXRFZGl0b3IgKHRvcEF0dGFjaCwgbmV3SXRlbSwgVE9QX0NPTCk7Ci0JCQkJdG9wQXR0YWNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlTaGVsbCBzaGVsbCA9IHRhYkZvbGRlclBhZ2UuZ2V0U2hlbGwgKCk7Ci0JCQkJCQlBdHRhY2hEaWFsb2cgZGlhbG9nID0gbmV3IEF0dGFjaERpYWxvZyAoc2hlbGwpOwotCQkJCQkJZGlhbG9nLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUb3BfQXR0YWNobWVudCIpKTsKLQkJCQkJCWRpYWxvZy5zZXRDb2x1bW4gKFRPUF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChUT1BfQ09MLCBhdHRhY2gpOwotCQkJCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYm90dG9tQXR0YWNoID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5QVVNIKTsKLQkJCQlib3R0b21BdHRhY2guc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkF0dGFjaF9FZGl0IikpOwotCQkJCWJvdHRvbUVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJYm90dG9tRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQlib3R0b21FZGl0b3IubWluaW11bVdpZHRoID0gYm90dG9tQXR0YWNoLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCQkJYm90dG9tRWRpdG9yLnNldEVkaXRvciAoYm90dG9tQXR0YWNoLCBuZXdJdGVtLCBCT1RUT01fQ09MKTsKLQkJCQlib3R0b21BdHRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyUGFnZS5nZXRTaGVsbCAoKTsKLQkJCQkJCUF0dGFjaERpYWxvZyBkaWFsb2cgPSBuZXcgQXR0YWNoRGlhbG9nIChzaGVsbCk7Ci0JCQkJCQlkaWFsb2cuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJvdHRvbV9BdHRhY2htZW50IikpOwotCQkJCQkJZGlhbG9nLnNldENvbHVtbiAoQk9UVE9NX0NPTCk7Ci0JCQkJCQlTdHJpbmcgYXR0YWNoID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQgKEJPVFRPTV9DT0wsIGF0dGFjaCk7Ci0JCQkJCQlpZiAobmV3SXRlbS5nZXRUZXh0IChUT1BfQ09MKS5lbmRzV2l0aCAoIikiKSkgbmV3SXRlbS5zZXRUZXh0IChUT1BfQ09MLCAiIik7Ci0JCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGFibGUuZ2V0Q29sdW1uQ291bnQgKCk7IGkrKykgewotICAgICAgICAgICAgICAgIAlSZWN0YW5nbGUgcmVjdCA9IG5ld0l0ZW0uZ2V0Qm91bmRzIChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotICAgICAgICAgICAgICAgICAgICAJc3dpdGNoIChpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkJY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAJCQlyZXNldEVkaXRvcnMgKCk7Ci0gICAgICAgICAgICAgICAgICAgIAkJCWJyZWFrOwotCQkJCQkJCWNhc2UgQ09NQk9fQ09MIDoKLQkJCQkJCQkJY29tYm8uc2V0Rm9jdXMgKCk7CQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFdJRFRIX0NPTCA6CQotCQkJCQkJCQl3aWR0aFRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSEVJR0hUX0NPTCA6Ci0JCQkJCQkJCWhlaWdodFRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0JCQl9Ci0JCX0pOwkJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbCB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQkvKiBDb250cm9scyB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyBvZiB0aGUgRm9ybUxheW91dCAqLwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJNYXJnaW5zX1NwYWNpbmciKSk7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCAoMiwgZmFsc2UpKTsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luV2lkdGgiKTsKLQkJbWFyZ2luV2lkdGggPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpbldpZHRoLnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luV2lkdGguYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luSGVpZ2h0Iik7Ci0JCW1hcmdpbkhlaWdodCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luSGVpZ2h0LnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJtYXJnaW5MZWZ0Iik7Ci0JCW1hcmdpbkxlZnQgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpbkxlZnQuc2V0U2VsZWN0aW9uKDApOwotCQltYXJnaW5MZWZ0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luUmlnaHQiKTsKLQkJbWFyZ2luUmlnaHQgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpblJpZ2h0LnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luUmlnaHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJtYXJnaW5Ub3AiKTsKLQkJbWFyZ2luVG9wID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5Ub3Auc2V0U2VsZWN0aW9uKDApOwotCQltYXJnaW5Ub3AuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJtYXJnaW5Cb3R0b20iKTsKLQkJbWFyZ2luQm90dG9tID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5Cb3R0b20uc2V0U2VsZWN0aW9uKDApOwotCQltYXJnaW5Cb3R0b20uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgic3BhY2luZyIpOwotCQlzcGFjaW5nID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQlzcGFjaW5nLnNldFNlbGVjdGlvbigwKTsKLQkJc3BhY2luZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxheW91dCAoKSB7Ci0JCWZvcm1MYXlvdXQgPSBuZXcgRm9ybUxheW91dCAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dCAoZm9ybUxheW91dCk7Ci0JfQotCQotCS8qKiAKLQkgKiBEaXNwb3NlcyB0aGUgZWRpdG9ycyB3aXRob3V0IHBsYWNpbmcgdGhlaXIgY29udGVudHMKLQkgKiBpbnRvIHRoZSB0YWJsZS4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFZGl0b3JzICgpIHsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChudWxsLCBudWxsLCAtMSk7Ci0JCWNvbWJvLmRpc3Bvc2UgKCk7Ci0JCW5hbWVUZXh0LmRpc3Bvc2UgKCk7Ci0JCXdpZHRoVGV4dC5kaXNwb3NlICgpOwotCQloZWlnaHRUZXh0LmRpc3Bvc2UgKCk7Ci0JCWxlZnRBdHRhY2guZGlzcG9zZSAoKTsKLQkJcmlnaHRBdHRhY2guZGlzcG9zZSAoKTsKLQkJdG9wQXR0YWNoLmRpc3Bvc2UgKCk7Ci0JCWJvdHRvbUF0dGFjaC5kaXNwb3NlICgpOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCQotCVN0cmluZ0J1ZmZlciBnZW5lcmF0ZUxheW91dENvZGUgKCkgewotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdEZvcm1MYXlvdXQgZm9ybUxheW91dCA9IG5ldyBGb3JtTGF5b3V0ICgpO1xuIik7Ci0JCWlmIChmb3JtTGF5b3V0Lm1hcmdpbldpZHRoICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGZvcm1MYXlvdXQubWFyZ2luV2lkdGggPSAiICsgZm9ybUxheW91dC5tYXJnaW5XaWR0aCArICI7XG4iKTsKLQkJfQotCQlpZiAoZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Zm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSAiICsgZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgKyAiO1xuIik7Ci0JCX0KLQkJaWYoZm9ybUxheW91dC5tYXJnaW5MZWZ0ICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGZvcm1MYXlvdXQubWFyZ2luTGVmdCA9ICIgKyBmb3JtTGF5b3V0Lm1hcmdpbkxlZnQgKyAiO1xuIik7Ci0JCX0KLQkJaWYoZm9ybUxheW91dC5tYXJnaW5SaWdodCAhPSAwKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRmb3JtTGF5b3V0Lm1hcmdpblJpZ2h0ID0gIiArIGZvcm1MYXlvdXQubWFyZ2luUmlnaHQgKyAiO1xuIik7Ci0JCX0KLQkJaWYoZm9ybUxheW91dC5tYXJnaW5Ub3AgIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Zm9ybUxheW91dC5tYXJnaW5Ub3AgPSAiICsgZm9ybUxheW91dC5tYXJnaW5Ub3AgKyAiO1xuIik7Ci0JCX0KLQkJaWYoZm9ybUxheW91dC5tYXJnaW5Cb3R0b20gIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Zm9ybUxheW91dC5tYXJnaW5Cb3R0b20gPSAiICsgZm9ybUxheW91dC5tYXJnaW5Cb3R0b20gKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGZvcm1MYXlvdXQuc3BhY2luZyAhPSAwKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRmb3JtTGF5b3V0LnNwYWNpbmcgPSAiICsgZm9ybUxheW91dC5zcGFjaW5nICsgIjtcbiIpOwotCQl9Ci0JCWNvZGUuYXBwZW5kICgiXHRcdHNoZWxsLnNldExheW91dCAoZm9ybUxheW91dCk7XG4iKTsKLQkJCi0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbiBbaV07Ci0JCQljb2RlLmFwcGVuZCAoZ2V0Q2hpbGRDb2RlIChjb250cm9sLCBpKSk7Ci0JCQlGb3JtRGF0YSBkYXRhID0gKEZvcm1EYXRhKSBjb250cm9sLmdldExheW91dERhdGEgKCk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0Iik7Ci0JCQkJaWYgKGZpcnN0KSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiRm9ybURhdGEgIik7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBGb3JtRGF0YSAoKTtcbiIpOwkKLQkJCQlpZiAoZGF0YS53aWR0aCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLndpZHRoID0gIiArIGRhdGEud2lkdGggKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLmhlaWdodCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhlaWdodCA9ICIgKyBkYXRhLmhlaWdodCArICI7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEubGVmdCAhPSBudWxsKSB7Ci0JCQkJCWlmIChkYXRhLmxlZnQuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCQkJU3RyaW5nIGNvbnRyb2xTdHJpbmcgPSBpdGVtLmdldFRleHQgKExFRlRfQ09MKTsKLQkJCQkJCWludCBpbmRleCA9IG5ldyBJbnRlZ2VyIChjb250cm9sU3RyaW5nLnN1YnN0cmluZyAoY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpIC0gMSwgY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpKSkuaW50VmFsdWUgKCk7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKCIgKyBuYW1lcyBbaW5kZXhdICsgIiwgIiArIGRhdGEubGVmdC5vZmZzZXQgKyAiLCBTV1QuIiArIGFsaWdubWVudFN0cmluZyAoZGF0YS5sZWZ0LmFsaWdubWVudCkgKyAiKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGRhdGEucmlnaHQgIT0gbnVsbCB8fCAoZGF0YS5sZWZ0Lm51bWVyYXRvciAhPSAwIHx8ZGF0YS5sZWZ0Lm9mZnNldCAhPSAwKSkgewotCQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEubGVmdC5udW1lcmF0b3IgKyAiLCAiICsgZGF0YS5sZWZ0Lm9mZnNldCArICIpO1xuIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRhdGEucmlnaHQgIT0gbnVsbCkgewotCQkJCQlpZiAoZGF0YS5yaWdodC5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJCQlTdHJpbmcgY29udHJvbFN0cmluZyA9IGl0ZW0uZ2V0VGV4dCAoUklHSFRfQ09MKTsKLQkJCQkJCWludCBpbmRleCA9IG5ldyBJbnRlZ2VyIChjb250cm9sU3RyaW5nLnN1YnN0cmluZyAoY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpIC0gMSwgY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpKSkuaW50VmFsdWUgKCk7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgbmFtZXMgW2luZGV4XSArICIsICIgKyBkYXRhLnJpZ2h0Lm9mZnNldCArICIsIFNXVC4iICsgYWxpZ25tZW50U3RyaW5nIChkYXRhLnJpZ2h0LmFsaWdubWVudCkgKyAiKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEucmlnaHQubnVtZXJhdG9yICsgIiwgIiArIGRhdGEucmlnaHQub2Zmc2V0ICsgIik7XG4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZGF0YS50b3AgIT0gbnVsbCkgewotCQkJCQlpZiAoZGF0YS50b3AuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCQkJU3RyaW5nIGNvbnRyb2xTdHJpbmcgPSBpdGVtLmdldFRleHQgKFRPUF9DT0wpOwotCQkJCQkJaW50IGluZGV4ID0gbmV3IEludGVnZXIgKGNvbnRyb2xTdHJpbmcuc3Vic3RyaW5nIChjb250cm9sU3RyaW5nLmluZGV4T2YgKCcsJykgLSAxLCBjb250cm9sU3RyaW5nLmluZGV4T2YgKCcsJykpKS5pbnRWYWx1ZSAoKTsKLQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgbmFtZXMgW2luZGV4XSArICIsICIgKyBkYXRhLnRvcC5vZmZzZXQgKyAiLCBTV1QuIiArIGFsaWdubWVudFN0cmluZyAoZGF0YS50b3AuYWxpZ25tZW50KSArICIpO1xuIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoZGF0YS5ib3R0b20gIT0gbnVsbCB8fCAoZGF0YS50b3AubnVtZXJhdG9yICE9IDAgfHxkYXRhLnRvcC5vZmZzZXQgIT0gMCkpIHsKLQkJCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEudG9wLm51bWVyYXRvciArICIsICIgKyBkYXRhLnRvcC5vZmZzZXQgKyAiKTtcbiIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkYXRhLmJvdHRvbSAhPSBudWxsKSB7Ci0JCQkJCWlmIChkYXRhLmJvdHRvbS5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJCQlTdHJpbmcgY29udHJvbFN0cmluZyA9IGl0ZW0uZ2V0VGV4dCAoQk9UVE9NX0NPTCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBuZXcgSW50ZWdlciAoY29udHJvbFN0cmluZy5zdWJzdHJpbmcgKGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSAtIDEsIGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSkpLmludFZhbHVlICgpOwotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKCIgKyBuYW1lcyBbaW5kZXhdICsgIiwgIiArIGRhdGEuYm90dG9tLm9mZnNldCArICIsIFNXVC4iICsgYWxpZ25tZW50U3RyaW5nIChkYXRhLmJvdHRvbS5hbGlnbm1lbnQpICsgIik7XG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgZGF0YS5ib3R0b20ubnVtZXJhdG9yICsgIiwgIiArIGRhdGEuYm90dG9tLm9mZnNldCArICIpO1xuIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0TGF5b3V0RGF0YSAoZGF0YSk7XG4iKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHRvIGluc2VydCB3aGVuIGEgbmV3IGNoaWxkIGNvbnRyb2wgaXMgYWRkZWQgdG8gdGhlIHRhYmxlLgotCSAqLwotCVN0cmluZ1tdIGdldEluc2VydFN0cmluZyAoU3RyaW5nIG5hbWUsIFN0cmluZyBjb250cm9sVHlwZSkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7bmFtZSwgY29udHJvbFR5cGUsICItMSIsICItMSIsCi0JCQkJIjAsMCAoIiArIExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJEZWZhdWx0IikgKyAiKSIsICIiLCAKLQkJCQkiMCwwICgiICsgTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkRlZmF1bHQiKSArICIpIiwgIiJ9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10gewotCQkJIkNvbnRyb2wgTmFtZSIsCi0JCQkiQ29udHJvbCBUeXBlIiwgCi0JCQkid2lkdGgiLCAKLQkJCSJoZWlnaHQiLCAKLQkJCSJsZWZ0IiwgCi0JCQkicmlnaHQiLCAKLQkJCSJ0b3AiLCAKLQkJCSJib3R0b20iCi0JCX07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkZvcm1MYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCXRyeSB7Ci0JCQkJbmV3IFN0cmluZyAobmFtZVRleHQuZ2V0VGV4dCAoKSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCW5hbWVUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoTkFNRV9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKHdpZHRoVGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoV0lEVEhfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyKGhlaWdodFRleHQuZ2V0VGV4dCgpKS5pbnRWYWx1ZSgpOwotCQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCWhlaWdodFRleHQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0KEhFSUdIVF9DT0wpKTsKLQkJCX0KLQkJCVN0cmluZ1tdIGluc2VydCA9IG5ldyBTdHJpbmcgW10ge25hbWVUZXh0LmdldFRleHQoKSwgY29tYm8uZ2V0VGV4dCAoKSwgd2lkdGhUZXh0LmdldFRleHQgKCksIGhlaWdodFRleHQuZ2V0VGV4dCAoKX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgTU9ESUZZX0NPTFM7IGkrKykgewotCQkJCW9sZEl0ZW0uc2V0VGV4dCAoaSwgKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKHJvdykpIFtpXSk7Ci0JCQl9Ci0JCQlpZiAoIXRhYikgZGlzcG9zZUVkaXRvcnMgKCk7Ci0JCX0KLQkJc2V0TGF5b3V0U3RhdGUgKCk7Ci0JCXJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCk7Ci0JCXNldExheW91dERhdGEgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5sYXlvdXQgKHRydWUpOwotCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluaXRpYWwgd2VpZ2h0IG9mIHRoZSBsYXlvdXQgYW5kIGNvbnRyb2wgZ3JvdXBzIHdpdGhpbiB0aGUgU2FzaEZvcm0uCi0JICogQHJldHVybiB0aGUgZGVzaXJlZCBzYXNoIHdlaWdodHMgZm9yIHRoZSB0YWIgcGFnZQotCSAqLwotCWludFtdIHNhc2hXZWlnaHRzICgpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7NDAsIDYwfTsJCQotCX0KLQotCS8qKgotCSAqIFNldHMgYW4gYXR0YWNobWVudCB0byB0aGUgZWRnZSBvZiBhIHdpZGdldCB1c2luZyB0aGUKLQkgKiBpbmZvcm1hdGlvbiBpbiB0aGUgdGFibGUuCi0JICovCi0JRm9ybUF0dGFjaG1lbnQgc2V0QXR0YWNobWVudCAoU3RyaW5nIGF0dGFjaG1lbnQpIHsKLQkJU3RyaW5nIGNvbnRyb2wsIGFsaWduOwotCQlpbnQgcG9zaXRpb24sIG9mZnNldDsKLQkJaW50IGNvbW1hID0gYXR0YWNobWVudC5pbmRleE9mICgnLCcpOwotCQljaGFyIGZpcnN0ID0gYXR0YWNobWVudC5jaGFyQXQgKDApOwotCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGZpcnN0KSkgewotCQkJLyogQ2FzZSB3aGVyZSB0aGVyZSBpcyBhIGNvbnRyb2wgKi8KLQkJCWNvbnRyb2wgPSBhdHRhY2htZW50LnN1YnN0cmluZyAoMCwgY29tbWEpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBjb250cm9sLmxlbmd0aCAoKSAmJiAhQ2hhcmFjdGVyLmlzRGlnaXQgKGNvbnRyb2wuY2hhckF0IChpKSkpIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlTdHJpbmcgZW5kID0gY29udHJvbC5zdWJzdHJpbmcgKGkpOwotCQkJaW50IGluZGV4ID0gbmV3IEludGVnZXIgKGVuZCkuaW50VmFsdWUgKCk7Ci0JCQlDb250cm9sIGF0dGFjaENvbnRyb2wgPSBjaGlsZHJlbiBbaW5kZXhdOwotCQkJaW50IGNvbG9uID0gYXR0YWNobWVudC5pbmRleE9mICgnOicpOwotCQkJdHJ5IHsKLQkJCQlvZmZzZXQgPSBuZXcgSW50ZWdlciAoYXR0YWNobWVudC5zdWJzdHJpbmcgKGNvbW1hICsgMSwgY29sb24pKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb2Zmc2V0ID0gMDsKLQkJCX0KLQkJCWFsaWduID0gYXR0YWNobWVudC5zdWJzdHJpbmcgKGNvbG9uICsgMSk7Ci0JCQlyZXR1cm4gbmV3IEZvcm1BdHRhY2htZW50IChhdHRhY2hDb250cm9sLCBvZmZzZXQsIGFsaWdubWVudENvbnN0YW50IChhbGlnbikpOwotCQl9IGVsc2UgewotCQkJLyogQ2FzZSB3aGVyZSB0aGVyZSBpcyBhIHBvc2l0aW9uICovCi0JCQl0cnkgewotCQkJCXBvc2l0aW9uID0gbmV3IEludGVnZXIgKGF0dGFjaG1lbnQuc3Vic3RyaW5nICgwLGNvbW1hKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXBvc2l0aW9uID0gMDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJb2Zmc2V0ID0gbmV3IEludGVnZXIgKGF0dGFjaG1lbnQuc3Vic3RyaW5nIChjb21tYSArIDEpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb2Zmc2V0ID0gMDsKLQkJCX0KLQkJCXJldHVybiBuZXcgRm9ybUF0dGFjaG1lbnQgKHBvc2l0aW9uLCBvZmZzZXQpOwkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0RGF0YSAoKSB7Ci0JCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBsYXlvdXRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCQlGb3JtRGF0YSBkYXRhOwotCQlpbnQgd2lkdGgsIGhlaWdodDsKLQkJU3RyaW5nIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJd2lkdGggPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKFdJRFRIX0NPTCkpLmludFZhbHVlICgpOwotCQkJaGVpZ2h0ID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChIRUlHSFRfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQlkYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCQkJaWYgKHdpZHRoID4gMCkgZGF0YS53aWR0aCA9IHdpZHRoOwotCQkJaWYgKGhlaWdodCA+IDApIGRhdGEuaGVpZ2h0ID0gaGVpZ2h0OwotCQkJCi0JCQlsZWZ0ID0gaXRlbXMgW2ldLmdldFRleHQgKExFRlRfQ09MKTsKLQkJCWlmIChsZWZ0Lmxlbmd0aCAoKSA+IDApIHsKLQkJCQlkYXRhLmxlZnQgPSBzZXRBdHRhY2htZW50IChsZWZ0KTsKLQkJCQlpZiAoZGF0YS5sZWZ0LmNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudCA9IGNoZWNrQXR0YWNobWVudCAobGVmdCwgZGF0YS5sZWZ0KTsKLQkJCQkJaXRlbXMgW2ldLnNldFRleHQgKExFRlRfQ09MLCBhdHRhY2htZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyaWdodCA9IGl0ZW1zIFtpXS5nZXRUZXh0IChSSUdIVF9DT0wpOwotCQkJaWYgKHJpZ2h0Lmxlbmd0aCAoKSA+IDApIHsKLQkJCQlkYXRhLnJpZ2h0ID0gc2V0QXR0YWNobWVudCAocmlnaHQpOwotCQkJCWlmIChkYXRhLnJpZ2h0LmNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudCA9IGNoZWNrQXR0YWNobWVudCAocmlnaHQsIGRhdGEucmlnaHQpOwotCQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoUklHSFRfQ09MLCBhdHRhY2htZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQl0b3AgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoVE9QX0NPTCk7Ci0JCQlpZiAodG9wLmxlbmd0aCAoKSA+IDAgKSB7Ci0JCQkJZGF0YS50b3AgPSBzZXRBdHRhY2htZW50ICh0b3ApOwotCQkJCWlmIChkYXRhLnRvcC5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnQgPSBjaGVja0F0dGFjaG1lbnQgKHRvcCwgZGF0YS50b3ApOwotCQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoVE9QX0NPTCwgYXR0YWNobWVudCk7Ci0JCQkJfQotCQkJfQotCQkJYm90dG9tID0gaXRlbXMgW2ldLmdldFRleHQgKEJPVFRPTV9DT0wpOwotCQkJaWYgKGJvdHRvbS5sZW5ndGggKCkgPiAwKSB7Ci0JCQkJZGF0YS5ib3R0b20gPSBzZXRBdHRhY2htZW50IChib3R0b20pOwotCQkJCWlmIChkYXRhLmJvdHRvbS5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnQgPSBjaGVja0F0dGFjaG1lbnQgKGJvdHRvbSwgZGF0YS5ib3R0b20pOwotCQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoQk9UVE9NX0NPTCwgYXR0YWNobWVudCk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGRyZW4gW2ldLnNldExheW91dERhdGEgKGRhdGEpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXRTdGF0ZSAoKSB7Ci0JCS8qIFNldCB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyAqLwotCQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gbWFyZ2luV2lkdGguZ2V0U2VsZWN0aW9uICgpOwkJCi0JCWZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0LmdldFNlbGVjdGlvbiAoKTsJCQotCQlmb3JtTGF5b3V0Lm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0LmdldFNlbGVjdGlvbiAoKTsKLQkJZm9ybUxheW91dC5tYXJnaW5SaWdodCA9IG1hcmdpblJpZ2h0LmdldFNlbGVjdGlvbiAoKTsKLQkJZm9ybUxheW91dC5tYXJnaW5Ub3AgPSBtYXJnaW5Ub3AuZ2V0U2VsZWN0aW9uICgpOwotCQlmb3JtTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IG1hcmdpbkJvdHRvbS5nZXRTZWxlY3Rpb24gKCk7Ci0JCWZvcm1MYXlvdXQuc3BhY2luZyA9IHNwYWNpbmcuZ2V0U2VsZWN0aW9uICgpOwotCX0JCi0JCi0JLyoqCi0JICogPGNvZGU+QXR0YWNoRGlhbG9nPC9jb2RlPiBpcyB0aGUgY2xhc3MgdGhhdCBjcmVhdGVzIGEKLQkgKiBkaWFsb2cgc3BlY2lmaWMgZm9yIHRoaXMgZXhhbXBsZS4gSXQgY3JlYXRlcyBhIGRpYWxvZwotCSAqIHdpdGggY29udHJvbHMgdG8gc2V0IHRoZSB2YWx1ZXMgaW4gYSBGb3JtQXR0YWNobWVudC4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgQXR0YWNoRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOwotCQlTdHJpbmcgY29udHJvbElucHV0LCBwb3NpdGlvbklucHV0LCBhbGlnbm1lbnRJbnB1dCwgb2Zmc2V0SW5wdXQ7Ci0JCWludCBjb2wgPSAwOwotCQkKLQkJcHVibGljIEF0dGFjaERpYWxvZyAoU2hlbGwgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsKLQkJfQotCQkKLQkJcHVibGljIEF0dGFjaERpYWxvZyAoU2hlbGwgcGFyZW50KSB7Ci0JCQl0aGlzIChwYXJlbnQsIDApOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4gKGludCBjb2wpIHsKLQkJCXRoaXMuY29sID0gY29sOwotCQl9Ci0JIAotCQlwdWJsaWMgU3RyaW5nIG9wZW4gKCkgewotCQkJU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50ICgpOwotCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKHBhcmVudCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCXNoZWxsLnNldFRleHQgKGdldFRleHQgKCkpOwotCQkJc2hlbGwuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMywgdHJ1ZSkpOwotCQkJCi0JCQkvKiBGaW5kIG91dCB3aGF0IHdhcyBwcmV2aW91c2x5IHNldCBhcyBhbiBhdHRhY2htZW50ICovCi0JCQlUYWJsZUl0ZW0gbmV3SXRlbSA9IGxlZnRFZGl0b3IuZ2V0SXRlbSAoKTsKLQkJCXJlc3VsdCA9IG5ld0l0ZW0uZ2V0VGV4dCAoY29sKTsKLQkJCVN0cmluZyBvbGRBdHRhY2ggPSByZXN1bHQ7Ci0JCQlTdHJpbmcgb2xkUG9zID0gIjAiLCBvbGRDb250cm9sID0gIiIsIG9sZEFsaWduID0gIkRFRkFVTFQiLCBvbGRPZmZzZXQgPSAiMCI7Ci0JCQlib29sZWFuIGlzQ29udHJvbCA9IGZhbHNlOwotCQkJaWYgKG9sZEF0dGFjaC5sZW5ndGggKCkgIT0gMCkgewotCQkJCWNoYXIgZmlyc3QgPSBvbGRBdHRhY2guY2hhckF0ICgwKTsKLQkJCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGZpcnN0KSkgewotCQkJCQkvKiBXZSBoYXZlIGEgY29udHJvbCAqLwotCQkJCQlpc0NvbnRyb2wgPSB0cnVlOwotCQkJCQlvbGRDb250cm9sID0gb2xkQXR0YWNoLnN1YnN0cmluZyAoMCwgb2xkQXR0YWNoLmluZGV4T2YgKCcsJykpOwotCQkJCQlvbGRBbGlnbiA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKG9sZEF0dGFjaC5pbmRleE9mICgnOicpICsgMSk7Ci0JCQkJCW9sZE9mZnNldCA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKG9sZEF0dGFjaC5pbmRleE9mICgnLCcpICsgMSwgb2xkQXR0YWNoLmluZGV4T2YgKCc6JykpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIFdlIGhhdmUgYSBwb3NpdGlvbiAqLwotCQkJCQlvbGRQb3MgPSBvbGRBdHRhY2guc3Vic3RyaW5nICgwLCBvbGRBdHRhY2guaW5kZXhPZiAoJywnKSk7Ci0JCQkJCW9sZE9mZnNldCA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKG9sZEF0dGFjaC5pbmRleE9mICgnLCcpICsgMSk7Ci0JCQkJCWlmIChvbGRPZmZzZXQuZW5kc1dpdGggKCIpIikpIHsgLy8gaS5lLiAoRGVmYXVsdCkKLQkJCQkJCW9sZE9mZnNldCA9IG9sZE9mZnNldC5zdWJzdHJpbmcgKDAsIG9sZE9mZnNldC5pbmRleE9mICgnICcpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyogQWRkIHBvc2l0aW9uIGZpZWxkICovCi0JCQlmaW5hbCBCdXR0b24gcG9zQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5SQURJTyk7Ci0JCQlwb3NCdXR0b24uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlBvc2l0aW9uIikpOwotCQkJcG9zQnV0dG9uLnNldFNlbGVjdGlvbiAoIWlzQ29udHJvbCk7CQkJCi0JCQlmaW5hbCBDb21ibyBwb3NpdGlvbiA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5OT05FKTsKLQkJCXBvc2l0aW9uLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiMCIsIjI1IiwiMzMiLCI1MCIsIjY3IiwiNzUiLCIxMDAifSk7Ci0JCQlwb3NpdGlvbi5zZXRWaXNpYmxlSXRlbUNvdW50ICg3KTsKLQkJCXBvc2l0aW9uLnNldFRleHQgKG9sZFBvcyk7Ci0JCQlwb3NpdGlvbi5zZXRFbmFibGVkICghaXNDb250cm9sKTsJCQkKLQkJCXBvc2l0aW9uLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0JCQkKLQkJCS8qIEFkZCBjb250cm9sIGZpZWxkICovCi0JCQlmaW5hbCBCdXR0b24gY29udEJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUkFESU8pOwotCQkJY29udEJ1dHRvbi5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ29udHJvbCIpKTsKLQkJCWNvbnRCdXR0b24uc2V0U2VsZWN0aW9uIChpc0NvbnRyb2wpOwotCQkJZmluYWwgQ29tYm8gY29udHJvbCA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5SRUFEX09OTFkpOwotCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMgKCk7Ci0JCQlUYWJsZUl0ZW0gY3VycmVudEl0ZW0gPSBsZWZ0RWRpdG9yLmdldEl0ZW0gKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlLmdldEl0ZW1Db3VudCAoKTsgaSsrKSB7Ci0JCQkJaWYgKGl0ZW1zIFtpXS5nZXRUZXh0ICgwKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKGl0ZW1zIFtpXSAhPSBjdXJyZW50SXRlbSkgewotCQkJCQkJY29udHJvbC5hZGQgKGl0ZW1zIFtpXS5nZXRUZXh0IChDT01CT19DT0wpICsgaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2xkQ29udHJvbC5sZW5ndGggKCkgIT0gMCkgY29udHJvbC5zZXRUZXh0IChvbGRDb250cm9sKTsKLQkJCWVsc2UgY29udHJvbC5zZWxlY3QgKDApOwotCQkJY29udHJvbC5zZXRFbmFibGVkIChpc0NvbnRyb2wpOwotCQkJY29udHJvbC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMiwgMSkpOwotCQkJCi0JCQkvKiBBZGQgYWxpZ25tZW50IGZpZWxkICovCi0JCQluZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSkuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkFsaWdubWVudCIpKTsKLQkJCWZpbmFsIENvbWJvIGFsaWdubWVudCA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5OT05FKTsKLQkJCVN0cmluZ1tdIGFsaWdubWVudFZhbHVlczsKLQkJCWlmIChjb2wgPT0gTEVGVF9DT0wgfHwgY29sID09IFJJR0hUX0NPTCkgewotCQkJCWFsaWdubWVudFZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyJTV1QuTEVGVCIsICJTV1QuUklHSFQiLCAiU1dULkNFTlRFUiIsICJTV1QuREVGQVVMVCJ9OwotCQkJfSBlbHNlIHsKLQkJCQkvLyBjb2wgPT0gVE9QX0NPTCB8fCBjb2wgPT0gQk9UVE9NX0NPTAotCQkJCWFsaWdubWVudFZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyJTV1QuVE9QIiwgIlNXVC5CT1RUT00iLCAiU1dULkNFTlRFUiIsICJTV1QuREVGQVVMVCJ9OwotCQkJfQotCQkJYWxpZ25tZW50LnNldEl0ZW1zIChhbGlnbm1lbnRWYWx1ZXMpOwotCQkJYWxpZ25tZW50LnNldFRleHQgKCJTV1QuIiArIG9sZEFsaWduKTsKLQkJCWFsaWdubWVudC5zZXRFbmFibGVkIChpc0NvbnRyb2wpOwotCQkJYWxpZ25tZW50LnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0JCQkKLQkJCS8qIEFkZCBvZmZzZXQgZmllbGQgKi8KLQkJCW5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiT2Zmc2V0IikpOwotCQkJZmluYWwgVGV4dCBvZmZzZXQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCW9mZnNldC5zZXRUZXh0IChvbGRPZmZzZXQpOwotCQkJb2Zmc2V0LnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0JCQkKLQkJCS8qIEFkZCBsaXN0ZW5lcnMgZm9yIGNob29zaW5nIGJldHdlZW4gcG9zaXRpb24gYW5kIGNvbnRyb2wgKi8KLQkJCXBvc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXBvc2l0aW9uLnNldEVuYWJsZWQgKHRydWUpOwotCQkJCQljb250cm9sLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJCQkJYWxpZ25tZW50LnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWNvbnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlwb3NpdGlvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCQkJCWNvbnRyb2wuc2V0RW5hYmxlZCAodHJ1ZSk7Ci0JCQkJCWFsaWdubWVudC5zZXRFbmFibGVkICh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJQnV0dG9uIGNsZWFyID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQkJCWNsZWFyLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDbGVhciIpKTsKLQkJCWNsZWFyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkVORCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQljbGVhci5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXJlc3VsdCA9ICIiOwotCQkJCQlzaGVsbC5jbG9zZSAoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCS8qIE9LIGJ1dHRvbiBzZXRzIGRhdGEgaW50byB0YWJsZSAqLwotCQkJQnV0dG9uIG9rID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJPSyIpKTsKLQkJCW9rLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlvay5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWNvbnRyb2xJbnB1dCA9IGNvbnRyb2wuZ2V0VGV4dCAoKTsKLQkJCQkJYWxpZ25tZW50SW5wdXQgPSBhbGlnbm1lbnQuZ2V0VGV4dCAoKS5zdWJzdHJpbmcgKDQpOwotCQkJCQlwb3NpdGlvbklucHV0ID0gcG9zaXRpb24uZ2V0VGV4dCAoKTsKLQkJCQkJaWYgKHBvc2l0aW9uSW5wdXQubGVuZ3RoICgpID09IDApIHBvc2l0aW9uSW5wdXQgPSAiMCI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXcgSW50ZWdlciAocG9zaXRpb25JbnB1dCkuaW50VmFsdWUgKCk7Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHQpIHsKLQkJCQkJCXBvc2l0aW9uSW5wdXQgPSAiMCI7Ci0JCQkJCX0KLQkJCQkJb2Zmc2V0SW5wdXQgPSBvZmZzZXQuZ2V0VGV4dCAoKTsKLQkJCQkJaWYgKG9mZnNldElucHV0Lmxlbmd0aCAoKSA9PSAwKSBvZmZzZXRJbnB1dCA9ICIwIjsKLQkJCQkJdHJ5IHsKLQkJCQkJCW5ldyBJbnRlZ2VyIChvZmZzZXRJbnB1dCkuaW50VmFsdWUgKCk7Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHQpIHsKLQkJCQkJCW9mZnNldElucHV0ID0gIjAiOwotCQkJCQl9Ci0JCQkJCWlmIChwb3NCdXR0b24uZ2V0U2VsZWN0aW9uKCkgfHwgY29udHJvbElucHV0Lmxlbmd0aCAoKSA9PSAwKSB7Ci0JCQkJCQlyZXN1bHQgPSBwb3NpdGlvbklucHV0ICsgIiwiICsgb2Zmc2V0SW5wdXQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXN1bHQgPSBjb250cm9sSW5wdXQgKyAiLCIgKyBvZmZzZXRJbnB1dCArICI6IiArIGFsaWdubWVudElucHV0OwotCQkJCQl9Ci0JCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCQkJQnV0dG9uIGNhbmNlbCA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCQljYW5jZWwuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNhbmNlbCIpKTsKLQkJCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uIChvayk7Ci0JCQlzaGVsbC5wYWNrICgpOwotCQkJLyogQ2VudGVyIHRoZSBkaWFsb2cgKi8KLQkJCVBvaW50IGNlbnRlciA9IHBhcmVudC5nZXRMb2NhdGlvbiAoKTsKLQkJCWNlbnRlci54ID0gY2VudGVyLnggKyAocGFyZW50LmdldEJvdW5kcyAoKS53aWR0aCAvIDIpIC0gKHNoZWxsLmdldEJvdW5kcyAoKS53aWR0aCAvIDIpOwotCQkJY2VudGVyLnkgPSBjZW50ZXIueSArIChwYXJlbnQuZ2V0Qm91bmRzICgpLmhlaWdodCAvIDIpIC0gKHNoZWxsLmdldEJvdW5kcyAoKS5oZWlnaHQgLyAyKTsKLQkJCXNoZWxsLnNldExvY2F0aW9uIChjZW50ZXIpOwotCQkJc2hlbGwub3BlbiAoKTsKLQkJCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJCWlmIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvR3JpZExheW91dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9HcmlkTGF5b3V0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NGZlZjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9HcmlkTGF5b3V0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1jbGFzcyBHcmlkTGF5b3V0VGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBDb250cm9scyBmb3Igc2V0dGluZyBsYXlvdXQgcGFyYW1ldGVycyAqLwotCVNwaW5uZXIgbnVtQ29sdW1uczsKLQlCdXR0b24gbWFrZUNvbHVtbnNFcXVhbFdpZHRoOwotCVNwaW5uZXIgbWFyZ2luV2lkdGgsIG1hcmdpbkhlaWdodCwgbWFyZ2luTGVmdCwgbWFyZ2luUmlnaHQsIG1hcmdpblRvcCwgbWFyZ2luQm90dG9tLCBob3Jpem9udGFsU3BhY2luZywgdmVydGljYWxTcGFjaW5nOwotCS8qIFRoZSBleGFtcGxlIGxheW91dCBpbnN0YW5jZSAqLwotCUdyaWRMYXlvdXQgZ3JpZExheW91dDsKLQkvKiBUYWJsZUVkaXRvcnMgYW5kIHJlbGF0ZWQgY29udHJvbHMqLwotCVRhYmxlRWRpdG9yIG5hbWVFZGl0b3IsIGNvbWJvRWRpdG9yLCB3aWR0aEVkaXRvciwgaGVpZ2h0RWRpdG9yOwotCVRhYmxlRWRpdG9yIHZBbGlnbkVkaXRvciwgaEFsaWduRWRpdG9yLCBoR3JhYkVkaXRvciwgdkdyYWJFZGl0b3IsIGhTcGFuRWRpdG9yLCB2U3BhbkVkaXRvcjsKLQlUYWJsZUVkaXRvciBoSW5kZW50RWRpdG9yLCB2SW5kZW50RWRpdG9yLCBtaW5XaWR0aEVkaXRvciwgbWluSGVpZ2h0RWRpdG9yLCBleGNsdWRlRWRpdG9yOwotCUNDb21ibyBjb21ibywgdkFsaWduLCBoQWxpZ24sIGhHcmFiLCB2R3JhYiwgZXhjbHVkZTsKLQlUZXh0IG5hbWVUZXh0LCB3aWR0aFRleHQsIGhlaWdodFRleHQsIGhTcGFuLCB2U3BhbiwgaEluZGVudCwgdkluZGVudCwgbWluV2lkdGhUZXh0LCBtaW5IZWlnaHRUZXh0OwotCS8qIENvbnN0YW50cyAqLwotCXN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0wgPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgQ09NQk9fQ09MID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IFdJRFRIX0NPTCA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBIRUlHSFRfQ09MID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IEhBTElHTl9DT0wgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgVkFMSUdOX0NPTCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBIR1JBQl9DT0wgPSA2OwotCXN0YXRpYyBmaW5hbCBpbnQgVkdSQUJfQ09MID0gNzsKLQlzdGF0aWMgZmluYWwgaW50IEhTUEFOX0NPTCA9IDg7Ci0Jc3RhdGljIGZpbmFsIGludCBWU1BBTl9DT0wgPSA5OwotCXN0YXRpYyBmaW5hbCBpbnQgSElOREVOVF9DT0wgPSAxMDsKLQlzdGF0aWMgZmluYWwgaW50IFZJTkRFTlRfQ09MID0gMTE7Ci0Jc3RhdGljIGZpbmFsIGludCBNSU5XSURUSF9DT0wgPSAxMjsKLQlzdGF0aWMgZmluYWwgaW50IE1JTkhFSUdIVF9DT0wgPSAxMzsKLQlzdGF0aWMgZmluYWwgaW50IEVYQ0xVREVfQ09MID0gMTQ7Ci0JCi0Jc3RhdGljIGZpbmFsIGludCBUT1RBTF9DT0xTID0gMTU7Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCUdyaWRMYXlvdXRUYWIoTGF5b3V0RXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgaW4gdGhlICJjaGlsZCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZFdpZGdldHMgKCkgewotCQkvKiBDcmVhdGUgdGhlIFRyYXZlcnNlTGlzdGVuZXIgKi8KLQkJZmluYWwgVHJhdmVyc2VMaXN0ZW5lciB0cmF2ZXJzZUxpc3RlbmVyID0gbmV3IFRyYXZlcnNlTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkIChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTiB8fCBlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQpCi0JCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRSkKLQkJCQkJZGlzcG9zZUVkaXRvcnMgKCk7Ci0JCQl9Ci0JCX07Ci0JCQotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQkJCQotCQkvKiBBZGQgaG92ZXJzIHRvIHRoZSBjb2x1bW4gaGVhZGVycyB3aG9zZSBmaWVsZCBuYW1lcyBoYXZlIGJlZW4gc2hvcnRlbmVkIHRvIHNhdmUgc3BhY2UgKi8KLQkJdGFibGUuZ2V0Q29sdW1uIChIQUxJR05fQ09MKS5zZXRUb29sVGlwVGV4dCAoImhvcml6b250YWxBbGlnbm1lbnQiKTsKLQkJdGFibGUuZ2V0Q29sdW1uIChWQUxJR05fQ09MKS5zZXRUb29sVGlwVGV4dCAoInZlcnRpY2FsQWxpZ25tZW50Iik7Ci0JCXRhYmxlLmdldENvbHVtbiAoSEdSQUJfQ09MKS5zZXRUb29sVGlwVGV4dCAoImdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UiKTsKLQkJdGFibGUuZ2V0Q29sdW1uIChWR1JBQl9DT0wpLnNldFRvb2xUaXBUZXh0ICgiZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UiKTsKLQkJdGFibGUuZ2V0Q29sdW1uIChIU1BBTl9DT0wpLnNldFRvb2xUaXBUZXh0ICgiaG9yaXpvbnRhbFNwYW4iKTsKLQkJdGFibGUuZ2V0Q29sdW1uIChWU1BBTl9DT0wpLnNldFRvb2xUaXBUZXh0ICgidmVydGljYWxTcGFuIik7Ci0JCXRhYmxlLmdldENvbHVtbiAoSElOREVOVF9DT0wpLnNldFRvb2xUaXBUZXh0ICgiaG9yaXpvbnRhbEluZGVudCIpOwotCQl0YWJsZS5nZXRDb2x1bW4gKFZJTkRFTlRfQ09MKS5zZXRUb29sVGlwVGV4dCAoInZlcnRpY2FsSW5kZW50Iik7Ci0JCXRhYmxlLmdldENvbHVtbiAoTUlOV0lEVEhfQ09MKS5zZXRUb29sVGlwVGV4dCAoIm1pbmltdW1XaWR0aCIpOwotCQl0YWJsZS5nZXRDb2x1bW4gKE1JTkhFSUdIVF9DT0wpLnNldFRvb2xUaXBUZXh0ICgibWluaW11bUhlaWdodCIpOwotCQkKLQkJLyogQWRkIFRhYmxlRWRpdG9ycyAqLwkJCi0JCW5hbWVFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJd2lkdGhFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaGVpZ2h0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXZBbGlnbkVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloQWxpZ25FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaEdyYWJFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdkdyYWJFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaFNwYW5FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdlNwYW5FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaEluZGVudEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl2SW5kZW50RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCW1pbldpZHRoRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCW1pbkhlaWdodEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlleGNsdWRlRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXRhYmxlLmFkZE1vdXNlTGlzdGVuZXIgKG5ldyBNb3VzZUFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycygpOwotCQkJCWluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGUueCwgZS55KTsKLSAgICAgICAgICAgICAgICBuZXdJdGVtID0gdGFibGUuZ2V0SXRlbSAocHQpOwotICAgICAgICAgICAgICAgIGlmIChuZXdJdGVtID09IG51bGwpIHJldHVybjsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW0gPT0gb2xkSXRlbSB8fCBuZXdJdGVtICE9IGxhc3RTZWxlY3RlZCkgewotCQkJCQlsYXN0U2VsZWN0ZWQgPSBuZXdJdGVtOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRhYmxlLnNob3dTZWxlY3Rpb24gKCk7Ci0JCQkJCi0JCQkJbmFtZVRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCW5hbWVUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtOQU1FX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKG5hbWVUZXh0LCBuYW1lRWRpdG9yLCBOQU1FX0NPTCk7Ci0JCQkJCi0JCQkJY29tYm8gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULlJFQURfT05MWSk7Ci0JCQkJY3JlYXRlQ29tYm9FZGl0b3IgKGNvbWJvLCBjb21ib0VkaXRvcik7Ci0JCQkJCi0JCQkJd2lkdGhUZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQl3aWR0aFRleHQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW1dJRFRIX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKHdpZHRoVGV4dCwgd2lkdGhFZGl0b3IsIFdJRFRIX0NPTCk7Ci0JCQkJCi0JCQkJaGVpZ2h0VGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbSEVJR0hUX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKGhlaWdodFRleHQsIGhlaWdodEVkaXRvciwgSEVJR0hUX0NPTCk7Ci0JCQkJCi0JCQkJU3RyaW5nIFtdIGFsaWduVmFsdWVzID0gbmV3IFN0cmluZyBbXSB7IkJFR0lOTklORyIsIkNFTlRFUiIsIkVORCIsIkZJTEwifTsKLQkJCQloQWxpZ24gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWhBbGlnbi5zZXRJdGVtcyAoYWxpZ25WYWx1ZXMpOwotCQkJCWhBbGlnbi5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKEhBTElHTl9DT0wpKTsKLQkJCQloQWxpZ25FZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWhBbGlnbkVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJaEFsaWduRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQkJCWhBbGlnbkVkaXRvci5zZXRFZGl0b3IgKGhBbGlnbiwgbmV3SXRlbSwgSEFMSUdOX0NPTCk7Ci0JCQkJaEFsaWduLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQkJCQotCQkJCXZBbGlnbiA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJdkFsaWduLnNldEl0ZW1zIChhbGlnblZhbHVlcyk7Ci0JCQkJdkFsaWduLnNldFRleHQgKG5ld0l0ZW0uZ2V0VGV4dCAoVkFMSUdOX0NPTCkpOwotCQkJCXZBbGlnbkVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJdkFsaWduRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQl2QWxpZ25FZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJdkFsaWduRWRpdG9yLnNldEVkaXRvciAodkFsaWduLCBuZXdJdGVtLCBWQUxJR05fQ09MKTsKLQkJCQl2QWxpZ24uYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJU3RyaW5nIFtdIGJvb2xWYWx1ZXMgPSBuZXcgU3RyaW5nIFtdIHsiZmFsc2UiLCAidHJ1ZSJ9OwotCQkJCWhHcmFiID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5OT05FKTsKLQkJCQloR3JhYi5zZXRJdGVtcyAoYm9vbFZhbHVlcyk7Ci0JCQkJaEdyYWIuc2V0VGV4dCAobmV3SXRlbS5nZXRUZXh0IChIR1JBQl9DT0wpKTsKLQkJCQloR3JhYkVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJaEdyYWJFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWhHcmFiRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQkJCWhHcmFiRWRpdG9yLnNldEVkaXRvciAoaEdyYWIsIG5ld0l0ZW0sIEhHUkFCX0NPTCk7Ci0JCQkJaEdyYWIuYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJdkdyYWIgPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCXZHcmFiLnNldEl0ZW1zIChib29sVmFsdWVzKTsKLQkJCQl2R3JhYi5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKFZHUkFCX0NPTCkpOwotCQkJCXZHcmFiRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCQl2R3JhYkVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJdkdyYWJFZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJdkdyYWJFZGl0b3Iuc2V0RWRpdG9yICh2R3JhYiwgbmV3SXRlbSwgVkdSQUJfQ09MKTsKLQkJCQl2R3JhYi5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAKLQkJCQloU3BhbiA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJaFNwYW4uc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW0hTUEFOX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKGhTcGFuLCBoU3BhbkVkaXRvciwgSFNQQU5fQ09MKTsKLQkJCQkKLQkJCQl2U3BhbiA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJdlNwYW4uc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW1ZTUEFOX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKHZTcGFuLCB2U3BhbkVkaXRvciwgVlNQQU5fQ09MKTsKLQkJCQkKLQkJCQloSW5kZW50ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQloSW5kZW50LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtISU5ERU5UX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKGhJbmRlbnQsIGhJbmRlbnRFZGl0b3IsIEhJTkRFTlRfQ09MKTsKLQkJCQkKLQkJCQl2SW5kZW50ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQl2SW5kZW50LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtWSU5ERU5UX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKHZJbmRlbnQsIHZJbmRlbnRFZGl0b3IsIFZJTkRFTlRfQ09MKTsKLQkJCQkKLQkJCQltaW5XaWR0aFRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCW1pbldpZHRoVGV4dC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbTUlOV0lEVEhfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAobWluV2lkdGhUZXh0LCBtaW5XaWR0aEVkaXRvciwgTUlOV0lEVEhfQ09MKTsKLQkJCQkKLQkJCQltaW5IZWlnaHRUZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQltaW5IZWlnaHRUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtNSU5IRUlHSFRfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAobWluSGVpZ2h0VGV4dCwgbWluSGVpZ2h0RWRpdG9yLCBNSU5IRUlHSFRfQ09MKTsKLQotCQkJCWV4Y2x1ZGUgPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWV4Y2x1ZGUuc2V0SXRlbXMgKGJvb2xWYWx1ZXMpOwotCQkJCWV4Y2x1ZGUuc2V0VGV4dCAobmV3SXRlbS5nZXRUZXh0IChFWENMVURFX0NPTCkpOwotCQkJCWV4Y2x1ZGVFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWV4Y2x1ZGVFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWV4Y2x1ZGVFZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJZXhjbHVkZUVkaXRvci5zZXRFZGl0b3IgKGV4Y2x1ZGUsIG5ld0l0ZW0sIEVYQ0xVREVfQ09MKTsKLQkJCQlleGNsdWRlLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx0YWJsZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgCVJlY3RhbmdsZSByZWN0ID0gbmV3SXRlbS5nZXRCb3VuZHMgKGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjdC5jb250YWlucyAocHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlzd2l0Y2ggKGkpIHsKLSAgICAgICAgICAgICAgICAgICAgCQljYXNlIE5BTUVfQ09MOgotICAgICAgICAgICAgICAgICAgICAJCQluYW1lVGV4dC5zZXRGb2N1cyAoKTsKLSAgICAgICAgICAgICAgICAgICAgCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBDT01CT19DT0wgOgotCQkJCQkJCQljb21iby5zZXRGb2N1cyAoKTsJCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgV0lEVEhfQ09MIDoJCi0JCQkJCQkJCXdpZHRoVGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBIRUlHSFRfQ09MIDoKLQkJCQkJCQkJaGVpZ2h0VGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBIQUxJR05fQ09MIDoKLQkJCQkJCQkJaEFsaWduLnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFZBTElHTl9DT0wgOgotCQkJCQkJCQl2QWxpZ24uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSEdSQUJfQ09MIDoKLQkJCQkJCQkJaEdyYWIuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgVkdSQUJfQ09MIDoKLQkJCQkJCQkJdkdyYWIuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSFNQQU5fQ09MIDoKLQkJCQkJCQkJaFNwYW4uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgVlNQQU5fQ09MIDoKLQkJCQkJCQkJdlNwYW4uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSElOREVOVF9DT0wgOgotCQkJCQkJCQloSW5kZW50LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFZJTkRFTlRfQ09MIDoKLQkJCQkJCQkJdkluZGVudC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBNSU5XSURUSF9DT0wgOgkKLQkJCQkJCQkJbWluV2lkdGhUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIE1JTkhFSUdIVF9DT0wgOgotCQkJCQkJCQltaW5IZWlnaHRUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEVYQ0xVREVfQ09MIDoKLQkJCQkJCQkJZXhjbHVkZS5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IAotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0gICAgICAgIC8qIENvbnRyb2xzIHRoZSBjb2x1bW5zIGluIHRoZSBHcmlkTGF5b3V0ICovCi0JCUdyb3VwIGNvbHVtbkdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY29sdW1uR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNvbHVtbnMiKSk7Ci0JCWNvbHVtbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQljb2x1bW5Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJbmV3IExhYmVsKGNvbHVtbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm51bUNvbHVtbnMiKTsKLQkJbnVtQ29sdW1ucyA9IG5ldyBTcGlubmVyIChjb2x1bW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW51bUNvbHVtbnMuc2V0TWluaW11bSAoMSk7Ci0JCW51bUNvbHVtbnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gbmV3IEJ1dHRvbiAoY29sdW1uR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1ha2VDb2x1bW5zRXF1YWxXaWR0aC5zZXRUZXh0ICgibWFrZUNvbHVtbnNFcXVhbFdpZHRoIik7Ci0JCW1ha2VDb2x1bW5zRXF1YWxXaWR0aC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQltYWtlQ29sdW1uc0VxdWFsV2lkdGguc2V0RW5hYmxlZCAoZmFsc2UpOwotCQltYWtlQ29sdW1uc0VxdWFsV2lkdGguc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDIsIDEpKTsKLQotCQkvKiBDb250cm9scyB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyBvZiB0aGUgR3JpZExheW91dCAqLwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWFyZ2luc19TcGFjaW5nIikpOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luV2lkdGgiKTsKLQkJbWFyZ2luV2lkdGggPSBuZXcgU3Bpbm5lciAobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5XaWR0aC5zZXRTZWxlY3Rpb24oNSk7Ci0JCW1hcmdpbldpZHRoLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luSGVpZ2h0Iik7Ci0JCW1hcmdpbkhlaWdodCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luSGVpZ2h0LnNldFNlbGVjdGlvbig1KTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luTGVmdCIpOwotCQltYXJnaW5MZWZ0ID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5MZWZ0LnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luTGVmdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIm1hcmdpblJpZ2h0Iik7Ci0JCW1hcmdpblJpZ2h0ID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5SaWdodC5zZXRTZWxlY3Rpb24oMCk7Ci0JCW1hcmdpblJpZ2h0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luVG9wIik7Ci0JCW1hcmdpblRvcCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luVG9wLnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luVG9wLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luQm90dG9tIik7Ci0JCW1hcmdpbkJvdHRvbSA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luQm90dG9tLnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luQm90dG9tLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiaG9yaXpvbnRhbFNwYWNpbmciKTsKLQkJaG9yaXpvbnRhbFNwYWNpbmcgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCWhvcml6b250YWxTcGFjaW5nLnNldFNlbGVjdGlvbig1KTsKLQkJaG9yaXpvbnRhbFNwYWNpbmcuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJ2ZXJ0aWNhbFNwYWNpbmciKTsKLQkJdmVydGljYWxTcGFjaW5nID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQl2ZXJ0aWNhbFNwYWNpbmcuc2V0U2VsZWN0aW9uKDUpOwotCQl2ZXJ0aWNhbFNwYWNpbmcuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotICAgICAgICAKLQkJLyogQWRkIGNvbW1vbiBjb250cm9scyAqLwotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJY29udHJvbEdyb3VwLnBhY2soKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXQgKCkgewotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXQgKGdyaWRMYXlvdXQpOwotCX0KLQkKLQkvKiogCi0JICogRGlzcG9zZXMgdGhlIGVkaXRvcnMgd2l0aG91dCBwbGFjaW5nIHRoZWlyIGNvbnRlbnRzCi0JICogaW50byB0aGUgdGFibGUuCi0JICovCi0Jdm9pZCBkaXNwb3NlRWRpdG9ycyAoKSB7Ci0JCWNvbWJvRWRpdG9yLnNldEVkaXRvciAobnVsbCwgbnVsbCwgLTEpOwotCQljb21iby5kaXNwb3NlICgpOwotCQluYW1lVGV4dC5kaXNwb3NlICgpOwotCQl3aWR0aFRleHQuZGlzcG9zZSAoKTsKLQkJaGVpZ2h0VGV4dC5kaXNwb3NlICgpOwotCQloQWxpZ24uZGlzcG9zZSAoKTsKLQkJdkFsaWduLmRpc3Bvc2UgKCk7Ci0JCWhHcmFiLmRpc3Bvc2UgKCk7Ci0JCXZHcmFiLmRpc3Bvc2UgKCk7Ci0JCWhTcGFuLmRpc3Bvc2UgKCk7Ci0JCXZTcGFuLmRpc3Bvc2UgKCk7Ci0JCWhJbmRlbnQuZGlzcG9zZSAoKTsKLQkJdkluZGVudC5kaXNwb3NlICgpOwotCQltaW5XaWR0aFRleHQuZGlzcG9zZSAoKTsKLQkJbWluSGVpZ2h0VGV4dC5kaXNwb3NlICgpOwotCQlleGNsdWRlLmRpc3Bvc2UgKCk7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCQotCVN0cmluZ0J1ZmZlciBnZW5lcmF0ZUxheW91dENvZGUgKCkgewotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgiKTsKLQkJaWYgKGdyaWRMYXlvdXQubnVtQ29sdW1ucyAhPSAxIHx8IGdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7Ci0JCQljb2RlLmFwcGVuZCAoZ3JpZExheW91dC5udW1Db2x1bW5zICsgIiwgIiArIGdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoKTsKLQkJfQotCQljb2RlLmFwcGVuZCgiKTtcbiIpOwotCQlpZiAoZ3JpZExheW91dC5tYXJnaW5XaWR0aCAhPSA1KSB7Ci0JCQljb2RlLmFwcGVuZCgiXHRcdGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAiICsgZ3JpZExheW91dC5tYXJnaW5XaWR0aCArICI7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgIT0gNSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAiICsgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGdyaWRMYXlvdXQubWFyZ2luTGVmdCAhPSAwKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSAiICsgZ3JpZExheW91dC5tYXJnaW5MZWZ0ICsgIjtcbiIpOwotCQl9Ci0JCWlmIChncmlkTGF5b3V0Lm1hcmdpblJpZ2h0ICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGdyaWRMYXlvdXQubWFyZ2luUmlnaHQgPSAiICsgZ3JpZExheW91dC5tYXJnaW5SaWdodCArICI7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC5tYXJnaW5Ub3AgIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC5tYXJnaW5Ub3AgPSAiICsgZ3JpZExheW91dC5tYXJnaW5Ub3AgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGdyaWRMYXlvdXQubWFyZ2luQm90dG9tICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gIiArIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tICsgIjtcbiIpOwotCQl9Ci0JCWlmIChncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nICE9IDUpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAiICsgZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyArICI7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgIT0gNSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAiICsgZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgKyAiO1xuIik7Ci0JCX0KLQkJY29kZS5hcHBlbmQgKCJcdFx0c2hlbGwuc2V0TGF5b3V0IChncmlkTGF5b3V0KTtcbiIpOwotCQkKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWJvb2xlYW4gYm91bmRzLCBhbGlnbiwgZ3JhYiwgc3BhbjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW4gW2ldOwotCQkJY29kZS5hcHBlbmQgKGdldENoaWxkQ29kZSAoY29udHJvbCwgaSkpOwotCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29udHJvbC5nZXRMYXlvdXREYXRhICgpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCS8qIFVzZSB0aGUgbW9zdCBlZmZpY2llbnQgY29uc3RydWN0b3IgKi8KLQkJCQlib3VuZHMgPSBkYXRhLndpZHRoSGludCAhPSBTV1QuREVGQVVMVCB8fCBkYXRhLmhlaWdodEhpbnQgIT0gU1dULkRFRkFVTFQ7Ci0JCQkJYWxpZ24gPSBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgIT0gU1dULkJFR0lOTklORyB8fCBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ICE9IFNXVC5DRU5URVI7Ci0JCQkJZ3JhYiA9IGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSB8fCBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlOwotCQkJCXNwYW4gPSBkYXRhLmhvcml6b250YWxTcGFuICE9IDEgfHwgZGF0YS52ZXJ0aWNhbFNwYW4gIT0gMTsKLQotCQkJCWNvZGUuYXBwZW5kICgiXHRcdCIpOwotCQkJCWlmIChmaXJzdCkgewotCQkJCQljb2RlLmFwcGVuZCAoIkdyaWREYXRhICIpOwotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoYWxpZ24gfHwgZ3JhYiB8fCBzcGFuKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBHcmlkRGF0YSAoIik7Ci0JCQkJCWNvZGUuYXBwZW5kIChhbGlnbm1lbnRTdHJpbmcoZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50KSArICIsICIpOwotCQkJCQljb2RlLmFwcGVuZCAoYWxpZ25tZW50U3RyaW5nKGRhdGEudmVydGljYWxBbGlnbm1lbnQpICsgIiwgIik7Ci0JCQkJCWNvZGUuYXBwZW5kIChkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgKyAiLCAiKTsKLQkJCQkJY29kZS5hcHBlbmQgKGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UpOwotCQkJCQlpZiAoc3BhbikgewotCQkJCQkJY29kZS5hcHBlbmQgKCIsICIgKyBkYXRhLmhvcml6b250YWxTcGFuKTsKLQkJCQkJCWNvZGUuYXBwZW5kICgiLCAiICsgZGF0YS52ZXJ0aWNhbFNwYW4pOwotCQkJCQl9Ci0JCQkJCWNvZGUuYXBwZW5kKCIpO1xuIik7Ci0JCQkJCWlmIChkYXRhLndpZHRoSGludCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS53aWR0aEhpbnQgPSAiICsgZGF0YS53aWR0aEhpbnQgKyAiO1xuIik7Ci0JCQkJCX0KLQkJCQkJaWYgKGRhdGEuaGVpZ2h0SGludCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5oZWlnaHRIaW50ID0gIiArIGRhdGEuaGVpZ2h0SGludCArICI7XG4iKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChib3VuZHMpIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBHcmlkRGF0YSAoIik7Ci0JCQkJCQljb2RlLmFwcGVuZCAoZGF0YS53aWR0aEhpbnQgPT0gU1dULkRFRkFVTFQgPyAiU1dULkRFRkFVTFQiIDogU3RyaW5nLnZhbHVlT2YoZGF0YS53aWR0aEhpbnQpICsgIiwgIik7Ci0JCQkJCQljb2RlLmFwcGVuZCAoZGF0YS5oZWlnaHRIaW50ID09IFNXVC5ERUZBVUxUID8gIlNXVC5ERUZBVUxUIiA6IFN0cmluZy52YWx1ZU9mKGRhdGEuaGVpZ2h0SGludCkpOwotCQkJCQkJY29kZS5hcHBlbmQoIik7XG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBHcmlkRGF0YSAoKTtcbiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkYXRhLmhvcml6b250YWxJbmRlbnQgIT0gMCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhvcml6b250YWxJbmRlbnQgPSAiICsgZGF0YS5ob3Jpem9udGFsSW5kZW50ICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS52ZXJ0aWNhbEluZGVudCAhPSAwKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEudmVydGljYWxJbmRlbnQgPSAiICsgZGF0YS52ZXJ0aWNhbEluZGVudCArICI7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEubWluaW11bVdpZHRoICE9IDApIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5taW5pbXVtV2lkdGggPSAiICsgZGF0YS5taW5pbXVtV2lkdGggKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLm1pbmltdW1IZWlnaHQgIT0gMCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLm1pbmltdW1IZWlnaHQgPSAiICsgZGF0YS5taW5pbXVtSGVpZ2h0ICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS5leGNsdWRlKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuZXhjbHVkZSA9IHRydWU7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGNvZGUuc3Vic3RyaW5nIChjb2RlLmxlbmd0aCAoKSAtIDMzKS5lcXVhbHMgKCJHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhICgpO1xuIikpIHsKLQkJCQkJY29kZS5kZWxldGUgKGNvZGUubGVuZ3RoICgpIC0gMzMsIGNvZGUubGVuZ3RoICgpKTsKLQkJCQkJZmlyc3QgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoY29kZS5zdWJzdHJpbmcgKGNvZGUubGVuZ3RoICgpIC0gMjQpLmVxdWFscyAoImRhdGEgPSBuZXcgR3JpZERhdGEgKCk7XG4iKSkgeyAKLQkJCQkJY29kZS5kZWxldGUgKGNvZGUubGVuZ3RoICgpIC0gMjQsIGNvZGUubGVuZ3RoICgpKTsKLQkJCQl9IGVsc2UgewkKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0TGF5b3V0RGF0YSAoZGF0YSk7XG4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCVN0cmluZyBhbGlnbm1lbnRTdHJpbmcoaW50IGFsaWdubWVudCkgewotCQlpZiAoYWxpZ25tZW50ID09IFNXVC5CRUdJTk5JTkcpIHJldHVybiAiU1dULkJFR0lOTklORyI7Ci0JCWlmIChhbGlnbm1lbnQgPT0gU1dULkNFTlRFUikgcmV0dXJuICJTV1QuQ0VOVEVSIjsKLQkJaWYgKGFsaWdubWVudCA9PSBTV1QuRU5EKSByZXR1cm4gIlNXVC5FTkQiOwotCQlyZXR1cm4gIlNXVC5GSUxMIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdG8gaW5zZXJ0IHdoZW4gYSBuZXcgY2hpbGQgY29udHJvbCBpcyBhZGRlZCB0byB0aGUgdGFibGUuCi0JICovCi0JU3RyaW5nW10gZ2V0SW5zZXJ0U3RyaW5nIChTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRyb2xUeXBlKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHtuYW1lLCBjb250cm9sVHlwZSwKLQkJCQkiLTEiLCItMSIsIkJFR0lOTklORyIsIkNFTlRFUiIsCi0JCQkJImZhbHNlIiwiZmFsc2UiLCIxIiwiMSIsIjAiLCIwIiwKLQkJCQkiMCIsIjAiLCJmYWxzZSJ9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10gewotCQkJIkNvbnRyb2wgTmFtZSIsCi0JCQkiQ29udHJvbCBUeXBlIiwgCi0JCQkid2lkdGgiLCAKLQkJCSJoZWlnaHQiLCAKLQkJCSJoQWxpZ25tZW50IiwgLy8iaG9yaXpvbnRhbEFsaWdubWVudCIsIAotCQkJInZBbGlnbm1lbnQiLCAvLyJ2ZXJ0aWNhbEFsaWdubWVudCIsIAotCQkJImdyYWJIIiwgLy8iZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSIsIAotCQkJImdyYWJWIiwgLy8iZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UiLCAKLQkJCSJoU3BhbiIsIC8vImhvcml6b250YWxTcGFuIiwKLQkJCSJ2U3BhbiIsIC8vInZlcnRpY2FsU3BhbiIsIAotCQkJImhJbmRlbnQiLCAvLyJob3Jpem9udGFsSW5kZW50IiwgCi0JCQkidkluZGVudCIsIC8vInZlcnRpY2FsSW5kZW50IiwKLQkJCSJtaW5XaWR0aCIsIC8vIm1pbmltdW1XaWR0aCIsCi0JCQkibWluSGVpZ2h0IiwgLy8ibWluaW11bUhlaWdodCIsIAotCQkJImV4Y2x1ZGUiCi0JCX07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkdyaWRMYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCS8qKiBNYWtlIHN1cmUgdXNlciBlbnRlcnMgYSB2YWxpZCBkYXRhKi8KLQkJCXRyeSB7CQkJCQotCQkJCW5ldyBTdHJpbmcgKG5hbWVUZXh0LmdldFRleHQgKCkpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQluYW1lVGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKE5BTUVfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyICh3aWR0aFRleHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXdpZHRoVGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKFdJRFRIX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAoaGVpZ2h0VGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKEhFSUdIVF9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKGhTcGFuLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloU3Bhbi5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKEhTUEFOX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAodlNwYW4uZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXZTcGFuLnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoVlNQQU5fQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyIChoSW5kZW50LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloSW5kZW50LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoSElOREVOVF9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKHZJbmRlbnQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXZJbmRlbnQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChWSU5ERU5UX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAobWluV2lkdGhUZXh0LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQltaW5XaWR0aFRleHQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChNSU5XSURUSF9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKG1pbkhlaWdodFRleHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCW1pbkhlaWdodFRleHQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChNSU5IRUlHSFRfQ09MKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgW10gaW5zZXJ0ID0gbmV3IFN0cmluZyBbXSB7Ci0JCQkJbmFtZVRleHQuZ2V0VGV4dCAoKSwgY29tYm8uZ2V0VGV4dCAoKSwgd2lkdGhUZXh0LmdldFRleHQgKCksIGhlaWdodFRleHQuZ2V0VGV4dCAoKSwKLQkJCQloQWxpZ24uZ2V0VGV4dCAoKSwgdkFsaWduLmdldFRleHQgKCksIGhHcmFiLmdldFRleHQgKCksIHZHcmFiLmdldFRleHQgKCksIAotCQkJCWhTcGFuLmdldFRleHQgKCksIHZTcGFuLmdldFRleHQgKCksIGhJbmRlbnQuZ2V0VGV4dCAoKSwgdkluZGVudC5nZXRUZXh0ICgpLCAKLQkJCQltaW5XaWR0aFRleHQuZ2V0VGV4dCAoKSwgbWluSGVpZ2h0VGV4dC5nZXRUZXh0ICgpLCBleGNsdWRlLmdldFRleHQgKCkKLQkJCX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBUT1RBTF9DT0xTOyBpKyspIHsKLQkJCQlvbGRJdGVtLnNldFRleHQgKGksICgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChyb3cpKSBbaV0pOwotCQkJfQotCQkJaWYgKCF0YWIpIGRpc3Bvc2VFZGl0b3JzICgpOwotCQl9Ci0JCXNldExheW91dFN0YXRlICgpOwotCQlyZWZyZXNoTGF5b3V0Q29tcG9zaXRlICgpOwotCQlzZXRMYXlvdXREYXRhICgpOwotCQlsYXlvdXRDb21wb3NpdGUubGF5b3V0ICh0cnVlKTsKLQkJbGF5b3V0R3JvdXAubGF5b3V0ICh0cnVlKTsKLQl9CQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5pdGlhbCB3ZWlnaHQgb2YgdGhlIGxheW91dCBhbmQgY29udHJvbCBncm91cHMgd2l0aGluIHRoZSBTYXNoRm9ybS4KLQkgKiBAcmV0dXJuIHRoZSBkZXNpcmVkIHNhc2ggd2VpZ2h0cyBmb3IgdGhlIHRhYiBwYWdlCi0JICovCi0JaW50W10gc2FzaFdlaWdodHMgKCkgewotCQlyZXR1cm4gbmV3IGludFtdIHszNSwgNjV9OwkJCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0RGF0YSAoKSB7Ci0JCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBsYXlvdXRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCQlHcmlkRGF0YSBkYXRhOwotCQlpbnQgaFNwYW4sIHZTcGFuLCBoSW5kZW50LCB2SW5kZW50OwotCQlTdHJpbmcgdkFsaWduLCBoQWxpZ24sIHZHcmFiLCBoR3JhYiwgZXhjbHVkZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoKTsKLQkJCS8qIFNldCB3aWR0aEhpbnQgYW5kIGhlaWdodEhpbnQgKi8KLQkJCWRhdGEud2lkdGhIaW50ID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChXSURUSF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWRhdGEuaGVpZ2h0SGludCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpLmludFZhbHVlICgpOwotCQkJLyogU2V0IHZlcnRpY2FsIGFsaWdubWVudCBhbmQgaG9yaXpvbnRhbCBhbGlnbm1lbnQgKi8KLQkJCWhBbGlnbiA9IGl0ZW1zIFtpXS5nZXRUZXh0IChIQUxJR05fQ09MKTsKLQkJCWlmIChoQWxpZ24uZXF1YWxzICgiQ0VOVEVSIikpIHsKLQkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQkJfSBlbHNlIGlmIChoQWxpZ24uZXF1YWxzICgiRU5EIikpIHsKLQkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwotCQkJfSBlbHNlIGlmIChoQWxpZ24uZXF1YWxzICgiRklMTCIpKSB7Ci0JCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCQl9Ci0JCQl2QWxpZ24gPSBpdGVtcyBbaV0uZ2V0VGV4dCAoVkFMSUdOX0NPTCk7Ci0JCQlpZiAodkFsaWduLmVxdWFscyAoIkJFR0lOTklORyIpKSB7Ci0JCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCQl9IGVsc2UgaWYgKHZBbGlnbi5lcXVhbHMgKCJFTkQiKSkgewotCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRU5EOwotCQkJfSBlbHNlIGlmICh2QWxpZ24uZXF1YWxzICgiRklMTCIpKSB7Ci0JCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJCX0KLQkJCS8qIFNldCBzcGFucyBhbmQgaW5kZW50cyAqLwotCQkJaFNwYW4gPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhTUEFOX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IGhTcGFuOwotCQkJdlNwYW4gPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKFZTUEFOX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSB2U3BhbjsKLQkJCWhJbmRlbnQgPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhJTkRFTlRfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBoSW5kZW50OwotCQkJdkluZGVudCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoVklOREVOVF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWRhdGEudmVydGljYWxJbmRlbnQgPSB2SW5kZW50OwotCQkJLyogU2V0IGdyYWJzICovCi0JCQloR3JhYiA9IGl0ZW1zIFtpXS5nZXRUZXh0IChIR1JBQl9DT0wpOwotCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gaEdyYWIuZXF1YWxzICgidHJ1ZSIpOwotCQkJdkdyYWIgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoVkdSQUJfQ09MKTsKLQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB2R3JhYi5lcXVhbHMgKCJ0cnVlIik7Ci0JCQkvKiBTZXQgbWluaW11bSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0JCQlkYXRhLm1pbmltdW1XaWR0aCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoTUlOV0lEVEhfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQlkYXRhLm1pbmltdW1IZWlnaHQgPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKE1JTkhFSUdIVF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCS8qIFNldCBleGNsdWRlIGJvb2xlYW4gKi8KLQkJCWV4Y2x1ZGUgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoRVhDTFVERV9DT0wpOwotCQkJZGF0YS5leGNsdWRlID0gZXhjbHVkZS5lcXVhbHMgKCJ0cnVlIik7Ci0JCQkKLQkJCWNoaWxkcmVuIFtpXS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCQkvKiBTZXQgdGhlIGNvbHVtbnMgZm9yIHRoZSBsYXlvdXQgKi8KLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1ucy5nZXRTZWxlY3Rpb24gKCk7Ci0JCWdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gbWFrZUNvbHVtbnNFcXVhbFdpZHRoLmdldFNlbGVjdGlvbiAoKTsKLQkJbWFrZUNvbHVtbnNFcXVhbFdpZHRoLnNldEVuYWJsZWQgKG51bUNvbHVtbnMuZ2V0U2VsZWN0aW9uICgpID4gMSk7Ci0JCQotCQkvKiBTZXQgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgKi8KLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IG1hcmdpbldpZHRoLmdldFNlbGVjdGlvbiAoKTsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQuZ2V0U2VsZWN0aW9uICgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0LmdldFNlbGVjdGlvbiAoKTsKLQkJZ3JpZExheW91dC5tYXJnaW5SaWdodCA9IG1hcmdpblJpZ2h0LmdldFNlbGVjdGlvbiAoKTsKLQkJZ3JpZExheW91dC5tYXJnaW5Ub3AgPSBtYXJnaW5Ub3AuZ2V0U2VsZWN0aW9uICgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IG1hcmdpbkJvdHRvbS5nZXRTZWxlY3Rpb24gKCk7Ci0JCWdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBob3Jpem9udGFsU3BhY2luZy5nZXRTZWxlY3Rpb24gKCk7Ci0JCWdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gdmVydGljYWxTcGFjaW5nLmdldFNlbGVjdGlvbiAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0xheW91dEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvTGF5b3V0RXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjJlYzVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvTGF5b3V0RXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBMYXlvdXRFeGFtcGxlIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfbGF5b3V0Iik7Ci0JcHJpdmF0ZSBUYWJGb2xkZXIgdGFiRm9sZGVyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBMYXlvdXRFeGFtcGxlIGVtYmVkZGVkIGluc2lkZQotCSAqIHRoZSBzdXBwbGllZCBwYXJlbnQgQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbnRhaW5lciBvZiB0aGUgZXhhbXBsZQotCSAqLwotCXB1YmxpYyBMYXlvdXRFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlciAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVRhYiBbXSB0YWJzID0gbmV3IFRhYiBbXSB7Ci0JCQluZXcgRmlsbExheW91dFRhYiAodGhpcyksCi0JCQluZXcgUm93TGF5b3V0VGFiICh0aGlzKSwKLQkJCW5ldyBHcmlkTGF5b3V0VGFiICh0aGlzKSwKLQkJCW5ldyBGb3JtTGF5b3V0VGFiICh0aGlzKSwKLQkJCW5ldyBTdGFja0xheW91dFRhYiAodGhpcykKLQkJfTsKLQkJZm9yIChpbnQgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtICh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJICAgIGl0ZW0uc2V0VGV4dCAodGFicyBbaV0uZ2V0VGFiVGV4dCAoKSk7Ci0JCSAgICBpdGVtLnNldENvbnRyb2wgKHRhYnMgW2ldLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcikpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdyYWJzIGlucHV0IGZvY3VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQl0YWJGb2xkZXIuc2V0Rm9jdXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyCi0JICogaW5zdGFuY2Ugb2YgdGhlIExheW91dEV4YW1wbGUuCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRhYkZvbGRlciA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEludm9rZXMgYXMgYSBzdGFuZGFsb25lIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQluZXcgTGF5b3V0RXhhbXBsZShzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIndpbmRvdy50aXRsZSIpKTsKLQkJc2hlbGwuYWRkU2hlbGxMaXN0ZW5lciAobmV3IFNoZWxsQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHsKLQkJCQlTaGVsbCBbXSBzaGVsbHMgPSBkaXNwbGF5LmdldFNoZWxscygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2hlbGxzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzaGVsbHMgW2ldICE9IHNoZWxsKSBzaGVsbHMgW2ldLmNsb3NlICgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGFuZCBiaW5kcyBpdAotCSAqIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gSWYgdGhlIGtleSBpcyBub3QgZm91bmQsCi0JICogcmV0dXJuIHRoZSBrZXkuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Sb3dMYXlvdXRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvUm93TGF5b3V0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OGEwZjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Sb3dMYXlvdXRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLWNsYXNzIFJvd0xheW91dFRhYiBleHRlbmRzIFRhYiB7Ci0JLyogQ29udHJvbHMgZm9yIHNldHRpbmcgbGF5b3V0IHBhcmFtZXRlcnMgKi8KLQlCdXR0b24gaG9yaXpvbnRhbCwgdmVydGljYWw7Ci0JQnV0dG9uIHdyYXAsIHBhY2ssIGZpbGwsIGp1c3RpZnksIGNlbnRlcjsKLQlTcGlubmVyIG1hcmdpbldpZHRoLCBtYXJnaW5IZWlnaHQsIG1hcmdpbkxlZnQsIG1hcmdpblJpZ2h0LCBtYXJnaW5Ub3AsIG1hcmdpbkJvdHRvbSwgc3BhY2luZzsKLQkvKiBUaGUgZXhhbXBsZSBsYXlvdXQgaW5zdGFuY2UgKi8KLQlSb3dMYXlvdXQgcm93TGF5b3V0OwotCS8qIFRhYmxlRWRpdG9ycyBhbmQgcmVsYXRlZCBjb250cm9scyovCi0JVGFibGVFZGl0b3IgY29tYm9FZGl0b3IsIHdpZHRoRWRpdG9yLCBoZWlnaHRFZGl0b3IsIG5hbWVFZGl0b3IsIGV4Y2x1ZGVFZGl0b3I7Ci0JQ0NvbWJvIGNvbWJvLCBleGNsdWRlOwotCVRleHQgbmFtZVRleHQsIHdpZHRoVGV4dCwgaGVpZ2h0VGV4dDsKLQkKLQkvKiBDb25zdGFudHMgKi8KLQlmaW5hbCBpbnQgTkFNRV9DT0wgPSAwOwotCWZpbmFsIGludCBDT01CT19DT0wgPSAxOwotCWZpbmFsIGludCBXSURUSF9DT0wgPSAyOwotCWZpbmFsIGludCBIRUlHSFRfQ09MID0gMzsKLQlmaW5hbCBpbnQgRVhDTFVERV9DT0wgPSA0OwotCWZpbmFsIGludCBUT1RBTF9DT0xTID0gNTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgTGF5b3V0RXhhbXBsZS4KLQkgKi8KLQlSb3dMYXlvdXRUYWIoTGF5b3V0RXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgaW4gdGhlICJjaGlsZCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZFdpZGdldHMgKCkgewotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQkJCi0JCS8qIEFkZCBUYWJsZUVkaXRvcnMgKi8KLQkJbmFtZUVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQljb21ib0VkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl3aWR0aEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloZWlnaHRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJZXhjbHVkZUVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl0YWJsZS5hZGRNb3VzZUxpc3RlbmVyIChuZXcgTW91c2VBZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQlyZXNldEVkaXRvcnMoKTsKLQkJCQlpbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4ICgpOwotCQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChlLngsIGUueSk7Ci0gICAgICAgICAgICAgICAgbmV3SXRlbSA9IHRhYmxlLmdldEl0ZW0gKHB0KTsKLSAgICAgICAgICAgICAgICBpZiAobmV3SXRlbSA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotICAgICAgICAgICAgICAgIGlmIChuZXdJdGVtID09IG9sZEl0ZW0gfHwgbmV3SXRlbSAhPSBsYXN0U2VsZWN0ZWQpIHsKLQkJCQkJbGFzdFNlbGVjdGVkID0gbmV3SXRlbTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0YWJsZS5zaG93U2VsZWN0aW9uICgpOwotCQkJCQotCQkJCWNvbWJvID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5SRUFEX09OTFkpOwotCQkJCWNyZWF0ZUNvbWJvRWRpdG9yIChjb21ibywgY29tYm9FZGl0b3IpOwotCQkJCQotCQkJCW5hbWVUZXh0ID0gbmV3IFRleHQodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCW5hbWVUZXh0LnNldFRleHQoKChTdHJpbmdbXSlkYXRhLmVsZW1lbnRBdChpbmRleCkpW05BTUVfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvcihuYW1lVGV4dCwgbmFtZUVkaXRvciwgTkFNRV9DT0wpOwotCQkJCQotCQkJCXdpZHRoVGV4dCA9IG5ldyBUZXh0KHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQl3aWR0aFRleHQuc2V0VGV4dCgoKFN0cmluZ1tdKWRhdGEuZWxlbWVudEF0KGluZGV4KSlbV0lEVEhfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvcih3aWR0aFRleHQsIHdpZHRoRWRpdG9yLCBXSURUSF9DT0wpOwotCQkJCQotCQkJCWhlaWdodFRleHQgPSBuZXcgVGV4dCh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbSEVJR0hUX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKGhlaWdodFRleHQsIGhlaWdodEVkaXRvciwgSEVJR0hUX0NPTCk7Ci0gICAgICAgICAgICAgICAgCi0JCQkJU3RyaW5nIFtdIGJvb2xWYWx1ZXMgPSBuZXcgU3RyaW5nIFtdIHsiZmFsc2UiLCAidHJ1ZSJ9OwotCQkJCWV4Y2x1ZGUgPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWV4Y2x1ZGUuc2V0SXRlbXMgKGJvb2xWYWx1ZXMpOwotCQkJCWV4Y2x1ZGUuc2V0VGV4dCAobmV3SXRlbS5nZXRUZXh0IChFWENMVURFX0NPTCkpOwotCQkJCWV4Y2x1ZGVFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWV4Y2x1ZGVFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWV4Y2x1ZGVFZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJZXhjbHVkZUVkaXRvci5zZXRFZGl0b3IgKGV4Y2x1ZGUsIG5ld0l0ZW0sIEVYQ0xVREVfQ09MKTsKLQkJCQlleGNsdWRlLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCi0JCQkJZm9yIChpbnQgaT0wOyBpPHRhYmxlLmdldENvbHVtbkNvdW50ICgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAJUmVjdGFuZ2xlIHJlY3QgPSBuZXdJdGVtLmdldEJvdW5kcyAoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0LmNvbnRhaW5zIChwdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCXN3aXRjaCAoaSkgewotICAgICAgICAgICAgICAgICAgICAJCWNhc2UgTkFNRV9DT0wgOgotICAgICAgICAgICAgICAgICAgICAJCQluYW1lVGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQljYXNlIENPTUJPX0NPTCA6Ci0JCQkJCQkJCWNvbWJvLnNldEZvY3VzICgpOwkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBXSURUSF9DT0wgOgkKLQkJCQkJCQkJd2lkdGhUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEhFSUdIVF9DT0wgOgotCQkJCQkJCQloZWlnaHRUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEVYQ0xVREVfQ09MIDoKLQkJCQkJCQkJZXhjbHVkZS5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IAotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbCB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQkvKiBDb250cm9scyB0aGUgdHlwZSBvZiBSb3dMYXlvdXQgKi8KLQkJR3JvdXAgdHlwZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJdHlwZUdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUeXBlIikpOwotCQl0eXBlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXR5cGVHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJaG9yaXpvbnRhbCA9IG5ldyBCdXR0b24gKHR5cGVHcm91cCwgU1dULlJBRElPKTsKLQkJaG9yaXpvbnRhbC5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJaG9yaXpvbnRhbC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOyAKLQkJaG9yaXpvbnRhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWhvcml6b250YWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdmVydGljYWwgPSBuZXcgQnV0dG9uICh0eXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXZlcnRpY2FsLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJdmVydGljYWwuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsgCi0JCXZlcnRpY2FsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQotCQkvKiBDb250cm9scyB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyBvZiB0aGUgUm93TGF5b3V0ICovCi0JCUdyb3VwIG1hcmdpbkdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIk1hcmdpbnNfU3BhY2luZyIpKTsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMikpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJtYXJnaW5XaWR0aCIpOwotCQltYXJnaW5XaWR0aCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luV2lkdGguc2V0U2VsZWN0aW9uKDApOwotCQltYXJnaW5XaWR0aC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luSGVpZ2h0Iik7Ci0JCW1hcmdpbkhlaWdodCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luSGVpZ2h0LnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luSGVpZ2h0LnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luTGVmdCIpOwotCQltYXJnaW5MZWZ0ID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5MZWZ0LnNldFNlbGVjdGlvbigzKTsKLQkJbWFyZ2luTGVmdC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm1hcmdpblJpZ2h0Iik7Ci0JCW1hcmdpblJpZ2h0ID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5SaWdodC5zZXRTZWxlY3Rpb24oMyk7Ci0JCW1hcmdpblJpZ2h0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luVG9wIik7Ci0JCW1hcmdpblRvcCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luVG9wLnNldFNlbGVjdGlvbigzKTsKLQkJbWFyZ2luVG9wLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJtYXJnaW5Cb3R0b20iKTsKLQkJbWFyZ2luQm90dG9tID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5Cb3R0b20uc2V0U2VsZWN0aW9uKDMpOwotCQltYXJnaW5Cb3R0b20uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJzcGFjaW5nIik7Ci0JCXNwYWNpbmcgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCXNwYWNpbmcuc2V0U2VsZWN0aW9uKDMpOwotCQlzcGFjaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQotCQkvKiBDb250cm9scyBvdGhlciBwYXJhbWV0ZXJzIG9mIHRoZSBSb3dMYXlvdXQgKi8KLQkJR3JvdXAgc3BlY0dyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc3BlY0dyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJQcm9wZXJ0aWVzIikpOwotCQlzcGVjR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQlzcGVjR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXdyYXAgPSBuZXcgQnV0dG9uIChzcGVjR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXAuc2V0VGV4dCAoIldyYXAiKTsKLQkJd3JhcC5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQl3cmFwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7IAotCQl3cmFwLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXBhY2sgPSBuZXcgQnV0dG9uIChzcGVjR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXBhY2suc2V0VGV4dCAoIlBhY2siKTsKLQkJcGFjay5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOyAKLQkJcGFjay5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlwYWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZmlsbCA9IG5ldyBCdXR0b24oc3BlY0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlmaWxsLnNldFRleHQoIkZpbGwiKTsKLQkJZmlsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsgCi0JCWZpbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlqdXN0aWZ5ID0gbmV3IEJ1dHRvbiAoc3BlY0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlqdXN0aWZ5LnNldFRleHQgKCJKdXN0aWZ5Iik7Ci0JCWp1c3RpZnkuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsgCi0JCWp1c3RpZnkuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJY2VudGVyID0gbmV3IEJ1dHRvbiAoc3BlY0dyb3VwLCBTV1QuQ0hFQ0spOwotCQljZW50ZXIuc2V0VGV4dCAoIkNlbnRlciIpOwotCQljZW50ZXIuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsgCi0JCWNlbnRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkKLQkJLyogQWRkIGNvbW1vbiBjb250cm9scyAqLwotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXQgKCkgewotCQlyb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0ICgpOwotCQlsYXlvdXRDb21wb3NpdGUuc2V0TGF5b3V0IChyb3dMYXlvdXQpOwotCX0KLQkJCi0JLyoqIAotCSAqIERpc3Bvc2VzIHRoZSBlZGl0b3JzIHdpdGhvdXQgcGxhY2luZyB0aGVpciBjb250ZW50cwotCSAqIGludG8gdGhlIHRhYmxlLgotCSAqLwotCXZvaWQgZGlzcG9zZUVkaXRvcnMgKCkgewotCQljb21ib0VkaXRvci5zZXRFZGl0b3IgKG51bGwsIG51bGwsIC0xKTsKLQkJY29tYm8uZGlzcG9zZSAoKTsKLQkJd2lkdGhUZXh0LmRpc3Bvc2UgKCk7Ci0JCWhlaWdodFRleHQuZGlzcG9zZSAoKTsKLQkJbmFtZVRleHQuZGlzcG9zZSAoKTsKLQkJZXhjbHVkZS5kaXNwb3NlICgpOwotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZXMgY29kZSBmb3IgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwkKLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVMYXlvdXRDb2RlICgpIHsKLQkJU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyICgpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRSb3dMYXlvdXQgcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCAoKTtcbiIpOwotCQlpZiAocm93TGF5b3V0LnR5cGUgPT0gU1dULlZFUlRJQ0FMKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQud3JhcCA9PSBmYWxzZSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0LndyYXAgPSBmYWxzZTtcbiIpOwotCQl9IAotCQlpZiAocm93TGF5b3V0LnBhY2sgPT0gZmFsc2UpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC5wYWNrID0gZmFsc2U7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0LmZpbGwgPT0gdHJ1ZSkgewotCQkJY29kZS5hcHBlbmQoIlx0XHRyb3dMYXlvdXQuZmlsbCA9IHRydWU7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lmp1c3RpZnkgPT0gdHJ1ZSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0Lmp1c3RpZnkgPSB0cnVlO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC5jZW50ZXIgPT0gdHJ1ZSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0LmNlbnRlciA9IHRydWU7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbldpZHRoICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kKCJcdFx0cm93TGF5b3V0Lm1hcmdpbldpZHRoID0gIiArIHJvd0xheW91dC5tYXJnaW5XaWR0aCArICI7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbkhlaWdodCAhPSAwKSB7Ci0JCQljb2RlLmFwcGVuZCgiXHRcdHJvd0xheW91dC5tYXJnaW5IZWlnaHQgPSAiICsgcm93TGF5b3V0Lm1hcmdpbkhlaWdodCArICI7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbkxlZnQgIT0gMykgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0Lm1hcmdpbkxlZnQgPSAiICsgcm93TGF5b3V0Lm1hcmdpbkxlZnQgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC5tYXJnaW5SaWdodCAhPSAzKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQubWFyZ2luUmlnaHQgPSAiICsgcm93TGF5b3V0Lm1hcmdpblJpZ2h0ICsgIjtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQubWFyZ2luVG9wICE9IDMpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC5tYXJnaW5Ub3AgPSAiICsgcm93TGF5b3V0Lm1hcmdpblRvcCArICI7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbkJvdHRvbSAhPSAzKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQubWFyZ2luQm90dG9tID0gIiArIHJvd0xheW91dC5tYXJnaW5Cb3R0b20gKyAiO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC5zcGFjaW5nICE9IDMpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC5zcGFjaW5nID0gIiArIHJvd0xheW91dC5zcGFjaW5nICsgIjtcbiIpOwotCQl9Ci0JCWNvZGUuYXBwZW5kICgiXHRcdHNoZWxsLnNldExheW91dCAocm93TGF5b3V0KTtcbiIpOwotCQkKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuIFtpXTsKLQkJCWNvZGUuYXBwZW5kIChnZXRDaGlsZENvZGUgKGNvbnRyb2wsaSkpOwotCQkJUm93RGF0YSByb3dEYXRhID0gKFJvd0RhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSAoKTsKLQkJCWlmIChyb3dEYXRhICE9IG51bGwpIHsKLQkJCQlpZiAocm93RGF0YS53aWR0aCAhPSAtMSB8fCByb3dEYXRhLmhlaWdodCAhPSAtMSB8fCByb3dEYXRhLmV4Y2x1ZGUpIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0Iik7Ci0JCQkJCWlmIChmaXJzdCkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJSb3dEYXRhICIpOwotCQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAocm93RGF0YS53aWR0aCA9PSAtMSAmJiByb3dEYXRhLmhlaWdodCA9PSAtMSkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJyb3dEYXRhID0gbmV3IFJvd0RhdGEgKCk7XG4iKTsKLQkJCQkJfSBlbHNlIGlmIChyb3dEYXRhLndpZHRoID09IC0xKSB7Ci0JCQkJCQljb2RlLmFwcGVuZCAoInJvd0RhdGEgPSBuZXcgUm93RGF0YSAoU1dULkRFRkFVTFQsICIgKyByb3dEYXRhLmhlaWdodCArICIpO1xuIik7Ci0JCQkJCX0gZWxzZSBpZiAocm93RGF0YS5oZWlnaHQgPT0gLTEpIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgicm93RGF0YSA9IG5ldyBSb3dEYXRhICgiICsgcm93RGF0YS53aWR0aCArICIsIFNXVC5ERUZBVUxUKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29kZS5hcHBlbmQgKCJyb3dEYXRhID0gbmV3IFJvd0RhdGEgKCIgKyByb3dEYXRhLndpZHRoICsgIiwgIiArIHJvd0RhdGEuaGVpZ2h0ICsgIik7XG4iKTsJCQkJCi0JCQkJCX0KLQkJCQkJaWYgKHJvd0RhdGEuZXhjbHVkZSkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93RGF0YS5leGNsdWRlID0gdHJ1ZTtcbiIpOwotCQkJCQl9Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldExheW91dERhdGEgKHJvd0RhdGEpO1xuIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb2RlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdG8gaW5zZXJ0IHdoZW4gYSBuZXcgY2hpbGQgY29udHJvbCBpcyBhZGRlZCB0byB0aGUgdGFibGUuCi0JICovCi0JU3RyaW5nW10gZ2V0SW5zZXJ0U3RyaW5nIChTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRyb2xUeXBlKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHtuYW1lLCBjb250cm9sVHlwZSwgIi0xIiwgIi0xIiwgImZhbHNlIn07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEgZmllbGQgbmFtZXMuCi0JICovCi0JU3RyaW5nIFtdIGdldExheW91dERhdGFGaWVsZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IAotCQkJIkNvbnRyb2wgTmFtZSIsCi0JCQkiQ29udHJvbCBUeXBlIiwKLQkJCSJ3aWR0aCIsIAotCQkJImhlaWdodCIsCi0JCQkiZXhjbHVkZSIKLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiUm93TGF5b3V0IjsKLQl9Ci0JCi0JLyoqCi0JICogVGFrZXMgaW5mb3JtYXRpb24gZnJvbSBUYWJsZUVkaXRvcnMgYW5kIHN0b3JlcyBpdC4KLQkgKi8KLQl2b2lkIHJlc2V0RWRpdG9ycyAoYm9vbGVhbiB0YWIpIHsKLQkJVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotCQlpZiAob2xkSXRlbSAhPSBudWxsKSB7Ci0JCQlpbnQgcm93ID0gdGFibGUuaW5kZXhPZiAob2xkSXRlbSk7Ci0JCQkvKiBNYWtlIHN1cmUgdXNlciBoYXMgZW50ZXJlZCB2YWxpZCBkYXRhICovCi0JCQl0cnkgewkJCQkKLQkJCQluZXcgU3RyaW5nKG5hbWVUZXh0LmdldFRleHQoKSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCW5hbWVUZXh0LnNldFRleHQob2xkSXRlbS5nZXRUZXh0KE5BTUVfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyICh3aWR0aFRleHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXdpZHRoVGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKFdJRFRIX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAoaGVpZ2h0VGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKEhFSUdIVF9DT0wpKTsKLQkJCX0KLQkJCVN0cmluZyBbXSBpbnNlcnQgPSBuZXcgU3RyaW5nIFtdIHsKLQkJCQluYW1lVGV4dC5nZXRUZXh0KCksIGNvbWJvLmdldFRleHQgKCksIHdpZHRoVGV4dC5nZXRUZXh0ICgpLCBoZWlnaHRUZXh0LmdldFRleHQgKCksIGV4Y2x1ZGUuZ2V0VGV4dCAoKX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgVE9UQUxfQ09MUzsgaSsrKSB7Ci0JCQkJb2xkSXRlbS5zZXRUZXh0IChpLCAoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAocm93KSkgW2ldKTsKLQkJCX0KLQkJCWlmICghdGFiKSBkaXNwb3NlRWRpdG9ycyAoKTsKLQkJfQotCQlzZXRMYXlvdXRTdGF0ZSAoKTsKLQkJcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKTsKLQkJc2V0TGF5b3V0RGF0YSAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLmxheW91dCAodHJ1ZSk7Ci0JCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhIGZvciB0aGUgY2hpbGRyZW4gb2YgdGhlIGxheW91dC4KLQkgKi8KLQl2b2lkIHNldExheW91dERhdGEgKCkgewotCQlDb250cm9sIFtdIGNoaWxkcmVuID0gbGF5b3V0Q29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQkJUm93RGF0YSBkYXRhOwotCQlpbnQgd2lkdGgsIGhlaWdodDsKLQkJU3RyaW5nIGV4Y2x1ZGU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXdpZHRoID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChXSURUSF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWhlaWdodCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YSA9IG5ldyBSb3dEYXRhICh3aWR0aCwgaGVpZ2h0KTsKLQkJCWV4Y2x1ZGUgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoRVhDTFVERV9DT0wpOwotCQkJZGF0YS5leGNsdWRlID0gZXhjbHVkZS5lcXVhbHMgKCJ0cnVlIik7Ci0JCQljaGlsZHJlbiBbaV0uc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXRTdGF0ZSAoKSB7Ci0JCS8qIFNldCB0aGUgdHlwZSBvZiBsYXlvdXQgKi8KLQkJcm93TGF5b3V0LnR5cGUgPSB2ZXJ0aWNhbC5nZXRTZWxlY3Rpb24gKCkgPyBTV1QuVkVSVElDQUwgOiBTV1QuSE9SSVpPTlRBTDsKLQkJCi0JCS8qIFNldCB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyAqLwotCQlyb3dMYXlvdXQubWFyZ2luV2lkdGggPSBtYXJnaW5XaWR0aC5nZXRTZWxlY3Rpb24gKCk7Ci0JCXJvd0xheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQuZ2V0U2VsZWN0aW9uICgpOwotCQlyb3dMYXlvdXQubWFyZ2luTGVmdCA9IG1hcmdpbkxlZnQuZ2V0U2VsZWN0aW9uICgpOwotCQlyb3dMYXlvdXQubWFyZ2luUmlnaHQgPSBtYXJnaW5SaWdodC5nZXRTZWxlY3Rpb24gKCk7Ci0JCXJvd0xheW91dC5tYXJnaW5Ub3AgPSBtYXJnaW5Ub3AuZ2V0U2VsZWN0aW9uICgpOwotCQlyb3dMYXlvdXQubWFyZ2luQm90dG9tID0gbWFyZ2luQm90dG9tLmdldFNlbGVjdGlvbiAoKTsKLQkJcm93TGF5b3V0LnNwYWNpbmcgPSBzcGFjaW5nLmdldFNlbGVjdGlvbiAoKTsKLQkJCi0JCS8qIFNldCB0aGUgb3RoZXIgbGF5b3V0IHByb3BlcnRpZXMgKi8KLQkJcm93TGF5b3V0LndyYXAgPSB3cmFwLmdldFNlbGVjdGlvbiAoKTsKLQkJcm93TGF5b3V0LnBhY2sgPSBwYWNrLmdldFNlbGVjdGlvbiAoKTsKLQkJcm93TGF5b3V0LmZpbGwgPSBmaWxsLmdldFNlbGVjdGlvbiAoKTsKLQkJcm93TGF5b3V0Lmp1c3RpZnkgPSBqdXN0aWZ5LmdldFNlbGVjdGlvbiAoKTsKLQkJcm93TGF5b3V0LmNlbnRlciA9IGNlbnRlci5nZXRTZWxlY3Rpb24gKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9TdGFja0xheW91dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9TdGFja0xheW91dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDkxMWFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvU3RhY2tMYXlvdXRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBTdGFja0xheW91dFRhYiBleHRlbmRzIFRhYiB7Ci0JLyogQ29udHJvbHMgZm9yIHNldHRpbmcgbGF5b3V0IHBhcmFtZXRlcnMgKi8KLQlCdXR0b24gYmFja0J1dHRvbiwgYWR2YW5jZUJ1dHRvbjsKLQlMYWJlbCB0b3BDb250cm9sOwotCVNwaW5uZXIgbWFyZ2luV2lkdGgsIG1hcmdpbkhlaWdodDsKLQkvKiBUaGUgZXhhbXBsZSBsYXlvdXQgaW5zdGFuY2UgKi8KLQlTdGFja0xheW91dCBzdGFja0xheW91dDsKLQlpbnQgY3VycmVudExheWVyID0gLTE7Ci0JLyogVGFibGVFZGl0b3JzIGFuZCByZWxhdGVkIGNvbnRyb2xzKi8KLQlUYWJsZUVkaXRvciBjb21ib0VkaXRvciwgbmFtZUVkaXRvcjsKLQlDQ29tYm8gY29tYm87Ci0JVGV4dCBuYW1lVGV4dDsKLQlmaW5hbCBpbnQgTkFNRV9DT0wgPSAwOwotCWZpbmFsIGludCBUT1RBTF9DT0xTID0gMjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgTGF5b3V0RXhhbXBsZS4KLQkgKi8KLQlTdGFja0xheW91dFRhYihMYXlvdXRFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyBpbiB0aGUgImNoaWxkIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkV2lkZ2V0cygpIHsKLQkJLyogQWRkIGNvbW1vbiBjb250cm9scyAqLwotCQlzdXBlci5jcmVhdGVDaGlsZFdpZGdldHMoKTsKLQkJCi0JCS8qIEFkZCBUYWJsZUVkaXRvcnMgKi8KLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IodGFibGUpOwotCQluYW1lRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yKHRhYmxlKTsKLQkJdGFibGUuYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsgCQotCQkJCXJlc2V0RWRpdG9ycygpOwotCQkJCWluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoaW5kZXggPT0gLTEpIHJldHVybjsKLQkJCQkvL3NldCB0b3AgbGF5ZXIgb2Ygc3RhY2sgdG8gdGhlIHNlbGVjdGVkIGl0ZW0KLQkJCQlzZXRUb3BDb250cm9sIChpbmRleCk7Ci0JCQkJCi0JCQkJVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtKCk7Ci0JCQkJbmV3SXRlbSA9IHRhYmxlLmdldEl0ZW0oaW5kZXgpOwotCQkJCWlmIChuZXdJdGVtID09IG9sZEl0ZW0gfHwgbmV3SXRlbSAhPSBsYXN0U2VsZWN0ZWQpIHsKLQkJCQkJbGFzdFNlbGVjdGVkID0gbmV3SXRlbTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0YWJsZS5zaG93U2VsZWN0aW9uKCk7CQkJCQotCQkJCWNvbWJvID0gbmV3IENDb21ibyh0YWJsZSwgU1dULlJFQURfT05MWSk7CQkJCQotCQkJCWNyZWF0ZUNvbWJvRWRpdG9yKGNvbWJvLCBjb21ib0VkaXRvcik7Ci0JCQkJCi0JCQkJbmFtZVRleHQgPSBuZXcgVGV4dCh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJbmFtZVRleHQuc2V0VGV4dCgoKFN0cmluZ1tdKWRhdGEuZWxlbWVudEF0KGluZGV4KSlbTkFNRV9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yKG5hbWVUZXh0LCBuYW1lRWRpdG9yLCBOQU1FX0NPTCk7Ci0JCQl9Ci0JCX0pOwkJCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2wgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzKCkgewotICAgICAgICAvKiBDb250cm9scyB0aGUgdG9wQ29udHJvbCBpbiB0aGUgU3RhY2tMYXlvdXQgKi8KLQkJR3JvdXAgY29sdW1uR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQljb2x1bW5Hcm91cC5zZXRUZXh0ICgidG9wQ29udHJvbCIpOy8vKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUb3BfQ29udHJvbCIpKTsKLQkJY29sdW1uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbHVtbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQliYWNrQnV0dG9uID0gbmV3IEJ1dHRvbihjb2x1bW5Hcm91cCwgU1dULlBVU0gpOwotCSAgICBiYWNrQnV0dG9uLnNldFRleHQoIjw8Iik7Ci0JICAgIGJhY2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWJhY2tCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKFNXVC5FTkQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQliYWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkgICAgCXNldFRvcENvbnRyb2wgKGN1cnJlbnRMYXllciAtIDEpOwotCSAgICAgICAgfQotCQl9KTsKLQkJdG9wQ29udHJvbCA9IG5ldyBMYWJlbCAoY29sdW1uR3JvdXAsIFNXVC5CT1JERVIpOwotCQl0b3BDb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlhZHZhbmNlQnV0dG9uID0gbmV3IEJ1dHRvbihjb2x1bW5Hcm91cCwgU1dULlBVU0gpOwotCQlhZHZhbmNlQnV0dG9uLnNldFRleHQoIj4+Iik7Ci0JCWFkdmFuY2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWFkdmFuY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCSAgICAJc2V0VG9wQ29udHJvbCAoY3VycmVudExheWVyICsgMSk7Ci0JICAgICAgICB9Ci0JCX0pOwkJCi0KLQkJLyogQ29udHJvbHMgdGhlIG1hcmdpbnMgb2YgdGhlIFN0YWNrTGF5b3V0ICovCi0JCUdyb3VwIG1hcmdpbkdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5Hcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNYXJnaW5zIikpOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luV2lkdGgiKTsKLQkJbWFyZ2luV2lkdGggPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpbldpZHRoLnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luV2lkdGguYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJtYXJnaW5IZWlnaHQiKTsKLQkJbWFyZ2luSGVpZ2h0ID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5IZWlnaHQuc2V0U2VsZWN0aW9uKDApOwotCQltYXJnaW5IZWlnaHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCW1hcmdpbkhlaWdodC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwotCXZvaWQgY3JlYXRlTGF5b3V0KCkgewotCQlzdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotCQlsYXlvdXRDb21wb3NpdGUuc2V0TGF5b3V0KHN0YWNrTGF5b3V0KTsKLQl9Ci0JCi0Jdm9pZCBjcmVhdGVMYXlvdXRDb21wb3NpdGUoKSB7Ci0JCWxheW91dENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobGF5b3V0R3JvdXAsIFNXVC5CT1JERVIpOwotCQlsYXlvdXRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JCWNyZWF0ZUxheW91dCgpOwotCX0KLQkKLQkvKiogCi0JICogRGlzcG9zZXMgdGhlIGVkaXRvcnMgd2l0aG91dCBwbGFjaW5nIHRoZWlyIGNvbnRlbnRzCi0JICogaW50byB0aGUgdGFibGUuCi0JICovCi0Jdm9pZCBkaXNwb3NlRWRpdG9ycygpIHsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yKG51bGwsIG51bGwsIC0xKTsKLQkJY29tYm8uZGlzcG9zZSgpOwotCQluYW1lVGV4dC5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0JU3RyaW5nQnVmZmVyIGdlbmVyYXRlTGF5b3V0Q29kZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNvZGUuYXBwZW5kKCJcdFx0U3RhY2tMYXlvdXQgc3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQgKCk7XG4iKTsKLQkJaWYgKHN0YWNrTGF5b3V0Lm1hcmdpbldpZHRoICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kKCJcdFx0c3RhY2tMYXlvdXQubWFyZ2luV2lkdGggPSAiICsgc3RhY2tMYXlvdXQubWFyZ2luV2lkdGggKyAiO1xuIik7Ci0JCX0KLQkJaWYgKHN0YWNrTGF5b3V0Lm1hcmdpbkhlaWdodCAhPSAwKSB7Ci0JCQljb2RlLmFwcGVuZCgiXHRcdHN0YWNrTGF5b3V0Lm1hcmdpbkhlaWdodCA9ICIgKyBzdGFja0xheW91dC5tYXJnaW5IZWlnaHQgKyAiO1xuIik7Ci0JCX0KLQkJY29kZS5hcHBlbmQoIlx0XHRzaGVsbC5zZXRMYXlvdXQgKHN0YWNrTGF5b3V0KTtcbiIpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuW2ldOwotCQkJY29kZS5hcHBlbmQgKGdldENoaWxkQ29kZShjb250cm9sLCBpKSk7Ci0JCX0KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgY3VycmVudExheWVyICE9IC0xKSB7Ci0JCQljb2RlLmFwcGVuZCgiXG5cdFx0c3RhY2tMYXlvdXQudG9wQ29udHJvbCA9ICIgKyBuYW1lc1tjdXJyZW50TGF5ZXJdICsgIjtcbiIpOwotCQl9Ci0JCXJldHVybiBjb2RlOwotCX0KLQkKLQlib29sZWFuIG5lZWRzQ3VzdG9tKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdG8gaW5zZXJ0IHdoZW4gYSBuZXcgY2hpbGQgY29udHJvbCBpcyBhZGRlZCB0byB0aGUgdGFibGUuCi0JICovCi0JU3RyaW5nW10gZ2V0SW5zZXJ0U3RyaW5nIChTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRyb2xUeXBlKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHtuYW1lLCBjb250cm9sVHlwZX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEgZmllbGQgbmFtZXMuCi0JICovCi0JU3RyaW5nW10gZ2V0TGF5b3V0RGF0YUZpZWxkTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJDb250cm9sIE5hbWUiLCAiQ29udHJvbCBUeXBlIn07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiU3RhY2tMYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0JCWNvbWJvRWRpdG9yLnNldEVkaXRvciAobnVsbCwgbnVsbCwgLTEpOwotCQlpZiAob2xkSXRlbSAhPSBudWxsKSB7Ci0JCQlpbnQgcm93ID0gdGFibGUuaW5kZXhPZiAob2xkSXRlbSk7Ci0JCQl0cnkgewkJCQkKLQkJCQluZXcgU3RyaW5nIChuYW1lVGV4dC5nZXRUZXh0ICgpKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJbmFtZVRleHQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChOQU1FX0NPTCkpOwotCQkJfQotCQkJU3RyaW5nIFtdIGluc2VydCA9IG5ldyBTdHJpbmcgW10ge25hbWVUZXh0LmdldFRleHQgKCksIGNvbWJvLmdldFRleHQgKCl9OwotCQkJZGF0YS5zZXRFbGVtZW50QXQgKGluc2VydCwgcm93KTsKLQkJCWZvciAoaW50IGkgPSAwIDsgaSA8IFRPVEFMX0NPTFM7IGkrKykgewotCQkJCW9sZEl0ZW0uc2V0VGV4dCAoaSwgKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKHJvdykpIFtpXSk7Ci0JCQl9Ci0JCQlpZiAoIXRhYikgZGlzcG9zZUVkaXRvcnMgKCk7Ci0JCX0KLQkJc2V0TGF5b3V0U3RhdGUgKCk7Ci0JCXJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCk7Ci0JCXNldFRvcENvbnRyb2wgKGN1cnJlbnRMYXllcik7Ci0JCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JfQkKLQotCXZvaWQgc2V0VG9wQ29udHJvbCAoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA9PSAtMSB8fCBjaGlsZHJlbi5sZW5ndGggPT0gMCkgewotCQkJY3VycmVudExheWVyID0gLTE7Ci0JCQl0b3BDb250cm9sLnNldFRleHQgKCIiKTsKLQkJfSBlbHNlIHsKLQkJCWN1cnJlbnRMYXllciA9IGluZGV4OwotCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGNoaWxkcmVuIFtjdXJyZW50TGF5ZXJdOwotCQkJbGF5b3V0Q29tcG9zaXRlLmxheW91dCAoKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbShjdXJyZW50TGF5ZXIpOwotCQkJdG9wQ29udHJvbC5zZXRUZXh0IChpdGVtLmdldFRleHQoMCkpOwotCQl9Ci0JCWJhY2tCdXR0b24uc2V0RW5hYmxlZChjaGlsZHJlbi5sZW5ndGggPiAxICYmIGN1cnJlbnRMYXllciA+IDApOwotCQlhZHZhbmNlQnV0dG9uLnNldEVuYWJsZWQoY2hpbGRyZW4ubGVuZ3RoID4gMSAmJiBjdXJyZW50TGF5ZXIgPCBjaGlsZHJlbi5sZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUoKSB7Ci0JCS8qIFNldCB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyAqLwotCQlzdGFja0xheW91dC5tYXJnaW5XaWR0aCA9IG1hcmdpbldpZHRoLmdldFNlbGVjdGlvbigpOwkJCi0JCXN0YWNrTGF5b3V0Lm1hcmdpbkhlaWdodCA9IG1hcmdpbkhlaWdodC5nZXRTZWxlY3Rpb24oKTsJCQotCX0JCi0JCi19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmQ4NDgxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlOwotCi0gCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogPGNvZGU+VGFiPC9jb2RlPiBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBldmVyeSBwYWdlCi0gKiBpbiB0aGUgZXhhbXBsZSdzIHRhYiBmb2xkZXIuICBFYWNoIHBhZ2UgaW4gdGhlIHRhYiBmb2xkZXIKLSAqIGRpc3BsYXlzIGEgbGF5b3V0LCBhbmQgYWxsb3dzIHRoZSB1c2VyIHRvIG1hbmlwdWxhdGUgdGhlCi0gKiBsYXlvdXQuCi0gKgotICogQSB0eXBpY2FsIHBhZ2UgaW4gYSBUYWIgY29udGFpbnMgYSB0d28gY29sdW1uIGNvbXBvc2l0ZS4KLSAqIFRoZSBsZWZ0IGNvbHVtbiBjb250YWlucyB0aGUgbGF5b3V0IGdyb3VwLCB3aGljaCBjb250YWlucwotICogdGhlICJsYXlvdXQgY29tcG9zaXRlIiAodGhlIG9uZSB0aGF0IGhhcyB0aGUgZXhhbXBsZSBsYXlvdXQpLgotICogVGhlIHJpZ2h0IGNvbHVtbiBjb250YWlucyB0aGUgImNvbnRyb2wiIGdyb3VwLiBUaGUgImNvbnRyb2wiCi0gKiBncm91cCBhbGxvd3MgdGhlIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZXhhbXBsZS4gVHlwaWNhbAotICogb3BlcmF0aW9ucyBhcmUgbW9kaWZ5aW5nIGxheW91dCBwYXJhbWV0ZXJzLCBhZGRpbmcgY2hpbGRyZW4KLSAqIHRvIHRoZSAibGF5b3V0IGNvbXBvc2l0ZSIsIGFuZCBtb2RpZnlpbmcgY2hpbGQgbGF5b3V0IGRhdGEuCi0gKiBUaGUgIkNvZGUiIGJ1dHRvbiBpbiB0aGUgImNvbnRyb2wiIGdyb3VwIG9wZW5zIGEgbmV3IHdpbmRvdwotICogY29udGFpbmluZyBjb2RlIHRoYXQgd2lsbCByZWdlbmVyYXRlIHRoZSBsYXlvdXQuIFRoaXMgY29kZQotICogKG9yIHBhcnRzIG9mIGl0KSBjYW4gYmUgc2VsZWN0ZWQgYW5kIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotICovCi1hYnN0cmFjdCBjbGFzcyBUYWIgewkKLQlTaGVsbCBzaGVsbDsKLQlEaXNwbGF5IGRpc3BsYXk7Ci0JLyogQ29tbW9uIGdyb3VwcyBhbmQgY29tcG9zaXRlcyAqLwotCUNvbXBvc2l0ZSB0YWJGb2xkZXJQYWdlOwotCVNhc2hGb3JtIHNhc2g7Ci0JR3JvdXAgbGF5b3V0R3JvdXAsIGNvbnRyb2xHcm91cCwgY2hpbGRHcm91cDsKLQkvKiBUaGUgY29tcG9zaXRlIHRoYXQgY29udGFpbnMgdGhlIGV4YW1wbGUgbGF5b3V0ICovCi0JQ29tcG9zaXRlIGxheW91dENvbXBvc2l0ZTsKLQkvKiBDb21tb24gY29udHJvbHMgZm9yIG1vZGlmeWluZyB0aGUgZXhhbXBsZSBsYXlvdXQgKi8KLQlTdHJpbmcgW10gbmFtZXM7Ci0JQ29udHJvbCBbXSBjaGlsZHJlbjsKLQlUb29sSXRlbSBhZGQsIGRlbGV0ZSwgY2xlYXIsIGNvZGU7Ci0JaW50IHByZXZTZWxlY3RlZCA9IDA7Ci0JLyogQ29tbW9uIHZhbHVlcyBmb3Igd29ya2luZyB3aXRoIFRhYmxlRWRpdG9ycyAqLwotCVRhYmxlIHRhYmxlOwotCWludCBpbmRleDsKLQlib29sZWFuIGNvbWJvUmVzZXQgPSBmYWxzZTsKLQlmaW5hbCBTdHJpbmdbXSBPUFRJT05TID0geyJCdXR0b24iLCAiQ2FudmFzIiwgIkNvbWJvIiwgIkNvbXBvc2l0ZSIsCSJDb29sQmFyIiwgCi0JCQkiR3JvdXAiLCAiTGFiZWwiLCAiTGluayIsICJMaXN0IiwgIlByb2dyZXNzQmFyIiwgIlNjYWxlIiwgIlNsaWRlciIsICJTdHlsZWRUZXh0IiwKLQkJCSJUYWJsZSIsICJUZXh0IiwgIlRvb2xCYXIiLCAiVHJlZSJ9OwotCVRhYmxlSXRlbSBuZXdJdGVtLCBsYXN0U2VsZWN0ZWQ7Ci0JVmVjdG9yIGRhdGEgPSBuZXcgVmVjdG9yICgpOwotCS8qIENvbnRyb2xsaW5nIGluc3RhbmNlICovCi0JZmluYWwgTGF5b3V0RXhhbXBsZSBpbnN0YW5jZTsKLQotCS8qIExpc3RlbmVycyAqLwotCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJcmVzZXRFZGl0b3JzICgpOwotCQl9Ci0JfTsKLQkJCi0JVHJhdmVyc2VMaXN0ZW5lciB0cmF2ZXJzZUxpc3RlbmVyID0gbmV3IFRyYXZlcnNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQgKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIExheW91dEV4YW1wbGUuCi0JICovCi0JVGFiKExheW91dEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiY2hpbGRyZW4iIGdyb3VwLiBUaGlzIGlzIHRoZSBncm91cCB0aGF0IGFsbG93cwotCSAqIHlvdSB0byBhZGQgY2hpbGRyZW4gdG8gdGhlIGxheW91dC4gSXQgZXhpc3RzIHdpdGhpbiB0aGUKLQkgKiBjb250cm9sR3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZEdyb3VwICgpIHsKLQkJY2hpbGRHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNoaWxkR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2hpbGRyZW4iKSk7Ci0JCWNoaWxkR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJY2hpbGRHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7IAotCi0JCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKGNoaWxkR3JvdXAsIFNXVC5GTEFUKTsJCi0JCXRvb2xCYXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWFkZCA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJYWRkLnNldFRleHQoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQWRkIikpOwkKLQkJYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0JCQkJCVRvb2xJdGVtIGl0ZW0gPSAoVG9vbEl0ZW0pZXZlbnQud2lkZ2V0OwotCQkJCQlUb29sQmFyIGJhciA9IGl0ZW0uZ2V0UGFyZW50ICgpOwotCQkJCQlmaW5hbCBNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IE9QVElPTlMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWZpbmFsIE1lbnVJdGVtIG5ld0l0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5SQURJTyk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQgKE9QVElPTlMgW2ldKTsJCQkJCQkKLQkJCQkJCW5ld0l0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSAoTWVudUl0ZW0pZXZlbnQud2lkZ2V0OwotCQkJCQkJCQlpZiAobWVudUl0ZW0uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQkJCQkJCQlNZW51IG1lbnUgID0gbWVudUl0ZW0uZ2V0UGFyZW50ICgpOwotCQkJCQkJCQkJcHJldlNlbGVjdGVkID0gbWVudS5pbmRleE9mIChtZW51SXRlbSk7Ci0JCQkJCQkJCQlTdHJpbmcgY29udHJvbFR5cGUgPSBtZW51SXRlbS5nZXRUZXh0ICgpOwotCQkJCQkJCQkJU3RyaW5nIG5hbWUgPSBjb250cm9sVHlwZS50b0xvd2VyQ2FzZSAoKSArIFN0cmluZy52YWx1ZU9mICh0YWJsZS5nZXRJdGVtQ291bnQgKCkpOwotCQkJCQkJCQkJU3RyaW5nIFtdIGluc2VydCA9IGdldEluc2VydFN0cmluZyAobmFtZSwgY29udHJvbFR5cGUpOwotCQkJCQkJCQkJaWYgKGluc2VydCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQkJCQkJCWl0ZW0uc2V0VGV4dCAoaW5zZXJ0KTsKLQkJCQkJCQkJCQlkYXRhLmFkZEVsZW1lbnQgKGluc2VydCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsJCQkJCQkJCi0JCQkJCQluZXdJdGVtLnNldFNlbGVjdGlvbiAoaSA9PSBwcmV2U2VsZWN0ZWQpOwotCQkJCQl9Ci0JCQkJCVBvaW50IHB0ID0gZGlzcGxheS5tYXAgKGJhciwgbnVsbCwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCW1lbnUuc2V0TG9jYXRpb24gKHB0LngsIHB0LnkpOwotCQkJCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJCQkKLQkJCQkJd2hpbGUgKG1lbnUgIT0gbnVsbCAmJiAhbWVudS5pc0Rpc3Bvc2VkICgpICYmIG1lbnUuaXNWaXNpYmxlICgpKSB7Ci0JCQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSB7Ci0JCQkJCQkJZGlzcGxheS5zbGVlcCAoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQltZW51LmRpc3Bvc2UgKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIGNvbnRyb2xUeXBlID0gT1BUSU9OUyBbcHJldlNlbGVjdGVkXTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBjb250cm9sVHlwZS50b0xvd2VyQ2FzZSAoKSArIFN0cmluZy52YWx1ZU9mICh0YWJsZS5nZXRJdGVtQ291bnQgKCkpOwotCQkJCQlTdHJpbmcgW10gaW5zZXJ0ID0gZ2V0SW5zZXJ0U3RyaW5nIChuYW1lLCBjb250cm9sVHlwZSk7Ci0JCQkJCWlmIChpbnNlcnQgIT0gbnVsbCkgewotCQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCQkJCQlpdGVtLnNldFRleHQgKGluc2VydCk7Ci0JCQkJCQlkYXRhLmFkZEVsZW1lbnQgKGluc2VydCk7Ci0JCQkJCX0KLQkJCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IFRvb2xJdGVtKHRvb2xCYXIsU1dULlNFUEFSQVRPUik7Ci0KLQkJZGVsZXRlID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJZGVsZXRlLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJEZWxldGUiKSk7Ci0JCWRlbGV0ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJaW50IFtdIHNlbGVjdGVkID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcyAoKTsKLQkJCQl0YWJsZS5yZW1vdmUgKHNlbGVjdGVkKTsKLQkJCQkvKiBSZWZyZXNoIHRoZSBjb250cm9sIGluZGljZXMgb2YgdGhlIHRhYmxlICovCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZS5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJCWl0ZW0uc2V0VGV4dCAoMCwgaXRlbS5nZXRUZXh0ICgwKSk7Ci0JCQkJfQotCQkJCXJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCk7Ci0JCQkJbGF5b3V0Q29tcG9zaXRlLmxheW91dCAodHJ1ZSk7Ci0JCQkJbGF5b3V0R3JvdXAubGF5b3V0ICh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQluZXcgVG9vbEl0ZW0odG9vbEJhcixTV1QuU0VQQVJBVE9SKTsKLQkJY2xlYXIgPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQljbGVhci5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2xlYXIiKSk7Ci0JCWNsZWFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQljaGlsZHJlbiA9IGxheW91dENvbXBvc2l0ZS5nZXRDaGlsZHJlbiAoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWNoaWxkcmVuIFtpXS5kaXNwb3NlICgpOwotCQkJCX0KLQkJCQl0YWJsZS5yZW1vdmVBbGwgKCk7Ci0JCQkJZGF0YS5jbGVhciAoKTsKLQkJCQljaGlsZHJlbiA9IG5ldyBDb250cm9sIFswXTsKLQkJCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCQkJfQotCQl9KTsKLQkJdG9vbEJhci5wYWNrKCk7Ci0JCQotCQluZXcgVG9vbEl0ZW0gKHRvb2xCYXIsU1dULlNFUEFSQVRPUik7Ci0JCWNvZGUgPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJY29kZS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiR2VuZXJhdGVfQ29kZSIpKTsKLQkJY29kZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwkKLQkJCQlzaGVsbC5zZXRUZXh0KExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdlbmVyYXRlZF9Db2RlIikpOwotCQkJCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQkJU3RyaW5nIGxheW91dENvZGUgPSBnZW5lcmF0ZUNvZGUoKS50b1N0cmluZyAoKTsKLQkJCQlpZiAobGF5b3V0Q29kZS5sZW5ndGgoKSA9PSAwKSByZXR1cm47Ci0JCQkJdGV4dC5zZXRUZXh0KGxheW91dENvZGUpOwotCQkJCQotCQkJCU1lbnUgYmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQkJCXNoZWxsLnNldE1lbnVCYXIoYmFyKTsKLQkJCQlNZW51SXRlbSBlZGl0SXRlbSA9IG5ldyBNZW51SXRlbShiYXIsIFNXVC5DQVNDQURFKTsKLQkJCQllZGl0SXRlbS5zZXRUZXh0KExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkVkaXQiKSk7Ci0JCQkJTWVudSBtZW51ID0gbmV3IE1lbnUoYmFyKTsKLQkJCQlNZW51SXRlbSBzZWxlY3QgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJCXNlbGVjdC5zZXRUZXh0KExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNlbGVjdF9BbGwiKSk7Ci0JCQkJc2VsZWN0LnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0EnKTsKLQkJCQlzZWxlY3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlNZW51SXRlbSBjb3B5ID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQkJCQljb3B5LnNldFRleHQoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ29weSIpKTsKLQkJCQljb3B5LnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0MnKTsKLQkJCQljb3B5LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQl0ZXh0LmNvcHkoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCU1lbnVJdGVtIGV4aXQgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJCWV4aXQuc2V0VGV4dChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJFeGl0IikpOwotCQkJCWV4aXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQllZGl0SXRlbS5zZXRNZW51KG1lbnUpOwotCQkJCQotCQkJCXNoZWxsLnBhY2soKTsKLQkJCQlzaGVsbC5zZXRTaXplKDUwMCwgNjAwKTsKLQkJCQlzaGVsbC5vcGVuKCk7Ci0JCQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkKLQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQljcmVhdGVDaGlsZFdpZGdldHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbHMgZm9yIG1vZGlmeWluZyB0aGUgImNoaWxkcmVuIiAKLQkgKiB0YWJsZSwgYW5kIHRoZSB0YWJsZSBpdHNlbGYuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhdWdtZW50IHRoZQotCSAqIHN0YW5kYXJkIHRhYmxlLgotCSAqLwotCXZvaWQgY3JlYXRlQ2hpbGRXaWRnZXRzKCkgewotCQkvKiBDcmVhdGUgdGhlICJjaGlsZHJlbiIgdGFibGUgKi8KLQkJdGFibGUgPSBuZXcgVGFibGUgKGNoaWxkR3JvdXAsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSElERV9TRUxFQ1RJT04pOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQkJRm9udERhdGEgZGVmW10gPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpOwotCQl0YWJsZS5zZXRGb250KG5ldyBGb250KGRpc3BsYXksIGRlZlswXS5nZXROYW1lKCksIDEwLCBTV1QuTk9ORSkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDMsIDEpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhIChncmlkRGF0YSk7Ci0JCXRhYmxlLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQkKLQkJLyogQWRkIGNvbHVtbnMgdG8gdGhlIHRhYmxlICovCi0JCVN0cmluZyBbXSBjb2x1bW5IZWFkZXJzID0gZ2V0TGF5b3V0RGF0YUZpZWxkTmFtZXMgKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uSGVhZGVycy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQljb2x1bW4uc2V0VGV4dCAoY29sdW1uSGVhZGVycyBbaV0pOwotCQkJaWYgKGkgPT0gMCkgY29sdW1uLnNldFdpZHRoICgxMDApOwotCQkJZWxzZSBpZiAoaSA9PSAxKSBjb2x1bW4uc2V0V2lkdGggKDkwKTsKLQkJCWVsc2UgY29sdW1uLnBhY2sgKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWJsZUVkaXRvciB3aXRoIGEgQ0NvbWJvIGluIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBvZiB0aGUgdGFibGUuIFRoaXMgQ0NvbWJvIGxpc3RzIGFsbCB0aGUgY29udHJvbHMgdGhhdAotCSAqIHRoZSB1c2VyIGNhbiBzZWxlY3QgdG8gcGxhY2Ugb24gdGhlaXIgbGF5b3V0LgotCSAqLwotCXZvaWQgY3JlYXRlQ29tYm9FZGl0b3IgKENDb21ibyBjb21ibywgVGFibGVFZGl0b3IgY29tYm9FZGl0b3IpIHsKLQkJY29tYm8uc2V0SXRlbXMgKE9QVElPTlMpOwotCQljb21iby5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKDEpKTsKLQkJCi0JCS8qIFNldCB1cCBlZGl0b3IgKi8KLQkJY29tYm9FZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQljb21ib0VkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWNvbWJvRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQljb21ib0VkaXRvci5zZXRFZGl0b3IgKGNvbWJvLCBuZXdJdGVtLCAxKTsKLQkJCi0JCS8qIEFkZCBsaXN0ZW5lciAqLwotCQljb21iby5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotICAgICAgICAJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotICAgICAgICAgICAgCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQgfHwgZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotICAgICAgICAgICAgCQljb21ib1Jlc2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmVzZXRFZGl0b3JzICgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRSkgewotICAgICAgICAgICAgICAgIAlkaXNwb3NlRWRpdG9ycyAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiY29udHJvbCIgZ3JvdXAuIFRoaXMgaXMgdGhlIGdyb3VwIG9uIHRoZQotCSAqIHJpZ2h0IGhhbGYgb2YgZWFjaCBleGFtcGxlIHRhYi4gSXQgY29udGFpbnMgY29udHJvbHMKLQkgKiBmb3IgYWRkaW5nIG5ldyBjaGlsZHJlbiB0byB0aGUgbGF5b3V0Q29tcG9zaXRlLCBhbmQKLQkgKiBmb3IgbW9kaWZ5aW5nIHRoZSBjaGlsZHJlbidzIGxheW91dCBkYXRhLgotCSAqLwkKLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCWNvbnRyb2xHcm91cCA9IG5ldyBHcm91cCAoc2FzaCwgU1dULk5PTkUpOwotCQljb250cm9sR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFyYW1ldGVycyIpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoMiwgdHJ1ZSk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDEwOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0IChsYXlvdXQpOwotCQlmaW5hbCBCdXR0b24gcHJlZmVycmVkQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29udHJvbEdyb3VwLCBTV1QuQ0hFQ0spOwotCQlwcmVmZXJyZWRCdXR0b24uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlByZWZlcnJlZF9TaXplIikpOwotCQlwcmVmZXJyZWRCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCXByZWZlcnJlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSlsYXlvdXRDb21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCWlmIChwcmVmZXJyZWRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQkJCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU1dULkRFRkFVTFQ7CQotCQkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gMDsKLQkJCQkJZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJCQkJZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQkJfQotCQkJCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCQkJfQotCQl9KTsKLQkJcHJlZmVycmVkQnV0dG9uLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKSk7CQotCQljcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQl9Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJjb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhdWdtZW50Ci0JICogdGhlIHN0YW5kYXJkIGNvbnRyb2xzIGNyZWF0ZWQuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCWNyZWF0ZUNoaWxkR3JvdXAgKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXQgKCkgewotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb21wb3NpdGUgdGhhdCBjb250YWlucyB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXRDb21wb3NpdGUgKCkgewotCQlsYXlvdXRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChsYXlvdXRHcm91cCwgU1dULkJPUkRFUik7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQljcmVhdGVMYXlvdXQgKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxheW91dCBncm91cC4gVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JICogbGVmdCBoYWxmIG9mIGVhY2ggZXhhbXBsZSB0YWIuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXRHcm91cCAoKSB7Ci0JCWxheW91dEdyb3VwID0gbmV3IEdyb3VwIChzYXNoLCBTV1QuTk9ORSk7Ci0JCWxheW91dEdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxheW91dCIpKTsKLQkJbGF5b3V0R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWNyZWF0ZUxheW91dENvbXBvc2l0ZSAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQkvKiBDYWNoZSB0aGUgc2hlbGwgYW5kIGRpc3BsYXkuICovCi0JCXNoZWxsID0gdGFiRm9sZGVyLmdldFNoZWxsICgpOwotCQlkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSAoKTsKLQotCQkvKiBDcmVhdGUgYSB0d28gY29sdW1uIHBhZ2Ugd2l0aCBhIFNhc2hGb3JtKi8KLQkJdGFiRm9sZGVyUGFnZSA9IG5ldyBDb21wb3NpdGUgKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQl0YWJGb2xkZXJQYWdlLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdGFiRm9sZGVyUGFnZS5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQkJc2FzaCA9IG5ldyBTYXNoRm9ybSAodGFiRm9sZGVyUGFnZSwgU1dULkhPUklaT05UQUwpOwotCQotCQkvKiBDcmVhdGUgdGhlICJsYXlvdXQiIGFuZCAiY29udHJvbCIgY29sdW1ucyAqLwotCQljcmVhdGVMYXlvdXRHcm91cCAoKTsKLQkJY3JlYXRlQ29udHJvbEdyb3VwICgpOwotCQkKLQkJc2FzaC5zZXRXZWlnaHRzKHNhc2hXZWlnaHRzICgpKTsJCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbml0aWFsIHdlaWdodCBvZiB0aGUgbGF5b3V0IGFuZCBjb250cm9sIGdyb3VwcyB3aXRoaW4gdGhlIFNhc2hGb3JtLgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgdGFiLXNwZWNpZmljIHdlaWdodHMuCi0JICogQHJldHVybiB0aGUgZGVzaXJlZCBzYXNoIHdlaWdodHMgZm9yIHRoZSB0YWIgcGFnZQotCSAqLwotCWludFtdIHNhc2hXZWlnaHRzICgpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7NTAsIDUwfTsJCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYmxlRWRpdG9yIHdpdGggYSBUZXh0IGluIHRoZSBnaXZlbiBjb2x1bW4KLQkgKiBvZiB0aGUgdGFibGUuCi0JICovCi0Jdm9pZCBjcmVhdGVUZXh0RWRpdG9yIChUZXh0IHRleHQsIFRhYmxlRWRpdG9yIHRleHRFZGl0b3IsIGludCBjb2x1bW4pIHsKLQkJdGV4dC5zZXRGb250ICh0YWJsZS5nZXRGb250ICgpKTsKLQkJdGV4dC5zZWxlY3RBbGwgKCk7Ci0JCXRleHRFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQl0ZXh0RWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJdGV4dEVkaXRvci5zZXRFZGl0b3IgKHRleHQsIG5ld0l0ZW0sIGNvbHVtbik7Ci0JCQotCQl0ZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgewotICAgICAgICAgICAgICAgICAgICByZXNldEVkaXRvcnMgKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRSkgewotICAgICAgICAgICAgICAgIAlkaXNwb3NlRWRpdG9ycyAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCX0KLQkKLQkvKiogCi0JICogRGlzcG9zZXMgdGhlIGVkaXRvcnMgd2l0aG91dCBwbGFjaW5nIHRoZWlyIGNvbnRlbnRzCi0JICogaW50byB0aGUgdGFibGUuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFZGl0b3JzICgpIHsKLQl9Ci0JCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBjb2RlIG5lZWRlZCB0byBwcm9kdWNlIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8JCi0JU3RyaW5nQnVmZmVyIGdlbmVyYXRlQ29kZSAoKSB7Ci0JCS8qIE1ha2Ugc3VyZSBhbGwgaW5mb3JtYXRpb24gYmVpbmcgZW50ZXJlZCBpcyBzdG9yZWQgaW4gdGhlIHRhYmxlICovCi0JCXJlc2V0RWRpdG9ycyAoKTsKLQkJCi0JCS8qIEdldCBuYW1lcyBmb3IgY29udHJvbHMgaW4gdGhlIGxheW91dCAqLwotCQluYW1lcyA9IG5ldyBTdHJpbmcgW2NoaWxkcmVuLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBteUl0ZW0gPSB0YWJsZS5nZXRJdGVtKGkpOwotCQkJU3RyaW5nIG5hbWUgPSBteUl0ZW0uZ2V0VGV4dCgwKTsKLQkJCWlmIChuYW1lLm1hdGNoZXMoIlxcZCIpKSB7Ci0JCQkJQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW4gW2ldOwotCQkJCVN0cmluZyBjb250cm9sQ2xhc3MgPSBjb250cm9sLmdldENsYXNzICgpLnRvU3RyaW5nICgpOwotCQkJCVN0cmluZyBjb250cm9sVHlwZSA9IGNvbnRyb2xDbGFzcy5zdWJzdHJpbmcgKGNvbnRyb2xDbGFzcy5sYXN0SW5kZXhPZiAoJy4nKSArIDEpOwotCQkJCW5hbWVzIFtpXSA9IGNvbnRyb2xUeXBlLnRvTG93ZXJDYXNlICgpICsgaTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZXMgW2ldID0gbXlJdGVtLmdldFRleHQoMCk7Ci0JCQl9CQotCQl9Ci0JCi0JCS8qIENyZWF0ZSBTdHJpbmdCdWZmZXIgY29udGFpbmluZyB0aGUgY29kZSAqLwotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JCWNvZGUuYXBwZW5kICgiaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qO1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjtcbiIpOwotCQljb2RlLmFwcGVuZCAoImltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qO1xuIik7Ci0JCWlmIChuZWVkc0N1c3RvbSAoKSkgY29kZS5hcHBlbmQgKCJpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qO1xuIik7Ci0JCWlmIChuZWVkc0dyYXBoaWNzICgpKSBjb2RlLmFwcGVuZCAoImltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjtcbiIpOwotCQljb2RlLmFwcGVuZCAoIlxuIik7Ci0JCWNvZGUuYXBwZW5kICgicHVibGljIGNsYXNzIE15TGF5b3V0IHtcbiIpOwotCQljb2RlLmFwcGVuZCAoIlx0cHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0RGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0U2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpO1xuIik7Ci0JCQotCQkvKiBHZXQgbGF5b3V0IHNwZWNpZmljIGNvZGUgKi8KLQkJY29kZS5hcHBlbmQgKGdlbmVyYXRlTGF5b3V0Q29kZSAoKSk7Ci0JCQotCQljb2RlLmFwcGVuZCAoIlxuXHRcdHNoZWxsLnBhY2sgKCk7XG5cdFx0c2hlbGwub3BlbiAoKTtcblxuIik7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkge1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdFx0aWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSlcbiIpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRcdFx0ZGlzcGxheS5zbGVlcCAoKTtcblx0XHR9XG5cdFx0ZGlzcGxheS5kaXNwb3NlICgpO1xuXHR9XG59Iik7Ci0JCQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCi0JYm9vbGVhbiBuZWVkc0dyYXBoaWNzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JYm9vbGVhbiBuZWVkc0N1c3RvbSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyBsYXlvdXQgc3BlY2lmaWMgY29kZSBmb3IgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JU3RyaW5nQnVmZmVyIGdlbmVyYXRlTGF5b3V0Q29kZSAoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyICgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTdHJpbmdCdWZmZXIgZm9yIHRoZSBjb2RlIHdoaWNoIHdpbGwgCi0JICogY3JlYXRlIGEgY2hpbGQgY29udHJvbC4KLQkgKi8KLQlTdHJpbmdCdWZmZXIgZ2V0Q2hpbGRDb2RlIChDb250cm9sIGNvbnRyb2wsIGludCBpKSB7Ci0JCVN0cmluZ0J1ZmZlciBjb2RlID0gbmV3IFN0cmluZ0J1ZmZlciAoKTsKLQkJLyogRmluZCB0aGUgdHlwZSBvZiBjb250cm9sICovCi0JCVN0cmluZyBjb250cm9sQ2xhc3MgPSBjb250cm9sLmdldENsYXNzKCkudG9TdHJpbmcgKCk7Ci0JCVN0cmluZyBjb250cm9sVHlwZSA9IGNvbnRyb2xDbGFzcy5zdWJzdHJpbmcgKGNvbnRyb2xDbGFzcy5sYXN0SW5kZXhPZiAoJy4nKSArIDEpOwotCQkvKiBGaW5kIHRoZSBzdHlsZSBvZiB0aGUgY29udHJvbCAqLwotCQlTdHJpbmcgc3R5bGVTdHJpbmc7Ci0JCWlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJCdXR0b24iKSkgewotCQkJc3R5bGVTdHJpbmcgPSAiU1dULlBVU0giOwotCQl9IGVsc2UgaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIlN0eWxlZFRleHQiKSkgewotCQkJc3R5bGVTdHJpbmcgPSAiU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCI7Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiQ2FudmFzIikgfHwgY29udHJvbFR5cGUuZXF1YWxzICgiQ29tcG9zaXRlIikgfHwgCi0JCQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIlRhYmxlIikgfHwgY29udHJvbFR5cGUuZXF1YWxzICgiU3R5bGVkVGV4dCIpIHx8Ci0JCQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIlRvb2xCYXIiKSB8fCBjb250cm9sVHlwZS5lcXVhbHMgKCJUcmVlIikgfHwKLQkJCQkJY29udHJvbFR5cGUuZXF1YWxzICgiTGlzdCIpIHx8IGNvbnRyb2xUeXBlLmVxdWFscyAoIlRleHQiKSkgewotCQkJc3R5bGVTdHJpbmcgPSAiU1dULkJPUkRFUiI7Ci0JCX0gZWxzZSBzdHlsZVN0cmluZyA9ICJTV1QuTk9ORSI7Ci0JCS8qIFdyaXRlIG91dCB0aGUgY29udHJvbCBiZWluZyBkZWNsYXJlZCAqLwotCQljb2RlLmFwcGVuZCAoIlxuXHRcdCIgKyBjb250cm9sVHlwZSArICIgIiArIG5hbWVzIFtpXSArIAotCQkJCQkgIiA9IG5ldyAiICsgY29udHJvbFR5cGUgKyAiIChzaGVsbCwgIiArIHN0eWxlU3RyaW5nICsgIik7XG4iKTsKLQkJLyogQWRkIGl0ZW1zIHRvIHRob3NlIGNvbnRyb2xzIHRoYXQgbmVlZCBpdGVtcyAqLwotCQlpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiQ29tYm8iKSB8fCBjb250cm9sVHlwZS5lcXVhbHMgKCJMaXN0IikpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHtcIkl0ZW0gMVwiLCBcIkl0ZW0gMlwiLCBcIkl0ZW0gMlwifSk7XG4iKTsKLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJUYWJsZSIpKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHQiICsgbmFtZXMgW2ldICsgIi5zZXRMaW5lc1Zpc2libGUgKHRydWUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykge1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0XHR0YWJsZUl0ZW0uc2V0VGV4dCAoXCJJdGVtXCIgKyBpKTtcblx0XHR9XG4iKTsKLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJUcmVlIikpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdFRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtICgiICsgbmFtZXMgW2ldICsgIiwgU1dULk5PTkUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRcdHRyZWVJdGVtLnNldFRleHQgKFwiSXRlbVwiICsgaSk7XG5cdFx0fVxuIik7Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiVG9vbEJhciIpKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykge1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRUb29sSXRlbSB0b29sSXRlbSA9IG5ldyBUb29sSXRlbSAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0XHR0b29sSXRlbS5zZXRUZXh0IChcIkl0ZW1cIiArIGkpO1xuXHRcdH1cbiIpOwotCQl9IGVsc2UgaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIkNvb2xCYXIiKSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0VG9vbEJhciBjb29sVG9vbEJhciA9IG5ldyBUb29sQmFyICgiICsgbmFtZXMgW2ldICsgIiwgU1dULkJPUkRFUik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdFRvb2xJdGVtIGNvb2xUb29sSXRlbSA9IG5ldyBUb29sSXRlbSAoY29vbFRvb2xCYXIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xJdGVtLnNldFRleHQgKFwiSXRlbSAxXCIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGNvb2xUb29sQmFyLCBTV1QuTk9ORSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbS5zZXRUZXh0IChcIkl0ZW0gMlwiKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Q29vbEl0ZW0gY29vbEl0ZW0xID0gbmV3IENvb2xJdGVtICgiICsgbmFtZXMgW2ldICsgIiwgU1dULk5PTkUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sSXRlbTEuc2V0Q29udHJvbCAoY29vbFRvb2xCYXIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRQb2ludCBzaXplID0gY29vbFRvb2xCYXIuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xJdGVtMS5zZXRTaXplIChjb29sSXRlbTEuY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sQmFyID0gbmV3IFRvb2xCYXIgKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuQk9SREVSKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtIChjb29sVG9vbEJhciwgU1dULk5PTkUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0uc2V0VGV4dCAoXCJJdGVtIDNcIik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbSA9IG5ldyBUb29sSXRlbSAoY29vbFRvb2xCYXIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xJdGVtLnNldFRleHQgKFwiSXRlbSA0XCIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRDb29sSXRlbSBjb29sSXRlbTIgPSBuZXcgQ29vbEl0ZW0gKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuTk9ORSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xJdGVtMi5zZXRDb250cm9sIChjb29sVG9vbEJhcik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHNpemUgPSBjb29sVG9vbEJhci5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbEl0ZW0yLnNldFNpemUgKGNvb2xJdGVtMi5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0U2l6ZSAoIiArIG5hbWVzIFtpXSArICIuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpO1xuIik7Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiUHJvZ3Jlc3NCYXIiKSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0U2VsZWN0aW9uICg1MCk7XG4iKTsKLQkJfSAKLQkJLyogU2V0IHRleHQgZm9yIHRob3NlIGNvbnRyb2xzIHRoYXQgc3VwcG9ydCBpdCAqLwkJCSAKLQkJaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIkJ1dHRvbiIpIHx8Ci0JCQljb250cm9sVHlwZS5lcXVhbHMgKCJDb21ibyIpIHx8Ci0JCQljb250cm9sVHlwZS5lcXVhbHMgKCJHcm91cCIpIHx8Ci0JCQljb250cm9sVHlwZS5lcXVhbHMgKCJMYWJlbCIpIHx8Ci0JCQljb250cm9sVHlwZS5lcXVhbHMgKCJMaW5rIikgfHwKLQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIlN0eWxlZFRleHQiKSB8fAotCQkJY29udHJvbFR5cGUuZXF1YWxzICgiVGV4dCIpKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHQiICsgbmFtZXMgW2ldICsgIi5zZXRUZXh0IChcIiIgKyBuYW1lcyBbaV0gKyAiXCIpO1xuIik7Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHRvIGluc2VydCB3aGVuIGEgbmV3IGNoaWxkIGNvbnRyb2wgaXMgYWRkZWQgdG8gdGhlIHRhYmxlLgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JU3RyaW5nW10gZ2V0SW5zZXJ0U3RyaW5nIChTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRyb2xUeXBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JU3RyaW5nIFtdIGdldExheW91dERhdGFGaWVsZE5hbWVzICgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10ge307Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjb21wb3NpdGUgYW5kIGRyYXdzIGFsbCBjb250cm9scwotCSAqIGluIHRoZSBsYXlvdXQgZXhhbXBsZS4KLQkgKi8KLQl2b2lkIHJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCkgewotCQkvKiBSZW1vdmUgY2hpbGRyZW4gdGhhdCBhcmUgYWxyZWFkeSBsYWlkIG91dCAqLwotCQljaGlsZHJlbiA9IGxheW91dENvbXBvc2l0ZS5nZXRDaGlsZHJlbiAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJY2hpbGRyZW4gW2ldLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJLyogQWRkIGFsbCBjaGlsZHJlbiBsaXN0ZWQgaW4gdGhlIHRhYmxlICovCi0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCQljaGlsZHJlbiA9IG5ldyBDb250cm9sIFtpdGVtcy5sZW5ndGhdOwotCQlTdHJpbmcgW10gaXRlbVZhbHVlcyA9IG5ldyBTdHJpbmcgW10gewotCQkJTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLCBuZXcgU3RyaW5nIFtdIHsiMSJ9KSwKLQkJCUxheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIiwgbmV3IFN0cmluZyBbXSB7IjIifSksCi0JCQlMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsIG5ldyBTdHJpbmcgW10geyIzIn0pfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGNvbnRyb2wgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoMSk7Ci0JCQlTdHJpbmcgY29udHJvbE5hbWUgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoMCk7Ci0JCQlpZiAoY29udHJvbC5lcXVhbHMgKCJCdXR0b24iKSkgewotCQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChsYXlvdXRDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJCQlidXR0b24uc2V0VGV4dCAoY29udHJvbE5hbWUpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGJ1dHRvbjsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJDYW52YXMiKSkgewotCQkJCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzIChsYXlvdXRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGNhbnZhczsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJDb21ibyIpKSB7Ci0JCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWNvbWJvLnNldEl0ZW1zIChpdGVtVmFsdWVzKTsKLQkJCQljb21iby5zZXRUZXh0IChjb250cm9sTmFtZSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gY29tYm87Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiQ29tcG9zaXRlIikpIHsgCi0JCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKGxheW91dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJY2hpbGRyZW4gW2ldID0gY29tcG9zaXRlOwotCQkgICAgfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIkNvb2xCYXIiKSkgeyAKLQkJICAgIAlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhciAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCSAgICAJVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKGNvb2xCYXIsIFNXVC5CT1JERVIpOwotCQkJCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIDApOwotCQkJCWl0ZW0uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIxIn0pKTsKLQkJCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCAwKTsKLQkJCQlpdGVtLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMiJ9KSk7Ci0JCSAgICAJQ29vbEl0ZW0gY29vbEl0ZW0xID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCAwKTsKLQkJICAgIAljb29sSXRlbTEuc2V0Q29udHJvbCAodG9vbEJhcik7Ci0JCQkJdG9vbEJhciA9IG5ldyBUb29sQmFyIChjb29sQmFyLCBTV1QuQk9SREVSKTsKLQkJCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCAwKTsKLQkJCQlpdGVtLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMyJ9KSk7Ci0JCQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjQifSkpOwotCQkgICAgCUNvb2xJdGVtIGNvb2xJdGVtMiA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgMCk7Ci0JCSAgICAJY29vbEl0ZW0yLnNldENvbnRyb2wgKHRvb2xCYXIpOwotCQkgICAgCVBvaW50IHNpemUgPSB0b29sQmFyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgICAgIAkJY29vbEl0ZW0xLnNldFNpemUoY29vbEl0ZW0xLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSkpOwotICAgICAgICAJCWNvb2xJdGVtMi5zZXRTaXplKGNvb2xJdGVtMi5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpKTsKLSAgICAgICAJCQljb29sQmFyLnNldFNpemUoY29vbEJhci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBjb29sQmFyOwotCQkgICAgfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIkdyb3VwIikpIHsKLQkJCQlHcm91cCBncm91cCA9IG5ldyBHcm91cCAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJZ3JvdXAuc2V0VGV4dCAoY29udHJvbE5hbWUpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGdyb3VwOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIkxhYmVsIikpIHsKLQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJbGFiZWwuc2V0VGV4dCAoY29udHJvbE5hbWUpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGxhYmVsOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIkxpbmsiKSkgewotCQkJCUxpbmsgbGluayA9IG5ldyBMaW5rIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQlsaW5rLnNldFRleHQgKGNvbnRyb2xOYW1lKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBsaW5rOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIkxpc3QiKSkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBMaXN0IChsYXlvdXRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJCWxpc3Quc2V0SXRlbXMgKGl0ZW1WYWx1ZXMpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGxpc3Q7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiUHJvZ3Jlc3NCYXIiKSkgewotCQkJCVByb2dyZXNzQmFyIHByb2dyZXNzID0gbmV3IFByb2dyZXNzQmFyIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQlwcm9ncmVzcy5zZXRTZWxlY3Rpb24gKDUwKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBwcm9ncmVzczsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJTY2FsZSIpKSB7Ci0JCQkJU2NhbGUgc2NhbGUgPSBuZXcgU2NhbGUgKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWNoaWxkcmVuIFtpXSA9IHNjYWxlOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlNsaWRlciIpKSB7Ci0JCQkJU2xpZGVyIHNsaWRlciA9IG5ldyBTbGlkZXIgKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWNoaWxkcmVuIFtpXSA9IHNsaWRlcjsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJTdHlsZWRUZXh0IikpIHsKLQkJCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dCAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJCQlzdHlsZWRUZXh0LnNldFRleHQgKGNvbnRyb2xOYW1lKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBzdHlsZWRUZXh0OwkJCQotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlRhYmxlIikpIHsKLQkJCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCQkJCVRhYmxlSXRlbSBpdGVtMSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJCQlpdGVtMS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjEifSkpOwotCQkJCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJCQlpdGVtMi5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjIifSkpOwotCQkJCWNoaWxkcmVuIFtpXSA9IHRhYmxlOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlRleHQiKSkgewotCQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0IChsYXlvdXRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJCXRleHQuc2V0VGV4dCAoY29udHJvbE5hbWUpOwotCQkJCWNoaWxkcmVuIFtpXSA9IHRleHQ7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiVG9vbEJhciIpKSB7Ci0JCQkJVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKGxheW91dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJVG9vbEl0ZW0gaXRlbTEgPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIDApOwotCQkJCWl0ZW0xLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMSJ9KSk7Ci0JCQkJVG9vbEl0ZW0gaXRlbTIgPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIDApOwotCQkJCWl0ZW0yLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMiJ9KSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gdG9vbEJhcjsKLQkJCX0gZWxzZSB7Ci0JCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUgKGxheW91dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIDApOwotCQkJCWl0ZW0xLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMSJ9KSk7Ci0JCQkJVHJlZUl0ZW0gaXRlbTIgPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIDApOwotCQkJCWl0ZW0yLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMiJ9KSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gdHJlZTsKLQkJCX0gCi0JCX0KLQl9CQotCQotCXZvaWQgcmVzZXRFZGl0b3JzICgpIHsKLQkJcmVzZXRFZGl0b3JzIChmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRha2VzIGluZm9ybWF0aW9uIGZyb20gVGFibGVFZGl0b3JzIGFuZCBzdG9yZXMgaXQuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQl2b2lkIHJlc2V0RWRpdG9ycyAoYm9vbGVhbiB0YWIpIHsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGF5b3V0LiAKLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgc2V0TGF5b3V0RGF0YSAoKSB7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBsYXlvdXQuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQl2b2lkIHNldExheW91dFN0YXRlICgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9BaXJicnVzaFRvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0FpcmJydXNoVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJjNmY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0FpcmJydXNoVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBbiBhaXJicnVzaCB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgQWlyYnJ1c2hUb29sIGV4dGVuZHMgQ29udGludW91c1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0JcHJpdmF0ZSBSYW5kb20gcmFuZG9tOwotCXByaXZhdGUgaW50IGNhY2hlZFJhZGl1c1NxdWFyZWQ7Ci0JcHJpdmF0ZSBpbnQgY2FjaGVkTnVtUG9pbnRzOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBBaXJicnVzaFRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlyYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0JCXNldFJldHJpZ2dlclRpbWVyKDEwKTsKLQkJc2V0KHRvb2xTZXR0aW5ncyk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wncyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzKSB7Ci0JCS8vIGNvbXB1dGUgdGhpbmdzIHdlIG5lZWQgdG8ga25vdyBmb3IgZHJhd2luZwotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQkJY2FjaGVkUmFkaXVzU3F1YXJlZCA9IHNldHRpbmdzLmFpcmJydXNoUmFkaXVzICogc2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXM7Ci0JCWNhY2hlZE51bVBvaW50cyA9IDMxNCAqIHNldHRpbmdzLmFpcmJydXNoSW50ZW5zaXR5ICogY2FjaGVkUmFkaXVzU3F1YXJlZCAvIDI1MDAwMDsKLQkJaWYgKGNhY2hlZE51bVBvaW50cyA9PSAwICYmIHNldHRpbmdzLmFpcmJydXNoSW50ZW5zaXR5ICE9IDApCi0JCQljYWNoZWROdW1Qb2ludHMgPSAxOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9vbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIHRvb2wKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLkFpcmJydXNoLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2QgZm9yIGRyYXdpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW5kZXIoUG9pbnQgcG9pbnQpIHsKLQkJLy8gRHJhd3MgYSBidW5jaCAoY2FjaGVkTnVtUG9pbnRzKSBvZiByYW5kb20gcGl4ZWxzIHdpdGhpbiBhIHNwZWNpZmllZCBjaXJjbGUgKGNhY2hlZFJhZGl1c1NxdWFyZWQpLgotCQlDb250YWluZXJGaWd1cmUgY2ZpZyA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZE51bVBvaW50czsgKytpKSB7Ci0JCQlpbnQgcmFuZFgsIHJhbmRZOwotCQkJZG8gewotCQkJCXJhbmRYID0gKGludCkgKChyYW5kb20ubmV4dERvdWJsZSgpIC0gMC41KSAqIHNldHRpbmdzLmFpcmJydXNoUmFkaXVzICogMi4wKTsKLQkJCQlyYW5kWSA9IChpbnQpICgocmFuZG9tLm5leHREb3VibGUoKSAtIDAuNSkgKiBzZXR0aW5ncy5haXJicnVzaFJhZGl1cyAqIDIuMCk7Ci0JCQl9IHdoaWxlIChyYW5kWCAqIHJhbmRYICsgcmFuZFkgKiByYW5kWSA+IGNhY2hlZFJhZGl1c1NxdWFyZWQpOwotCQkJY2ZpZy5hZGQobmV3IFBvaW50RmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgcG9pbnQueCArIHJhbmRYLCBwb2ludC55ICsgcmFuZFkpKTsKLQkJfQotCQlnZXRQYWludFN1cmZhY2UoKS5kcmF3RmlndXJlKGNmaWcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0Jhc2ljUGFpbnRTZXNzaW9uLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9CYXNpY1BhaW50U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzJmZGY0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0Jhc2ljUGFpbnRTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNpY1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50U2Vzc2lvbiB7Ci0JLyoqCi0JICogVGhlIHBhaW50IHN1cmZhY2UKLQkgKi8KLQlwcml2YXRlIFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUGFpbnRTZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIGRyYXdpbmcgc3VyZmFjZSB0byB1c2UKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzaWNQYWludFNlc3Npb24oUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQl0aGlzLnBhaW50U3VyZmFjZSA9IHBhaW50U3VyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWludCBzdXJmYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhaW50IHNlc3Npb24uCi0JICogCi0JICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBQYWludFN1cmZhY2UKLQkgKi8KLQlwdWJsaWMgUGFpbnRTdXJmYWNlIGdldFBhaW50U3VyZmFjZSgpIHsKLQkJcmV0dXJuIHBhaW50U3VyZmFjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Db250YWluZXJGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRhaW5lckZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjc3NTNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRhaW5lckZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQ29udGFpbmVyIGZvciBGaWd1cmUgb2JqZWN0cyB3aXRoIHN0YWNraW5nIHByZXZpZXcgbWVjaGFuaXNtLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9BUlJBWV9TSVpFID0gMTY7Ci0JCi0JRmlndXJlW10gICBvYmplY3RTdGFjayA9IG51bGw7Ci0JaW50ICAgICAgbmV4dEluZGV4ID0gMDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gZW1wdHkgQ29udGFpbmVyCi0JICovCi0JcHVibGljIENvbnRhaW5lckZpZ3VyZSgpIHsKLQl9Ci0JLyoqCi0JICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIGNvbnRhaW5lciBmb3IgbGF0ZXIgZHJhd2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYWRkIHRvIHRoZSBkcmF3aW5nIGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoRmlndXJlIG9iamVjdCkgewotCQlpZiAob2JqZWN0U3RhY2sgPT0gbnVsbCkgewotCQkJb2JqZWN0U3RhY2sgPSBuZXcgRmlndXJlW0lOSVRJQUxfQVJSQVlfU0laRV07Ci0JCX0gZWxzZSBpZiAob2JqZWN0U3RhY2subGVuZ3RoIDw9IG5leHRJbmRleCkgewotCQkJRmlndXJlW10gbmV3T2JqZWN0U3RhY2sgPSBuZXcgRmlndXJlW29iamVjdFN0YWNrLmxlbmd0aCAqIDJdOwotCQkJU3lzdGVtLmFycmF5Y29weShvYmplY3RTdGFjaywgMCwgbmV3T2JqZWN0U3RhY2ssIDAsIG9iamVjdFN0YWNrLmxlbmd0aCk7Ci0JCQlvYmplY3RTdGFjayA9IG5ld09iamVjdFN0YWNrOwotCQl9Ci0JCW9iamVjdFN0YWNrW25leHRJbmRleF0gPSBvYmplY3Q7Ci0JCSsrbmV4dEluZGV4OwotCX0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBjb250YWluZXIgaXMgZW1wdHkuCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBjb250YWluZXIgaXMgZW1wdHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gbmV4dEluZGV4ID09IDA7Ci0JfQotCS8qKgotCSAqIEFkZHMgYW4gb2JqZWN0IHRvIHRoZSBjb250YWluZXIgYW5kIGRyYXdzIGl0cyBwcmV2aWV3IHRoZW4gdXBkYXRlcyB0aGUgc3VwcGxpZWQgcHJldmlldyBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYWRkIHRvIHRoZSBkcmF3aW5nIGxpc3QKLQkgKiBAcGFyYW0gZ2MgdGhlIEdDIHRvIGRyYXcgb24KLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gYWRkIHRvIHZpcnR1YWwgY29vcmRpbmF0ZXMgdG8gZ2V0IGRpc3BsYXkgY29vcmRpbmF0ZXMKLQkgKiBAcGFyYW0gcmVtZW1iZXJlZFN0YXRlIHRoZSBzdGF0ZSByZXR1cm5lZCBieSBhIHByZXZpb3VzIGRyYXdQcmV2aWV3KCkgb3IgYWRkQW5kUHJldmlldygpCi0JICogICAgICAgIHVzaW5nIHRoaXMgQ29udGFpbmVyLCBtYXkgYmUgbnVsbCBpZiB0aGVyZSB3YXMgbm8gc3VjaCBwcmV2aW91cyBjYWxsCi0JICogQHJldHVybiBvYmplY3Qgc3RhdGUgdGhhdCBtdXN0IGJlIHBhc3NlZCB0byBlcmFzZVByZXZpZXcoKSBsYXRlciB0byBlcmFzZSB0aGlzIG9iamVjdAotCSAqLwotLy8JcHVibGljIE9iamVjdCBhZGRBbmRQcmV2aWV3KEZpZ3VyZSBvYmplY3QsIEdDIGdjLCBQb2ludCBvZmZzZXQsIE9iamVjdCByZW1lbWJlcmVkU3RhdGUpIHsKLS8vCQlPYmplY3RbXSBzdGF0ZVN0YWNrID0gKE9iamVjdFtdKSByZW1lbWJlcmVkU3RhdGU7Ci0vLwkJaWYgKHN0YXRlU3RhY2sgPT0gbnVsbCkgewotLy8JCQlzdGF0ZVN0YWNrID0gbmV3IE9iamVjdFtJTklUSUFMX0FSUkFZX1NJWkVdOwotLy8JCX0gZWxzZSBpZiAoc3RhdGVTdGFjay5sZW5ndGggPD0gbmV4dEluZGV4KSB7Ci0vLwkJCU9iamVjdFtdIG5ld1N0YXRlU3RhY2sgPSBuZXcgT2JqZWN0W3N0YXRlU3RhY2subGVuZ3RoICogMl07Ci0vLwkJCVN5c3RlbS5hcnJheWNvcHkoc3RhdGVTdGFjaywgMCwgbmV3U3RhdGVTdGFjaywgMCwgc3RhdGVTdGFjay5sZW5ndGgpOwotLy8JCQlzdGF0ZVN0YWNrID0gbmV3U3RhdGVTdGFjazsKLS8vCQl9Ci0vLwkJYWRkKG9iamVjdCk7Ci0vLwkJc3RhdGVTdGFja1tuZXh0SW5kZXggLSAxXSA9IG9iamVjdC5kcmF3UHJldmlldyhnYywgb2Zmc2V0KTsKLS8vCQlyZXR1cm4gc3RhdGVTdGFjazsKLS8vCX0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGNvbnRhaW5lci4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgZXJhc2VQcmV2aWV3KCkgY2Fubm90IGJlIGNhbGxlZCBhZnRlciB0aGlzIHBvaW50IHRvIGVyYXNlIGFueSBwcmV2aW91cwotCSAqIGRyYXdQcmV2aWV3KCkncy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXdoaWxlICgtLW5leHRJbmRleCA+IDApIG9iamVjdFN0YWNrW25leHRJbmRleF0gPSBudWxsOwotCQluZXh0SW5kZXggPSAwOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRJbmRleDsgKytpKSBvYmplY3RTdGFja1tpXS5kcmF3KGZkYyk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dEluZGV4OyArK2kpIG9iamVjdFN0YWNrW2ldLmFkZERhbWFnZWRSZWdpb24oZmRjLCByZWdpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRpbnVvdXNQYWludFNlc3Npb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRpbnVvdXNQYWludFNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxNTM1MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Db250aW51b3VzUGFpbnRTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhlIHN1cGVyY2xhc3MgZm9yIHBhaW50IHRvb2xzIHRoYXQgZHJhdyBjb250aW51b3VzbHkgYWxvbmcgdGhlIHBhdGgKLSAqIHRyYWNlZCBieSB0aGUgbW91c2UncyBtb3ZlbWVudCB3aGlsZSB0aGUgYnV0dG9uIGlzIGRlcHJlc3NlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGludW91c1BhaW50U2Vzc2lvbiBleHRlbmRzIEJhc2ljUGFpbnRTZXNzaW9uIHsKLQkvKioKLQkgKiBUcnVlIGlmIGEgY2xpY2stZHJhZyBpcyBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkKLQkvKioKLQkgKiBBIGNhY2hlZCBQb2ludCBhcnJheSBmb3IgZHJhd2luZy4KLQkgKi8KLQlwcml2YXRlIFBvaW50W10gcG9pbnRzID0gbmV3IFBvaW50W10geyBuZXcgUG9pbnQoLTEsIC0xKSwgbmV3IFBvaW50KC0xLCAtMSkgfTsKLQotCS8qKgotCSAqIFRoZSB0aW1lIHRvIHdhaXQgYmV0d2VlbiByZXRyaWdnZXJzIGluIG1pbGxpc2Vjb25kcy4KLQkgKi8KLQlwcml2YXRlIGludCByZXRyaWdnZXJJbnRlcnZhbCA9IDA7Ci0JCi0JLyoqCi0JICogVGhlIGN1cnJlbnRseSB2YWxpZCBSZXRyaWdnZXJIYW5kbGVyCi0JICovCi0JcHJvdGVjdGVkIFJ1bm5hYmxlIHJldHJpZ2dlckhhbmRsZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIENvbnRpbnVvdXNQYWludFNlc3Npb24uCi0JICogCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgZHJhd2luZyBzdXJmYWNlIHRvIHVzZQotCSAqLwotCXByb3RlY3RlZCBDb250aW51b3VzUGFpbnRTZXNzaW9uKFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2UpIHsKLQkJc3VwZXIocGFpbnRTdXJmYWNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZXRyaWdnZXIgdGltZXIuCi0JICogPHA+Ci0JICogQWZ0ZXIgdGhlIHRpbWVyIGVsYXBzZXMsIGlmIHRoZSBtb3VzZSBpcyBzdGlsbCBob3ZlcmluZyBvdmVyIHRoZSBzYW1lIHBvaW50IHdpdGggdGhlCi0JICogZHJhZyBidXR0b24gcHJlc3NlZCwgYSBuZXcgcmVuZGVyIG9yZGVyIGlzIGlzc3VlZCBhbmQgdGhlIHRpbWVyIGlzIHJlc3RhcnRlZC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGludGVydmFsIHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJldHdlZW4gcmV0cmlnZ2VycywgMCB0byBkaXNhYmxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0cmlnZ2VyVGltZXIoaW50IGludGVydmFsKSB7Ci0JCXJldHJpZ2dlckludGVydmFsID0gaW50ZXJ2YWw7Ci0JfQotCi0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSB0b29sLgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luU2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuCi0JCQlzZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygic2Vzc2lvbi5Db250aW51b3VzUGFpbnQubWVzc2FnZSIpKTsKLQkJZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogRGVhY3RpdmF0ZXMgdGhlIHRvb2wuCi0gICAgICovCi0JcHVibGljIHZvaWQgZW5kU2Vzc2lvbigpIHsKLQkJYWJvcnRSZXRyaWdnZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQWJvcnRzIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFNlc3Npb24oKSB7Ci0JCWFib3J0UmV0cmlnZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG93biBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotCQlpZiAoZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJZHJhZ0luUHJvZ3Jlc3MgPSB0cnVlOwotCi0JCXBvaW50c1swXS54ID0gZXZlbnQueDsKLQkJcG9pbnRzWzBdLnkgPSBldmVudC55OwotCQlyZW5kZXIocG9pbnRzWzBdKTsKLQkJcHJlcGFyZVJldHJpZ2dlcigpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvdWJsZUNsaWNrIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlVXAgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0JCWlmICghIGRyYWdJblByb2dyZXNzKSByZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCWFib3J0UmV0cmlnZ2VyKCk7Ci0JCW1vdXNlU2VnbWVudEZpbmlzaGVkKGV2ZW50KTsKLQkJZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlTW92ZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIFBhaW50U3VyZmFjZSBwcyA9IGdldFBhaW50U3VyZmFjZSgpOwotCQlwcy5zZXRTdGF0dXNDb29yZChwcy5nZXRDdXJyZW50UG9zaXRpb24oKSk7Ci0JCWlmICghIGRyYWdJblByb2dyZXNzKSByZXR1cm47Ci0JCW1vdXNlU2VnbWVudEZpbmlzaGVkKGV2ZW50KTsKLQkJcHJlcGFyZVJldHJpZ2dlcigpOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgYSByZW5kZXJpbmcgc2VnbWVudAotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIG1vdXNlU2VnbWVudEZpbmlzaGVkKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHBvaW50c1swXS54ID09IC0xKSByZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCWlmIChwb2ludHNbMF0ueCAhPSBldmVudC54IHx8IHBvaW50c1swXS55ICE9IGV2ZW50LnkpIHsKLQkJCS8vIGRyYXcgbmV3IHNlZ21lbnQKLQkJCXBvaW50c1sxXS54ID0gZXZlbnQueDsKLQkJCXBvaW50c1sxXS55ID0gZXZlbnQueTsKLQkJCXJlbmRlckNvbnRpbnVvdXNTZWdtZW50KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyBhIGNvbnRpbnVvdXMgc2VnbWVudCBmcm9tIHBvaW50c1swXSB0byBwb2ludHNbMV0uCi0JICogQXNzdW1lcyBwb2ludHNbMF0gaGFzIGJlZW4gZHJhd24gYWxyZWFkeS4KLQkgKiAKLQkgKiBAcG9zdCBwb2ludHNbMF0gd2lsbCByZWZlciB0byB0aGUgc2FtZSBwb2ludCBhcyBwb2ludHNbMV0KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW5kZXJDb250aW51b3VzU2VnbWVudCgpIHsKLQkJLyogQSBsYXp5IGJ1dCBlZmZlY3RpdmUgbGluZSBkcmF3aW5nIGFsZ29yaXRobSAqLwotCQlmaW5hbCBpbnQgZFggPSBwb2ludHNbMV0ueCAtIHBvaW50c1swXS54OwotCQlmaW5hbCBpbnQgZFkgPSBwb2ludHNbMV0ueSAtIHBvaW50c1swXS55OwotCQlpbnQgYWJzZFggPSBNYXRoLmFicyhkWCk7Ci0JCWludCBhYnNkWSA9IE1hdGguYWJzKGRZKTsKLQotCQlpZiAoKGRYID09IDApICYmIChkWSA9PSAwKSkgcmV0dXJuOwotCQkKLQkJaWYgKGFic2RZID4gYWJzZFgpIHsKLQkJCWZpbmFsIGludCBpbmNmcFggPSAoZFggPDwgMTYpIC8gYWJzZFk7Ci0JCQlmaW5hbCBpbnQgaW5jWSA9IChkWSA+IDApID8gMSA6IC0xOwotCQkJaW50IGZwWCA9IHBvaW50c1swXS54IDw8IDE2OyAvLyBYIGluIGZpeGVkcG9pbnQgZm9ybWF0Ci0KLQkJCXdoaWxlICgtLWFic2RZID49IDApIHsKLQkJCQlwb2ludHNbMF0ueSArPSBpbmNZOwotCQkJCXBvaW50c1swXS54ID0gKGZwWCArPSBpbmNmcFgpID4+IDE2OwotCQkJCXJlbmRlcihwb2ludHNbMF0pOwotCQkJfQotCQkJaWYgKHBvaW50c1swXS54ID09IHBvaW50c1sxXS54KSByZXR1cm47Ci0JCQlwb2ludHNbMF0ueCA9IHBvaW50c1sxXS54OwotCQl9IGVsc2UgewotCQkJZmluYWwgaW50IGluY2ZwWSA9IChkWSA8PCAxNikgLyBhYnNkWDsKLQkJCWZpbmFsIGludCBpbmNYID0gKGRYID4gMCkgPyAxIDogLTE7Ci0JCQlpbnQgZnBZID0gcG9pbnRzWzBdLnkgPDwgMTY7IC8vIFkgaW4gZml4ZWRwb2ludCBmb3JtYXQKLQotCQkJd2hpbGUgKC0tYWJzZFggPj0gMCkgewotCQkJCXBvaW50c1swXS54ICs9IGluY1g7Ci0JCQkJcG9pbnRzWzBdLnkgPSAoZnBZICs9IGluY2ZwWSkgPj4gMTY7Ci0JCQkJcmVuZGVyKHBvaW50c1swXSk7Ci0JCQl9Ci0JCQlpZiAocG9pbnRzWzBdLnkgPT0gcG9pbnRzWzFdLnkpIHJldHVybjsKLQkJCXBvaW50c1swXS55ID0gcG9pbnRzWzFdLnk7Ci0JCX0KLQkJcmVuZGVyKHBvaW50c1swXSk7Ci0JfQkJCi0KLQkvKioKLQkgKiBQcmVwYXJlIHRoZSByZXRyaWdnZXIgdGltZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgcHJlcGFyZVJldHJpZ2dlcigpIHsKLQkJaWYgKHJldHJpZ2dlckludGVydmFsID4gMCkgewotCQkJLyoKLQkJCSAqIHRpbWVyRXhlYygpIHByb3ZpZGVzIGEgbGlnaHR3ZWlnaHQgbWVjaGFuaXNtIGZvciBydW5uaW5nIGNvZGUgYXQgaW50ZXJ2YWxzIGZyb20gd2l0aGluCi0JCQkgKiB0aGUgZXZlbnQgbG9vcCB3aGVuIHRpbWluZyBhY2N1cmFjeSBpcyBub3QgaW1wb3J0YW50LgotCQkJICoKLQkJCSAqIFNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYW5jZWwgYSB0aW1lckV4ZWMoKSwgd2UgcmVtZW1iZXIgdGhlIFJ1bm5hYmxlIHRoYXQgaXMKLQkJCSAqIGFjdGl2ZSBpbiBvcmRlciB0byBkaXN0aW5ndWlzaCB0aGUgdmFsaWQgb25lIGZyb20gdGhlIHN0YWxlIG9uZXMuICBJbiBwcmFjdGljZSwKLQkJCSAqIGlmIHRoZSBpbnRlcnZhbCBpcyAxLzEwMHRoIG9mIGEgc2Vjb25kLCB0aGVuIGNyZWF0aW5nIGEgZmV3IGh1bmRyZWQgbmV3IFJldHJpZ2dlckhhbmRsZXJzCi0JCQkgKiBlYWNoIHNlY29uZCB3aWxsIG5vdCBjYXVzZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGhpdC4KLQkJCSAqLwotCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0UGFpbnRTdXJmYWNlKCkuZ2V0RGlzcGxheSgpOwotCQkJcmV0cmlnZ2VySGFuZGxlciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChyZXRyaWdnZXJIYW5kbGVyID09IHRoaXMpIHsKLQkJCQkJCXJlbmRlcihwb2ludHNbMF0pOwotCQkJCQkJcHJlcGFyZVJldHJpZ2dlcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsJCQkKLQkJCWRpc3BsYXkudGltZXJFeGVjKHJldHJpZ2dlckludGVydmFsLCByZXRyaWdnZXJIYW5kbGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFib3J0cyB0aGUgcmV0cmlnZ2VyIHRpbWVyCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFib3J0UmV0cmlnZ2VyKCkgewotCQlyZXRyaWdnZXJIYW5kbGVyID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGVtcGxhdGUgbWV0aG9kOiBSZW5kZXJzIGEgcG9pbnQuCi0JICogQHBhcmFtIHBvaW50LCB0aGUgcG9pbnQgdG8gcmVuZGVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVuZGVyKFBvaW50IHBvaW50KTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0RyYWdQYWludFNlc3Npb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0RyYWdQYWludFNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwMWNhMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9EcmFnUGFpbnRTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFRoZSBzdXBlcmNsYXNzIGZvciBwYWludCB0b29scyB0aGF0IHVzZSBjbGljay1kcmFnLXJlbGVhc2UgbW90aW9ucyB0bwotICogZHJhdyBvYmplY3RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRHJhZ1BhaW50U2Vzc2lvbiBleHRlbmRzIEJhc2ljUGFpbnRTZXNzaW9uIHsKLQkvKioKLQkgKiBUcnVlIGlmIGEgY2xpY2stZHJhZyBpcyBpbiBwcm9ncmVzcwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQotCS8qKgotCSAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2xpY2sgaW4gYSBjbGljay1kcmFnCi0JICovCi0JcHJpdmF0ZSBQb2ludCBhbmNob3JQb3NpdGlvbiA9IG5ldyBQb2ludCgtMSwgLTEpOwotCi0JLyoqCi0JICogQSB0ZW1wb3JhcnkgcG9pbnQKLQkgKi8KLQlwcml2YXRlIFBvaW50IHRlbXBQb3NpdGlvbiA9IG5ldyBQb2ludCgtMSwgLTEpOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFNlc3Npb24uCi0JICogCi0JICogQHBhcmFtIGdldFBhaW50U3VyZmFjZSgpIHRoZSBkcmF3aW5nIHN1cmZhY2UgdG8gdXNlCi0JICovCi0JcHJvdGVjdGVkIERyYWdQYWludFNlc3Npb24oUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCX0KLQotCS8qKgotCSAqIEFjdGl2YXRlcyB0aGUgdG9vbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLgotCQkJc2V0U3RhdHVzTWVzc2FnZShQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInNlc3Npb24uRHJhZ0ludGVyYWN0aXZlUGFpbnQubWVzc2FnZSIpKTsKLQkJYW5jaG9yUG9zaXRpb24ueCA9IC0xOwotCQlkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBEZWFjdGl2YXRlcyB0aGUgdG9vbC4KLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKCkgewotCX0KLQkKLQkvKioKLQkgKiBSZXNldHMgdGhlIHRvb2wuCi0JICogQWJvcnRzIGFueSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRTZXNzaW9uKCkgewotCQlnZXRQYWludFN1cmZhY2UoKS5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJYW5jaG9yUG9zaXRpb24ueCA9IC0xOwotCQlkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvd24gZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJaWYgKGRyYWdJblByb2dyZXNzKSByZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCWRyYWdJblByb2dyZXNzID0gdHJ1ZTsKLQkJCi0JCWFuY2hvclBvc2l0aW9uLnggPSBldmVudC54OwotCQlhbmNob3JQb3NpdGlvbi55ID0gZXZlbnQueTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3VibGVDbGljayBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZVVwIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgewotCQkJcmVzZXRTZXNzaW9uKCk7IC8vIGFib3J0IGlmIHJpZ2h0IG9yIG1pZGRsZSBtb3VzZSBidXR0b24gcHJlc3NlZAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghIGRyYWdJblByb2dyZXNzKSByZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCWRyYWdJblByb2dyZXNzID0gZmFsc2U7Ci0JCWlmIChhbmNob3JQb3NpdGlvbi54ID09IC0xKSByZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCQotCQlnZXRQYWludFN1cmZhY2UoKS5jb21taXRSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZU1vdmUgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCQlmaW5hbCBQYWludFN1cmZhY2UgcHMgPSBnZXRQYWludFN1cmZhY2UoKTsKLQkJaWYgKCEgZHJhZ0luUHJvZ3Jlc3MpIHsKLQkJCXBzLnNldFN0YXR1c0Nvb3JkKHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJCXJldHVybjsKLQkJfQotCQlwcy5zZXRTdGF0dXNDb29yZFJhbmdlKGFuY2hvclBvc2l0aW9uLCBwcy5nZXRDdXJyZW50UG9zaXRpb24oKSk7Ci0JCXBzLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQl0ZW1wUG9zaXRpb24ueCA9IGV2ZW50Lng7Ci0JCXRlbXBQb3NpdGlvbi55ID0gZXZlbnQueTsKLQkJcHMuYWRkUnViYmVyYmFuZFNlbGVjdGlvbihjcmVhdGVGaWd1cmUoYW5jaG9yUG9zaXRpb24sIHRlbXBQb3NpdGlvbikpOwotCX0KLQkKLQkvKioKLQkgKiBUZW1wbGF0ZSBNZXRob2Q6IENyZWF0ZXMgYSBGaWd1cmUgZm9yIGRyYXdpbmcgcnViYmVyYmFuZCBlbnRpdGllcyBhbmQgdGhlIGZpbmFsIHByb2R1Y3QKLQkgKiAKLQkgKiBAcGFyYW0gYW5jaG9yIHRoZSBhbmNob3IgcG9pbnQKLQkgKiBAcGFyYW0gY3Vyc29yIHRoZSBwb2ludCBtYXJraW5nIHRoZSBjdXJyZW50IHBvaW50ZXIgbG9jYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmlndXJlIGNyZWF0ZUZpZ3VyZShQb2ludCBhbmNob3IsIFBvaW50IGN1cnNvcik7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDdlZjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRWxsaXBzZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgRWxsaXBzZSBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIEVsbGlwc2VGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kQ29sb3I7Ci0JcHJpdmF0ZSBpbnQgbGluZVN0eWxlLCB4MSwgeTEsIHgyLCB5MjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuIEVsbGlwc2UKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IGFueSB0d28gZGlhbWV0cmljYWxseSBvcHBvc2luZyBjb3JuZXJzIG9mIGEgYm94Ci0JICogYm91bmRpbmcgdGhlIGVsbGlwc2UuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0gbGluZVN0eWxlIHRoZSBsaW5lIHN0eWxlIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB4MSB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB5MSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB4MiB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0geTIgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICovCi0JcHVibGljIEVsbGlwc2VGaWd1cmUoQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBDb2xvciBiYWNrZ3JvdW5kQ29sb3IsIGludCBsaW5lU3R5bGUsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikgewotCQl0aGlzLmZvcmVncm91bmRDb2xvciA9IGZvcmVncm91bmRDb2xvcjsKLQkJdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7Ci0JCXRoaXMubGluZVN0eWxlID0gbGluZVN0eWxlOwotCQl0aGlzLngxID0geDE7IHRoaXMueTEgPSB5MTsgdGhpcy54MiA9IHgyOyB0aGlzLnkyID0geTI7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVJlY3RhbmdsZSByID0gZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKTsKLQkJZmRjLmdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShsaW5lU3R5bGUpOwotCQlmZGMuZ2MuZHJhd092YWwoci54LCByLnksIHIud2lkdGggLSAxLCByLmhlaWdodCAtIDEpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRWxsaXBzZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxMWM3Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQSBkcmF3aW5nIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGxpcHNlVG9vbCBleHRlbmRzIERyYWdQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIEVsbGlwc2VUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBFbGxpcHNlVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wncyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzKSB7Ci0JCXNldHRpbmdzID0gdG9vbFNldHRpbmdzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuRWxsaXBzZS5sYWJlbCIpOwotCX0KLQotCS8qCi0JICogVGVtcGxhdGUgbWV0aG9kcyBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGEsIFBvaW50IGIpIHsKLQkJQ29udGFpbmVyRmlndXJlIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLQkJaWYgKHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdE5vbmUpCi0JCQljb250YWluZXIuYWRkKG5ldyBTb2xpZEVsbGlwc2VGaWd1cmUoc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBhLngsIGEueSwgYi54LCBiLnkpKTsKLQkJaWYgKHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdFNvbGlkKQotCQkJY29udGFpbmVyLmFkZChuZXcgRWxsaXBzZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLAotCQkJCWEueCwgYS55LCBiLngsIGIueSkpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0ZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmY2U3ZTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBTdXBlcmludGVyZmFjZSBmb3IgYWxsIGRyYXdpbmcgb2JqZWN0cy4KLSAqIEFsbCBkcmF3aW5nIG9iamVjdHMga25vdyBob3cgdG8gcmVuZGVyIHRoZW1zZWx2ZWQgdG8gdGhlIHNjcmVlbiBhbmQgY2FuIGRyYXcgYQotICogdGVtcG9yYXJ5IHZlcnNpb24gb2YgdGhlbXNlbHZlcyBmb3IgcHJldmlld2luZyB0aGUgZ2VuZXJhbCBhcHBlYXJhbmNlIG9mIHRoZQotICogb2JqZWN0IG9uc2NyZWVuIGJlZm9yZSBpdCBnZXRzIGNvbW1pdHRlZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpZ3VyZSB7Ci0JLyoqCi0JICogRHJhd3MgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGZkYyBhIHBhcmFtZXRlciBibG9jayBzcGVjaWZ5aW5nIGRyYXdpbmctcmVsYXRlZCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKTsKLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBkYW1hZ2VkIHNjcmVlbiByZWdpb24gY2F1c2VkIGJ5IGRyYXdpbmcgdGhpcyBvYmplY3QgKGltcHJlY2lzZSksIHRoZW4KLQkgKiBhcHBlbmRzIGl0IHRvIHRoZSBzdXBwbGllZCByZWdpb24uCi0JICogCi0JICogQHBhcmFtIGZkYyBhIHBhcmFtZXRlciBibG9jayBzcGVjaWZ5aW5nIGRyYXdpbmctcmVsYXRlZCBpbmZvcm1hdGlvbgotCSAqIEBwYXJhbSByZWdpb24gYSByZWdpb24gdG8gd2hpY2ggYWRkaXRpb25hbCBkYW1hZ2UgYXJlYXMgd2lsbCBiZSBhZGRlZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0ZpZ3VyZURyYXdDb250ZXh0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9GaWd1cmVEcmF3Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGFiMThkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0ZpZ3VyZURyYXdDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEZpZ3VyZURyYXdDb250ZXh0IHsKLQkvKgotCSAqIDxwPgotCSAqIFRoZSBHQyBtdXN0IGJlIHNldCB1cCBhcyBmb2xsb3dzCi0JICogKGl0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhpcyBzdGF0ZSB1cG9uIGNvbXBsZXRpb24gb2YgZHJhd2luZyBvcGVyYXRpb25zKQotCSAqIDx1bD4KLQkgKiAgIDxsaT5zZXRYT1JNb2RlKGZhbHNlKQotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBHQyBnYyA9IG51bGw7Ci0JcHVibGljIGludCB4T2Zmc2V0ID0gMCwgeU9mZnNldCA9IDA7IC8vIHN1YnN0cmFjdCB0byBnZXQgR0MgY29vcmRzCi0JcHVibGljIGludCB4U2NhbGUgPSAxLCB5U2NhbGUgPSAxOwotCQotCXB1YmxpYyBSZWN0YW5nbGUgdG9DbGllbnRSZWN0YW5nbGUoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKAotCQkJTWF0aC5taW4oeDEsIHgyKSAqIHhTY2FsZSAtIHhPZmZzZXQsCi0JCQlNYXRoLm1pbih5MSwgeTIpICogeVNjYWxlIC0geU9mZnNldCwKLQkJCShNYXRoLmFicyh4MiAtIHgxKSArIDEpICogeFNjYWxlLAotCQkJKE1hdGguYWJzKHkyIC0geTEpICsgMSkgKiB5U2NhbGUpOwotCX0KLQlwdWJsaWMgUG9pbnQgdG9DbGllbnRQb2ludChpbnQgeCwgaW50IHkpIHsKLQkJcmV0dXJuIG5ldyBQb2ludCh4ICogeFNjYWxlIC0geE9mZnNldCwgeSAqIHlTY2FsZSAtIHlPZmZzZXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIzZmQxOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9MaW5lRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBMaW5lIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgTGluZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQlwcml2YXRlIGludCBsaW5lU3R5bGUsIHgxLCB5MSwgeDIsIHkyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBMaW5lCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSB0aGVpciB0d28gZW5kLXBvaW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsaW5lU3R5bGUgdGhlIGxpbmUgc3R5bGUgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgZW5kLXBvaW50Ci0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgZW5kLXBvaW50Ci0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGVuZC1wb2ludAotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBlbmQtcG9pbnQKLQkgKi8KLQlwdWJsaWMgTGluZUZpZ3VyZShDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIENvbG9yIGJhY2tncm91bmRDb2xvciwgaW50IGxpbmVTdHlsZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXRoaXMuZm9yZWdyb3VuZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQl0aGlzLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0JCXRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUG9pbnQgcDEgPSBmZGMudG9DbGllbnRQb2ludCh4MSwgeTEpOwotCQlQb2ludCBwMiA9IGZkYy50b0NsaWVudFBvaW50KHgyLCB5Mik7Ci0JCWZkYy5nYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUobGluZVN0eWxlKTsKLQkJZmRjLmdjLmRyYXdMaW5lKHAxLngsIHAxLnksIHAyLngsIHAyLnkpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9MaW5lVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvTGluZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhNjRhMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9MaW5lVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQSBsaW5lIGRyYXdpbmcgdG9vbAotICovCi1wdWJsaWMgY2xhc3MgTGluZVRvb2wgZXh0ZW5kcyBEcmFnUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBMaW5lVG9vbC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIFBhaW50U3VyZmFjZSB3ZSB3aWxsIHJlbmRlciBvbi4KLQkgKi8KLQlwdWJsaWMgTGluZVRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuTGluZS5sYWJlbCIpOwotCX0KLQotCS8qCi0JICogVGVtcGxhdGUgbWV0aG9kcyBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGEsIFBvaW50IGIpIHsKLQkJcmV0dXJuIG5ldyBMaW5lRmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsCi0JCQlhLngsIGEueSwgYi54LCBiLnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50RXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YTEwYTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBQYWludEV4YW1wbGUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0KLQkJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19wYWludCIpOwotCXByaXZhdGUgQ29tcG9zaXRlIG1haW5Db21wb3NpdGU7Ci0JcHJpdmF0ZSBDYW52YXMgYWN0aXZlRm9yZWdyb3VuZENvbG9yQ2FudmFzOwotCXByaXZhdGUgQ2FudmFzIGFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhczsKLQlwcml2YXRlIENvbG9yIHBhaW50Q29sb3JCbGFjaywgcGFpbnRDb2xvcldoaXRlOyAvLyBhbGlhcyBmb3IgcGFpbnRDb2xvcnNbMF0gYW5kIFsxXQotCXByaXZhdGUgQ29sb3JbXSBwYWludENvbG9yczsKLQlwcml2YXRlIEZvbnQgcGFpbnREZWZhdWx0Rm9udDsgLy8gZG8gbm90IGZyZWUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbnVtUGFsZXR0ZVJvd3MgPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBudW1QYWxldHRlQ29scyA9IDUwOwotCXByaXZhdGUgVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5nczsgLy8gY3VycmVudCBhY3RpdmUgc2V0dGluZ3MKLQlwcml2YXRlIFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2U7IC8vIHBhaW50IHN1cmZhY2UgZm9yIGRyYXdpbmcKLQotCXN0YXRpYyBmaW5hbCBpbnQgUGVuY2lsX3Rvb2wgPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgQWlyYnJ1c2hfdG9vbCA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBMaW5lX3Rvb2wgPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgUG9seUxpbmVfdG9vbCA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBSZWN0YW5nbGVfdG9vbCA9IDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBSb3VuZGVkUmVjdGFuZ2xlX3Rvb2wgPSA1OwotCXN0YXRpYyBmaW5hbCBpbnQgRWxsaXBzZV90b29sID0gNjsKLQlzdGF0aWMgZmluYWwgaW50IFRleHRfdG9vbCA9IDc7Ci0Jc3RhdGljIGZpbmFsIGludCBOb25lX2ZpbGwgPSA4OwotCXN0YXRpYyBmaW5hbCBpbnQgT3V0bGluZV9maWxsID0gOTsKLQlzdGF0aWMgZmluYWwgaW50IFNvbGlkX2ZpbGwgPSAxMDsKLQlzdGF0aWMgZmluYWwgaW50IFNvbGlkX2xpbmVzdHlsZSA9IDExOwotCXN0YXRpYyBmaW5hbCBpbnQgRGFzaF9saW5lc3R5bGUgPSAxMjsKLQlzdGF0aWMgZmluYWwgaW50IERvdF9saW5lc3R5bGUgPSAxMzsKLQlzdGF0aWMgZmluYWwgaW50IERhc2hEb3RfbGluZXN0eWxlID0gMTQ7Ci0Jc3RhdGljIGZpbmFsIGludCBGb250X29wdGlvbnMgPSAxNTsKLQkKLQlzdGF0aWMgZmluYWwgaW50IERlZmF1bHRfdG9vbCA9IFBlbmNpbF90b29sOwotCXN0YXRpYyBmaW5hbCBpbnQgRGVmYXVsdF9maWxsID0gTm9uZV9maWxsOwotCXN0YXRpYyBmaW5hbCBpbnQgRGVmYXVsdF9saW5lc3R5bGUgPSBTb2xpZF9saW5lc3R5bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUb29sW10gdG9vbHMgPSB7Ci0JCW5ldyBUb29sKFBlbmNpbF90b29sLCAiUGVuY2lsIiwgInRvb2wiLCBTV1QuUkFESU8pLAotCQluZXcgVG9vbChBaXJicnVzaF90b29sLCAiQWlyYnJ1c2giLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKExpbmVfdG9vbCwgIkxpbmUiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKFBvbHlMaW5lX3Rvb2wsICJQb2x5TGluZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woUmVjdGFuZ2xlX3Rvb2wsICJSZWN0YW5nbGUiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKFJvdW5kZWRSZWN0YW5nbGVfdG9vbCwgIlJvdW5kZWRSZWN0YW5nbGUiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKEVsbGlwc2VfdG9vbCwgIkVsbGlwc2UiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKFRleHRfdG9vbCwgIlRleHQiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKE5vbmVfZmlsbCwgIk5vbmUiLCAiZmlsbCIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoVG9vbFNldHRpbmdzLmZ0Tm9uZSkpLAotCQluZXcgVG9vbChPdXRsaW5lX2ZpbGwsICJPdXRsaW5lIiwgImZpbGwiLCBTV1QuUkFESU8sIG5ldyBJbnRlZ2VyKFRvb2xTZXR0aW5ncy5mdE91dGxpbmUpKSwKLQkJbmV3IFRvb2woU29saWRfZmlsbCwgIlNvbGlkIiwgImZpbGwiLCBTV1QuUkFESU8sIG5ldyBJbnRlZ2VyKFRvb2xTZXR0aW5ncy5mdFNvbGlkKSksCi0JCW5ldyBUb29sKFNvbGlkX2xpbmVzdHlsZSwgIlNvbGlkIiwgImxpbmVzdHlsZSIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoU1dULkxJTkVfU09MSUQpKSwKLQkJbmV3IFRvb2woRGFzaF9saW5lc3R5bGUsICJEYXNoIiwgImxpbmVzdHlsZSIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoU1dULkxJTkVfREFTSCkpLAotCQluZXcgVG9vbChEb3RfbGluZXN0eWxlLCAiRG90IiwgImxpbmVzdHlsZSIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoU1dULkxJTkVfRE9UKSksCi0JCW5ldyBUb29sKERhc2hEb3RfbGluZXN0eWxlLCAiRGFzaERvdCIsICJsaW5lc3R5bGUiLCBTV1QuUkFESU8sIG5ldyBJbnRlZ2VyKFNXVC5MSU5FX0RBU0hET1QpKSwKLQkJbmV3IFRvb2woRm9udF9vcHRpb25zLCAiRm9udCIsICJvcHRpb25zIiwgU1dULlBVU0gpCi0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBQYWludEV4YW1wbGUgZW1iZWRkZWQgaW5zaWRlCi0JICogdGhlIHN1cHBsaWVkIHBhcmVudCBDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29udGFpbmVyIG9mIHRoZSBleGFtcGxlCi0JICovCi0JcHVibGljIFBhaW50RXhhbXBsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW1haW5Db21wb3NpdGUgPSBwYXJlbnQ7Ci0JCWluaXRSZXNvdXJjZXMoKTsKLQkJaW5pdEFjdGlvbnMoKTsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIEludm9rZXMgYXMgYSBzdGFuZGFsb25lIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCVBhaW50RXhhbXBsZSBpbnN0YW5jZSA9IG5ldyBQYWludEV4YW1wbGUoc2hlbGwpOwotCQlpbnN0YW5jZS5jcmVhdGVUb29sQmFyKHNoZWxsKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlpbnN0YW5jZS5jcmVhdGVHVUkoY29tcG9zaXRlKTsKLQkJaW5zdGFuY2Uuc2V0RGVmYXVsdHMoKTsKLQkJc2V0U2hlbGxTaXplKGRpc3BsYXksIHNoZWxsKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRvb2xiYXIuCi0JICogTm90ZTogT25seSBjYWxsZWQgYnkgc3RhbmRhbG9uZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVG9vbEJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRvb2xCYXIgdG9vbGJhciA9IG5ldyBUb29sQmFyIChwYXJlbnQsIFNXVC5OT05FKTsKLQkJU3RyaW5nIGdyb3VwID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7IGkrKykgewotCQkJVG9vbCB0b29sID0gdG9vbHNbaV07Ci0JCQlpZiAoZ3JvdXAgIT0gbnVsbCAmJiAhdG9vbC5ncm91cC5lcXVhbHMoZ3JvdXApKSB7Ci0JCQkJbmV3IFRvb2xJdGVtICh0b29sYmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJCX0KLQkJCWdyb3VwID0gdG9vbC5ncm91cDsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBhZGRUb29sSXRlbSh0b29sYmFyLCB0b29sKTsKLQkJCWlmIChpID09IERlZmF1bHRfdG9vbCB8fCBpID09IERlZmF1bHRfZmlsbCB8fCBpID09IERlZmF1bHRfbGluZXN0eWxlKSBpdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSB0b29sIGl0ZW0gdG8gdGhlIHRvb2xiYXIuCi0JICogTm90ZTogT25seSBjYWxsZWQgYnkgc3RhbmRhbG9uZS4KLQkgKi8KLQlwcml2YXRlIFRvb2xJdGVtIGFkZFRvb2xJdGVtKGZpbmFsIFRvb2xCYXIgdG9vbGJhciwgZmluYWwgVG9vbCB0b29sKSB7Ci0JCWZpbmFsIFN0cmluZyBpZCA9IHRvb2wuZ3JvdXAgKyAnLicgKyB0b29sLm5hbWU7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xiYXIsIHRvb2wudHlwZSk7Ci0JCWl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLmxhYmVsIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKGlkICsgIi50b29sdGlwIikpOwotCQlpdGVtLnNldEltYWdlKHRvb2wuaW1hZ2UpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRvb2wuYWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgaW50IGNoaWxkSUQgPSB0b29sYmFyLmluZGV4T2YoaXRlbSk7Ci0JCXRvb2xiYXIuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBjaGlsZElEKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLmRlc2NyaXB0aW9uIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCB0b29sIGl0ZW0gc3RhdGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotCQlzZXRQYWludFRvb2woRGVmYXVsdF90b29sKTsKLQkJc2V0RmlsbFR5cGUoRGVmYXVsdF9maWxsKTsKLQkJc2V0TGluZVN0eWxlKERlZmF1bHRfbGluZXN0eWxlKTsKLQkJc2V0Rm9yZWdyb3VuZENvbG9yKHBhaW50Q29sb3JCbGFjayk7Ci0JCXNldEJhY2tncm91bmRDb2xvcihwYWludENvbG9yV2hpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdVSS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVHVUkoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQ7Ci0JCUdyaWREYXRhIGdyaWREYXRhOwotCi0JCS8qKiogQ3JlYXRlIHByaW5jaXBhbCBHVUkgbGF5b3V0IGVsZW1lbnRzICoqKi8JCQotCQlDb21wb3NpdGUgZGlzcGxheUFyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLQkJZGlzcGxheUFyZWEuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCS8vIENyZWF0aW5nIHRoZXNlIGVsZW1lbnRzIGhlcmUgYXZvaWRzIHRoZSBuZWVkIHRvIGluc3RhbnRpYXRlIHRoZSBHVUkgZWxlbWVudHMKLQkJLy8gaW4gc3RyaWN0IGxheW91dCBvcmRlci4gIFRoZSBuYXR1cmFsIGxheW91dCBvcmRlcmluZyBpcyBhbiBhcnRpZmFjdCBvZiB1c2luZwotCQkvLyBTV1QgbGF5b3V0cywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgaXMgbm90IHRoZSBzYW1lIG9yZGVyIGFzIHRoYXQgcmVxdWlyZWQgdG8KLQkJLy8gaW5zdGFudGlhdGUgYWxsIG9mIHRoZSBub24tR1VJIGFwcGxpY2F0aW9uIGVsZW1lbnRzIHRvIHNhdGlzZnkgcmVmZXJlbnRpYWwKLQkJLy8gZGVwZW5kZW5jaWVzLiAgSXQgaXMgcG9zc2libGUgdG8gcmVvcmRlciB0aGUgaW5pdGlhbGl6YXRpb24gdG8gc29tZSBleHRlbnQsIGJ1dAotCQkvLyB0aGlzIGNhbiBiZSB2ZXJ5IHRlZGlvdXMuCi0JCQotCQkvLyBwYWludCBjYW52YXMKLQkJZmluYWwgQ2FudmFzIHBhaW50Q2FudmFzID0gbmV3IENhbnZhcyhkaXNwbGF5QXJlYSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8Ci0JCQlTV1QuTk9fUkVEUkFXX1JFU0laRSB8IFNXVC5OT19CQUNLR1JPVU5EKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCXBhaW50Q2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlwYWludENhbnZhcy5zZXRCYWNrZ3JvdW5kKHBhaW50Q29sb3JXaGl0ZSk7Ci0JCQotCQkvLyBjb2xvciBzZWxlY3RvciBmcmFtZQotCQlmaW5hbCBDb21wb3NpdGUgY29sb3JGcmFtZSA9IG5ldyBDb21wb3NpdGUoZGlzcGxheUFyZWEsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWNvbG9yRnJhbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gdG9vbCBzZXR0aW5ncyBmcmFtZQotCQlmaW5hbCBDb21wb3NpdGUgdG9vbFNldHRpbmdzRnJhbWUgPSBuZXcgQ29tcG9zaXRlKGRpc3BsYXlBcmVhLCBTV1QuTk9ORSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQl0b29sU2V0dGluZ3NGcmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBzdGF0dXMgdGV4dAotCQlmaW5hbCBUZXh0IHN0YXR1c1RleHQgPSBuZXcgVGV4dChkaXNwbGF5QXJlYSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCXN0YXR1c1RleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLyoqKiBDcmVhdGUgdGhlIHJlbWFpbmluZyBhcHBsaWNhdGlvbiBlbGVtZW50cyBpbnNpZGUgdGhlIHByaW5jaXBhbCBHVUkgbGF5b3V0IGVsZW1lbnRzICoqKi8JCi0JCS8vIHBhaW50U3VyZmFjZQotCQlwYWludFN1cmZhY2UgPSBuZXcgUGFpbnRTdXJmYWNlKHBhaW50Q2FudmFzLCBzdGF0dXNUZXh0LCBwYWludENvbG9yV2hpdGUpOwotCi0JCS8vIGZpbmlzaCBpbml0aWFsaXppbmcgdGhlIHRvb2wgZGF0YQotCQl0b29sc1tQZW5jaWxfdG9vbF0uZGF0YSA9IG5ldyBQZW5jaWxUb29sKHRvb2xTZXR0aW5ncywgcGFpbnRTdXJmYWNlKTsKLQkJdG9vbHNbQWlyYnJ1c2hfdG9vbF0uZGF0YSA9IG5ldyBBaXJicnVzaFRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tMaW5lX3Rvb2xdLmRhdGEgPSBuZXcgTGluZVRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tQb2x5TGluZV90b29sXS5kYXRhID0gbmV3IFBvbHlMaW5lVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW1JlY3RhbmdsZV90b29sXS5kYXRhID0gbmV3IFJlY3RhbmdsZVRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tSb3VuZGVkUmVjdGFuZ2xlX3Rvb2xdLmRhdGEgPSBuZXcgUm91bmRlZFJlY3RhbmdsZVRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tFbGxpcHNlX3Rvb2xdLmRhdGEgPSBuZXcgRWxsaXBzZVRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tUZXh0X3Rvb2xdLmRhdGEgPSBuZXcgVGV4dFRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCi0JCS8vIGNvbG9yRnJhbWUJCQotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29sb3JGcmFtZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJLy8gYWN0aXZlRm9yZWdyb3VuZENvbG9yQ2FudmFzLCBhY3RpdmVCYWNrZ3JvdW5kQ29sb3JDYW52YXMKLQkJYWN0aXZlRm9yZWdyb3VuZENvbG9yQ2FudmFzID0gbmV3IENhbnZhcyhjb2xvckZyYW1lLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyNDsKLQkJYWN0aXZlRm9yZWdyb3VuZENvbG9yQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcyA9IG5ldyBDYW52YXMoY29sb3JGcmFtZSwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMjQ7Ci0JCWFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBwYWxldHRlQ2FudmFzCi0JCWZpbmFsIENhbnZhcyBwYWxldHRlQ2FudmFzID0gbmV3IENhbnZhcyhjb2xvckZyYW1lLCBTV1QuQk9SREVSIHwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCXBhbGV0dGVDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXBhbGV0dGVDYW52YXMuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJCQlDb2xvciBjb2xvciA9IGdldENvbG9yQXQoYm91bmRzLCBlLngsIGUueSk7CQkJCQotCQkJCQkKLQkJCQlpZiAoZS5idXR0b24gPT0gMSkgc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQkJCQllbHNlIHNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0JCQl9Ci0JCQlwcml2YXRlIENvbG9yIGdldENvbG9yQXQoUmVjdGFuZ2xlIGJvdW5kcywgaW50IHgsIGludCB5KSB7Ci0JCQkJaWYgKGJvdW5kcy5oZWlnaHQgPD0gMSAmJiBib3VuZHMud2lkdGggPD0gMSkgcmV0dXJuIHBhaW50Q29sb3JXaGl0ZTsKLQkJCQlmaW5hbCBpbnQgcm93ID0gKHkgLSBib3VuZHMueSkgKiBudW1QYWxldHRlUm93cyAvIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJZmluYWwgaW50IGNvbCA9ICh4IC0gYm91bmRzLngpICogbnVtUGFsZXR0ZUNvbHMgLyBib3VuZHMud2lkdGg7Ci0JCQkJcmV0dXJuIHBhaW50Q29sb3JzW01hdGgubWluKE1hdGgubWF4KHJvdyAqIG51bVBhbGV0dGVDb2xzICsgY29sLCAwKSwgcGFpbnRDb2xvcnMubGVuZ3RoIC0gMSldOwotCQkJfQotCQl9KTsKLQkJTGlzdGVuZXIgcmVmcmVzaExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChlLmdjID09IG51bGwpIHJldHVybjsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcGFsZXR0ZUNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnVtUGFsZXR0ZVJvd3M7ICsrcm93KSB7Ci0JCQkJCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG51bVBhbGV0dGVDb2xzOyArK2NvbCkgewotCQkJCQkJZmluYWwgaW50IHggPSBib3VuZHMud2lkdGggKiBjb2wgLyBudW1QYWxldHRlQ29sczsKLQkJCQkJCWZpbmFsIGludCB5ID0gYm91bmRzLmhlaWdodCAqIHJvdyAvIG51bVBhbGV0dGVSb3dzOwotCQkJCQkJZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgoYm91bmRzLndpZHRoICogKGNvbCArIDEpIC8gbnVtUGFsZXR0ZUNvbHMgLSB4LCAxKTsKLQkJCQkJCWZpbmFsIGludCBoZWlnaHQgPSBNYXRoLm1heChib3VuZHMuaGVpZ2h0ICogKHJvdyArIDEpIC8gbnVtUGFsZXR0ZVJvd3MgLSB5LCAxKTsKLQkJCQkJCWUuZ2Muc2V0QmFja2dyb3VuZChwYWludENvbG9yc1tyb3cgKiBudW1QYWxldHRlQ29scyArIGNvbF0pOwotCQkJCQkJZS5nYy5maWxsUmVjdGFuZ2xlKGJvdW5kcy54ICsgeCwgYm91bmRzLnkgKyB5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJcGFsZXR0ZUNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCByZWZyZXNoTGlzdGVuZXIpOwotCQlwYWxldHRlQ2FudmFzLmFkZExpc3RlbmVyKFNXVC5QYWludCwgcmVmcmVzaExpc3RlbmVyKTsKLQkJLy9wYWxldHRlQ2FudmFzLnJlZHJhdygpOwotCQkKLQkJLy8gdG9vbFNldHRpbmdzRnJhbWUKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXRvb2xTZXR0aW5nc0ZyYW1lLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0b29sU2V0dGluZ3NGcmFtZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJzZXR0aW5ncy5BaXJicnVzaFJhZGl1cy50ZXh0IikpOwotCi0JCWZpbmFsIFNjYWxlIGFpcmJydXNoUmFkaXVzU2NhbGUgPSBuZXcgU2NhbGUodG9vbFNldHRpbmdzRnJhbWUsIFNXVC5IT1JJWk9OVEFMKTsKLQkJYWlyYnJ1c2hSYWRpdXNTY2FsZS5zZXRNaW5pbXVtKDUpOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLnNldE1heGltdW0oNTApOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLnNldFNlbGVjdGlvbih0b29sU2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXMpOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJYWlyYnJ1c2hSYWRpdXNTY2FsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0b29sU2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXMgPSBhaXJicnVzaFJhZGl1c1NjYWxlLmdldFNlbGVjdGlvbigpOwotCQkJCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwotCQkJfQotCQl9KTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbCh0b29sU2V0dGluZ3NGcmFtZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJzZXR0aW5ncy5BaXJicnVzaEludGVuc2l0eS50ZXh0IikpOwotCi0JCWZpbmFsIFNjYWxlIGFpcmJydXNoSW50ZW5zaXR5U2NhbGUgPSBuZXcgU2NhbGUodG9vbFNldHRpbmdzRnJhbWUsIFNXVC5IT1JJWk9OVEFMKTsKLQkJYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZS5zZXRNaW5pbXVtKDEpOwotCQlhaXJicnVzaEludGVuc2l0eVNjYWxlLnNldE1heGltdW0oMTAwKTsKLQkJYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZS5zZXRTZWxlY3Rpb24odG9vbFNldHRpbmdzLmFpcmJydXNoSW50ZW5zaXR5KTsKLQkJYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWFpcmJydXNoSW50ZW5zaXR5U2NhbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdG9vbFNldHRpbmdzLmFpcmJydXNoSW50ZW5zaXR5ID0gYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQkvKioKLQkgKiBEaXNwb3NlcyBvZiBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIKLQkgKiBpbnN0YW5jZSBvZiB0aGUgUGFpbnRFeGFtcGxlLgotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocGFpbnRTdXJmYWNlICE9IG51bGwpIHBhaW50U3VyZmFjZS5kaXNwb3NlKCk7CQkKLQkJaWYgKHBhaW50Q29sb3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFpbnRDb2xvcnMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBDb2xvciBjb2xvciA9IHBhaW50Q29sb3JzW2ldOwotCQkJCWlmIChjb2xvciAhPSBudWxsKSBjb2xvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcGFpbnREZWZhdWx0Rm9udCA9IG51bGw7Ci0JCXBhaW50Q29sb3JzID0gbnVsbDsKLQkJcGFpbnRTdXJmYWNlID0gbnVsbDsKLQkJZnJlZVJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIEZyZWVzIHRoZSByZXNvdXJjZSBidW5kbGUgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZyZWVSZXNvdXJjZXMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbHMubGVuZ3RoOyArK2kpIHsKLQkJCVRvb2wgdG9vbCA9IHRvb2xzW2ldOwotCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSB0b29sLmltYWdlOwotCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCXRvb2wuaW1hZ2UgPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIERpc3BsYXkuCi0JICogCi0JICogQHJldHVybiB0aGUgZGlzcGxheSB3ZSdyZSB1c2luZwotCSAqLwotCXB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBtYWluQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb2xvcnMsIGZvbnRzLCBhbmQgdG9vbCBzZXR0aW5ncy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbWFpbkNvbXBvc2l0ZS5nZXREaXNwbGF5KCk7Ci0JCQotCQlwYWludENvbG9yV2hpdGUgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDI1NSk7Ci0JCXBhaW50Q29sb3JCbGFjayA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAwKTsKLQkJCi0JCXBhaW50RGVmYXVsdEZvbnQgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKTsKLQotCQlwYWludENvbG9ycyA9IG5ldyBDb2xvcltudW1QYWxldHRlQ29scyAqIG51bVBhbGV0dGVSb3dzXTsKLQkJcGFpbnRDb2xvcnNbMF0gPSBwYWludENvbG9yQmxhY2s7Ci0JCXBhaW50Q29sb3JzWzFdID0gcGFpbnRDb2xvcldoaXRlOwotCQlmb3IgKGludCBpID0gMjsgaSA8IHBhaW50Q29sb3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYWludENvbG9yc1tpXSA9IG5ldyBDb2xvcihkaXNwbGF5LAotCQkJCSgoaSo3KSUyNTUpLCgoaSoyMyklMjU1KSwgKChpKjUxKSUyNTUpKTsKLQkJfQotCi0JCXRvb2xTZXR0aW5ncyA9IG5ldyBUb29sU2V0dGluZ3MoKTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciA9IHBhaW50Q29sb3JCbGFjazsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciA9IHBhaW50Q29sb3JXaGl0ZTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkZvbnQgPSBwYWludERlZmF1bHRGb250OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGlvbiBmaWVsZCBvZiB0aGUgdG9vbHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdEFjdGlvbnMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbHMubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIFRvb2wgdG9vbCA9IHRvb2xzW2ldOwotCQkJU3RyaW5nIGdyb3VwID0gdG9vbC5ncm91cDsKLQkJCWlmIChncm91cC5lcXVhbHMoInRvb2wiKSkgewotCQkJCXRvb2wuYWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzZXRQYWludFRvb2wodG9vbC5pZCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSBlbHNlIGlmIChncm91cC5lcXVhbHMoImZpbGwiKSkgewotCQkJCXRvb2wuYWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzZXRGaWxsVHlwZSh0b29sLmlkKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9IGVsc2UgaWYgKGdyb3VwLmVxdWFscygibGluZXN0eWxlIikpIHsKLQkJCQl0b29sLmFjdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc2V0TGluZVN0eWxlKHRvb2wuaWQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0gZWxzZSBpZiAoZ3JvdXAuZXF1YWxzKCJvcHRpb25zIikpIHsKLQkJCQl0b29sLmFjdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJRm9udERpYWxvZyBmb250RGlhbG9nID0gbmV3IEZvbnREaWFsb2cocGFpbnRTdXJmYWNlLmdldFNoZWxsKCksIFNXVC5QUklNQVJZX01PREFMKTsKLQkJCQkJCUZvbnREYXRhW10gZm9udERhdHVtID0gdG9vbFNldHRpbmdzLmNvbW1vbkZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJCQkJCWlmIChmb250RGF0dW0gIT0gbnVsbCAmJiBmb250RGF0dW0ubGVuZ3RoID4gMCkgewotCQkJCQkJCWZvbnREaWFsb2cuc2V0Rm9udExpc3QoZm9udERhdHVtKTsKLQkJCQkJCX0KLQkJCQkJCWZvbnREaWFsb2cuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygib3B0aW9ucy5Gb250LmRpYWxvZy50aXRsZSIpKTsKLQotCQkJCQkJcGFpbnRTdXJmYWNlLmhpZGVSdWJiZXJiYW5kKCk7Ci0JCQkJCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbigpOwotCQkJCQkJcGFpbnRTdXJmYWNlLnNob3dSdWJiZXJiYW5kKCk7Ci0JCQkJCQlpZiAoZm9udERhdGEgIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUZvbnQgZm9udCA9IG5ldyBGb250KG1haW5Db21wb3NpdGUuZ2V0RGlzcGxheSgpLCBmb250RGF0YSk7Ci0JCQkJCQkJCXRvb2xTZXR0aW5ncy5jb21tb25Gb250ID0gZm9udDsKLQkJCQkJCQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7Ci0JCQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBpbWFnZSByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdFJlc291cmNlcygpIHsKLQkJZmluYWwgQ2xhc3MgY2xhenogPSBQYWludEV4YW1wbGUuY2xhc3M7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJVG9vbCB0b29sID0gdG9vbHNbaV07Ci0JCQkJCVN0cmluZyBpZCA9IHRvb2wuZ3JvdXAgKyAnLicgKyB0b29sLm5hbWU7Ci0JCQkJCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLmltYWdlIikpOwotCQkJCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YShzb3VyY2VTdHJlYW0pOwotCQkJCQlJbWFnZURhdGEgbWFzayA9IHNvdXJjZS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JCQkJCXRvb2wuaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgc291cmNlLCBtYXNrKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNvdXJjZVN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGVycm9yID0gKHJlc291cmNlQnVuZGxlICE9IG51bGwpID8KLQkJCWdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSA6Ci0JCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzIjsKLQkJZnJlZVJlc291cmNlcygpOwotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlcnJvcik7Ci0JfQotCi0JLyoqCi0JICogR3JhYnMgaW5wdXQgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCW1haW5Db21wb3NpdGUuc2V0Rm9jdXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCBmb3JlZ3JvdW5kIGNvbG9yLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgbmV3IGNvbG9yIHRvIHVzZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgewotCQlpZiAoYWN0aXZlRm9yZWdyb3VuZENvbG9yQ2FudmFzICE9IG51bGwpCi0JCQlhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCXRvb2xTZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IgPSBjb2xvcjsKLQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB0b29sIGJhY2tncm91bmQgY29sb3IuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBuZXcgY29sb3IgdG8gdXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWlmIChhY3RpdmVCYWNrZ3JvdW5kQ29sb3JDYW52YXMgIT0gbnVsbCkKLQkJCWFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciA9IGNvbG9yOwotCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIGEgdG9vbCBnaXZlbiBpdHMgSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFpbnRUb29sKGludCBpZCkgewotCQlQYWludFRvb2wgcGFpbnRUb29sID0gKFBhaW50VG9vbCkgdG9vbHNbaWRdLmRhdGE7Ci0JCXBhaW50U3VyZmFjZS5zZXRQYWludFNlc3Npb24ocGFpbnRUb29sKTsKLQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7Ci0JfQotCQotCS8qKgotCSAqIFNlbGVjdHMgYSBmaWxsdHlwZSBnaXZlbiBpdHMgSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsbFR5cGUoaW50IGlkKSB7Ci0JCUludGVnZXIgZmlsbFR5cGUgPSAoSW50ZWdlcikgdG9vbHNbaWRdLmRhdGE7Ci0JCXRvb2xTZXR0aW5ncy5jb21tb25GaWxsVHlwZSA9IGZpbGxUeXBlLmludFZhbHVlKCk7Ci0JCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwkJCi0JfQotCi0JLyoqCi0JICogU2VsZWN0cyBsaW5lIHR5cGUgZ2l2ZW4gaXRzIElELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmVTdHlsZShpbnQgaWQpIHsKLQkJSW50ZWdlciBsaW5lVHlwZSA9IChJbnRlZ2VyKSB0b29sc1tpZF0uZGF0YTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSA9IGxpbmVUeXBlLmludFZhbHVlKCk7Ci0JCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwkJCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgc2hlbGwgdG8gaXQncyAicGFja2VkIiBzaXplLAotCSAqIHVubGVzcyB0aGF0IG1ha2VzIGl0IGJpZ2dlciB0aGFuIHRoZSBkaXNwbGF5LAotCSAqIGluIHdoaWNoIGNhc2Ugc2V0IGl0IHRvIDkvMTAgb2YgZGlzcGxheSBzaXplLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0U2hlbGxTaXplIChEaXNwbGF5IGRpc3BsYXksIFNoZWxsIHNoZWxsKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCQlQb2ludCBzaXplID0gc2hlbGwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWlmIChzaXplLnggPiBib3VuZHMud2lkdGgpIHNpemUueCA9IGJvdW5kcy53aWR0aCAqIDkgLyAxMDsKLQkJaWYgKHNpemUueSA+IGJvdW5kcy5oZWlnaHQpIHNpemUueSA9IGJvdW5kcy5oZWlnaHQgKiA5IC8gMTA7Ci0JCXNoZWxsLnNldFNpemUgKHNpemUpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSB0b29sIHRoYXQgaXRzIHNldHRpbmdzIGhhdmUgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlVG9vbFNldHRpbmdzKCkgewotCQlmaW5hbCBQYWludFRvb2wgYWN0aXZlUGFpbnRUb29sID0gcGFpbnRTdXJmYWNlLmdldFBhaW50VG9vbCgpOwotCQlpZiAoYWN0aXZlUGFpbnRUb29sID09IG51bGwpIHJldHVybjsKLQkJCi0JCWFjdGl2ZVBhaW50VG9vbC5lbmRTZXNzaW9uKCk7Ci0JCWFjdGl2ZVBhaW50VG9vbC5zZXQodG9vbFNldHRpbmdzKTsKLQkJYWN0aXZlUGFpbnRUb29sLmJlZ2luU2Vzc2lvbigpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRTZXNzaW9uLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZhODZmNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotLyoqCi0gKiBNYW5hZ2VzIGFuIGludGVyYWN0aXZlIHBhaW50IHNlc3Npb24uCi0gKiBOb3RlIHRoYXQgdGhlIGNvb3JkaW5hdGVzIHJlY2VpdmVkIHZpYSB0aGUgbGlzdGVuZXIgaW50ZXJmYWNlcyBhcmUgdmlydHVhbGl6ZWQgdG8gemVyby1vcmlnaW4KLSAqIHJlbGF0aXZlIHRvIHRoZSBwYWludGluZyBzdXJmYWNlLgotICovIAotcHVibGljIGludGVyZmFjZSBQYWludFNlc3Npb24gZXh0ZW5kcyBNb3VzZUxpc3RlbmVyLCBNb3VzZU1vdmVMaXN0ZW5lciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFpbnQgc3VyZmFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWludCBzZXNzaW9uCi0JICogCi0JICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBQYWludFN1cmZhY2UKLQkgKi8KLQlwdWJsaWMgUGFpbnRTdXJmYWNlIGdldFBhaW50U3VyZmFjZSgpOwotCi0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSBzZXNzaW9uLgotCSAqIAotCSAqIE5vdGU6IFdoZW4gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCwgY2FsbCBzdXBlci5iZWdpblNlc3Npb24oKSBhdCBtZXRob2Qgc3RhcnQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYmVnaW5TZXNzaW9uKCk7Ci0JCi0JLyoqCi0JICogRGVhY3RpdmF0ZXMgdGhlIHNlc3Npb24uCi0gICAgICoKLQkgKiBOb3RlOiBXaGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QsIGNhbGwgc3VwZXIuZW5kU2Vzc2lvbigpIGF0IG1ldGhvZCBleGl0LgotICAgICAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZFNlc3Npb24oKTsKLQkKLQkvKioKLQkgKiBSZXNldHMgdGhlIHNlc3Npb24uCi0JICogQWJvcnRzIGFueSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MuCi0JICogCi0JICogTm90ZTogV2hlbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCBjYWxsIHN1cGVyLnJlc2V0U2Vzc2lvbigpIGF0IG1ldGhvZCBleGl0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc2V0U2Vzc2lvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9vbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIHRvb2wKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFN1cmZhY2UuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U3VyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODY2NDA5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U3VyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBNYW5hZ2VzIGEgc2ltcGxlIGRyYXdpbmcgc3VyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFBhaW50U3VyZmFjZSB7Ci0JcHJpdmF0ZSBQb2ludCBjdXJyZW50UG9zaXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7Ci0JcHJpdmF0ZSBDYW52YXMgcGFpbnRDYW52YXM7Ci0KLQlwcml2YXRlIFBhaW50U2Vzc2lvbiBwYWludFNlc3Npb247Ci0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQlwcml2YXRlIEltYWdlIHBhaW50SW1hZ2U7IC8vIGJ1ZmZlciBmb3IgcmVmcmVzaCBibGl0cwotCXByaXZhdGUgaW50ICAgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQ7Ci0JcHJpdmF0ZSBpbnQgICB2aXNpYmxlV2lkdGgsIHZpc2libGVIZWlnaHQ7Ci0KLQlwcml2YXRlIEZpZ3VyZURyYXdDb250ZXh0IGRpc3BsYXlGREMgPSBuZXcgRmlndXJlRHJhd0NvbnRleHQoKTsKLQlwcml2YXRlIEZpZ3VyZURyYXdDb250ZXh0IGltYWdlRkRDID0gbmV3IEZpZ3VyZURyYXdDb250ZXh0KCk7Ci0JcHJpdmF0ZSBGaWd1cmVEcmF3Q29udGV4dCBwYWludEZEQyA9IG5ldyBGaWd1cmVEcmF3Q29udGV4dCgpOwotCi0JLyogUnViYmVyYmFuZCAqLwotCXByaXZhdGUgQ29udGFpbmVyRmlndXJlIHJ1YmJlcmJhbmQgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0JCS8vIHRoZSBhY3RpdmUgcnViYmVyYmFuZCBzZWxlY3Rpb24KLQlwcml2YXRlIGludCBydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50ID0gMDsKLQkJLy8gYWx3YXlzID49IDAsIGlmID4gMCBydWJiZXJiYW5kIGhhcyBiZWVuIGhpZGRlbgotCi0JLyogU3RhdHVzICovCi0JcHJpdmF0ZSBUZXh0IHN0YXR1c1RleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgc3RhdHVzQWN0aW9uSW5mbywgc3RhdHVzTWVzc2FnZUluZm8sIHN0YXR1c0Nvb3JkSW5mbzsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFN1cmZhY2UuCi0JICogPHA+Ci0JICogcGFpbnRDYW52YXMgbXVzdCBoYXZlIFNXVC5OT19SRURSQVdfUkVTSVpFIGFuZCBTV1QuTk9fQkFDS0dST1VORCBzdHlsZXMsCi0JICogICAgIGFuZCBtYXkgaGF2ZSBTV1QuVl9TQ1JPTEwgYW5kL29yIFNXVC5IX1NDUk9MTC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHBhaW50Q2FudmFzIHRoZSBDYW52YXMgb2JqZWN0IGluIHdoaWNoIHRvIHJlbmRlcgotCSAqIEBwYXJhbSBwYWludFN0YXR1cyB0aGUgUGFpbnRTdGF0dXMgb2JqZWN0IHRvIHVzZSBmb3IgcHJvdmlkaW5nIHVzZXIgZmVlZGJhY2sKLQkgKiBAcGFyYW0gZmlsbENvbG9yIHRoZSBjb2xvciB0byBmaWxsIHRoZSBjYW52YXMgd2l0aCBpbml0aWFsbHkKLQkgKi8KLQlwdWJsaWMgUGFpbnRTdXJmYWNlKENhbnZhcyBwYWludENhbnZhcywgVGV4dCBzdGF0dXNUZXh0LCBDb2xvciBmaWxsQ29sb3IpIHsKLQkJdGhpcy5wYWludENhbnZhcyA9IHBhaW50Q2FudmFzOwotCQl0aGlzLnN0YXR1c1RleHQgPSBzdGF0dXNUZXh0OwotCQljbGVhclN0YXR1cygpOwotCi0JCS8qIFNldCB1cCB0aGUgZHJhd2luZyBzdXJmYWNlICovCi0JCVJlY3RhbmdsZSBkaXNwbGF5UmVjdCA9IHBhaW50Q2FudmFzLmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCWltYWdlV2lkdGggPSBkaXNwbGF5UmVjdC53aWR0aDsKLQkJaW1hZ2VIZWlnaHQgPSBkaXNwbGF5UmVjdC5oZWlnaHQ7Ci0JCWltYWdlID0gbmV3IEltYWdlKHBhaW50Q2FudmFzLmdldERpc3BsYXkoKSwgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpOwotCi0JCWltYWdlRkRDLmdjID0gbmV3IEdDKGltYWdlKTsKLQkJaW1hZ2VGREMuZ2Muc2V0QmFja2dyb3VuZChmaWxsQ29sb3IpOwotCQlpbWFnZUZEQy5nYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0KTsKLQkJZGlzcGxheUZEQy5nYyA9IG5ldyBHQyhwYWludENhbnZhcyk7Ci0KLQkJLyogSW5pdGlhbGl6ZSB0aGUgc2Vzc2lvbiAqLwotCQlzZXRQYWludFNlc3Npb24obnVsbCk7Ci0KLQkJLyogQWRkIG91ciBsaXN0ZW5lcnMgKi8KLQkJcGFpbnRDYW52YXMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWRpc3BsYXlGREMuZ2MuZGlzcG9zZSgpOwotCQkJfQkJCQotCQl9KTsKLQkJcGFpbnRDYW52YXMuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKGV2ZW50KTsKLQkJCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHBhaW50U2Vzc2lvbi5tb3VzZURvd24oZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJcHJvY2Vzc01vdXNlRXZlbnRDb29yZGluYXRlcyhldmVudCk7Ci0JCQkJaWYgKHBhaW50U2Vzc2lvbiAhPSBudWxsKSBwYWludFNlc3Npb24ubW91c2VVcChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKGV2ZW50KTsKLQkJCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHBhaW50U2Vzc2lvbi5tb3VzZURvdWJsZUNsaWNrKGV2ZW50KTsKLQkJCX0JCQkKLQkJfSk7Ci0JCXBhaW50Q2FudmFzLmFkZE1vdXNlTW92ZUxpc3RlbmVyKG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJcHJvY2Vzc01vdXNlRXZlbnRDb29yZGluYXRlcyhldmVudCk7Ci0JCQkJaWYgKHBhaW50U2Vzc2lvbiAhPSBudWxsKSBwYWludFNlc3Npb24ubW91c2VNb3ZlKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXBhaW50Q2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotCQkJCWlmIChydWJiZXJiYW5kLmlzRW1wdHkoKSkgewotCQkJCQkvLyBOb3RoaW5nIHRvIG1lcmdlLCBzbyB3ZSBqdXN0IHJlZnJlc2gKLQkJCQkJZXZlbnQuZ2MuZHJhd0ltYWdlKGltYWdlLAotCQkJCQkJZGlzcGxheUZEQy54T2Zmc2V0ICsgZXZlbnQueCwgZGlzcGxheUZEQy55T2Zmc2V0ICsgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCwKLQkJCQkJCWV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEF2b2lkIGZsaWNrZXIgd2hlbiBtZXJnaW5nIG92ZXJsYXllZCBvYmplY3RzIGJ5IGNvbnN0cnVjdGluZyB0aGUgaW1hZ2Ugb24KLQkJCQkJICogYSBiYWNrYnVmZmVyIGZpcnN0LCB0aGVuIGJsaXR0aW5nIGl0IHRvIHRoZSBzY3JlZW4uCi0JCQkJCSAqLwotCQkJCQkvLyBDaGVjayB0aGF0IHRoZSBiYWNrYnVmZmVyIGlzIGxhcmdlIGVub3VnaAotCQkJCQlpZiAocGFpbnRJbWFnZSAhPSBudWxsKSB7Ci0JCQkJCQlSZWN0YW5nbGUgcmVjdCA9IHBhaW50SW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQkJCQlpZiAoKGV2ZW50LndpZHRoICsgZXZlbnQueCA+IHJlY3Qud2lkdGgpIHx8Ci0JCQkJCQkJKGV2ZW50LmhlaWdodCArIGV2ZW50LnkgPiByZWN0LmhlaWdodCkpIHsKLQkJCQkJCQlwYWludEZEQy5nYy5kaXNwb3NlKCk7Ci0JCQkJCQkJcGFpbnRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJcGFpbnRJbWFnZSA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHBhaW50SW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBkaXNwbGF5LmdldENsaWVudEFyZWEoKTsKLQkJCQkJCXBhaW50SW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwKLQkJCQkJCQlNYXRoLm1heChyZWN0LndpZHRoLCBldmVudC53aWR0aCArIGV2ZW50LngpLAotCQkJCQkJCU1hdGgubWF4KHJlY3QuaGVpZ2h0LCBldmVudC5oZWlnaHQgKyBldmVudC55KSk7Ci0JCQkJCQlwYWludEZEQy5nYyA9IG5ldyBHQyhwYWludEltYWdlKTsKLQkJCQkJfQotCQkJCQkvLyBTZXR1cCBjbGlwcGluZyBhbmQgdGhlIEZEQwotCQkJCQlSZWdpb24gY2xpcFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJCQkJZXZlbnQuZ2MuZ2V0Q2xpcHBpbmcoY2xpcFJlZ2lvbik7CQkJCQkKLQkJCQkJcGFpbnRGREMuZ2Muc2V0Q2xpcHBpbmcoY2xpcFJlZ2lvbik7Ci0JCQkJCWNsaXBSZWdpb24uZGlzcG9zZSgpOwotCi0JCQkJCXBhaW50RkRDLnhPZmZzZXQgPSBkaXNwbGF5RkRDLnhPZmZzZXQ7Ci0JCQkJCXBhaW50RkRDLnlPZmZzZXQgPSBkaXNwbGF5RkRDLnlPZmZzZXQ7Ci0JCQkJCXBhaW50RkRDLnhTY2FsZSA9IGRpc3BsYXlGREMueFNjYWxlOwotCQkJCQlwYWludEZEQy55U2NhbGUgPSBkaXNwbGF5RkRDLnlTY2FsZTsKLQkJCQkJCi0JCQkJCS8vIE1lcmdlIHRoZSBvdmVybGF5ZWQgb2JqZWN0cyBpbnRvIHRoZSBpbWFnZSwgdGhlbiBibGl0Ci0JCQkJCXBhaW50RkRDLmdjLmRyYXdJbWFnZShpbWFnZSwKLQkJCQkJCWRpc3BsYXlGREMueE9mZnNldCArIGV2ZW50LngsIGRpc3BsYXlGREMueU9mZnNldCArIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQsCi0JCQkJCQlldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0KTsKLQkJCQkJcnViYmVyYmFuZC5kcmF3KHBhaW50RkRDKTsKLQkJCQkJZXZlbnQuZ2MuZHJhd0ltYWdlKHBhaW50SW1hZ2UsCi0JCQkJCQlldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0LAotCQkJCQkJZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcGFpbnRDYW52YXMuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVJlc2l6ZSgpOwotCQkJfQkJCQotCQl9KTsKLQotCQkvKiBTZXQgdXAgdGhlIHBhaW50IGNhbnZhcyBzY3JvbGwgYmFycyAqLwotCQlTY3JvbGxCYXIgaG9yaXpvbnRhbCA9IHBhaW50Q2FudmFzLmdldEhvcml6b250YWxCYXIoKTsKLQkJaG9yaXpvbnRhbC5zZXRWaXNpYmxlKHRydWUpOwotCQlob3Jpem9udGFsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzY3JvbGxIb3Jpem9udGFsbHkoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJfQotCQl9KTsKLQkJU2Nyb2xsQmFyIHZlcnRpY2FsID0gcGFpbnRDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJdmVydGljYWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJdmVydGljYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjcm9sbFZlcnRpY2FsbHkoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJfQotCQl9KTsKLQkJaGFuZGxlUmVzaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoZSBQYWludFN1cmZhY2UncyByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW1hZ2VGREMuZ2MuZGlzcG9zZSgpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWlmIChwYWludEltYWdlICE9IG51bGwpIHsKLQkJCXBhaW50SW1hZ2UuZGlzcG9zZSgpOwotCQkJcGFpbnRGREMuZ2MuZGlzcG9zZSgpOwotCQl9Ci0KLQkJY3VycmVudFBvc2l0aW9uID0gbnVsbDsKLQkJcGFpbnRDYW52YXMgPSBudWxsOwotCQlwYWludFNlc3Npb24gPSBudWxsOwotCQlpbWFnZSA9IG51bGw7Ci0JCXBhaW50SW1hZ2UgPSBudWxsOwotCQlkaXNwbGF5RkRDID0gbnVsbDsKLQkJaW1hZ2VGREMgPSBudWxsOwotCQlwYWludEZEQyA9IG51bGw7Ci0JCXJ1YmJlcmJhbmQgPSBudWxsOwotCQlzdGF0dXNUZXh0ID0gbnVsbDsKLQkJc3RhdHVzQWN0aW9uSW5mbyA9IG51bGw7Ci0JCXN0YXR1c01lc3NhZ2VJbmZvID0gbnVsbDsKLQkJc3RhdHVzQ29vcmRJbmZvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB3ZSBtdXN0IGdyYWIgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSAgewotCQlwYWludENhbnZhcy5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIERpc3BsYXkgb24gd2hpY2ggdGhlIFBhaW50U3VyZmFjZSByZXNpZGVzLgotCSAqIEByZXR1cm4gdGhlIERpc3BsYXkKLQkgKi8KLQlwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQlyZXR1cm4gcGFpbnRDYW52YXMuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFNoZWxsIGluIHdoaWNoIHRoZSBQYWludFN1cmZhY2UgcmVzaWRlcy4KLQkgKiBAcmV0dXJuIHRoZSBTaGVsbAotCSAqLwotCXB1YmxpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIHBhaW50Q2FudmFzLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBwYWludCBzZXNzaW9uLgotCSAqIDxwPgotCSAqIElmIG9sZFBhaW50U2Vzc2lvbiAhPSBwYWludFNlc3Npb24gY2FsbHMgb2xkUGFpbnRTZXNzaW9uLmVuZCgpCi0JICogYW5kIHBhaW50U2Vzc2lvbi5iZWdpbigpCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYWludFNlc3Npb24gdGhlIHBhaW50IHNlc3Npb24gdG8gYWN0aXZhdGU7IG51bGwgdG8gZGlzYWJsZSBhbGwgc2Vzc2lvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWludFNlc3Npb24oUGFpbnRTZXNzaW9uIHBhaW50U2Vzc2lvbikgewotCQlpZiAodGhpcy5wYWludFNlc3Npb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMucGFpbnRTZXNzaW9uID09IHBhaW50U2Vzc2lvbikgcmV0dXJuOwotCQkJdGhpcy5wYWludFNlc3Npb24uZW5kU2Vzc2lvbigpOwotCQl9Ci0JCXRoaXMucGFpbnRTZXNzaW9uID0gcGFpbnRTZXNzaW9uOwotCQljbGVhclN0YXR1cygpOwotCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHsKLQkJCXNldFN0YXR1c0FjdGlvbihwYWludFNlc3Npb24uZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCQlwYWludFNlc3Npb24uYmVnaW5TZXNzaW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRTdGF0dXNBY3Rpb24oUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLk51bGwubGFiZWwiKSk7Ci0JCQlzZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygic2Vzc2lvbi5OdWxsLm1lc3NhZ2UiKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBhaW50IHNlc3Npb24uCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBwYWludCBzZXNzaW9uLCBudWxsIGlmIG5vbmUgaXMgYWN0aXZlCi0JICovCi0JcHVibGljIFBhaW50U2Vzc2lvbiBnZXRQYWludFNlc3Npb24oKSB7Ci0JCXJldHVybiBwYWludFNlc3Npb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBwYWludCB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcGFpbnQgdG9vbCwgbnVsbCBpZiBub25lIGlzIGFjdGl2ZSAodGhvdWdoIHNvbWUgb3RoZXIgc2Vzc2lvbgotCSAqICAgICAgICAgbWlnaHQgYmUpCi0JICovCi0JcHVibGljIFBhaW50VG9vbCBnZXRQYWludFRvb2woKSB7Ci0JCXJldHVybiAocGFpbnRTZXNzaW9uICE9IG51bGwgJiYgcGFpbnRTZXNzaW9uIGluc3RhbmNlb2YgUGFpbnRUb29sKSA/Ci0JCQkoUGFpbnRUb29sKXBhaW50U2Vzc2lvbiA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBhbiBpbnRlcmFjdGl2ZSBvcGVyYXRpb24uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBsYXN0IGtub3duIHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyCi0JICovCi0JcHVibGljIFBvaW50IGdldEN1cnJlbnRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyBhIEZpZ3VyZSBvYmplY3QgdG8gdGhlIHNjcmVlbiBhbmQgdG8gdGhlIGJhY2tpbmcgc3RvcmUgcGVybWFuZW50bHkuCi0JICogCi0JICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRvIGRyYXcgb25zY3JlZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmF3RmlndXJlKEZpZ3VyZSBvYmplY3QpIHsKLQkJb2JqZWN0LmRyYXcoaW1hZ2VGREMpOwotCQlvYmplY3QuZHJhdyhkaXNwbGF5RkRDKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgRmlndXJlIG9iamVjdCB0byB0aGUgYWN0aXZlIHJ1YmJlcmJhbmQgc2VsZWN0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgb2JqZWN0IHdpbGwgYmUgZHJhd24gdG8gdGhlIHNjcmVlbiBhcyBhIHByZXZpZXcgYW5kIHJlZnJlc2hlZCBhcHByb3ByaWF0ZWx5Ci0JICogdW50aWwgdGhlIHNlbGVjdGlvbiBpcyBlaXRoZXIgY2xlYXJlZCBvciBjb21taXR0ZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhZGQgdG8gdGhlIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJ1YmJlcmJhbmRTZWxlY3Rpb24oRmlndXJlIG9iamVjdCkgewotCQlydWJiZXJiYW5kLmFkZChvYmplY3QpOwotCQlpZiAoISBpc1J1YmJlcmJhbmRIaWRkZW4oKSkgb2JqZWN0LmRyYXcoZGlzcGxheUZEQyk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBhY3RpdmUgcnViYmVyYmFuZCBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogRXJhc2VzIGFueSBydWJiZXJiYW5kIG9iamVjdHMgb24gdGhlIHNjcmVlbiB0aGVuIGNsZWFycyB0aGUgc2VsZWN0aW9uLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKSB7Ci0JCWlmICghIGlzUnViYmVyYmFuZEhpZGRlbigpKSB7Ci0JCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQkJcnViYmVyYmFuZC5hZGREYW1hZ2VkUmVnaW9uKGRpc3BsYXlGREMsIHJlZ2lvbik7Ci0JCQlSZWN0YW5nbGUgciA9IHJlZ2lvbi5nZXRCb3VuZHMoKTsKLQkJCXBhaW50Q2FudmFzLnJlZHJhdyhyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQsIHRydWUpOwotCQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJfQotCQlydWJiZXJiYW5kLmNsZWFyKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDb21taXRzIHRoZSBhY3RpdmUgcnViYmVyYmFuZCBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogUmVkcmF3cyBhbnkgcnViYmVyYmFuZCBvYmplY3RzIG9uIHRoZSBzY3JlZW4gYXMgcGVybWFuZW50IG9iamVjdHMgdGhlbiBjbGVhcnMgdGhlIHNlbGVjdGlvbi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgY29tbWl0UnViYmVyYmFuZFNlbGVjdGlvbigpIHsKLQkJcnViYmVyYmFuZC5kcmF3KGltYWdlRkRDKTsKLQkJaWYgKGlzUnViYmVyYmFuZEhpZGRlbigpKSBydWJiZXJiYW5kLmRyYXcoZGlzcGxheUZEQyk7Ci0JCXJ1YmJlcmJhbmQuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogSGlkZXMgdGhlIHJ1YmJlcmJhbmQgKGJ1dCBkb2VzIG5vdCBlbGltaW5hdGUgaXQpLgotCSAqIDxwPgotCSAqIEluY3JlbWVudHMgYnkgb25lIHRoZSBydWJiZXJiYW5kICJoaWRlIiBuZXN0aW5nIGNvdW50LiAgVGhlIHJ1YmJlcmJhbmQKLQkgKiBpcyBoaWRkZW4gZnJvbSB2aWV3IChidXQgcmVtYWlucyBhY3RpdmUpIGlmIGl0IHdhc24ndCBhbHJlYWR5IGhpZGRlbi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgaGlkZVJ1YmJlcmJhbmQoKSB7Ci0JCWlmIChydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50KysgPD0gMCkgewotCQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJCXJ1YmJlcmJhbmQuYWRkRGFtYWdlZFJlZ2lvbihkaXNwbGF5RkRDLCByZWdpb24pOwotCQkJUmVjdGFuZ2xlIHIgPSByZWdpb24uZ2V0Qm91bmRzKCk7Ci0JCQlwYWludENhbnZhcy5yZWRyYXcoci54LCByLnksIHIud2lkdGgsIHIuaGVpZ2h0LCB0cnVlKTsKLQkJCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JCX0KLQl9CQkKLQotCS8qKgotCSAqIFNob3dzICh1bi1oaWRlcykgdGhlIHJ1YmJlcmJhbmQuCi0JICogPHA+Ci0JICogRGVjcmVtZW50cyBieSBvbmUgdGhlIHJ1YmJlcmJhbmQgImhpZGUiIG5lc3RpbmcgY291bnQuICBUaGUgcnViYmVyYmFuZAotCSAqIGlzIG9ubHkgbWFkZSB2aXNpYmxlIHdoZW4gc2hvd1J1YmJlcmJhbmQoKSBoYXMgYmVlbiBjYWxsZWQgb25jZSBmb3IgZWFjaAotCSAqIHByZXZpb3VzIGhpZGVSdWJiZXJiYW5kKCkuICBJdCBpcyBub3QgcGVybWl0dGVkIHRvIGNhbGwgc2hvd1J1YmJlcmJhbmQoKSBpZgotCSAqIHRoZSBydWJiZXIgYmFuZCBpcyBub3QgcHJlc2VudGx5IGhpZGRlbi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgc2hvd1J1YmJlcmJhbmQoKSB7Ci0JCWlmIChydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50IDw9IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50ID4gMCIpOwotCQlpZiAoLS1ydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50ID09IDApIHsKLQkJCXJ1YmJlcmJhbmQuZHJhdyhkaXNwbGF5RkRDKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBydWJiZXJiYW5kIGlzIGhpZGRlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBydWJiZXIgaXMgaGlkZGVuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdWJiZXJiYW5kSGlkZGVuKCkgewotCQlyZXR1cm4gcnViYmVyYmFuZEhpZGRlbk5lc3RpbmdDb3VudCA+IDA7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIGhvcml6b250YWwgc2Nyb2xsIGV2ZW50Ci0JICogCi0JICogQHBhcmFtIHNjcm9sbGJhciB0aGUgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIHRoYXQgcG9zdGVkIHRoaXMgZXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzY3JvbGxIb3Jpem9udGFsbHkoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoaW1hZ2VXaWR0aCA+IHZpc2libGVXaWR0aCkgewotCQkJZmluYWwgaW50IG9sZE9mZnNldCA9IGRpc3BsYXlGREMueE9mZnNldDsKLQkJCWZpbmFsIGludCBuZXdPZmZzZXQgPSBNYXRoLm1pbihzY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCksIGltYWdlV2lkdGggLSB2aXNpYmxlV2lkdGgpOwotCQkJaWYgKG9sZE9mZnNldCAhPSBuZXdPZmZzZXQpIHsKLQkJCQlwYWludENhbnZhcy51cGRhdGUoKTsKLQkJCQlkaXNwbGF5RkRDLnhPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JCQkJcGFpbnRDYW52YXMuc2Nyb2xsKE1hdGgubWF4KG9sZE9mZnNldCAtIG5ld09mZnNldCwgMCksIDAsIE1hdGgubWF4KG5ld09mZnNldCAtIG9sZE9mZnNldCwgMCksIDAsCi0JCQkJCXZpc2libGVXaWR0aCwgdmlzaWJsZUhlaWdodCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIHZlcnRpY2FsIHNjcm9sbCBldmVudAotCSAqIAotCSAqIEBwYXJhbSBzY3JvbGxiYXIgdGhlIHZlcnRpY2FsIHNjcm9sbCBiYXIgdGhhdCBwb3N0ZWQgdGhpcyBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNjcm9sbFZlcnRpY2FsbHkoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoaW1hZ2VIZWlnaHQgPiB2aXNpYmxlSGVpZ2h0KSB7Ci0JCQlmaW5hbCBpbnQgb2xkT2Zmc2V0ID0gZGlzcGxheUZEQy55T2Zmc2V0OwotCQkJZmluYWwgaW50IG5ld09mZnNldCA9IE1hdGgubWluKHNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKSwgaW1hZ2VIZWlnaHQgLSB2aXNpYmxlSGVpZ2h0KTsKLQkJCWlmIChvbGRPZmZzZXQgIT0gbmV3T2Zmc2V0KSB7Ci0JCQkJcGFpbnRDYW52YXMudXBkYXRlKCk7Ci0JCQkJZGlzcGxheUZEQy55T2Zmc2V0ID0gbmV3T2Zmc2V0OwotCQkJCXBhaW50Q2FudmFzLnNjcm9sbCgwLCBNYXRoLm1heChvbGRPZmZzZXQgLSBuZXdPZmZzZXQsIDApLCAwLCBNYXRoLm1heChuZXdPZmZzZXQgLSBvbGRPZmZzZXQsIDApLAotCQkJCQl2aXNpYmxlV2lkdGgsIHZpc2libGVIZWlnaHQsIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIHJlc2l6ZSBldmVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVzaXplKCkgewotCQlwYWludENhbnZhcy51cGRhdGUoKTsKLQotCQlSZWN0YW5nbGUgdmlzaWJsZVJlY3QgPSBwYWludENhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCXZpc2libGVXaWR0aCA9IHZpc2libGVSZWN0LndpZHRoOwotCQl2aXNpYmxlSGVpZ2h0ID0gdmlzaWJsZVJlY3QuaGVpZ2h0OwotCi0JCVNjcm9sbEJhciBob3Jpem9udGFsID0gcGFpbnRDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlpZiAoaG9yaXpvbnRhbCAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5RkRDLnhPZmZzZXQgPSBNYXRoLm1pbihob3Jpem9udGFsLmdldFNlbGVjdGlvbigpLCBpbWFnZVdpZHRoIC0gdmlzaWJsZVdpZHRoKTsKLQkJCWlmIChpbWFnZVdpZHRoIDw9IHZpc2libGVXaWR0aCkgewotCQkJCWhvcml6b250YWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaG9yaXpvbnRhbC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9IGVsc2UgewotCQkJCWhvcml6b250YWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlob3Jpem9udGFsLnNldFZhbHVlcyhkaXNwbGF5RkRDLnhPZmZzZXQsIDAsIGltYWdlV2lkdGgsIHZpc2libGVXaWR0aCwKLQkJCQkJOCwgdmlzaWJsZVdpZHRoKTsKLQkJCX0KLQkJfQotCi0JCVNjcm9sbEJhciB2ZXJ0aWNhbCA9IHBhaW50Q2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmICh2ZXJ0aWNhbCAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5RkRDLnlPZmZzZXQgPSBNYXRoLm1pbih2ZXJ0aWNhbC5nZXRTZWxlY3Rpb24oKSwgaW1hZ2VIZWlnaHQgLSB2aXNpYmxlSGVpZ2h0KTsKLQkJCWlmIChpbWFnZUhlaWdodCA8PSB2aXNpYmxlSGVpZ2h0KSB7Ci0JCQkJdmVydGljYWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJdmVydGljYWwuc2V0U2VsZWN0aW9uKDApOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKHRydWUpOwotCQkJCXZlcnRpY2FsLnNldFZhbHVlcyhkaXNwbGF5RkRDLnlPZmZzZXQsIDAsIGltYWdlSGVpZ2h0LCB2aXNpYmxlSGVpZ2h0LAotCQkJCQk4LCB2aXNpYmxlSGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFZpcnR1YWxpemVzIE1vdXNlRXZlbnQgY29vcmRpbmF0ZXMgYW5kIHN0b3JlcyB0aGUgY3VycmVudCBwb3NpdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc01vdXNlRXZlbnRDb29yZGluYXRlcyhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWN1cnJlbnRQb3NpdGlvbi54ID0gZXZlbnQueCA9Ci0JCQlNYXRoLm1pbihNYXRoLm1heChldmVudC54LCAwKSwgdmlzaWJsZVdpZHRoIC0gMSkgKyBkaXNwbGF5RkRDLnhPZmZzZXQ7Ci0JCWN1cnJlbnRQb3NpdGlvbi55ID0gZXZlbnQueSA9Ci0JCQlNYXRoLm1pbihNYXRoLm1heChldmVudC55LCAwKSwgdmlzaWJsZUhlaWdodCAtIDEpICsgZGlzcGxheUZEQy55T2Zmc2V0OwotCX0KLQkKLQkvKioKLQkgKiBDbGVhcnMgdGhlIHN0YXR1cyBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXJTdGF0dXMoKSB7Ci0JCXN0YXR1c0FjdGlvbkluZm8gPSAiIjsKLQkJc3RhdHVzTWVzc2FnZUluZm8gPSAiIjsKLQkJc3RhdHVzQ29vcmRJbmZvID0gIiI7Ci0JCXVwZGF0ZVN0YXR1cygpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXR1cyBiYXIgYWN0aW9uIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gaW4gcHJvZ3Jlc3MsIG51bGwgdG8gY2xlYXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNBY3Rpb24oU3RyaW5nIGFjdGlvbikgewotCQlzdGF0dXNBY3Rpb25JbmZvID0gKGFjdGlvbiAhPSBudWxsKSA/IGFjdGlvbiA6ICIiOwotCQl1cGRhdGVTdGF0dXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIGJhciBtZXNzYWdlIHRleHQuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheSwgbnVsbCB0byBjbGVhcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1c01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3RhdHVzTWVzc2FnZUluZm8gPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiIjsKLQkJdXBkYXRlU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29vcmRpbmF0ZXMgaW4gdGhlIHN0YXR1cyBiYXIuCi0JICogCi0JICogQHBhcmFtIGNvb3JkIHRoZSBjb29yZGluYXRlcyB0byBkaXNwbGF5LCBudWxsIHRvIGNsZWFyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzQ29vcmQoUG9pbnQgY29vcmQpIHsKLQkJc3RhdHVzQ29vcmRJbmZvID0gKGNvb3JkICE9IG51bGwpID8gUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJzdGF0dXMuQ29vcmQuZm9ybWF0IiwgbmV3IE9iamVjdFtdCi0JCQl7IG5ldyBJbnRlZ2VyKGNvb3JkLngpLCBuZXcgSW50ZWdlcihjb29yZC55KX0pIDogIiI7Ci0JCXVwZGF0ZVN0YXR1cygpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvb3JkaW5hdGUgcmFuZ2UgaW4gdGhlIHN0YXR1cyBiYXIuCi0JICogCi0JICogQHBhcmFtIGEgdGhlICJmcm9tIiBjb29yZGluYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0JICogQHBhcmFtIGIgdGhlICJ0byIgY29vcmRpbmF0ZSwgbXVzdCBub3QgYmUgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1c0Nvb3JkUmFuZ2UoUG9pbnQgYSwgUG9pbnQgYikgewotCQlzdGF0dXNDb29yZEluZm8gPSBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInN0YXR1cy5Db29yZFJhbmdlLmZvcm1hdCIsIG5ldyBPYmplY3RbXQotCQkJeyBuZXcgSW50ZWdlcihhLngpLCBuZXcgSW50ZWdlcihhLnkpLCBuZXcgSW50ZWdlcihiLngpLCBuZXcgSW50ZWdlcihiLnkpfSk7Ci0JCXVwZGF0ZVN0YXR1cygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGRpc3BsYXkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1cygpIHsKLQkJc3RhdHVzVGV4dC5zZXRUZXh0KAotCQkJUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJzdGF0dXMuQmFyLmZvcm1hdCIsIG5ldyBPYmplY3RbXQotCQkJeyBzdGF0dXNBY3Rpb25JbmZvLCBzdGF0dXNNZXNzYWdlSW5mbywgc3RhdHVzQ29vcmRJbmZvIH0pKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFRvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDU2MTRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50VG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotcHVibGljIGludGVyZmFjZSBQYWludFRvb2wgZXh0ZW5kcyBQYWludFNlc3Npb24gewotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wncyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BlbmNpbFRvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BlbmNpbFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3ZTUwMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QZW5jaWxUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBIHBlbmNpbCB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgUGVuY2lsVG9vbCBleHRlbmRzIENvbnRpbnVvdXNQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBwZW5jaWwgdG9vbC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqIEBwYXJhbSBnZXRQYWludFN1cmZhY2UoKSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBQZW5jaWxUb29sKFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MsIFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2UpIHsKLQkJc3VwZXIocGFpbnRTdXJmYWNlKTsKLQkJc2V0KHRvb2xTZXR0aW5ncyk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wncyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzKSB7Ci0JCXNldHRpbmdzID0gdG9vbFNldHRpbmdzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9vbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIHRvb2wKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLlBlbmNpbC5sYWJlbCIpOwotCX0KLQotCS8qCi0JICogVGVtcGxhdGUgbWV0aG9kIGZvciBkcmF3aW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyKGZpbmFsIFBvaW50IHBvaW50KSB7Ci0JCWZpbmFsIFBhaW50U3VyZmFjZSBwcyA9IGdldFBhaW50U3VyZmFjZSgpOwotCQlwcy5kcmF3RmlndXJlKG5ldyBQb2ludEZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHBvaW50LngsIHBvaW50LnkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2ludEZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUG9pbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyODMxNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2ludEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgUG9pbnQgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBQb2ludEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQlwcml2YXRlIGludCB4LCB5OwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQb2ludAotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHggdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBlbmQtcG9pbnQKLQkgKiBAcGFyYW0geSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGVuZC1wb2ludAotCSAqLwotCXB1YmxpYyBQb2ludEZpZ3VyZShDb2xvciBjb2xvciwgaW50IHgsIGludCB5KSB7Ci0JCXRoaXMuY29sb3IgPSBjb2xvcjsgdGhpcy54ID0geDsgdGhpcy55ID0geTsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUG9pbnQgcCA9IGZkYy50b0NsaWVudFBvaW50KHgsIHkpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZkYy5nYy5maWxsUmVjdGFuZ2xlKHAueCwgcC55LCAxLCAxKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeCwgeSwgeCwgeSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BvbHlMaW5lVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUG9seUxpbmVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OTgxNTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUG9seUxpbmVUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBIHBvbHlsaW5lIGRyYXdpbmcgdG9vbC4KLSAqLwotcHVibGljIGNsYXNzIFBvbHlMaW5lVG9vbCBleHRlbmRzIFNlZ21lbnRlZFBhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUG9seUxpbmVUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBQb2x5TGluZVRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUG9seUxpbmUubGFiZWwiKTsKLQl9Ci0KLQkvKgotCSAqIFRlbXBsYXRlIG1ldGhvZHMgZm9yIGRyYXdpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgRmlndXJlIGNyZWF0ZUZpZ3VyZShQb2ludFtdIHBvaW50cywgaW50IG51bVBvaW50cywgYm9vbGVhbiBjbG9zZWQpIHsKLQkJQ29udGFpbmVyRmlndXJlIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLQkJaWYgKGNsb3NlZCAmJiBzZXR0aW5ncy5jb21tb25GaWxsVHlwZSAhPSBUb29sU2V0dGluZ3MuZnROb25lICYmIG51bVBvaW50cyA+PSAzKSB7Ci0JCQljb250YWluZXIuYWRkKG5ldyBTb2xpZFBvbHlnb25GaWd1cmUoc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBwb2ludHMsIG51bVBvaW50cykpOwotCQl9Ci0JCWlmICghIGNsb3NlZCB8fCBzZXR0aW5ncy5jb21tb25GaWxsVHlwZSAhPSBUb29sU2V0dGluZ3MuZnRTb2xpZCB8fCBudW1Qb2ludHMgPCAzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bVBvaW50cyAtIDE7ICsraSkgewotCQkJCWZpbmFsIFBvaW50IGEgPSBwb2ludHNbaV07Ci0JCQkJZmluYWwgUG9pbnQgYiA9IHBvaW50c1tpICsgMV07Ci0JCQkJY29udGFpbmVyLmFkZChuZXcgTGluZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLAotCQkJCQlhLngsIGEueSwgYi54LCBiLnkpKTsKLQkJCX0KLQkJCWlmIChjbG9zZWQpIHsKLQkJCQlmaW5hbCBQb2ludCBhID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTsKLQkJCQlmaW5hbCBQb2ludCBiID0gcG9pbnRzWzBdOwotCQkJCWNvbnRhaW5lci5hZGQobmV3IExpbmVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSwKLQkJCQkJYS54LCBhLnksIGIueCwgYi55KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9SZWN0YW5nbGVGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JlY3RhbmdsZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDgwZTYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JlY3RhbmdsZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgUmVjdGFuZ2xlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgUmVjdGFuZ2xlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCXByaXZhdGUgaW50IGxpbmVTdHlsZSwgeDEsIHkxLCB4MiwgeTI7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFJlY3RhbmdsZQotCSAqIFRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgYnkgYW55IHR3byBkaWFtZXRyaWNhbGx5IG9wcG9zaW5nIGNvcm5lcnMuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0gbGluZVN0eWxlIHRoZSBsaW5lIHN0eWxlIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB4MSB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB5MSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB4MiB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0geTIgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICovCi0JcHVibGljIFJlY3RhbmdsZUZpZ3VyZShDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIENvbG9yIGJhY2tncm91bmRDb2xvciwgaW50IGxpbmVTdHlsZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXRoaXMuZm9yZWdyb3VuZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQl0aGlzLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0JCXRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUmVjdGFuZ2xlIHIgPSBmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpOwotCQlmZGMuZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKGxpbmVTdHlsZSk7Ci0JCWZkYy5nYy5kcmF3UmVjdGFuZ2xlKHIueCwgci55LCByLndpZHRoIC0gMSwgci5oZWlnaHQgLSAxKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDczYmJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JlY3RhbmdsZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEEgZHJhd2luZyB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgUmVjdGFuZ2xlVG9vbCBleHRlbmRzIERyYWdQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFJlY3RhbmdsZVRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIFJlY3RhbmdsZVRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUmVjdGFuZ2xlLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2QgZm9yIGRyYXdpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgRmlndXJlIGNyZWF0ZUZpZ3VyZShQb2ludCBhLCBQb2ludCBiKSB7Ci0JCXN3aXRjaCAoc2V0dGluZ3MuY29tbW9uRmlsbFR5cGUpIHsKLQkJCWRlZmF1bHQ6Ci0JCQljYXNlIFRvb2xTZXR0aW5ncy5mdE5vbmU6Ci0JCQkJcmV0dXJuIG5ldyBSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSwKLQkJCQkJYS54LCBhLnksIGIueCwgYi55KTsKLQkJCWNhc2UgVG9vbFNldHRpbmdzLmZ0U29saWQ6Ci0JCQkJcmV0dXJuIG5ldyBTb2xpZFJlY3RhbmdsZUZpZ3VyZShzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIGEueCwgYS55LCBiLngsIGIueSk7Ci0JCQljYXNlIFRvb2xTZXR0aW5ncy5mdE91dGxpbmU6IHsKLQkJCQlDb250YWluZXJGaWd1cmUgY29udGFpbmVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCQkJCWNvbnRhaW5lci5hZGQobmV3IFNvbGlkUmVjdGFuZ2xlRmlndXJlKHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgYS54LCBhLnksIGIueCwgYi55KSk7Ci0JCQkJY29udGFpbmVyLmFkZChuZXcgUmVjdGFuZ2xlRmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsCi0JCQkJCWEueCwgYS55LCBiLngsIGIueSkpOwotCQkJCXJldHVybiBjb250YWluZXI7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzFkNjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUm91bmRlZFJlY3RhbmdsZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgUmVjdGFuZ2xlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgUm91bmRlZFJlY3RhbmdsZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQlwcml2YXRlIGludCBsaW5lU3R5bGUsIHgxLCB5MSwgeDIsIHkyLCBkaWFtZXRlcjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUmVjdGFuZ2xlCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhbnkgdHdvIGRpYW1ldHJpY2FsbHkgb3Bwb3NpbmcgY29ybmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsaW5lU3R5bGUgdGhlIGxpbmUgc3R5bGUgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0gZGlhbWV0ZXIgdGhlIGRpYW1ldGVyIG9mIGN1cnZhdHVyZSBvZiBhbGwgZm91ciBjb3JuZXJzCi0JICovCi0JcHVibGljIFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUoQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBDb2xvciBiYWNrZ3JvdW5kQ29sb3IsIGludCBsaW5lU3R5bGUsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGRpYW1ldGVyKSB7Ci0JCXRoaXMuZm9yZWdyb3VuZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQl0aGlzLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0JCXRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQkJdGhpcy5kaWFtZXRlciA9IGRpYW1ldGVyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlSZWN0YW5nbGUgciA9IGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCWZkYy5nYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUobGluZVN0eWxlKTsKLQkJZmRjLmdjLmRyYXdSb3VuZFJlY3RhbmdsZShyLngsIHIueSwgci53aWR0aCAtIDEsIHIuaGVpZ2h0IC0gMSwgZGlhbWV0ZXIsIGRpYW1ldGVyKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUm91bmRlZFJlY3RhbmdsZVRvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JvdW5kZWRSZWN0YW5nbGVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNWMwNjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUm91bmRlZFJlY3RhbmdsZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEEgZHJhd2luZyB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgUm91bmRlZFJlY3RhbmdsZVRvb2wgZXh0ZW5kcyBEcmFnUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBSb3VuZGVkUmVjdGFuZ2xlVG9vbC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIFBhaW50U3VyZmFjZSB3ZSB3aWxsIHJlbmRlciBvbi4KLQkgKi8KLQlwdWJsaWMgUm91bmRlZFJlY3RhbmdsZVRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUm91bmRlZFJlY3RhbmdsZS5sYWJlbCIpOwotCX0KLQotCS8qCi0JICogVGVtcGxhdGUgbWV0aG9kcyBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGEsIFBvaW50IGIpIHsKLQkJQ29udGFpbmVyRmlndXJlIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLQkJaWYgKHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdE5vbmUpCi0JCQljb250YWluZXIuYWRkKG5ldyBTb2xpZFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLAotCQkJCWEueCwgYS55LCBiLngsIGIueSwgc2V0dGluZ3Mucm91bmRlZFJlY3RhbmdsZUNvcm5lckRpYW1ldGVyKSk7Ci0JCWlmIChzZXR0aW5ncy5jb21tb25GaWxsVHlwZSAhPSBUb29sU2V0dGluZ3MuZnRTb2xpZCkKLQkJCWNvbnRhaW5lci5hZGQobmV3IFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsCi0JCQkJc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLCBhLngsIGEueSwgYi54LCBiLnksIHNldHRpbmdzLnJvdW5kZWRSZWN0YW5nbGVDb3JuZXJEaWFtZXRlcikpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NlZ21lbnRlZFBhaW50U2Vzc2lvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU2VnbWVudGVkUGFpbnRTZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmE5OWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU2VnbWVudGVkUGFpbnRTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIHN1cGVyY2xhc3MgZm9yIHBhaW50IHRvb2xzIHRoYXQgY29udHJ1Y3Qgb2JqZWN0cyBmcm9tIGluZGl2aWR1YWxseQotICogcGlja2VkIHNlZ21lbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VnbWVudGVkUGFpbnRTZXNzaW9uIGV4dGVuZHMgQmFzaWNQYWludFNlc3Npb24gewotCS8qKgotCSAqIFRoZSBzZXQgb2YgY29udHJvbCBwb2ludHMgbWFraW5nIHVwIHRoZSBzZWdtZW50ZWQgc2VsZWN0aW9uCi0JICovCi0JcHJpdmF0ZSBWZWN0b3IgLyogb2YgUG9pbnQgKi8gY29udHJvbFBvaW50cyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKgotCSAqIFRoZSBwcmV2aW91cyBmaWd1cmUgKHNvIHRoYXQgd2UgY2FuIGFib3J0IHdpdGggcmlnaHQtYnV0dG9uKQotCSAqLwotCXByaXZhdGUgRmlndXJlIHByZXZpb3VzRmlndXJlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjdXJyZW50IGZpZ3VyZSAoc28gdGhhdCB3ZSBjYW4gYWJvcnQgd2l0aCByaWdodC1idXR0b24pCi0JICovCi0JcHJpdmF0ZSBGaWd1cmUgY3VycmVudEZpZ3VyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUGFpbnRTZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIGRyYXdpbmcgc3VyZmFjZSB0byB1c2UKLQkgKi8KLQlwcm90ZWN0ZWQgU2VnbWVudGVkUGFpbnRTZXNzaW9uKFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2UpIHsKLQkJc3VwZXIocGFpbnRTdXJmYWNlKTsKLQl9Ci0KLQkvKioKLQkgKiBBY3RpdmF0ZXMgdGhlIHRvb2wuCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5TZXNzaW9uKCkgewotCQlnZXRQYWludFN1cmZhY2UoKS5zZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygKLQkJCSJzZXNzaW9uLlNlZ21lbnRlZEludGVyYWN0aXZlUGFpbnQubWVzc2FnZS5hbmNob3JNb2RlIikpOwotCQlwcmV2aW91c0ZpZ3VyZSA9IG51bGw7Ci0JCWN1cnJlbnRGaWd1cmUgPSBudWxsOwotCQljb250cm9sUG9pbnRzLmNsZWFyKCk7Ci0JfQotCQotCS8qKgotCSAqIERlYWN0aXZhdGVzIHRoZSB0b29sLgotICAgICAqLwotCXB1YmxpYyB2b2lkIGVuZFNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQlpZiAocHJldmlvdXNGaWd1cmUgIT0gbnVsbCkgZ2V0UGFpbnRTdXJmYWNlKCkuZHJhd0ZpZ3VyZShwcmV2aW91c0ZpZ3VyZSk7Ci0JfQotCQotCS8qKgotCSAqIFJlc2V0cyB0aGUgdG9vbC4KLQkgKiBBYm9ydHMgYW55IG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQlpZiAocHJldmlvdXNGaWd1cmUgIT0gbnVsbCkgZ2V0UGFpbnRTdXJmYWNlKCkuZHJhd0ZpZ3VyZShwcmV2aW91c0ZpZ3VyZSk7Ci0JCQotCQlnZXRQYWludFN1cmZhY2UoKS5zZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygKLQkJCSJzZXNzaW9uLlNlZ21lbnRlZEludGVyYWN0aXZlUGFpbnQubWVzc2FnZS5hbmNob3JNb2RlIikpOwotCQlwcmV2aW91c0ZpZ3VyZSA9IG51bGw7Ci0JCWN1cnJlbnRGaWd1cmUgPSBudWxsOwotCQljb250cm9sUG9pbnRzLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG93biBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotCi0JCWdldFBhaW50U3VyZmFjZSgpLnNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKAotCQkJInNlc3Npb24uU2VnbWVudGVkSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlLmludGVyYWN0aXZlTW9kZSIpKTsKLQkJcHJldmlvdXNGaWd1cmUgPSBjdXJyZW50RmlndXJlOwotCi0JCWlmIChjb250cm9sUG9pbnRzLnNpemUoKSA+IDApIHsKLQkJCWZpbmFsIFBvaW50IGxhc3RQb2ludCA9IChQb2ludCkgY29udHJvbFBvaW50cy5lbGVtZW50QXQoY29udHJvbFBvaW50cy5zaXplKCkgLSAxKTsKLQkJCWlmIChsYXN0UG9pbnQueCA9PSBldmVudC54IHx8IGxhc3RQb2ludC55ID09IGV2ZW50LnkpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJfQotCQljb250cm9sUG9pbnRzLmFkZChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvdWJsZUNsaWNrIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotCQlpZiAoY29udHJvbFBvaW50cy5zaXplKCkgPj0gMikgewotCQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCQlwcmV2aW91c0ZpZ3VyZSA9IGNyZWF0ZUZpZ3VyZSgKLQkJCQkoUG9pbnRbXSkgY29udHJvbFBvaW50cy50b0FycmF5KG5ldyBQb2ludFtjb250cm9sUG9pbnRzLnNpemUoKV0pLAotCQkJCWNvbnRyb2xQb2ludHMuc2l6ZSgpLCB0cnVlKTsKLQkJfQotCQlyZXNldFNlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VVcCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHsKLQkJCXJlc2V0U2Vzc2lvbigpOyAvLyBhYm9ydCBpZiByaWdodCBvciBtaWRkbGUgbW91c2UgYnV0dG9uIHByZXNzZWQKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VNb3ZlIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJZmluYWwgUGFpbnRTdXJmYWNlIHBzID0gZ2V0UGFpbnRTdXJmYWNlKCk7Ci0JCWlmIChjb250cm9sUG9pbnRzLnNpemUoKSA9PSAwKSB7Ci0JCQlwcy5zZXRTdGF0dXNDb29yZChwcy5nZXRDdXJyZW50UG9zaXRpb24oKSk7Ci0JCQlyZXR1cm47IC8vIHNwdXJpb3VzIGV2ZW50Ci0JCX0KLQkJcHMuc2V0U3RhdHVzQ29vcmRSYW5nZSgoUG9pbnQpIGNvbnRyb2xQb2ludHMuZWxlbWVudEF0KGNvbnRyb2xQb2ludHMuc2l6ZSgpIC0gMSksCi0JCQlwcy5nZXRDdXJyZW50UG9zaXRpb24oKSk7Ci0JCXBzLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQlQb2ludFtdIHBvaW50cyA9IChQb2ludFtdKSBjb250cm9sUG9pbnRzLnRvQXJyYXkobmV3IFBvaW50W2NvbnRyb2xQb2ludHMuc2l6ZSgpICsgMV0pOwotCQlwb2ludHNbY29udHJvbFBvaW50cy5zaXplKCldID0gcHMuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0JCWN1cnJlbnRGaWd1cmUgPSBjcmVhdGVGaWd1cmUocG9pbnRzLCBwb2ludHMubGVuZ3RoLCBmYWxzZSk7Ci0JCXBzLmFkZFJ1YmJlcmJhbmRTZWxlY3Rpb24oY3VycmVudEZpZ3VyZSk7Ci0JfQkKLQotCS8qKgotCSAqIFRlbXBsYXRlIE1ldGhvZDogQ3JlYXRlcyBhIEZpZ3VyZSBmb3IgZHJhd2luZyBydWJiZXJiYW5kIGVudGl0aWVzIGFuZCB0aGUgZmluYWwgcHJvZHVjdAotCSAqIAotCSAqIEBwYXJhbSBwb2ludHMgdGhlIGFycmF5IG9mIGNvbnRyb2wgcG9pbnRzCi0JICogQHBhcmFtIG51bVBvaW50cyB0aGUgbnVtYmVyIG9mIHZhbGlkIHBvaW50cyBpbiB0aGUgYXJyYXkgKG4gPj0gMikKLQkgKiBAcGFyYW0gY2xvc2VkIHRydWUgaWYgdGhlIHVzZXIgZG91YmxlLWNsaWNrZWQgb24gdGhlIGZpbmFsIGNvbnRyb2wgcG9pbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmlndXJlIGNyZWF0ZUZpZ3VyZShQb2ludFtdIHBvaW50cywgaW50IG51bVBvaW50cywgYm9vbGVhbiBjbG9zZWQpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRFbGxpcHNlRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZEVsbGlwc2VGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlOWFkYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZEVsbGlwc2VGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIFNvbGlkIEVsbGlwc2Ugb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTb2xpZEVsbGlwc2VGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JcHJpdmF0ZSBpbnQgeDEsIHkxLCB4MiwgeTI7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFNvbGlkRWxsaXBzZQotCSAqIFRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgYnkgYW55IHR3byBkaWFtZXRyaWNhbGx5IG9wcG9zaW5nIGNvcm5lcnMgb2YgYSBib3gKLQkgKiBib3VuZGluZyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB4MSB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB5MSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB4MiB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0geTIgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICovCi0JcHVibGljIFNvbGlkRWxsaXBzZUZpZ3VyZShDb2xvciBjb2xvciwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXRoaXMuY29sb3IgPSBjb2xvcjsgdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlSZWN0YW5nbGUgciA9IGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmRjLmdjLmZpbGxPdmFsKHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRQb2x5Z29uRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFBvbHlnb25GaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1MTQwMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFBvbHlnb25GaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIExpbmUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTb2xpZFBvbHlnb25GaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JcHJpdmF0ZSBpbnRbXSBwb2ludHM7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFNvbGlkUG9seWdvbgotCSAqIFRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgYnkgYSBzZXF1ZW5jZSBvZiB2ZXJ0aWNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB2ZXJ0aWNlcyB0aGUgYXJyYXkgb2YgdmVydGljZXMgbWFraW5nIHVwIHRoZSBwb2x5Z29uCi0JICogQHBhcmFtIG51bVBvaW50IHRoZSBudW1iZXIgb2YgdmFsaWQgcG9pbnRzIGluIHRoZSBhcnJheSAobiA+PSAzKQotCSAqLwotCXB1YmxpYyBTb2xpZFBvbHlnb25GaWd1cmUoQ29sb3IgY29sb3IsIFBvaW50W10gdmVydGljZXMsIGludCBudW1Qb2ludHMpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQl0aGlzLnBvaW50cyA9IG5ldyBpbnRbbnVtUG9pbnRzICogMl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzOyArK2kpIHsKLQkJCXBvaW50c1tpICogMl0gPSB2ZXJ0aWNlc1tpXS54OwotCQkJcG9pbnRzW2kgKiAyICsgMV0gPSB2ZXJ0aWNlc1tpXS55OwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCWludFtdIGRyYXdQb2ludHMgPSBuZXcgaW50W3BvaW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMikgewotCQkJZHJhd1BvaW50c1tpXSA9IHBvaW50c1tpXSAqIGZkYy54U2NhbGUgLSBmZGMueE9mZnNldDsKLQkJCWRyYXdQb2ludHNbaSArIDFdID0gcG9pbnRzW2kgKyAxXSAqIGZkYy55U2NhbGUgLSBmZGMueU9mZnNldDsKLQkJfQotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZkYy5nYy5maWxsUG9seWdvbihkcmF3UG9pbnRzKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IHhtaW4gPSBJbnRlZ2VyLk1BWF9WQUxVRSwgeW1pbiA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQlpbnQgeG1heCA9IEludGVnZXIuTUlOX1ZBTFVFLCB5bWF4ID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpICs9IDIpIHsKLQkJCWlmIChwb2ludHNbaV0gPCB4bWluKSB4bWluID0gcG9pbnRzW2ldOwotCQkJaWYgKHBvaW50c1tpXSA+IHhtYXgpIHhtYXggPSBwb2ludHNbaV07Ci0JCQlpZiAocG9pbnRzW2krMV0gPCB5bWluKSB5bWluID0gcG9pbnRzW2krMV07Ci0JCQlpZiAocG9pbnRzW2krMV0gPiB5bWF4KSB5bWF4ID0gcG9pbnRzW2krMV07Ci0JCX0JCQotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4bWluLCB5bWluLCB4bWF4LCB5bWF4KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSZWN0YW5nbGVGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUmVjdGFuZ2xlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjJmYjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSZWN0YW5nbGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIFNvbGlkUmVjdGFuZ2xlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgU29saWRSZWN0YW5nbGVGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JcHJpdmF0ZSBpbnQgeDEsIHkxLCB4MiwgeTI7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFNvbGlkUmVjdGFuZ2xlCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhbnkgdHdvIGRpYW1ldHJpY2FsbHkgb3Bwb3NpbmcgY29ybmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB4MSB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB5MSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB4MiB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0geTIgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICovCi0JcHVibGljIFNvbGlkUmVjdGFuZ2xlRmlndXJlKENvbG9yIGNvbG9yLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOyB0aGlzLngxID0geDE7IHRoaXMueTEgPSB5MTsgdGhpcy54MiA9IHgyOyB0aGlzLnkyID0geTI7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVJlY3RhbmdsZSByID0gZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmZGMuZ2MuZmlsbFJlY3RhbmdsZShyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUm91bmRlZFJlY3RhbmdsZUZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMGQyZWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBTb2xpZFJlY3RhbmdsZSBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFNvbGlkUm91bmRlZFJlY3RhbmdsZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQlwcml2YXRlIGludCB4MSwgeTEsIHgyLCB5MiwgZGlhbWV0ZXI7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFNvbGlkUmVjdGFuZ2xlCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhbnkgdHdvIGRpYW1ldHJpY2FsbHkgb3Bwb3NpbmcgY29ybmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB4MSB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB5MSB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvcm5lcgotCSAqIEBwYXJhbSB4MiB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0geTIgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICogQHBhcmFtIGRpYW1ldGVyIHRoZSBkaWFtZXRlciBvZiBjdXJ2YXR1cmUgb2YgYWxsIGZvdXIgY29ybmVycwotCSAqLwotCXB1YmxpYyBTb2xpZFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUoQ29sb3IgY29sb3IsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGRpYW1ldGVyKSB7Ci0JCXRoaXMuY29sb3IgPSBjb2xvcjsgdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCQl0aGlzLmRpYW1ldGVyID0gZGlhbWV0ZXI7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVJlY3RhbmdsZSByID0gZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmZGMuZ2MuZmlsbFJvdW5kUmVjdGFuZ2xlKHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCwgZGlhbWV0ZXIsIGRpYW1ldGVyKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9UZXh0RmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9UZXh0RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYmQwYzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVGV4dEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgUmVjdGFuZ2xlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciAgY29sb3I7Ci0JcHJpdmF0ZSBGb250ICAgZm9udDsKLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCXByaXZhdGUgaW50IHgsIHk7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFRleHRGaWd1cmUKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBmb250ICB0aGUgZm9udCBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0gdGV4dCAgdGhlIHRleHQgdG8gZHJhdywgdGFiIGFuZCBuZXctbGluZSBleHBhbnNpb24gaXMgcGVyZm9ybWVkCi0JICogQHBhcmFtIHggICAgIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSB0ZXh0IGJvdW5kaW5nIGJveAotCSAqIEBwYXJhbSB5ICAgICB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgdGV4dCBib3VuZGluZyBib3gKLQkgKi8KLQlwdWJsaWMgVGV4dEZpZ3VyZShDb2xvciBjb2xvciwgRm9udCBmb250LCBTdHJpbmcgdGV4dCwgaW50IHgsIGludCB5KSB7Ci0JCXRoaXMuY29sb3IgPSBjb2xvcjsgdGhpcy5mb250ID0gZm9udDsgdGhpcy50ZXh0ID0gdGV4dDsgdGhpcy54ID0geDsgdGhpcy55ID0geTsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUG9pbnQgcCA9IGZkYy50b0NsaWVudFBvaW50KHgsIHkpOwotCQlmZGMuZ2Muc2V0Rm9udChmb250KTsKLQkJZmRjLmdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmZGMuZ2MuZHJhd1RleHQodGV4dCwgcC54LCBwLnksIHRydWUpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlGb250IG9sZEZvbnQgPSBmZGMuZ2MuZ2V0Rm9udCgpOwotCQlmZGMuZ2Muc2V0Rm9udChmb250KTsKLQkJUG9pbnQgdGV4dEV4dGVudCA9IGZkYy5nYy50ZXh0RXh0ZW50KHRleHQpOwotCQlmZGMuZ2Muc2V0Rm9udChvbGRGb250KTsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeCwgeSwgeCArIHRleHRFeHRlbnQueCwgeSArIHRleHRFeHRlbnQueSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1RleHRUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9UZXh0VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjY3ODdlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1RleHRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi0vKioKLSAqIEEgdGV4dCBkcmF3aW5nIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0VG9vbCBleHRlbmRzIEJhc2ljUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQlwcml2YXRlIFN0cmluZyBkcmF3VGV4dCA9IFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5UZXh0LnNldHRpbmdzLmRlZmF1bHR0ZXh0Iik7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUGFpbnRUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBUZXh0VG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5UZXh0LmxhYmVsIik7Ci0JfQotCQotCS8qKgotCSAqIEFjdGl2YXRlcyB0aGUgdG9vbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLnNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKAotCQkJInNlc3Npb24uVGV4dC5tZXNzYWdlIikpOwotCX0KLQkKLQkvKioKLQkgKiBEZWFjdGl2YXRlcyB0aGUgdG9vbC4KLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKCkgewotCQlnZXRQYWludFN1cmZhY2UoKS5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogQWJvcnRzIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3duIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiA9PSAxKSB7Ci0JCQkvLyBkcmF3IHdpdGggbGVmdCBtb3VzZSBidXR0b24KLQkJCWdldFBhaW50U3VyZmFjZSgpLmNvbW1pdFJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHNldCB0ZXh0IHdpdGggcmlnaHQgbW91c2UgYnV0dG9uCi0JCQlnZXRQYWludFN1cmZhY2UoKS5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJCVNoZWxsIHNoZWxsID0gZ2V0UGFpbnRTdXJmYWNlKCkuZ2V0U2hlbGwoKTsKLQkJCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCWRpYWxvZy5zZXRUZXh0KFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5UZXh0LmRpYWxvZy50aXRsZSIpKTsKLQkJCWRpYWxvZy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkaWFsb2csIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLlRleHQuZGlhbG9nLm1lc3NhZ2UiKSk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlmaW5hbCBUZXh0IGZpZWxkID0gbmV3IFRleHQoZGlhbG9nLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlmaWVsZC5zZXRUZXh0KGRyYXdUZXh0KTsKLQkJCWZpZWxkLnNlbGVjdEFsbCgpOwotCQkJZmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCQlDb21wb3NpdGUgYnV0dG9ucyA9IG5ldyBDb21wb3NpdGUoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWJ1dHRvbnMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlidXR0b25zLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJQnV0dG9uIG9rID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCQlvay5zZXRUZXh0KFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT0siKSk7Ci0JCQlvay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlvay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRyYXdUZXh0ID0gZmllbGQuZ2V0VGV4dCgpOwotCQkJCQlkaWFsb2cuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJQnV0dG9uIGNhbmNlbCA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQkJY2FuY2VsLnNldFRleHQoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDYW5jZWwiKSk7Ci0JCQljYW5jZWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlkaWFsb2cuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24ob2spOwotCQkJZGlhbG9nLnBhY2soKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBkaWFsb2cuZ2V0RGlzcGxheSgpOwotCQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpICYmICEgZGlhbG9nLmlzRGlzcG9zZWQoKSkgewotCQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfQkKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3VibGVDbGljayBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZVVwIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZU1vdmUgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCQlmaW5hbCBQYWludFN1cmZhY2UgcHMgPSBnZXRQYWludFN1cmZhY2UoKTsKLQkJcHMuc2V0U3RhdHVzQ29vcmQocHMuZ2V0Q3VycmVudFBvc2l0aW9uKCkpOwotCQlwcy5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJcHMuYWRkUnViYmVyYmFuZFNlbGVjdGlvbigKLQkJCW5ldyBUZXh0RmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uRm9udCwKLQkJCQlkcmF3VGV4dCwgZXZlbnQueCwgZXZlbnQueSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1Rvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1MWNlMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Ub29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBUb29sIHsKLQlwdWJsaWMgaW50IGlkOwotCXB1YmxpYyBTdHJpbmcgbmFtZTsKLQlwdWJsaWMgU3RyaW5nIGdyb3VwOwotCXB1YmxpYyBpbnQgdHlwZTsKLQlwdWJsaWMgUnVubmFibGUgYWN0aW9uOwotCXB1YmxpYyBJbWFnZSBpbWFnZSA9IG51bGw7Ci0JcHVibGljIE9iamVjdCBkYXRhOwotCQotCXB1YmxpYyBUb29sKGludCBpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBncm91cCwgaW50IHR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmdyb3VwID0gZ3JvdXA7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIFRvb2woaW50IGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGdyb3VwLCBpbnQgdHlwZSwgT2JqZWN0IGRhdGEpIHsKLQkJdGhpcyhpZCwgbmFtZSwgZ3JvdXAsIHR5cGUpOwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1Rvb2xTZXR0aW5ncy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVG9vbFNldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OWJlZGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVG9vbFNldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogVG9vbCBTZXR0aW5ncyBvYmplY3RzIGdyb3VwIHRvb2wtcmVsYXRlZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVG9vbFNldHRpbmdzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmdE5vbmUgPSAwLCBmdE91dGxpbmUgPSAxLCBmdFNvbGlkID0gMjsKLQotCS8qKgotCSAqIGNvbW1vbkZvcmVncm91bmRDb2xvcjogY3VycmVudCB0b29sIGZvcmVncm91bmQgY29sb3VyCi0JICovCi0JcHVibGljIENvbG9yIGNvbW1vbkZvcmVncm91bmRDb2xvcjsKLQotCS8qKgotCSAqIGNvbW1vbkJhY2tncm91bmRDb2xvcjogY3VycmVudCB0b29sIGJhY2tncm91bmQgY29sb3VyCi0JICovCi0JcHVibGljIENvbG9yIGNvbW1vbkJhY2tncm91bmRDb2xvcjsKLQotCS8qKgotCSAqIGNvbW1vbkZvbnQ6IGN1cnJlbnQgZm9udAotCSAqLwotCXB1YmxpYyBGb250IGNvbW1vbkZvbnQ7Ci0KLQkvKioKLQkgKiBjb21tb25GaWxsVHlwZTogY3VycmVudCBmaWxsIHR5cGUKLQkgKiA8cD5PbmUgb2YgZnROb25lLCBmdE91dGxpbmUsIGZ0U29saWQuPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgY29tbW9uRmlsbFR5cGUgPSBmdE5vbmU7Ci0KLQkvKioKLQkgKiBjb21tb25MaW5lU3R5bGU6IGN1cnJlbnQgbGluZSB0eXBlCi0JICovCi0JcHVibGljIGludCBjb21tb25MaW5lU3R5bGUgPSBTV1QuTElORV9TT0xJRDsKLQkKLQkvKioKLQkgKiBhaXJicnVzaFJhZGl1czogY292ZXJhZ2UgcmFkaXVzIGluIHBpeGVscwotCSAqLwotCXB1YmxpYyBpbnQgYWlyYnJ1c2hSYWRpdXMgPSAxMDsKLQkKLQkvKioKLQkgKiBhaXJicnVzaEludGVuc2l0eTogYXZlcmFnZSBzdXJmYWNlIGFyZWEgY292ZXJhZ2UgaW4gcmVnaW9uIGRlZmluZWQgYnkgcmFkaXVzIHBlciAiam90IgotCSAqLwotCXB1YmxpYyBpbnQgYWlyYnJ1c2hJbnRlbnNpdHkgPSAzMDsKLQkKLQkvKioKLQkgKiByb3VuZGVkUmVjdGFuZ2xlQ29ybmVyRGlhbWV0ZXI6IHRoZSBkaWFtZXRlciBvZiBjdXJ2YXR1cmUgb2YgY29ybmVycyBpbiBhIHJvdW5kZWQgcmVjdGFuZ2xlCi0JICovCi0JcHVibGljIGludCByb3VuZGVkUmVjdGFuZ2xlQ29ybmVyRGlhbWV0ZXIgPSAxNjsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfbm9uZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX25vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZkZDU4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfbm9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX291dGxpbmUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9vdXRsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjY2ZlZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX291dGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9zb2xpZC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX3NvbGlkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzNGU2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX3NvbGlkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kYXNoLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kYXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1N2JiMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZGFzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZGFzaGRvdC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZGFzaGRvdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMjk2OGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2Rhc2hkb3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2RvdC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZG90LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzN2NjYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZG90LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9zb2xpZC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfc29saWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE1N2NlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9zb2xpZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9vcHRpb25zX2ZvbnQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvb3B0aW9uc19mb250LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1ZmUwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9vcHRpb25zX2ZvbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9haXJicnVzaC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2FpcmJydXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxMGVkZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2FpcmJydXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfZWxsaXBzZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2VsbGlwc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzIxNDJmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfZWxsaXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2xpbmUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9saW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmODE5Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2xpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wZW5jaWwuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wZW5jaWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTZhMjM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcGVuY2lsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcG9seWxpbmUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wb2x5bGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMzg0ZTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wb2x5bGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3JlY3RhbmdsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3JlY3RhbmdsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmRkNTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9yZWN0YW5nbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9yb3VuZGVkcmVjdGFuZ2xlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcm91bmRlZHJlY3RhbmdsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODQ1ZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9yb3VuZGVkcmVjdGFuZ2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfdGV4dC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3RleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDc0NTdmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfdGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL1RleHRFZGl0b3IuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmI1ZWJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy50ZXh0ZWRpdG9yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFRleHRFZGl0b3IgewotCURpc3BsYXkgZGlzcGxheTsKLQlTaGVsbCBzaGVsbDsKLQlDb29sQmFyIGNvb2xCYXI7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCUxhYmVsIHN0YXR1c0JhcjsKLQlUb29sSXRlbSBib2xkQ29udHJvbCwgaXRhbGljQ29udHJvbCwgbGVmdEFsaWdubWVudEl0ZW0sIGNlbnRlckFsaWdubWVudEl0ZW0sIHJpZ2h0QWxpZ25tZW50SXRlbSwganVzdGlmeUFsaWdubWVudEl0ZW0sIGJsb2NrU2VsZWN0aW9uSXRlbTsKLQlDb21ibyBmb250TmFtZUNvbnRyb2wsIGZvbnRTaXplQ29udHJvbDsKLQlNZW51SXRlbSB1bmRlcmxpbmVTaW5nbGVJdGVtLCB1bmRlcmxpbmVEb3VibGVJdGVtLCB1bmRlcmxpbmVFcnJvckl0ZW0sIHVuZGVybGluZVNxdWlnZ2xlSXRlbSwgYm9yZGVyU29saWRJdGVtLCBib3JkZXJEYXNoSXRlbSwgYm9yZGVyRG90SXRlbTsKLQkKLQlib29sZWFuIGluc2VydCA9IHRydWU7Ci0JU3R5bGVSYW5nZVtdIHNlbGVjdGVkUmFuZ2VzOwotCWludCBuZXdDaGFyQ291bnQsIHN0YXJ0OwotCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0JaW50IHN0eWxlU3RhdGU7Ci0JU3RyaW5nIGxpbms7Ci0KLQotCS8vIFJlc291cmNlcwotCUltYWdlIGlCb2xkLCBpSXRhbGljLCBpVW5kZXJsaW5lLCBpU3RyaWtlb3V0LCBpTGVmdEFsaWdubWVudCwgaVJpZ2h0QWxpZ25tZW50LCBpQ2VudGVyQWxpZ25tZW50LCBpSnVzdGlmeUFsaWdubWVudCwgaUNvcHksIGlDdXQsIGlMaW5rOwotCUltYWdlIGlQYXN0ZSwgaVNwYWNpbmcsIGlJbmRlbnQsIGlUZXh0Rm9yZWdyb3VuZCwgaVRleHRCYWNrZ3JvdW5kLCBpQmFzZWxpbmVVcCwgaUJhc2VsaW5lRG93biwgaUJ1bGxldExpc3QsIGlOdW1iZXJlZExpc3QsIGlCbG9ja1NlbGVjdGlvbiwgaUJvcmRlclN0eWxlOwotCUZvbnQgZm9udCwgdGV4dEZvbnQ7Ci0JQ29sb3IgdGV4dEZvcmVncm91bmQsIHRleHRCYWNrZ3JvdW5kLCBzdHJpa2VvdXRDb2xvciwgdW5kZXJsaW5lQ29sb3IsIGJvcmRlckNvbG9yOwotCi0Jc3RhdGljIGZpbmFsIGludCBCVUxMRVRfV0lEVEggPSA0MDsKLQlzdGF0aWMgZmluYWwgaW50IE1BUkdJTiA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBCT0xEID0gU1dULkJPTEQ7Ci0Jc3RhdGljIGZpbmFsIGludCBJVEFMSUMgPSBTV1QuSVRBTElDOwotCXN0YXRpYyBmaW5hbCBpbnQgRk9OVF9TVFlMRSA9IEJPTEQgfCBJVEFMSUM7Ci0Jc3RhdGljIGZpbmFsIGludCBTVFJJS0VPVVQgPSAxIDw8IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBGT1JFR1JPVU5EID0gMSA8PCA0OwotCXN0YXRpYyBmaW5hbCBpbnQgQkFDS0dST1VORCA9IDEgPDwgNTsKLQlzdGF0aWMgZmluYWwgaW50IEZPTlQgPSAxIDw8IDY7Ci0Jc3RhdGljIGZpbmFsIGludCBCQVNFTElORV9VUCA9IDEgPDwgNzsKLQlzdGF0aWMgZmluYWwgaW50IEJBU0VMSU5FX0RPV04gPSAxIDw8IDg7Ci0Jc3RhdGljIGZpbmFsIGludCBVTkRFUkxJTkVfU0lOR0xFID0gMSA8PCA5OwotCXN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FX0RPVUJMRSA9IDEgPDwgMTA7Ci0Jc3RhdGljIGZpbmFsIGludCBVTkRFUkxJTkVfRVJST1IgPSAxIDw8IDExOwotCXN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FX1NRVUlHR0xFID0gMSA8PCAxMjsKLQlzdGF0aWMgZmluYWwgaW50IFVOREVSTElORV9MSU5LID0gMSA8PCAxMzsKLQlzdGF0aWMgZmluYWwgaW50IFVOREVSTElORSA9IFVOREVSTElORV9TSU5HTEUgfCBVTkRFUkxJTkVfRE9VQkxFIHwgVU5ERVJMSU5FX1NRVUlHR0xFIHwgVU5ERVJMSU5FX0VSUk9SIHwgVU5ERVJMSU5FX0xJTks7Ci0Jc3RhdGljIGZpbmFsIGludCBCT1JERVJfU09MSUQgPSAxIDw8IDIzOwotCXN0YXRpYyBmaW5hbCBpbnQgQk9SREVSX0RBU0ggPSAxIDw8IDI0OwotCXN0YXRpYyBmaW5hbCBpbnQgQk9SREVSX0RPVCA9IDEgPDwgMjU7Ci0Jc3RhdGljIGZpbmFsIGludCBCT1JERVIgPSBCT1JERVJfU09MSUQgfCBCT1JERVJfREFTSCB8IEJPUkRFUl9ET1Q7Ci0JCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gU0FNUExFX1RFWFQgPSBmYWxzZTsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfQkFTRUxJTkUgPSBmYWxzZTsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGT05UX1NJWkVTID0gbmV3IFN0cmluZ1tdIHsKLQkJCSI2IiwJCS8vJE5PTi1OTFMtMSQKLQkJCSI4IiwgCQkvLyROT04tTkxTLTEkCi0JCQkiOSIsIAkJLy8kTk9OLU5MUy0xJAotCQkJIjEwIiwgCQkvLyROT04tTkxTLTEkCi0JCQkiMTEiLCAJCS8vJE5PTi1OTFMtMSQKLQkJCSIxMiIsCSAJLy8kTk9OLU5MUy0xJAotCQkJIjE0IiwJCS8vJE5PTi1OTFMtMSQKLQkJCSIyNCIsCQkvLyROT04tTkxTLTEkCi0JCQkiMzYiLAkJLy8kTk9OLU5MUy0xJAotCQkJIjQ4IiAJCS8vJE5PTi1OTFMtMSQKLQl9OwotCQotCXN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZXMgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX3RleHRlZGl0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlcy5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVRleHRFZGl0b3IgZWRpdG9yID0gbmV3IFRleHRFZGl0b3IoZGlzcGxheSk7Ci0JCVNoZWxsIHNoZWxsID0gZWRpdG9yLnNoZWxsOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQllZGl0b3IucmVsZWFzZVJlc291cmNlcygpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEVkaXRvcihEaXNwbGF5IGRpc3BsYXkpIHsKLQkJdGhpcy5kaXNwbGF5ID0gZGlzcGxheTsKLQkJaW5pdFJlc291cmNlcygpOwotCQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiV2luZG93X3RpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWNyZWF0ZU1lbnVCYXIoKTsKLQkJY3JlYXRlVG9vbEJhcigpOwotCQljcmVhdGVQb3B1cCgpOwotCQlzdGF0dXNCYXIgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJaW5zdGFsbExpc3RlbmVycygpOwotCQl1cGRhdGVUb29sQmFyKCk7Ci0JCXVwZGF0ZVN0YXR1c0JhcigpOwotCQlzaGVsbC5zZXRTaXplKDEwMDAsIDcwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQl9Ci0JCi0Jdm9pZCBhZGRDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQlpbnQgb2Zmc2V0ID0gc3R5bGVkVGV4dC5nZXRDYXJldE9mZnNldCgpOwotCQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2Uob2Zmc2V0LCAwLCAiXHVGRkZDIik7IC8vJE5PTi1OTFMtMSQKLQkJU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCVBvaW50IHNpemUgPSBjb250cm9sLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWludCBhc2NlbnQgPSAyICogc2l6ZS55IC8gMzsKLQkJaW50IGRlc2NlbnQgPSBzaXplLnkgLSBhc2NlbnQ7Ci0JCXN0eWxlLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKGFzY2VudCArIE1BUkdJTiwgZGVzY2VudCArIE1BUkdJTiwgc2l6ZS54ICsgMiAqIE1BUkdJTik7Ci0JCXN0eWxlLmRhdGEgPSBjb250cm9sOwotCQlpbnRbXSByYW5nZXMgPSB7b2Zmc2V0LCAxfTsKLQkJU3R5bGVSYW5nZVtdIHN0eWxlcyA9IHtzdHlsZX07Ci0JCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZXMoMCwwLCByYW5nZXMsIHN0eWxlcyk7Ci0JCWNvbnRyb2wuc2V0U2l6ZShzaXplKTsKLQl9Ci0KLQl2b2lkIGFkZEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWludCBvZmZzZXQgPSBzdHlsZWRUZXh0LmdldENhcmV0T2Zmc2V0KCk7Ci0JCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZShvZmZzZXQsIDAsICJcdUZGRkMiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJc3R5bGUubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MocmVjdC5oZWlnaHQsIDAsIHJlY3Qud2lkdGgpOwotCQlzdHlsZS5kYXRhID0gaW1hZ2U7Ci0JCWludFtdIHJhbmdlcyA9IHtvZmZzZXQsIDF9OwotCQlTdHlsZVJhbmdlW10gc3R5bGVzID0ge3N0eWxlfTsKLQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlcygwLDAsIHJhbmdlcywgc3R5bGVzKTsKLQl9Ci0JCi0Jdm9pZCBhZGp1c3RGb250U2l6ZSAoaW50IGluY3JlbWVudCkgewotCQlpbnQgbmV3SW5kZXggPSBmb250U2l6ZUNvbnRyb2wuZ2V0U2VsZWN0aW9uSW5kZXgoKSArIGluY3JlbWVudDsKLQkJaWYgKDAgPD0gbmV3SW5kZXggJiYgbmV3SW5kZXggPCBmb250U2l6ZUNvbnRyb2wuZ2V0SXRlbUNvdW50KCkpIHsKLQkJCVN0cmluZyBuYW1lID0gZm9udE5hbWVDb250cm9sLmdldFRleHQoKTsKLQkJCWludCBzaXplID0gSW50ZWdlci5wYXJzZUludChmb250U2l6ZUNvbnRyb2wuZ2V0SXRlbShuZXdJbmRleCkpOwotCQkJZGlzcG9zZVJlc291cmNlKHRleHRGb250KTsKLQkJCXRleHRGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmFtZSwgc2l6ZSwgU1dULk5PUk1BTCk7Ci0JCQlzZXRTdHlsZShGT05UKTsKLQkJCXVwZGF0ZVRvb2xCYXIoKTsKLQkJfQotCX0KLQotCXZvaWQgY3JlYXRlTWVudUJhcigpIHsKLQkJTWVudSBtZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1lbnUpOwotCi0JCU1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQkJTWVudSBmaWxlTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQkJZmlsZUl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiRmlsZV9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlmaWxlSXRlbS5zZXRNZW51KGZpbGVNZW51KTsJCQotCQkKLQkJTWVudUl0ZW0gb3Blbkl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJb3Blbkl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiT3Blbl9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlvcGVuSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZyBbXSB7Z2V0UmVzb3VyY2VTdHJpbmcoIlRleHRfRG9jdW1lbnRzIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zIChuZXcgU3RyaW5nIFtdIHsiKi50eHQifSk7IC8vJE5PTi1OTFMtMSQKLQkJICAgICAgICBTdHJpbmcgbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgIHJldHVybjsKLQkJICAgICAgICBmaWxlTmFtZSA9IG5hbWU7Ci0JCSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbGUgPSBudWxsOwotCQkgICAgICAgIHRyeSB7Ci0JCSAgICAgICAgCWZpbGUgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5hbWUpOwotCQkgICAgICAgIAlzdHlsZWRUZXh0LnNldFRleHQob3BlbkZpbGUoZmlsZSkpOwotCQkgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJICAgICAgICAJc2hvd0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJFcnJvciIpLCBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJICAgICAgICB9IGZpbmFsbHkgewotCQkgICAgICAgIAl0cnkgewotCQkgICAgICAgIAkJaWYgKGZpbGUgIT0gbnVsbCkgZmlsZS5jbG9zZSgpOwotCQkgICAgICAgIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCSAgICAgICAgCQlzaG93RXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoIkVycm9yIiksIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgICAgIAl9Ci0JCSAgICAgICAgfQotCQkJfQkJCQkJCi0JCX0pOwotCQkKLQkJZmluYWwgTWVudUl0ZW0gc2F2ZUl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJc2F2ZUl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiU2F2ZV9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzYXZlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNhdmVGaWxlKCk7Ci0JCQl9CQkJCQkJCQkJCQkKLQkJfSk7Ci0JCQotCQlmaWxlTWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBldmVudCl7Ci0JCQkJc2F2ZUl0ZW0uc2V0RW5hYmxlZChmaWxlTmFtZSAhPSBudWxsKTsKLQkJCX0JCQkgCQkJCi0JCX0pOwotCQkKLQkJTWVudUl0ZW0gc2F2ZUFzSXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlzYXZlQXNJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlNhdmVBc19tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzYXZlQXNJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyAoc2hlbGwsIFNXVC5TQVZFKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZyBbXSB7Z2V0UmVzb3VyY2VTdHJpbmcoIlRleHRfRG9jdW1lbnRzIil9KTsgLy8kTk9OLU5MUy0xJCAKLQkJCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nIFtdIHsiKi50eHQifSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgZGlhbG9nLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5vcGVuKCk7IAotCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJZmlsZU5hbWUgPSBuYW1lOwotCQkJCQlzYXZlRmlsZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQluZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQkKLQkJTWVudUl0ZW0gZXhpdEl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJZXhpdEl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiRXhpdF9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlleGl0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsJCi0KLQkJTWVudUl0ZW0gZWRpdEl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNBU0NBREUpOwotCQlmaW5hbCBNZW51IGVkaXRNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCQllZGl0SXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJFZGl0X21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCWVkaXRJdGVtLnNldE1lbnUoZWRpdE1lbnUpOwotCQlmaW5hbCBNZW51SXRlbSBjdXRJdGVtID0gbmV3IE1lbnVJdGVtKGVkaXRNZW51LCBTV1QuUFVTSCk7Ci0JCWN1dEl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiQ3V0X21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCWN1dEl0ZW0uc2V0SW1hZ2UoaUN1dCk7Ci0JCWN1dEl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgfCAneCcpOwotCQljdXRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzdHlsZWRUZXh0LmN1dCgpOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBNZW51SXRlbSBjb3B5SXRlbSA9IG5ldyBNZW51SXRlbShlZGl0TWVudSwgU1dULlBVU0gpOwotCQljb3B5SXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJDb3B5X21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCWNvcHlJdGVtLnNldEltYWdlKGlDb3B5KTsKLQkJY29weUl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgfCAnYycpOwotCQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc3R5bGVkVGV4dC5jb3B5KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCU1lbnVJdGVtIHBhc3RlSXRlbSA9IG5ldyBNZW51SXRlbShlZGl0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZUl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiUGFzdGVfbWVudWl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFzdGVJdGVtLnNldEltYWdlKGlQYXN0ZSk7Ci0JCXBhc3RlSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSB8ICd2Jyk7Ci0JCXBhc3RlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc3R5bGVkVGV4dC5wYXN0ZSgpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTWVudUl0ZW0oZWRpdE1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQlmaW5hbCBNZW51SXRlbSBzZWxlY3RBbGxJdGVtID0gbmV3IE1lbnVJdGVtKGVkaXRNZW51LCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbEl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiU2VsZWN0QWxsX21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCXNlbGVjdEFsbEl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgfCAnYScpOwotCQlzZWxlY3RBbGxJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzdHlsZWRUZXh0LnNlbGVjdEFsbCgpOwotCQkJfQotCQl9KTsKLQotCQllZGl0TWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBldmVudCkgewotCQkJCWludCBzZWxlY3Rpb25Db3VudCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQkJCQljdXRJdGVtLnNldEVuYWJsZWQoc2VsZWN0aW9uQ291bnQgPiAwKTsKLQkJCQljb3B5SXRlbS5zZXRFbmFibGVkKHNlbGVjdGlvbkNvdW50ID4gMCk7Ci0JCQkJc2VsZWN0QWxsSXRlbS5zZXRFbmFibGVkKHNlbGVjdGlvbkNvdW50IDwgc3R5bGVkVGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCU1lbnVJdGVtIHdyYXBJdGVtID0gbmV3IE1lbnVJdGVtKGVkaXRNZW51LCBTV1QuQ0hFQ0spOwotCQl3cmFwSXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJXcmFwX21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCXdyYXBJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQkJYm9vbGVhbiBlbmFibGVkID0gaXRlbS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlzdHlsZWRUZXh0LnNldFdvcmRXcmFwKGVuYWJsZWQpOwotCQkJCWVkaXRNZW51LmdldEl0ZW0oNikuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQllZGl0TWVudS5nZXRJdGVtKDgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJbGVmdEFsaWdubWVudEl0ZW0uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQljZW50ZXJBbGlnbm1lbnRJdGVtLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJcmlnaHRBbGlnbm1lbnRJdGVtLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJanVzdGlmeUFsaWdubWVudEl0ZW0uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQlibG9ja1NlbGVjdGlvbkl0ZW0uc2V0RW5hYmxlZCghZW5hYmxlZCk7Ci0JCQl9Ci0JCX0pOwotCi0JCU1lbnVJdGVtIGp1c3RpZnlJdGVtID0gbmV3IE1lbnVJdGVtKGVkaXRNZW51LCBTV1QuQ0hFQ0spOwotCQlqdXN0aWZ5SXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJKdXN0aWZ5X21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCWp1c3RpZnlJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQkJc3R5bGVkVGV4dC5zZXRKdXN0aWZ5KGl0ZW0uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCXVwZGF0ZVRvb2xCYXIoKTsKLQkJCX0KLQkJfSk7Ci0JCWp1c3RpZnlJdGVtLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCU1lbnVJdGVtIHNldEZvbnRJdGVtID0gbmV3IE1lbnVJdGVtKGVkaXRNZW51LCBTV1QuUFVTSCk7Ci0JCXNldEZvbnRJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlNldEZvbnRfbWVudWl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0Rm9udEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUZvbnREaWFsb2cgZm9udERpYWxvZyA9IG5ldyBGb250RGlhbG9nKHNoZWxsKTsKLQkJCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KHN0eWxlZFRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCkpOwotCQkJCUZvbnREYXRhIGRhdGEgPSBmb250RGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJCUZvbnQgbmV3Rm9udCA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEpOwotCQkJCQlzdHlsZWRUZXh0LnNldEZvbnQobmV3Rm9udCk7Ci0JCQkJCWlmIChmb250ICE9IG51bGwpIGZvbnQuZGlzcG9zZSgpOwotCQkJCQlmb250ID0gbmV3Rm9udDsKLQkJCQkJdXBkYXRlVG9vbEJhcigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJTWVudUl0ZW0gYWxpZ25tZW50SXRlbSA9IG5ldyBNZW51SXRlbShlZGl0TWVudSwgU1dULkNBU0NBREUpOwotCQlhbGlnbm1lbnRJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkFsaWdubWVudF9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlNZW51IGFsaWdubWVudE1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWFsaWdubWVudEl0ZW0uc2V0TWVudShhbGlnbm1lbnRNZW51KTsKLQkJZmluYWwgTWVudUl0ZW0gbGVmdEFsaWdubWVudEl0ZW0gPSBuZXcgTWVudUl0ZW0oYWxpZ25tZW50TWVudSwgU1dULlJBRElPKTsKLQkJbGVmdEFsaWdubWVudEl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiTGVmdF9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlsZWZ0QWxpZ25tZW50SXRlbS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWxlZnRBbGlnbm1lbnRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzdHlsZWRUZXh0LnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCQkJdXBkYXRlVG9vbEJhcigpOwotCQkJfQotCQl9KTsKLQkJYWxpZ25tZW50SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmaW5hbCBNZW51SXRlbSBjZW50ZXJBbGlnbm1lbnRJdGVtID0gbmV3IE1lbnVJdGVtKGFsaWdubWVudE1lbnUsIFNXVC5SQURJTyk7Ci0JCWNlbnRlckFsaWdubWVudEl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiQ2VudGVyX21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCWNlbnRlckFsaWdubWVudEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXN0eWxlZFRleHQuc2V0QWxpZ25tZW50KFNXVC5DRU5URVIpOwotCQkJCXVwZGF0ZVRvb2xCYXIoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJTWVudUl0ZW0gcmlnaHRBbGlnbm1lbnRJdGVtID0gbmV3IE1lbnVJdGVtKGFsaWdubWVudE1lbnUsIFNXVC5SQURJTyk7Ci0JCXJpZ2h0QWxpZ25tZW50SXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJSaWdodF9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyaWdodEFsaWdubWVudEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXN0eWxlZFRleHQuc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7Ci0JCQkJdXBkYXRlVG9vbEJhcigpOwotCQkJfQotCQl9KTsKLQkJCi0JCU1lbnVJdGVtIGVkaXRPcmllbnRhdGlvbkl0ZW0gPSBuZXcgTWVudUl0ZW0oZWRpdE1lbnUsIFNXVC5DQVNDQURFKTsKLQkJZWRpdE9yaWVudGF0aW9uSXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJPcmllbnRhdGlvbl9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlNZW51IGVkaXRPcmllbnRhdGlvbk1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWVkaXRPcmllbnRhdGlvbkl0ZW0uc2V0TWVudShlZGl0T3JpZW50YXRpb25NZW51KTsKLQotCQlNZW51SXRlbSBsZWZ0VG9SaWdodEl0ZW0gPSBuZXcgTWVudUl0ZW0oZWRpdE9yaWVudGF0aW9uTWVudSwgU1dULlJBRElPKTsKLQkJbGVmdFRvUmlnaHRJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkxlZnRUb1JpZ2h0X21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCWxlZnRUb1JpZ2h0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KXsKLQkJCQlzdHlsZWRUZXh0LnNldE9yaWVudGF0aW9uKFNXVC5MRUZUX1RPX1JJR0hUKTsKLQkJCX0KLQkJfSk7Ci0JCWxlZnRUb1JpZ2h0SXRlbS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQotCQlNZW51SXRlbSByaWdodFRvTGVmdEl0ZW0gPSBuZXcgTWVudUl0ZW0oZWRpdE9yaWVudGF0aW9uTWVudSwgU1dULlJBRElPKTsKLQkJcmlnaHRUb0xlZnRJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlJpZ2h0VG9MZWZ0X21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCXJpZ2h0VG9MZWZ0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc3R5bGVkVGV4dC5zZXRPcmllbnRhdGlvbihTV1QuUklHSFRfVE9fTEVGVCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3IE1lbnVJdGVtKGVkaXRNZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJTWVudUl0ZW0gaW5zZXJ0T2JqZWN0SXRlbSA9IG5ldyBNZW51SXRlbShlZGl0TWVudSwgU1dULkNBU0NBREUpOwotCQlpbnNlcnRPYmplY3RJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkluc2VydE9iamVjdF9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlNZW51IGluc2VydE9iamVjdE1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWluc2VydE9iamVjdEl0ZW0uc2V0TWVudShpbnNlcnRPYmplY3RNZW51KTsKLQotCQlNZW51SXRlbSBpbnNlcnRDb250cm9sSXRlbSA9IG5ldyBNZW51SXRlbShpbnNlcnRPYmplY3RNZW51LCBTV1QuQ0FTQ0FERSk7Ci0JCWluc2VydENvbnRyb2xJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbnRyb2xzX21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCU1lbnUgY29udHJvbENob2ljZSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQkJaW5zZXJ0Q29udHJvbEl0ZW0uc2V0TWVudShjb250cm9sQ2hvaWNlKTsKLQotCQlNZW51SXRlbSBidXR0b25JdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRyb2xDaG9pY2UsIFNXVC5QVVNIKTsKLQkJYnV0dG9uSXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJCdXR0b25fbWVudWl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJTWVudUl0ZW0gY29tYm9JdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRyb2xDaG9pY2UsIFNXVC5QVVNIKTsKLQkJY29tYm9JdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbWJvX21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0KLQkJYnV0dG9uSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVkVGV4dCwgU1dULlBVU0gpOwotCQkJCWJ1dHRvbi5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJCdXR0b25fbWVudWl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRDb250cm9sKGJ1dHRvbik7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbWJvSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oc3R5bGVkVGV4dCwgU1dULk5PTkUpOwotCQkJCWNvbWJvLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbWJvX21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkQ29udHJvbChjb21ibyk7Ci0JCQl9Ci0JCX0pOwotCi0JCU1lbnVJdGVtIGluc2VydEltYWdlSXRlbSA9IG5ldyBNZW51SXRlbShpbnNlcnRPYmplY3RNZW51LCBTV1QuUFVTSCk7Ci0JCWluc2VydEltYWdlSXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJJbWFnZV9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluc2VydEltYWdlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZmlsZU5hbWUpOwotCQkJCQkJYWRkSW1hZ2UoaW1hZ2UpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJc2hvd0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJCYWRfaW1hZ2UiKSwgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChTQU1QTEVfVEVYVCkgewotCQkJbmV3IE1lbnVJdGVtKGVkaXRNZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCU1lbnVJdGVtIGxvYWRQcm9maWxlSXRlbSA9IG5ldyBNZW51SXRlbShlZGl0TWVudSwgU1dULkNBU0NBREUpOwotCQkJbG9hZFByb2ZpbGVJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkxvYWRQcm9maWxlX21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCQlNZW51IGxvYWRQcm9maWxlTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQkJCWxvYWRQcm9maWxlSXRlbS5zZXRNZW51KGxvYWRQcm9maWxlTWVudSk7Ci0JCQlTZWxlY3Rpb25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlpbnQgcHJvZmlsZSA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgZXZlbnQud2lkZ2V0LmdldERhdGEoKSk7Ci0JCQkJCWxvYWRQcm9maWxlKHByb2ZpbGUpOwotCQkJCX0KLQkJCX07Ci0JCi0JCQlNZW51SXRlbSBwcm9maWxlSXRlbSA9IG5ldyBNZW51SXRlbShsb2FkUHJvZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJCXByb2ZpbGVJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2ZpbGUxX21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9maWxlSXRlbS5zZXREYXRhKCIxIik7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2ZpbGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGFkYXB0ZXIpOwotCQkJcHJvZmlsZUl0ZW0gPSBuZXcgTWVudUl0ZW0obG9hZFByb2ZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCQlwcm9maWxlSXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJQcm9maWxlMl9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJvZmlsZUl0ZW0uc2V0RGF0YSgiMiIpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9maWxlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihhZGFwdGVyKTsKLQkJCXByb2ZpbGVJdGVtID0gbmV3IE1lbnVJdGVtKGxvYWRQcm9maWxlTWVudSwgU1dULlBVU0gpOwotCQkJcHJvZmlsZUl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiUHJvZmlsZTNfbWVudWl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2ZpbGVJdGVtLnNldERhdGEoIjMiKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJvZmlsZUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoYWRhcHRlcik7Ci0JCQlwcm9maWxlSXRlbSA9IG5ldyBNZW51SXRlbShsb2FkUHJvZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJCXByb2ZpbGVJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2ZpbGU0X21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9maWxlSXRlbS5zZXREYXRhKCI0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2ZpbGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGFkYXB0ZXIpOwotCQl9Ci0JfQotCi0Jdm9pZCBjcmVhdGVQb3B1cCgpIHsKLQkJTWVudSBtZW51ID0gbmV3IE1lbnUgKHN0eWxlZFRleHQpOwotCQlmaW5hbCBNZW51SXRlbSBjdXRJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCWN1dEl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIkN1dF9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQljdXRJdGVtLnNldEltYWdlKGlDdXQpOwotCQljdXRJdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3R5bGVkVGV4dC5jdXQoKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIGNvcHlJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCWNvcHlJdGVtLnNldFRleHQgKGdldFJlc291cmNlU3RyaW5nKCJDb3B5X21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCWNvcHlJdGVtLnNldEltYWdlKGlDb3B5KTsKLQkJY29weUl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlzdHlsZWRUZXh0LmNvcHkoKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlSXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZUl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIlBhc3RlX21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCXBhc3RlSXRlbS5zZXRJbWFnZShpUGFzdGUpOwotCQlwYXN0ZUl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlzdHlsZWRUZXh0LnBhc3RlKCk7Ci0JCQl9Ci0JCX0pOwotCQluZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQlmaW5hbCBNZW51SXRlbSBzZWxlY3RBbGxJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbEl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIlNlbGVjdEFsbF9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RBbGxJdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3R5bGVkVGV4dC5zZWxlY3RBbGwoKTsKLQkJCX0KLQkJfSk7Ci0JCW1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgc2VsZWN0aW9uQ291bnQgPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvbkNvdW50KCk7Ci0JCQkJY3V0SXRlbS5zZXRFbmFibGVkKHNlbGVjdGlvbkNvdW50ID4gMCk7Ci0JCQkJY29weUl0ZW0uc2V0RW5hYmxlZChzZWxlY3Rpb25Db3VudCA+IDApOwotCQkJCXNlbGVjdEFsbEl0ZW0uc2V0RW5hYmxlZChzZWxlY3Rpb25Db3VudCA8IHN0eWxlZFRleHQuZ2V0Q2hhckNvdW50KCkpOwotCQkJfQotCQl9KTsKLQkJc3R5bGVkVGV4dC5zZXRNZW51KG1lbnUpOwotCX0KLQotCXZvaWQgY3JlYXRlVG9vbEJhcigpIHsKLQkJY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCBTV1QuRkxBVCk7Ci0JCVRvb2xCYXIgc3R5bGVUb29sQmFyID0gbmV3IFRvb2xCYXIoY29vbEJhciwgU1dULkZMQVQpOwotCQlib2xkQ29udHJvbCA9IG5ldyBUb29sSXRlbShzdHlsZVRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWJvbGRDb250cm9sLnNldEltYWdlKGlCb2xkKTsKLQkJYm9sZENvbnRyb2wuc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkJvbGQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYm9sZENvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFN0eWxlKEJPTEQpOwotCQkJfQotCQl9KTsKLQotCQlpdGFsaWNDb250cm9sID0gbmV3IFRvb2xJdGVtKHN0eWxlVG9vbEJhciwgU1dULkNIRUNLKTsKLQkJaXRhbGljQ29udHJvbC5zZXRJbWFnZShpSXRhbGljKTsKLQkJaXRhbGljQ29udHJvbC5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygiSXRhbGljIikpOyAvLyROT04tTkxTLTEkCi0JCWl0YWxpY0NvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFN0eWxlKElUQUxJQyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIE1lbnUgdW5kZXJsaW5lTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuUE9QX1VQKTsKLQkJdW5kZXJsaW5lU2luZ2xlSXRlbSA9IG5ldyBNZW51SXRlbSh1bmRlcmxpbmVNZW51LCBTV1QuUkFESU8pOwotCQl1bmRlcmxpbmVTaW5nbGVJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlNpbmdsZV9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQl1bmRlcmxpbmVTaW5nbGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodW5kZXJsaW5lU2luZ2xlSXRlbS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlzZXRTdHlsZShVTkRFUkxJTkVfU0lOR0xFKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl1bmRlcmxpbmVTaW5nbGVJdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKLQotCQl1bmRlcmxpbmVEb3VibGVJdGVtID0gbmV3IE1lbnVJdGVtKHVuZGVybGluZU1lbnUsIFNXVC5SQURJTyk7Ci0JCXVuZGVybGluZURvdWJsZUl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiRG91YmxlX21lbnVpdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCXVuZGVybGluZURvdWJsZUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICh1bmRlcmxpbmVEb3VibGVJdGVtLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXNldFN0eWxlKFVOREVSTElORV9ET1VCTEUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdW5kZXJsaW5lU3F1aWdnbGVJdGVtID0gbmV3IE1lbnVJdGVtKHVuZGVybGluZU1lbnUsIFNXVC5SQURJTyk7Ci0JCXVuZGVybGluZVNxdWlnZ2xlSXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJTcXVpZ2dsZV9tZW51aXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQl1bmRlcmxpbmVTcXVpZ2dsZUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICh1bmRlcmxpbmVTcXVpZ2dsZUl0ZW0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJc2V0U3R5bGUoVU5ERVJMSU5FX1NRVUlHR0xFKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXVuZGVybGluZUVycm9ySXRlbSA9IG5ldyBNZW51SXRlbSh1bmRlcmxpbmVNZW51LCBTV1QuUkFESU8pOwotCQl1bmRlcmxpbmVFcnJvckl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiRXJyb3JfbWVudWl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJdW5kZXJsaW5lRXJyb3JJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodW5kZXJsaW5lRXJyb3JJdGVtLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXNldFN0eWxlKFVOREVSTElORV9FUlJPUik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlNZW51SXRlbSB1bmRlcmxpbmVDb2xvckl0ZW0gPSBuZXcgTWVudUl0ZW0odW5kZXJsaW5lTWVudSwgU1dULlBVU0gpOwotCQl1bmRlcmxpbmVDb2xvckl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiQ29sb3JfbWVudWl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJdW5kZXJsaW5lQ29sb3JJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xvckRpYWxvZyBkaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQkJCVJHQiByZ2IgPSB1bmRlcmxpbmVDb2xvciAhPSBudWxsID8gdW5kZXJsaW5lQ29sb3IuZ2V0UkdCKCkgOiBudWxsOwotCQkJCWRpYWxvZy5zZXRSR0IocmdiKTsKLQkJCQlSR0IgbmV3UmdiID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAobmV3UmdiICE9IG51bGwpIHsKLQkJCQkJaWYgKCFuZXdSZ2IuZXF1YWxzKHJnYikpIHsKLQkJCQkJCWRpc3Bvc2VSZXNvdXJjZSh1bmRlcmxpbmVDb2xvcik7Ci0JCQkJCQl1bmRlcmxpbmVDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXdSZ2IpOwkJCQkJCi0JCQkJCX0KLQkJCQkJaWYgKHVuZGVybGluZVNpbmdsZUl0ZW0uZ2V0U2VsZWN0aW9uKCkpIHNldFN0eWxlKFVOREVSTElORV9TSU5HTEUpOwotCQkJCQllbHNlIGlmICh1bmRlcmxpbmVEb3VibGVJdGVtLmdldFNlbGVjdGlvbigpKSBzZXRTdHlsZShVTkRFUkxJTkVfRE9VQkxFKTsKLQkJCQkJZWxzZSBpZiAodW5kZXJsaW5lRXJyb3JJdGVtLmdldFNlbGVjdGlvbigpKSBzZXRTdHlsZShVTkRFUkxJTkVfRVJST1IpOwotCQkJCQllbHNlIGlmICh1bmRlcmxpbmVTcXVpZ2dsZUl0ZW0uZ2V0U2VsZWN0aW9uKCkpIHNldFN0eWxlKFVOREVSTElORV9TUVVJR0dMRSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWZpbmFsIFRvb2xJdGVtIHVuZGVybGluZUNvbnRyb2wgPSBuZXcgVG9vbEl0ZW0oc3R5bGVUb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJdW5kZXJsaW5lQ29udHJvbC5zZXRJbWFnZShpVW5kZXJsaW5lKTsKLQkJdW5kZXJsaW5lQ29udHJvbC5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygiVW5kZXJsaW5lIikpOyAvLyROT04tTkxTLTEkCi0JCXVuZGVybGluZUNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gdW5kZXJsaW5lQ29udHJvbC5nZXRCb3VuZHMoKTsKLQkJCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQocmVjdC54LCByZWN0LnkgKyByZWN0LmhlaWdodCk7Ci0JCQkJCXVuZGVybGluZU1lbnUuc2V0TG9jYXRpb24oZGlzcGxheS5tYXAodW5kZXJsaW5lQ29udHJvbC5nZXRQYXJlbnQoKSwgbnVsbCwgcHQpKTsKLQkJCQkJdW5kZXJsaW5lTWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh1bmRlcmxpbmVTaW5nbGVJdGVtLmdldFNlbGVjdGlvbigpKSBzZXRTdHlsZShVTkRFUkxJTkVfU0lOR0xFKTsKLQkJCQkJZWxzZSBpZiAodW5kZXJsaW5lRG91YmxlSXRlbS5nZXRTZWxlY3Rpb24oKSkgc2V0U3R5bGUoVU5ERVJMSU5FX0RPVUJMRSk7Ci0JCQkJCWVsc2UgaWYgKHVuZGVybGluZUVycm9ySXRlbS5nZXRTZWxlY3Rpb24oKSkgc2V0U3R5bGUoVU5ERVJMSU5FX0VSUk9SKTsKLQkJCQkJZWxzZSBpZiAodW5kZXJsaW5lU3F1aWdnbGVJdGVtLmdldFNlbGVjdGlvbigpKSBzZXRTdHlsZShVTkRFUkxJTkVfU1FVSUdHTEUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJVG9vbEl0ZW0gc3RyaWtlb3V0Q29udHJvbCA9IG5ldyBUb29sSXRlbShzdHlsZVRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlzdHJpa2VvdXRDb250cm9sLnNldEltYWdlKGlTdHJpa2VvdXQpOwotCQlzdHJpa2VvdXRDb250cm9sLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJTdHJpa2VvdXQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3RyaWtlb3V0Q29udHJvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCQkJQ29sb3JEaWFsb2cgZGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKHNoZWxsKTsKLQkJCQkJUkdCIHJnYiA9IHN0cmlrZW91dENvbG9yICE9IG51bGwgPyBzdHJpa2VvdXRDb2xvci5nZXRSR0IoKSA6IG51bGw7Ci0JCQkJCWRpYWxvZy5zZXRSR0IocmdiKTsKLQkJCQkJUkdCIG5ld1JnYiA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChuZXdSZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlpZiAoIW5ld1JnYi5lcXVhbHMocmdiKSkgewotCQkJCQkJZGlzcG9zZVJlc291cmNlKHN0cmlrZW91dENvbG9yKTsKLQkJCQkJCXN0cmlrZW91dENvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ld1JnYik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2V0U3R5bGUoU1RSSUtFT1VUKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZmluYWwgTWVudSBib3JkZXJNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5QT1BfVVApOwotCQlib3JkZXJTb2xpZEl0ZW0gPSBuZXcgTWVudUl0ZW0oYm9yZGVyTWVudSwgU1dULlJBRElPKTsKLQkJYm9yZGVyU29saWRJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlNvbGlkIikpOyAvLyROT04tTkxTLTEkCi0JCWJvcmRlclNvbGlkSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KXsKLQkJCQlpZiAoYm9yZGVyU29saWRJdGVtLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXNldFN0eWxlKEJPUkRFUl9TT0xJRCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYm9yZGVyU29saWRJdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCi0JCWJvcmRlckRhc2hJdGVtID0gbmV3IE1lbnVJdGVtKGJvcmRlck1lbnUsIFNXVC5SQURJTyk7Ci0JCWJvcmRlckRhc2hJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkRhc2giKSk7IC8vJE5PTi1OTFMtMSQKLQkJYm9yZGVyRGFzaEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCl7Ci0JCQkJaWYgKGJvcmRlckRhc2hJdGVtLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXNldFN0eWxlKEJPUkRFUl9EQVNIKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYm9yZGVyRG90SXRlbSA9IG5ldyBNZW51SXRlbShib3JkZXJNZW51LCBTV1QuUkFESU8pOwotCQlib3JkZXJEb3RJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkRvdCIpKTsgLy8kTk9OLU5MUy0xJAotCQlib3JkZXJEb3RJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpewotCQkJCWlmIChib3JkZXJEb3RJdGVtLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXNldFN0eWxlKEJPUkRFUl9ET1QpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlNZW51SXRlbSBib3JkZXJDb2xvckl0ZW0gPSBuZXcgTWVudUl0ZW0oYm9yZGVyTWVudSwgU1dULlBVU0gpOwotCQlib3JkZXJDb2xvckl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiQ29sb3JfbWVudWl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYm9yZGVyQ29sb3JJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpewotCQkJCUNvbG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhzaGVsbCk7Ci0JCQkJUkdCIHJnYiA9IGJvcmRlckNvbG9yICE9IG51bGwgPyBib3JkZXJDb2xvci5nZXRSR0IoKSA6IG51bGw7Ci0JCQkJZGlhbG9nLnNldFJHQihyZ2IpOwotCQkJCVJHQiBuZXdSZ2IgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChuZXdSZ2IgIT0gbnVsbCkgewotCQkJCQlpZiAoIW5ld1JnYi5lcXVhbHMocmdiKSkgewotCQkJCQkJZGlzcG9zZVJlc291cmNlKGJvcmRlckNvbG9yKTsKLQkJCQkJCWJvcmRlckNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ld1JnYik7Ci0JCQkJCX0KLQkJCQkJaWYgKGJvcmRlckRhc2hJdGVtLmdldFNlbGVjdGlvbigpKSBzZXRTdHlsZShCT1JERVJfREFTSCk7Ci0JCQkJCWVsc2UgaWYgKGJvcmRlckRvdEl0ZW0uZ2V0U2VsZWN0aW9uKCkpIHNldFN0eWxlKEJPUkRFUl9ET1QpOwotCQkJCQllbHNlIGlmIChib3JkZXJTb2xpZEl0ZW0uZ2V0U2VsZWN0aW9uKCkpIHNldFN0eWxlKEJPUkRFUl9TT0xJRCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBUb29sSXRlbSBib3JkZXJDb250cm9sID0gbmV3IFRvb2xJdGVtKHN0eWxlVG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWJvcmRlckNvbnRyb2wuc2V0SW1hZ2UoaUJvcmRlclN0eWxlKTsKLQkJYm9yZGVyQ29udHJvbC5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygiQm94IikpOyAvLyROT04tTkxTLTEkCi0JCWJvcmRlckNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gYm9yZGVyQ29udHJvbC5nZXRCb3VuZHMoKTsKLQkJCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQocmVjdC54LCByZWN0LnkgKyByZWN0LmhlaWdodCk7Ci0JCQkJCWJvcmRlck1lbnUuc2V0TG9jYXRpb24oZGlzcGxheS5tYXAoYm9yZGVyQ29udHJvbC5nZXRQYXJlbnQoKSwgbnVsbCwgcHQpKTsKLQkJCQkJYm9yZGVyTWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChib3JkZXJEYXNoSXRlbS5nZXRTZWxlY3Rpb24oKSkgc2V0U3R5bGUoQk9SREVSX0RBU0gpOwotCQkJCQllbHNlIGlmIChib3JkZXJEb3RJdGVtLmdldFNlbGVjdGlvbigpKSBzZXRTdHlsZShCT1JERVJfRE9UKTsKLQkJCQkJZWxzZSBpZiAoYm9yZGVyU29saWRJdGVtLmdldFNlbGVjdGlvbigpKSBzZXRTdHlsZShCT1JERVJfU09MSUQpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJVG9vbEl0ZW0gZm9yZWdyb3VuZEl0ZW0gPSBuZXcgVG9vbEl0ZW0oc3R5bGVUb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJZm9yZWdyb3VuZEl0ZW0uc2V0SW1hZ2UoaVRleHRGb3JlZ3JvdW5kKTsKLQkJZm9yZWdyb3VuZEl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlRleHRGb3JlZ3JvdW5kIikpOyAvLyROT04tTkxTLTEkCi0JCWZvcmVncm91bmRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsJCQotCQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XIHx8IHRleHRGb3JlZ3JvdW5kID09IG51bGwpIHsKLQkJCQkJQ29sb3JEaWFsb2cgZGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKHNoZWxsKTsKLQkJCQkJUkdCIHJnYiA9IHRleHRGb3JlZ3JvdW5kICE9IG51bGwgPyB0ZXh0Rm9yZWdyb3VuZC5nZXRSR0IoKSA6IG51bGw7Ci0JCQkJCWRpYWxvZy5zZXRSR0IocmdiKTsKLQkJCQkJUkdCIG5ld1JnYiA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChuZXdSZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlpZiAoIW5ld1JnYi5lcXVhbHMocmdiKSkgewotCQkJCQkJZGlzcG9zZVJlc291cmNlKHRleHRGb3JlZ3JvdW5kKTsKLQkJCQkJCXRleHRGb3JlZ3JvdW5kID0gbmV3IENvbG9yKGRpc3BsYXksIG5ld1JnYik7CQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCQlzZXRTdHlsZShGT1JFR1JPVU5EKTsJCQkJCi0JCQl9Ci0JCX0pOwotCi0JCVRvb2xJdGVtIGJhY2tncm91bmRJdGVtID0gbmV3IFRvb2xJdGVtKHN0eWxlVG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWJhY2tncm91bmRJdGVtLnNldEltYWdlKGlUZXh0QmFja2dyb3VuZCk7Ci0JCWJhY2tncm91bmRJdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJUZXh0QmFja2dyb3VuZCIpKTsgLy8kTk9OLU5MUy0xJAotCQliYWNrZ3JvdW5kSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CQkJCi0JCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cgfHwgdGV4dEJhY2tncm91bmQgPT0gbnVsbCkgewotCQkJCQlDb2xvckRpYWxvZyBkaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQkJCQlSR0IgcmdiID0gdGV4dEJhY2tncm91bmQgIT0gbnVsbCA/IHRleHRCYWNrZ3JvdW5kLmdldFJHQigpIDogbnVsbDsKLQkJCQkJZGlhbG9nLnNldFJHQihyZ2IpOwotCQkJCQlSR0IgbmV3UmdiID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKG5ld1JnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJCWlmICghbmV3UmdiLmVxdWFscyhyZ2IpKSB7Ci0JCQkJCQlkaXNwb3NlUmVzb3VyY2UodGV4dEJhY2tncm91bmQpOwotCQkJCQkJdGV4dEJhY2tncm91bmQgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3UmdiKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlzZXRTdHlsZShCQUNLR1JPVU5EKTsKLQkJCX0KLQkJfSk7Ci0KLQkJVG9vbEl0ZW0gYmFzZWxpbmVVcEl0ZW0gPSBuZXcgVG9vbEl0ZW0oc3R5bGVUb29sQmFyLCBTV1QuUFVTSCk7Ci0JCWJhc2VsaW5lVXBJdGVtLnNldEltYWdlKGlCYXNlbGluZVVwKTsKLQkJU3RyaW5nIHRvb2x0aXAgPSAiSW5jcmVhc2VGb250IjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoVVNFX0JBU0VMSU5FKSB0b29sdGlwID0gIkluY3JlYXNlQmFzZWxpbmUiOyAvLyROT04tTkxTLTEkCi0JCWJhc2VsaW5lVXBJdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKHRvb2x0aXApKTsKLQkJYmFzZWxpbmVVcEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChVU0VfQkFTRUxJTkUpIHsKLQkJCQkJc2V0U3R5bGUoQkFTRUxJTkVfVVApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkanVzdEZvbnRTaXplKDEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJVG9vbEl0ZW0gYmFzZWxpbmVEb3duSXRlbSA9IG5ldyBUb29sSXRlbShzdHlsZVRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJYmFzZWxpbmVEb3duSXRlbS5zZXRJbWFnZShpQmFzZWxpbmVEb3duKTsKLQkJdG9vbHRpcCA9ICJEZWNyZWFzZUZvbnQiOyAvLyROT04tTkxTLTEkCi0JCWlmIChVU0VfQkFTRUxJTkUpIHRvb2x0aXAgPSAiRGVjcmVhc2VCYXNlbGluZSI7IC8vJE5PTi1OTFMtMSQKLQkJYmFzZWxpbmVEb3duSXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZyh0b29sdGlwKSk7Ci0JCWJhc2VsaW5lRG93bkl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChVU0VfQkFTRUxJTkUpIHsKLQkJCQkJc2V0U3R5bGUoQkFTRUxJTkVfRE9XTik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYWRqdXN0Rm9udFNpemUoLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCVRvb2xJdGVtIGxpbmtJdGVtID0gbmV3IFRvb2xJdGVtKHN0eWxlVG9vbEJhciwgU1dULlBVU0gpOwotCQlsaW5rSXRlbS5zZXRJbWFnZShpTGluayk7Ci0JCWxpbmtJdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJMaW5rIikpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRMaW5rKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULk5PTkUpOwotCQljb29sSXRlbS5zZXRDb250cm9sKHN0eWxlVG9vbEJhcik7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb29sQmFyLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlmb250TmFtZUNvbnRyb2wgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWZvbnROYW1lQ29udHJvbC5zZXRJdGVtcyhnZXRGb250TmFtZXMoKSk7Ci0JCWZvbnROYW1lQ29udHJvbC5zZXRWaXNpYmxlSXRlbUNvdW50KDEyKTsKLQkJZm9udFNpemVDb250cm9sID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQlmb250U2l6ZUNvbnRyb2wuc2V0SXRlbXMoRk9OVF9TSVpFUyk7Ci0JCWZvbnRTaXplQ29udHJvbC5zZXRWaXNpYmxlSXRlbUNvdW50KDgpOwotCQlTZWxlY3Rpb25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmb250TmFtZUNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWludCBzaXplID0gSW50ZWdlci5wYXJzZUludChmb250U2l6ZUNvbnRyb2wuZ2V0VGV4dCgpKTsKLQkJCQlkaXNwb3NlUmVzb3VyY2UodGV4dEZvbnQpOwotCQkJCXRleHRGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmFtZSwgc2l6ZSwgU1dULk5PUk1BTCk7Ci0JCQkJc2V0U3R5bGUoRk9OVCk7Ci0JCQl9Ci0JCX07Ci0JCWZvbnRTaXplQ29udHJvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihhZGFwdGVyKTsKLQkJZm9udE5hbWVDb250cm9sLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGFkYXB0ZXIpOwotCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuTk9ORSk7Ci0JCWNvb2xJdGVtLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQlUb29sQmFyIGFsaWdubWVudFRvb2xCYXIgPSBuZXcgVG9vbEJhcihjb29sQmFyLCBTV1QuRkxBVCk7Ci0JCWJsb2NrU2VsZWN0aW9uSXRlbSA9IG5ldyBUb29sSXRlbShhbGlnbm1lbnRUb29sQmFyLCBTV1QuQ0hFQ0spOwotCQlibG9ja1NlbGVjdGlvbkl0ZW0uc2V0SW1hZ2UoaUJsb2NrU2VsZWN0aW9uKTsKLQkJYmxvY2tTZWxlY3Rpb25JdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJCbG9ja1NlbGVjdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQlibG9ja1NlbGVjdGlvbkl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXN0eWxlZFRleHQuaW52b2tlQWN0aW9uKFNULlRPR0dMRV9CTE9DS1NFTEVDVElPTik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbGVmdEFsaWdubWVudEl0ZW0gPSBuZXcgVG9vbEl0ZW0oYWxpZ25tZW50VG9vbEJhciwgU1dULlJBRElPKTsKLQkJbGVmdEFsaWdubWVudEl0ZW0uc2V0SW1hZ2UoaUxlZnRBbGlnbm1lbnQpOwotCQlsZWZ0QWxpZ25tZW50SXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygiQWxpZ25MZWZ0IikpOyAvLyROT04tTkxTLTEkCi0JCWxlZnRBbGlnbm1lbnRJdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJbGVmdEFsaWdubWVudEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVBvaW50IHNlbGVjdGlvbiA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaW50IGxpbmVTdGFydCA9IHN0eWxlZFRleHQuZ2V0TGluZUF0T2Zmc2V0KHNlbGVjdGlvbi54KTsKLQkJCQlpbnQgbGluZUVuZCA9IHN0eWxlZFRleHQuZ2V0TGluZUF0T2Zmc2V0KHNlbGVjdGlvbi55KTsKLQkJCQlzdHlsZWRUZXh0LnNldExpbmVBbGlnbm1lbnQobGluZVN0YXJ0LCBsaW5lRW5kIC0gbGluZVN0YXJ0ICsgMSwJU1dULkxFRlQpOwotCQkJfQotCQl9KTsKLQkJbGVmdEFsaWdubWVudEl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY2VudGVyQWxpZ25tZW50SXRlbSA9IG5ldyBUb29sSXRlbShhbGlnbm1lbnRUb29sQmFyLCBTV1QuUkFESU8pOwotCQljZW50ZXJBbGlnbm1lbnRJdGVtLnNldEltYWdlKGlDZW50ZXJBbGlnbm1lbnQpOwotCQljZW50ZXJBbGlnbm1lbnRJdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJDZW50ZXJfbWVudWl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2VudGVyQWxpZ25tZW50SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUG9pbnQgc2VsZWN0aW9uID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpbnQgbGluZVN0YXJ0ID0gc3R5bGVkVGV4dC5nZXRMaW5lQXRPZmZzZXQoc2VsZWN0aW9uLngpOwotCQkJCWludCBsaW5lRW5kID0gc3R5bGVkVGV4dC5nZXRMaW5lQXRPZmZzZXQoc2VsZWN0aW9uLnkpOwotCQkJCXN0eWxlZFRleHQuc2V0TGluZUFsaWdubWVudChsaW5lU3RhcnQsIGxpbmVFbmQgLSBsaW5lU3RhcnQgKyAxLCBTV1QuQ0VOVEVSKTsKLQkJCX0KLQkJfSk7Ci0JCWNlbnRlckFsaWdubWVudEl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJcmlnaHRBbGlnbm1lbnRJdGVtID0gbmV3IFRvb2xJdGVtKGFsaWdubWVudFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCXJpZ2h0QWxpZ25tZW50SXRlbS5zZXRJbWFnZShpUmlnaHRBbGlnbm1lbnQpOwotCQlyaWdodEFsaWdubWVudEl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkFsaWduUmlnaHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmlnaHRBbGlnbm1lbnRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlQb2ludCBzZWxlY3Rpb24gPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvbigpOwotCQkJCWludCBsaW5lU3RhcnQgPSBzdHlsZWRUZXh0LmdldExpbmVBdE9mZnNldChzZWxlY3Rpb24ueCk7Ci0JCQkJaW50IGxpbmVFbmQgPSBzdHlsZWRUZXh0LmdldExpbmVBdE9mZnNldChzZWxlY3Rpb24ueSk7Ci0JCQkJc3R5bGVkVGV4dC5zZXRMaW5lQWxpZ25tZW50KGxpbmVTdGFydCwgbGluZUVuZCAtIGxpbmVTdGFydCArIDEsCVNXVC5SSUdIVCk7Ci0JCQl9Ci0JCX0pOwotCQlyaWdodEFsaWdubWVudEl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJanVzdGlmeUFsaWdubWVudEl0ZW0gPSBuZXcgVG9vbEl0ZW0oYWxpZ25tZW50VG9vbEJhciwgU1dULkNIRUNLKTsKLQkJanVzdGlmeUFsaWdubWVudEl0ZW0uc2V0SW1hZ2UoaUp1c3RpZnlBbGlnbm1lbnQpOwotCQlqdXN0aWZ5QWxpZ25tZW50SXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygiSnVzdGlmeSIpKTsgLy8kTk9OLU5MUy0xJAotCQlqdXN0aWZ5QWxpZ25tZW50SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUG9pbnQgc2VsZWN0aW9uID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpbnQgbGluZVN0YXJ0ID0gc3R5bGVkVGV4dC5nZXRMaW5lQXRPZmZzZXQoc2VsZWN0aW9uLngpOwotCQkJCWludCBsaW5lRW5kID0gc3R5bGVkVGV4dC5nZXRMaW5lQXRPZmZzZXQoc2VsZWN0aW9uLnkpOwotCQkJCXN0eWxlZFRleHQuc2V0TGluZUp1c3RpZnkobGluZVN0YXJ0LCBsaW5lRW5kIC0gbGluZVN0YXJ0ICsgMSwganVzdGlmeUFsaWdubWVudEl0ZW0uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJanVzdGlmeUFsaWdubWVudEl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJVG9vbEl0ZW0gYnVsbGV0TGlzdEl0ZW0gPSBuZXcgVG9vbEl0ZW0oYWxpZ25tZW50VG9vbEJhciwgU1dULlBVU0gpOwotCQlidWxsZXRMaXN0SXRlbS5zZXRJbWFnZShpQnVsbGV0TGlzdCk7Ci0JCWJ1bGxldExpc3RJdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJCdWxsZXRMaXN0IikpOyAvLyROT04tTkxTLTEkCi0JCWJ1bGxldExpc3RJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRCdWxsZXQoU1QuQlVMTEVUX0RPVCk7fQotCQl9KTsKLQotCQlUb29sSXRlbSBudW1iZXJlZExpc3RJdGVtID0gbmV3IFRvb2xJdGVtKGFsaWdubWVudFRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJbnVtYmVyZWRMaXN0SXRlbS5zZXRJbWFnZShpTnVtYmVyZWRMaXN0KTsKLQkJbnVtYmVyZWRMaXN0SXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygiTnVtYmVyZWRMaXN0IikpOyAvLyROT04tTkxTLTEkCi0JCW51bWJlcmVkTGlzdEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEJ1bGxldChTVC5CVUxMRVRfQ1VTVE9NKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULk5PTkUpOwotCQljb29sSXRlbS5zZXRDb250cm9sKGFsaWdubWVudFRvb2xCYXIpOwotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvb2xCYXIsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiSW5kZW50IikpOyAvLyROT04tTkxTLTEkCi0JCVNwaW5uZXIgaW5kZW50ID0gbmV3IFNwaW5uZXIoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJaW5kZW50LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlTcGlubmVyIHNwaW5uZXIgPSAoU3Bpbm5lcikgZXZlbnQud2lkZ2V0OwotCQkJCXN0eWxlZFRleHQuc2V0SW5kZW50KHNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlNwYWNpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3Bpbm5lciBzcGFjaW5nID0gbmV3IFNwaW5uZXIoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJc3BhY2luZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lciBzcGlubmVyID0gKFNwaW5uZXIpIGV2ZW50LndpZGdldDsKLQkJCQlzdHlsZWRUZXh0LnNldExpbmVTcGFjaW5nKHNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQotCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuTk9ORSk7Ci0JCWNvb2xJdGVtLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJQ29vbEl0ZW1bXSBjb29sSXRlbXMgPSBjb29sQmFyLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29vbEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb29sSXRlbSBpdGVtID0gY29vbEl0ZW1zW2ldOwotCQkJQ29udHJvbCBjb250cm9sID0gaXRlbS5nZXRDb250cm9sKCk7Ci0JCQlQb2ludCBzaXplID0gY29udHJvbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJaXRlbS5zZXRNaW5pbXVtU2l6ZShzaXplKTsKLQkJCXNpemUgPSBpdGVtLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJCWl0ZW0uc2V0UHJlZmVycmVkU2l6ZShzaXplKTsKLQkJCWl0ZW0uc2V0U2l6ZShzaXplKTsKLQkJfQotCQljb29sQmFyLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVSZXNpemUoZXZlbnQpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQl2b2lkIGRpc3Bvc2VSYW5nZXMoU3R5bGVSYW5nZVtdIHJhbmdlcykgewotCQlTdHlsZVJhbmdlW10gYWxsUmFuZ2VzID0gc3R5bGVkVGV4dC5nZXRTdHlsZVJhbmdlcygwLCBzdHlsZWRUZXh0LmdldENoYXJDb3VudCgpLCBmYWxzZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHlsZVJhbmdlIHN0eWxlID0gcmFuZ2VzW2ldOwotCQkJYm9vbGVhbiBkaXNwb3NlRmcgPSB0cnVlLCBkaXNwb3NlQmcgPSB0cnVlLCBkaXNwb3NlU3RyaWtlPSB0cnVlLCBkaXNwb3NlVW5kZXI9IHRydWUsIGRpc3Bvc2VCb3JkZXIgPSB0cnVlLCBkaXNwb3NlRm9udCA9IHRydWU7Ci0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYWxsUmFuZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3R5bGVSYW5nZSBzID0gYWxsUmFuZ2VzW2pdOwotCQkJCWlmIChkaXNwb3NlRm9udCAmJiBzdHlsZS5mb250ID09IHMuZm9udCkgZGlzcG9zZUZvbnQgPSBmYWxzZTsKLQkJCQlpZiAoZGlzcG9zZUZnICYmIHN0eWxlLmZvcmVncm91bmQgPT0gcy5mb3JlZ3JvdW5kKSBkaXNwb3NlRmcgPSBmYWxzZTsKLQkJCQlpZiAoZGlzcG9zZUJnICYmIHN0eWxlLmJhY2tncm91bmQgPT0gcy5iYWNrZ3JvdW5kKSBkaXNwb3NlQmcgPSBmYWxzZTsKLQkJCQlpZiAoZGlzcG9zZVN0cmlrZSAmJiBzdHlsZS5zdHJpa2VvdXRDb2xvciA9PSBzLnN0cmlrZW91dENvbG9yKSBkaXNwb3NlU3RyaWtlID0gZmFsc2U7Ci0JCQkJaWYgKGRpc3Bvc2VVbmRlciAmJiBzdHlsZS51bmRlcmxpbmVDb2xvciA9PSBzLnVuZGVybGluZUNvbG9yKSBkaXNwb3NlVW5kZXIgPSBmYWxzZTsKLQkJCQlpZiAoZGlzcG9zZUJvcmRlciAmJiBzdHlsZS5ib3JkZXJDb2xvciA9PSBzLmJvcmRlckNvbG9yKSBkaXNwb3NlQm9yZGVyID0gIGZhbHNlOwotCQkJfQotCQkJaWYgKGRpc3Bvc2VGb250ICYmIHN0eWxlLmZvbnQgIT0gdGV4dEZvbnQgJiYgc3R5bGUuZm9udCAhPSBudWxsKSAgc3R5bGUuZm9udC5kaXNwb3NlKCk7Ci0JCQlpZiAoZGlzcG9zZUZnICYmIHN0eWxlLmZvcmVncm91bmQgIT0gdGV4dEZvcmVncm91bmQgJiYgc3R5bGUuZm9yZWdyb3VuZCAhPSBudWxsKSBzdHlsZS5mb3JlZ3JvdW5kLmRpc3Bvc2UoKTsKLQkJCWlmIChkaXNwb3NlQmcgJiYgc3R5bGUuYmFja2dyb3VuZCAhPSB0ZXh0QmFja2dyb3VuZCAmJiBzdHlsZS5iYWNrZ3JvdW5kICE9IG51bGwpIHN0eWxlLmJhY2tncm91bmQuZGlzcG9zZSgpOwotCQkJaWYgKGRpc3Bvc2VTdHJpa2UgJiYgc3R5bGUuc3RyaWtlb3V0Q29sb3IgIT0gc3RyaWtlb3V0Q29sb3IgJiYgc3R5bGUuc3RyaWtlb3V0Q29sb3IgIT0gbnVsbCkgc3R5bGUuc3RyaWtlb3V0Q29sb3IuZGlzcG9zZSgpOwotCQkJaWYgKGRpc3Bvc2VVbmRlciAmJiBzdHlsZS51bmRlcmxpbmVDb2xvciAhPSB1bmRlcmxpbmVDb2xvciAmJiBzdHlsZS51bmRlcmxpbmVDb2xvciAhPSBudWxsKSBzdHlsZS51bmRlcmxpbmVDb2xvci5kaXNwb3NlKCk7Ci0JCQlpZiAoZGlzcG9zZUJvcmRlciAmJiBzdHlsZS5ib3JkZXJDb2xvciAhPSBib3JkZXJDb2xvciAmJiBzdHlsZS5ib3JkZXJDb2xvciAhPSBudWxsKSBzdHlsZS5ib3JkZXJDb2xvci5kaXNwb3NlKCk7Ci0JCQkKLQkJCU9iamVjdCBkYXRhID0gc3R5bGUuZGF0YTsKLQkJCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCQlpZiAoZGF0YSBpbnN0YW5jZW9mIEltYWdlKSAoKEltYWdlKWRhdGEpLmRpc3Bvc2UoKTsKLQkJCQlpZiAoZGF0YSBpbnN0YW5jZW9mIENvbnRyb2wpICgoQ29udHJvbClkYXRhKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIGRpc3Bvc2VSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgcmV0dXJuOwotCQlTdHlsZVJhbmdlW10gc3R5bGVzID0gc3R5bGVkVGV4dC5nZXRTdHlsZVJhbmdlcygwLCBzdHlsZWRUZXh0LmdldENoYXJDb3VudCgpLCBmYWxzZSk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlIChpbmRleCA8IHN0eWxlcy5sZW5ndGgpIHsKLQkJCWlmIChzdHlsZXNbaW5kZXhdLmZvbnQgPT0gcmVzb3VyY2UpIGJyZWFrOwotCQkJaWYgKHN0eWxlc1tpbmRleF0uZm9yZWdyb3VuZCA9PSByZXNvdXJjZSkgYnJlYWs7Ci0JCQlpZiAoc3R5bGVzW2luZGV4XS5iYWNrZ3JvdW5kID09IHJlc291cmNlKSBicmVhazsKLQkJCWlmIChzdHlsZXNbaW5kZXhdLnN0cmlrZW91dENvbG9yID09IHJlc291cmNlKSBicmVhazsKLQkJCWlmIChzdHlsZXNbaW5kZXhdLnVuZGVybGluZUNvbG9yID09IHJlc291cmNlKSBicmVhazsKLQkJCWlmIChzdHlsZXNbaW5kZXhdLmJvcmRlckNvbG9yID09IHJlc291cmNlKSBicmVhazsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJaWYgKGluZGV4ID09IHN0eWxlcy5sZW5ndGgpIHJlc291cmNlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlTdHJpbmdbXSBnZXRGb250TmFtZXMoKSB7Ci0JCUZvbnREYXRhW10gZm9udE5hbWVzID0gZGlzcGxheS5nZXRGb250TGlzdChudWxsLCB0cnVlKTsKLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2ZvbnROYW1lcy5sZW5ndGhdOwotCQlpbnQgY291bnQgPSAwOwotCQltYWluZm9yOgotCQlmb3IgKGludCBpID0gMDsgaSA8IGZvbnROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGZvbnROYW1lID0gZm9udE5hbWVzW2ldLmdldE5hbWUoKTsKLQkJCWlmIChmb250TmFtZS5zdGFydHNXaXRoKCJAIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgewotCQkJCWlmIChuYW1lc1tqXS5lcXVhbHMoZm9udE5hbWUpKSBjb250aW51ZSBtYWluZm9yOwotCQkJfQotCQkJbmFtZXNbY291bnQrK10gPSBmb250TmFtZTsKLQkJfQotCQlpZiAoY291bnQgPCBuYW1lcy5sZW5ndGgpIHsKLQkJCVN0cmluZ1tdIG5ld05hbWVzID0gbmV3IFN0cmluZ1tjb3VudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG5hbWVzLCAwLCBuZXdOYW1lcywgMCwgY291bnQpOwotCQkJbmFtZXMgPSBuZXdOYW1lczsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JU3R5bGVSYW5nZVtdIGdldFN0eWxlcyhJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQkJdHJ5IHsKLQkJCVN0eWxlUmFuZ2VbXSBzdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVsyNTZdOwotCQkJaW50IGNvdW50ID0gMDsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKSk7Ci0JCQlTdHJpbmcgbGluZTsKLQkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSwgIjsiLCBmYWxzZSk7ICAvLyROT04tTkxTLTEkCi0JCQkJU3R5bGVSYW5nZSByYW5nZSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCQkJcmFuZ2Uuc3RhcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJcmFuZ2UubGVuZ3RoID0gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJCXJhbmdlLmZvbnRTdHlsZSA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlyYW5nZS5zdHJpa2VvdXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkuZXF1YWxzKCJ0cnVlIik7ICAvLyROT04tTkxTLTEkCi0JCQkJcmFuZ2UudW5kZXJsaW5lID0gdG9rZW5pemVyLm5leHRUb2tlbigpLmVxdWFscygidHJ1ZSIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCWludCByZWQgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJCWludCBncmVlbiA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQkJaW50IGJsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJCXJhbmdlLmZvcmVncm91bmQgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmVkLCBncmVlbiwgYmx1ZSk7Ci0JCQkJfQotCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCWludCByZWQgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJCWludCBncmVlbiA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQkJaW50IGJsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJCXJhbmdlLmJhY2tncm91bmQgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmVkLCBncmVlbiwgYmx1ZSk7Ci0JCQkJfQotCQkJCWlmIChjb3VudCA+PSBzdHlsZXMubGVuZ3RoKSB7Ci0JCQkJCVN0eWxlUmFuZ2VbXSBuZXdTdHlsZXMgPSAgbmV3IFN0eWxlUmFuZ2Vbc3R5bGVzLmxlbmd0aCArIDI1Nl07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoc3R5bGVzLCAwLCBuZXdTdHlsZXMsIDAsIHN0eWxlcy5sZW5ndGgpOwotCQkJCQlzdHlsZXMgPSBuZXdTdHlsZXM7Ci0JCQkJfQotCQkJCXN0eWxlc1tjb3VudCsrXSA9IHJhbmdlOwotCQkJfQotCQkJaWYgKGNvdW50IDwgc3R5bGVzLmxlbmd0aCkgewotCQkJCVN0eWxlUmFuZ2VbXSBuZXdTdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtjb3VudF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShzdHlsZXMsIDAsIG5ld1N0eWxlcywgMCwgY291bnQpOwotCQkJCXN0eWxlcyA9IG5ld1N0eWxlczsKLQkJCX0KLQkJCXJldHVybiBzdHlsZXM7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiRXJyb3IiKSwgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXZvaWQgaGFuZGxlS2V5RG93biAoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULklOU0VSVCkgewotCQkJaW5zZXJ0ID0gIWluc2VydDsKLQkJfQotCX0KLQkKLQl2b2lkIGhhbmRsZU1vZGlmeSAoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJaWYgKG5ld0NoYXJDb3VudCA+IDAgJiYgc3RhcnQgPj0gMCkgewotCQkJU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCQlpZiAodGV4dEZvbnQgIT0gbnVsbCAmJiAhdGV4dEZvbnQuZXF1YWxzKHN0eWxlZFRleHQuZ2V0Rm9udCgpKSkgewotCQkJCXN0eWxlLmZvbnQgPSB0ZXh0Rm9udDsKLQkJCX0gZWxzZSB7Ci0JCQkJc3R5bGUuZm9udFN0eWxlID0gU1dULk5PTkU7Ci0JCQkJaWYgKGJvbGRDb250cm9sLmdldFNlbGVjdGlvbigpKSBzdHlsZS5mb250U3R5bGUgfD0gU1dULkJPTEQ7Ci0JCQkJaWYgKGl0YWxpY0NvbnRyb2wuZ2V0U2VsZWN0aW9uKCkpIHN0eWxlLmZvbnRTdHlsZSB8PSBTV1QuSVRBTElDOwotCQkJfQotCQkJaWYgKChzdHlsZVN0YXRlICYgRk9SRUdST1VORCkgIT0gMCkgewotCQkJCXN0eWxlLmZvcmVncm91bmQgPSB0ZXh0Rm9yZWdyb3VuZDsKLQkJCX0KLQkJCWlmICgoc3R5bGVTdGF0ZSAmIEJBQ0tHUk9VTkQpICE9IDApIHsKLQkJCQlzdHlsZS5iYWNrZ3JvdW5kID0gdGV4dEJhY2tncm91bmQ7Ci0JCQl9Ci0JCQlpbnQgdW5kZXJsaW5lU3R5bGUgPSBzdHlsZVN0YXRlICYgVU5ERVJMSU5FOwotCQkJaWYgKHVuZGVybGluZVN0eWxlICE9IDApIHsKLQkJCQlzdHlsZS51bmRlcmxpbmUgPSB0cnVlOwotCQkJCXN0eWxlLnVuZGVybGluZUNvbG9yID0gdW5kZXJsaW5lQ29sb3I7Ci0JCQkJc3dpdGNoICh1bmRlcmxpbmVTdHlsZSkgewotCQkJCQljYXNlIFVOREVSTElORV9TSU5HTEU6CXN0eWxlLnVuZGVybGluZVN0eWxlID0gU1dULlVOREVSTElORV9TSU5HTEU7IGJyZWFrOwotCQkJCQljYXNlIFVOREVSTElORV9ET1VCTEU6CXN0eWxlLnVuZGVybGluZVN0eWxlID0gU1dULlVOREVSTElORV9ET1VCTEU7IGJyZWFrOwotCQkJCQljYXNlIFVOREVSTElORV9TUVVJR0dMRToJc3R5bGUudW5kZXJsaW5lU3R5bGUgPSBTV1QuVU5ERVJMSU5FX1NRVUlHR0xFOyBicmVhazsKLQkJCQkJY2FzZSBVTkRFUkxJTkVfRVJST1I6CXN0eWxlLnVuZGVybGluZVN0eWxlID0gU1dULlVOREVSTElORV9FUlJPUjsgYnJlYWs7Ci0JCQkJCWNhc2UgVU5ERVJMSU5FX0xJTks6IHsKLQkJCQkJCXN0eWxlLnVuZGVybGluZUNvbG9yID0gbnVsbDsKLQkJCQkJCWlmIChsaW5rICE9IG51bGwgJiYgbGluay5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlzdHlsZS51bmRlcmxpbmVTdHlsZSA9IFNXVC5VTkRFUkxJTkVfTElOSzsKLQkJCQkJCQlzdHlsZS5kYXRhID0gbGluazsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3R5bGUudW5kZXJsaW5lID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICgoc3R5bGVTdGF0ZSAmIFNUUklLRU9VVCkgIT0gMCkgewotCQkJCXN0eWxlLnN0cmlrZW91dCA9IHRydWU7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0Q29sb3IgPSBzdHJpa2VvdXRDb2xvcjsKLQkJCX0KLQkJCWludCBib3JkZXJTdHlsZSA9IHN0eWxlU3RhdGUgJiBCT1JERVI7Ci0JCQlpZiAoYm9yZGVyU3R5bGUgIT0gMCkgewotCQkJCXN0eWxlLmJvcmRlckNvbG9yID0gYm9yZGVyQ29sb3I7Ci0JCQkJc3dpdGNoIChib3JkZXJTdHlsZSkgewotCQkJCQljYXNlIEJPUkRFUl9EQVNIOglzdHlsZS5ib3JkZXJTdHlsZSA9IFNXVC5CT1JERVJfREFTSDsgYnJlYWs7Ci0JCQkJCWNhc2UgQk9SREVSX0RPVDoJc3R5bGUuYm9yZGVyU3R5bGUgPSBTV1QuQk9SREVSX0RPVDsgYnJlYWs7Ci0JCQkJCWNhc2UgQk9SREVSX1NPTElEOiBzdHlsZS5ib3JkZXJTdHlsZSA9IFNXVC5CT1JERVJfU09MSUQ7IGJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWludFtdIHJhbmdlcyA9IHtzdGFydCwgbmV3Q2hhckNvdW50fTsKLQkJCVN0eWxlUmFuZ2VbXSBzdHlsZXMgPSB7c3R5bGV9OyAKLQkJCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZXMoc3RhcnQsIG5ld0NoYXJDb3VudCwgcmFuZ2VzLCBzdHlsZXMpOwotCQl9Ci0JCWRpc3Bvc2VSYW5nZXMoc2VsZWN0ZWRSYW5nZXMpOwotCX0KLQkKLQl2b2lkIGhhbmRsZU1vdXNlVXAgKEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCWludCBvZmZzZXQgPSBzdHlsZWRUZXh0LmdldENhcmV0T2Zmc2V0KCk7Ci0JCQlTdHlsZVJhbmdlIHJhbmdlID0gb2Zmc2V0ID4gMCA/IHN0eWxlZFRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KG9mZnNldC0xKSA6IG51bGw7Ci0JCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJCWlmIChsaW5rID09IHJhbmdlLmRhdGEpIHsKLQkJCQkJU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsKHNoZWxsKTsKLQkJCQkJZGlhbG9nLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCQkJZGlhbG9nLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkJyb3dzZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoZGlhbG9nLCBTV1QuTU9aSUxMQSk7Ci0JCQkJCWJyb3dzZXIuc2V0VXJsKGxpbmspOwotCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQl2b2lkIGhhbmRsZVBhaW50T2JqZWN0KFBhaW50T2JqZWN0RXZlbnQgZXZlbnQpIHsKLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJU3R5bGVSYW5nZSBzdHlsZSA9IGV2ZW50LnN0eWxlOwotCQlCdWxsZXQgYnVsbGV0ID0gZXZlbnQuYnVsbGV0OwotCQlpZiAoYnVsbGV0ICE9IG51bGwgJiYgYnVsbGV0LnR5cGUgPT0gU1QuQlVMTEVUX0NVU1RPTSkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gZXZlbnQuZGlzcGxheTsKLQkJCUZvbnQgZm9udCA9IHN0eWxlLmZvbnQ7Ci0JCQlpZiAoZm9udCA9PSBudWxsKSBmb250ID0gc3R5bGVkVGV4dC5nZXRGb250KCk7Ci0JCQlUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCQkJbGF5b3V0LnNldEFzY2VudChldmVudC5hc2NlbnQpOwotCQkJbGF5b3V0LnNldERlc2NlbnQoZXZlbnQuZGVzY2VudCk7Ci0JCQlsYXlvdXQuc2V0Rm9udChmb250KTsKLQkJCWxheW91dC5zZXRUZXh0KGV2ZW50LmJ1bGxldEluZGV4ICsgMSArICIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxheW91dC5kcmF3KGdjLCBldmVudC54ICsgQlVMTEVUX1dJRFRIICogMiAvIDMsIGV2ZW50LnkpOwotCQkJbGF5b3V0LmRpc3Bvc2UoKTsKLQkJfSBlbHNlIHsKLQkJCU9iamVjdCBkYXRhID0gc3R5bGUuZGF0YTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgSW1hZ2UpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSlkYXRhOwotCQkJCWludCB4ID0gZXZlbnQueDsKLQkJCQlpbnQgeSA9IGV2ZW50LnkgKyBldmVudC5hc2NlbnQgLSBzdHlsZS5tZXRyaWNzLmFzY2VudDsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHkpOwotCQkJfQotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpZGF0YTsKLQkJCQlQb2ludCBwdCA9IGNvbnRyb2wuZ2V0U2l6ZSgpOwotCQkJCWludCB4ID0gZXZlbnQueCArIE1BUkdJTjsKLQkJCQlpbnQgeSA9IGV2ZW50LnkgKyBldmVudC5hc2NlbnQgLSAyICogcHQueSAvIDM7Ci0JCQkJY29udHJvbC5zZXRMb2NhdGlvbih4LCB5KTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgaGFuZGxlUmVzaXplKENvbnRyb2xFdmVudCBldmVudCkgewotCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEoKTsKLQkJUG9pbnQgY1NpemUgPSBjb29sQmFyLmNvbXB1dGVTaXplKHJlY3Qud2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJUG9pbnQgc1NpemUgPSBzdGF0dXNCYXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJaW50IHN0YXR1c01hcmdpbiA9IDI7Ci0JCWNvb2xCYXIuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LCBjU2l6ZS54LCBjU2l6ZS55KTsKLQkJc3R5bGVkVGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnkgKyBjU2l6ZS55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCAtIGNTaXplLnkgLSAoc1NpemUueSArIDIgKiBzdGF0dXNNYXJnaW4pKTsKLQkJc3RhdHVzQmFyLnNldEJvdW5kcyhyZWN0LnggKyBzdGF0dXNNYXJnaW4sIHJlY3QueSArIHJlY3QuaGVpZ2h0IC0gc1NpemUueSAtIHN0YXR1c01hcmdpbiwgcmVjdC53aWR0aCAtICgyICogc3RhdHVzTWFyZ2luKSwgc1NpemUueSk7Ci0JfQotCi0Jdm9pZCBoYW5kbGVWZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCXN0YXJ0ID0gZXZlbnQuc3RhcnQ7Ci0JCW5ld0NoYXJDb3VudCA9IGV2ZW50LnRleHQubGVuZ3RoKCk7Ci0JCWludCByZXBsYWNlQ2hhckNvdW50ID0gZXZlbnQuZW5kIC0gc3RhcnQ7Ci0KLQkJLy8gbWFyayBzdHlsZXMgdG8gYmUgZGlzcG9zZWQKLQkJc2VsZWN0ZWRSYW5nZXMgPSBzdHlsZWRUZXh0LmdldFN0eWxlUmFuZ2VzKHN0YXJ0LCByZXBsYWNlQ2hhckNvdW50LCBmYWxzZSk7Ci0JfQotCi0Jdm9pZCBpbml0UmVzb3VyY2VzKCkgewotCQlpQm9sZCA9IGxvYWRJbWFnZShkaXNwbGF5LCAiYm9sZCIpOyAvLyROT04tTkxTLTEkCi0JCWlJdGFsaWMgPSBsb2FkSW1hZ2UoZGlzcGxheSwgIml0YWxpYyIpOyAvLyROT04tTkxTLTEkCi0JCWlVbmRlcmxpbmUgPSBsb2FkSW1hZ2UoZGlzcGxheSwgInVuZGVybGluZSIpOyAvLyROT04tTkxTLTEkCi0JCWlTdHJpa2VvdXQgPSBsb2FkSW1hZ2UoZGlzcGxheSwgInN0cmlrZW91dCIpOyAvLyROT04tTkxTLTEkCi0JCWlCbG9ja1NlbGVjdGlvbiA9IGxvYWRJbWFnZShkaXNwbGF5LCAiZnVsbHNjcm4iKTsgLy8kTk9OLU5MUy0xJAotCQlpQm9yZGVyU3R5bGUgPSBsb2FkSW1hZ2UoZGlzcGxheSwgInJlc2l6ZSIpOyAvLyROT04tTkxTLTEkCi0JCWlMZWZ0QWxpZ25tZW50ID0gbG9hZEltYWdlKGRpc3BsYXksICJsZWZ0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaVJpZ2h0QWxpZ25tZW50ID0gbG9hZEltYWdlKGRpc3BsYXksICJyaWdodCIpOyAvLyROT04tTkxTLTEkCi0JCWlDZW50ZXJBbGlnbm1lbnQgPSBsb2FkSW1hZ2UoZGlzcGxheSwgImNlbnRlciIpOyAvLyROT04tTkxTLTEkCi0JCWlKdXN0aWZ5QWxpZ25tZW50ID0gbG9hZEltYWdlKGRpc3BsYXksICJqdXN0aWZ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJaUN1dCA9IGxvYWRJbWFnZShkaXNwbGF5LCAiY3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaUNvcHkgPSBsb2FkSW1hZ2UoZGlzcGxheSwgImNvcHkiKTsgLy8kTk9OLU5MUy0xJAotCQlpUGFzdGUgPSBsb2FkSW1hZ2UoZGlzcGxheSwgInBhc3RlIik7IC8vJE5PTi1OTFMtMSQKLQkJaVRleHRGb3JlZ3JvdW5kID0gbG9hZEltYWdlKGRpc3BsYXksICJ0ZXh0Rm9yZWdyb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCWlUZXh0QmFja2dyb3VuZCA9IGxvYWRJbWFnZShkaXNwbGF5LCAidGV4dEJhY2tncm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQlpQmFzZWxpbmVVcCA9IGxvYWRJbWFnZShkaXNwbGF5LCAiZm9udF9iaWciKTsgLy8kTk9OLU5MUy0xJAotCQlpQmFzZWxpbmVEb3duID0gbG9hZEltYWdlKGRpc3BsYXksICJmb250X3NtbCIpOyAvLyROT04tTkxTLTEkCi0JCWlCdWxsZXRMaXN0ID0gbG9hZEltYWdlKGRpc3BsYXksICJwYXJhX2J1bCIpOyAvLyROT04tTkxTLTEkCi0JCWlOdW1iZXJlZExpc3QgPSBsb2FkSW1hZ2UoZGlzcGxheSwgInBhcmFfbnVtIik7IC8vJE5PTi1OTFMtMSQKLQkJaUxpbmsgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJsaW5rX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQl2b2lkIGluc3RhbGxMaXN0ZW5lcnMoKSB7Ci0JCXN0eWxlZFRleHQuYWRkQ2FyZXRMaXN0ZW5lcihuZXcgQ2FyZXRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNhcmV0TW92ZWQoQ2FyZXRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZVN0YXR1c0JhcigpOwotCQkJCXVwZGF0ZVRvb2xCYXIoKTsKLQkJCX0KLQkJfSk7Ci0JCXN0eWxlZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vdXNlVXAsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlTW91c2VVcChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlzdHlsZWRUZXh0LmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWhhbmRsZUtleURvd24oZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJc3R5bGVkVGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlVmVyaWZ5VGV4dChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlzdHlsZWRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCWhhbmRsZU1vZGlmeShldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlzdHlsZWRUZXh0LmFkZFBhaW50T2JqZWN0TGlzdGVuZXIobmV3IFBhaW50T2JqZWN0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludE9iamVjdChQYWludE9iamVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlUGFpbnRPYmplY3QoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJc3R5bGVkVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHlsZVJhbmdlW10gc3R5bGVzID0gc3R5bGVkVGV4dC5nZXRTdHlsZVJhbmdlcygwLCBzdHlsZWRUZXh0LmdldENoYXJDb3VudCgpLCBmYWxzZSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IGRhdGEgPSBzdHlsZXNbaV0uZGF0YTsKLQkJCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBJbWFnZSkgKChJbWFnZSlkYXRhKS5kaXNwb3NlKCk7Ci0JCQkJCQlpZiAoZGF0YSBpbnN0YW5jZW9mIENvbnRyb2wpICgoQ29udHJvbClkYXRhKS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlUmVzaXplKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JSW1hZ2UgbG9hZEltYWdlKERpc3BsYXkgZGlzcGxheSwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsgCi0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBzb3VyY2VTdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLmljbyIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YShzb3VyY2VTdHJlYW0pOwotCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc291cmNlLCBtYXNrKTsKLQkJCXNvdXJjZVN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoIkVycm9yIiksIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQl2b2lkIGxvYWRQcm9maWxlKGludCBwcm9maWxlKSB7Ci0JCXRyeSB7Ci0JCQlzd2l0Y2ggKHByb2ZpbGUpIHsKLQkJCQljYXNlIDE6IHsKLQkJCQkJU3RyaW5nIHRleHQgPSBvcGVuRmlsZShUZXh0RWRpdG9yLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oInRleHQudHh0IikpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHlsZVJhbmdlW10gc3R5bGVzID0gZ2V0U3R5bGVzKFRleHRFZGl0b3IuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgic3R5bGVzLnR4dCIpKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQpOwotCQkJCQlpZiAoc3R5bGVzICE9IG51bGwpIHN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZXMoc3R5bGVzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMjogewotCQkJCQlzdHlsZWRUZXh0LnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2ZpbGUyIikpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAzOiB7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gb3BlbkZpbGUoVGV4dEVkaXRvci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ0ZXh0NC50eHQiKSk7ICAvLyROT04tTkxTLTEkCi0JCQkJCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNDogewotCQkJCQlzdHlsZWRUZXh0LnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2ZpbGU0IikpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQl1cGRhdGVUb29sQmFyKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoIkVycm9yIiksIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JU3RyaW5nIG9wZW5GaWxlKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIGxpbmU7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gc3R5bGVkVGV4dC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKGxpbmUpOwotCQkJYnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0Jdm9pZCByZWxlYXNlUmVzb3VyY2VzKCkgewotCQlpQm9sZC5kaXNwb3NlKCk7Ci0JCWlCb2xkID0gbnVsbDsKLQkJaUl0YWxpYy5kaXNwb3NlKCk7Ci0JCWlJdGFsaWMgPSBudWxsOwotCQlpVW5kZXJsaW5lLmRpc3Bvc2UoKTsKLQkJaVVuZGVybGluZSA9IG51bGw7Ci0JCWlTdHJpa2VvdXQuZGlzcG9zZSgpOwotCQlpU3RyaWtlb3V0ID0gbnVsbDsKLQkJaUJvcmRlclN0eWxlLmRpc3Bvc2UoKTsKLQkJaUJvcmRlclN0eWxlID0gbnVsbDsKLQkJaUJsb2NrU2VsZWN0aW9uLmRpc3Bvc2UoKTsKLQkJaUJsb2NrU2VsZWN0aW9uID0gbnVsbDsKLQkJaUxlZnRBbGlnbm1lbnQuZGlzcG9zZSgpOwotCQlpTGVmdEFsaWdubWVudCA9IG51bGw7Ci0JCWlSaWdodEFsaWdubWVudC5kaXNwb3NlKCk7Ci0JCWlSaWdodEFsaWdubWVudCA9IG51bGw7Ci0JCWlDZW50ZXJBbGlnbm1lbnQuZGlzcG9zZSgpOwotCQlpQ2VudGVyQWxpZ25tZW50ID0gbnVsbDsKLQkJaUp1c3RpZnlBbGlnbm1lbnQuZGlzcG9zZSgpOwotCQlpSnVzdGlmeUFsaWdubWVudCA9IG51bGw7Ci0JCWlDdXQuZGlzcG9zZSgpOwotCQlpQ3V0ID0gbnVsbDsKLQkJaUNvcHkuZGlzcG9zZSgpOwotCQlpQ29weSA9IG51bGw7Ci0JCWlQYXN0ZS5kaXNwb3NlKCk7Ci0JCWlQYXN0ZSA9IG51bGw7Ci0JCWlUZXh0Rm9yZWdyb3VuZC5kaXNwb3NlKCk7Ci0JCWlUZXh0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JCWlUZXh0QmFja2dyb3VuZC5kaXNwb3NlKCk7Ci0JCWlUZXh0QmFja2dyb3VuZCA9IG51bGw7Ci0JCWlCYXNlbGluZVVwLmRpc3Bvc2UoKTsKLQkJaUJhc2VsaW5lVXAgPSBudWxsOwotCQlpQmFzZWxpbmVEb3duLmRpc3Bvc2UoKTsKLQkJaUJhc2VsaW5lRG93biA9IG51bGw7Ci0JCWlCdWxsZXRMaXN0LmRpc3Bvc2UoKTsKLQkJaUJ1bGxldExpc3QgPSBudWxsOwotCQlpTnVtYmVyZWRMaXN0LmRpc3Bvc2UoKTsKLQkJaU51bWJlcmVkTGlzdCA9IG51bGw7Ci0JCWlMaW5rLmRpc3Bvc2UoKTsKLQkJaUxpbmsgPSBudWxsOwotCQkKLQkJaWYgKHRleHRGb250ICE9IG51bGwpIHRleHRGb250LmRpc3Bvc2UoKTsKLQkJdGV4dEZvbnQgPSBudWxsOwotCQlpZiAodGV4dEZvcmVncm91bmQgIT0gbnVsbCkgdGV4dEZvcmVncm91bmQuZGlzcG9zZSgpOwotCQl0ZXh0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JCWlmICh0ZXh0QmFja2dyb3VuZCAhPSBudWxsKSB0ZXh0QmFja2dyb3VuZC5kaXNwb3NlKCk7Ci0JCXRleHRCYWNrZ3JvdW5kID0gbnVsbDsKLQkJaWYgKHN0cmlrZW91dENvbG9yICE9IG51bGwpIHN0cmlrZW91dENvbG9yLmRpc3Bvc2UoKTsKLQkJc3RyaWtlb3V0Q29sb3IgPSBudWxsOwotCQlpZiAodW5kZXJsaW5lQ29sb3IgIT0gbnVsbCkgdW5kZXJsaW5lQ29sb3IuZGlzcG9zZSgpOwotCQl1bmRlcmxpbmVDb2xvciA9IG51bGw7Ci0JCWlmIChib3JkZXJDb2xvciAhPSBudWxsKSBib3JkZXJDb2xvci5kaXNwb3NlKCk7Ci0JCWJvcmRlckNvbG9yID0gbnVsbDsKLQotCQlpZiAoZm9udCAhPSBudWxsKSBmb250LmRpc3Bvc2UoKTsKLQkJZm9udCA9IG51bGw7Ci0JfQotCi0Jdm9pZCBzYXZlRmlsZSgpIHsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCUZpbGVXcml0ZXIgZmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWZpbGUgPSBuZXcgRmlsZVdyaXRlcihmaWxlTmFtZSk7Ci0JCSAgICAgICAJZmlsZS53cml0ZShzdHlsZWRUZXh0LmdldFRleHQoKSk7Ci0JCSAgICAgICAJZmlsZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCSAgICAgICAgCXNob3dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiRXJyb3IiKSwgZS5nZXRNZXNzYWdlKCkpOwotCSAgICAgICAgfSBmaW5hbGx5IHsKLQkgICAgICAgIAl0cnkgewotCSAgICAgICAgCQlpZiAoZmlsZSAhPSBudWxsKSBmaWxlLmNsb3NlKCk7Ci0JICAgICAgICAJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCSAgICAgICAgCQlzaG93RXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoIkVycm9yIiksIGUuZ2V0TWVzc2FnZSgpKTsKLQkgICAgICAgIAl9Ci0JICAgICAgICB9Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBzZXRCdWxsZXQoaW50IHR5cGUpIHsKLQkJUG9pbnQgc2VsZWN0aW9uID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJaW50IGxpbmVTdGFydCA9IHN0eWxlZFRleHQuZ2V0TGluZUF0T2Zmc2V0KHNlbGVjdGlvbi54KTsKLQkJaW50IGxpbmVFbmQgPSBzdHlsZWRUZXh0LmdldExpbmVBdE9mZnNldChzZWxlY3Rpb24ueSk7Ci0JCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlUmFuZ2UubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoMCwgMCwgQlVMTEVUX1dJRFRIKTsKLQkJQnVsbGV0IGJ1bGxldCA9IG5ldyBCdWxsZXQodHlwZSwgc3R5bGVSYW5nZSk7Ci0JCWZvciAoaW50IGxpbmVJbmRleCA9IGxpbmVTdGFydDsgbGluZUluZGV4IDw9IGxpbmVFbmQ7IGxpbmVJbmRleCsrKSB7Ci0JCQlCdWxsZXQgb2xkQnVsbGV0ID0gc3R5bGVkVGV4dC5nZXRMaW5lQnVsbGV0KGxpbmVJbmRleCk7Ci0JCQlzdHlsZWRUZXh0LnNldExpbmVCdWxsZXQobGluZUluZGV4LCAxLCBvbGRCdWxsZXQgIT0gbnVsbCA/IG51bGwgOiBidWxsZXQpOwotCQl9Ci0JfQotCQotCXZvaWQgc2V0TGluaygpIHsKLQkJZmluYWwgU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuU0hFTExfVFJJTSk7Ci0JCWRpYWxvZy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZGlhbG9nLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlNldExpbmsiKSk7IC8vJE5PTi1OTFMtMSQKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlVSTCIpKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChkaWFsb2csIFNXVC5TSU5HTEUpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDIwMCwgU1dULkRFRkFVTFQpKTsKLQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJdGV4dC5zZXRUZXh0KGxpbmspOwotCQkJdGV4dC5zZWxlY3RBbGwoKTsKLQkJfQotCQlmaW5hbCBCdXR0b24gb2tCdXR0b24gPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlBVU0gpOwotCQlva0J1dHRvbi5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJPayIpKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBCdXR0b24gY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbihkaWFsb2csIFNXVC5QVVNIKTsKLQkJY2FuY2VsQnV0dG9uLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkNhbmNlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LndpZGdldCA9PSBva0J1dHRvbikgewotCQkJCQlsaW5rID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJCXNldFN0eWxlKFVOREVSTElORV9MSU5LKTsKLQkJCQl9Ci0JCQkJZGlhbG9nLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfTsKLQkJb2tCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQljYW5jZWxCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbihva0J1dHRvbik7Ci0JCWRpYWxvZy5wYWNrKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXdoaWxlICghZGlhbG9nLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JfQotCQotCXZvaWQgc2V0U3R5bGUoaW50IHN0eWxlKSB7Ci0JCWludFtdIHJhbmdlcyA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2VzKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCByYW5nZXMubGVuZ3RoKSB7Ci0JCQlzZXRTdHlsZShzdHlsZSwgcmFuZ2VzW2krK10sIHJhbmdlc1tpKytdKTsKLQkJfQotCQl1cGRhdGVTdHlsZVN0YXRlKHN0eWxlLCBGT1JFR1JPVU5EKTsKLQkJdXBkYXRlU3R5bGVTdGF0ZShzdHlsZSwgQkFDS0dST1VORCk7Ci0JCXVwZGF0ZVN0eWxlU3RhdGUoc3R5bGUsIFVOREVSTElORSk7Ci0JCXVwZGF0ZVN0eWxlU3RhdGUoc3R5bGUsIFNUUklLRU9VVCk7Ci0JCXVwZGF0ZVN0eWxlU3RhdGUoc3R5bGUsIEJPUkRFUik7Ci0JfQotCXZvaWQgc2V0U3R5bGUoaW50IHN0eWxlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJaWYgKGxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQotCQkvKiBDcmVhdGUgbmV3IHN0eWxlIHJhbmdlICovCi0JCVN0eWxlUmFuZ2UgbmV3UmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlpZiAoKHN0eWxlICYgRk9OVCkgIT0gMCkgewotCQkJbmV3UmFuZ2UuZm9udCA9IHRleHRGb250OwotCQl9Ci0JCWlmICgoc3R5bGUgJiBGT05UX1NUWUxFKSAhPSAwKSB7Ci0JCQluZXdSYW5nZS5mb250U3R5bGUgPSBzdHlsZSAmIEZPTlRfU1RZTEU7Ci0JCX0KLQkJaWYgKChzdHlsZSAmIEZPUkVHUk9VTkQpICE9IDApIHsKLQkJCW5ld1JhbmdlLmZvcmVncm91bmQgPSB0ZXh0Rm9yZWdyb3VuZDsKLQkJfQotCQlpZiAoKHN0eWxlICYgQkFDS0dST1VORCkgIT0gMCkgewotCQkJbmV3UmFuZ2UuYmFja2dyb3VuZCA9IHRleHRCYWNrZ3JvdW5kOwotCQl9Ci0JCWlmICgoc3R5bGUgJiBCQVNFTElORV9VUCkgIT0gMCkJbmV3UmFuZ2UucmlzZSsrOwotCQlpZiAoKHN0eWxlICYgQkFTRUxJTkVfRE9XTikgIT0gMCkgbmV3UmFuZ2UucmlzZS0tOwotCQlpZiAoKHN0eWxlICYgU1RSSUtFT1VUKSAhPSAwKSB7Ci0JCQluZXdSYW5nZS5zdHJpa2VvdXQgPSB0cnVlOwotCQkJbmV3UmFuZ2Uuc3RyaWtlb3V0Q29sb3IgPSBzdHJpa2VvdXRDb2xvcjsKLQkJfQotCQlpZiAoKHN0eWxlICYgVU5ERVJMSU5FKSAhPSAwKSB7Ci0JCQluZXdSYW5nZS51bmRlcmxpbmUgPSB0cnVlOwotCQkJbmV3UmFuZ2UudW5kZXJsaW5lQ29sb3IgPSB1bmRlcmxpbmVDb2xvcjsKLQkJCXN3aXRjaCAoc3R5bGUgJiBVTkRFUkxJTkUpIHsKLQkJCQljYXNlIFVOREVSTElORV9TSU5HTEU6Ci0JCQkJCW5ld1JhbmdlLnVuZGVybGluZVN0eWxlID0gU1dULlVOREVSTElORV9TSU5HTEU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVU5ERVJMSU5FX0RPVUJMRToKLQkJCQkJbmV3UmFuZ2UudW5kZXJsaW5lU3R5bGUgPSBTV1QuVU5ERVJMSU5FX0RPVUJMRTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBVTkRFUkxJTkVfRVJST1I6Ci0JCQkJCW5ld1JhbmdlLnVuZGVybGluZVN0eWxlID0gU1dULlVOREVSTElORV9FUlJPUjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBVTkRFUkxJTkVfU1FVSUdHTEU6Ci0JCQkJCW5ld1JhbmdlLnVuZGVybGluZVN0eWxlID0gU1dULlVOREVSTElORV9TUVVJR0dMRTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBVTkRFUkxJTkVfTElOSzoKLQkJCQkJbmV3UmFuZ2UudW5kZXJsaW5lQ29sb3IgPSBudWxsOwotCQkJCQlpZiAobGluayAhPSBudWxsICYmIGxpbmsubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQluZXdSYW5nZS51bmRlcmxpbmVTdHlsZSA9IFNXVC5VTkRFUkxJTkVfTElOSzsKLQkJCQkJCW5ld1JhbmdlLmRhdGEgPSBsaW5rOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbmV3UmFuZ2UudW5kZXJsaW5lID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKChzdHlsZSAmIEJPUkRFUikgIT0gMCkgewotCQkJc3dpdGNoIChzdHlsZSAmIEJPUkRFUikgewotCQkJCWNhc2UgQk9SREVSX0RBU0g6Ci0JCQkJCW5ld1JhbmdlLmJvcmRlclN0eWxlID0gU1dULkJPUkRFUl9EQVNIOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJPUkRFUl9ET1Q6Ci0JCQkJCW5ld1JhbmdlLmJvcmRlclN0eWxlID0gU1dULkJPUkRFUl9ET1Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQk9SREVSX1NPTElEOgotCQkJCQluZXdSYW5nZS5ib3JkZXJTdHlsZSA9IFNXVC5CT1JERVJfU09MSUQ7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJbmV3UmFuZ2UuYm9yZGVyQ29sb3IgPSBib3JkZXJDb2xvcjsKLQkJfQotCQkKLQkJaW50IG5ld1JhbmdlU3RhcnQgPSBzdGFydDsKLQkJaW50IG5ld1JhbmdlTGVuZ3RoID0gbGVuZ3RoOwotCQlpbnRbXSByYW5nZXMgPSBzdHlsZWRUZXh0LmdldFJhbmdlcyhzdGFydCwgbGVuZ3RoKTsKLQkJU3R5bGVSYW5nZVtdIHN0eWxlcyA9IHN0eWxlZFRleHQuZ2V0U3R5bGVSYW5nZXMoc3RhcnQsIGxlbmd0aCwgZmFsc2UpOwkJCi0JCWludCBtYXhDb3VudCA9IHJhbmdlcy5sZW5ndGggKiAyICsgMjsKLQkJaW50W10gbmV3UmFuZ2VzID0gbmV3IGludFttYXhDb3VudF07Ci0JCVN0eWxlUmFuZ2VbXSBuZXdTdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVttYXhDb3VudCAvIDJdOwkJCi0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSs9MikgewotCQkJaW50IHJhbmdlU3RhcnQgPSByYW5nZXNbaV07Ci0JCQlpbnQgcmFuZ2VMZW5ndGggPSByYW5nZXNbaSArIDFdOwotCQkJU3R5bGVSYW5nZSByYW5nZSA9IHN0eWxlc1tpIC8gMl07Ci0JCQlpZiAocmFuZ2VTdGFydCA+IG5ld1JhbmdlU3RhcnQpIHsKLQkJCQluZXdSYW5nZUxlbmd0aCA9IHJhbmdlU3RhcnQgLSBuZXdSYW5nZVN0YXJ0OwotCQkJCW5ld1Jhbmdlc1tjb3VudF0gPSBuZXdSYW5nZVN0YXJ0OwotCQkJCW5ld1Jhbmdlc1tjb3VudCArIDFdID0gbmV3UmFuZ2VMZW5ndGg7Ci0JCQkJbmV3U3R5bGVzW2NvdW50IC8gMl0gPSBuZXdSYW5nZTsKLQkJCQljb3VudCArPSAyOwotCQkJfQotCQkJbmV3UmFuZ2VTdGFydCA9IHJhbmdlU3RhcnQgKyByYW5nZUxlbmd0aDsKLQkJCW5ld1JhbmdlTGVuZ3RoID0gKHN0YXJ0ICsgbGVuZ3RoKSAtIG5ld1JhbmdlU3RhcnQ7Ci0KLQkJCS8qIENyZWF0ZSBtZXJnZWQgc3R5bGUgcmFuZ2UqLwotCQkJU3R5bGVSYW5nZSBtZXJnZWRSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKHJhbmdlKTsKLQkJCS8vTm90ZTogZm9udFN0eWxlIGlzIG5vdCBjb3BpZWQgYnkgdGhlIGNvbnN0cnVjdG9yCi0JCQltZXJnZWRSYW5nZS5mb250U3R5bGUgPSByYW5nZS5mb250U3R5bGU7Ci0JCQlpZiAoKHN0eWxlICYgRk9OVCkgIT0gMCkgewotCQkJCW1lcmdlZFJhbmdlLmZvbnQgPSAgbmV3UmFuZ2UuZm9udDsKLQkJCX0KLQkJCWlmICgoc3R5bGUgJiBGT05UX1NUWUxFKSAhPSAwKSB7Ci0JCQkJbWVyZ2VkUmFuZ2UuZm9udFN0eWxlID0gIHJhbmdlLmZvbnRTdHlsZSBeIG5ld1JhbmdlLmZvbnRTdHlsZTsKLQkJCX0KLQkJCWlmIChtZXJnZWRSYW5nZS5mb250ICE9IG51bGwgJiYgKChzdHlsZSAmIEZPTlQpICE9IDAgfHwgKHN0eWxlICYgRk9OVF9TVFlMRSkgIT0gMCkpIHsKLQkJCQlib29sZWFuIGNoYW5nZSA9IGZhbHNlOwotCQkJCUZvbnREYXRhW10gZmRzID0gbWVyZ2VkUmFuZ2UuZm9udC5nZXRGb250RGF0YSgpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUZvbnREYXRhIGZkID0gZmRzW2pdOwotCQkJCQlpZiAoZmQuZ2V0U3R5bGUoKSAhPSBtZXJnZWRSYW5nZS5mb250U3R5bGUpIHsKLQkJCQkJCWZkc1tqXS5zZXRTdHlsZShtZXJnZWRSYW5nZS5mb250U3R5bGUpOwotCQkJCQkJY2hhbmdlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY2hhbmdlKSB7Ci0JCQkJCW1lcmdlZFJhbmdlLmZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmZHMpOwotCQkJCX0KLQkJCX0KLQkJCWlmICgoc3R5bGUgJiBGT1JFR1JPVU5EKSAhPSAwKSB7Ci0JCQkJbWVyZ2VkUmFuZ2UuZm9yZWdyb3VuZCA9IG5ld1JhbmdlLmZvcmVncm91bmQgIT0gcmFuZ2UuZm9yZWdyb3VuZCA/IG5ld1JhbmdlLmZvcmVncm91bmQgOiBudWxsOwotCQkJfQotCQkJaWYgKChzdHlsZSAmIEJBQ0tHUk9VTkQpICE9IDApIHsKLQkJCQltZXJnZWRSYW5nZS5iYWNrZ3JvdW5kID0gbmV3UmFuZ2UuYmFja2dyb3VuZCAhPSByYW5nZS5iYWNrZ3JvdW5kID8gbmV3UmFuZ2UuYmFja2dyb3VuZCA6IG51bGw7Ci0JCQl9Ci0JCQlpZiAoKHN0eWxlICYgQkFTRUxJTkVfVVApICE9IDApIG1lcmdlZFJhbmdlLnJpc2UrKzsKLQkJCWlmICgoc3R5bGUgJiBCQVNFTElORV9ET1dOKSAhPSAwKSBtZXJnZWRSYW5nZS5yaXNlLS07Ci0JCQlpZiAoKHN0eWxlICYgU1RSSUtFT1VUKSAhPSAwKSB7Ci0JCQkJbWVyZ2VkUmFuZ2Uuc3RyaWtlb3V0ID0gIXJhbmdlLnN0cmlrZW91dCB8fCByYW5nZS5zdHJpa2VvdXRDb2xvciAhPSBuZXdSYW5nZS5zdHJpa2VvdXRDb2xvcjsKLQkJCQltZXJnZWRSYW5nZS5zdHJpa2VvdXRDb2xvciA9IG1lcmdlZFJhbmdlLnN0cmlrZW91dCA/IG5ld1JhbmdlLnN0cmlrZW91dENvbG9yIDogbnVsbDsKLQkJCX0KLQkJCWlmICgoc3R5bGUgJiBVTkRFUkxJTkUpICE9IDApIHsKLQkJCQlpZiAoKHN0eWxlICYgVU5ERVJMSU5FX0xJTkspICE9IDApIHsKLQkJCQkJaWYgKGxpbmsgIT0gbnVsbCAmJiBsaW5rLmxlbmd0aCgpID4gMCkgewotCQkJCQkJbWVyZ2VkUmFuZ2UudW5kZXJsaW5lID0gIXJhbmdlLnVuZGVybGluZSB8fCByYW5nZS51bmRlcmxpbmVTdHlsZSAhPSBuZXdSYW5nZS51bmRlcmxpbmVTdHlsZSAgfHwgcmFuZ2UuZGF0YSAhPSBuZXdSYW5nZS5kYXRhOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbWVyZ2VkUmFuZ2UudW5kZXJsaW5lID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJbWVyZ2VkUmFuZ2UudW5kZXJsaW5lQ29sb3IgPSBudWxsOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1lcmdlZFJhbmdlLnVuZGVybGluZSA9ICFyYW5nZS51bmRlcmxpbmUgfHwgcmFuZ2UudW5kZXJsaW5lU3R5bGUgIT0gbmV3UmFuZ2UudW5kZXJsaW5lU3R5bGUgfHwgcmFuZ2UudW5kZXJsaW5lQ29sb3IgIT0gbmV3UmFuZ2UudW5kZXJsaW5lQ29sb3I7Ci0JCQkJCW1lcmdlZFJhbmdlLnVuZGVybGluZUNvbG9yID0gbWVyZ2VkUmFuZ2UudW5kZXJsaW5lID8gbmV3UmFuZ2UudW5kZXJsaW5lQ29sb3IgOiBudWxsOwotCQkJCX0KLQkJCQltZXJnZWRSYW5nZS51bmRlcmxpbmVTdHlsZSA9IG1lcmdlZFJhbmdlLnVuZGVybGluZSA/IG5ld1JhbmdlLnVuZGVybGluZVN0eWxlIDogU1dULk5PTkU7Ci0JCQkJbWVyZ2VkUmFuZ2UuZGF0YSA9IG1lcmdlZFJhbmdlLnVuZGVybGluZSA/IG5ld1JhbmdlLmRhdGEgOiBudWxsOwotCQkJfQotCQkJaWYgKChzdHlsZSAmIEJPUkRFUikgIT0gMCkgewotCQkJCWlmIChyYW5nZS5ib3JkZXJTdHlsZSAhPSBuZXdSYW5nZS5ib3JkZXJTdHlsZSB8fCByYW5nZS5ib3JkZXJDb2xvciAhPSBuZXdSYW5nZS5ib3JkZXJDb2xvcikgewotCQkJCQltZXJnZWRSYW5nZS5ib3JkZXJTdHlsZSA9IG5ld1JhbmdlLmJvcmRlclN0eWxlOwotCQkJCQltZXJnZWRSYW5nZS5ib3JkZXJDb2xvciA9IG5ld1JhbmdlLmJvcmRlckNvbG9yOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1lcmdlZFJhbmdlLmJvcmRlclN0eWxlID0gU1dULk5PTkU7Ci0JCQkJCW1lcmdlZFJhbmdlLmJvcmRlckNvbG9yID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCW5ld1Jhbmdlc1tjb3VudF0gPSByYW5nZVN0YXJ0OwotCQkJbmV3UmFuZ2VzW2NvdW50ICsgMV0gPSByYW5nZUxlbmd0aDsKLQkJCW5ld1N0eWxlc1tjb3VudCAvIDJdID0gbWVyZ2VkUmFuZ2U7Ci0JCQljb3VudCArPSAyOwotCQl9Ci0JCWlmIChuZXdSYW5nZUxlbmd0aCA+IDApIHsKLQkJCW5ld1Jhbmdlc1tjb3VudF0gPSBuZXdSYW5nZVN0YXJ0OwotCQkJbmV3UmFuZ2VzW2NvdW50ICsgMV0gPSBuZXdSYW5nZUxlbmd0aDsKLQkJCW5ld1N0eWxlc1tjb3VudCAvIDJdID0gbmV3UmFuZ2U7Ci0JCQljb3VudCArPSAyOwotCQl9Ci0JCWlmICgwIDwgY291bnQgJiYgY291bnQgPCBtYXhDb3VudCkgewkJCQotCQkJaW50W10gdG1wUmFuZ2VzID0gbmV3IGludFtjb3VudF07Ci0JCQlTdHlsZVJhbmdlW10gdG1wU3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbY291bnQgLyAyXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobmV3UmFuZ2VzLCAwLCB0bXBSYW5nZXMsIDAsIGNvdW50KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobmV3U3R5bGVzLCAwLCB0bXBTdHlsZXMsIDAsIGNvdW50IC8gMik7Ci0JCQluZXdSYW5nZXMgPSB0bXBSYW5nZXM7Ci0JCQluZXdTdHlsZXMgPSB0bXBTdHlsZXM7Ci0JCX0KLQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlcyhzdGFydCwgbGVuZ3RoLCBuZXdSYW5nZXMsIG5ld1N0eWxlcyk7Ci0JCWRpc3Bvc2VSYW5nZXMoc3R5bGVzKTsKLQl9Ci0JCi0Jdm9pZCBzaG93RXJyb3IgKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZUJveCBtZXNzYWdlQm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SIHwgU1dULkNMT1NFKTsKLQkJbWVzc2FnZUJveC5zZXRUZXh0KHRpdGxlKTsKLQkJbWVzc2FnZUJveC5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotCQltZXNzYWdlQm94Lm9wZW4oKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVN0YXR1c0JhcigpIHsKLQkJaW50IG9mZnNldCA9IHN0eWxlZFRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJaW50IGxpbmVJbmRleCA9IHN0eWxlZFRleHQuZ2V0TGluZUF0T2Zmc2V0KG9mZnNldCk7Ci0JCVN0cmluZyBpbnNlcnRMYWJlbCA9IGdldFJlc291cmNlU3RyaW5nKGluc2VydCA/ICJJbnNlcnQiIDogIk92ZXJ3cml0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc3RhdHVzQmFyLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIk9mZnNldCIpCS8vJE5PTi1OTFMtMSQKLQkJCQkrIG9mZnNldCArICIgIgkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJKyBnZXRSZXNvdXJjZVN0cmluZygiTGluZSIpCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkrIGxpbmVJbmRleCArICJcdCIJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJKyBpbnNlcnRMYWJlbCk7Ci0JfQotCQotCXZvaWQgdXBkYXRlU3R5bGVTdGF0ZShpbnQgc3R5bGUsIGludCBjaGFuZ2luZ1N0eWxlKSB7Ci0JCWlmICgoc3R5bGUgJiBjaGFuZ2luZ1N0eWxlKSAhPSAwKSB7Ci0JCQlpZiAoKHN0eWxlICYgY2hhbmdpbmdTdHlsZSkgPT0gKHN0eWxlU3RhdGUgJiBjaGFuZ2luZ1N0eWxlKSkgewotCQkJCXN0eWxlU3RhdGUgJj0gfmNoYW5naW5nU3R5bGU7Ci0JCQl9IGVsc2UgewotCQkJCXN0eWxlU3RhdGUgJj0gfmNoYW5naW5nU3R5bGU7Ci0JCQkJc3R5bGVTdGF0ZSB8PSBzdHlsZTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgdXBkYXRlVG9vbEJhcigpIHsKLQkJc3R5bGVTdGF0ZSA9IDA7Ci0JCWxpbmsgPSBudWxsOwotCQlib29sZWFuIGJvbGQgPSBmYWxzZSwgaXRhbGljID0gZmFsc2U7Ci0JCUZvbnQgZm9udCA9IG51bGw7Ci0KLQkJaW50IG9mZnNldCA9IHN0eWxlZFRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJU3R5bGVSYW5nZSByYW5nZSA9IG9mZnNldCA+IDAgPyBzdHlsZWRUZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChvZmZzZXQtMSkgOiBudWxsOwotCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJaWYgKHJhbmdlLmZvbnQgIT0gbnVsbCkgewotCQkJCWZvbnQgPSByYW5nZS5mb250OwotCQkJCUZvbnREYXRhW10gZmRzID0gZm9udC5nZXRGb250RGF0YSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWludCBmb250U3R5bGUgPSBmZHNbaV0uZ2V0U3R5bGUoKTsKLQkJCQkJaWYgKCFib2xkICYmIChmb250U3R5bGUgJiBTV1QuQk9MRCkgIT0gMCkgYm9sZCA9IHRydWU7Ci0JCQkJCWlmICghaXRhbGljICYmIChmb250U3R5bGUgJiBTV1QuSVRBTElDKSAhPSAwKSBpdGFsaWMgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYm9sZCA9IChyYW5nZS5mb250U3R5bGUgJiBTV1QuQk9MRCkgIT0gMDsKLQkJCQlpdGFsaWMgPSAocmFuZ2UuZm9udFN0eWxlICYgU1dULklUQUxJQykgIT0gMDsKLQkJCX0KLQkJCWlmIChyYW5nZS5mb3JlZ3JvdW5kICE9IG51bGwpIHsKLQkJCQlzdHlsZVN0YXRlIHw9IEZPUkVHUk9VTkQ7Ci0JCQkJaWYgKHRleHRGb3JlZ3JvdW5kICE9IHJhbmdlLmZvcmVncm91bmQpIHsKLQkJCQkJZGlzcG9zZVJlc291cmNlKHRleHRGb3JlZ3JvdW5kKTsKLQkJCQkJdGV4dEZvcmVncm91bmQgPSByYW5nZS5mb3JlZ3JvdW5kOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyYW5nZS5iYWNrZ3JvdW5kICE9IG51bGwpIHsKLQkJCQlzdHlsZVN0YXRlIHw9IEJBQ0tHUk9VTkQ7Ci0JCQkJaWYgKHRleHRCYWNrZ3JvdW5kICE9IHJhbmdlLmJhY2tncm91bmQpIHsKLQkJCQkJZGlzcG9zZVJlc291cmNlKHRleHRCYWNrZ3JvdW5kKTsKLQkJCQkJdGV4dEJhY2tncm91bmQgPSByYW5nZS5iYWNrZ3JvdW5kOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyYW5nZS51bmRlcmxpbmUpIHsKLQkJCQlzd2l0Y2ggKHJhbmdlLnVuZGVybGluZVN0eWxlKSB7Ci0JCQkJCWNhc2UgU1dULlVOREVSTElORV9TSU5HTEU6CXN0eWxlU3RhdGUgfD0gVU5ERVJMSU5FX1NJTkdMRTsgYnJlYWs7Ci0JCQkJCWNhc2UgU1dULlVOREVSTElORV9ET1VCTEU6IAlzdHlsZVN0YXRlIHw9IFVOREVSTElORV9ET1VCTEU7IGJyZWFrOwotCQkJCQljYXNlIFNXVC5VTkRFUkxJTkVfU1FVSUdHTEU6CXN0eWxlU3RhdGUgfD0gVU5ERVJMSU5FX1NRVUlHR0xFOyBicmVhazsKLQkJCQkJY2FzZSBTV1QuVU5ERVJMSU5FX0VSUk9SOiAJc3R5bGVTdGF0ZSB8PSBVTkRFUkxJTkVfRVJST1I7IGJyZWFrOwotCQkJCQljYXNlIFNXVC5VTkRFUkxJTkVfTElOSzogCQotCQkJCQkJc3R5bGVTdGF0ZSB8PSBVTkRFUkxJTkVfTElOSzsKLQkJCQkJCWxpbmsgPSAoU3RyaW5nKXJhbmdlLmRhdGE7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHJhbmdlLnVuZGVybGluZVN0eWxlICE9IFNXVC5VTkRFUkxJTkVfTElOSykgewotCQkJCQl1bmRlcmxpbmVTaW5nbGVJdGVtLnNldFNlbGVjdGlvbigoc3R5bGVTdGF0ZSAmIFVOREVSTElORV9TSU5HTEUpICE9IDApOwotCQkJCQl1bmRlcmxpbmVEb3VibGVJdGVtLnNldFNlbGVjdGlvbigoc3R5bGVTdGF0ZSAmIFVOREVSTElORV9ET1VCTEUpICE9IDApOwotCQkJCQl1bmRlcmxpbmVFcnJvckl0ZW0uc2V0U2VsZWN0aW9uKChzdHlsZVN0YXRlICYgVU5ERVJMSU5FX0VSUk9SKSAhPSAwKTsKLQkJCQkJdW5kZXJsaW5lU3F1aWdnbGVJdGVtLnNldFNlbGVjdGlvbigoc3R5bGVTdGF0ZSAmIFVOREVSTElORV9TUVVJR0dMRSkgIT0gMCk7Ci0JCQkJCWRpc3Bvc2VSZXNvdXJjZSh1bmRlcmxpbmVDb2xvcik7Ci0JCQkJCXVuZGVybGluZUNvbG9yID0gcmFuZ2UudW5kZXJsaW5lQ29sb3I7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJhbmdlLnN0cmlrZW91dCkgewotCQkJCXN0eWxlU3RhdGUgfD0gU1RSSUtFT1VUOwotCQkJCWRpc3Bvc2VSZXNvdXJjZShzdHJpa2VvdXRDb2xvcik7Ci0JCQkJc3RyaWtlb3V0Q29sb3IgPSByYW5nZS5zdHJpa2VvdXRDb2xvcjsKLQkJCX0KLQkJCWlmIChyYW5nZS5ib3JkZXJTdHlsZSAhPSBTV1QuTk9ORSkgewotCQkJCXN3aXRjaCAocmFuZ2UuYm9yZGVyU3R5bGUpIHsKLQkJCQkJY2FzZSBTV1QuQk9SREVSX1NPTElEOglzdHlsZVN0YXRlIHw9IEJPUkRFUl9TT0xJRDsgYnJlYWs7Ci0JCQkJCWNhc2UgU1dULkJPUkRFUl9EQVNIOglzdHlsZVN0YXRlIHw9IEJPUkRFUl9EQVNIOyBicmVhazsKLQkJCQkJY2FzZSBTV1QuQk9SREVSX0RPVDoJc3R5bGVTdGF0ZSB8PSBCT1JERVJfRE9UOyBicmVhazsKLQkJCQl9Ci0JCQkJYm9yZGVyU29saWRJdGVtLnNldFNlbGVjdGlvbigoc3R5bGVTdGF0ZSAmIEJPUkRFUl9TT0xJRCkgIT0gMCk7Ci0JCQkJYm9yZGVyRGFzaEl0ZW0uc2V0U2VsZWN0aW9uKChzdHlsZVN0YXRlICYgQk9SREVSX0RBU0gpICE9IDApOwotCQkJCWJvcmRlckRvdEl0ZW0uc2V0U2VsZWN0aW9uKChzdHlsZVN0YXRlICYgQk9SREVSX0RPVCkgIT0gMCk7Ci0JCQkJZGlzcG9zZVJlc291cmNlKGJvcmRlckNvbG9yKTsKLQkJCQlib3JkZXJDb2xvciA9IHJhbmdlLmJvcmRlckNvbG9yOwotCQkJfQotCQl9Ci0JCQotCQlib2xkQ29udHJvbC5zZXRTZWxlY3Rpb24oYm9sZCk7Ci0JCWl0YWxpY0NvbnRyb2wuc2V0U2VsZWN0aW9uKGl0YWxpYyk7Ci0JCUZvbnREYXRhIGZvbnREYXRhID0gZm9udCAhPSBudWxsID8gZm9udC5nZXRGb250RGF0YSgpWzBdIDogc3R5bGVkVGV4dC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJaW50IGluZGV4ID0gMDsKLQkJaW50IGNvdW50ID0gZm9udE5hbWVDb250cm9sLmdldEl0ZW1Db3VudCgpOwotCQlTdHJpbmcgZm9udE5hbWUgPSBmb250RGF0YS5nZXROYW1lKCk7Ci0JCXdoaWxlIChpbmRleCA8IGNvdW50KSB7Ci0JCQlpZiAoZm9udE5hbWVDb250cm9sLmdldEl0ZW0oaW5kZXgpLmVxdWFscyhmb250TmFtZSkpIHsKLQkJCQlmb250TmFtZUNvbnRyb2wuc2VsZWN0KGluZGV4KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWluZGV4Kys7Ci0JCX0KLQkJaW5kZXggPSAwOwotCQljb3VudCA9IGZvbnRTaXplQ29udHJvbC5nZXRJdGVtQ291bnQoKTsKLQkJaW50IGZvbnRTaXplID0gZm9udERhdGEuZ2V0SGVpZ2h0KCk7Ci0JCXdoaWxlIChpbmRleCA8IGNvdW50KSB7Ci0JCQlpbnQgc2l6ZSA9IEludGVnZXIucGFyc2VJbnQoZm9udFNpemVDb250cm9sLmdldEl0ZW0oaW5kZXgpKTsKLQkJCWlmIChmb250U2l6ZSA9PSBzaXplKSB7Ci0JCQkJZm9udFNpemVDb250cm9sLnNlbGVjdChpbmRleCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc2l6ZSA+IGZvbnRTaXplKSB7Ci0JCQkJZm9udFNpemVDb250cm9sLmFkZCAoU3RyaW5nLnZhbHVlT2YoZm9udFNpemUpLCBpbmRleCk7Ci0JCQkJZm9udFNpemVDb250cm9sLnNlbGVjdChpbmRleCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpbmRleCsrOwotCQl9Ci0JCQotCQlkaXNwb3NlUmVzb3VyY2UodGV4dEZvbnQpOwotCQl0ZXh0Rm9udCA9IGZvbnQ7Ci0JCWludCBsaW5lSW5kZXggPSBzdHlsZWRUZXh0LmdldExpbmVBdE9mZnNldChvZmZzZXQpOwotCQlpbnQgYWxpZ25tZW50ID0gc3R5bGVkVGV4dC5nZXRMaW5lQWxpZ25tZW50KGxpbmVJbmRleCk7Ci0JCWxlZnRBbGlnbm1lbnRJdGVtLnNldFNlbGVjdGlvbigoYWxpZ25tZW50ICYgU1dULkxFRlQpICE9IDApOwotCQljZW50ZXJBbGlnbm1lbnRJdGVtLnNldFNlbGVjdGlvbigoYWxpZ25tZW50ICYgU1dULkNFTlRFUikgIT0gMCk7Ci0JCXJpZ2h0QWxpZ25tZW50SXRlbS5zZXRTZWxlY3Rpb24oKGFsaWdubWVudCAmIFNXVC5SSUdIVCkgIT0gMCk7Ci0JCWJvb2xlYW4ganVzdGlmeSA9IHN0eWxlZFRleHQuZ2V0TGluZUp1c3RpZnkobGluZUluZGV4KTsKLQkJanVzdGlmeUFsaWdubWVudEl0ZW0uc2V0U2VsZWN0aW9uKGp1c3RpZnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JvbGQuaWNvIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ib2xkLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyODllOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JvbGQuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9jZW50ZXIuaWNvIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9jZW50ZXIuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmYyZTcwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvY2VudGVyLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvY29weS5pY28gYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2NvcHkuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgyMGY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvY29weS5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2N1dC5pY28gYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2N1dC5pY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZDRlOGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9jdXQuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9mb250X2JpZy5pY28gYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2ZvbnRfYmlnLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1NTg1MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2ZvbnRfYmlnLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZm9udF9zbWwuaWNvIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9mb250X3NtbC5pY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOGYyOTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9mb250X3NtbC5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2Z1bGxzY3JuLmljbyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZnVsbHNjcm4uaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjMyZGY4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZnVsbHNjcm4uaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWMuaWNvIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWMuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzVmMzIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvaXRhbGljLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvanVzdGlmeS5pY28gYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2p1c3RpZnkuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGYxNTVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvanVzdGlmeS5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2xlZnQuaWNvIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9sZWZ0LmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiZmIzOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2xlZnQuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9saW5rX29iai5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2xpbmtfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlMzg0NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2xpbmtfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvcGFyYV9idWwuaWNvIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9wYXJhX2J1bC5pY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjMxMGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9wYXJhX2J1bC5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3BhcmFfbnVtLmljbyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvcGFyYV9udW0uaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTY1Y2M5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvcGFyYV9udW0uaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9wYXN0ZS5pY28gYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3Bhc3RlLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwZGYwNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3Bhc3RlLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvcmVzaXplLmljbyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvcmVzaXplLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyMjZkMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3Jlc2l6ZS5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JpZ2h0LmljbyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvcmlnaHQuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWIxMzViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvcmlnaHQuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9zdHJpa2VvdXQuaWNvIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9zdHJpa2VvdXQuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTRhZjM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0LmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3R5bGVzLnR4dCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3R5bGVzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjNDI0Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3N0eWxlcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYwMyArMCwwIEBACi0wOzgwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkxOzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA4OzEzOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyOTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NjszMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzc4OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzc5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk2OzEzOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDEzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMjsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUyOzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njk7ODA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1OTsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01ODI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjA3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjExOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE4OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYzNjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NTszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02Nzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODY7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzA4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzEwOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE3OzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc0MjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MTsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Nzg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODA7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODc7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODE0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIzOzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1Mjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1OTsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTk7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk4MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAyOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0Nzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEwNTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTA2MDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODI7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMDg2OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExMTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0MTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExNDI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTY3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE4NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5OTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA5OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIxMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDM7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5ODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzE3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzMjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzczOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk3OzE4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTE1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MjsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Nzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Nzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODM7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEwOzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjM3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzOTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Njc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Nzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzE1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MTk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5MzsxODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xODIwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE4Mjk7MjY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODU4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODYwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTg2NDsxNjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xODg5OzQwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5Mzg7MjU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk3MjsyODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxNTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwMTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI0OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjAyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkxOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwMjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTc7MjM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY3OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4ODsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDk7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI2OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzUzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2MDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU2OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3ODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxNTsyMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NTY7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Nzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgzOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU4NzszMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNjI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI2Mzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQzOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjY0NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjM7MTQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzAzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzA2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3MTA7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNzExOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3MTk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzIxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzI0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3MzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzMzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzM5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzQ0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzU0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzU4OzE3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc3Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc4NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc5MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc5NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc5ODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjgwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4MDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjgxMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4MTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjgxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4MTc7Mjk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODQ3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODUwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg2MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg2NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODcyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg3NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg3ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI4ODI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODg3OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjg5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4OTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4OTU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTA2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTExOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTIwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjkyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTI3OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MzM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NDg7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5NTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTYyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTY0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjk2ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NzM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yOTc3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk4MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk4Mjs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI5ODk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk5Njs4OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTMwMDQ7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDIwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDI3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAzODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA0Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA1NTs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTMwNjI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA2OTs4OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTMwNzc7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDkzOzE4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzExMjsxNjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzEyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMjk7MTM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTQzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTUxOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE2Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE3MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTc5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE4NDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTMxODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTkyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxOTQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTk2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzIwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMDM7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIwOTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIyMDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMyMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjI4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzIzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIzOTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjQ2OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzI1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNTI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI1NzszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNjM7NDswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0zMjY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI2ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNzE7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI3ODs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMyODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjg0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyOTE7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzMxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzMTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzMxNTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzM0OzE2OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTMzNTA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM1NTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMzNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzYyOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzM2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNjg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM3MjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzkxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzOTY7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQwMzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM0MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDA5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzQxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MTM7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzQyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0Mjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQyOTszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM0MzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDM1OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzQ0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NDI7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ0ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM0NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDUyOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM0NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzQ2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0Njk7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNDcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ3NTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM0ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDgyOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzQ4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0ODg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ5MjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTA4OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzUxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MTQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUyMTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM1MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTI3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzUzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MzE7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU0NzszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1NTA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTU2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzU2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NjM7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU2OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTczOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTg4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzU4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1OTA7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTk1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU5ODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjA1OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzYxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYxNTsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjM1OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzY0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NDM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNjQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY1MDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM2NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjU2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzY1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NjA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY3NTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2ODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjgzOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzY4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2OTA7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNjk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY5NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM2OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzAwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzcxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MTU7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzIwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcyMzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM3Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzMwOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzczNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MzY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc0MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NTA7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc1ODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM3NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzY1OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzc3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NzE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNzc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc3NTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3ODc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc5NTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM4MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODAyOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzgwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MDg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zODExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgxMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zODIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM4MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODI2OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzgzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MzQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zODQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg0MTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM4NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODQ3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzg1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NTE7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzg2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4Njc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg2OTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM4NzQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODgwOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4ODY7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzkwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MDc7MzE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTM5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTM5OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NDU7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzk2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NjY7MzE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTM5OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTk4OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDE2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQwMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDMyOzQ3OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci00MDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA4MDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA5ODs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQxMDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTA5OzcwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci00MTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE4MDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE5Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyMDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjA4Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDIxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMTc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIyOTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI0ODsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI2ODs4NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNDM1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNTQ7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNzI7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM5MDs2NzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNDQ1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NTg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ2ODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDc4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ4MTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ0ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDg5OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTAzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDUwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MDU7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NTEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDUxMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MTM7MTQ0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci00NjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY1ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjY2OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ2ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDY4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2ODc7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NjkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDY5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2OTQ7MTU5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci00ODUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDg1NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ4NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODU4OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDg4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4ODE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODgzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDg4NTsxNjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNDkwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MDI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00OTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkwNjsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkyOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ5MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTMxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkzMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MzU7MTY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTQ5NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTUyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDk1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NTY7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ5NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTY3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDk2OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NzQ7MjE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTQ5OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTk2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDk5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMDA7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTAxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAyMDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUwMjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDI2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTAyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMzA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUwNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDQyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTA0NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNDk7NDI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTUwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDkyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTA5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwOTY7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTExNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxMTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTIwOzcxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01MTkxOzEwOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyMDE7NDE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTUyNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjQzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTI0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNDc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTI2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI2NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyNjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjcwOzcxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01MzQxOzEwOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzNTE7NDI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTUzOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Mzk0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzOTg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTQwOTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MTU7Mjg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTU0NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDQ0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTQ0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NDg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU0NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDYwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTQ2Mjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0Njc7MzQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTU1MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTAyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTUwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MDY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTUxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MjA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTUyNDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTM0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTUzNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU1NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTQxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTU2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTU1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NjA7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU3MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NzY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU4MzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTk1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYwMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU2MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjA0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYxMjs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MTk7NDg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTU2Njc7MTA7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY3Nzs0NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNTcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MjQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcyODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzQyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTc0NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NDc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NzUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc1Mzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTc2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NjU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc2OTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU3Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Nzc4OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTc4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3ODI7NTc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTU4Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODQwOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTg0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NDY7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTg2NTsxMTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODc2OzY2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01OTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk0MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU5NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTQ3OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5NjM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTY3OzcyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci02MDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA0MDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYwNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDQ2OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYwNjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDcwOzQ0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci02MTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjExNTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYxMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTIzOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjEzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEzNDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYxMzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MTM5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE0Mjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYxNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTUwOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjE1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxNTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE2MTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYxNjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MTY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE3MDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYxNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTc4OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjE5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxOTk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MjAzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjIwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMDU7MzE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTYyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjM3Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjI0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNDU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjU3OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjI2MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyNjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjY2OzMxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci02Mjk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI5ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYzMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzAyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjMxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMxNDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYzMTc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzIyOzkxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci02NDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQxNDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY0MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDI0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY0MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjQzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0Mzk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02NDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ0MzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NDU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ1ODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY0NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDY0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY0NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjQ3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0Nzc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02NDgxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjQ4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0ODU7Mjg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTY1MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTE0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjUxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MjA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjUzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUzMzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY1Mzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NTM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU0MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci02NTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU0Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY1NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTU2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY1NjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTY5Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1Nzc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY1ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTg5OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjU5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY1OTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTk4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjYwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MDY7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjYyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYyNTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY2MzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYzMjs2NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNjY5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2OTg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02NzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjcwMjsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjcyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzI0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjczMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MzQ7NTk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTY3OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzk0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjc5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3OTg7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjgxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgxOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODI0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjgyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4Mjg7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjg0ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4NTE7MjM7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTY4NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODc1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjg3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4Nzk7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjkwNjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MDg7MjQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTY5MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTMzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjkzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5Mzc7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk2NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NjY7MjY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTY5OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTkzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjk5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5OTc7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzAyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwMjk7MjU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTcwNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDU1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzA1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwNTk7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzA5MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwOTQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzEwMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzExNjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcxMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTI0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzEzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMzk7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MTQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzE0NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNDc7NjQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTcyMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjEyOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMTg7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIzNjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcyNDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI0NDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjUwOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNjk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MjczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI3NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI4MTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Mjk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mjk4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczMTA7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMxODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczMzA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MzM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczMzg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM0NDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzU5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzM2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzY3Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzM3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNzU7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczOTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Mzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM5ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc0MDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NDAzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQwODs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc0MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDE0OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzQyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MjE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQyOTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ0MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDQ4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzQ1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NjA7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ2Njs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc0NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDczOzc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzQ4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0ODE7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzQ5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0OTg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1MDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTEwOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MTc7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTI4OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTUwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzU1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU2Mjs4OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTc1NzA7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzU4ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1OTI7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjAxOzU7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotNzYwNjsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NjI0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYyODs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzYzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2Mzk7NzswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci03NjQ2OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2NjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjY4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjgyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2ODQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Njk5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcwNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NzA3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcxMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcxMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcxNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcyNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzczMjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NDM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NjY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc3MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NzU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3Nzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3ODA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3ODk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3OTI7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03Nzk5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc4MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODA4Ozg7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzgxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4MTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzgxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4MjA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzgyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4Mjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzgzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4MzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzgzNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4NDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzg0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4NDI7MjU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc4Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODY4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODczOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODc3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc4ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODgzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc4ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODkwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc4OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODk0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc4OTY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTAxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc5MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTAzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc5MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTExOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc5MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTE2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc5MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTIwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc5Mjc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTMxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc5MzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTM2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzk0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5NDM7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03OTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk0OTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTU4OzEwOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc5Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTY5Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5Nzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTc5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk4Mzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc5ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTg5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzk5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5OTY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03OTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAwMDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwMDc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDA5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAxNTszOTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotODA1NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNTY7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04MDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA2Mjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgwNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDY5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODA3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNzM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDgyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODA4NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwODk7MzU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTgxMjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTI2OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODEzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxMzI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04MTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODEzOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTQzOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODE0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxNDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE1MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxNTM7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTU5OzQwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci04MTk5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIwMzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIxNDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgyMjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjI1Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMzM7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI0NTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI1OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgyNjg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjcyOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Mjk1OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzMDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzEyOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzMwOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzQ5OzMxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci04MzgwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM4Mjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzkyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0MDM7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDEwOzI4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci04NDM4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ0MDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDQ1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDYxOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NzA7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ4Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0OTA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUwMDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTE0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUyMDs1NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotODU3NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1Nzc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU4NzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjA1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODYwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MDk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MjI7Mjg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTg2NTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjUyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NjI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04Njc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY3NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg2Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njc5OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2OTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njk0OzIzOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci04NzE3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcxOTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzI5OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3NDQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc0ODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NzYwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc2Mjs1NzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotODgxOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MjE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgyNDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4Mjc7MTE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgzODsxNTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotODg1MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NTU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04ODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg1OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODY5Ozk7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg3ODszODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotODkxNjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MTg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04OTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkyMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTMyOzk7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk0MTsyNDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotODk2NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5Njc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04OTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk3MTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5Nzk7OTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTg4OzIzOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05MDExOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAxMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkwMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDE3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAyNjs5OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwMzU7MzA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTkwNjU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDY3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTA3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNzE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA4MTs5OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwOTA7MzQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTkxMjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTI2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTEyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMzA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTM4Ozk7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE0NzszMzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotOTE4MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxODI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE5MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MjAxOzg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIwOTsyODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotOTIzNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyMzk7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI0NTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTI1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNTc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MjYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTI2Mjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNjc7MTg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTkyODU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjg3Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTI5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyOTU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzA0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMxMDs0ODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotOTM1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTM2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTM2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNzA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTM3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTM4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzODE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTM4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzOTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTM5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzOTM7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci05NDAwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0MDg7ODswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci05NDE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0MTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDIzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDMwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDM0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDQxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDQ5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDUzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDYzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDY4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDczOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0Nzg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDgzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDg4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDkxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTAxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTA2OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTE2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUyMjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTk1MjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTMwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTMyOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotOTUzOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU0NjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NTc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1Njc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU3Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1Nzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1Nzk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci05NTg2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTk0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjAyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjA5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjEyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjE4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2MjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjI1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjI3Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotOTYzNDsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY2MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY2Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NzE7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTY5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2OTE7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Njk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY5OTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzA3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTcxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MTY7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTczODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3Mzk7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3NTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzU0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc1ODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc3MDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Nzc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3Nzc7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTgwMjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MDg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05ODEyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTgxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgyMjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4Mjk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODMzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTgzNzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4NDg7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODU2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg2MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk4NjQ7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4Nzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg4MDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODkzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg5Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk5MDE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05OTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTEzOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5MzQ7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NDg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05OTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk1MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5NTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTU3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTk2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NzA7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTk5Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5OTY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAwODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDEwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMTQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAyNDsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA0Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDQ2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA0OTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDYxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA2NDsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDg4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwODk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA5NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDEwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTA2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTIxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMjY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDEzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDEzNjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE0OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTU0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAxNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE1Nzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTY4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE4MDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTg2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAxODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE5MDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxOTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTk3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyMDU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDIxMTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDIyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjIxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjMxOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMzc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI0OTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjU0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI2MDs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyNjg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI3Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMjc3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyODI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDI4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjg1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyOTc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzAwOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzMjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDMyNDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzI5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDMzOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNDE7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzNjg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM3MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzczOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNzk7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzOTc7MzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0MzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQzNTszMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDQ2ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDcyOzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNTAyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDUwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTA5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTEyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1MTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDUxODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDUyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTI1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1Mjk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDUzNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTQzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU1MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTU2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU2Nzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEwNTcxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NzU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU3Nzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEwNTg0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTk1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDYwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjA5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYxNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDYyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjIzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2Mjg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYzNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY0MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjQ2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjQ3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NDk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY1ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjYxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NjU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY3MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjc0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2Nzg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2ODc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY5MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjkzOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTA3MDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcwNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzEwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcxOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzI0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MzM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3Mzc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc0MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc0NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzQ3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA3NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc1MjsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDc3MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwNzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NzQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA3ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc4Njs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3OTM7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDc5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4MDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgwNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwODA3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgxMDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDgyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODIxOzM0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NTY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDg2Mjs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODcwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg3Mzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4ODM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODg2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA4OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDg5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4OTM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg5ODsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDkxNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwOTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MTk7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk0MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDk1MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5NTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk2OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTcxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5Nzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk4Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTg3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTk4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDExOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAyNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDI4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTEwMzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAzNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDM4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTEwNDU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA2MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA3NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDc4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwODQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA4ODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwOTg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEwMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEwNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTA2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTExNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTI2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEzMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTM5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE0Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTE1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNjE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTE2ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTE3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTczOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE4MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExOTE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMjAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMDI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIwODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTIxMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMjE3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMjA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTIyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjI1OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjQ1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI0OTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjYxOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI2ODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI3NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjc5OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyOTU7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEzMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMwMzs0MDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTM0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzQ0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEzNTA7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM1ODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNjE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTM2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzY4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEzNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM3MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMzc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEzNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMzc4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzODM7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE0MDM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTQwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDA3OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0Mjg7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQzNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE0NDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ1NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDU2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ2Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDcyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0Nzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ4Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDg4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ5NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTA0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUxMTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUyMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTI0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MjY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTUzMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTM0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MzY7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTU0MzsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU1ODs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExNTY1OzE3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTU4Mjs4OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExNTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU5NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTYwMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjA2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNjA3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MDk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE2MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYxNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTYxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjE5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNjIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2Mjc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE2Mjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYzMjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2Mzc7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY2OTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2ODY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY5MTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2OTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY5NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNjk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTcwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTcwNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTcwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTcxMTszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTc0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzQyOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzQ4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NTM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTc1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzU3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3Njg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzcwOzM0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExODA0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MDk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODE2OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE4MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExODIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MjM7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE4NDk7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg1NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NjA7MzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE4OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExODk2OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5MDI7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkzNDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExOTQwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTk0Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTUxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE5NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk1NDszMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTk4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTg4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5OTA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk5NjszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjAyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDI5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIwMzE7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAzNzszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjA2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIwNzE7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA3NzsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjEwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTA0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIxMTA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjExNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMTE2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMjE7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjEyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTI0OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjE0Mzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTQ5OzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNzk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjE4NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIxOTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMTk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxOTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjIwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjAzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjA2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIxMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMjM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIyODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjM1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI0Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjQ4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjUzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI1OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMjYzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNjc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI2OTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEyMjc2OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjg3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyOTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI5NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzAxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMDY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMwOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMzMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzM0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzM1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMzc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM0NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzQ5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNjY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzgxOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTIzODg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM5Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzk4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MDE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDExOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDMxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI0MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQzNjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ1MTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyNDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NTU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ2Nzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NzQ7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0ODE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4NTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjUwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTAxOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MDk7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU0NTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNTUxOzg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NTk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjU2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTYyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU2OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NzI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjU3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1Nzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjU3OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTg0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1OTc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI2MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYwNjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjYxOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjI0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI2Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNjI5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI2MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjM3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI2Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNjQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjY0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjQ0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NTk7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjY2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjY0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI2NjU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY3MTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjY4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjgyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2OTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjY5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNjk5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3MDU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjcwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzA4OzM0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNzQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NDM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzQ2OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3Njc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzcwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI3NzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3Nzc7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc4NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzk2OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MDk7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4Mjc7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgzNDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg1Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyODYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4NjI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg2ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyODY5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NzU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjg3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODc4OzM0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MTM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTE2OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5Mzc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjkzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTQwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI5NDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjk0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI5NDc7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk1NDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyOTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NTc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI5Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk2ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NzE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjk3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjk3ODs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTg2Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI5OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5OTg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAxMTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAyOTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwMzc7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA0NDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzA2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA2Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMDcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwNzI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDc5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwODU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzA4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDg4OzMzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMjI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzEyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTI1OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNDU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzE0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTQ4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzE2MTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTY4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMxNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE3MTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzE4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTgyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMxODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE4NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMTg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMxOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMTkyOzg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMDA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzIwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMyMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIxMjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzIyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjI1OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjQzOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI1MTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjU4OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjgwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjkxOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyOTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI5ODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzA0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMzMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMwNzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzE4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMyMTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMzI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzI4Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzMzU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM0NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM1Nzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNjQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzcwOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNzY7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzOTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzM5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzk1OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MTY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzQyMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0Mjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNDMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0Mzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ0MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDQ0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ1NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDYwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ2Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDc3Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM0ODQ7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTAxOzg7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM1MDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUxNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTE2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM1MjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUyNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTI2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTM1MzM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU0MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzU0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTQ2Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM1NTM7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTcwOzg7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM1Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU3OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzU4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTgyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTg3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1OTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU5Njs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzNjAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MDE7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM2MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYzMTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzY0Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjQ2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTM2NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY1MDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM2NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY2NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNjY3Ozg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NzU7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM2ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2OTI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzY5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjk2OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNzEzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MTc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzcyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM3MjI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzcyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzI2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM3Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNzI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MzA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzczMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzczNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3Mzc7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM3NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc2Mjs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3Njc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzc2ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzczOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTM3NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc3NzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzc5Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzk4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTM4MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgwMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzgwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODA2OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzgzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODMyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM4MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODM2OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NDI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM4NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NjA7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4ODk7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzg5Mjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM4OTg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkwMzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzOTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzkwOTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTE1OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzOTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTMzOzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzOTU3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzk2Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTY4OzQ1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDE3OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNTM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNzE7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwODY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA5MTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDEwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDEwNjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDEyMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTI2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxMjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDEzMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTQzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE1Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDE2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTY0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNzE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDE3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTc4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxODU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE5MDsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQyMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDIwNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjEwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQyMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIxNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDIyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjI0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MjI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMjk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIzNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDI0NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MjUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNTM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDI1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjU4OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI4MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mjg1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyOTc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwNjsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMzMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzM3OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzNTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzUzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM1NzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM2OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzczOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQzNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM3OTsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDQwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ0MDc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQxMjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDQyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDI4OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ0MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQzNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MzY7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ0NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ1NDsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDQ3NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDgwOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1MDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDUwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTAzOzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDU0Njs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTU0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ1NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NjM7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ1ODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU4OTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1OTU7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ2MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NjIzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2Mjg7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ2NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY0NDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NjQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDY1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjUyOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NzA7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ2OTE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY5NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0Njk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDcwMTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NzA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDcwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcwOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDcxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcxNjsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDczNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzM3OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzQzOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NDk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc2MDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzY4OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Nzg0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3OTA7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Nzk2OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4MTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODE2OzM0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODUwOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NTY7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDg2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODYyOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDg4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODgyOzM0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0OTE2OzEyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTI4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ5MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkzMTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDk0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTUwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk1MzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDk2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTcwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ5NzI7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk4MDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTk4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAwMTsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDE5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwMjA7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAyNzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTAzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDM1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDg7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNjI7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA2OTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTA4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDg2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA4ODsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTEwNjs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTEzOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTEzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTMyOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTUwOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNTc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNzU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE4MTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxODg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTk0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxOTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE5OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyMDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIwODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTIxMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjE1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMTc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTIyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMzM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNTE7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTI1ODsxMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyNzE7ODswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTI3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI4MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mjg0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Mjg2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyODk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTI5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mjk0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MzA1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMDk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTMxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzEyOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMjc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTMyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzMwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUzMzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTMzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzMzc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM0MjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTM1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzU0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNjM7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzODg7MTA7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzOTg7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTQwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDA0OzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTQzMjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDM4OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU0NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ0NDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTQ1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDUyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU0NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ2MDsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTQ4MTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDg3OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTAzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTUwOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTE0OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1Mjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTUyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTMwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU1MzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTUzNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1NDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU0NDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NDc7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTU1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTUxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU1NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NTU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTYxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NjY7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1Nzk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU4NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTU4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTg5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU1OTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTU5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1OTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYwMzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MDY7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYxOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MjI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTYyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2Mjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYyOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjM0OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjU2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NjE7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1Njc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NzU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTY3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2ODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY4NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njg5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY5Mjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MDI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzA1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU3MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3MTI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcxNzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTczNjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzQxOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc1MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NzUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NTI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTc1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NzU3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTc2MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3NjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc2OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc3Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Nzc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Nzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3Nzg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc4NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Nzk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Nzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3OTg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgwODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTgxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODE4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgyNTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE1ODMyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4Mzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg0Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NTE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg2MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODY3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU4NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg3Mjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODgwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU4ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg4NDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTg5MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODk1OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MTc7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTkyMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTI0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5Mjg7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5NTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk2MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTYyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk3Mjs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1OTc5OzEzOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk5Mjs4OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2MDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAwNTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAyNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAyOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDMzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAzODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjA0NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwNTM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjA1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDU4OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwNzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA4MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDg0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA5NDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwOTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjEwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTAxOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMjQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjEyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTI3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEzMDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTMzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMzc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTQzOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNDk7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNjY7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE3NDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTg2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE4ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxOTI7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIwNjsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjMzOzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNjI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyNzQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI3ODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjI4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mjg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI5MTsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjMxNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzE5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMyOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMzE7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzNDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM1MjszMjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTYzODQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM4NjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjM5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mzk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQwMTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDA5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0MTY7OTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQyNTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ0MDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDQ4Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0NTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ1OTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDc2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ3OTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDkzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ5NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjUwNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTExOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1Mjk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjUzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTMyOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTQ4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTYxOzk7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NzA7NjE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE2NjMxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MzM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjM3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY2NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NDU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY2NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY1NjsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Njc0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY2NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY3NjsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Njk4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjcwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MDM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjcwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzA3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MTk7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjcyNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzMwOzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzU0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NTg7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjc2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc2OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NzM7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3ODc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc5Mjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MDE7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgxNDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MTg7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4MzM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgzODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODU1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4Njc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4ODA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg4NjsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjkwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTA0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTE2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MjA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTIzOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NDQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTQ3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NTQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk1OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2OTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NjM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NzY7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwMDE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAwNjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDE5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAyMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAzNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDM3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNDI7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA2MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNjM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNzY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDgyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwODM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA4NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwOTA7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzExMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxMTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzExODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxMjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzEyMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTI2OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxNDQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzE0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTQ3OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxNzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzE3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTc0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxNzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzE4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTgxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxODU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzE5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTk0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzE5NjsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIxNjsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI0MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjQ1OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNjM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI3MzsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI5NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mjk5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMwOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzMxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzE3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTczMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMyMDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzMzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMzQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMzOTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczNDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzM0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzQ5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczNTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzU2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczNjA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzM2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczNjY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM3MTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Mzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczNzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzM4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzgxOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDA2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDEzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MTc7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQyOTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDM2OzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NjU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzQ2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDY4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0ODA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDgzOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUwODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTEzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MjU7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUzNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1Mzg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU0Mzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTUyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU1Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTYyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc1NjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU3MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NzM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU4NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1ODg7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjEyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MTc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzYyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyOTszNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY2Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjcxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc2NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY3NDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Njg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY4OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2OTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY5Mzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Njk5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MDk7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc0NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NDc7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NjE7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc2NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzY5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NzA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc3Njs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3ODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc4Mjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzg4Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3OTg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzgwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODA4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgxMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODEyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4MTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzgxODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4MjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODI3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc4MzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgzNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzgzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODM5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3ODQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc4NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg1MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODU5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3ODY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc4Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg2OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzg3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODczOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3ODc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4Nzk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg4Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzg5Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODk3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3ODk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4OTk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNzkwMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTA3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3OTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5MDk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNzkxNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzkyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTIyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3OTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5MzA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc5MzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzkzOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzk0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTQxOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTc5NDk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc5NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk1NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzk2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTYyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3OTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5NjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc5Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk2OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzk3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTc3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3OTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5ODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc5ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk4Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzk5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3OTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5OTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwMDE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODAwNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODAwNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDA5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODAxNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODAyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDI0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDMwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwMzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA0MDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNDY7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA2ODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODA3Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDgwOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA4NjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODA5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEwMTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MTA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMDY7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODExNDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMTc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTI0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEyNzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MTMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTM0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMzk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE1MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNTQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTYyOzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTg3Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxOTQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODE5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTk3OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyMTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODIxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjE0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgyMTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODIxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgyMjE7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODIyNzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgyNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI0MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNDY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgyNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI2MTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODI3Nzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjgzOzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMDg7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMjI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODMyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzI4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODMzMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzM3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM0NDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODM1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzNjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM2NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODM2Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzcxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNzM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgzNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM4MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODM4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mzg0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzOTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgzOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM5MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODM5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mzk3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0MDc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg0MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQxMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODQxODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDIyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NDI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0Mjc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDMyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NDU7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ2Mzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDczOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDk1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0OTk7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTA1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTE4OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTM3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NDE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODU0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTQ3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODU1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTYwOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTc5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1ODM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTg3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODU5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjAwOzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjI1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2Mjk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODYzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjMzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2NDI7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2NTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY1OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2NjM7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODY2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY3MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODY4MDs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Njg4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjkzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY5NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4Njk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2OTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODcwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzAxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODcxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzE0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODcxNzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MjU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODcyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzI4OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODczMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MzY7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODc0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzQ1OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODc1MDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3NTc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODc1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzYwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3NzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODc3Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Nzc4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODc4NTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4Nzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODc5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzkyOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODExOzEwOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODIxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg4MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODgyNDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4MzI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODgzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODM1OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4NDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODg1MDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODU2OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODcyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODg3ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODgzOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTAxOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MDc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODkxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTEzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODkxNjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MjQ7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODkyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTI4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NDA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk1Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4OTU2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5NTg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk2MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4OTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NjY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTc0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk3NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5OTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTkzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTAwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDA4OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTAyODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDM0OzIwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xOTA1NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDU4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDcyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNzg7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTA4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA4NzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTA5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEwMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTExMzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTE5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxMjY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTMyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTEzNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTQxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkxNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE0NDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTE1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTU0OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTE2OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTc0OzIzOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xOTE5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjAwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjE0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyMTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTIxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyMjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTIyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTIyOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjMzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyMzU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkyNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI0MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyNTE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkyNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI1ODsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkyNzA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI3NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTI3NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjgwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyODI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xOTI4OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTI5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mjk0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyOTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMwNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzA5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzMTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMxOTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTMyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzI5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzMzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMzNjsyMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM1OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzY2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzNjk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzNzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM4MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzgyOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTkzODk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM5Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDAxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MDM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDEzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MjE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQyNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDI5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQzOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ0NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDUxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTQ1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDU5OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDc1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk0Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ3OTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0ODU7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDkzOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTUwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTAyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1MDY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTUwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTEwOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1Mjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTUyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTI5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1MzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTUzNTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTQ1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTYwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU2Njs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NzM7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU3ODs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTg2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk1ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU4OTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU5OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjA0OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYwOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MTE7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjM2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NDA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTY0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2NDY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY1MTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTY1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjU4OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5Njc4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2ODI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTY4Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Njg3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk2ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY5MDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5Njk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2OTY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTY5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Njk5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk3MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTcwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3MDY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTcxMTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NzE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3MTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTcyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3Mjc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTczMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3MzI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTczNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTczODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NDA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc0NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NDc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc2MTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTc2Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzcyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk3NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc3NjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTc4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Nzg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc5MTs0NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODM4OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5ODU2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NjE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODY4Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk4NzY7MTA7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4ODY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTg4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODg5OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MDM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTkwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTA2OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkxMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTExOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MTc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTkyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkyNzszMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTk2MDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTY2OzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5OTg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDAwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDAxOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAwNzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMDE1OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMjE7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDAyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMDI3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDAzMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDM4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjAwNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMDQ0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNTA7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDA1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA2MDszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDA5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDkzOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTA3OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMTM7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAxNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE0NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxNDg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTU0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAxNjI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE2ODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAxODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE4NzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAyMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIwMjs0MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI0NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAyNTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMjU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjY1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNjk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI3MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjc3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyODE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI4OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjkyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyOTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAzMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMwMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzA0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMzEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzMTE7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMzIyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzMjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAzMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMyODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDMzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNDA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAzNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM0ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDM1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzUzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNTk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAzNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM2OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDM3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzgyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzODQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM4ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDM5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzkzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzOTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQwMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDQxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDExOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0MjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA0MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQyNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDQzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDMxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0Mzk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA0NDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ0ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDQ0OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDU0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NTY7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMDQ2Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDQ3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDcxOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDQ4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDgyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0OTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA0OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ5Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDQ5ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MDQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMDUxMTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTIxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MzE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUzNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTM4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NDc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU1NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTY1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTcyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1Nzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU3OTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwNTg2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1OTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU5Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDYwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjAzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2MDY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA2MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDYxMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDYxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjE2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2MjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA2Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDYyOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDYzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjMzOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDY0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjQ0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNjUyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2NTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA2NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY1ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwNjY1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2NzI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA2NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY3NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDY3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjc5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNjg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2ODU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY4OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDY5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjk3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcwNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzExOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcyNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzMwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDczNTsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDc2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzY1Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA3NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc3NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3Nzg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA3ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc4OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3OTM7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDc5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzk5Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgwNzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDgxNjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODIyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA4MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgyNjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODM4OzQ5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODg3Ozg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4OTU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDg5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODk4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwOTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MDk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDkxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTEyOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA5MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwOTE3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MjI7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDkyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTI4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA5MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkzMjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDk0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA5NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk0ODs0MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDk4OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTk0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwMDc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAxNjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxMDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwMjA7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA1MTszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNTU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEwNjc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA3MjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTA4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDg2Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEwOTM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA5ODsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTExMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTEyOzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTQzOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMTU5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNjQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE3NDsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTE5Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTk2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExOTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIwMTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxMjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMDQ7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMjQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTIyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyMjg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIzMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxMjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMzc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyNTA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI1NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxMjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNTk7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTI2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI2NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjY5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNzQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjc4OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyODY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTI4ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjkzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMDQ7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTMxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEzMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMxMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxMzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMTc7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEzMzc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM0MjsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTM2Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzcxOzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMzk5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MDQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE0MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MTk7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE0NDk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ1NDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxNDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NTc7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTQ2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDY2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE0Njc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ3Mzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0Nzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTQ4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDgxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTQ5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDk2OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTUyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTIzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE1MjU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUzMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNTMxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MzY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTU0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE1NDI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU0ODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTU2OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1Njk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTU3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTcxOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1ODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTU5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTkxOzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjE2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYyMjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjI3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE2Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYzMDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjQxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY0NDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY1MTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjU3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NjU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2Nzg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY4MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjg0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2ODk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTY5Mzs5OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzAyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcwNTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTcxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzE2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE3MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcxOTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3Mjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTcyODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzM0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE3Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NDI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE3NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc1MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NTU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE3Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NzE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTc3Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE3Nzk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc4NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxNzg4OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3OTQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTc5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzk3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxODA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MDg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTgxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODExOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgxODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxODE5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MjU7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTgzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE4MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgzMzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE4NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg0ODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE4NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg2NzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg4MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE4ODY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5MTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTkwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTA3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkxNDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTIxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MjY7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxOTU4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk2NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTcxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxOTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NzM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTk4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxOTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5ODc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk5NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTk4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMDQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIwMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAxNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDE3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMjE7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDMzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIwMzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA0Mjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNDk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjA1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDU0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNjU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDcyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwODI7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMDM7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjExMTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMTQ7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjEyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTIzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEyNjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMTMwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEzMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTMzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMzg7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjE0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE0ODsxMDswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yMjE1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTU5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjE2NDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTcwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIxNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE3MzsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIyMDI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIwNzsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjIyOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjM0OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjU1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNjA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjI2ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjczOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjgzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyODg7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMDU7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjMxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzIwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMjc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMyOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjMzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzM1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM0NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzUwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzU1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzNjA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM2NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzY3Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjIzNzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM3OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzg0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzOTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM5NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzk3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDA0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0MTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQxMzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MTg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0Mjg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDMyOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDM5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NDM7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0NjM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ2NzsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQ4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDg5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI0OTM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQ5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0OTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTA0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1MDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1MTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUxNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjUxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTE2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1MjA7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjUyNjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjUzNTs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NDM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU0OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTUyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU2MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTY2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NzM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU4MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU4Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTg3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1ODk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU5NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjAwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MDQ7MTQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI2Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYyODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjYzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjMzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2Mzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI2NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY0MTsxMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI2NTQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY1OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjY2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjYxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2Njk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI2NzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY3NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjY3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjc5OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjI2ODI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY4NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjg4OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjY5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjk5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MDI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjcxNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjcyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzIzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MjU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjczMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjczNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzM1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc0Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc1Mjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzU3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NTk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc2NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzcxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NzY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3ODM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc4ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzkwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjI3OTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODAwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjI4MDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgwNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODA5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgxOTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODI3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgzNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjg0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODQyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODU2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NjU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg3MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjg3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODc2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODc4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4ODI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg4NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjg5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODk0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkwNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTExOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTI4OzE4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjk0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTQ3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTQ5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk1Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjk2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTYxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk3MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjk3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTc0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5ODM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk4NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjk4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTkwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5OTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAwMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzAwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDA5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAyMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzAyMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDI3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAzMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzAzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDM3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNDQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA0OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDU0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNTg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA2NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNzQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA4MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDg1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwOTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwOTg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEwMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTA1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzExNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEzMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTM0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQ3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE2MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTY0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMxNjg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE3MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE3NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTc3OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjMxODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE4Mzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxOTM7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjAxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzIxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjE3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjMyMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIyNDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMzA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzIzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjM0OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzI1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjU1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMyNTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI2MTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNjg7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzI3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjc0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjMyNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI3ODsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzI5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMyOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI5OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzAxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMDU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzMxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzEyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzMyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzI1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjMzMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMyOTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzM4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzNDI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzM0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzUwOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzYzOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzNzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzNzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM3NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzc5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzODc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzkzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQwNTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDEyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MjA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQyOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDMyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0Mzk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0NDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ1MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQ1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ1OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQ2ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDcwOzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM0NzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0ODE7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzQ4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDg5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0OTM7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzQ5OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzUwNTs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzNTEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUxOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzUyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTIzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MjY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUzNDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU0MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTQ2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU1ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTYwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM1NjM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU2NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU2ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NzQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMzU4MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTg3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1OTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYwMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzYwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjAzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2MTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYxNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzYyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2MjM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYyOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzYzMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjM4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjM5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NDE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY1MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzY1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjU0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjYyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY2ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIzNjc1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2ODI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY4OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzY5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjkyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3MDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzcwMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzcwODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzEyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3MTc7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzI0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzM0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM3Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzczODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NDU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzc0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzQ5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzU4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NjI7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzc2Nzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NzU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzc4Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzg3OzM5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzODI2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MzA7Mzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM4Njk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg3NTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzg4ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM4OTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg5NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg5ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MDQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkxMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MTk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkyNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTMyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5Mzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk0Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzk0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTQ3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzk2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTYyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTcwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk3NjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzOTc5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTg0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM5ODg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk5MDs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzOTk2OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDAwNjs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0MDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAxOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDAyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDIzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAzMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDAzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNDI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA0OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA1NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNjE7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDA2Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA3NDs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0MDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA4Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDkxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDk4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEwNzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0MTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDExODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTE5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTI4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMzI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDEzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTM1OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE1MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTU1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTY5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNzQ7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE4MDs4OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTI0MTg4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxOTA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE5NTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0MjAwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyMDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDIxODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MjI1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMjk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQyMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIzMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDIzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyNDM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI0OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDI1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjUyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyNTY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQyNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI2Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDI3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjcyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Mjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyNzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQyNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDI4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjgzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Mjg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyODk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQyOTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI5OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzAxOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQzMDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMwOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMTU7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDMyMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzI4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMzI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzQzOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjQzNTA7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNjM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM3MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mzc2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Mzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNzk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM4NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mzg4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzkyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzOTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM5ODs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI0NDA2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MTA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQxNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MjM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQzMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDM5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ0NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDUwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NTY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ2NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ2NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDY4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NzE7MTQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0ODY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ4OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDk3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MDA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTE0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQ1MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUxODsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDUzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTM4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ1NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU0NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0NTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NDk7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ1NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTY0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1Njg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDU3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTcyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ1Nzg7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU4NjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0NTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1ODk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDU5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTk2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ1OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU5OTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0NjAzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NjA2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MTE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDYxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ2MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYxOTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDYzMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ2Mzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY0MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0NjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY0Nzs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjU0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NjI7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ2ODg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY5MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0Njk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2OTY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDcwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzAzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDcwNjszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDcxMTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzE3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDcyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MjU7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3NDM7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc0OTsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDc3ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3ODQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc4ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0Nzg5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3OTM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDc5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODAwOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4MDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgwOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0ODEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODIyOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODMzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MzY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg0NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDg0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODQ4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg1ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDg2Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODcwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NzI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg3ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDg4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODg0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4OTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg5NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDg5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODk5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MDc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkxNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTIyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5Mjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkzMTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0OTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MzY7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ5NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0OTUwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NTQ7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDk1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTYwOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ5NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk2Nzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0OTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTc1OzEyOzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTI0OTg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ5ODg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk5Mjs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0OTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5OTg7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDA1OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMTM7MTI7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotMjUwMjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAyNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDMwOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUwMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAzNjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNDM7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTA0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA1MTsxMjswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yNTA2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDY0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNzA7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDc2OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA4Mzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTA5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDkxOzEyOzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTI1MTAzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxMDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEwODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMTU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEyNDsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE0Mzs5OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTI1MTUyOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTY4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxNzI7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTc5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxOTE7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMTA7MTI7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotMjUyMjI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIyNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjI4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUyMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIzMjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTI0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI0NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjQ5Ozg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNTc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTI1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjYwOzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1Mjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyODY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTI4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mjg5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI5OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMDI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTMwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTMwOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzE0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUzMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMxODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTMyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzI5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMzMTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTM0OTszOzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTI1MzUyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzNTQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM1OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1MzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNjI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM3NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1Mzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNzc7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTM4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzgxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzODI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM4ODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1Mzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzOTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTM5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDAwOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0MjM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU0MzU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ0MTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1NDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQ0Njs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDUzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0NjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQ2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDY4OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDk2OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTUwMzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTA5OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU1MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTUxNTsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTUzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTM4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTU1MDs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTU3OzU0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNTYxMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjE2OzMxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNTY0Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NTI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjU4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY2Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjY3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU2Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY3MDsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Njk3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2OTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcwNDsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzMwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU3MzI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTczNzsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTc2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzYzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU3NjU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc3MDsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTc5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Nzk3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU3OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgwMDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTgxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU4MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgxNTszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTgyMDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODI1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTgzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODQwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU4NDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTg0NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU4NTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg1NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1ODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTg2MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODY1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4Nzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTg3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODgwOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU4ODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTg4Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU4OTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODk1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4OTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MDE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkwNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTA3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkxOTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTI5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5Mzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk0MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk1NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTYwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTY1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5Njk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk3MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTc2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5ODE7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTk4Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk5Mjs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1OTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDA3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMTE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMjI7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNjAyODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjAzMTs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI2MDM4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDM5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA0NTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI2MDQ4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA1NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDU5Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjYwNjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA3Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDgwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwODM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA4ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDkwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwOTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjEwNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjEwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTA5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxMTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxMjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjEyNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjEyNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTI3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxMzI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE0MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTQ1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTYyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNzA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE3NjsyMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxOTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjIwMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjIwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjAyOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjYyMDk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjIxNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjIyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjIxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMjg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjIzMTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjQwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MjQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNDI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyNDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI1MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjU0Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjYyNjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI2NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjY5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Mjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI3OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI4Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjkwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MjkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyOTU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjI5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzAwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMTM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzIxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYzMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMyNTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMzI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjMzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzM2OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM0MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNDY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjM0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjM1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzU1OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNjM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjM2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzcwOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2Mzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNzg7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjM4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzgzOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzkzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzOTg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjQwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDAzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MDg7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0Mjk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQzNDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2NDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0Mzc7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ0Mzs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NDg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDUxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjQ2Njs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDcyOzU4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjUzMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTM0OzQxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjU3NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTc5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU4Mjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1ODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTkxOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTk5Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2MDY7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjYzNjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NjQ0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjY1MTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjU3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY2NjM7NTswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yNjY2ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NjcwOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NzY7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3MDA7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjcwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3MDc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjcxMjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzE4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3MjQ7MzswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yNjcyNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzI5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3MzU7Mjc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2NzYyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3NjY7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc3NDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2Nzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzgyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3ODQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzkwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3OTU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjc5OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODA0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgwNzszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4MTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODE0OzM7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotMjY4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgxODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4MjE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODI0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgyNzszOzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTI2ODMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4MzE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODM0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgzNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4NDA7NDswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yNjg0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjg0Nzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODUzOzU4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjkxMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTE1OzQxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjk1Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTYwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY5NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk2Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjk3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTcyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTgwOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5ODc7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzAxNzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MDI1OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzAzMjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MDM4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwNDQ7NDswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yNzA0ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MDUwOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwNTY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwNjY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzA3Mjs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MDc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwNzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzA3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MDgwOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzA4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwODg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzA5MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MDk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwOTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzEwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MTAxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcxMDU7NTQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI3MTU5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcxNjE7MjE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI3MTgyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcxODQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNzE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MTg3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcxOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzE5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcxOTY7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MjAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcyMDI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzIwNzsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzIzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MjM3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcyNDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzI0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MjQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcyNTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzI1Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MjU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3MjU5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcyNjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjcyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzI2NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNzI3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MjcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3Mjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcyNzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjcyNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzI4MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNzI4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3Mjg3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3Mjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcyOTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjczMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzMwMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNzMwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MzA4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3MzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjczMTI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjczMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzMxODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNzMyNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MzI4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI3MzMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjczMzM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNzMzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MzM4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MzUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjczNTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzM1Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MzU3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjczNzA7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzM3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3Mzc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjczNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzM3OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI3MzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjczODM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjczOTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzQwMjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3NDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc0MTE7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzQxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3NDIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc0MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzQyMjsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzQ0OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3NDUzOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3NDY3OzE1OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTI3NDgyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc0ODQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzQ4ODs1OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjc1NDc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzU0OTs0NDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjc1OTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzU5NTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3NjAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc2MDI7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzYwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3NjA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc2MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzYwODsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzYyNzsxNTswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yNzY0MjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzY1ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3NjYyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjc2NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzY2NTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzY4MTs0OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTI3Njg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc2ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzY4NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3Njg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc2OTA7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc3MDU7NDswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yNzcwOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3NzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc3MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzcxMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3NzE4OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc3MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzcyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3NzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc3MjQ7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzc0MTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzc1NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3NzYwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3Nzc0OzExOzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTI3Nzg1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc3ODc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzc5MjsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzgxMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3ODE1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc4MTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzgyMDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzgzNDszNjswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yNzg3MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3ODcyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc4NzY7MzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc5MTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzkxNDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzkyODsxODswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yNzk0NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3OTQ4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc5NTI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNzk1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3OTU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc5NTc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNzk2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3OTYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc5NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzk2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3OTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc5NjU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzk2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3OTY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc5Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzk3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3OTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc5NzI7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjc5OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzk5MTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3OTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjc5OTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzk5Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4MDAyOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjgwMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODAwODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI4MDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjgwMTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yODAxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4MDE2Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjgwMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODAyNDsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yODA0ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4MDUzOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI4MDY3Ozc7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotMjgwNzQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yODA3Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4MDgxOzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI4MTExOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjgxMTY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjgxMzA7OTswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yODEzOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI4MTQxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjgxNDY7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjgxNzg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODE4MzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yODE5Nzs4OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTI4MjA1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjgyMDc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODIxMjszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yODI0Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4MjQ4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI4MjYyOzM7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotMjgyNjU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yODI2Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4MjcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjgyNzI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODI3Nzs2MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjgzMzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODMzOTs2MTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjg0MDA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODQwMjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yODQxNjsxNDswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0yODQzMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI4NDMyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg0MzY7NDI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI4NDc4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg0ODA7MzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjg1MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODUxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI4NTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg1MTc7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yODUyMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NTI0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI4NTM4OzM7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotMjg1NDE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yODU0Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NTQ3OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI4NTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg1NzI7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yODU3NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NTc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjg1Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODU4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODU4NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NTg5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4NTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg1OTE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg1OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODU5OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODYwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NjAzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4NjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg2MTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg2MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODYxODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODYyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NjIzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4NjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg2MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg2Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODYzMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODYzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NjM0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4NjM5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg2NDE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg2NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODY0Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODY1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NjUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4NjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg2NTU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg2NjQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODY2OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODY3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NjcxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4Njc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg2Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg2ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODY4MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4Njg4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4Njk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg2OTY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg3MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODcwMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODcwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NzA1OzE4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NzI0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4NzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg3Mjc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg3MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODczMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODczNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NzM1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4NzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg3NDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg3NDQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODc0OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NzUxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4NzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg3NjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODc2MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODc2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4NzY3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4Nzc0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg3Nzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODc4MDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI4NzgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg3ODc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg3ODg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODc5MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODc5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4Nzk0Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjg4MDE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg4MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODgwNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODgxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4ODExOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4ODE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg4MTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg4MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODgxOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODgyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4ODI1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4ODI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg4Mjg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg4MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODgzMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4ODM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4ODQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg4NDI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg4NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODg1MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4ODU1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4ODYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg4NjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg4NjY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODg2ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODg3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4ODczOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4ODc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg4ODA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODg4NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODg4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4ODkwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4ODk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg4OTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg5MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODkwNDsyMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg5MjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODkyODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODkyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4OTMwOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjg5Mzc7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4OTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg5NDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg5NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODk1NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODk1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4OTU4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4OTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg5NjI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg5Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODk2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODk2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4OTcwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4OTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg5NzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODk4MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODk4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI4OTg1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI4OTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjg5OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjg5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yODk5NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yODk5Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MDAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MDAzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkwMDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkwMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTAxMjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTAyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MDIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MDI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkwMjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkwMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTAzMTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTA0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MDQxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkwNDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkwNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTA1Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTA1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MDU4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkwNjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTA2ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTA3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MDc0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MDc3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkwODI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkwODM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTA4NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTA4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MDg5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkwOTY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkxMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTEwNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MTEzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkxMjA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkxMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTEyOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTEzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MTMyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MTQwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkxNDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkxNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTE0NjsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yOTE1NzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkxNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTE3MDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI5MTc0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkxNzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkxNzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTE4Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI5MTg2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkxOTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTIwMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTIwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MjA0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5MjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkyMTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkyMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTIxNDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTIyMTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI5MjI2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkyMzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkyMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTIzMjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI5MjM3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkyNDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjkyNDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTI0Njs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI5MjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkyNTM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yOTI1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MjU4OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5Mjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkyNzU7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTI4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MjgxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjkyODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTI4NTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTI5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5Mjk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjkyOTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTMwMjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTMxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MzE1OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjkzMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTMyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5MzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkzMjQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yOTMyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MzI4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5MzQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkzNDY7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTM1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MzUyOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5MzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkzNjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTM2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5MzY5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjkzNzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTM3NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5Mzc4OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5MzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjkzOTQ7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTQwMDs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NDA4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjk0MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTQxMTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTQyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NDI0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk0MjU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTQzMDsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTQ1NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NDU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk0NTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTQ2Mzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk0Njk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTQ3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NDcxOzM3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk1MDk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTUxNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NTE5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjk1MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTUyMjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk1Mjk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTUzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NTMyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjk1MzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTUzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NTM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk1Mzk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTU0NDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk1NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTU1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NTUzOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NTY2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk1NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTU3MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NTc1OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk1ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTU4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk1ODM7NDI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTYyNjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NjMyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk2MzY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yOTYzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NjM5OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk2NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTY0NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk2NDk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yOTY1MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk2NTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTY1Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NjYxOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5Njc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk2NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTY3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5Njc4OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5Njk5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk3MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTcwNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NzA4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjk3MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTcxMTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTcyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5NzI3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk3Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTczMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI5NzM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk3MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTczNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NzM3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk3NDI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk3NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTc1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk3NTk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk3NzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTc3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI5NzgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk3ODQ7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk4MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTgwNjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTgxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5ODE4Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk4MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTgyNjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yOTg0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5ODQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjk4NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTg0OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTg1Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5ODU2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5ODU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk4NTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk4NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTg2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTg2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5ODcwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5ODc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk4ODA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk4ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTg4NTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk4OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTg5NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTg5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5ODk5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5OTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk5MDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk5MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTkwNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTkxMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5OTE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5OTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk5MTg7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yOTkyMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5OTI1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5OTI2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk5MzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk5MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTkzMjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI5OTM5OzEzOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTk1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5OTUzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5OTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk5NTg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk5Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTk2ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5OTcxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5OTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk5Nzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjk5Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yOTk4MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yOTk4NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI5OTg4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI5OTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjk5OTA7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMzAwMDE7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAwMTQ7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zMDAxODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMDIyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMDIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAwMjY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zMDAzMDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDAzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMDM5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAwNDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzAwNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDA0ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDA1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMDU1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAwNTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzAwNjU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zMDA3MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMDc0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAwNzY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zMDA4MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMDg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMDg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAwOTA7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMDA5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMDk3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzAxMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDEwMjsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMDEyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMTI4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMwMTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAxNDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMDE0NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMTQ4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzAxNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDE1MTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMDE2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMTY0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzAxNjU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDE3MDsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMDE5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMTk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzAxOTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDIwMzsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMDIyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMjI0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzAyMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDIyNzsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMDI1MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMjU1OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzAyNjE7ODswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0zMDI2OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMwMjcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAyNzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMDI3NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMjc4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMjgxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAyODU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzAyODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDI4Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDI5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMjk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAyOTk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzAzMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDMwOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDMxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMzE0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMzE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAzMTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzAzMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDMyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDMyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMzI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMzI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAzMzA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzAzMzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDMzOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDM0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMzQxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAzNDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzAzNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDM0OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDM1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMzU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAzNjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzAzNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDM2NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDM3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMzcyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAzODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzAzODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDM4NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDM5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwMzk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwMzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzAzOTg7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNDE1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA0MTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA0MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDQyMTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDQzMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDQzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNDM1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA0NDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDQ0Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDQ1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNDU0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA0NTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA0NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDQ2Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDQ3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNDczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA0NzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDQ4MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDQ4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNDg1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNDkyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA0OTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDQ5ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDUwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNTA0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDUxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNTE1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA1MjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA1MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDUyNzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA1Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDUzODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDU0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNTQzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA1NDc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA1NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDU1MjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA1NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDU2Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDU2OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNTczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA1NzU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA1ODY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA1OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDU5MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDU5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNTk3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA2MDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA2MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDYxMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDYxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNjE1OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDYyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNjI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA2MzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA2MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDYzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDYzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNjM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA2NDM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA2NDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDY1MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDY1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNjU0OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzA2NTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDY2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDY2Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNjY2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA2Njg7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0zMDY3NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDY3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNjgwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNjg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA2ODU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA2ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDY5MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNjkzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA2OTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA3MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDcwMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDcwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNzA3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA3MTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA3MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDcxNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNzI0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA3Mjk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA3MzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDczOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDc0MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNzQyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA3NDc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA3NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDc1NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDc2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNzYxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwNzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA3NjQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA3NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDc3Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwNzc4OzIwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDc5ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwODAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwODAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA4MDQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0zMDgxMTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA4MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDgyMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDgyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwODI5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwODMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA4MzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA4MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDgzNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDg0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwODQyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwODQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA4NDQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA4NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDg1MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwODU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA4NTk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDg2NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwODY4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwODcxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA4NzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA4Nzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDg3OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwODg2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwODk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA4OTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA4OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDkwMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDkwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwOTA1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwOTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA5MTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA5MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDkyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDkyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwOTI2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwOTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA5MzI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDkzOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDk0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwOTQyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwOTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA5NDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA5NTE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDk1NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDk1NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwOTU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwOTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA5NjM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA5Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDk3MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMDk3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMwOTgwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMwOTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzA5ODc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzA5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMDk5NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTAwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMDAzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxMDA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzEwMDY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzEwMTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTAxODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTAxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMDIwOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMzEwMjc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzEwMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTAzNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTA0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMDQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxMDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzEwNDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzEwNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTA0ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTA1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMDUyOzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTA2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMDY0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxMDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzEwNjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzEwNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTA3MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMDc2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxMDgxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzEwODU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzEwODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTA4Nzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTMxMDk0OzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTEwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMTA5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxMTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzExMTQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxMTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzExMjU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzExMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTEzMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTEzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMTM0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxMTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzExMzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzExNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTE0MjsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzExNTM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTE1ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTE1OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMTYxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxMTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzExNjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzExNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTE2ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMTE3Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMTc3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMxMTc5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzExODI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMTE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMTg3OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxMjA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzEyMTA7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTIxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMjE2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzEyMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTIyMDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTIzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMjMyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxMjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzEyNDU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTI1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMjUzOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzEyNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTI1OTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTI3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMjc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzEyNzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTI4MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMxMjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzEyODQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzEyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTI5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxMjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzEyOTc7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzEzMTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTMxNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMxMzE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzEzMTk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzEzMjk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTMzMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMxMzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzEzMzc7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTM0NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMzQ5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzEzNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTM1MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTM2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMzY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzEzNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTM2NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTM3ODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxMzg0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzEzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTM4ODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxMzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzEzOTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTM5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNDAwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNDExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE0MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTQxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNDE0OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzE0MTk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE0MzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTQzOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMxNDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE0NDM7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE0NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTQ1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE0NTk7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTQ4MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE0OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTQ5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNDkyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNTA0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE1MDg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMTUxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNTEyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE1MjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTUyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNTI2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE1Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTUzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNTQwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNTUxOzg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE1NTk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMTU2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNTYyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE1NzU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTU3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNTc4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE1OTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTU5NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNTk5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzE2MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTYwNjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNjExOzM4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0zMTY0OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNjUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE2NTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTY1Njs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMxNjYwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE2NjQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMTY2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNjY3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE2ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTY4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNjgyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE2ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTY4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNjg2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE2OTE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTcwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNzAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTcwMzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTcxNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNzE3OzM5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0zMTc1NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNzU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE3NTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTc2Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMxNzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE3Njg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTc2OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNzc0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE3ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTc4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxNzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE3ODY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTc4ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxNzkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE3OTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTc5NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMxNzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE4MDA7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE4MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTgxNjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxODE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE4MTk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMTgyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxODI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE4MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTgyNjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxODMxOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE4Mzc7MTQ7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotMzE4NTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTg1Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxODU4OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxODkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE4OTQ7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE5MTU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTkyMDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxOTI2OzM7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotMzE5Mjk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTkzMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxOTM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE5Mzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTk0MTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMxOTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE5NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTk0NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMxOTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE5NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTk1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxOTUyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE5NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTk1NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxOTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE5NTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTk1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxOTU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE5NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTk2MTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMTk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMxOTc2OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMTk4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMxOTgyOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzE5ODk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzE5OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjAwMDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMDA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIwMDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjAwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMDA4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMDE4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIwMjM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMjAyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMDI3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzIwMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjAzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIwMzU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzIwNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjA0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIwNDk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzIwNjA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjA2NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMyMDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIwNjk7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjA3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMDczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzIwNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjA3NTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIwODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjA4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMDgzOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMDk2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIxMDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMjEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMTA1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMTE2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIxMjE7MzM7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTMyMTU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIxNTc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMjE1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMTYwOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzIxNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjE2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIxNjc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzIxNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjE4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMTgxOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIxODc7ODsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMjE5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMTk2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIyMDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjIwMjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMjA3OzUwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0zMjI1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMjYwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzIyNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjI2Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIyNzA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjI3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMjczOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMjg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIyODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjI4OTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMjk1OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzIzMDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjMwMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMzA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzIzMDc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjMxMjsyODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMzIzNDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjM0MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMyMzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIzNDY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzIzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjM1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyMzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzIzNTk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjM2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyMzY2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzIzNjc7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjM3NDsyNzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMzI0MDE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjQwNTs2MTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMzI0NjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjQ3MDszMDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMzI1MDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjUwNDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjUxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNTE2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyNTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI1Mjc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjUzNDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNTQwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI1NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjU1MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyNTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI1NTI7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjU1ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNTYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI1NjQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjU2OTsyMjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMzI1OTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjU5NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjYwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNjA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI2MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjYwNzszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjYzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNjM5OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyNjU5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI2NjQ7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjY3MDs3OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTMyNjc3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI2Nzk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjY4NDszNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjcyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNzIyOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyNzQzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI3NDg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMjc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNzUxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyNzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI3NjM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNzY2OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyNzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI3ODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjc4Nzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyNzkzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI3OTk7MTM7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotMzI4MTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjgxNDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyODIwOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyODM4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI4NDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjg0NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyODQ5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzI4NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjg1MjsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjg2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyODcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI4NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjg3Mjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI4ODI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjg4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyODg1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI4ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjg4ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyODg5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI4OTU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjkwMTs1OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTMyOTA2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI5MDg7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjkxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyOTE1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI5MjA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMjkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyOTIzOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyOTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI5NDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjk0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyOTQzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyOTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI5NTU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjk1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyOTU4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI5NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjk2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyOTYyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI5Njg7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMjk3NDs1OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTMyOTc5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzI5ODE7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMjk4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMyOTg4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzI5OTM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMjk5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMyOTk2OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzMDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzMwMTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzAxNTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzMDIxOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzMwMjc7NjswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0zMzAzMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzMDM1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzMwNDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzA0MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzMDQ2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzMwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzA0OTsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzA2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzMDY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzMwNjg7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzA3NDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzMDgwOzEwOzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTMzMDkwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzMwOTI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzA5NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzMDk4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzMxMDM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzEwOTszOzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTMzMTEyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzMxMTQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzEyMDs2MjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMzMxODI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzE4NTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzMTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzMxOTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzMTk1OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzMjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzMyMDk7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzMyMjQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzIyOTs2NzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMzMyOTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzI5OTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzMzA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzMzMDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzMzA5OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzMzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzMzMjc7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzMzMzg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzM0MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzM1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzMzU1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzMzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzMzNjY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzM3NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzMzgwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzMzODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzM4MzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzQwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNDAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM0MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzQwMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM0MTM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzQxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNDE2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzQxOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNDIwOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM0MjY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzQzMjs2OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTMzNDM4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM0NDA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzQ0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNDQ3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM0NTI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMzQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNDU1OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM0NzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzQ3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNDc1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM0ODc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzQ4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNDkwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM0OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzQ5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNDk0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM1MDA7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzUwNjs2OzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTMzNTEyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM1MTQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzUyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNTIxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM1MjY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMzUyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNTI5OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM1NDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzU0ODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNTU0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM1NjA7NzswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0zMzU2NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNTY5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM1NzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzU3NTs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNTgzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzM1ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzU4NjsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNjA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM2MDU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzYxMTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNjE3OzExOzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTMzNjI4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM2MzA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzYzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNjM2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM2NDE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzY0NzszOzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTMzNjUwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM2NTI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzY1Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM2Njc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzY2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNjY5Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM2Nzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzY4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNjgyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM2ODY7NDc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTMzNzMzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM3MzU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMzczNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNzM4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM3NDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNzUxOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM3NjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzc2Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzNzcyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzNzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM3ODQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM3OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzc5NTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzgxMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzODE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM4MTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzgxOTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTMzODIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM4MjI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM4Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzgzODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzODQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM4NDE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zMzg0NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzODQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM4NDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzg0ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzODUzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM4NTk7MzswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci0zMzg2MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzODY0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM4Njg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zMzg2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzODcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzM4NzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzg3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTMzODc3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM4ODA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzM4ODM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzg4NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMzg4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzODg5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMzODkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM4OTM7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zMzg5OTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzM5MDk7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zMzkxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzOTE3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMzOTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM5MjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzM5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzkyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMzkzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzOTMxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMzOTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM5MzQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzM5Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzk0MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMzk0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzOTQ3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMzOTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM5NTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzM5NTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzk2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMzk2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzOTYzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMzOTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM5NjU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzM5NzI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzk3NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMzk3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzOTgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTMzOTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzM5ODQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzM5OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zMzk5Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zMzk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTMzOTk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQwMDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDAwNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MDE0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQwMTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQwMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDAyMTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDAyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MDMwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQwMzM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQwMzg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDA0MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDA0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MDQ1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MDUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQwNTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDA2MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDA2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MDY4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQwNzI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQwNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDA3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MDgyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQwODk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDA5MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDA5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MDk2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQxMDQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQxMTE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDExNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDExNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MTE4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQxMjU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQxMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDEzMjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDE0MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MTQ1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQxNDc7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zNDE1MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MTU0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQxNTY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zNDE2MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDE2NTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM0MTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQxNzA7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zNDE3NjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQxODY7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zNDE5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MTk0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQxOTc7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQyMDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQyMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDIxMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDIxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MjE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQyMjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQyMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDIyNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MjMzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQyMzg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQyNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDI0NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDI1MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MjU2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0MjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQyNTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQyNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDI2Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDI2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MjY3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0Mjc0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQyNzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQyODE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDI4NDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM0Mjg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQyOTA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzQzMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDMwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM0MzAyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQzMDY7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNDMxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MzE0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM0MzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQzMjc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNDMzNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0MzM4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzQzNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDM0NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM0MzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQzNTA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzQzNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDM2Mzs1MTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMzQ0MTQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDQxNjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM0NDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ0MjQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNDQyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NDI4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM0NDM4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ0NDA7NTI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTM0NDkyOzk7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ1MDE7NTI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTM0NTUzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ1NTU7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNDU2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NTYzOzc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzQ1NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDU3MTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM0NTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ1ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNDU4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NTgyOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzQ1ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNDU4ODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NTk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0NTk3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ2MDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ2MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDYwMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDYxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NjExOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0NjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ2MTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ2MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDYyMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDYyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NjI1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0NjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ2MzI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ2Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDY0MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDY0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NjQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0NjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ2NTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ2NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDY1OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDY2Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NjcwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0NjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ2NzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ2NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDY3NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDY3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0Njc5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0Njg4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ2OTA7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zNDY5Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDcwMTs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM0NzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ3MDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ3MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDcxMzs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM0NzE5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0NzI1Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzQ3MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDczMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDczNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NzM3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0NzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ3NDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ3NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDc0NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDc0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NzQ3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0NzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ3NTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDc2Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDc2OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NzczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0Nzc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ3NzU7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zNDc3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0NzgyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0NzgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ3ODc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ3ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDc4OTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTM0Nzk2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0ODAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ4MDI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ4MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDgwODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDgxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0ODE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0ODE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ4MTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ4MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDgyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDgyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0ODI5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0ODM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ4MzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ4Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDgzODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0ODQ0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0ODQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ4NDk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDg1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDg2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0ODYyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0ODcwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ4NzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ4NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDg3Njs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTM0ODgzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0ODg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ4OTA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ4OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDg5NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDg5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0OTAwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0OTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ5MDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzQ5MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDkxMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNDkxNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0OTIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM0OTIyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ5MjU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNDkzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0OTMyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM0OTQzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzQ5NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDk0Nzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM0OTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ5NTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNDk1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0OTU4Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzQ5NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDk2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM0OTY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ5NzE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNDk3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM0OTc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzQ5Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNDk4MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM0OTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzQ5ODQ7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzUwMDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTAwOTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTAyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MDIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzUwMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTAyMzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1MDI5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUwMzM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTA0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MDQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzUwNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTA0NTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1MDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUwNTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTA1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MDUzOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzUwNjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTA2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1MDY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUwNjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUwNzA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTA3NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MDc2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUwODM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUwODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTA4Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTA5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MDk1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUxMDA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUxMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTEwNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTEwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MTEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUxMTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUxMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTEyMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTEyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MTI3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUxMzA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUxMzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTE0MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTE0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MTQ0OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzUxNDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUxNTI7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zNTE1NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MTU4OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzUxNjQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MTc0Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzUxODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTE4MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTE4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MTg1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUxODk7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUyMDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUyMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTIwMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTIwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MjEwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUyMTI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUyMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTIxODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTIyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MjI1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MjMxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUyMzU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTIzNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTI0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MjQxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUyNDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUyNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTI1MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTI1ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MjYyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MjY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUyNjc7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNTI3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1Mjc0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzUyNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTI3OTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1Mjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUyODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTI4ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MjkyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzUyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTI5NTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTMwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MzA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzUzMDg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTMxMzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1MzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUzMjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTMyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MzI0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzUzMjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTMyOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MzMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzUzMzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTMzNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1MzM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUzNDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUzNDQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTM0OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTM1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MzUxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUzNTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUzNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTM2Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTM2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1MzcwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUzNzM7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1MzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUzODQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzUzODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTM4Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTM5Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1Mzk3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1Mzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzUzOTk7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0zNTQwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTQxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NDExOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU0MTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU0MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTQyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTQyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NDI5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTQzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NDQwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU0NDM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU0NDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTQ1MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTQ1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NDU3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzU0NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTQ2NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM1NDY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU0Njg7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzU0ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTQ4MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1NDg0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU0ODg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNTQ5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NDk1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzU1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTUwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1NTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU1MDc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzU1MTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTUyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1NTIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU1Mjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU1MzA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTUzNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTUzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NTM3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU1NDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTU0OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NTU2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU1NjI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU1Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTU3MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTU3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NTc4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU1ODA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU1ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTU4Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTU5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NTkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU1OTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU2MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTYwMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTYwMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NjA4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NjA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU2MTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU2MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTYxNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTYyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NjIxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU2Mjc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU2MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTYzMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTYzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NjM1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU2NDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU2NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTY0OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTY1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NjU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU2NjE7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0zNTY2OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NjczOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU2ODE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU2ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTY4ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTY5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1Njk0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU3MDI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU3MDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTcxMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTcxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NzE3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzU3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTcyNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM1NzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU3Mjg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzU3Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTczOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1NzQwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU3NDQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNTc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NzUxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1NzYzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU3NjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTc2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1NzcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1NzczOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU3Nzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU3Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTc3OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTc4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1Nzg3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1Nzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU3OTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU3OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTc5OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTgwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1ODA2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU4MDk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU4MTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTgyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTgyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1ODIyOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMzU4MzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU4MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTgzMjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTgzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1ODQwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTg1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1ODUxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1ODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU4NTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU4NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTg2MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTg2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1ODY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1ODY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU4NzA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTg3NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTg3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1ODgwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1ODg2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU4OTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU4OTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTg5NTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM1OTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU5MDI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNTkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1OTEwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1OTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU5MjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTkyMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1OTI2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzU5MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTkzMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM1OTQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU5NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNTk0NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1OTQ5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1OTUyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU5NTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU5NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTk1ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNTk2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM1OTY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1OTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzU5NzA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzU5Nzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNTk3OTs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM1OTg1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM1OTkyOzc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzU5OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjAwMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MDA1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYwMDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYwMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjAxNTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjAyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MDIyOzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzYwMjg7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MDM4Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzYwNDU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjA1MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjA1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MDUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYwNTU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYwNjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYwNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjA2OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MDc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MDc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYwNzg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYwODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjA4NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjA5MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MDk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MDk2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYxMDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYxMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjEwMjs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTM2MTEwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYxMTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYxMjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjEyNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjEyNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MTI5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzYxMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjEzNjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2MTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYxNDM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzYxNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjE1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2MTU1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYxNTk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNjE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MTY2OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2MTg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYxODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjE4ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MTkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MTk0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYxOTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjIwMDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjIwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MjA4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYyMTI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYyMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjIxODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjIyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MjI1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYyMjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYyMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjIzMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjIzNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MjQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MjQzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYyNDY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNjI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MjUxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2MjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYyNjQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjI3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MjcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzYyNzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjI3NzsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjI5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MzAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzYzMDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjMwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjMxMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MzE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYzMTY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYzMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjMyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjMyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MzI4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYzMzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYzNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjM0MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjM0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MzQ0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYzNDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYzNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjM1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjM1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MzU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYzNjA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYzNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjM3MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjM3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2MzgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2MzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYzODM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzYzODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjM4Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjM5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2Mzk0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2Mzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzYzOTc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY0MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjQwNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjQwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NDA5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2NDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY0MTg7MTQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2NDMyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY0MzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjQzODszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM2NDQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY0NDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY0NDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjQ1MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjQ1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NDUyOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMzY0NTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjQ2Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjQ3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NDcxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2NDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY0NzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY0ODA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjQ4NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjQ4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NDg2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMzY0OTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY0OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjUwMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjUwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NTA3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2NTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY1MTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY1MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjUxNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjUyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NTIzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2NTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY1Mjg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY1MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjUzMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjUzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NTM4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2NTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY1NDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY1NTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjU1NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjU1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NTU5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzY1NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjU2NDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NTc3Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzY1ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjU4NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM2NTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY1ODk7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjU5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NTk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzY1OTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjYwMjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM2NjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY2MDU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjYxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NjEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzY2MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjYxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2NjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY2MTc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjYxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NjIwOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzY2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjYyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2NjI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY2Mjk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzY2NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjY0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2NjQ3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY2NTI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNjY1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2NjU5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY2NjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjY2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NjY4OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2Njg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY2OTA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjY5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NzAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzY3MDI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjcwNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjcwOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NzEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2NzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY3MTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY3MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjcyMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjcyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NzI3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2NzMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY3MzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY3MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjczNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjczOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NzQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2NzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY3NDQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY3NDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjc1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjc1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NzU4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzY3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjc2Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2NzY5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzY3NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjc3MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2Nzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY3NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjc3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2NzgxOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2Nzk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY4MDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNjgwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2ODA1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2ODA4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY4MTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY4MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjgxNDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjgyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2ODIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2ODI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY4MjY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY4MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjgzMjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjg0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2ODQyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2ODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY4NDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY4NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjg0OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjg1NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2ODU4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2ODYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY4NjM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNjg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2ODY4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzY4NzQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNjg3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2ODc5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzY4ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjg4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2ODgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY4ODc7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzY5MDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjkwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM2OTA4OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY5MTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY5MTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjkyMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2OTIzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2OTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY5MzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY5MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjkzNTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2OTQ1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2OTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY5NTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY5NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjk1NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjk1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2OTU4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2OTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY5NjI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzY5Njc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjk3MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjk3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2OTczOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzY5NzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNjk4MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjk4MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2OTg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM2OTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzY5ODc7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0zNjk5NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNjk5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM2OTk5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcwMDQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcwMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzAwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MDEyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcwMTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcwMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzAyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzAyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MDI4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcwMzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcwNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzA0MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzA0Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MDUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MDUyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcwNTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcwNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzA1OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzA2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MDY2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcwNzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcwNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzA3Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzA4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MDg0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcwOTA7MjA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MTEwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcxMTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcxMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzExNjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTM3MTIzOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzEzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MTM0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcxNDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcxNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzE0NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzE0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MTQ4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcxNTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcxNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzE1Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MTYyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcxNjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcxNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzE3MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzE3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MTc3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcxODA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcxODM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzE4ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzE4OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MTkxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcxOTg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcyMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzIwODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzIxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MjEyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcyMTc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcyMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzIyNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzIzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MjM0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcyMzg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcyNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzI0NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MjUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MjUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcyNTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcyNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzI2MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzI2Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MjY4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcyNzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzI3NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzI4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MjgxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzcyOTE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzcyOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzI5ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzMwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MzA1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzczMTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzczMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzMxNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzMyNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MzI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzczMzE7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMzczNDI7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzczNTU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zNzM1OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MzYzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3MzY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzczNjc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zNzM3MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzM3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3MzgwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3Mzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzczODU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzczODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzM4OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zNzM5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3Mzk2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3Mzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzczOTk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzc0MDY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zNzQxMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NDE1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3NDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc0MTc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zNzQyMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NDI2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM3NDI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc0MzE7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNzQzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NDM4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzc0NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzQ0MzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzQ1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NDYwOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzQ2NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM3NDY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc0NzA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc0ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzQ4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3NDgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc0ODc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNzQ5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NDkxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3NTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc1MDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzUwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NTA0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3NTE4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc1MjI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNzUyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NTI2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3NTM2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc1NDA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNzU0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NTQ0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc1NTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzU1NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM3NTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc1NjA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc1NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzU3MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3NTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc1NzQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc1ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzU4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3NTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc1ODg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc1OTk7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzYwNzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM3NjA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc2MTA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc2MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzYyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3NjIyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc2Mjc7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc2NTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzY1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3NjU2OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc2NjI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNzY2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NjY1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3Njc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc2Nzg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzY4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NjgxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3NjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc2OTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzY5NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3Njk5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzc3MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzcwNjs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NzEzOzM4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0zNzc1MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NzUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc3NTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzc1ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM3NzYyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc3NjY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zNzc2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3NzY5OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3NzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc3ODI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzc4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3Nzg0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc3ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzc4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3Nzg4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc3OTM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzgwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3ODAzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc4MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzgwNTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzgxNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3ODE5OzM1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0zNzg1NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3ODU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc4NTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzg2MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM3ODY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc4NjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzg2Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3ODcyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc4ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzg4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3ODgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc4ODQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzg4Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3ODkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc4OTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzg5NTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3OTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc5MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzkwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3OTA1OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3OTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc5MjY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzkzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3OTM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc5Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzkzODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzk1MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3OTU0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzc5NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzk1NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzk2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3OTY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzc5Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zNzk3MDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM3OTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzc5Nzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zNzk4MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM3OTg1OzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM4MDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgwMTc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzgwMjc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODAzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM4MDMyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgwMzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zODAzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MDQxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4MDQ0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgwNDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgwNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODA1MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODA1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MDU4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4MDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgwNjI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODA3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODA3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MDc3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODA4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MDg4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4MDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgwOTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgwOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODA5NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODEwMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MTA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4MTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgxMDY7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zODEwOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MTEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4MTE0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgxMTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgxMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODEyMDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTM4MTI3OzEzOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODE0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MTQxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4MTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgxNDY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgxNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODE1NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODE1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MTU5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4MTY0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgxNjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgxNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODE3MDsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0zODE4MTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgxOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODE5NDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM4MTk4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgyMDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgyMDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODIwNjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM4MjEwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4MjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgyMTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgyMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODIyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODIyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MjI4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4MjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgyMzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgyMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODIzODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODI0NTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM4MjUwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgyNTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgyNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODI1Njs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM4MjYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgyNjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzgyNjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODI3MDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM4Mjc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgyNzc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zODI4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MjgyOzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM4MzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgzMDg7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzgzMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODMyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM4MzI0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgzMjg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zODMzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MzMxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM4MzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgzNDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zODM0Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MzQ4OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM4MzcyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzgzNzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zODM3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4MzgxOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM4NDAyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg0MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zODQwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NDA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzg0MTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODQxMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODQxNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NDIwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg0MjI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODQzMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NDQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg0NDQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg0NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODQ1NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODQ1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NDU3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg0Njc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg0NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODQ3MTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg0ODE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODQ4NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODQ4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NDg4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg0OTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg0OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODQ5OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODUwNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NTA4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg1MTA7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg1MjM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg1Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODUyODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODUzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NTMxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg1Mzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg1Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODU0MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NTQ1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg1NTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg1NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODU1NDs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM4NTYwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NTY4Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzg1NzU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg1NzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODU4MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODU4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NTg1Ozk7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzg1OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODU5NTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM4NjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg2MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zODYwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NjA5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NjEyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg2MTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg2MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODYxODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg2Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODYyOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODYzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NjMzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg2Mzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg2NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODY0MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODY0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NjQ2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg2NTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg2NjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODY2NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODY2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NjY4OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzg2NzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODY3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODY3Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NjgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg2ODM7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0zODY5MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODY5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NzAwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg3MDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg3MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODcxMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODcxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NzE0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NzIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg3Mjc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg3Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODcyOTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTM4NzM2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg3NDY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg3NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODc1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODc1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NzU2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg3NjI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg3NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODc2NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODc3NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4Nzc4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4NzgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg3ODM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zODc4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4NzkwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzg3OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODc5NTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0zODgwNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM4ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg4MDk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzg4MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODgyMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM4ODIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg4MjQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzg4MzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODgzODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODg0MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4ODQ1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4ODQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg4NDc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODg1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODg1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4ODU3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4ODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg4NjM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg4Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODg2ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODg3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4ODczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4ODc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg4NzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg4ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODg4MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODg4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4ODg0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4ODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg4ODg7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zODg5NDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg5MDQ7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zODkxMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4OTE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4OTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg5MTg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg5MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODkyNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODkyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4OTI4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4OTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg5MzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg5MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODkzNTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg5NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODk0Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODk1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4OTUzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4OTU3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg5NjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg5NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODk2MzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM4OTY2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzg5NzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg5NzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODk3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODk3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4OTc3Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMzg5ODU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzg5ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zODk4OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zODk5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM4OTk0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM4OTk5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkwMDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkwMDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTAwODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM5MDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkwMTU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zOTAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MDE5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM5MDMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkwMzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkwMzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTA0MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTA0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MDQyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkwNDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkwNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTA1Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTA1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MDU5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkwNjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkwNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTA2Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MDc2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MDgyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkwODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkwODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTA4ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTA5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MDkzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkxMDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTEwMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTEwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MTEwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkxMTM7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zOTExOTsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkxMzg7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0zOTE0NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MTQ5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkxNTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkxNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTE1NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MTYyOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTE3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MTc1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkxNzg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkxODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTE4Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTE4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MTkwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MjAxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkyMDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkyMTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTIxODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTIxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MjIwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMzkyMjM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTIyNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTIyODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MjMyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkyMzQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0zOTI0MTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MjUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkyNTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkyNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTI2MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTI2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MjY2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkyNjk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkyNzQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTI3ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MjgwOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMzkyODc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkyOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTI5NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MzAxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkzMDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkzMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTMxMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTMxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MzE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkzMjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkzMjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTMyOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTMzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5MzMxOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMzkzMzg7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkzNTY7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5MzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkzNzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkzODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTM4MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTM4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5Mzg4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5Mzg5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzkzOTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzkzOTU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTM5Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTQwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NDAzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk0MDk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk0MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTQxNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTQxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NDE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk0MjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk0MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTQyMzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NDMyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk0MzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTQzOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTQ0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NDQ1OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTQ1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NDU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NDYwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk0NjI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk0NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTQ3Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTQ3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NDc4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk0ODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTQ4NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTQ4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NDg5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk0OTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk0OTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTQ5NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTQ5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NTAyOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMzk1MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTUwOTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM5NTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk1MTQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzk1MjY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zOTUyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NTMwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM5NTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk1NDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zOTU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NTQ1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM5NTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk1NTY7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zOTU2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NTY0OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM5NTgzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk1ODY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk1ODk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTU5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTU5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NTk1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NjAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk2MDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk2MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTYwNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTYxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NjEyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk2MTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk2MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTYxOTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTYyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NjI5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NjM1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk2Mzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk2NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTY0MTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTM5NjQ0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk2NDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk2NDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTY1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTY1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NjU1Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMzk2NjI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk2NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTY3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTY3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5Njc2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk2ODI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk2ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTY4NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTY4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NjkwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5Njk1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk2OTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk3MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTcwMTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTM5NzA4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk3MTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk3MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTcyMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTcyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NzI5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk3MzI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk3Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTczODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTc0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5NzQxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5NzQ2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk3NTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk3NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTc1Mjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTM5NzU5OzE3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5Nzc3OzE3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTc5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5Nzk1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5ODAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk4MDI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk4MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTgwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTgxMDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5ODE1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5ODE2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk4MTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk4MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTgyNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTgyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5ODMwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5ODM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk4MzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk4Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTgzODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTg0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5ODQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5ODQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk4NDQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk4NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTg1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5ODU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5ODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk4NjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk4NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTg2NjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk4NzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTg4MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTg4MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5ODgzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5ODkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk4OTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk4OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTg5OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTkwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5OTAzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5OTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk5MDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk5MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTkxMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0zOTkxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5OTEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTM5OTE0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk5MTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMzk5MjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0zOTkyMzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTM5OTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk5MzA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zOTkzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5OTM1OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMzk5NDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zOTk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5OTQ1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM5OTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk5NTY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zOTk1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5OTYwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM5OTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMzk5NzE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0zOTk3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTM5OTc5OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTM5OTk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAwMDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAwMDQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDAwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDAxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMDExOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAwMTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAwMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDAyMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDAyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMDI1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAwMzA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAwMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDAzNzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDA0Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMDUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAwNTI7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00MDA1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMDU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMDYwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAwNjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAwNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDA2Njs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQwMDczOzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDA4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMDg1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAwODk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAwOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDA5NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDEwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMTAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAxMDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAxMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDEwOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDExMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMTE0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMTIwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAxMjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAxMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDEyNjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQwMTMzOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDE0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMTQ2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAxNTA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAxNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDE1NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDE1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMTYwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAxNjk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAxNzQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDE3ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDE3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMTgwOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNDAxODc7MTY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAyMDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAyMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDIwODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMjE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMjE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAyMTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAyMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDIyNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDIzMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMjM1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAyMzc7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci00MDI0NDsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAyNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDI1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDI2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMjYxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAyNjg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAyNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDI3MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDI3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMjc1OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDI4NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMjg5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAyOTE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci00MDI5ODsxNjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAzMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDMxNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDMxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMzE5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAzMjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDAzMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDMyOTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDMzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMzM3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDM0Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMzUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwMzUzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAzNTg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MDM2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwMzY1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDAzNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDM3MDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MDM4MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQwMzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDAzODY7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDAzOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDM5OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQwNDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA0MDM7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDA0MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDQxNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQwNDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA0MjE7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDA0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDQzOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQwNDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA0NDM7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDA0NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDQ1NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQwNDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA0NjE7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDA0Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDQ4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQwNDgzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA0ODY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA0ODk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDQ5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDQ5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNDk1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA1MDE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA1MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDUwNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDUwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNTEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA1MTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA1MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDUyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDUyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNTI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA1MzA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA1Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDUzODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDU0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNTQzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA1NDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA1NDk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDU1NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNTU2OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNTY3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNTc2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA1ODA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDU4Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNTg3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA1OTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA1OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDU5ODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA2MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDYwOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDYxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNjE0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNjIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA2MjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDYyNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDYyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNjI5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA2MzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA2MzY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDY0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDY0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNjQzOzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDA2NDk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA2NTg7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00MDY2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNjY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA2NzA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA2NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDY3Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDY4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNjgzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNjg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA2ODk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDY5MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDY5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNjk0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNjk4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA3MDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDcwNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDcwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNzA4OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDA3MTQ7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNzI1Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDA3MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDczMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDczNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNzM2OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDA3NDI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDA3NDc7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00MDc1NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MDc1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNzU5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQwNzYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA3NjQ7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MDc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwNzcwOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQwNzg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA3ODg7MTA7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDA3OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MDc5OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQwODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA4MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MDgxMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwODE0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQwODI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA4MjU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MDgzMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwODM2OzU4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci00MDg5NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwODk2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDA4OTk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MDkwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQwOTAyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQwOTEyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA5MTY7NzA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTQwOTg2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDA5ODg7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDEwMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTAwNjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQxMDE0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDEwMTY7NDY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTQxMDYyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDEwNjQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MTA2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxMDY4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQxMDc4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDEwODM7Mzk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTQxMTIyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDExMjQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MTEyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxMTI4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDExMzc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTE0Mjs0NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNDExODc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTE4OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQxMTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDExOTM7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDEyMTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTIxNDsyOTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNDEyNDM7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTI1MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTI1Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxMjU4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxMjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDEyNjA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDEyNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTI2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTI2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxMjcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxMjczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDEyNzQ7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00MTI4MDsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDEyOTc7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00MTMwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxMzA1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxMzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDEzMDk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDEzMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTMxOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTMyNDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxMzI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxMzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDEzMzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDEzMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTMzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTMzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxMzM5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxMzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDEzNDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDEzNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTM1MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTM1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxMzU1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxMzYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDEzNjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDEzNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTM2NzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTQxMzcwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDEzNzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDEzNzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTM3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTM4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxMzgxOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNDEzODg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDEzOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTM5NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTM5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxMzk5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTQwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNDEwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxNDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE0MTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE0MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTQyMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTQyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNDI1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxNDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE0MzI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE0MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTQzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTQzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNDM3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxNDQwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE0NDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE0NDY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTQ0ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTQ1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNDUzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxNDYyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE0NjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE0Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTQ2ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQxNDc1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxNDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE0ODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTQ4NTsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE1MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTUwMzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE1MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTUxNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTUxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNTE4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxNTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE1MjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE1MzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTUzNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTUzNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNTM5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxNTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE1NDI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE1NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTU0ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTU1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNTUxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxNTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE1NjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE1NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTU2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTU2OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNTczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxNTc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE1Nzg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MTU4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNTg1OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQxNjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE2MTQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MTYyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNjIyOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQxNjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE2NDA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MTY0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNjQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDE2NTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTY1NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQxNjU4Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDE2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTY2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQxNjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE2Njg7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MTY3NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNjc5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDE2ODM7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MTY5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNjkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDE2OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTY5NDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQxNzAyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE3MDY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MTcxMDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MTcyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNzIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDE3MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTcyMzsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MTc0Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNzUwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDE3NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTc2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQxNzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE3NjI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MTc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxNzY2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDE3Njk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDE3ODE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTc4NTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQxNzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE3OTQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDE4MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTgwNTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQxODEwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDE4MTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTgxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQxODE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE4MTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE4MjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTgyNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTgyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxODI4OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTgzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxODM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxODQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE4NDM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE4NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTg0OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTg1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxODUyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxODU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE4NTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE4NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTg2MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTg2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxODY1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE4Njk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE4NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTg3NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTg4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxODgxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxODgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE4ODQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTg4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTg5MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxODk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxODk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE4OTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE4OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTkwMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTkwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxOTA1OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxOTE2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxOTIwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE5MjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTkyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTkyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxOTI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxOTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE5MzM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE5Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTkzODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTk0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxOTQxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxOTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE5NDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE5NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTk1MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTk1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxOTU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxOTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE5NjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE5NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTk2Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxOTcxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxOTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE5NzU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDE5ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MTk4NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MTk5MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQxOTk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQxOTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDE5OTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDIwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjAwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMDA3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyMDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIwMTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDIwMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjAyMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjAyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMDI2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyMDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIwMjk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDIwMzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjA0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjA0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMDQzOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDIwNDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjA1MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjA1MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMDU2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyMDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIwNTg7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci00MjA2NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjA3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMDc1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyMDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIwODE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDIwODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjA4NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjA4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMDg5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyMDk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIwOTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDIxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjEwMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjEwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMTA4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyMTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIxMTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDIxMTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjEyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMTIyOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNDIxMjk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDIxMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjEzOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjE0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMTQ2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyMTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIxNDk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDIxNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjE1NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjE1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMTU4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyMTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIxNjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDIxNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjE3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjE3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMTc3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyMTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIxODM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDIxODY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjE5MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjE5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMTk1OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDIyMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjIwMjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQyMjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIyMDc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDIyMTc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MjIyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMjIxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyMjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIyMzI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MjIzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMjM2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyMjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIyNDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjI0ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMjUyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDIyNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjI1NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjI2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMjY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDIyNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjI2OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyMjcxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIyNzU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MjI3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMjc5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDIyODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjI4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyMjg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIyODk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjI5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMjk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDIzMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjMwMTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjMxMTs5OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMzIwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDIzMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjMyMzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjMzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMzM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDIzMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjMzNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyMzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIzMzg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjM0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMzQxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDIzNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjM0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyMzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIzNTE7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDIzNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjM2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyMzcwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIzNzU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MjM4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyMzgyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDIzODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjM4Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyMzkxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI0MDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjQwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNDA0OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNDIwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI0MjQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MjQyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNDI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI0Mjk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MjQzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNDMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI0MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjQzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI0Mzc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjQ0ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI0NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjQ1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNDUyOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI0NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjQ2MTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI0NjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjQ2Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNDcyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDI0NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjQ3NTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjQ4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNDg5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjQ5MjszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI0OTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjQ5Nzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNTAzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI1MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjUxMDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI1MTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNTE3OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNTM2OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI1NDI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MjU0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNTQ2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI1NTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjU1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNTU5OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNTg2OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI1OTI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjYwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI2MDc7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjYyNjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjYzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNjM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI2Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjY0MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjY1MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNjU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI2NTc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjY2MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQyNjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI2NjU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI2Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjY3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI2ODE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjY5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNjkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI2OTI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjY5ODs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNzA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI3MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MjcwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNzA5OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNzIyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI3Mjg7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI3NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mjc0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI3NDg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00Mjc1MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNzU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI3NTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mjc2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQyNzYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI3NjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00Mjc2NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNzY4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyNzcxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI3NzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI3Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mjc3ODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI3ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mjc4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Mjc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyNzkzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyNzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI3OTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI4MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjgwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjgwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyODA2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyODEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI4MTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI4MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjgyMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyODIzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyODI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI4Mjc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI4MzY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mjg0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Mjg0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyODQzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyODQ5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI4NTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mjg1NTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTQyODU4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI4NjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI4NjM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mjg2NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Mjg2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyODY5Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNDI4NzY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI4ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mjg4NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Mjg4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyODkwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyODk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI4OTY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI5MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjkwNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjkwODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyOTEyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyOTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI5MTQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci00MjkyMTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI5MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MjkzNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MjkzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyOTM4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyOTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI5NDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI5NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mjk0ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Mjk1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyOTU3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQyOTYyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI5NjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDI5Njg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mjk3Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQyOTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDI5Nzg7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDI5OTU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00Mjk5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQyOTk5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzMDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMwMTA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MzAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMDE0OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzMDI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMwMjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzAyOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMDMzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDMwMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzAzNzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzMDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMwNDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzA0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMDQ4OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzMDY5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMwNzM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MzA3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMDc3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzMDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMwODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzA4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMDkwOzMzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzMTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMxMjQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzEzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMTM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDMxMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzEzNjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzE1MDs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMTU4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDMxNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzE2ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzMTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMxNzA7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDMxODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzE5MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzIwMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMjA0OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzMjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMyMjU7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDMyMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzIzNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzMjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMyMzg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMjQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDMyNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzI1MDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzMjUzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMyNTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzI1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMjYwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzMjYzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMyNjc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDMyNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzI2OTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMjc4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzMjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMyODI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDMyODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzI4ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzI5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMjkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzMjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMyOTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDMzMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzMwMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzMwNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMzEwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzMzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMzMTI7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00MzMxNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMzE5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzMzIwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMzMjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDMzMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzMyNzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQzMzM0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzMzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMzMzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDMzNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzM0Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzM0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMzQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzMzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMzNTE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDMzNTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzM2MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzM2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMzY0Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNDMzNzE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzMzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMzODI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDMzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzM4ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzM5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzMzk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzMzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDMzOTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzQwMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzQwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNDA3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzNDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM0MTA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzQxOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzQyNzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNDMyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzNDMzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM0MzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzQzODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzQ0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNDQyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzNDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM0NDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM0NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzQ1MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNDU1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzNDYzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM0Njc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzQ2OTs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQzNDc3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzNDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM0ODE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM0ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzQ4NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzQ4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNDkwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzNDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM0OTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM0OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzUwMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzUwNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNTA4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzNTEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM1MTM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00MzUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNTE3OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzNTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM1Mzc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzU0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNTQzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDM1NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzU0NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzU1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNTU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM1NjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzU2NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzU3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNTc1OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzU4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzNTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM1ODQ7Mjg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM2MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzYxMzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzYyNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNjI5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM2Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzYzOTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzNjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM2NDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzY0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNjQ2OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzNjcwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM2NzQ7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM3MDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzcxMzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQzNzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM3MjA7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzcyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNzI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM3Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzcyOTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00MzczOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNzQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mzc0MjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00Mzc1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNzUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM3NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mzc1NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00Mzc2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNzcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM3NzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mzc3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Mzc3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNzgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzNzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM3ODM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM3ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mzc4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Mzc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzNzkzOzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDM3OTk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM4MDg7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00MzgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzODE2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzODIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM4MjI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM4MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzgyNTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM4MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzgzNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzgzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzODQwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM4NDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM4NTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mzg1NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Mzg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzODU2OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Mzg2ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzODcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzODczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM4NzQ7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00Mzg3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzODgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzODgyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM4ODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM4ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mzg4ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQzODk1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzOTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM5MDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM5MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzkwODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzkxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzOTE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzOTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM5MTg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM5MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00MzkyNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00MzkyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzOTMwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzOTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM5Mzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM5NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mzk0Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Mzk0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzOTQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQzOTUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM5NTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDM5NTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mzk2MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQzOTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM5NjU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM5Nzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00Mzk4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQzOTgxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDM5OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Mzk5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQzOTkyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDM5OTY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00Mzk5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MDAwOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQwMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDAwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0MDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQwMDc7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQwMjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDAyODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ0MDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQwMzE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDAzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MDM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQwMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDAzOTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0MDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQwNDk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDA1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MDUyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQwNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDA2MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0MDYzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQwNjg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NDA3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0MDc1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQwNzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDA4MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MDg0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDQwODc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDA4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MDkwOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQwOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDA5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0MTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQxMDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NDEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MTA1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDQxMDg7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQxMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDEyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0MTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQxMjU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDEyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MTI4OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQxMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDEzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0MTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQxMzU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQxNDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDE1MDsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDE3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MTc4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQxODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDE4MTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0MTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQxOTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDE5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MTk0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQyMDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDIwNDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0MjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQyMTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDIxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MjE2Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQyMjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDIyOTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDI0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MjQxOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0MjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQyNTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDI1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MjYwOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQyNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDI2Njs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ0MjcxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQyNzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDI3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0Mjc3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQyODA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQyODM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDI4NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDI4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0Mjg5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0Mjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQyOTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQzMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDMwMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDMwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MzA3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0MzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQzMTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQzMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDMxNDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDMyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MzIyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0MzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQzMzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQzMzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDM0MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDM0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MzQyOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDQzNDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDM0OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDM1MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MzU0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0MzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQzNTY7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci00NDM2NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDM2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MzY4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0MzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQzNzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQzNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDM3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDM4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0MzgxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0Mzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQzODk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDM5ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDQwMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NDA3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NDA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ0MTI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NDQxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NDE5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDQ0MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDQyMzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDQzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NDM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ0MzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDQzOTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ0NDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ0NDY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDQ1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NDU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ0NTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDQ2MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDQ2NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NDY5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ0NzE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ0Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDQ3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDQ4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NDgzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ0ODg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ0OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDQ5NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDQ5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NTAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ1MDM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDUxMTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDUxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NTIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ1MjM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ1MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDUzMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDUzNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NTQxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ1NDM7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00NDU0Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NTUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NTUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ1NTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ1NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDU1Nzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQ0NTY0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ1NzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ1Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDU3ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NTg3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ1OTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ1OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDU5NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDU5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NTk5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ2MDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ2MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDYxMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDYxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NjE2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NjIxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ2MjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDYyNzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQ0NjM0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ2NDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ2NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDY0NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NjUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NjUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ2NTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDY2MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NjYzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ2Njc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ2NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDY3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDY3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0Njc3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0Njc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ2Nzk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDY4OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDY5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0Njk1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ0NzA0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ3MDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ3MDk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDcxMTsyOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDQ3NDA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDc0MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NDc0NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NzQ3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDQ3NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDc1MjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDc2NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ0NzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ3Njk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDc4MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ0NzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ3ODQ7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDc5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0NzkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ3OTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDc5Njs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ0ODAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ4MDQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDgxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0ODE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ4MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDgxNjs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0ODIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ4MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDgyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0ODI0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ4MjY7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDgzNDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ0ODM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ4Mzc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0ODQ0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ4NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDg0NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0ODQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ4NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDg1MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0ODU2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDQ4NjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDg2Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0ODY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ4Njg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDg3MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ0ODc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ4NzU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDg4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0ODg4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ4OTM7NTI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTQ0OTQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ5NDg7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ5Njc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDk3MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ0OTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ5NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDk3NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ0OTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ5ODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDk4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0OTgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ5ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NDk4NTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ0OTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDQ5OTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NDk5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ0OTk3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDQ5OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTAwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUwMDI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MDA1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUwMTY7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTAyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MDIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDUwMjI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTAyODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTAzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MDQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDUwNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTA0Mjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUwNDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTA1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MDUxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MDY0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUwNjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTA3MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MDc1OzI0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci00NTA5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MTAyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDUxMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTEwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MTA3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDUxMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTExMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUxMTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTExNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MTE1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDUxMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTEyNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUxMjc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTEyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MTMwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDUxMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTEzMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUxMzU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTE0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MTQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDUxNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTE0Nzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUxNTM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTE1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MTU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDUxNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTE1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUxNjA7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDUxNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTE3ODs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUxODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTE4NDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MTkwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUyMDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTIwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MjA1OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDUyMDg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTIxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MjE0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUyMTk7NTc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTQ1Mjc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUyNzk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NTI4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MjgyOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MzAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUzMDE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MzA0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUzMTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTMxNjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MzIyOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUzNDA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTM0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MzQzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDUzNDk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTM1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MzU1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUzNTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTM2MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1MzY1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDUzNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTM3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1MzcxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDUzNzY7MjM7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTQ1Mzk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU0MDI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NTQwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NDA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU0MDc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NTQxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NDExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU0MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTQxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU0MTU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTQyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NDI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU0MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTQyNzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU0MzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTQzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NDM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTQzODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTQ0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NDQ5OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU0NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTQ1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NDU1OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU0NjE7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTQ4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU0ODI7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU0OTU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTUwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NTAxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU1MDY7Mzk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTQ1NTQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU1NDg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NTU1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NTUxOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU1NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTU3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NTcyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTU4MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU1ODU7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU2MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTYwMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU2MDY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTYxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NjE2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU2MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTYxODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU2MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTYyNjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NjMyOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU2NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTY0MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU2NDM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTY0NTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NjUxOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU2Njk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTY3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NjcxOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU2NzQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTY3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NjgwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU2ODU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NTY4OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1Njk0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDU2OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTY5NzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTcxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NzE2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU3MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTcxOTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU3Mjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTczMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1NzMxOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU3Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTczODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NzM5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU3NDU7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTc2MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU3NjY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTc3Mjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1Nzc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU3Nzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTc4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1NzgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU3ODc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTc5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1Nzk3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDU3OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTgwMDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ1ODA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU4MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NTgxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1ODEzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ1ODE2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU4MjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU4MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTgyMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NTgyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1ODI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ1ODMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU4MzM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU4Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTgzODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NTg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1ODQ0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ1ODQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU4NDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU4NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTg1MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NTg1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1ODU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ1ODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU4NjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU4NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTg2NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NTg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1ODc0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ1ODgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU4ODQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU4ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTg4NjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTQ1ODg5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU4OTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU4OTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTg5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NTg5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1OTAwOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNDU5MDc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU5MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTkxNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NTkyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1OTIxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ1OTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU5Mjc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU5MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTkzMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NTkzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1OTM1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ1OTQwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU5NDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU5NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTk0Njs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQ1OTUzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ1OTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU5NjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU5NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTk2Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NTk3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1OTc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ1OTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU5Nzc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU5ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTk4MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NTk4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ1OTg2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ1OTkxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDU5OTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDU5OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NTk5Nzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQ2MDA0OzE3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjAyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MDIyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYwMzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYwMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjAzNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjA0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MDQxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYwNDY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjA0OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjA1NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MDU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MDYwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYwNjI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjA2ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjA3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MDcyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYwODA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYwODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjA4NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjA4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MDg5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYwOTM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjEwMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjEwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MTEwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYxMTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYxMTg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjEyMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjEyNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MTI2OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjEzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MTM4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYxNDg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYxNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjE1Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MTYyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYxNjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYxNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjE2OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MTcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYxNzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYxNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjE3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjE4MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MTg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MTg2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYxODg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYxOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjE5NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjE5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MjAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYyMDM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYyMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjIwOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjIxNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MjE5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MjIxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYyMjQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NjIzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MjMxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDYyMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjIzNjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NjI0ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ2MjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYyNTI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDYyNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjI2MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ2MjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYyNjc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDYyNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjI3ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ2Mjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYyODY7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDYzMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjMwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ2MzA2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYzMTA7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDYzMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjMyNzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NjMzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MzM4OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ2MzU3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYzNjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NjM2MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MzY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MzY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYzNzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYzNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjM3Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjM3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2MzgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2MzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYzODQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDYzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjM4OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjM5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2Mzk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2Mzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDYzOTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjQwMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjQwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NDA4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY0MTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY0MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjQxNTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjQyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NDI1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NDMxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY0MzU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY0MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjQzNzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTQ2NDQwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY0NDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY0NDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjQ0OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NDUxOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNDY0NTg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY0Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjQ2ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjQ3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NDcyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NDc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY0Nzg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY0ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjQ4MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjQ4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NDg2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NDkxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY0OTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY0OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjQ5Nzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQ2NTA0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY1MTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY1MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjUxODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjUyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NTI1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY1Mjg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY1MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjUzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjUzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NTM3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NTQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY1NDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY1NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjU0ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQ2NTU1OzE3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjU3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NTczOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY1ODE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY1ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjU4NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjU5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NTkyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY1OTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY1OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjYwMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjYwNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NjEwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NjExOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY2MTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY2MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjYxOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjYyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NjIzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NjMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY2MzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY2MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjYzNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjYzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NjQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY2NDQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY2NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjY1NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjY2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NjYxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY2Njc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY2Njk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjY3NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjY3NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2Njc3OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjY4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2Njg5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2Njk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY2OTk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjcwNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjcxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NzEzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY3MTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY3MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjcyMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjcyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NzIzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY3MjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY3Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjcyODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NjczMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NzM2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NzM3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY3Mzk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY3NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njc0Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Njc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NzUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY3NTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDY3NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njc2MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Njc2Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NzcwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ2NzcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY3NzU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00Njc4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2NzgyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDY3ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njc4Nzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ2NzkzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDY3OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njc5NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NjgwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2ODA4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDY4MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjgxMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NjgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2ODIzOzc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDY4MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjgzMTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00Njg0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2ODUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDY4NTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njg1NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ2ODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY4NTk7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00Njg2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2ODY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDY4Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njg2OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ2ODc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY4Nzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00Njg4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2ODgxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ2ODkxOzg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY4OTk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NjkwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2OTAyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ2OTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY5MTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NjkxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2OTE1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDY5MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjkxNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ2OTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY5MjA7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NjkyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2OTI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDY5Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NjkzMDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00Njk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2OTQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDY5NDk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njk1NDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ2OTYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDY5NjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njk2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ2OTY2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY5NzA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00Njk3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2OTc0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDY5NzU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00Njk3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2OTc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDY5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njk4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ2OTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY5ODM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDY5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Njk5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ2OTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDY5OTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00Njk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ2OTk4Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDcwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzAwNzs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MDExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDcwMTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzAxMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MDE4OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDcwMzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzAzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MDMzOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDcwMzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzA0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MDQxOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDcwNDc7Njk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTQ3MTE2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDcxMTg7Mjk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTQ3MTQ3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDcxNDk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NzE1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MTUyOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDcxNzE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzE3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MTc0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDcxODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzE4NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDcxODc7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDcyMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzIwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDcyMDc7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzIxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MjE2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDcyMTc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzIyMjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MjMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDcyMzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MjMzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDcyMzU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzI0MDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzI1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MjU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDcyNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzI2MDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MjYzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDcyNjg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NzI3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MjcxOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDcyOTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzI5Mjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3Mjk4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDczMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzMwMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MzAzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDczMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzMwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDczMDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzMxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MzExOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDczMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzMxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDczMTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzMxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MzE4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDczMjk7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzMzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MzM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDczMzU7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzM0MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ3MzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDczNDU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDczNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzM1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3MzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDczNjE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzM3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MzcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDczNzI7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzM4MDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3Mzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDczODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzM5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3MzkxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3NDA0Ozg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc0MTI7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDc0Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzQzMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3NDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc0MzI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzQzNDs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NDQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDc0NDI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzQ0ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3NDQ5Ozg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc0NTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00NzQ1ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NDYyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDc0NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzQ2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3NDY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc0NzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc0NzM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzQ3ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzQ3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NDgwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc0ODg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzQ5Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzQ5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NDk3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc1MDM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc1MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzUwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzUxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NTEyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc1MjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc1MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzUyMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzUyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NTI3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NTM0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc1Mzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc1Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzU0MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzU0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NTQ2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc1NTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc1NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzU1ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzU2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NTYyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc1Njc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc1NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzU3NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NTc5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc1ODI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc1ODg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzU5MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzU5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NTk0OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDc1OTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzYwMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzYwMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NjA2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc2MDg7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci00NzYxNTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzYyNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzYzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NjMxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc2Mzc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc2NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzY0NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzY0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NjQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc2NTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc2NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzY1Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzY2Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NjY2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc2Njg7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci00NzY3NTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc2ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzY4ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzY5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NjkyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3Njk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc2OTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc3MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzcwMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzcxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NzExOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NzE2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc3MjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc3MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzcyMjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTQ3NzI5OzE2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Nzc0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NzQ2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc3NTA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc3NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Nzc1NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Nzc1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3NzYwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3NzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc3Njg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc3NzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Nzc3NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Nzc3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3Nzc5Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNDc3ODY7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3Nzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc3OTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc4MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzgwMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzgwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3ODEwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3ODEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc4MTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc4MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzgxNzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc4Mjc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzgzMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00NzgzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3ODMzOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNDc4NDA7MTY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3ODU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc4NTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc4NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Nzg2MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Nzg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3ODY4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ3ODcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc4NzE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc4Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Nzg3OTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDc4ODk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00Nzg5MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00Nzg5NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3OTAwOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDc5MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00NzkwNzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ3OTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc5MTI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDc5MjQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00NzkyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3OTI4OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3OTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc5NDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00Nzk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3OTQ1OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3OTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc5NTk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00Nzk2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3OTYzOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3OTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc5ODE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00Nzk4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ3OTg1OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ3OTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDc5OTk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00ODAwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MDAzOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgwMjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODAyMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MDI2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDgwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODAzMDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgwNDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODA0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MDQyOzM2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MDc4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgwODI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00ODA4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MDkwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgxMDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODEwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MTA3OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgxMjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODEyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MTI4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDgxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODEzODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgxNDE7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDgxNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODE1OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgxNjI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MTcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDgxNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODE3NDsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODE5Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MTk2OzI1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci00ODIyMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MjIzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDgyMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODIyNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODIzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MjM3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDgyMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODI0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MjQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgyNDI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODI0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MjQ1OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgyNjI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODI2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MjY1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4Mjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgyNzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODI3Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MjgyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDgyOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODI5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgyOTQ7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDgzMDc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODMxMjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgzMjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODMyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MzI0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDgzMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODMyODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ4MzMxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MzQzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgzNDg7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODM1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4MzU3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgzNjg7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00ODM3MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4Mzc1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgzODA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODM4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4Mzg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDgzOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODM5MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4MzkzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDgzOTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODM5ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4NDAyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDg0MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODQwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4NDA4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDg0MTM7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDg0MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODQzNzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODQ1Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4NDYxOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4NDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDg0ODU7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDg0OTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODUwNDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODUyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4NTI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDg1MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODUyNzszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4NTMwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDg1MzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00ODUzNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4NTM5Ozc5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci00ODYxODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4NjIwOzcyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci00ODY5MjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4Njk0OzMwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci00ODcyNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ4NzI2OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4NzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDg3NTQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDg3Njg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODc3Mjs3OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNDg4NTE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODg1Mzs3MTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNDg5MjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODkyNjsyMjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNDg5NDg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODk1MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ4OTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDg5NTM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDg5Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODk2OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4OTcxOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDg5Nzc7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDg5OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00ODk5NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ4OTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDg5OTk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTAwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MDAyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkwMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTAwNTsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTAzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MDM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkwMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTAzNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTA0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MDQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkwNDg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTA1Mzs2NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNDkxMTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTEyMTs2MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNDkxODE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTE4NDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ5MTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkxOTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MTk1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkxOTc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTIwMjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ5MjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkyMDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTIwNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ5MjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkyMTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTIxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MjEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkyMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTIxNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ5MjE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkyMTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTIxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MjIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkyMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTIyMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MjMzOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkyMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTIzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ5MjM5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkyNDU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci00OTI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MjQ4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ5MjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkyNjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTI2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MjY0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTI3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ5Mjc1Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkyODI7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTI5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MjkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkyOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTI5MzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTMwNjs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MzEzOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ5MzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkzMzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTMzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MzMzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkzMzU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTM0MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ5MzQyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkzNDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTM0ODs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MzU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDkzNTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTM1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ5MzYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkzNjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTM2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5MzY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5MzcwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkzNzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDkzNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTM3Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTM4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5Mzg0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5Mzg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDkzODg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDkzOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTM5Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTQwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NDAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk0MDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk0MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTQwOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTQxNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NDIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk0MjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk0MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTQyNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NDMyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk0NDE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTQ0Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTQ1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NDUzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk0NTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk0NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTQ1OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTQ2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NDYxOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTQ3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NDcyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NDc4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk0ODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTQ4NTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTQ5Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTUwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NTAxOzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDk1MDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk1MTI7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00OTUxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NTIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk1MjM7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00OTUyOTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk1NDA7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci00OTU0Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NTUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk1NTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk1NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTU1Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTU2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NTY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk1Njg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTU3Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTU4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NTgyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk1ODU7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk1OTg7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NjA5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk2MTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk2MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTYxNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTYyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NjI0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk2Mjc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk2Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTYzMDs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTQ5NjM2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5NjQ1Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDk2NTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk2NTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTY1NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTY1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NjYyOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNDk2Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTY2ODsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTY4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NjgyOzEwOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTQ5NjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk2OTM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTcwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NzAzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDk3MDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTcwODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTcxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NzE5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNDk3MjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTczMDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci00OTc0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NzQ1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTQ5NzU5Ozk7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk3Njg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk3NzE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTc3NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5Nzc4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5Nzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk3ODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk3ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTc4ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTc5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5NzkyOzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDk3OTg7MTM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5ODExOzc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDk4MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTgxOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5ODIzOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTgzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5ODM0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5ODM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk4Mzc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk4NDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTg0ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTg0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5ODUwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5ODU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk4NTU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk4NjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTg2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTg2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5ODcwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNDk4NzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTg3NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTg3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5ODgyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5ODgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk4ODQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci00OTg5MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTg5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5ODk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5OTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk5MDI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5OTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk5MTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk5MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTkyMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5OTIzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5OTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk5Mjg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk5MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTkzNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTkzOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5OTQzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5OTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk5NDU7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci00OTk1Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTk1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5OTYwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5OTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk5NjQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk5NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTk3Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTk4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5OTgxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTQ5OTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNDk5ODY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNDk5OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci00OTk5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci00OTk5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTQ5OTk1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwMDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAwMDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTAwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDAwNzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDAxNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMDIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwMDIyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAwMjU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MDAzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMDMyOzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUwMDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAwNTc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MDA2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMDY1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUwMDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAwODA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MDA4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMDg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTAwOTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDA5NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUwMDk4Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTAxMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDEwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUwMTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAxMDg7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MDExNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMTE5OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUwMTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAxMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MDEzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMTM1Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTAxNDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDE0NzsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MDE3MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMTc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTAxNzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDE4MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDE4Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMTg3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwMTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAxODk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTAxOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDE5Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMjAxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwMjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAyMDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTAyMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDIxMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDIxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMjE5OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDIzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMjMxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwMjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAyMzc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTAyNDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDI0NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDI0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMjQ5OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTAyNTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDI1NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDI1Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMjYyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwMjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAyNjQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci01MDI3MTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDI4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMjgxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwMjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAyODc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTAyOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDI5MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDI5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMjk1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwMzA0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAzMDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTAzMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDMxMDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTUwMzE3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwMzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAzMjc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTAzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDMzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDMzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMzM3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwMzQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAzNDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTAzNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDM0Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDM1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMzU5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwMzYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAzNjQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MDM3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwMzcxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTAzNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDM3NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MDM4NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUwMzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTAzOTA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTA0MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDQwMTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUwNDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA0MDU7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTA0MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDQxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUwNDE3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA0MjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MDQyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNDI0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNDI3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA0MzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA0MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDQzMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNDQxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA0NDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA0NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDQ1Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDQ1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNDU3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNDYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA0NjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA0Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDQ3MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDQ3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNDc0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA0ODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDQ4NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDQ5MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNDk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA0OTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA0OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDQ5OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDUwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNTAyOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDUxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNTEzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA1MjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA1MjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDUyODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDUyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNTMwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTA1MzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDUzNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDUzODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNTQyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA1NDQ7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci01MDU1MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNTU2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA1NjE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA1NjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDU3MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDU3MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNTc1OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTA1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDU4MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUwNTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA1ODY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTA1OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDU5NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUwNTk4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA2MDI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MDYwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNjA5OzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUwNjM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA2NDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MDY0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNjQ1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNjQ4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA2NTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA2NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDY1NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDY1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNjYwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA2NjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA2Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDY3MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNjczOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNjc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA2Nzc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA2ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDY4Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDY5Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNjk3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA2OTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA3MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDcwNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDcxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNzExOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA3MTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA3MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDcyMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNzI0OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTA3MzA7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNzQ5Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTA3NTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA3NTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDc2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDc2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNzYzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNzY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA3NjU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA3NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDc3MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDc3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwNzc1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwNzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA3ODU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA3ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDc4OTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA3OTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDgwMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDgwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwODA1OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTA4MDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDgxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDgxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwODE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwODE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA4MTk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci01MDgyNjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDgzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwODM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwODM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA4NDA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA4NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDg0Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDg1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwODUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwODUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA4NTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA4NTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDg2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDg2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwODY1Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTA4NzI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA4ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDg4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwODg2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwODkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA4OTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA4OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDg5Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDkwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwOTAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwOTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA5MDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA5MTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDkxNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwOTE2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTA5MjM7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwOTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA5NDE7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwOTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA5NTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA5NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDk2Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDk3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwOTczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwOTc0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA5Nzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA5ODA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDk4Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MDk4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUwOTg4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUwOTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTA5OTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTA5OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MDk5OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTAwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMDAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxMDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTEwMDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTEwMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTAwODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMDE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxMDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTEwMjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTEwMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTAyNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTAyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMDMwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTA0MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMDQ0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxMDQ1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTEwNDc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTEwNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTA1Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMDYzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxMDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTEwNjc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTEwNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTA3MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTA3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMDc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxMDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTEwNzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTEwNzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTA4MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTA4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMDg3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTEwOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTA5NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUxMDk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTEwOTk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTExMTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MTExNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMTE1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxMTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTExMjY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MTEyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMTMwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxMTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTExNDE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MTE0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMTQ5OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxMTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTExNjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MTE2OTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMTc2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTExNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTE3OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MTE4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMTkwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTExOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTE5MzsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MTIyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMjIzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTEyMjQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTIyOTs0NDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNTEyNzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTI3NjsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MTMwMjs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMzA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTEzMTA7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTMxNzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUxMzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTEzMjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MTMyMzs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMzMxOzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxMzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTEzNjI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTEzNzM7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTM4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxMzgxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTEzODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MTM4NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxMzg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxMzkxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTEzOTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTEzOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTM5Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTQwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNDA1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE0MDk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE0MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTQxNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTQxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNDE4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE0MjI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTQzMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTQzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNDM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE0NDI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE0NDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTQ1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNDU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE0NTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTQ2NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTQ2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNDY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE0NzM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE0Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTQ3ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTQ4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNDg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE0OTE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE0OTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTUwMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTUwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNTA1OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTE1MDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTUxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTUxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNTE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE1MTk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci01MTUyNjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTUzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNTM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE1NDA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE1NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTU0Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTU1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNTUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE1NTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE1NTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTU2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNTY1Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTE1NzI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTU4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTU4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNTg2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE1OTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE1OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTU5Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTYwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNjAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE2MDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE2MTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTYxNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTYxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNjE2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTE2MjM7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE2NDE7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE2NTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTY2Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNjczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNjc0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE2Nzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE2ODA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTY4Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNjg4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE2OTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE2OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTY5OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTcwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNzAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNzA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE3MDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE3MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTcwODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTcxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNzE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE3MjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTcyNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNzMwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTc0MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNzQ0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNzQ1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE3NDc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE3NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTc1Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTc2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNzYzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE3Njc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE3Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTc3MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTc3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNzc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUxNzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE3Nzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTE3Nzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTc4MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MTc4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxNzg3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTE3OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTc5NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUxNzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE3OTk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MTgwNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUxODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE4MDk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTE4MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTgyMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUxODIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE4MjQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTE4MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTgzNTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUxODQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE4NDM7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTE4NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTg2MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxODYzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE4Njc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MTg3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxODcxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTE4ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTg4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxODgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE4ODM7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTE5MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTkwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxOTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE5MDk7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MTkxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxOTE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTE5MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTkyMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxOTIyOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE5Mjk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MTkzMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxOTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE5MzU7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTE5NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTk1MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxOTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE5NTI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MTk1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxOTU2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTE5NTk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTE5NzE7MTQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE5ODU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MTk4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxOTg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTE5OTA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MTk5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUxOTk0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTE5OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MTk5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUxOTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTE5OTg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjAwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyMDAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTIwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjAwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyMDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIwMDU7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTIwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjAxNjs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyMDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIwMjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjAyMjs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyMDMwOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyMDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIwNDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjA0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyMDUwOzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyMDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIwODI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjA4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyMDg0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyMDk0Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIxMDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjEwMjs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyMTA5OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyMTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIxMzI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTIxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjE0MzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjE2Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyMTY2OzUzOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01MjIxOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyMjI0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTIyMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjIyNzsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjI1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyMjUyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTIyNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjI1NDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyMjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIyNjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjI2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyMjY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTIyNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjI2NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyMjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIyNzA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTIyODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjI4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyMjgyOzg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIyOTA7NDA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTUyMzMwOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIzMzY7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTIzNjA7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjM2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyMzY4Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIzNzU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MjM3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyMzgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTIzODE7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjM4OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUyMzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIzOTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjM5NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUyMzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTIzOTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjM5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNDAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTI0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjQwMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyNDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI0MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjQwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNDA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTI0MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjQwOTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjQxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNDIwOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTI0MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjQyNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyNDI2Ozk7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI0MzU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MjQzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNDM4OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyNDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI0NzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjQ3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNDczOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTI0ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjQ4MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyNDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI0ODY7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTI1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjUwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyNTA2OzEwOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNTE2OzUzOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01MjU2OTs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNTc3OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyNjAxOzEwOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNjExOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTI2MTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MjYxNzs5OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNjI2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTI2Mjc7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjYzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyNjM2OzEzOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNjQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTI2NTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjY1MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUyNjU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI2NTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI2NjA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjY2NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MjY2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNjY3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyNjczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI2NzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI2Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjY3ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MjY4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNjgzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyNjg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI2OTA7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyNzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI3MDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI3MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjcwNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MjcwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNzEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyNzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI3MTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI3MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjcyMDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MjcyODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNzMyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyNzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI3MzQ7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01MjczNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNzQxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyNzQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI3NDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI3NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Mjc0ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTUyNzU1OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Mjc2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNzY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyNzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI3NzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI3NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Mjc3Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Mjc4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNzg0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyNzg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI3ODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI3OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Mjc5MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Mjc5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyNzk2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyODAyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI4MDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI4MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjgwODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTUyODE1OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MjgyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyODI4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyODMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI4MzI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI4Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjgzOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Mjg0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyODQyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyODUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI4NTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI4NTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Mjg2MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Mjg2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyODYyOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTI4Njk7MTY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyODg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI4ODY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI4ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Mjg5MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Mjg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyODk3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyODk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI5MDA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI5MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjkwODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MjkxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyOTE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyOTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI5MTk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci01MjkyNjsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MjkzOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Mjk0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyOTQzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyOTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI5NTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Mjk1MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Mjk1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyOTU3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Mjk2Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUyOTcxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUyOTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTI5NzM7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci01Mjk4MDsxNjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTI5OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Mjk5NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MzAwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzMDAxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUzMDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTMwMDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTMwMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzAxMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MzAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzMDE5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01MzAyOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzMDMzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTUzMDM1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTMwNDA7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MzA0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzMDQ3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTMwNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzA1MjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MzA2NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUzMDY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTMwNjg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTMwODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzA4MTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUzMDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTMwODU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTMwOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzA5OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUzMTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTMxMDM7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTMxMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzEyMTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUzMTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTMxMjU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTMxMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzEzOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTUzMTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTMxNDM7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTMxNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzE2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzMTYyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTMxNjY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MzE2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzMTcwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTMxNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzE4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzMTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTMxODI7NDM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTMyMjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzIyOTszODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MzI2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzMjY4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzMjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTMyODI7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTMyOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzMwMDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MzMxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzMzE0OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzMzMyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTMzMzg7NzA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTUzNDA4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM0MTA7NzA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTUzNDgwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM0ODI7NzI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTUzNTU0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM1NTY7Njg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTUzNjI0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM2MjY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MzYyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzNjI5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzNjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM2NDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MzY0MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzNjQ2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTM2NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzY1MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzNjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM2NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MzY2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzNjYyOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzNjg1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM2OTA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01MzY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzNjkzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzNzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM3MDQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MzcwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzNzA3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzNzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM3MTg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01MzcyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzNzI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTM3Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01MzczMDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzNzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM3NDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01Mzc0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzNzQyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTM3NDQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Mzc1MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzNzUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM3NTU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01Mzc1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzNzU4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzNzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM3Njk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01Mzc3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzNzcyOzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTUzNzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTM3OTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01Mzc5ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzODAzOzY1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01Mzg2ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzODcxOzY0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01MzkzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzOTM4OzUxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01Mzk4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTUzOTkyOzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU0MDE2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQwMjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NDAyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MDI0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTQwMjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDAyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU0MDI5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQwMzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQwMzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDAzOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDA0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MDQxOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDA1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MDUyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQwNTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQwNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDA1ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDA2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MDY3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MDY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQwNzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQwNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDA3NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDA4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MDgxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQwODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQwOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDA5MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDA5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MTAwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQxMDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQxMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDEwNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDEwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MTA4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQxMTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQxMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDEyMDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQxMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDEzMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDEzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MTM1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQxNDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQxNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDE0ODsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQxNTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDE2MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDE2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MTY0OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTQxNjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDE3MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MTcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQxNzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQxODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDE4Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDE4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MTg4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQxOTE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQxOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDE5ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDIwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MjAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQyMDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQyMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDIwOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MjE1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQyMjU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQyMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDIzMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDIzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MjM4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQyNDA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDI0Njs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU0MjUyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MjU1Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTQyNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDI2Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDI2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MjY5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQyNzI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQyODM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQyODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDI4Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDI5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0Mjk2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0Mjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQyOTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQzMDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDMwNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDMwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MzA4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQzMTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQzMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDMxODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDMyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MzIzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQzMjY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQzMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDMzMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDMzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MzM1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTQzMzk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQzNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDM0NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDM0OTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU0MzU0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQzNTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQzNjc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDM3MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0MzczOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0Mzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQzNzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQzODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDM4Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDM4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0Mzg5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0MzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQzOTM7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01NDM5OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDQwMjs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU0NDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ0MTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ0MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDQxNDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDQyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NDI0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NDI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ0Mjg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ0MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDQzMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDQzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NDM4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ0NDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ0NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDQ0Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDQ0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NDQ5OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTQ0NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ0NTg7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01NDQ2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NDY2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ0NzI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ0ODM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ0ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDQ4Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NDkzOzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDUwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NTA3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ1MDk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ1MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDUxNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDUxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NTE5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ1MjU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ1MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDUzNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDUzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NTQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ1NDQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ1NTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ1NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDU1ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDU2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NTYyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NTY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ1NzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDU3Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NTc5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ1ODQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ1ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDU4ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDU5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NTkzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ2MDM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ2MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDYwODsxMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ2MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDYyNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDYyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NjI2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTQ2MzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDYzMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDYzNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NjM3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ2Mzk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci01NDY0Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDY1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NjUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ2NTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ2NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDY2Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDY2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NjY4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ2NzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ2NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDY3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDY3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NjgwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0Njg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ2ODc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ2ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDY5MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDY5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0Njk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0Njk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ2OTg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDcwNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDcxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NzE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ3MTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ3MjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDcyNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDcyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NzI4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTQ3MzU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDc0MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDc0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NzQ1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ3NTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ3NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDc1NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDc2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NzYxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ3NjQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ3NzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDc3NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDc3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0NzgwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0NzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ3ODI7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTQ3OTM7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0ODE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ4MTg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01NDgyMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0ODI1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0ODI2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ4MzA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01NDgzNDsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ4NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDg1NDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU0ODU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ4NTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDg1OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDg2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0ODYzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0ODY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ4NzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDg3Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDg3Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU0ODgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ4ODU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDg4Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU0ODkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ4OTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ4OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDg5NzsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci01NDkwODsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ5MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDkyMTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU0OTI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ5Mjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ5Mjk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDkzMzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU0OTM3OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDk2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0OTY1OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTQ5NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDk2NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDk2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0OTcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0OTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ5NzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDk4MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NDk4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU0OTg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU0OTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTQ5OTA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTQ5OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NDk5Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NTAwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MDAyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU1MDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTUwMTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTUwMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTAxNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NTAyMDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU1MDI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTUwMjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTUwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTAzMDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU1MDM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTUwMzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTUwMzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTA0MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NTA0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MDQ0OzU7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTUwNDk7MTg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU1MDY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTUwNzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTUwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTA3Mjs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTU1MDc3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU1MDg2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTUwODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTUwOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTA5MTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTU1MDk2OzEzOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NTEwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MTEyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU1MTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTUxMTQ7NTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci01NTExOTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTUxMjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTEzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NTEzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MTM0OzU7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTUxMzk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTUxNDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTE1MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NTE1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MTUyOzU7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTUxNTc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTUxNjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTE2OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NTE3MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MTczOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTUxNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTE4MDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MjAxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTUyMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTIwOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU1MjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTUyMTM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTIxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MjIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTUyMjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTIyNDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU1MjI5Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTUyMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTIzODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTI1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MjU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTUyNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTI1NzsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1Mjc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTUyNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTI4MDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTMwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MzAzOzg3OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01NTM5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1MzkxOzg1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01NTQ3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NDc3OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTU0ODI7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU1MTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTUxNzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU1NTIyOzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NTU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU1NTc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NTY1Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTU3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU1NzU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU1ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTU5MTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTYwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NjAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU2MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTYwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NjA1OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTU2MTA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU2MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTYyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NjIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU2MjQ7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU2Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTYzODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU2NDE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTY0MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NjQ2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTU2NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTY0OTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU2NTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTY1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NjU5OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NjczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU2NzQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTY3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1Njc3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU2Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTY4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NjgxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU2ODU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU2OTc7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NTcwMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NzA0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU3MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTcwODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NzExOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU3MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NzI0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU3MzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTczNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NzM4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NzUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU3NTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTc1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NzU0OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU3NzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTc3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1NzczOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU3NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTc3NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1Nzc4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU3ODE7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NTc4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1Nzg0Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU3OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTc5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1NzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU3OTQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU4MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTgwNjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU4MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTgxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1ODExOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU4MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTgxNDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1ODIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU4MjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1ODIzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1ODM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU4MzU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1ODM4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTg0MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1ODQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU4NDY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU4NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTg1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1ODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU4NTk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTg2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1ODY5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU4NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTg3MTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTg4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1ODgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU4ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTg4NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTg5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1ODk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU4OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTkwMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1OTAyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU5MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTkwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1OTA5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU5MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTkxOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1OTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU5MjE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NTkyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1OTI1OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU1OTQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTU5NDc7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTU5NzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NTk3NDsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NTk5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU1OTk4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTYwMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjAwMTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYwMDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjAxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MDExOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYwMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjAyMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYwMjQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjAyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MDI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYwMjg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjAzMjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjA0NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU2MDQ4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYwNTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjA1MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MDU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYwNTc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NjA2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MDYyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYwNjM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjA2Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYwNzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjA3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MDc5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTYwODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjA4MzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjEwMTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU2MTA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYxMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjEwNzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MTE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYxMTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjEyMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MTI0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYxMzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjEzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MTM5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTYxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjE0Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MTQ5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTYxNTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjE1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MTU1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MTY1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYxNjg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NjE3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MTcxOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYxODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjE4ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MTkyOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MjEzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYyMTc7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjIyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MjI2Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYyMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjIzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYyMzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NjI0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MjQxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYyNTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjI1Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MjU4OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTYyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjI2NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU2MjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYyNzA7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjI3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2Mjc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYyNzc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjI4MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU2Mjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYyODc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjI5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2Mjk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYyOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjI5OTszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjMyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MzMwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYzMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjMzMzsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjM1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MzU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYzNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjM1ODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2MzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYzNjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjM2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2MzcwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYzNzk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjM4NTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU2Mzg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTYzODg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTYzOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjM5OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2NDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY0MDI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY0MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjQxODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU2NDI0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY0MjU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjQzMTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU2NDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY0MzQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjQ0NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2NDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY0NDk7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY0NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjQ2Mzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU2NDY5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY0NzA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjQ3NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU2NDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY0ODA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjQ4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2NDkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjQ5MjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjUwNzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2NTEzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY1MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjUyMDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2NTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY1MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjUyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2NTI3OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2NTU0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY1NjA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NjU2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2NTY0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2NTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY1NzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2NTc3OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2NjEyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY2MTg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NjYyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2NjIyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2NjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY2MzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2NjM3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2NjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY2NDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2NjUxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2NjYyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY2Njg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NjY3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2NjcyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjY4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2NjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY2ODQ7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjcwMzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjcxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2NzE0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2NzI4OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY3MzQ7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY3NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Njc2MjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01Njc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2Nzc4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2Nzg5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY3OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01Njc5NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2Nzk5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY4MDE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjgwNTszNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01Njg0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2ODQyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2ODUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY4NTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01Njg1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2ODU5OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2ODgyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY4ODY7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTY5MDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NjkxMTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NjkzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2OTM0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2OTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY5NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01Njk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2OTQ4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTY5NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Njk1MjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01Njk2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU2OTY4OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU2OTg2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTY5ODk7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTcwMTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzAxNTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NzAzNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MDM3OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU3MDY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcwNjc7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTcwOTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzA5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU3MDkzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcwOTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTcwOTg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzEwMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MTA1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3MTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcxMTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTcxMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzExMzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MTIyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3MTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcxMjk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTcxMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzEzOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzE0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MTQyOzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzE1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MTU3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3MTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcxNjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTcxNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzE2Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzE3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MTcxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3MTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcxNzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTcxNzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzE4MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MTgzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3MTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcxOTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTcxOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzE5NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzE5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MTk5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3MjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcyMDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTcyMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzIxMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MjE1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3MjIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcyMjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTcyMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzIyODszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU3MjMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcyMzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTcyMzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzIzODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MjQwOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTcyNDc7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3MjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcyNzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTcyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzI3NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzI4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3Mjg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3Mjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTcyODc7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNTcyOTg7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3MzEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTczMTE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01NzMxNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MzE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3MzE5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTczMjM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01NzMyNzsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTczNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzM0OTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU3MzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTczNTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTczNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzM1NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzM1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3MzU4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3MzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTczNjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTczNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzM3MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzM3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3Mzc2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3Mzg0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTczODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzM5MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzM5Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3Mzk3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTc0MDE7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3NDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc0Mjk7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01NzQzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NDMxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3NDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc0MzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTc0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzQzODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzQ0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NDQ1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3NDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc0NTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTc0NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzQ1NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzQ2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NDYxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3NDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc0NjY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTc0NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzQ3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzQ3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NDc4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3NDg2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTc0OTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzQ5NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzQ5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NDk2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTc1MDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzUwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzUwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NTA2OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTU3NTE3OzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzU0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NTQyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTc1NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzU0OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzU1MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NTU0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTc1NTg7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3NTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc1Nzg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTc1ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzU4Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01NzU5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NTkyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3NTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc1OTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTc1OTk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01NzYwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NjA3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3NjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc2MDk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01NzYxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NjE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3NjE5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc2MjE7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NzYyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NjI4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTc2MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzYzMzs0ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NzY4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NjgyOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU3NzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc3MDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NzcwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NzEwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU3NzI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc3Mjc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01NzcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NzMwOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU3NzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc3NTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01Nzc1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NzU3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTc3NjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01Nzc2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3NzYzOzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU3Nzk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc4MDE7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTc4MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzgyMDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NzgzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3ODM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTc4MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01NzgzNjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU3ODM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc4NDA7NDM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTc4ODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Nzg4NjsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NzkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3OTE0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU3OTI5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc5MzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01NzkzMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3OTM0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3OTM3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc5NDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTc5NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Nzk0Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Nzk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3OTQ4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3OTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc5NTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTc5NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Nzk1NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Nzk1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3OTU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3OTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc5NjA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTc5Njc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Nzk3MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Nzk3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3OTcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3OTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc5NzY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTc5ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01Nzk4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01Nzk4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU3OTg3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU3OTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTc5OTA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgwMDE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgwMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODAwNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODAwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MDA4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgwMTQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgwMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODAyMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODAyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MDI4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgwMzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgwMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODAzNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODA0MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MDQ0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgwNDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODA1MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODA1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MDU1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgwNjI7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgwNzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgwNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODA3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODA4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MDgxOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODA5MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MDk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgwOTY7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01ODA5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MTAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MTAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgxMDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgxMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODEwODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTU4MTE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgxMTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgxMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODEyMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODEyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MTI1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgxMzA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODEzODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODE0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MTQxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgxNTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgxNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODE1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODE1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MTU1OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODE2NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MTY5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MTcwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgxNzI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgxODM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgxODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODE4Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODE5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MTkyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgxOTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODIwMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODIwNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MjA3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgyMTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgyMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODIyMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODIyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MjI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MjMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgyMzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODIzNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MjQwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgyNDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgyNDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODI1MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODI1MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MjUzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgyNjM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgyNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODI3Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODI4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MjgzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4Mjg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgyODk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODI5NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MzAxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgzMDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgzMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODMxMzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODMyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MzIyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MzMwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgzMzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgzMzU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODMzNzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgzNDk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODM1MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODM1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MzYwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4MzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgzNjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgzNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODM3MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MzczOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4Mzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgzNzk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTgzODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODM4NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODM5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4MzkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4Mzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTgzOTU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg0MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODQwNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODQwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NDEwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NDE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg0MTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg0MTk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODQyMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODQyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NDI4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NDM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg0Mzg7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg0NDk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg0NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODQ1ODsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg0NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODQ3MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODQ3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NDc3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NDgzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg0ODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg0ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODQ4ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTU4NDk1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg1MDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg1MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODUwNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODUwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NTA5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg1MTM7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg1MjQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg1MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODUzMjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODUzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NTQwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg1NDM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg1NTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODU1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODU1NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NTU4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg1NjI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg1NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODU3MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODU3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NTc0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg1ODE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg1ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODU4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NTg3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NTk1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg1OTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg1OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODYwMDsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci01ODYxMTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg2MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODYyNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU4NjI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg2MzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg2MzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODYzNjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU4NjQwOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODY2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NjYyOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNTg2NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODY2NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODY2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NjY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg2NzE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg2Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODY4MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODY4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4Njg0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4Njg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg2ODk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg2OTc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01ODcwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NzA1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NzA2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg3MTA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01ODcxNDsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODc0MjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTU4NzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg3NDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg3NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODc0NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NzUxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg3NTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODc2MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODc2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4NzY3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg3NzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg3Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODc3OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01ODc4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4Nzg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4NzkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg3OTE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTg3OTk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01ODgwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4ODA3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg4MDk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci01ODgxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4ODE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU4ODE5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg4MjE7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01ODgyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4ODI4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTg4MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODgzMzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01ODg0NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU4ODUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg4NTE7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01ODg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4ODU2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTg4NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODg2MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU4ODY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg4Njg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01ODg2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4ODcyOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU4ODg2Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg4OTM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01ODg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4ODk3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTg5MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODkwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU4OTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg5MDg7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01ODkxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4OTEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTg5MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODkxNDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01ODkyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4OTMwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTg5MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODkzNDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01ODk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4OTQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTg5NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODk1MDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU4OTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg5NTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01ODk1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4OTU2OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU4OTc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg5Nzc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01ODk4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU4OTgyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTg5ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01ODk5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU4OTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTg5OTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01ODk5Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU4OTk3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5MDA3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkwMTI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01OTAxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MDE1OzMzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5MDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkwNDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTA1MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MDU0OzU0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01OTEwODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MTEwOzM3OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci01OTE0NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MTQ5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTkxNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTE1NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5MTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkxNTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTE1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MTU5OzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5MTkwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkxOTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01OTE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MTk4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTkyMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTIwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5MjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkyMDc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTIwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MjEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTkyMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTIxMjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTIyNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MjMwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTkyMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTIzMzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5MjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkyNDE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTI0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MjQ0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTkyNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTI1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5MjU1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkyNjA7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTkyODA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01OTI4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5Mjg0OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5MzAxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkzMDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTMwNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MzEwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTkzMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTMxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5MzE2OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkzMjI7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTkzMzk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01OTM0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MzQzOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5MzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkzNjA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01OTM2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MzY0OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5MzgxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkzODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTM4Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5MzkwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTkzOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTM5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5Mzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTkzOTU7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTk0MjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTQzMDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5NDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk0Mzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTQzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NDM5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTk0NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTQ0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5NDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk0NDQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTk0NTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTQ2MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU5NDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk0NjU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTQ3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NDczOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTk0NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTQ3Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5NDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk0ODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTQ4Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NDkyOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5NTEyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTk1MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTUxNjsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTUzMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NTM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTk1Mzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTU0Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU5NTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk1NDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTU0ODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NTU0OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5NTcxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTk1NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTU3NTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTU5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NTkyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTk1OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTU5NjsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTYxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NjE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTk2MTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTYyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5NjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk2MjM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci01OTYyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NjI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTk2Mjk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTYzMzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU5NjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk2MzY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTY0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NjQ0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTk2NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTY0Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5NjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk2NTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTY1ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NjYzOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5NjgzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTk2ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTY4NzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTcwMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NzA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTk3MDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTcxMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTU5NzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk3MTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTcxNjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NzIyOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5NzM5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTk3NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTc0MzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTc1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NzU3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNTk3NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTc2MTsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTc3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5NzgyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNTk3ODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTc4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTU5Nzg3OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk3OTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci01OTc5NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5Nzk2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5Nzk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk4MDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTk4MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTgwNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01OTgwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5ODA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5ODEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk4MTE7MTM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5ODI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk4MjU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTk4MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTgzMzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01OTg0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5ODQzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5ODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk4NDU7MTY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5ODYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk4NjI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTk4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTg2NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01OTg2OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5ODczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5ODc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk4NzU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTk4ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTg4NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01OTg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5ODg2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5ODkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk4OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTk4OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTg5NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01OTg5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5ODk5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5OTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk5MDI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTk5MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTkxMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01OTkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5OTE0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5OTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk5MjQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTk5Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTkyODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01OTkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5OTMzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5OTM2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk5NDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTk5NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTk0Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01OTk0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5OTUwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5OTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk5NTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTk5NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTk2MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01OTk2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5OTY1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5OTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk5Njk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTk5NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTk3NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01OTk3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5OTc5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5OTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNTk5ODY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNTk5ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci01OTk4OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci01OTk5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTU5OTk3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTU5OTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAwMDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDAwMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDAwNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMDExOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAwMTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAwMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDAxNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMDE5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAwMjk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAwMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDAzOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDA0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMDQ0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAwNDg7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAwNjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAwNjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDA2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDA2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMDcwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAwNzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAwNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDA3OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMDgyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAwODc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDA5Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDEwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMTAxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAxMTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAxMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDExMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDExODsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYwMTE5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMTIxOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjAxMjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAxMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDEyNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDEzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMTMyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMTM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAxNDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDE0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDE0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMTQ3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAxNTA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAxNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDE2MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDE2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMTY5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAxNzI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAxNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDE3Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDE4Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMTg3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAxODk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAxOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDE5NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDIwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMjA0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAyMDk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAyMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDIxNjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDIyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMjI1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAyMjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAyMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDIzMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDIzNTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYwMjM2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMjM4OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjAyMzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAyNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDI0NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDI1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMjU1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAyNTc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAyNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDI2NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDI3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMjc0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAyODE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAyODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDI4NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDI5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMjkyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMjk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAyOTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAzMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDMwMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDMwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMzA2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAzMTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAzMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDMxODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDMyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMzIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMzI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAzMjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAzMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDMzMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDMzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMzM0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAzMzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAzNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDM0Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDM1MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMzU0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAzNTY7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MDM1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMzYyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMzYzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAzNjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAzNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDM2ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTYwMzc1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwMzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjAzODQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjAzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDM4ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDM5NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwMzk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA0MDE7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNjA0MTI7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA0MjU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MDQyOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNDMyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNDMzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA0Mzc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MDQ0MTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjA0NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDQ2MzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYwNDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA0NjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjA0Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDQ2ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDQ3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNDcyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA0ODE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjA0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDQ4NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDQ4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNDkwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNDk4OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjA1MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDUwNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDUwNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNTExOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjA1MTU7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA1NDM7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MDU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNTQ1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA1NDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjA1NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDU1Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDU1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNTU5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA1NjQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjA1Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDU2ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDU3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNTc1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA1ODA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjA1ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDU4ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDU5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNTkyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNjAwOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjA2MDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDYwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDYwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNjEwOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjA2MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDYxODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDYxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNjIwOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTYwNjMxOzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDY1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNjU2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjA2NjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDY2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDY2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNjY4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjA2NzI7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA2OTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjA2OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDY5Nzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDcwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNzA2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA3MDk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjA3MTM7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MDcxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNzIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA3MjM7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MDcyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNzMxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYwNzMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA3MzM7NTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci02MDczODsxNjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjA3NTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDc1NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDc1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNzU5Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNjA3NjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjA3Njk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDc3MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MDc3NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwNzc2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjA3ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDc4Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYwNzg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA3ODg7NDI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjA4MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDgzMTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYwODQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA4NDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MDg0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwODQ1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYwODU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA4NjI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MDg2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwODY1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjA4NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDg3NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYwODc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA4Nzg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MDg4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYwODgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA4ODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MDg4NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwODg5OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYwOTI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA5Mjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MDkyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwOTMxOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYwOTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA5NTA7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjA5NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MDk2NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYwOTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjA5NjY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MDk2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYwOTcwOzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYwOTk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEwMDI7Mjg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjEwMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTAzMTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MTA0NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMDQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjEwNTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTA1MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTA1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMDU4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEwNjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjEwNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTA2NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTA2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMDY3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEwNzI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEwODM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjEwOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTA5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTA5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMDk1OzE3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMTEzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjExMTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjExMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTEyMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTEyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMTI3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjExMzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjExMzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTEzNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTEzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMTM5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjExNDY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjExNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTE0OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTE1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMTU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjExNjM7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjExNzQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjExNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTE4MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTE4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMTg0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjExODY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjExOTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTE5NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTE5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMTk2OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjExOTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTIwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTIwMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMjA2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEyMDg7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci02MTIxNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTIyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMjI0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEyMjg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjEyMzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTIzOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTI0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMjQxOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTYxMjUyOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTI2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMjY1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjEyNjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTI3MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTI3Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMjc3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjEyODE7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEzMDM7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MTMwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMzA1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEzMDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjEzMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTMxMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTMyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMzIxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEzMjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjEzMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTMzMDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTMzODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYxMzQzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEzNDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjEzNDc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTM1MTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYxMzU1OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTM4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMzgzOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjEzODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTM4NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTM4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxMzg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxMzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjEzOTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjEzOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTM5OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTQwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxNDA0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxNDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE0MDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjE0MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTQxNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTQxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxNDIwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxNDI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE0Mjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjE0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTQzMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTQ0MDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYxNDQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE0NDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjE0NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTQ1MDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYxNDU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE0NTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjE0NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTQ2MDsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci02MTQ3MTsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjE0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTQ5Njs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYxNTAwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE1MDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjE1MDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTUwODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYxNTEyOzE5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTUzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxNTMyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxNTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE1Mzc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjE1NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTU0NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTU0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxNTQ5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYxNTUzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjE1NTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTU2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTU2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxNTYzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjE1Njg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTU3MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MTU3MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxNTc1OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjE1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTU4Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYxNTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE1ODc7NDg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjE2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTYzNjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxNjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE2NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MTY0NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxNjUwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxNjY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE2Njc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MTY2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxNjcwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjE2Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTY4MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxNjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE2ODM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MTY4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxNjg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE2ODk7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjE3MjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTcyNzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYxNzI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE3MzA7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjE3NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTc1MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxNzUzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE3NTc7NDg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjE4MDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTgwOTszODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MTg0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxODQ4OzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxODc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE4Nzk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MTg4MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxODg1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE4ODk7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjE5MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTkwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxOTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE5MTA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MTkxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxOTE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE5MTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MTkxOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxOTIzOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxOTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE5NDI7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjE5NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MTk1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxOTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE5NTg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MTk2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYxOTYyOzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYxOTkxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjE5OTQ7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjIwMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjAyNTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MjA0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMDQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjIwNDQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjA0NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjA0OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMDUyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIwNTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIwNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjA1OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjA2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMDYxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIwNjY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjA3Mjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMDgyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIwODQ7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIwOTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjEwMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjEwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMTA2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIxMTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIxMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjExNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjExNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMTE4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIxMjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIxMjc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjEzMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjEzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMTMzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIxNDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIxNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjE0Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjE1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMTU0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIxNTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIxNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjE2MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjE2NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMTY4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIxNzA7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MjE3MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMTc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMTc3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIxODA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIxODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjE4Mjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTYyMTg5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIxOTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIyMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjIwMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjIxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMjEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIyMTU7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNjIyMjY7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIyMzk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MjI0MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMjQ2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMjQ3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIyNTE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MjI1NTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjI3NzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYyMjc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIyNzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIyODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjI4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjI4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMjg2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIyOTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIyOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjI5OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMzA0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMzEyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjIzMTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjMyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjMyMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMzI1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjIzMjk7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIzNTc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MjM1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMzU5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIzNjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIzNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjM2Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMzczOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIzNzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjIzODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjM4Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjM4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyMzg5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyMzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjIzOTQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjI0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjQwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjQwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNDA2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyNDE0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjI0MTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjQyMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjQyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNDI0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjI0Mjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjQzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjQzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNDM0OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTYyNDQ1OzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNDcwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjI0NzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjQ3NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjQ3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNDgyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjI0ODY7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyNTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI1MDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjI1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjUxMTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MjUxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNTIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyNTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI1MjM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjI1Mjc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MjUzMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNTM1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyNTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI1Mzc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MjU0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNTQ1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyNTQ3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI1NDk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MjU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNTU2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjI1NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjU2MTszODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MjU5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNjAwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjI2MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjYxMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyNjExOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI2MTQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjI2Mjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjYzMTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYyNjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI2MzQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MjY0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNjQ0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjI2NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjY0Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYyNjUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjI2NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjY1MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyNjU0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI2NTg7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjI2OTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjY5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyNjk3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI3MDA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MjcwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNzAzOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyNzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI3MjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MjcyMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyNzI1OzQzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyNzY4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI3NzI7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjI4MDQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MjgwODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyODEwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI4MTQ7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjI4Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjgyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyODI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI4MzA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MjgzNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyODM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI4Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MjgzOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyODQyOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyODYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI4NjE7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjI4NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mjg3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyODc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI4Nzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02Mjg4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyODgxOzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYyOTEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI5MTM7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjI5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MjkzOTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02Mjk1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyOTU3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjI5NTg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mjk2MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mjk2Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyOTY4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyOTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI5NzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjI5NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mjk3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mjk3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyOTc3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYyOTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjI5ODQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjI5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mjk5NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mjk5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYyOTk2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMwMDM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMwMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzAwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMDEyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMwMTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMwMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzAyMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzAyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMDI0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMwMzE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMwMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzAzNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzAzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMDQwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMwNDc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMwNTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzA1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzA1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMDU3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMwNjE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMwNjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzA3MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzA3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMDc0OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjMwNzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzA4MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzA4MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMDg0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMwODY7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci02MzA5MzsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMxMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzEwODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzExMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMTEyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMTIwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMxMjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMxMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzEyNTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci02MzEzNjsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMxNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzE0OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYzMTUzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMxNTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMxNTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzE2MTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYzMTY1OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMTg3OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjMxODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzE4OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzE5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMTkyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMxOTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMyMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzIwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzIwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMjA5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMyMTQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMyMjI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MzIyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMjMwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMjMxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMyMzU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MzIzOTsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMyNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzI2NzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYzMjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMyNjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMyNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzI3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzI3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMjc2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMyODM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMyODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzI4ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzI5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMjkyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMyOTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMzMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzMwNDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzMxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMzEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMzMTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjMzMjQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MzMyOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMzMyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMzMzQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MzMzOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMzQyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMzNDQ7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNjMzNTU7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMzODA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MzM4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzMzg3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzMzg4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjMzOTI7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02MzM5NjsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM0MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzQxNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzQyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzNDIxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzNDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM0MzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM0MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzQzMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzQzNzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYzNDQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM0NDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM0NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzQ0Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYzNDUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM0NTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM0NTc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzQ1OTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYzNDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM0NjY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MzQ3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzNDcxOzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYzNTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM1MDQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjM1MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzUyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYzNTIxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM1MjQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjM1Mzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzU0MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTYzNTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM1NDQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjM1NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzU2MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYzNTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM1NjM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MzU2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYzNTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM1Njk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MzU3MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzNTc0OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYzNjA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM2MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MzYxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzNjE2OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYzNjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM2MzA7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjM2NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzY0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYzNjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM2NDY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02MzY0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzNjUwOzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTYzNjgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM2ODM7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjM3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzcwNzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02MzcyMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzNzI0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjM3MjU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzcyNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzczMDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzNzM1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzNzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM3Mzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mzc0MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mzc0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzNzQ0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzNzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM3NTQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM3NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mzc2NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mzc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzNzY2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzNzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM3NzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM3ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mzc4MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mzc4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzNzg1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzNzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM3OTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM3OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mzc5MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mzc5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzNzk3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzODAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM4MDQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM4MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzgwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzgxMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzODE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzODE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM4MTg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM4Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzgyODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzgzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzODMyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzODQwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM4NDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mzg0NTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTYzODQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM4NTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM4NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mzg1Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mzg1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzODU4OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjM4NjQ7MTQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzODc4Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjM4ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mzg4NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mzg4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzODg5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzODk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM4OTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM5MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzkwMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzkwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzOTA3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzOTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM5MDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM5MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzkxMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzkxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzOTE1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzOTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM5MjI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM5Mjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02MzkzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02MzkzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzOTM0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzOTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM5Mzg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM5NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mzk0NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mzk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzOTQ4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzOTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM5NTI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM5NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mzk1ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mzk2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzOTY2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTYzOTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjM5Njk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM5NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mzk3MzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjM5ODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Mzk4NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Mzk4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTYzOTg4OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjM5OTQ7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MDE1Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjQwMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDAyMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDAyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MDI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQwMzA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQwMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDAzNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDA0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MDQxOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDA1MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MDU2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQwNTg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NDA2MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MDY1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MDY2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQwNzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDA3Mjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTY0MDc5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQwODg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDA5Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDEwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MTAzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQxMDU7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNjQxMTY7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQxMjk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NDEzMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MTM2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MTM3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQxNDE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NDE0NTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQxNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDE2NzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY0MTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQxNjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQxNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDE3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MTc2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQxODU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQxODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDE4OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDE5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MTk0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MjAyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjQyMDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDIxMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDIxMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MjE1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjQyMTk7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQyNDc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NDI0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MjQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQyNTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQyNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDI1Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDI2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MjYzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQyNjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQyNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDI3Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDI3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0Mjc5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQyODQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQyOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDI5MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDI5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0Mjk2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0MzA0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjQzMDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDMxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDMxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MzE0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjQzMTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDMyMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDMyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MzI0OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTY0MzM1OzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDM1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MzYwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjQzNjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDM2NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDM2ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0MzcyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjQzNzY7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0Mzk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQzOTY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ0MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDQwMTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDQwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NDEwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0NDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ0MTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ0MTc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NDQyMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NDI1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0NDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ0Mjc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NDQzMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NDM1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0NDM3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ0Mzk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02NDQ0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NDQ2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjQ0NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDQ1MTszODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NDQ4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NDkwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjQ0OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDUwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY0NTAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ1MDQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjQ1MTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDUyMTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY0NTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ1MjQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NDUzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NTM0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjQ1MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDUzNzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY0NTQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjQ1NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDU0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY0NTQ0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ1NDg7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjQ1ODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDU4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY0NTg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ1OTA7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjQ2MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDYwNDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NDYxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NjE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjQ2MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDYyMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY0NjIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ2MjQ7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjQ2NDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDY1MTsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NDY3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0Njc4OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY0NjkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ2OTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NDY5NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0Njk5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0NzAyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ3MDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ3MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDcwOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDcxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NzE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0NzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ3MTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ3MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDcyMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDcyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NzI3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0NzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ3Mzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ3Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDczOTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDc0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NzQ5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0NzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ3NTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ3NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDc1ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDc2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NzYzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0NzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ3NjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ3Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDc3MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0Nzc3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0NzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ3ODI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ3ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDc4NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDc4Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0NzkxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0NzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ3OTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ3OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDc5Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDgwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0ODA1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ4MDk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ4MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDgxNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDgyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0ODI0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0ODI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ4Mjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ4MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDgzMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0ODM4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0ODQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ4NDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDg0NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDg1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0ODU0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0ODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ4NTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ4NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDg2Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0ODY4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0ODczOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ4Nzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ4Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDg3OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDg4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0ODgyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0ODg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ4ODY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ4OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDg5MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDg5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0ODk1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0OTAxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ5MDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ5MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDkwNzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY0OTEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ5MTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ5MTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDkxNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDkxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0OTE5Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNjQ5MjY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ5MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDkzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NDkzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY0OTM5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY0OTQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ5NTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ5NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDk1MjsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci02NDk2MzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ5NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDk3Njs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY0OTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjQ5ODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjQ5ODQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NDk4ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY0OTkyOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MDE0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjUwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTAxNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MDE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1MDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUwMjM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjUwMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTAzMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTAzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MDM2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1MDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUwNDE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjUwNDk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NTA1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MDU3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1MDU4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUwNjI7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NTA2NjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjUwOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTA5NDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY1MDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUwOTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjUwOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTA5OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTEwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MTAzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1MTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUxMTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjUxMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTExNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTExODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MTE5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1MTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUxMjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjUxMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTEzMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTEzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MTM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1MTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUxNDM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjUxNTE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NTE1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MTU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1MTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUxNjE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NTE2NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MTY5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1MTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUxNzE7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNjUxODI7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1MjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUyMDc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NTIxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MjE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1MjE1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUyMTk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NTIyMzsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjUyNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTI0Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MjQ4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1MjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUyNTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjUyNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTI2MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTI2NDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY1MjY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUyNzI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjUyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTI3NDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY1Mjc5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUyODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjUyODQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTI4Njs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY1MjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUyOTM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02NTI5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1Mjk4OzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY1MzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUzMzc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NTM0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MzQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjUzNDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTM1MTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NTM2NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MzY4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjUzNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTM3MTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY1MzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjUzODE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NTM4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1Mzg0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjUzODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NTM4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1MzkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjUzOTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTM5NTszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NTQzMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NDMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjU0MzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTQzNzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NTQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NDU2OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY1NDY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU0NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NTQ3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NDcyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjU0NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTQ3NjsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NTUwNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NTA4OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY1NTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU1MzE7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjU1NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTU0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY1NTUwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU1NTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU1NTU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTU2MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTU2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NTYyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU1Njc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU1Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTU2OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTU3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NTc2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU1ODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU1ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTU4ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTU5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NTk1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NjAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU2MDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU2MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTYwNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTYwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NjA5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU2MTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU2MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTYxNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTYyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NjIzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU2Mjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU2MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTYzMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTYzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NjM5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NjQzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU2NDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU2NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTY0OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTY1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NjUyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU2NTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU2NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTY2MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTY2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NjY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU2NzM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTY4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTY4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1Njg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1Njg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU2OTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU2OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTY5NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTY5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NzAwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NzA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU3MDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU3MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTcwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTcxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NzEzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU3MTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTcyNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTcyNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NzMwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU3MzI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU3Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTczOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NzQzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU3NDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU3NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTc1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTc1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NzU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU3NjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTc2MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTc2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NzY3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1NzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU3NzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU3NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTc3NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTc3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1NzgwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1Nzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU3ODY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU3ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTc5MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTc5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1Nzk3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1Nzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU4MDA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTgwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTgxMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1ODE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1ODE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU4MTY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU4MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTgyMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTgyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1ODMxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1ODMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU4MzM7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NTgzNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1ODM5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1ODQwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU4NDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTg0NTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTY1ODUyOzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTg2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1ODY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1ODcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU4NzE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU4Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTg4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTg4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1ODg0OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTY1ODk1OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTkwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1OTA4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjU5MTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTkxNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTkxNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1OTIwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjU5MjQ7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1OTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU5NDY7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NTk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1OTQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1OTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU5NTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU5NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTk1NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTk2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY1OTY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY1OTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU5Njg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU5NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTk3Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NTk4MTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY1OTg2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjU5ODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjU5OTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NTk5NDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY1OTk4OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjAyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MDI2OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjYwMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjAyODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjAzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MDMxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2MDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYwMzU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjYwNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjA0Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjA0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MDQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2MDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYwNTE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjYwNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjA1ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MDYzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2MDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYwNzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjYwNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjA3NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjA4Mzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY2MDg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYwOTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjYwOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjA5Mzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY2MDk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYxMDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjYxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjEwMzsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci02NjExNDsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjYxMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjEzOTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY2MTQzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYxNDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjYxNDc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjE1MTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY2MTU1OzE5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjE3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MTc1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2MTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYxODA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjYxODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjE4OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjE5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MTkyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2MTk2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjYyMDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjIwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjIwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MjA2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjYyMTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjIxNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjIxNjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MjE4OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjYyMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjIyNTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY2MjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYyMzA7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjYyNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjI2MzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NjI3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2Mjc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjYyODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjI4MzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NjI5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MzAwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjYzMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjMwMzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NjMxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2MzE5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjYzMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjMyMjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY2MzI2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjYzMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjMyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY2MzI5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYzMzM7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjYzNjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjM3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY2MzcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjYzNzU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjYzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjM4OTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NjQwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NDAzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjY0MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjQwNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY2NDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY0MDk7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjY0Mzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjQ0MjsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NjQ2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NDY2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY2NDgxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY0ODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NjQ4NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NDg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NDg5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY0OTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY0OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjQ5NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjUwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NTAzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY1MDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjUxMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjUxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NTE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY1MTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY1MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjUyNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjUyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NTI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY1MzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY1MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjUzNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjUzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NTM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY1NDI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY1NDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjU1MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjU1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NTU0OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjY1NTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjU2MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjU2MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NTY0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY1NjY7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci02NjU3Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjU3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NTgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY1ODQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY1OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjU5MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjU5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NTk0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY1OTc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY2MDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjYwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjYwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NjEwOzU7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNjY2MTU7MzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NjQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY2NTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY2NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjY1MzsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci02NjY2NDsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY2NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjY3Nzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY2NjgxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY2ODQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY2ODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjY4OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY2NjkzOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjcxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NzE1OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNjY3MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjcxNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjcxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NzIwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY3MjQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY3MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjczMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjczNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NzM3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY3NDI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY3NTA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02Njc1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2NzU4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2NzU5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY3NjM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02Njc2NzsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY3OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Njc5NTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY2Nzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY3OTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY3OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjgwMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjgwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2ODA0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2ODEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY4MTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY4MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjgxNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjgxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2ODIwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2ODI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY4Mjc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY4MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NjgzMjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NjgzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2ODQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2ODQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY4NDQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY4NTI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02Njg1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2ODYwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2ODYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY4NjI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02Njg2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2ODcwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2ODcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY4NzI7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNjY4ODM7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2OTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY5MDg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NjkxMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2OTE1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2OTE2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY5MjA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci02NjkyNDsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY5NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Njk0NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Njk0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2OTQ5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY2OTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY5NTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY5NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Njk2MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Njk2NTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY2OTcwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY5NzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY5NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Njk3NTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTY2OTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY5ODM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjY5ODU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Njk4Nzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY2OTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjY5OTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02Njk5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY2OTk5OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3MDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjcwMTM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzAyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MDIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjcwMjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzAyNTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzAzOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MDQyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjcwNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzA0NTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3MDUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjcwNTM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzA1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MDU2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjcwNjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzA2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MDYyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjcwNjM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzA2NzszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzEwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MTA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjcxMDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzEwOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY3MTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjcxMTM7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MTIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjcxMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzEyNDsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzE0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MTQ5OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjcxNTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzE1NTsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzE4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MTgyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjcxODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzE4NTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3MTkzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjcxOTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzE5NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MTk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3MjAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjcyMDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjcyMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzIwNjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjcyMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzIxNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NzIyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MjIxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3MjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjcyMjc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjcyMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzIzMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NzIzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MjM0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3MjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjcyNDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjcyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzI0OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NzI1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MjU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3MjU5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjcyNjE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02NzI2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MjY2OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3Mjg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjcyOTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzI5MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3Mjk0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjczMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzMwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3MzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjczMDY7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjczMjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzMzMTsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzM2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3MzYxOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3Mzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjczODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzM4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3Mzg3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjczOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzM5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3Mzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjczOTg7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzQwMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3NDAzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjc0MDQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzQwNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NzQwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3NDEyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3NDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc0MTQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3NDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc0MjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc0Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzQyOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NzQzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3NDM2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3NDQwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc0NDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc0NDU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzQ0Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY3NDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc0NTI7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjc0NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzQ3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3NDc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc0Nzg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzQ4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3NDg4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3NTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc1MDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzUwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3NTA0OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3NTIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc1MjY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzUzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3NTM2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3NTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc1NDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzU0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3NTUwOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3NTY3OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc1NzM7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjc1ODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzU5MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY3NTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc1OTU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjc2MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzYwODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3NjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc2MTE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02NzYxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3NjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc2MTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzYxODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3NjIyOzQ5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3NjcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc2NzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzY3NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3Njc5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjc2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzY4MjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02NzY5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3Njk3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjc2OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzcwMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY3NzA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjc3MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzcwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3NzA3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc3MTE7NTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjc3NjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzc2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY3NzY4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc3NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02Nzc3MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3NzczOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3Nzc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc3Nzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc3ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzc4MTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc3OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzc5MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Nzc5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3Nzk2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3Nzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc4MDA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc4MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzgwNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NzgxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3ODEyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3ODE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc4MTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc4MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzgxOTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NzgyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3ODI3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3ODM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc4MzY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc4NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzg0Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Nzg1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3ODUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3ODU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc4NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzg1OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Nzg2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3ODYzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3ODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc4Njk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc4NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzg3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Nzg3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3ODc2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3ODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc4ODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc4ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzg4NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Nzg4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3ODg5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3ODk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc4OTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc5MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzkwMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NzkxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3OTExOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3OTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc5MTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc5MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzkxOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02NzkyMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3OTI1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3OTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc5Mjc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc5MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02NzkzNTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Nzk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3OTQ1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3OTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc5NTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc5NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzk1ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Nzk2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3OTYxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3OTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc5NjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc5Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzk2OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Nzk3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3OTcyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3OTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc5Nzg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc5ODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzk4OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02Nzk5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY3OTkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY3OTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjc5OTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjc5OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02Nzk5OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02ODAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MDA1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY4MDExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgwMTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjgwMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODAxNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02ODAxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MDIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY4MDIyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgwMjQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02ODAyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MDI5OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4MDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgwNDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODA1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MDUzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjgwNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODA1NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODA2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MDY5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjgwNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODA3MTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4MDgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgwODM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02ODA4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MDg3OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4MTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgxMDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODEwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MTA3OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4MTMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgxMzM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02ODEzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MTM3OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4MTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgxNTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODE1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MTU2OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4MTc5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgxODU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02ODE4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MTg4OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4MjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgyMDc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODIwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MjEwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjgyMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODIxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4MjE0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgyMTg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02ODIyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4MjI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgyMjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODIyOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MjMyOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjgyNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODI0MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4MjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjgyNDM7NDA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjgyODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODI4NDsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODMwMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4MzA2OzY5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci02ODM3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4Mzc2OzY4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci02ODQ0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4NDQ1OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci02ODQ2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4NDY3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjg0Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODQ3MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4NDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg0ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODQ4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4NDgyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjg0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODQ4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4NDg2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg0OTA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02ODQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4NDkzOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4NTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg1MTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODUxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4NTEzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjg1MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODUxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4NTE3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg1MjI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02ODUyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4NTI2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4NTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg1Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODUzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4NTQwOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4NTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg1NjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODU2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4NTYzOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4NTgwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg1ODU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02ODU4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4NTg5OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4NjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg2MDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4NjA4Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjg2MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODYxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4NjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg2MTk7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjg2Mzc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODY0MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY4NjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg2NDY7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjg2Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODY2ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4NjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg2NzA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjg2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODY4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4NjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg2ODQ7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjg3MDE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODcwNjs3MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNjg3NzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODc3OTs3MzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNjg4NTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODg1NTs1NDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNjg5MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODkxMjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY4OTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg5MTU7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjg5Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODkzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4OTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg5NDA7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjg5NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODk1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4OTYwOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg5NjY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjg5Nzc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02ODk4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY4OTgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjg5ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02ODk4ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY4OTkyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjg5OTY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTAwMTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY5MDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkwMDQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MDE0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjkwMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTAxNzsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTA0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MDQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjkwNDI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTA0Nzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5MDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkwNTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTA1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MDU4OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5MDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkwODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTA4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MDgzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjkwODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTA4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5MDkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkwOTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTA5NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MDk3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjkwOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTEwMDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5MTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkxMTA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MTEzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5MTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkxMjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTEyNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MTMxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjkxNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTE0MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5MTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkxNDM7MzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjkxNzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTE4MTsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTIxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MjExOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5MjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkyMzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTIzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MjM3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjkyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTI0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5MjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkyNDg7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTI1MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MjU1OzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5MjgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkyODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTI4NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5Mjg2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjkyODc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTI4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTI5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5Mjk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5Mjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkyOTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjkzMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTMwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTMwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MzA3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5MzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkzMTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjkzMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTMxOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTMyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MzIyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5MzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkzMjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjkzMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTMzMjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTMzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MzQwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5MzQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkzNDM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjkzNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTM1MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTM1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5MzU1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5MzYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkzNjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjkzNjU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTM2Nzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY5MzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjkzNzQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02OTM3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5Mzc4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5Mzg5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjkzOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTM5Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5Mzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk0MDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTQwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NDA0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjk0MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTQwNzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5NDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk0MTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTQxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NDE3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5NDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk0Mjk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NDMyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk0MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTQzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5NDM2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk0NDA7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTQ0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NDQ2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk0NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTQ0OTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTQ2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NDY0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTQ2NjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTQ3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NDc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk0ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTQ4MTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5NDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk0OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTQ5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NDkyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5NTAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk1MDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTUwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NTA4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjk1MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTUxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5NTE0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk1MTg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTUyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NTI0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk1MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTUyNzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTUzNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NTQxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNjk1NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTU0NDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5NTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk1NTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTU1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NTU0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk1NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTU2NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5NTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk1Njc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTU2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NTcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk1NzE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTU3Njs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5NTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk1ODI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTU4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NTg1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5NTk5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk2MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTYwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NjA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk2MDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTYxMTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY5NjE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk2MTg7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTYyNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NjI2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk2Mjc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTYyOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTYzMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NjM1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5NjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk2Mzc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjk2NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTY0NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTY0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NjUwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5NjUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk2NTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjk2NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTY1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTY2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NjYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5NjY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk2NjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjk2Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTY3MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTY3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5Njc2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5NjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk2ODE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjk2OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTY5MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTY5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5Njk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5Njk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk2OTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjk3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTcwMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTcwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NzA2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5NzA4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk3MTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjk3MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTcxNDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci02OTcyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NzIyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTY5NzI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk3MzE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNjk3MzM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTczNTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY5NzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk3NDA7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTc2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5NzY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk3Njc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci02OTc3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NzcxOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5Nzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk3ODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci02OTc5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTY5NzkxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5ODAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk4MDM7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk4MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTgyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5ODI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk4Mjg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk4Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTgzOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5ODQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk4NDE7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk4NjU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTg3MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTY5ODczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk4NzQ7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTg5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5ODk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk4OTU7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNjk5MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci02OTkxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTY5OTE4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk5MjI7NjU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTY5OTg3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNjk5ODk7MTg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTcwMDA3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAwMDk7NDI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzAwNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDA1Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcwMDU2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzAwNTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDA2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwMDYyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAwNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MDA2NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwMDY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwMDcwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAwNzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzAwNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDA3NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDA4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwMDgzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwMDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAwODg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzAwOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDA5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDA5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwMDk1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwMTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAxMDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzAxMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDEwNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDEwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwMTA4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwMTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAxMTI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzAxMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDExODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDEyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwMTIzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwMTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAxMzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzAxMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDEzNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDEzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwMTM4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwMTQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAxNDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzAxNTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDE1Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcwMTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAxNTc7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzAxNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDE3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwMTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAxODM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MDE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwMTg3OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwMjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAyMDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MDIwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwMjA5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwMjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAyMjE7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzAyNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDI0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwMjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAyNDQ7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzAyNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDI2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwMjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAyNjk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzAyNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDI4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwMjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAyODI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzAyOTY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDMwMjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcwMzA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAzMDU7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzAzMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDMyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwMzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAzMjg7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzAzNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDM1MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwMzUzOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzAzNjA7Njk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTcwNDI5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA0MzE7NjY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTcwNDk3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA0OTk7NDQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTcwNTQzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA1NDU7Mzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzA1ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDU4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwNTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA1ODc7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzA2MTE7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDYxOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwNjIwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA2MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MDYyMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwNjI1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwNjI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA2MzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzA2MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDYzMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDYzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwNjQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwNjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA2NDQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzA2NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDY1MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDY1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwNjYxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwNjYyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA2NjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzA2Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDY2ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTcwNjc1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwNjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA2Nzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzA2ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDY4MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDY4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwNjg0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwNjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA2OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzA2OTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDY5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDY5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwNjk4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNzA3MDU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwNzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA3MTY7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwNzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA3Mjc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzA3MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDczMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDczNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwNzM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwNzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA3NDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzA3NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDc0NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDc1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwNzUzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwNzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA3NTc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzA3NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDc2NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDc2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwNzY4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNzA3NzU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwNzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA3ODY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzA3OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDc5Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MDc5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwODAwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwODA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA4MDU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcwODE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA4MTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzA4MjA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDgyMjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcwODI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA4Mjc7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzA4NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDg0MjszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA4NDY7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MDg1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwODUyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwODYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA4NjQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MDg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwODc0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwODg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA4ODY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MDg4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwODkwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzA4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDg5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwODk0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA4OTc7MzI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTcwOTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA5MzA7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzA5NTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDk2MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcwOTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA5NjU7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzA5NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDk3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcwOTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzA5Nzg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MDk4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcwOTgxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzA5ODI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MDk4NjsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTAwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMDA2OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzEwMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTAxMDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTAyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMDI4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMDM5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzEwNDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTA0MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMDQ2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzEwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTA0OTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMDYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzEwNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTA2NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMDY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzEwNjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTA2OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMDczOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzEwOTM7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzExMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTExMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzExMTM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzExMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTEyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzExMjg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTEzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMTMxOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzExNDk7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzExNjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTE2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMTY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzExNzA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MTE3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMTczOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzExODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMTg3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzExODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTE5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMTkxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzExOTU7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzEyMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTIxNTszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzEyMTk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzEyMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTIzMTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTI1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMjUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzEyNTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTI1NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcxMjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzEyNjA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzEyNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTI3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzEyNzU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMjc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzEyNzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTI4MzszMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTMxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMzE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzEzMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTMxOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTMzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMzMyOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzEzMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTMzNjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTM0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMzQ5OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxMzY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzEzNzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTM3MjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMzc0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzEzNzU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTM3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MTM4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMzgzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcxMzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzEzODU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzEzOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTM5MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MTM5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxMzk3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcxNDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE0MDQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcxNDE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE0MTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzE0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTQxOTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTcxNDIyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE0MjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzE0MjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTQyOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MTQzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNDMxOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNzE0Mzg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzE0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTQ0ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MTQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNDUwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcxNDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE0NjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzE0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTQ2NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MTQ2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNDY5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcxNDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE0NzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzE0Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTQ3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MTQ4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNDgzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcxNDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE0ODY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzE0OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTQ5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MTQ5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNDk1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcxNDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE1MDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzE1MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTUwNDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MTUxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNTE0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcxNTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE1MTc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzE1MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTUyNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03MTUzMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNTM1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTcxNTM3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE1Mzk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MTU0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNTQ0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxNTU5Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzE1NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTU2NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTU3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNTc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzE1Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTU4MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcxNTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE1ODY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzE2MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTYwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxNjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE2MDM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzE2MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTYxODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcxNjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE2MjI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzE2MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTYzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxNjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE2Mzc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzE2NDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTY1MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcxNjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE2NTY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNjYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzE2NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTY2NTsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTY4ODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNjk0OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxNzExOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE3MTQ7MzM7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTcxNzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE3NDg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MTc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNzUxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxNzY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE3NjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTc2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNzY3OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxNzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE3ODI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTc4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxNzg0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzE3ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTc4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxNzg4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE3OTI7NjQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTcxODU2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE4NTg7NDc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTcxOTA1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE5MDc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MTkxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxOTExOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxOTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE5MjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTkyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxOTI1OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxOTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE5NTA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTk1ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxOTYyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzE5NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MTk2Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcxOTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzE5NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MTk3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcxOTc4OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIwMDE7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjAwOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMDEzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzIwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjAxNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjAyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMDI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIwMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjAyOTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjA0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMDQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIwNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjA0MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIwNDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjA0Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMDUyOzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIwODU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjA5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMDk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIwOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjA5NzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjEwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMTEwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzIxMTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjExNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMTIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIxMjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjEyNTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcyMTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIxMjg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjE0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMTQxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIxNDY7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIxNjc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjE3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMTcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIxNzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjE3NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMTc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIxNzk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjE4MTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcyMTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIxODg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjE5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMTk0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIyMDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjIwNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcyMjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIyMTE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjIxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMjE4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzIyMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjIyMjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMjI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIyMjk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MjIzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMjM3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjI0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMjQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIyNTA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIyNjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjI2NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcyMjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIyNzE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMjc4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIyODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjI4NTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMjkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIyOTU7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MjMwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMzAzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIzMTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjMxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMzE2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIzMjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjMyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMzMwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIzNDI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjM0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMzQ1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIzNDc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjM1MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcyMzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIzNTY7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIzNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjM2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMzcwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIzNzQ7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjM3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMzgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzIzODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjM4MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMzg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIzODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjM4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyMzg5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzIzOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjM5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyMzk1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzIzOTk7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjQwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNDA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI0MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjQwNzsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjQzMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNDMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI0MzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjQzNzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcyNDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI0NDA7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjQ0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNDQ3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI0NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjQ1MDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjQ2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNDYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI0NjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjQ2ODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyNDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI0NzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNDc2OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI0ODI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjQ4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyNDg2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI0OTA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MjQ5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNDk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI0OTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjUwMDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyNTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI1MDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjUwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNTA4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyNTIyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI1MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjUyNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNTI5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzI1MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjUzMjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyNTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI1Mzk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjU0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNTQyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyNTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI1NTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjU1Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNTYwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI1Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjU3MDsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNTg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI1ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjU4OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjU5OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNjAzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzI2MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjYwNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MjYxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNjE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI2MTg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjYyMzs3MzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNzI2OTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjY5OTs1NDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNzI3NTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mjc1NjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Mjc3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyNzczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI3NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mjc3NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcyNzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI3Nzk7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI3OTc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MjgwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyODAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI4MDM7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI4MTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MjgyNDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTcyODI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI4Mjc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mjg0MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyODQyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI4NDg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Mjg1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyODU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mjg1NjszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Mjg4Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTcyODkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzI4OTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mjg5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTcyODk3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI5MDE7NTE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTcyOTUyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzI5NTQ7NTE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTczMDA1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMwMDc7Mjg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTczMDM1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMwMzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MzA0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczMDQxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczMDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMwNTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzA1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczMDU2Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMwNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzA2NTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczMDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMwNzM7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMxMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzEwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczMTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMxMDc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMxMTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzEyMzsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzE1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczMTUzOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczMTY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMxNzE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzE3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczMTc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMxNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzE3OTsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzIwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczMjA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMyMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzIwOTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzIxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczMjIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMyMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzIyMjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzIzNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczMjM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMyMzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzI0MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTczMjQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMyNDg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MzI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczMjUxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMyNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzI2MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczMjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMyNjQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzMyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzI3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczMjc4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMyODI7NTU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTczMzM3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMzMzk7NDY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTczMzg1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzMzODc7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzQwMjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzQxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNDE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzQxOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTczNDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM0MjM7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzQ0ODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzQ2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNDY4OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNTAwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM1MDQ7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzUwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNTEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzUxMjszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzU0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNTQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM1NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzU0OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTczNTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM1NTI7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzU1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNTU5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM1NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzU2MjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzU3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNTc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM1NzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzU4MDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM1ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzU4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNTg5OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM1OTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzU5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNTk5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM2MDM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03MzYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNjA4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM2MDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzYxMzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM2MjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzYyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNjIyOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM2Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzYyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM2MzA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM2NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzY0MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM2NDM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzY1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNjUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM2NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzY1NTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzY2ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNjcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM2NzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzY3NTs0NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNzM3MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzcyMjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTczNzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM3MjU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzczMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNzMyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzczNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM3Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzczOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNzQzOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM3NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mzc0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM3NTE7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM3NjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mzc2ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNzY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM3NzI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03Mzc3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNzc1Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM3ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mzc4MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczNzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM3ODY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Mzc4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczNzg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM3OTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mzc5NDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTczNzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM3OTc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzgxMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczODExOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM4MTY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczODIzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM4MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzgyNTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzgzNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczODQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM4NDE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mzg0NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTczODQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM4NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Mzg1MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczODU2OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM4NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mzg2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczODY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM4NjU7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM4ODA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mzg4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczODg1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM4ODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Mzg4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczODkyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM5MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzkwMjs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczOTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM5MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzkwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczOTA5OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczOTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM5MjQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03MzkyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczOTI3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM5MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03MzkzNDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczOTQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM5NDU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03Mzk1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczOTUyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzM5NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mzk1Njs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTczOTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzM5NjI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM5NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mzk3NTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Mzk4ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczOTkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzM5OTE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Mzk5MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03Mzk5NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTczOTk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQwMDE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQwMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDAwODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MDEyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQwMjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQwMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDAyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDAyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MDI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQwMzM7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NDAzOTsxMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQwNTI7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NDA1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MDYwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDA3MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MDczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQwNzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQwNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDA3OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDA4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MDg0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQwODk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDA5MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDA5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MDk2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MDk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQwOTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDEwMzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MTEzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQxMTY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQxMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDEyMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDEyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MTI3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQxMzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDEzODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDE0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MTQyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MTQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQxNTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQxNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDE1NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDE1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MTU4OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzQxNjQ7MTM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MTc3Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzQxODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDE4NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MTk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQxOTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQyMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDIwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDIwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MjA3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQyMTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQyMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDIxNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDIxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MjIyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MjIzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQyMjU7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQyMzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQyMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDI0MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDI0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MjQ5OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDI2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MjYxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQyNjc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQyNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDI3MDsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQyODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDI4NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDI4Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MjkxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MjkyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQyOTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQyOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDI5Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDMwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MzAyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MzA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQzMTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQzMTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDMxNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDMxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MzE5OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzQzMjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDMyNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDMyNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MzI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQzMzE7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNzQzNDI7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQzNTU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NDM1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0MzYyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0MzYzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQzNjc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NDM3MTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQzOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDM5MzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTc0Mzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQzOTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDM5ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDQwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NDAyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ0MTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ0MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDQxNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDQxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NDIwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NDI4OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzQ0MzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDQzNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDQzNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NDQxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzQ0NDU7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ0NzM7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NDQ3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NDc1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NDc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ0Nzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ0ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDQ4Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDQ4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NDg5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ0OTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDQ5ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDUwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NTA1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ1MTA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ1MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDUxODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDUyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NTIyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NTMwOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzQ1MzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDUzODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDUzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NTQwOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzQ1NDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDU0ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDU1MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NTUyOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzQ1NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDU1OTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc0NTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ1NjQ7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NDU3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NTcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzQ1NzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDU3NTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NDU4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NTkyOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc0NjEyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ2MTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NDYxNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NjE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NjIyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ2MjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDYyNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDYzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NjM0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ2Mzg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ2NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDY0Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDY1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NjUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ2NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ2NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDY1OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDY2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NjY5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDY3OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NjgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0Njg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ2ODU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ2ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDY5MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDY5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0Njk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0Njk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ2OTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ3MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDcwMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDcwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NzA1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NzA4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ3MTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ3MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDcxNDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NzI0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ3Mjc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ3MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDczMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDczNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NzM4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ3NDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ3NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDc0OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDc1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NzUzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0NzYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ3NjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ3NjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDc2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0NzcwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzQ3NzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ3NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDc3NzsxMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ3OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDc5MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDc5MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0Nzk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0Nzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ3OTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ4MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDgwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDgwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0ODA2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0ODE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ4MTY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ4MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDgyNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDgzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0ODM0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0ODM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ4Mzc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ4NDI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDg0NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDg0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0ODQ4OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzQ4NTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ4NTc7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NDg2NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDg2NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0ODY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0ODcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ4NzE7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NDg3NzsxMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ4OTA7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NDg5NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0ODk5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0OTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ5MDk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ5MTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDkxNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDkxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0OTE3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0OTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ5MjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDkyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDkzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0OTMxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0OTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ5MzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDkzOTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ5NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDk1MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDk1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0OTU0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0OTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ5NjM7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc0OTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzQ5NzU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzQ5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NDk4MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDk4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc0OTg0OzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NDk5ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MDAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUwMDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTAwNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTAwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MDEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUwMTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUwMjI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTAyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTAyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MDI4OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzUwMzQ7MjM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MDU3Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzUwNjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTA2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTA2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MDcwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUwODA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUwODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTA4Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTA4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MDg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUwOTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUwOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTA5Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTEwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MTAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUxMDU7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUxMTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUxMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTEyMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTEyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MTMwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUxMzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUxMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTEzOTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTE0Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MTUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUxNTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUxNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTE1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTE2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MTYxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUxNjg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUxNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTE3NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTE4MTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTc1MTg1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUxODg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUxODk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTE5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MTk1Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNzUyMDI7MTM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUyMTY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUyMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTIyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTIyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MjMwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUyMzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUyMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTIzODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTI0NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MjUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MjUxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUyNTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUyNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTI1NjsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci03NTI2NzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUyNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTI4MDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTc1Mjg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUyODc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUyODg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTI5Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTc1Mjk2OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTMxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MzE4OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzUzMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTMyMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTMyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MzIzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUzMjc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUzMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTMzNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTMzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MzQwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUzNDU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUzNTM7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NTM1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1MzYxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1MzYyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzUzNjY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NTM3MDsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzUzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTM5ODsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTc1Mzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU0MDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzU0MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTQwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTQwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NDA3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1NDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU0MTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzU0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTQxOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NDIzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1NDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU0MzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzU0MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTQzNTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NTQ0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NDQzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1NDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU0NDc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzU0NTU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NTQ2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NDYzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1NDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU0NjU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci03NTQ3MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NDczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1NDc0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU0Nzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzU0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTQ4MDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTc1NDg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc1NDkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU0OTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzU0OTU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTQ5Nzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc1NTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU1MDQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NTUwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NTA5OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzU1MTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NTUxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NTE4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU1MzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NTUzNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NTM3OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NTUxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU1NTQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NTU1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NTU3OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU1NzI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NTU3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NTc1OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU1ODk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NTU5MTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NTk3OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU2MTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NTYxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NjE0OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU2Mzk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NTY0NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NjQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU2NDk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NTY1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NjUzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzU2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTY2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU2NjI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzU2NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTY3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1Njc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU2NzY7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzU2ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTY5MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc1NjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU2OTQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NTcwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NzAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzU3MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTcwNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NzA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU3MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NTcwODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NzEyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzU3MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTcxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NzE3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU3MjI7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzU3NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTc1NTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU3NjM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzU3Nzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTc4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1NzgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU3ODc7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NTc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1NzkzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzU4MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NTgwMzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc1ODA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzU4MTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NTgxMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1ODE2OzY5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci03NTg4NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1ODg4OzY0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci03NTk1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1OTU1OzE4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci03NTk3MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc1OTc2OzQ3OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci03NjAyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MDI2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzYwMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjAyOTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NjA0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MDQxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzYwNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjA0NDszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NjA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MDc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzYwNzc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjA4Mzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc2MDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYwODk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NjA5NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MTAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzYxMDE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjEwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2MTA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYxMDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NjExMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MTEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzYxMTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjExNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjExODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MTIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYxMjM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYxMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjEzMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjEzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MTMzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYxNDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYxNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjE0NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjE0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MTUwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYxNTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYxNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjE1OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjE2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MTY0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYxNzQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYxODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjE4NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MTg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MTkwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYxOTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYxOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjE5NjsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYyMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjIxNDsxNTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYyMjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjIzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjIzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MjM0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MjQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYyNDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYyNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjI0NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MjUxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYyNTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYyNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjI2MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjI2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MjY1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYyNjk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYyNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjI3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MjgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYyODQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2Mjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYyOTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYzMDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjMwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjMwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MzA2OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotNzYzMDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjMxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjMxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MzE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYzMTg7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci03NjMyNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjMyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MzMwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYzMzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYzMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjMzOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjM0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MzQ0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYzNDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYzNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjM1Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjM1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MzU4OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjM2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2MzY5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYzNzQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYzNzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjM4MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjM4NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2Mzg2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2MzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzYzOTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzYzOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjM5Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjQwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NDAyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY0MDc7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY0MTg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY0MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjQyNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NDMyOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjQ0Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NDQ2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NDQ3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY0NDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY0NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjQ1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NDU2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NDYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY0NjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY0NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjQ2Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjQ3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NDc1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY0ODE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY0ODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjQ5MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjQ5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NDk0Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotNzY1MDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY1MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjUwNjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjUxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NTE2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY1MjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY1MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjUyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjUzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NTMxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY1MzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY1Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjU0MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NTQ1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NTU0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY1NTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY1NTk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjU2MTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjU3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NTcxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY1NzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY1Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjU3ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjU4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NTg1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY1OTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY1OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjU5ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjYwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NjAyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY2MDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY2MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjYxMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjYxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NjE2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY2MjA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY2MjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjYzMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjYzMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NjMzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY2Mzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY2NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjY0MTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzY2NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjY1Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03NjY1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NjYxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc2NjYzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY2NjU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NjY3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NjcyOzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2NzAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY3MDE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NjcwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NzA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY3MDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjcxMTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NjcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NzI0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2NzM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY3NDE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Njc0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NzQ4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY3NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Njc1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2NzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY3NjA7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY3Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Njc4MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc2Nzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY3ODY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Njc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2NzkzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY3OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Njc5NTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NjgwOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2ODEzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzY4MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjgxNzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2ODI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY4MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NjgyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2ODI3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY4Mjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjgzMjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc2ODM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY4MzY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Njg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2ODQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY4NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Njg0NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2ODQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY4NTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03Njg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2ODU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY4NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Njg1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2ODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY4NTk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Njg2MTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2ODY3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzY4Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Njg3MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2ODc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY4Nzg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Njg4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2ODgxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY4ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Njg4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2ODg1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY4ODk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03Njg5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2ODk2OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY5MDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjkwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2OTA1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY5MDg7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY5MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NjkyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2OTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY5MjQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NjkyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2OTI4OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2OTQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY5NTI7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03Njk1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2OTU4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY5NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Njk2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2OTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY5NjM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Njk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2OTcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY5NzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Njk3NjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc2OTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY5Nzk7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Njk4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc2OTg4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzY5OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Njk5MTszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc2OTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzY5OTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Njk5Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MDAxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzcwMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzAwOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcwMTE7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzcwMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzAzMjszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MDM1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcwMzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzA0MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MDQ0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzcwNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzA0Nzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcwNTY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzA1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MDU5OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzcwNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzA2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MDY0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcwNjk7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzA3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MDc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzcwNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzA3OTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzA5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MTAwOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzcxMDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzEwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MTA4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcxMTI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NzExNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MTE1Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzcxMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzEyNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcxMjc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzEyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MTMwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzcxMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzEzMzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcxNDE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzE0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MTQ0OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzcxNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzE0ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcxNTA7MjU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTc3MTc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcxNzg7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NzE4MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MTg0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcxODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzE4OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MTkzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzcxOTc7OTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzIwNjs0MjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNzcyNDg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzI1MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc3MjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcyNTM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzI2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MjYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzcyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzI2NTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcyNzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzI3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3Mjc2Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzcyODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzI4NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3Mjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzcyODc7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzI5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MjkxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzcyOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzI5NDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzczMDI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzMwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MzA1OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzczMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzMwOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MzEwOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzczMTY7Mzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzczNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzM1NTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzM2NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3MzcwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzczNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzM3Mzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3MzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzczODI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzM4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3Mzg1Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzczOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzM5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3Mzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzczOTU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3Mzk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzczOTk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzQwMTsyMzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNzc0MjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzQyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3NDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc0MzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NDMyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc0Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzQ0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3NDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc0NDI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzQ0NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NDQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc0NTA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzQ1NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc3NDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc0NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzQ2MTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NDY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzQ2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3NDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc0NzE7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzQ3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NDc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc0ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzQ4MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3NDgzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc0ODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzQ4OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NDkzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc0OTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzQ5ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc3NTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc1MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzUwNDs5OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NTEzOzI1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci03NzUzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NTQxOzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3NTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc1ODA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc1OTA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzU5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3NTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc1OTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzU5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NTk5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc2MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzYwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3NjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc2MDk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzYxMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NjE1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc2MTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzYyMDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc3NjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc2MjM7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc2Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzY0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3NjQxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc2NDY7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03NzY1MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3NjUyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc2NTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzY1Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NjYxOzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3NjkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc2OTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzY5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NzAwOzY5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci03Nzc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3NzcwOzU4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci03NzgyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3ODI5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotNzc4MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzgzMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3ODM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc4MzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03NzgzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3ODM3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc4NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Nzg0NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3ODQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc4NDc7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc4NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Nzg2NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3ODY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc4Njc7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc4ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Nzg5MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3ODkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc4OTM7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Nzg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3ODk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc4OTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03NzkwMjs0MDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03Nzk0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3OTQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc5NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Nzk0OTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc3OTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc5NTY7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzc5ODE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Nzk4MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc3OTg0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzc5ODY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzc5ODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03Nzk5MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03Nzk5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc3OTk0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc4MDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgwMDI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzgwMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODAxMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci03ODAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4MDE0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTc4MDIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgwMjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotNzgwMjg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODAzMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc4MDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgwMzU7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzgwNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODA1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4MDU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgwNTk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci03ODA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4MDYzOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzgwNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODA3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4MDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgwNzM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzgwODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODA4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4MDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgwODg7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzgxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODEwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4MTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgxMDU7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzgxMjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODEyNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTc4MTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgxMjg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzgxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODE0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4MTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgxNDI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzgxNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODE1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4MTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgxNTc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzgxNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODE3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4MTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgxNzU7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzgxOTA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODE5NjsxNTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNzgyMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODIxMjsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4MjQwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4MjUyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgyNTY7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzgyODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODI4NjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODMwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4MzAzOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4MzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgzMjc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzgzNDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODM0NTsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODM2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4MzY4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4MzgxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzgzODQ7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg0MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODQxMTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODQyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4NDI2OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4NDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzg0NTU7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg0Njk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODQ3MjsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODQ5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4NDk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg0OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODQ5Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4NTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzg1MDc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg1MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODUyNTsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODU0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4NTQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODU0OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4NTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzg1NTk7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg1NzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODU3NTsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODYwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4NjAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg2MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODYwMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4NjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzg2MTM7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg2MzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODYzMzsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODY2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4NjYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg2NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODY2Mzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4NjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzg2NzM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg2ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODY5MTsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODcxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4NzE0OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4NzMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzg3MzM7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg3NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODc2MDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODc4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4NzgzOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4ODA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzg4MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODgwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4ODA3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg4MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODgxNzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODgzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4ODM0OzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4ODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzg4NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODg2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4ODYyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg4NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODg3MjsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODg5MDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4ODk2OzE0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci03ODkxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4OTExOzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc4OTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzg5Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODkzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4OTQwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzg5NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03ODk1MDsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03ODk2OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc4OTczOzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5MDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzkwMDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTAwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5MDA0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzkwMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTAxNDsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTAzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5MDM4OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5MDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzkwNjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5MDYzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzkwNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTA3MzsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTA5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5MDk4OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5MTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzkxMjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5MTIyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzkxMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTEzMjsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTE1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5MTU1OzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5MTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzkxODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5MTgzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzkxOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTE5MzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTIxMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5MjE1OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5MjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzkyNDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTI0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5MjQ1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzkyNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTI1NTsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTI3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5Mjc5OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5MzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzkzMDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5MzA0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzkzMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTMxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzkzMTU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTMyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5MzI1OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5MzQ3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzkzNTE7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzkzNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTM3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5Mzc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzkzNzU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTM4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5Mzg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzkzODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTM4Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5Mzk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzkzOTY7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk0MTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTQxOTsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTQ0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5NDQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk0NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTQ0Nzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5NDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk0NTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTQ1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5NDU4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk0Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTQ2ODsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTQ5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5NDk1OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5NTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk1MjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTUyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5NTI1Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk1MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTUzNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5NTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk1MzY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTU0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5NTQ2OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5NTY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk1NzE7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk1OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTU5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5NTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk1OTU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTYwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5NjA1OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5NjI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk2MzE7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk2NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTY1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5NjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk2NTk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTY2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5NjY5OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5Njk2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk3MDA7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk3MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTcyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5NzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk3MjQ7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTczMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5NzMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTczNTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5NzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk3NDU7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk3NjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTc2OTsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTc5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5Nzk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk3OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTc5Nzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5ODA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk4MDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTgwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5ODA4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTgxODsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTg0MzsyMDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTg2MzsxNzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNzk4ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTg4MTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotNzk5MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTkwMzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTkxNzszOzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTc5OTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk5MjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5OTIzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk5MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTkzMzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5OTQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk5NDQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk5NTg7MzswO2ZhbHNlO2ZhbHNlOzQyOzA7MjU1Ozs7Ci03OTk2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5OTYyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotNzk5NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci03OTk2NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTc5OTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotNzk5NzQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci03OTk4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTc5OTg2OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwMDAwOzM7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotODAwMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDAwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwMDA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAwMDY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDAxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwMDE2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwMDI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAwMjk7MzY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTgwMDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAwNjY7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODAwODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDA4ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwMDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAwOTA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDA5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwMTAwOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODAxMDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDExMTsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDEzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwMTM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODAxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDEzODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwMTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAxNDg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDE1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwMTYwOzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwMTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAxODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwMTg3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODAxOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDE5NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDIwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwMjEwOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwMjMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAyMzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwMjMzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODAyNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDI0MzsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDI2Mzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwMjY5OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwMjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAyOTE7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODAzMTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDMxNDsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDMzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwMzM3OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwMzUzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAzNTY7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODAzNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDM3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwMzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODAzNzk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDM4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwMzg5OzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwNDE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA0MTc7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODA0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDQzOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwNDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA0NDE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNDUxOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwNDcyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA0Nzg7MTg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTgwNDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA0OTc7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODA1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDUyMzsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDU0NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNTQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODA1NDc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDU0OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDU1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNTU1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA1NTc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA1NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDU2NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDU2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNTY4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA1NzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA1Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDU3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDU4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNTgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA1ODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA1OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDU5MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDU5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNTk3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA2MDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDYwNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDYxMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNjEyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNjE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA2MTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA2MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDYyMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDYyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNjI4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNjMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA2MzM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA2Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDYzOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDY0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNjQyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA2NDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA2NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDY1Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDY1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNjU3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA2NjQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA2NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDY3MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDY3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNjc3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA2ODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA2ODU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDY4ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDY4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNjkwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA2OTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDcwMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDcwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNzA4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA3MTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA3MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDcyMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDcyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNzI4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA3MzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA3MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDczNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNzQzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgwNzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA3NDg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODA3NTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDc1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MDc2MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNzYzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODA3Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDc2ODsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDc4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwNzg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODA3OTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDc5MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgwNzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA3OTc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODA4MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDgwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwODA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA4MTA7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODA4Mjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDgzMDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwODM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA4Mzg7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDg0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwODQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODA4NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDg0ODsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDg2MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwODY0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODA4NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDg2NzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDg4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwODg0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODA4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDg4Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgwODkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODA4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDg5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwODk0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA4OTg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04MDkwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwOTAxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwOTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA5MTU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MDkxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgwOTE4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODA5MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDkyMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwOTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA5MjY7NDg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODA5NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MDk3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgwOTc2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODA5ODE7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODEwMDM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04MTAwNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxMDA5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODEwMTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTAxNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxMDE4OzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxMDQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODEwNDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTA0ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxMDUxOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxMDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODEwNjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTA2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxMDY5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODEwNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTA3MzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTA4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxMDg4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxMDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODExMDA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODExMTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTExNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxMTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODExMTg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTEyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxMTIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODExMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTEyMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgxMTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODExMjc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTEyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxMTMwOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxMTQ4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODExNTI7NTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODEyMTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTIxMzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxMjMzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODEyMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTIzNjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxMjQ4OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxMjYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODEyNjM7NTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODEzMjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTMyNDszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTM1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxMzU3OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxMzg5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODEzOTI7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODE0MTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTQxNjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTQyOTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxNDM2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODE0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTQzOTsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTQ1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxNDU3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODE0NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTQ2MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgxNDY0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODE0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTQ2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxNDY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE0NzE7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04MTQ3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxNDc0OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxNDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE0ODg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTQ5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxNDkxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODE0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTQ5NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxNDk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE0OTk7NDk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODE1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTU0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxNTUwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE1NTU7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODE1Nzc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04MTU4MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxNTgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE1ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTU4ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxNTkyOzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxNjE5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE2MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTYyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxNjI2OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxNjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE2NDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTY0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxNjQ1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODE2NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTY0OTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTY2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxNjY0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxNjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE2NzY7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODE2ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTY5MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxNjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE2OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTY5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxNjk2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODE2OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTcwMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxNzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE3MDM7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODE3MjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTcyNjs1ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTc4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxNzg3OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxODA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE4MDc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTgwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxODEwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxODIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE4MjI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODE4MzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTgzNzs1ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MTg5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgxODk4OzUyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgxOTUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODE5NTM7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODE5ODU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MTk4ODszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjAyMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMDIzOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgyMDM2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIwMzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjAzOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMDQxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMDQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIwNDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjA0OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjA1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMDU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIwNTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjA2ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjA3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMDczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIwNzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIwNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjA4MDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIwOTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjA5MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjA5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMDk2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIxMDE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIxMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjEwNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjEwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMTA5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIxMTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIxMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjExNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjExOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMTIzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIxMjU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIxMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjEzNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjEzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMTM4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIxNDQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIxNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjE0OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjE1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMTU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIxNjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIxNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjE2NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjE3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMTc0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIxNzY7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci04MjE3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMTgyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMTgzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIxODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIxODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjE4ODsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci04MjE5OTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIyMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjIxMjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTgyMjE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIyMTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIyMjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjIyNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTgyMjI4OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjI0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMjUwOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotODIyNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjI1MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjI1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMjU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIyNTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIyNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjI2ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjI3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMjcyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMjc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIyNzc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIyODU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci04MjI5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMjkzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMjk0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIyOTg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci04MjMwMjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIzMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjMzMDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTgyMzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIzMzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIzMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjMzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjMzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMzM5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIzNDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIzNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjM1MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjM1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMzU1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIzNjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIzNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjM2Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MjM3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMzc1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIzNzk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODIzODc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci04MjM5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyMzk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyMzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODIzOTc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci04MjQwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyNDA1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgyNDA3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI0MDk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04MjQxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyNDE2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODI0MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjQyMTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgyNDI3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI0MzA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODI0NDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjQ0NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgyNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI0NTE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjQ1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyNDU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODI0NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjQ2MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjQ3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyNDcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODI0NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjQ3NDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjQ4Njs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyNDkyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODI0OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjQ5NTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgyNTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI1MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjUwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyNTA1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODI1MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjUwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgyNTA5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI1MTM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04MjUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyNTE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODI1MTg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjUyMzszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyNTU2Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODI1NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjU2NDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjU3OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyNTgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODI1ODQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjU4ODs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgyNTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI1OTQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyNjA0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODI2MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MjYxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgyNjEyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI2MTc7Njk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTgyNjg2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI2ODk7NjQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTgyNzUzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI3NTY7MTg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTgyNzc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI3Nzc7NDc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTgyODI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI4Mjc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04MjgyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyODMwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgyODQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI4NDI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04Mjg0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyODQ1OzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgyODc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI4Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04Mjg3ODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyODg0OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODI4ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Mjg5MDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgyODk2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODI5MDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MjkwMjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyOTA3OzUyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci04Mjk1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyOTYyOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci04Mjk4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyOTg2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODI5OTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04Mjk5Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgyOTk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODI5OTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzAwMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzAxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMDE2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODMwMTc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzAxOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzMDIwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMwMjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMwMjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzAyOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzAzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMDMxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzMDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMwMzM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMwMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzAzOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzA0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMDQ0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzMDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMwNTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMwNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzA1NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzA2MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMDY1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzMDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMwNjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzA3MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzA3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMDc1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzMDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMwODI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMwODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzA4ODsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMxMDI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzEwNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzEwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMTA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzMTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMxMTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMxMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzExNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzExOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMTIwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzMTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMxMjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMxMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzEzMjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzEzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMTQwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzMTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMxNDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMxNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzE0Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzE1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMTU0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzMTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMxNjA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMxNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzE2OTsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMxODM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzE4ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzE4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMTkwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMjAxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzMjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMyMDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMyMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzIxMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzIxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMjE4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzMjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMyMjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMyMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzIyNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzIzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMjM0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzMjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMyMzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMyNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzI0MTsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODMyNTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzI1ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzI2MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMjYyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODMyNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzI2NzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzI4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMjg2OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODMyOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzI5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzMjk0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMyOTc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzMwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMzA3OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODMzMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzMxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzMzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMzMTQ7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODMzMzA7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzMzODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgzMzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODMzNDE7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzM0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMzUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODMzNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzM1MjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzM2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMzY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODMzNjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzM3MDsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzM5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzMzkzOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM0MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzQwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM0MDM7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM0MTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzQxOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNDIwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM0MjM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04MzQyNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNDMxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODM0MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzQzNDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM0NDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzQ0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNDQ1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzQ0ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNDQ5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM0NTM7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM0NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzQ3NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzQ4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNDg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM0ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzQ5MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgzNDk1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM0OTk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04MzUwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNTAyOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzUxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM1MTM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM1MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzUyNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM1Mjc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM1Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzUzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNTM5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM1NDM7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM1NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzU3NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNTg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM1ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzU4OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNTk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM2MDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzYwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNjA1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODM2MDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzYxMzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgzNjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM2MTY7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzYyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNjI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzYyNzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzYzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNjM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM2Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzY0MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNjUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM2NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzY1MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzY2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNjY1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM2Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzY2ODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzY3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNjc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM2ODA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzY4NDsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04MzcxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNzEzOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM3MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzcyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM3MjM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzczNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM3Mzc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM3NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Mzc0ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM3NTA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM3NjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Mzc2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzNzY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM3NzE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04Mzc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzNzc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM3Nzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Mzc4MTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04Mzc5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzODAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM4MDE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzgwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzODA0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM4MDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODM4MDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzgxMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04MzgxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzODE1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzODI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM4MjU7MTQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzODM5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM4NDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODM4NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Mzg0NDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTgzODQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM4NTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODM4NTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Mzg1NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04Mzg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzODU2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotODM4NjM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODM4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Mzg3Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04Mzg4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzODgxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzODkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM4OTE7MTY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzOTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM5MDg7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTgzOTI3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM5MzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODM5MzI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04MzkzNDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTgzOTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM5Mzk7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM5NTI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04Mzk1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzOTU2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzOTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM5Njc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04Mzk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzOTcxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Mzk4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTgzOTgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODM5ODU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04Mzk5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTgzOTk0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODM5OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDAwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0MDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQwMDI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NDAwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0MDA3OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQwMTM7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQwMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDAzMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0MDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQwMzQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDA0Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0MDQ4OzY5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci04NDExNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0MTE4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODQxMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDEyMTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDE0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0MTQyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQxNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDE0NTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDE1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0MTU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQxNTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDE2MTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg0MTY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQxNjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDE3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0MTcyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQxNzg7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NDE4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0MTg0Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQxOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDE5Mjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0MTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQyMDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDIwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0MjAyOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0MjE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQyMTg7NjU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTg0MjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQyODQ7NTA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTg0MzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQzMzU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NDMzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0MzM4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0MzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQzNDk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDM1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0MzUyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQzNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDM2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0MzYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQzNjU7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDM3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0MzcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQzNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDM3MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg0Mzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQzNzc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDM4ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0Mzg5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQzOTQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NDQwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NDAxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODQ0MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDQwNjs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NDExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ0MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDQxMzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NDE5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODQ0MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDQyMjsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDQ0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NDQzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDQ0Njs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ0NTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDQ1NTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NDYyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODQ0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDQ2Njs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ0NzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDQ3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NDc0OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ0OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDQ5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NDk2OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ1MTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDUxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NTE1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ1MTc7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDUyNDsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDU0OTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NTU2OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ1ODk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NDU5MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NTk1OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ2MDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDYwMjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NjA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ2MDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDYxMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NjE0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ2MTg7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ2Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDYzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ2NDA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ2NTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDY1NDszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDY4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0Njg3Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ2OTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDY5NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0Njk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ2OTk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NDcwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NzA0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODQ3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDcwNzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDcxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NzE4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ3MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDcyMTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ3MzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDczMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NzM2OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDc0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ3NDQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NDc0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NzQ4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0NzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ3NTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDc2MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NzY1OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODQ3NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDc3Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg0Nzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ3Nzc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDc4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0NzgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ3ODQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDc5MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg0NzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ3OTM7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ4MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDgxNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0ODE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ4MTc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDgyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0ODI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ4Mjg7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDgzNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg0ODM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ4Mzk7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDg0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0ODQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ4NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDg0NzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDg2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0ODY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ4Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDg2OTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0ODg2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ4ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDg4ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0ODkwOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ4OTc7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ5MjQ7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDkzMTszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDk2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0OTY0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODQ5Njg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDk3MDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0OTc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODQ5Nzc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NDk4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg0OTgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODQ5ODc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NDk4OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg0OTkzOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1MDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUwMTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTAxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MDE1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1MDI1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUwMjk7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODUwNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTA2Mjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1MDY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUwNzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTA3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MDc0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODUwNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTA3OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg1MDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUwODI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODUwOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTA5MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1MDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUwOTY7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODUxMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTExMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1MTEzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUxMTc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTEyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MTIzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODUxMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTEyNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg1MTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUxMjk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODUxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTE0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1MTQxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUxNDY7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NTE1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MTUzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODUxNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTE1ODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1MTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUxNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTE2NTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MTcxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODUxNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTE3NDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MTk1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODUxOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTE5ODsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTIxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MjE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODUyMTU7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTIyMjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTIzNzs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MjQ0OzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1Mjc0Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUyODE7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODUzMDA7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTMwNzszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTMzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MzQwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODUzNDQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTM0Njs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MzUyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODUzNTM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTM1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1MzU5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUzNjM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTM2NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MzY5OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1Mzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODUzODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTM5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1MzkxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1NDAxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU0MDU7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTQzODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1NDQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU0NDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1NDUwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODU0NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTQ1NTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg1NDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU0NTg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTQ2OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1NDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU0NzI7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTQ5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1NDkzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU0OTc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTUwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1NTAzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTUwNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg1NTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU1MDk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU1MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTUyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1NTIxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU1MjY7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NTUzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1NTMzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODU1Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTUzODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1NTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU1NDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTU0NTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1NTUxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODU1NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTU1NDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTU3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1NTc1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU1Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTU3ODsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTU5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1NTk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU1OTk7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTYwNjsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTYyNTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1NjMyOzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1NjYyOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU2Njk7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU2ODg7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTY5NTszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTcyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1NzI4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODU3MzI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTczNDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1NzQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU3NDE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTc0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1NzQ3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU3NTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTc1Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1NzU3OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1Nzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU3Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTc3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1Nzc5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1Nzg5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU3OTM7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU4MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTgyNjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1ODMzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU4MzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTgzNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1ODM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU4NDA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTg0MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NTg0NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1ODQ4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg1ODQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU4NTA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODU4NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTg1ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NTg2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1ODYyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg1ODcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU4NzE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg1ODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU4ODI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODU4ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTg4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NTg5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1ODkzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg1OTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU5MDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODU5MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTkwNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NTkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1OTEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg1OTE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU5MTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODU5MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTkxOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NTkyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1OTI0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg1OTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU5Mjg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODU5MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTkzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NTkzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1OTM3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg1OTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU5NDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODU5NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTk0NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NTk0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1OTUwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg1OTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU5NTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODU5NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTk2NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NTk2ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1OTcwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODU5NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTk3NTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NTk4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg1OTg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODU5OTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NTk5Mzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg1OTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODU5OTk7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MDA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjAwNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg2MDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYwMTE7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjAxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MDIyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2MDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYwMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjAzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MDM1OzI7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotODYwMzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjAzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MDQxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODYwNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjA0NDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjA1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MDU3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjA2MDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjA3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MDczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYwNzQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjA3ODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjA4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MDkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjA5MjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjEwNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MTA4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYxMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjExODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2MTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYxMjA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYxMzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjEzNjsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjE1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MTU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYxNjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjE2Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg2MTY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYxNzA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NjE3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MTczOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2MTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYxODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjE4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MTg4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYxOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjE5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2MTkyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYxOTY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NjE5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MjAwOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYyMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjIwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2MjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYyMDc7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYyNDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjI0ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg2MjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYyNTI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYyNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjI2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2MjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYyNjU7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYyOTU7MTA7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYzMDU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NjMwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MzA4OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2MzIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYzMjE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjMyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MzI0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2MzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYzMzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjMzNzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MzQyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2MzUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYzNTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjM1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2MzU1OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2MzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODYzODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjM4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2Mzg2OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODYzODk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjM5NDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjQwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NDA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY0MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjQwODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjQxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NDE5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY0MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjQyMTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjQ0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NDQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY0NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjQ0NDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjQ1Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NDYxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY0NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjQ3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2NDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY0NzM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY0ODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjQ4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2NDkwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY0OTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NjQ5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NDk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY1MDA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjUwNTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2NTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY1MTI7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjUyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NTIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjUyMzsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjU0NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NTUwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2NTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY1NjE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjU2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NTY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY1Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjU3MDszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjYwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NjAzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2NjE1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY2MjA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NjYyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NjI0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY2Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjYzMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2NjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY2MzI7MzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY2Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjY2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2NjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY2NzE7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY2ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjY4MzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NjcwMjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NzA3OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2NzQyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY3NDg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY3NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njc2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2NzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY3NjI7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04Njc2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2NzY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY3Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njc3MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04Njc4MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2Nzg2Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY3OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njc5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2Nzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY3OTg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY4MTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjgxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2ODE1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY4MTk7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODY4Mzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njg0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg2ODQzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY4NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04Njg0NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2ODQ4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg2ODUxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY4NTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODY4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njg1Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04Njg2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2ODY1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg2ODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY4Njk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODY4Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njg3OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04Njg4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2ODg0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg2ODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY4ODg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODY4OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njg5ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NjkwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2OTAxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg2OTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY5MDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODY5MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjkxMjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NjkyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2OTIyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg2OTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY5MjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODY5Mjg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NjkzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NjkzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2OTM0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg2OTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY5NDI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODY5NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njk0ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04Njk1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2OTU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg2OTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY5NjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODY5NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njk2Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04Njk3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2OTczOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg2OTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY5ODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODY5ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njk4NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04Njk4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg2OTg4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg2OTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODY5OTA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODY5OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Njk5OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NzAwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MDA2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg3MDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcwMTA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODcwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzAxNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NzAyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MDI0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg3MDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcwMjc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODcwMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzAzMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NzAzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MDM2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg3MDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcwNDE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODcwNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzA0Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NzA1Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MDYwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg3MDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcwNjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODcwNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzA2NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NzA2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MDcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg3MDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcwNzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODcwODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzA4MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NzA4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MDg0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg3MDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcwODk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODcwOTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzEwMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NzEwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MTAzOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotODcxMDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzEwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NzExMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MTEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg3MTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcxMTU7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci04NzEyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NzEyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MTI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg3MTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcxMzA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODcxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzE0MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NzE0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MTQ2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg3MTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcxNDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODcxNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzE1Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04NzE1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MTYwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg3MTYyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcxNjQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NzE2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MTY5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3MTc5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODcxODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzE4NDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3MTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcxODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NzE5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MTkzOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODcxOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzE5OTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3MjA1OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcyMTE7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NzIxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MjE0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3MjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcyMjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NzIyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MjI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODcyMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzIyOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3MjMxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcyMzY7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODcyNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzI1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3MjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcyNjE7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODcyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzI3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3Mjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcyNzY7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODcyODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzI4OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3MjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODcyOTI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODczMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzMwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3MzA0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODczMDg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NzMxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3MzE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODczMTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NzMxOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MzIzOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODczMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzMyOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3MzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODczMzE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04NzMzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MzM1Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODczNDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzM0NjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NzM1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3MzU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODczNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzM2MDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NzM3MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3Mzc1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODczODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzM4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3Mzg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODczODc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODczOTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzQwMjs1NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotODc0NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzQ1ODs2OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotODc1Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzUyODs0MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotODc1Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzU2OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg3NTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc1NzI7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NzU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3NTc3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc1Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzU4MDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3NTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc1ODc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NzU4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3NTkwOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc1OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzU5NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3NTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc1OTc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NzYwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3NjA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc2MDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzYxMDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg3NjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc2MTM7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc2MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzYzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3NjMyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc2Mzc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc2NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzY0ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3NjQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc2NTA7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc2Njk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzY3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3Njc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc2Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04NzY3ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3NjgxOzY5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci04Nzc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3NzUxOzY2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci04NzgxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3ODE4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODc4MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzgyNTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg3ODI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc4Mjg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Nzg0MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3ODQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc4NDQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Nzg1NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3ODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc4NTk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04Nzg2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3ODY5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc4NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Nzg3MjszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3ODc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc4NzY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04Nzg3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3ODc5OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc4ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Nzg4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3ODg1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc4ODk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04Nzg5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg3ODkzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc5MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04NzkwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3OTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc5MDU7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc5NDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Nzk0NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg3OTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc5NDg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc5NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04Nzk1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg3OTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODc5NjE7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODc5OTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODAwMDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4MDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgwMDc7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MDEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODgwMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODAxNDsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODA0MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MDQ1OzY2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci04ODExMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MTEzOzIwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci04ODEzMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MTM1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODgxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODEzODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODE0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MTQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODgxNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODE1MTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MTYyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODgxNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODE2NDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODE3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MTc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODgxODA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODE4NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODE5Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MjAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODgyMDI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODIwNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODIxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MjE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODgyMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODIxOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg4MjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgyMjM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODIzMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg4MjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgyMzQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04ODIzODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4MjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgyNDE7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODI0ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MjUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODgyNTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODI1NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg4MjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgyNjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODI2MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MjY1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4Mjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgyNzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4Mjc4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODgyODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODI4Mjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4Mjg5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODgyOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODI5Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg4Mjk3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODgyOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODMwMDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4MzA3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgzMTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODMxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MzE0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODgzMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODMxNzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODMyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MzI5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODgzMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODMzMjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg4MzM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODgzMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODMzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4MzM5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgzNDM7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODgzNjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODM2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4MzY3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgzNjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODM3MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4MzcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4Mzc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgzNzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODgzNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODM4MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODM4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4Mzg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4Mzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODgzOTA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODgzOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODM5Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODQwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NDAyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4NDA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg0MDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg0MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODQxMTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODQyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NDIxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4NDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg0MjQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg0Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODQyODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODQzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NDM1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4NDQzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg0NDY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg0NDg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODQ1MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg4NDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg0NTU7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg0Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODQ3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4NDcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg0NzQ7NjM7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTg4NTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg1Mzg7Mjc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTg4NTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg1NjY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04ODU2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NTY5OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4NTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg1ODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODU4Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NTkxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4NjAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg2MDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODYwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NjEwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODg2MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODYxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4NjE2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg2MjA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04ODYyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NjI0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg2MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODYzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4NjMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg2MzM7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg2NTY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODY2MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg4NjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg2NjU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg2Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODY3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4Njc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg2ODA7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4Njg4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg2ODk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODY5NDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODcwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NzA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg3MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODcwODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4NzE1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg3MjA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg3MzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODczNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4NzM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg3NDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODc0MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NzQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg3NDQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODc0NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODc0OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NzUyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4NzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg3NTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg3NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODc2MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODc2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NzY0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4NzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg3NzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg3NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODc3Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODc3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4Nzc5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4NzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg3ODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg3ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODc4Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODc5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4NzkyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4ODAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg4MDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg4MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODgwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODgwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4ODA5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4ODE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg4MTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg4MjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODgyNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODgyOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4ODMxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotODg4MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODgzNjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODg1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4ODUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg4NTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODg1NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg4ODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg4NjA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODg3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4ODc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg4NzU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODg3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4ODc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg4Nzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODg4MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODg5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4ODk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg4OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODg5NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4ODk5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg5MDM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODg5MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODkxODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg4OTE5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg5MjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04ODkyMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4OTI0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4OTI3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg5MzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg5MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODkzMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODkzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4OTM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4OTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg5NDI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg5NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODk0ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODk1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4OTUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4OTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg5NTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg5NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODk2MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODk2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4OTY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4OTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg5Njg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg5Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODk3ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04ODk4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg4OTgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg4OTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODg5ODM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODg5OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04ODk5Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTAwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MDAzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5MDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkwMDU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5MDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkwMTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODkwMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTAxOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTAyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MDIyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5MDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkwMzI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODkwMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTAzOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTA0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MDQ0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5MDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkwNDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODkwNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTA1NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTA2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MDY1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5MDY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkwNjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODkwNzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTA3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTA3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MDc3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5MDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkwODQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODkwOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTA5NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTEwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MTAzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5MTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkxMDU7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci04OTEwODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MTExOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5MTEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkxMTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODkxMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTExNzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTg5MTIyOzI2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTE0ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MTUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5MTUzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkxNTU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04OTE1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MTYwOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5MTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkxNzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTE4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MTgzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODkxOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTE5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5MTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkxOTU7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04OTIwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5MjAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkyMDQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04OTIwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MjA3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5MjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkyMjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTIyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MjIyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5MjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkyMzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTIzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MjM2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODkyMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTIzOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5MjQwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkyNDQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04OTI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MjQ4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5MjU4Ozg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkyNjY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODkyNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTI3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5Mjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkyODA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODkyOTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTI5Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5MzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkzMDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTMwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MzA4OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5MzIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkzMjc7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODkzNDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTM1MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5MzUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODkzNTU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04OTM1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5MzYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODkzNjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTM2NTsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTM5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5Mzk2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODkzOTc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTM5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5NDAwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk0MDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk0MDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTQwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTQwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NDEwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk0MTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk0MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTQyMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTQyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NDI2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk0Mjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk0MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTQzMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTQzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NDM3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk0NDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk0NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTQ0NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTQ1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NDU0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk0NTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk0NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTQ1OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTQ2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NDY5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NDc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk0Nzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk0ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTQ4MTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTQ5MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTQ5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NDk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk0OTg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk1MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTUwODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTUxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NTE1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk1MjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk1MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTUyNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTUzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NTMxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk1NDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk1NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTU0NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTU0Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NTUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk1NTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk1NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTU2MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTU2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NTcwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NTc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk1Nzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk1ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTU4MTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTg5NTg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk1ODc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk1ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTU5MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTU5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NTkzOzU7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotODk1OTg7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5NjIwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk2MjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk2MjU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTYyNzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg5NjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk2MzI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk2NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTY0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5NjQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk2NTE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTY2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NjYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk2NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTY2Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg5NjY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk2Njg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTY3MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg5NjczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk2NzQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk2ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTY4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5Njg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk2ODk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk3MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTcwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5NzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk3MDM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTcwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NzA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk3MDc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTcxMTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg5NzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk3MTU7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk3MjU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTczMTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NzQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk3NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTc0NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTc1Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5NzYxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk3NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTc3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5NzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk3NzM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk3ODg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTc5MjsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTgxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5ODE2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk4MTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTgyMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg5ODI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk4MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTgyNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5ODMwOzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5ODU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk4NTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTg1ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5ODYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk4NjE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTg2MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTg2NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5ODY5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5ODcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk4NzE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk4Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTg3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTg4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5ODgzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5ODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk4ODg7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5ODk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk4OTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk5MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTkwNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5OTEwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5OTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk5MTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk5MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTkyNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci04OTkyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5OTI3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTg5OTMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk5MzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotODk5MzY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTkzODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTg5OTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk5NDM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk5NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTk1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5OTU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk5NTg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTk2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5OTY0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk5Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTk3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTg5OTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotODk5NzI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci04OTk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5OTc2Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk5ODQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci04OTk4NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci04OTk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTg5OTk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotODk5OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDAwMDsyOzA7ZmFsc2U7ZmFsc2U7NDI7MDsyNTU7OzsKLTkwMDAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAwMDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDAwNjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkwMDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAwMDk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAwMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDAyMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwMDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAwMjU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAwMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDAzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwMDM5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAwNDM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAwNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDA1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwMDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAwNTc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAwNjk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDA3Mzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwMDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAwODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDA4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwMDg1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwMDk3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAxMDE7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAxMjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDEyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwMTI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAxMjg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MDEzMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwMTM1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTAxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDEzODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDE1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwMTUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAxNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDE1MzsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDE3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwMTc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAxNzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDE4MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkwMTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAxODY7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDE5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwMTkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAxOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDE5MzszNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDIzMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwMjM0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTAyMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDIzODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDI0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwMjQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAyNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDI1MTszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDI4MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwMjg1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTAyODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDI4OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDI5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwMzAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAzMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDMwMjszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDMzMzsxMDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDM0MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkwMzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAzNDY7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAzNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDM1OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwMzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAzNjI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAzNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDM3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwMzc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAzNzU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTAzODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDM4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwMzg4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTAzOTM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA0MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDQwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwNDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA0MDc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA0MTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDQyNDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwNDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA0MzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDQzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNDM2OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwNDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA0NjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDQ2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNDY3OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA0NzA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDQ3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwNDc1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA0Nzk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MDQ4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNDg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA0ODU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDQ5MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDUwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNTAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA1MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDUwNDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDUxNjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNTIxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA1MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDUzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwNTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA1MzM7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA1NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDU2MTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwNTY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA1NzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDU3Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNTc2OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwNTk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA1OTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDYwMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNjAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA2MDM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDYwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MDYwODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNjExOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkwNjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA2MTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTA2MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDYyMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MDYyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNjI1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkwNjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA2MzA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTA2MzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDYzODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MDY0MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNjQyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTA2NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDY0NzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDY2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwNjY2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA2Njc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDY3MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkwNjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA2NzM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA2ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDY4NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwNjg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA2ODk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA3MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDcwMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwNzAzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA3MDc7NDQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTkwNzUxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA3NTM7MzY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTkwNzg5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA3OTE7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA4MDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDgwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwODA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA4MDc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MDgxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwODEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA4MTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDgxNzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwODIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA4MjM7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDgyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwODI5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA4MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDgzMTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkwODM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA4MzU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDg0Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwODQ3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwODU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA4NTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDg1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwODYwOzI7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotOTA4NjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDg2Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwODY3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwODc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA4Nzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDg4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwODgxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwODkzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA4OTc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDkwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwOTA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA5MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDkwOTsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDkzMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwOTM3OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkwOTU3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA5NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MDk2MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwOTYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTA5NjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDk2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MDk2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwOTcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkwOTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA5NzQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTA5ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MDk4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MDk4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkwOTg2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkwOTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTA5OTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTEwMDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTAwMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTAwNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMDA3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTEwMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTAxMjsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTAzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMDM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTEwMzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTAzOTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkxMDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEwNDI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTEwNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTA1NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxMDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEwNTg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTEwNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTA3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxMDcyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEwNzY7NDA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTkxMTE2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTExMTg7Mzk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTkxMTU3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTExNTk7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTExNzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTE3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxMTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTExNzg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MTE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMTgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTExODQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTE4ODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxMTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTExOTQ7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTE5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMjAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTEyMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTIwMjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkxMjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEyMDY7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTIxNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMjE4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxMjI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEyMjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTIzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMjMxOzI7MDtmYWxzZTtmYWxzZTs0MjswOzI1NTs7OwotOTEyMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTIzNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMjM4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxMjQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEyNTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTI1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMjUyOzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxMjc4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEyODI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTI5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMjkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTEyOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTI5NDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTMwNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMzEwOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxMzMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEzMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTMzNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMzM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTEzMzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTMzOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTM0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMzQ1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxMzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEzNDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTEzNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTM1MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTM1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMzU3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxMzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEzNjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTEzNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTM2Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTM3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMzcyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxMzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEzNzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTEzODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTM4MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTM4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxMzg0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxMzg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTEzODg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTEzOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTM5Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTQwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNDAzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE0MTA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE0MTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTQyMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTQyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNDI0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE0Mjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE0MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTQzMTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNDQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE0NDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTQ0ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTQ1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNDU0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE0NTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE0NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTQ2Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTQ2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNDY5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE0NzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE0NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTQ3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTQ3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNDgwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE0ODM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE0ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTQ4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTQ5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNDkxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNDk1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE0OTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE1MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTUwMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTUwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNTA0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE1MDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTUxMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNTE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE1MjA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE1Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTUyODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTUzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNTMzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE1Mzc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE1NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTU0Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTU1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNTU3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNTU4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE1NjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE1NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTU2NDs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTkxNTcyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE1Nzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE1ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTU4MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTU4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNTg1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE1ODk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE1OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTU5NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTYwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNjAzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE2MDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE2MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTYxMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTYxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNjE2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE2MjE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE2MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTYyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTYyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNjI4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxNjM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE2Mzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE2NDE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTY0MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkxNjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE2NDc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTE2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTY2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxNjYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE2NjQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MTY2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNjY3OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxNjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE2ODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTY4NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNjg5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTE2OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTY5NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxNjk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE3MDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTcwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNzA1OzcyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05MTc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNzc4OzE2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05MTc5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxNzk1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTE3OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTc5OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE4MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTgxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxODExOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxODI2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE4MzA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MTgzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxODMzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxODQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE4NDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTg0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxODQ2OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE4Njk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTg3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxODcxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTE4NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTg3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxODc1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE4Nzk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTE4OTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTg5NTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTkwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxOTA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTE5MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTkwOTszMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTk0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxOTQzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkxOTU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE5NTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTk1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxOTYxOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTE5Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTk2ODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MTk3ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxOTgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTE5ODE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTk4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MTk4NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkxOTg5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkxOTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTE5OTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTE5OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MTk5NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjAwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyMDAxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyMDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIwMDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTIwMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjAxMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyMDE0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyMDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIwMTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTIwMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjAyMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjAyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyMDI1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyMDMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIwMzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTIwMzU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjAzNzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkyMDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIwNDI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIwNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjA1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyMDU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIwNTg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MjA2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyMDYyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjA3MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyMDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIwNzQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIwODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjA5MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkyMDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIwOTY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIxMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjEwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyMTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIxMDk7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIxNDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjE0ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkyMTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIxNTI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIxNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjE2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyMTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIxNjU7MzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIyMDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjIwNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkyMjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIyMDg7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIyMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjIyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyMjIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIyMjQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIyMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjIzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyMjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIyMzc7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIyNDg7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjI1NDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkyMjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIyNTc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIyNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjI3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyMjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIyNzI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIyODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjI4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyMjg4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIyOTI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIzMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjMwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyMzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIzMDY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIzMjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjMyNDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MjMzNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyMzM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTIzNDA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjM0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyMzQzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIzNDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTIzNDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjM1MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjM1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyMzUzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyMzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIzNTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTIzNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjM2Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjM2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyMzY5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyMzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIzNzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTIzNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjM3Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjM4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyMzg2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyMzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTIzODk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTIzOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjM5Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjM5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNDAxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNDAzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI0MDU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MjQwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNDEwOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyNDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI0MjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MjQyNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNDI4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTI0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjQzMjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyNDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI0NDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MjQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNDQ0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyNDU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI0NjI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MjQ2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNDY2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyNDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI0Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MjQ3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNDc5OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyNTE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI1MTc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MjUxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNTIwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyNTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI1MzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MjUzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNTM1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyNTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI1NDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MjU0ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNTUyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyNTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI1NjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MjU2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNTY2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyNTc3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI1ODE7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTI2MDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjYwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyNjA2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI2MDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MjYwOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNjExOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNjE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI2MTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI2MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjYxOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjYyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNjI1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNjI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI2Mjk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI2MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjYzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjYzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNjM5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI2NDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI2NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjY0NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNjUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNjUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI2NTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI2NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjY1ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNjYzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI2NzM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI2Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjY4MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjY4ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNjkyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI2OTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI2OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjY5NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjcwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNzAxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNzEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI3MTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI3MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjcxNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjcxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNzE4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI3MjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI3Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjcyOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjczMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNzMzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI3Mzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjc0MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Mjc0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNzQ2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI3NTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI3NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjc1MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Mjc1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNzU3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI3NjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI3NjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjc2OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Mjc3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNzcxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI3NzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI3Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjc3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Mjc4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNzgyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyNzg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI3ODc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI3ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjc5MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Mjc5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyNzk4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyODAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI4MDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjgwNzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjgxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyODE3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyODI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI4Mjc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI4Mjg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjgzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjgzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyODM0Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotOTI4NDI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI4NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjg0ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Mjg1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyODUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyODU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI4NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjg1OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Mjg2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyODY0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyODcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI4NzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI4NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjg3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Mjg3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyODgwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyODg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI4ODY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI4OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjg5MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Mjg5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyODk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkyODk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI4OTg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTI5MDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjkwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MjkxMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyOTEzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTI5MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjkxNzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MjkyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyOTI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTI5Mjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MjkzMjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkyOTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI5MzY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Mjk0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyOTQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTI5NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjk0ODsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Mjk2MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyOTY2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTI5Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjk2OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Mjk3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyOTgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTI5ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mjk4MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkyOTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTI5ODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Mjk4Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkyOTkwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzMDAyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMwMDY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTMwMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzAxODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzMDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMwMjA7MzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTMwNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzA1NDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzA2NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMDY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTMwNjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzA3Mjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkzMDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMwNzk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTMwODk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzA5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzMDkyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMwOTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMwOTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzEwMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzEwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMTAyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMxMDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMxMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzExMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzExNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMTE4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMxMjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMxMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzEyNTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzEzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMTM1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMTQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMxNDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMxNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzE0OTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTkzMTUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMxNTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMxNTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzE1OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzE2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMTYxOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotOTMxNjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMxNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzE3MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMTcyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMxODE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMxODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzE4NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzE4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMTg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMxOTI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMxOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzE5ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzIwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMjA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMyMTE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci05MzIxODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzIxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMjIwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMyMjI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMyMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzIzMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzIzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMjM0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMyMzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMyNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzI0Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMjQ4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMjU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMyNTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMyNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzI2MTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTkzMjY4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMyNzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMyNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzI3OTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzI4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMjg4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMyOTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMyOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzI5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzI5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMzAwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMzMTA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMzIwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMzMjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMzMjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzMyNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzMzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMzM0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMzMzg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMzNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzM0Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzM1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMzUzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMzNTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTMzNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzM2MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05MzM2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMzcyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTkzMzc0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTMzNzY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MzM4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzMzgxOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzNDAzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTM0MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzQwNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzNDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM0MTA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MzQxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNDE0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM0MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzQxNzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkzNDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM0MjU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzQzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNDMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM0MzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzQzNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkzNDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM0NDE7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzQ0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNDQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzQ0ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM0NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzQ1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNDUzOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzNDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM0NzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzQ3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNDc3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzNDg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM0OTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MzQ5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNDk1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzUwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzNTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM1MDc7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM1MzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzUzMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkzNTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM1Mzc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM1NTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzU1NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkzNTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM1NTk7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM1NzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzU3NTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkzNTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM1ODM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM1OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzU5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzNTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM1OTg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM2MDg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzYxMzsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzYzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNjM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzYzNjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkzNjQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM2NDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzY0NDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTkzNjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM2NDc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzY1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNjUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM2NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzY1NTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzNjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM2NjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzY2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNjY3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM2Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzY3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzNjcxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM2NzU7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzY3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNjgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzY4Mjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzNjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM2OTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzY5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzNjk0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM2OTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzY5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzNzAwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM3MDQ7Njc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTkzNzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM3NzI7NDE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTkzODEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM4MTQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05MzgxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzODE3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM4MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzgyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzODI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM4MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzgyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzODI3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM4Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzgzMDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Mzg0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzODQ2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM4NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mzg0OTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzODUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM4NTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Mzg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzODU2OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM4NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mzg2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzODYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM4NjU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05Mzg3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzODcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM4NzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Mzg3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzODc5OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzODkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM4OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Mzg5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzODk2OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTkzOTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTM5MjQ7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05MzkzMDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzOTM2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTM5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05MzkzOTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Mzk1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTkzOTU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTM5NTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Mzk2Mzs2OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotOTQwMzI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDAzNDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDA0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0MDQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDA1MTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDA3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0MDcyOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0MDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQwODg7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDA5NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0MDk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQwOTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDEwMTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDExMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0MTE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQxMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDExNjs0MDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDE1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0MTU5OzU5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05NDIxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0MjE5OzU1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05NDI3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0Mjc1OzQ2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05NDMyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0MzIyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTQzMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDMyNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0MzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQzMjg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDMzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0MzMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQzMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDMzMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0MzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQzMzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDMzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0MzM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQzMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDM0MDsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDM2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0MzYzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQzNjU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDM3MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0MzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQzNzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDM3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0Mzc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQzNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDM3ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0MzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQzODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDM4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0MzgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQzODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDM4NTsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDQwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NDA3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ0MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDQxMDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ0MTk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDQyMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NDI2OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ0Mzk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDQ0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NDQyOzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ0ODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDQ4Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NDg2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTQ0ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDQ4OTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDUwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NTA1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ1MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDUwODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDUxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NTIwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDUyMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ1MzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDUzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NTM2OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ1NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDU1MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NTU2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ1Njg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDU2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NTcwOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NTg1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ1OTA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05NDU5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NTkzOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ2MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDYwMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NjAzOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ2MDk7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ2Mjg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDYzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NjM0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ2Mzk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ2NTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDY1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NjU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ2NTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDY2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NjYzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTQ2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDY2Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0Njc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ2NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDY3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NjgxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ2OTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDY5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0Njk1OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NzEwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ3MTQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ3Mjk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05NDczMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0NzM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ3Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDczOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NzQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ3NDI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDc0NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NDc0NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NzUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0NzUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ3NTI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTQ3NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDc2MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NDc2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NzY0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0NzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ3NzQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTQ3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDc4MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NDc4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0NzgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0Nzg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ3ODc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTQ3OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDc5Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NDgwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0ODA0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk0ODA2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ4MDg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05NDgxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0ODEzOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk0ODMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTQ4MzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDgzMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0ODM2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTQ4Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDgzOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDg1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0ODUyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDg1NTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDg2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0ODY3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ4Njk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDg3NDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDg4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0ODg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ4ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDg4OTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDkwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0OTAxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ5MDM7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDkwOTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDkyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0OTIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ5MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDkyMzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDkzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0OTM1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ5Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDkzODsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDk1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0OTU0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ5NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDk1NzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NDk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk0OTcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTQ5NzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NDk3NjszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NTAwODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MDExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTUwMTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTAxNTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk1MDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUwMjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NTAyMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MDI1OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk1MDUzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUwNTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NTA1NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MDU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTUwNjA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTA2MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTA2NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MDY4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MDY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUwNzA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUwNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTA3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MDgyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUwODk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTA5MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTA5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MDk2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUxMDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUxMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTEwNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTEwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MTA4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUxMTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUxMjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTEyOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTEzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MTMxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUxMzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTEzODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTE0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MTQ2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUxNTY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUxNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTE2NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTE2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MTY5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUxNzQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUxNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTE4MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MTgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUxODc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUxOTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTE5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MTk4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUyMDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUyMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTIxMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTIxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MjE0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUyMjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUyMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTIyMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTIyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MjI5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUyMzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUyMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTIzNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MjQwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUyNDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUyNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTI1MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTI1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MjU5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MjYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUyNjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUyNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTI2NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTI3MDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTk1MjcxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1Mjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUyNzY7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1Mjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUyODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUyOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTI5MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTI5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1Mjk3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUzMDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUzMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTMwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTMxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MzExOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUzMTY7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUzMjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUzMzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTMzMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTMzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MzM1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUzNDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUzNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTM0ODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTM1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MzU4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUzNjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUzNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTM2NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1MzczOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1MzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTUzODM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTUzOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTM5MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTM5NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1Mzk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU0MDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU0MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTQwNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTQxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NDExOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU0MTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTQxOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTQyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NDI1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU0Mjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU0MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTQzMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTQzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NDQwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU0NDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU0NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTQ0Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTQ1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NDUyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NDYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU0NjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU0NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTQ2NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTQ3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NDcxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU0ODE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU0ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTQ4NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTQ5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NDk2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NDk3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU1MDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU1MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTUwMzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTk1NTEwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU1MTI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU1MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTUxODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTUxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NTIwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NTI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU1MzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU1MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTUzMzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTk1NTQwOzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTU1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NTU1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU1NjE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU1Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTU2ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTU3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NTcxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU1NzU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU1ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTU4MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTU4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NTg4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NTk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU1OTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU2MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTYwMTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTk1NjA4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU2MTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU2MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTYxODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTYyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NjI0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU2Mjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU2MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTYzMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NjM3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk1NjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU2NDQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTU2NTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTY1NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NTY1NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NjU5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTU2NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTY2MzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NTY4MTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk1Njg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU2ODU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NTY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1Njg4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTU2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTY5MjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NTcwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NzA4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTU3MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTcxMjs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk1NzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTU3MTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NTcxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NzIyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTU3MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NTcyNjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NTczNzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1NzQyOzY2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05NTgwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1ODA5Ozc2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05NTg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1ODg2Ozc0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05NTk2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk1OTYxOzUwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05NjAxMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MDEzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTYwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjAxNjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjAzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MDMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYwMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjAzNDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjA0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MDUwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYwNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjA1MzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjA2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MDY5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjA3MjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjA4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MDg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYwODY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjA5MDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjEwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MTA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYxMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjEwODsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjEzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MTM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYxMzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjEzODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk2MTQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYxNDU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05NjE0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MTQ4OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2MTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYxNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MTY2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2MTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYxODI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjE4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MTg1OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2MjAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYyMDE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjIwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MjA0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2MjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYyMTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjIxODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MjIyOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2MjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYyMzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MjQwOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2MjYzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYyNjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjI2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MjcwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTYyNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjI3MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2Mjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYyNzY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjI3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2Mjc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYyODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjI4MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2MjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYyODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjI4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2Mjg2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYyODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjI4ODsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjMxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2MzExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYzMTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjMxNjszMjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotOTYzNDg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjM1MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk2MzUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYzNTM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYzNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjM2NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2MzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYzNjk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYzODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjM4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2MzgzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTYzODg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTYzOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjM5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2NDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY0MDE7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTY0MzA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjQzNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2NDM1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY0Mzk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05NjQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NDQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTY0NDU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjQ1MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjQ2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NDYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTY0NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjQ2MzszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjQ5ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NTAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTY1MDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjUwNzs1OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotOTY1NjY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjU2ODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk2NTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY1NzE7MzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTY2MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjYwODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2NjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY2MTE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjYxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NjE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTY2MTg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjYyMzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjYzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NjM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTY2Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjY0MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjY1MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NjU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTY2NTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjY1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2NjYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY2NjM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05NjY2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NjcwOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk2Njg1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY2ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NjY4ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NjkwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2NjkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY2OTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY2OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjY5ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NjcwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NzA2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2NzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY3MTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY3MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjcxNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NjcxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NzIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2NzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY3MjM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY3Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjcyODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NjczMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NzMyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2NzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY3Mzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njc0MjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY3NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njc1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Njc1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NzU2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2NzYyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY3NjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY3NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njc2NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Njc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2NzcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2NzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY3NzQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY3ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njc4Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Njc4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2Nzg3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2Nzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY3OTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY3OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njc5OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NjgwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2ODA1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2ODEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY4MTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY4MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjgxNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NjgyMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2ODI1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2ODI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY4Mjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY4MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjgzMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NjgzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2ODM3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2ODM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY4NDA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY4NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njg0OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Njg1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2ODUzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2ODU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY4NTg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njg2NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Njg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2ODY4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2ODczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY4NzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njg3Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Njg4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2ODgyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2ODg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY4ODY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY4OTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njg5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Njg5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2OTAwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2OTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY5MDk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY5MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjkxMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NjkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2OTE2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2OTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY5MjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY5MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NjkyNTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NjkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2OTMzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2OTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY5Mzc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY5NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njk0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Njk0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2OTQ3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2OTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY5NTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY5NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njk2MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Njk2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2OTY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2OTY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY5NzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY5NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njk3MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Njk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2OTc2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2OTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY5ODA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY5ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njk4NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05Njk5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk2OTkxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk2OTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTY5OTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTY5OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Njk5ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NzAwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MDAzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk3MDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcwMTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTcwMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzAxMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NzAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MDE3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk3MDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcwMjc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTcwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzAzMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NzAzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MDM1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk3MDM5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcwNDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTcwNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzA0NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NzA0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MDQ5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk3MDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcwNTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTcwNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzA1ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NzA2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MDY0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk3MDY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcwNzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTcwNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzA3NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NzA3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MDc5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NzA4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MDkyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk3MDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcwOTQ7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci05NzA5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MTAwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk3MTAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcxMDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTcxMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzEwNjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTk3MTEzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk3MTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcxMjA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTcxMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzEyODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NzEzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MTMxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk3MTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcxMzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTcxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzEzODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NzE0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MTQ1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk3MTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcxNDk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTcxNTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzE1NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05NzE1ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MTYwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTcxNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzE2NTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzE3Njs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk3MTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcxODQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzE5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MTkyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTcxOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzE5Njs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3MjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcyMDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzIwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MjA3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTcyMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzIxMTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3MjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcyMjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzIyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MjIzOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3MjQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcyNDk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05NzI1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MjUzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3MjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcyNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzI2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3MjY2Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTcyNzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzI3NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk3MjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTcyODE7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTcyOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzI5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3Mjk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTczMDA7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTczMjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzMyNjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk3MzI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTczMzA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTczNDA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzM0Njs1MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotOTczOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzM5NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk3Mzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc0MDA7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc0MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzQxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NDE4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc0MjI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05NzQyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NDI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc0MzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzQzMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3NDM2Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzQ0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc0NDg7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc0NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzQ2NjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk3NDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc0Njk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzQ4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc0ODI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzQ5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3NDkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc0OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzQ5NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc0OTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzQ5ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3NTAyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTc1MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzUwNjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzUyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3NTIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc1MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzUyNDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc1MzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzUzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3NTM2OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NTU5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc1NjM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05NzU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3NTY3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc1NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzU3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc1Nzg7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc2MDE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzYwNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk3NjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc2MDk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc2MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzYyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc2MjM7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc2NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzY0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc2NDQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzY1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3NjU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc2NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzY1NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3NjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc2NTk7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzY2Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3NjcwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTc2NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzY3NDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzY4Nzs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3Njk1OzY1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05Nzc2MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3NzYyOzM4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05NzgwMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3ODAyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3ODEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc4MTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3ODE2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3ODI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc4Mjg7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc4NDE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Nzg0NTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3ODU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc4NTU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Nzg1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3ODU4OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3ODcwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc4NzQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc4ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Nzg4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3ODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc4ODg7MzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTc5MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05NzkyMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05NzkzMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3OTM4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTc5NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05Nzk0MTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3OTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc5NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Nzk1MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3OTU2OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk3OTg0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTc5ODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05Nzk4OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk3OTkzOzQyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05ODAzNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MDM3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgwNTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODA1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MDUyOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgwNzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODA3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MDc1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgwODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODA4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MDg5OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MTEyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgxMTY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05ODExODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MTE5OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgxMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODEzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MTM1Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTgxNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODE0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgxNDY7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTgxNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODE2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MTY0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgxNjk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTgxODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODE4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgxODQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTgxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODIwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MjAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgyMDI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODIxMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MjE1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTgyMTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODIyMDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk4MjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgyMjM7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTgyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODIzNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgyMzk7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTgyNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODI2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MjYyOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgyNjk7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTgzMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODMwNzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk4MzExOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTgzMTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODMxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4MzE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTgzMjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODMyMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MzI1OzY2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05ODM5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4MzkyOzY5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci05ODQ2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4NDYyOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4NDgzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg0ODY7NTE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTk4NTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg1Mzg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05ODU0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4NTQyOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4NTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg1NTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODU1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4NTU4OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4NTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg1NzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4NTc3OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4NjAwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg2MDM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODYxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4NjExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg2MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODYxMzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODYyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4NjI0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODYyNjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODY0MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4NjQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg2NDM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODY0NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05ODY0ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4NjUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk4NjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg2NTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTg2NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODY1OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05ODY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4NjYzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk4NjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg2NzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTg2NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODY3MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05ODY3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4Njc3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk4NjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg2ODE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTg2ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODY4NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05ODY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4Njg4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk4NjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg2OTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTg2OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODY5OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05ODcwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4NzA3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk4NzEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg3MTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTg3MTc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODcxOTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk4NzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg3MjQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg3MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODczNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4NzM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg3NDA7NTc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTk4Nzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg3OTg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05ODgwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4ODAxOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4ODE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg4MTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODgxOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4ODIzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4ODM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg4Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05ODgzOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4ODQyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTg4NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODg0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4ODQ4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg4NTI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05ODg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk4ODU2OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg4NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODg2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4ODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg4NjM7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg4ODA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODg4NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk4ODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg4ODg7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg5MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODkwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4OTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg5MDg7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg5Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODkzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4OTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg5NDA7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg5NzE7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODk3ODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk4OTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg5ODE7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTg5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05ODk5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk4OTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTg5OTY7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkwMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTAxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5MDE2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkwMjE7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkwMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTAzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5MDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkwMzU7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkwNTM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTA1ODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05OTA3MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5MDc0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkwNzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTA3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5MDc5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkwODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05OTA4MjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5MDg0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5MDg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkwOTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTkwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTA5Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTA5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5MDk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5MTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkxMDI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTkxMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTEwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTExMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5MTEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5MTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkxMTY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTkxMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTEyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTEyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5MTI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5MTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkxMzM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTkxMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTEzOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTE0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5MTQ1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5MTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkxNTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTkxNTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTE2MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTE2MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5MTY1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTkxNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTE3MDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05OTE4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5MTg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkxODU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTE4ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk5MTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkxOTI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkyMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTIwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5MjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkyMDk7MzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkyNDM7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTI0OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk5MjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkyNTI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTI2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5MjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkyNjc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkyODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTI4MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5Mjg0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkyODg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkyOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTMwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5MzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTkzMDI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTkzMTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTMyMTs2NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotOTkzODc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTM4OTs2OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotOTk0NTg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTQ2MDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05OTQ4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NDgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTk0ODQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTQ4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5NDg3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk0ODk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk0OTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTQ5NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTQ5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NDk3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk1MDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk1MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTUwOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTUxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NTE0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk1MTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk1MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTUyMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTUyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NTI1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk1Mjk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk1MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTUzNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTUzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NTQwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTU1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NTUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk1NTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk1NjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTU2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NTY1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk1Njg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk1NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTU3Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTU3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NTgwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk1ODU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk1OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTU5MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTU5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NTk3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk2MDM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk2MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTYxMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTYxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NjE2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NjIxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk2MjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTYyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTYyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NjMwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk2MzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk2Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTYzOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTY0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NjQ4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk2NTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk2NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTY1Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTY2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NjY0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk2Njc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk2NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTY3MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTY3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5Njc2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk2ODE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk2ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTY4NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTY5Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5Njk3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5Njk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk2OTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk3MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTcwODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTcxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NzExOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk3MTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk3MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTcxOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NzI0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk3MzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk3MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTczNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTc0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NzQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk3NDY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk3NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTc1NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTc1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NzU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk3NjM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk3NzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTc3NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5Nzc4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5NzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk3ODE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk3ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTc4NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTc4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5NzkwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5Nzk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk3OTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk3OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTc5ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTgwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5ODAzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5ODA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk4MDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk4MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTgxNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTgxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5ODE4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5ODIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk4MjI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk4MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTgzMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTgzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5ODM1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5ODM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk4NDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTg0NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTg0ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5ODUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5ODUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk4NTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTg1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTg2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5ODYyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5ODY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk4Njg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk4NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTg3MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTg3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5ODc3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5ODc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk4ODA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotOTk4ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTg4NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTg4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5ODkwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci05OTkwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5OTAzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTk5OTA1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk5MDc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05OTkxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5OTEyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTk5MjE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci05OTkyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5OTI5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTk5MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTkzNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk5OTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk5NDE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05OTk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5OTQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTk5NDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTk1MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTk5OTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk5NTY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotOTk5NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTk2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTk5OTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotOTk5Njk7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci05OTk3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTk5OTgwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotOTk5ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci05OTk4NDsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAwMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAwMDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAwMDM7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMDI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMDI5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAwMDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMDMzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMDQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMDQ1OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDA2MDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDA2NjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMDA2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDA2OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAwNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAwODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAwODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAwODI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAwODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAwODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAwODY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAwOTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDAwOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAwOTU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMTA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMTA5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDEyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDEyMTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAxNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAxNDE7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAxNDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAxNTM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDAxNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAxNTc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMTcwOzg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMTc4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMTg4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMTkxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDIwMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDIwNzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAyMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAyMTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAyMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAyMjE7MzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMjU1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDI2Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDI3MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMDI3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDI3Mzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDI4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDI4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDI4Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDI4ODszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAzMjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAzMjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAzMjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAzMjk7Mzc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwMDM2NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDM2ODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAzODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAzODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDAzODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDAzODM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwMzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwMzk1OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDQxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDQxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDQxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDQxODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA0Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA0MzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA0MzI7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwNDU2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwNDYwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAwNDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwNDYzOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDQ3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDQ3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDQ3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDQ3OTsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA1MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA1MDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA1MDI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA1MDc7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwNTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwNTQ1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAwNTQ5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwNTUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwNTU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwNTU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwNTU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwNTYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwNTYzOzY2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMDA2Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA2MzA7Njk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwMDY5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDcwMDsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA3MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA3MjQ7NTE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwMDc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDc3NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMDc3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDc4MDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA3OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA3OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA3OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA3OTY7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwODEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwODEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwODE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwODE1OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDgzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDg0MTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDg0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDg0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMDg1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDg1MTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA4NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA4NjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA4NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA4NjQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwODc4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwODgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwODgxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwODgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMDg4NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDg4OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDA4OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA4OTE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAwODk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwODk5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMDkwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDkwMzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDA5MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA5MTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAwOTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwOTE2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMDkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDkyMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDA5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA5MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAwOTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwOTMwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMDkzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDkzODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDA5NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA5NDQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAwOTUzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwOTU2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMDk1ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDk2MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMDk2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMDk2NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDA5Nzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDA5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDA5ODE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwOTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwOTkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAwOTkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAwOTk2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAwOTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMDAwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTAxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTAxNDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTAxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTAyMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMTAyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTAyNDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTAzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTAzNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTAzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTAzNjszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTAzOTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTA0NTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMTA0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTA0ODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDEwNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDEwNjU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDEwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDEwNjg7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDEwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDEwNzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDEwNzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDEwNzc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxMDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMDkzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxMDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMDk1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTEwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTExMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTExMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTExNTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMTExNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTExODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDExMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDExMjk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDExMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDExMzI7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxMTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMTUyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxMTUzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMTU3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAxMTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMTYwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTE3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTE3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTE3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTE3NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDExODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDExODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDExODk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDExOTQ7MTk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwMTIxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTIxNjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTIyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTIyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTIyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTIyODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDEyNDA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDEyNDY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxMjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMjU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxMjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMjYwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTI3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTI3MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTI3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTI3NDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDEyODY7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDEyOTM7NDY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwMTMzOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTM0MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMTM0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTM0NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDEzNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDEzNTg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDEzNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDEzNjE7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxMzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMzc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxMzc5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMzg1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxMzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMzk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxMzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxMzk3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTQwOTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTQxNTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE0MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE0Mjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE0Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE0Mjk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxNDQ1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNDUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxNDUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNDU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxNDU2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNDYwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAxNDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNDY1OzU5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMDE1MjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE1MjY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDE1Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE1Mjk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxNTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNTQ2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxNTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNTQ5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTU2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTU2MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTU2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTU2NDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE1NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE1NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE1Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE1Nzg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxNTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNTkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxNTkyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNTk3OzY4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMDE2NjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE2Njg7MjQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwMTY5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTY5NTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTcwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTcwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTcwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTcwNzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE3MTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE3MjQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxNzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNzM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxNzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxNzM4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTc0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTc1MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTc1MjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE3NjQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE3NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE3NzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE3NzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE3NzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE3Nzg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDE3ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE3ODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE3ODQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE3ODg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDE3OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE3OTE7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxODAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxODA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxODA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxODA2OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTgxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTgxOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTgyMDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTgyNTsxOTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTAxODQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxODQ3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTg1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTg2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTg2MTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE4NzM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE4Nzg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE4ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE4ODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDE4ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDE4OTA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxOTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxOTAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAxOTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxOTA0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTkxNjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTkyMTs0NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTAxOTY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxOTcwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAxOTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAxOTczOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTk4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTk4NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMTk4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMTk4OTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDIwMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDIwMDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDIwMDc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDIwMTM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyMDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMDI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyMDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMDI3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjAzOTsxMDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDIwNDk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyMDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMDYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyMDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMDYzOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjA3OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjA4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjA4NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjA4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjA5MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjA5NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMjA5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjA5OTs1OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTAyMTU4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMTYwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAyMTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMTYzOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjE3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjE4MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjE4MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDIxOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDIxOTU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDIxOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDIxOTg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyMjA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMjEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyMjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMjEyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjIyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjIyNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjIyNjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjIzMTs2OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTAyMzAwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMzAzOzI0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMDIzMjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDIzMzA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyMzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMzQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyMzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyMzQ0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjM1Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjM2MTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjM3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjM3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjM3MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDIzODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDIzODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDIzODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDIzODc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyMzk5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNDA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyNDA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNDA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyNDEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNDEzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAyNDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNDE2OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjQyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjQyOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjQzMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjQzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjQzNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjQzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjQzODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjQ0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjQ0ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjQ1MTszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjQ1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjQ1Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjQ2MDszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI0OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI0OTM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI1MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI1MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI1MDU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyNTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNTE4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAyNTIyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyNTI0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNTI4OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjU0OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjU1MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjU1MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjU1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjU1NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjU1ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDI1NjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI1NjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAyNTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNTY2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMjU3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjU3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDI1NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI1NzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAyNTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNTgyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMjU4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjU4NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDI1ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI1ODk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAyNTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNTk0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMjYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjYwNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDI2MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI2MDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAyNjA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNjEwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMjYxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjYxNDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDI2MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI2MjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAyNjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNjI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMjYzMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjYzNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDI2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI2MzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAyNjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNjQxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMjY0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjY0NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDI2NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI2NDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAyNjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNjUzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMjY1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjY2MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDI2NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI2NjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAyNjY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNjY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMjY2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjY3MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDI2NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI2NzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAyNjc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNjc3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMjY3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjY3OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDI2ODQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI2ODc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAyNjg5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNjkxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAyNjk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNjk2OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjcxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjcyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjcyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjcyNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMjcyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjcyODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjczNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjczODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjczOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjc0MDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI3NTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI3NTg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDI3NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI3NjI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyNzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNzczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyNzc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyNzc1OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjgxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjgxMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMjgxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjgxNzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI4Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI4MzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI4MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI4MzI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyODQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyODQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyODQ2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjg1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjg2MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjg2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjg3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjg3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjg3Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMjg3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjg3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjg4MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMjg4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjg4MzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI4OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI4OTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI4OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI4OTk7MzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyOTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyOTM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyOTM3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyOTQxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjk1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjk1MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMjk1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMjk1NTsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDI5ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDI5ODM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAyOTk0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAyOTk4OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzAxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzAxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzAxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzAxNzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMzAyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzAyNDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMzAyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzAyNzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDMwMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDMwMzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDMwMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDMwNDA7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzMDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzMDYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzMDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzMDY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzMDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzMDY3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzMDY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzMDcwOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzA4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzA4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzA4ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzA5Mjs2NDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTAzMTU2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzMTU4OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzE3MDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzE3NjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDMxODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDMxODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDMxODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDMxOTA7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzMjI1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzMjI5OzY2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMDMyOTU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDMyOTc7Njk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwMzM2NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzM2ODsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDMzODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDMzOTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDMzOTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDMzOTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDMzOTY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDMzOTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAzNDAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNDA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMzQwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzQwNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDM0MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM0MTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAzNDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNDE2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMzQyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzQyMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDM0MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM0MjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAzNDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNDI5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMzQzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzQzODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDM0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM0NDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAzNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNDUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMzQ1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzQ1NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDM0NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM0NTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAzNDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNDYyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMzQ2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzQ2NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDM0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM0Njk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAzNDc3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNDgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMzQ4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzQ4Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDM0ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM0ODg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAzNDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNDkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMzQ5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzQ5NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDM1MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM1MDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAzNTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNTA1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMzUwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzUwODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDM1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM1MTI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAzNTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNTIyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMzUyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzUyNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDM1MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM1Mjc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTAzNTMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNTM1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwMzUzNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzUzOTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMzU0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzU0NDsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM1NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM1NzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM1NzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM1NzY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDM1Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM1ODA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM1ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM1OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM1OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM1OTI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzNjA3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNjEwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTAzNjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNjE0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzYyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzYyNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzYyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzYyNzszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM2NjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM2NjU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDM2Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM2Njk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzNjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNjgyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzNjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNjg0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzY5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzY5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzY5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzY5ODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM3MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM3MTI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM3MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM3MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM3MjQ7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDM3Mjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM3MzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM3MzM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDM3MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM3MzY7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzNzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNzUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzNzUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNzUyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzNzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNzU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzNzU2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzNzYwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzc3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzc3MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzc3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzc3NDszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM4MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM4MDY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzODE3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzODIxOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzg0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzg0NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzg0NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzg0OTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMzg1MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzg1NjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwMzg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzg1OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM4Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM4NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM4NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM4NzI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM4NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM4NzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM4NzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM4ODA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzODkyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzODk2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzkwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzkwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzkwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzkwOTszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDM5NDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDM5NDg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzOTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzOTYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTAzOTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTAzOTYyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzk3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzk3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwMzk3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwMzk3NTszNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDQwMTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQwMTU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0MDI3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MDMwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0MDMxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MDMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0MDM0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MDM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDAzOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDA0MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQwNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQwNDQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MDUwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDA1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDA1NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQwNjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MDYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MDY0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDA2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDA2OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQwNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQwNzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MDc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MDc4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDA4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDA4MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQwODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQwODU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MDkwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDA5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDEwMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQxMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQxMDc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MTE1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MTE5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDEyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDEyMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQxMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQxMjQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MTI4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDEzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDEzODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQxNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQxNDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MTQ1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDE1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDE1MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQxNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQxNTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MTYxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDE2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDE2NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQxNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQxNzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MTc0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDE3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDE3ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQxODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQxODE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MTg1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDE4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDE4OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQxOTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQxOTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MTk5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDIwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDIwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQyMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQyMDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MjA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MjEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDIxNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQyMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQyMTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MjI2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDIzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDIzMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQyMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQyMzU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MjQ1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDI1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDI1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQyNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQyNTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MjYzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDI2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDI2Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQyNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQyNzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0Mjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0Mjc2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDI4MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQyODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQyODQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0Mjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0Mjg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDI5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDI5MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQyOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQyOTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0Mjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0Mjk5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDMwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDMwMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQzMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQzMDk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MzE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDMxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDMyMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQzMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQzMjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MzI2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MzMwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDMzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDMzMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQzMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQzMzc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MzQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MzQ1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDM0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDM0Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQzNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQzNTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MzU5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDM2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDM2OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQzNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQzNzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0MzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0MzgyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDM4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDM4Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQzOTI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0Mzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NDAwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDQwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDQwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQ0MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ0MDk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0NDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NDE2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDQxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDQyMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQ0MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ0MjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0NDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NDI3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDQyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDQzMDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQ0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ0Mzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0NDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NDQ0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDQ0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDQ0ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQ0NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ0NTI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDQ2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDQ2Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQ0NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ0NzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0NDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NDc2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDQ3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDQ4MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDQ0ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ0ODk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0NDk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NTAxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDUwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDUwMzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA0NTEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NTE2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNDUxODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDUyMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwNDUyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDUyNTsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDQ1NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ1NDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDQ1NDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ1NTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDQ1NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ1NTU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NTY2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NTY5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA0NTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NTczOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNDU4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDU4NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwNDU4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDU5MDsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDQ2MDY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ2MTI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDQ2MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ2MTU7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NjMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NjMzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NjM3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA0NjQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NjQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NjQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NjQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NjUxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NjYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NjYzOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNDY3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDY4MjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDQ2OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ2OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDQ2OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ3MDA7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NzM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NzM4OzMxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMDQ3Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ3NzA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NzgxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NzgzOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NzkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NzkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0NzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0NzkzOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNDgwNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDgxMDsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDQ4Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ4Mzg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0ODQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0ODQ5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNDg2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDg2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNDg2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDg2MzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDQ4ODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ4ODM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDQ4ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ4ODY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0ODk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0ODk3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0ODk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0OTAwOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNDkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDkyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNDkyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDkyNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNDkyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDkyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNDkyOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNDkzMzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDQ5NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ5NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDQ5NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDQ5NDc7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0OTcwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0OTczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0OTc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0OTc3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA0OTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0OTgyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0OTgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0OTg3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0OTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0OTk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA0OTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA0OTk5OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNTAxMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTAxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNTAxNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTAxOTszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDUwNDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDUwNTM7NTk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwNTExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTExMzszMzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTA1MTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1MTQ3OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNTE3NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTE3ODs2NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTA1MjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1MjQ1OzY5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMDUzMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDUzMTU7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA1MzM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1MzM5OzQ4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMDUzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDUzODg7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDUzOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDUzOTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDUzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDUzOTg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA1NDA5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NDExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA1NDEyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NDE0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTQxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTQyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU0MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU0MjI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NDI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NDI4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTQzMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU0Mzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NDQyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTQ0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTQ0NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU0NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU0NTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NDU0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTQ1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTQ1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU0NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU0NjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NDY2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTQ3Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU0ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU0ODM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NDkxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NDk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTQ5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTQ5NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU0OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU1MDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NTA0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTUxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTUxNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU1MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU1MTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NTIxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTUyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTUyNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU1MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU1MzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NTM3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTU0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTU0MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU1NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU1NDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NTUwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTU1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTU1NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU1NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU1NTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NTYxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTU2NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU1Njk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU1NzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NTc1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTU3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTU3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU1ODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NTg2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTU5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTU5MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU1OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU1OTQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NjAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NjAyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTYwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTYwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU2MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU2MTE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NjIxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTYyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTYzMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU2MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU2MzM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NjM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTY0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTY0Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU2NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU2NDk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NjUyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTY1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTY1Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU2NjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NjY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTY3Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU2ODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1Njg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1Njg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTY4ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU2OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU2OTE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1Njk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1Njk5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTcwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTcwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU3MDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU3MDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NzEwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTcxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTcxNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU3MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU3MjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NzI2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTczMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTczNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU3Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU3Mzg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NzQ4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTc1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTc1ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU3NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU3NjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NzY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1NzY1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTc3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTc3MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU3Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU3Nzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1NzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1Nzg0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTc4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTc4ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU3OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU3OTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1Nzk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1ODAxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTgwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTgwMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU4MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU4MDY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1ODA5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTgxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTgxODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU4MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU4MjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1ODI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1ODI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTgzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTgzMTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1ODQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1ODQyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTg1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTg1MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU4NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1ODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1ODU5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNTg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTg2ODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU4Nzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU4ODA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1ODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1ODgyOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDU4OTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU4OTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA1ODk3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1ODk5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA1OTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1OTA0OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNTkyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTkyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNTkyNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTkyODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwNTkzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNTkzMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDU5NDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU5NDY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDU5NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU5NTA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDU5NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU5NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDU5NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDU5NjI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA1OTc3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1OTgxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA1OTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA1OTg1OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNjAwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjAwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNjAwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjAwMzszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDYwMzg7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYwNDQ7MzE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwNjA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjA3NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDYwODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYwODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDYwODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYwODk7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDYwOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYwOTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDYwOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYwOTk7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA2MTEyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MTE2OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNjE0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjE0NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDYxNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYxNTU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA2MTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MTY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA2MTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MTY5OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNjE4Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjE5MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwNjE5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjE5MzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDYyMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYyMDQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDYyMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYyMDc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDYyMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYyMTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDYyMTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYyMTU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA2MjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MjI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA2MjI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MjI5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA2MjMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MjM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA2MjM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MjM4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA2MjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MjQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA2MjQ0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MjQ4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA2MjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MjU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA2MjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2MjYwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNjI3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjI3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNjI3NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjI3ODszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDYzMDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDYzMTE7NjY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwNjM3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjM3ODs2OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTA2NDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NDQ4OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNjQ2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjQ3MjszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDY1MDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY1MDc7NDk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwNjU1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjU1Nzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNjU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjU2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNjU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjU2NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDY1Nzg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY1ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDY1ODE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY1ODM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NTg2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NTg5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjU5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjU5MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY1OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY1OTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NjAzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjYwODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY2MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY2MTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NjE2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjYyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjYyMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY2MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY2MjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NjMwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjYzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjYzNTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NjQ2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjY0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjY0OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY2NTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY2NTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NjYwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjY2MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY2NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY2Njc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2Njc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2Njc1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjY3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjY4MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY2ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY2ODg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NjkyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjY5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjY5ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY3MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY3MDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NzEwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjcxNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjcxODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY3MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY3MjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NzI0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjczMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY3MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY3MzM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NzQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjc0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjc0Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY3NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY3NTE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NzU4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjc2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjc2MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY3NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY3Njc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2NzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NzcwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjc3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjc3NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY3Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY3Nzk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2Nzg3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2NzkxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjc5Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY4MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY4MDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2ODA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2ODA1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjgwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjgwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY4MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY4MTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2ODE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2ODE4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjgyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjgyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY4Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY4MzA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2ODM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2ODM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjgzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjg0MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY4NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY4NTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2ODUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2ODUzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjg1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjg1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY4NjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY4NjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2ODY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2ODY2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjg2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjg2OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY4NzM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2ODc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2ODc4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjg4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjg4NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY4ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY4ODY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2ODkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2ODkxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjg5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjg5Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY5MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY5MDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2OTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2OTA2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjkxMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY5MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY5MjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2OTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2OTIzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjkyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjkyODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY5MzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY5MzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2OTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2OTM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjk0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjk0Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY5NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY5NDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2OTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2OTUxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjk1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjk1Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY5NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY5NjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2OTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2OTY3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjk3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjk3MjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA2OTgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA2OTg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNjk4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjk4NzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEwNjk5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNjk5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDY5OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDY5OTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MDAzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzAwNzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcwMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcwMTc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MDI3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzAyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzAzMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcwMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcwMzQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MDQwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzA0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzA0ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcwNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcwNTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MDU3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzA2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzA2NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcwNjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcwNzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MDcyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzA3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzA3NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcwNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcwNzg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MDg3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzA5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzA5MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcwOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcwOTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MTAwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcxMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcxMTE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MTIxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzEyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzEyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcxMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcxMjg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MTM3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzE0NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzE0OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcxNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcxNTE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzE2MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzE2NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDcxNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcxNjY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMDcxNzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcxNzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3MTc1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MTc3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA3MTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MTgyOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNzIwMjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwNzIwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzIwNjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNzIxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzIxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNzIxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzIxNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwNzIyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzIyMTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDcyMzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcyMzU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDcyMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcyMzk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDcyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcyNDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDcyNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDcyNTE7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA3MjY2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MjY5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA3MjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3MjczOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNzI4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzI4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNzI5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzI5MTszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDczMjY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDczMzI7MzE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwNzM2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzM2NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDczNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDczNzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDczNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDczNzc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDczODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDczODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDczODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDczODc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA3NDAwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NDA0OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNzQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzQzMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDc0NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc0NDM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA3NDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NDU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA3NDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NDU3OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwNzQ3NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzQ3NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDc0ODg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDc0OTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDc0OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc0OTQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDc1MDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc1MDQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDc1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc1MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDc1MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc1MTQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA3NTI1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NTI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA3NTI4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NTMwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzUzMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzUzNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc1Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc1Mzg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NTQ2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzU0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzU1MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc1NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc1NTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NTU4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzU2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzU2MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc1NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc1NjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NTcwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzU3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzU3Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc1ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc1ODE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzU5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzU5MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc1OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc1OTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NjAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NjA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzYwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzYwNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc2MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc2MDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NjEzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzYyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzYyMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc2MjY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NjM0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzYzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzYzODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc2NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc2NDQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NjUyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzY1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzY1Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc2NjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc2NjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NjY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzY3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzY3MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc2NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc2Nzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3Njc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NjgwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzY4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzY4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc2OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc2OTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3Njk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3Njk4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzcwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzcwNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc3MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc3MDg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NzE0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzcxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzcxNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc3MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc3MjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NzI2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzczNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzczODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc3Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc3NDA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NzQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzc1MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc3NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc3NTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3NzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3NzYwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzc2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzc2NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc3NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc3NzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3Nzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3Nzc3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzc4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzc4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc3ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc3ODc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3Nzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3Nzk3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzc5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzgwMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc4MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc4MDQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3ODEzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3ODE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzgxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzgxOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc4MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc4MjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3ODI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3ODI2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzgzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzgzMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc4MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc4Mzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3ODM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3ODM5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzg0NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc4NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc4NDk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3ODU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3ODU2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzg1OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc4NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc4NjM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3ODcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3ODczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzg3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzg3Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc4ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc4ODE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3ODg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3ODg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzg4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzg5MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc4OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc4OTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3ODk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3OTAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzkwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzkwMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc5MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc5MDk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3OTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3OTEyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzkxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzkxODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc5MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc5MjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3OTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3OTI1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzkzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzkzMTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3OTQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3OTQ0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzk0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzk0NjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEwNzk0OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzk1MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc5NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc5NTQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3OTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3OTYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzk2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzk2Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc5NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc5NzY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3OTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3OTg2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwNzk4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwNzk4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDc5OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDc5OTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA3OTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA3OTk5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODAwNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDgwMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgwMTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4MDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MDE2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODAyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODAyMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDgwMjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgwMjk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4MDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MDMxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODAzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODAzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDgwMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgwMzc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4MDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MDQ2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODA1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODA1MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDgwNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgwNTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4MDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MDU5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDgwNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgwNzA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4MDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MDgwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODA4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODA4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDgwODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgwODc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4MDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MDk2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODEwNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODEwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDgxMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgxMTA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODEyMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODEyMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDgxMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgxMjU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMDgxMjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgxMzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4MTM0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MTM2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA4MTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MTQxOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODE1OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwODE2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODE2Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODE2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODE3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODE3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODE3NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwODE3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODE3ODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDgxODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgxOTI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDgxOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgxOTY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDgyMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgyMDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDgyMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgyMDg7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4MjIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MjI2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA4MjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MjMwOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODI0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODI0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODI0ODszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDgyODM7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgyODk7MzE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwODMyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODMyMTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDgzMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgzMzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDgzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgzMzQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDgzNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgzNDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDgzNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDgzNDQ7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4MzU3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4MzYxOzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODM4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODM4OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDgzOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg0MDA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4NDExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NDEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4NDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NDE0OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODQzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODQzNDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODQ0Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwODQ0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODQ0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODQ0OTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODQ1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODQ1OTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODQ2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODQ2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODQ2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODQ2OTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDg0ODA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg0ODI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDg0ODM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg0ODU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4NDg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NDkxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODQ5Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDg0OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg0OTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4NTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NTAzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODUwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODUwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDg1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg1MTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4NTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NTE2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODUxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODUyMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDg1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg1MjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4NTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NTI3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODUzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODUzMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDg1MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg1Mzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA4NTM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NTQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwODU0MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODU0NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwODU0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODU1MDsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDg1NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg1NzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDg1NzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg1NzY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDg1Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg1ODA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4NTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NTk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4NTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NTk3OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODYyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODYyNDs3MTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTA4Njk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4Njk2Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4NzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NzA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4NzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NzA4OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA4NzEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4NzE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4NzE3OzcxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMDg3ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg3ODk7NDU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEwODgzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODgzNTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwODgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODgzODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDg4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg4NTU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDg4NTc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg4NjI7MzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4ODk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4ODk5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4OTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4OTAyOzQwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODk0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODk0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODk0NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODk0ODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDg5NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg5NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDg5NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDg5NjI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA4OTc3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA4OTgxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODk5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODk5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwODk5NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwODk5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTAwMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTAwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDkwMDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkwMDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5MDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MDEwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTAxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTAxNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDkwMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkwMjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5MDI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MDI2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTAyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTAyOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDkwMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkwMzM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5MDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MDM5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTA0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTA0MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDkwNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkwNDY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5MDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MDU1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTA2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTA2MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDkwNjU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkwNjc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDkwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkwNzI7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5MDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MDk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5MDk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MTAyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTA5MTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MTA2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTExNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTEyMDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTEyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTEzMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTEzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTEzMjs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwOTEzNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTEzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTE0MTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDkxNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkxNTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDkxNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkxNTU7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5MTgxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MTg0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5MTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MTk0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5MTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MTk2OzM3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTIzMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTIzNjs1NDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTA5MjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5MjkxOzYyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMDkzNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkzNTQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMDkzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkzNTc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDkzNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkzNjc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDkzNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkzNzA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDkzNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkzODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDkzODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDkzODI7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5NDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NDA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5NDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NDA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5NDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NDA5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5NDExOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NDE1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTQyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTQyNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTQyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTQzMDszMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDk0NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk0NjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDk0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk0NjY7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDk0Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk0NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDk0NzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk0NzU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5NDg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NDkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5NDkxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NDk0OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTUxNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTUxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTUxODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTUyMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk1MjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk1MjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NTI4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTUzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTUzNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk1Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk1Mzg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NTQ0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTU0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTU0ODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk1NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk1NTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NTYxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTU2NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk1NzA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk1NzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NTc1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTU3OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk1ODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NTg1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTU4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTU4OTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk1OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk1OTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NjAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NjA2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTYwODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk2MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk2MTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NjE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTYxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTYxODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk2MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk2MjM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NjMwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTYzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTYzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk2MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk2Mzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NjM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTY0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTY0Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk2NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk2NTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NjU3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTY2MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk2NjY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NjcyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTY3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTY3NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk2Nzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk2ODI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5Njg0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTY5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTY5NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk2OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk2OTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NzAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NzAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTcwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTcwNTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk3MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk3MTM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NzIzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTczMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk3MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk3MzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NzM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTc0Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk3NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk3NTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NzU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTc1OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTc2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk3NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk3NjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NzcwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTc3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTc4MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk3ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk3ODU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5NzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5NzkzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTc5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTc5ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk4MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk4MDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5ODA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5ODA1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTgwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTgwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk4MTE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5ODIwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5ODIzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTgyNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTgyNzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEwOTgzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTgzMjsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDk4NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk4NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDk4NTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk4NTU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5ODY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5ODY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5ODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5ODY5OzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEwOTkwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTkwMTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMDk5MTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk5MjA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5OTMyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5OTM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTA5OTM1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5OTM3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTk0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTk0MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk5NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk5NDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5OTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5OTUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTk1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTk1NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk5NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk5NjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5OTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5OTY1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTk3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTk3NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk5Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk5Nzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5OTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5OTgyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTk4ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEwOTk5MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMDk5OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMDk5OTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTA5OTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTA5OTk3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEwOTk5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDAwMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAwMDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMDA3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDAxMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAwMTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAwMjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMDIyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDAyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDAyNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAwMzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMDMyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDAzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDAzNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAwNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAwNDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMDQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDA1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDA1MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAwNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAwNTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMDU3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDA2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDA2NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAwNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAwNzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMDc3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDA3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDA4MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAwODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAwODY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMDg5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDA5Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDA5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAwOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAwOTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMTAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDEwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAxMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAxMDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMTEzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDEyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDEyMTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAxMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAxMzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMTM3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDE0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDE0MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAxNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAxNDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMTUwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDE1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDE2MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAxNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAxNjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMTY2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMTcwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDE3Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAxNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAxNzg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMTg4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDE5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDE5NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAyMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAyMDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMjA3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDIxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDIxMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAyMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAyMTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMjE2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDIxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDIyMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAyMjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAyMzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMjM0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMjM2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEwMjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMjQxOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDI1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDI1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDI1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDI2MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTAyNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAyNzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTAyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAyNzQ7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEwMzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMzAyOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDMxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDMyMTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTAzMzM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAzMzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTAzMzY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAzMzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMzQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMzQ0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDM0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDM0Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAzNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAzNTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMzU2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDM2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDM2MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAzNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAzNjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMzY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDM3MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAzNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAzNzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMzgwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDM4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDM4NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAzOTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTAzOTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwMzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwMzk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDM5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTAzOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA0MDA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNDEwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDQxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDQxODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA0MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA0MjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNDI3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDQzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDQzMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA0MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA0MzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNDQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDQ0NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA0NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA0NDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNDUxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDQ2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDQ2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA0NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA0NjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNDY5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDQ3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA0ODA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDQ5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDQ5MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA0OTU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA0OTc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTA1MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA1MDI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEwNTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNTE1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEwNTE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNTE5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEwNTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNTIyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDUzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDUzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDUzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDUzNzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA1NDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA1NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA1NTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA1NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA1NTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA1NTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA1NTk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTA1NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA1NjM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEwNTczOzg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNTgxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDU5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDU5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDU5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDU5NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA2MDc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA2MTE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA2MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA2MjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA2MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA2MjM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEwNjM4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNjQyOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDY2MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDY2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDY2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDY3MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMDY3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDY3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDY3Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDY4MDsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA3MDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA3MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA3MDY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA3MDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA3MDk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA3MTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNzE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNzE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDcxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDcxOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA3MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA3MjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNzI5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDczNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDczNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA3Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA3Mzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNzQyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDc0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDc0ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA3NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA3NTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNzU1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDc2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDc2NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA3Njk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA3NzI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNzc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDc3NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA3Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA3Nzk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwNzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwNzg5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDc5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDc5Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA4MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA4MDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwODA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwODA2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDgxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDgxMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA4MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA4MTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwODE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwODE5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDgyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDgyNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA4Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA4Mjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwODMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwODMyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDg0MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDg0NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA4NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA4NDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEwODQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwODUwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDg1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDg1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA4NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA4NjE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMDg3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDg3NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTA4NzY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA4Nzg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTA4ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA4ODM7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEwODk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwOTAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEwOTAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwOTA0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEwOTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwOTA3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDkxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDkyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDkyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDkyMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA5MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA5MzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA5MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA5MzY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA5Mzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA5NDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA5NDQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTA5NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA5NDg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEwOTU4Ozg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEwOTY2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDk3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDk3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMDk3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMDk4MDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTA5OTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTA5OTY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTEwMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEwMDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTEwMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEwMDg7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExMDIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMDI3OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTA0ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTA1MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTA1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTA1NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMTA1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTA2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTA2MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTA2NTsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTEwOTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEwOTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTEwOTU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEwOTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTEwOTg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTExMDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMTAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMTA2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTEwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTEwODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTExMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTExMTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMTE4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTEyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTEyODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMTM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMTQxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTE0Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTExNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTExNDg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMTU3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTE2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTE2NTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMTc4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTE4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTE4Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTExOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTExOTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMTk2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTIwMTsxNTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMjE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTIxOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTIyMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEyMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEyMjU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMjMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMjM0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTIzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTIzNjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExMTIzOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTI0MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEyNDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEyNDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMjQ4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTExMjU1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTI1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTI1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEyNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEyNjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMjYzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTI3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTI3NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEyNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEyNzY7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTEyODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMjg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMjg1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTI4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTI4OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEyOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEyOTE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMjk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMzAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTMwNDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTExMTMxMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEzMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEzMTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMzIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMzIxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTMyNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTMyOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEzMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEzMzE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTEzMzg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMzQ1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTM0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTM0OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEzNTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEzNTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExMzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExMzYwOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTExMzY3OzE1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEzODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEzODM7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTM5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTM5NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTEzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTEzOTg7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTQwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTQwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTE0MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE0MTI7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTQyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTQyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTE0Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE0Mjk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExNDM4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNDQyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTQ0MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTQ0NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTE0NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE0NTI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExNDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNDU4OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTE0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE0Njk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExNDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNDczOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTE0ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE0ODQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExNDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNDkzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTUwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTUwMTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExNTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNTE0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTUxNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTUyMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTE1MjI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1MjQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTExNTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNTMxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMTUzNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTUzOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTE1NDE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1NDM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTE1NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1NDg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE1NTM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTE1NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1NTc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE1NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1NjA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTE1NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1NjQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE1NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1Njc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTE1NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1NzE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE1Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1Nzg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTE1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1ODI7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE1ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1OTA7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTE1OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE1OTg7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNjE1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNjE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNjE5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTExNjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNjIyOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTYzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTY0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTY0MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTY0NTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTY1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTY1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTY1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTY1NjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE2Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE2Njg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE2Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE2NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE2NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE2NzI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNjgzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNjg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNjkwOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNjk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNjk4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTExNzAyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNzA0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNzA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNzA4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNzExOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTExNzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNzE2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNzE3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNzIxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTExNzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNzI1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNzM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNzM3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNzQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExNzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExNzQyOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTc2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTc2NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTc2NjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE3Nzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE3ODE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTE3ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE3ODU7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE3ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE3OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE3OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE3OTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE3OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE3OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE3OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE3OTY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE4MDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE4MDc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTE4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE4MTE7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExODI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExODI5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExODMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExODMxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTg0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTg0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTg0NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTg1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTg1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTg1NjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE4Njc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE4NzE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTE4NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE4NzU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExODg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExODg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExODkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExODkxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExOTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExOTAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExOTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExOTAzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTkxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTkxNjsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE5Mzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE5NDI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTE5NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE5NDY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE5NTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTE5NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTE5NTU7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExOTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExOTczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTExOTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTExOTc1OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTk4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTk4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMTk5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMTk5MTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIwMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIwMDI7NDg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTExMjA1MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjA1MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMjA1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjA1Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjA2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjA2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjA2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjA2ODsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIwOTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIwOTU7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIxMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIxMDE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMTEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMTE0OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjEzMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjEzNDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjEzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjE0MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIxNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIxNTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIxNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIxNTM7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMTY5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMTczOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMTc2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMTc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMTgxOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMTg5Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMTk2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEyMTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMTk5OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjIxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjIxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjIxNzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjIyMjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjIzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjIzMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjIzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjIzNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjIzNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjI0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjI0MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjI0NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMjI0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjI0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjI1MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMjI1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjI1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjI1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjI1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjI1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjI1ODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIyNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIyNjk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIyNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIyNzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIyNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIyNzg7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIyODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIyODM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIyODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIyODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIyODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIyODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIyODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIyOTA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMzAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMzAxOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMzA2OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMzEzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMzE2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjMyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjMyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjMyOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjMzNDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjM0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjM0MTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjM0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjM0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjM0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjM0ODsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTIzNjc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTIzNzI7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMzk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMzk2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyMzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyMzk5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyNDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNDA3OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyNDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNDExOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjQyMzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI0MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI0MzU7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyNDUyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNDU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyNDU3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNDYxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjQ3NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjQ3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjQ3OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjQ4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjQ4MjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjQ4NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI0ODc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI0OTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyNDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNDkzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMjQ5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjQ5ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI1MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI1MDI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMjUxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjUxMzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI1MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI1MjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyNTI2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNTI4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEyNTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNTMzOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjU0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjU0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjU1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjU1MzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI1NzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI1NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI1NzU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI1ODQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI1ODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI1ODc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI1ODk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTI1OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI1OTY7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI2MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI2MDI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyNjE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNjE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyNjE5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNjIyOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjYzNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjYzOTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMjY0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjY0MjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI2NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI2NTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI2NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI2NTc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTI2NjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI2NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI2NjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTI2NjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI2Njg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTI2NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI2NzU7NTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyNzMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNzMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEyNzM0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNzM3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEyNzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNzQ0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjc1NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjc1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMjc1ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjc2MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI3NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI3NjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyNzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNzY4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMjc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjc3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI3ODA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyNzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyNzkwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMjc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjc5Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI4MDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI4MDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyODA1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyODA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMjgxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjgxMTs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTExMjgxOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI4Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI4Mjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyODMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyODMyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMjg0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjg0MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI4NDU7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTEyODU2OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI4Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI4Njk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTI4NzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI4NzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyODc3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyODgxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTEyODg1OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI5MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI5MDc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTI5MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI5MDk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyOTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyOTEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMjkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjkxNjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI5MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI5MjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyOTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyOTI5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMjkzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjkzNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI5NDI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTI5NDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI5NTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyOTUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyOTU1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTEyOTU5OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTI5ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI5ODc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTI5ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTI5ODk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEyOTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEyOTkyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMjk5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMjk5Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMwMDM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMDA4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzAxMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMwMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMwMTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMDI0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzAzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzAzMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMwMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMwMzY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMDQ0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTEzMDQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMDUyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzA1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzA1NDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExMzA1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzA2MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMwNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMwNjQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTMwNzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMDc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMDc3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzA3OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzA4MTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMzA4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzA4ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMzA5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzA5MjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTMxMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMxMDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTMxMDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMxMTA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEzMTI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMTI3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEzMTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMTM0OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMzE1NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzE1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMzE2MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzE2MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMxNjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMxNjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMTcwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzE3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzE3NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMxNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMxNzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMTg0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzE5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzE5Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMxOTg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMyMDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMjA1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzIwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzIxMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMyMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMyMTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMjE5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzIyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzIyNDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMyMzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMyMzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMjM2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzI0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzI0NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMyNDk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMjU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzI1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzI2MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMyNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMyNjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMjcyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzI3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzI3Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMyODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMyODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMjg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzI4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzI5MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMyOTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMyOTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMjk5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzMwNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzMwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMzMDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMzMTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMzE0Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTEzMzIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzMyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzMyNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMzMzQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMzQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMzQzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzM0NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzM1MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMzNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMzNTI7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTEzMzYzOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTMzNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMzNzY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTMzODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTMzODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzMzg0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzMzg4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTEzMzkyOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM0MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM0MTQ7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTM0MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM0MTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNDE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzQyMzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM0MzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNDM2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzQ0MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM0NDk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTM0NTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM0NTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNDU4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNDYyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTEzNDY2OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM0OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM0OTQ7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTM0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM0OTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNDk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNDk5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzUwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzUwMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM1MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM1MTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNTE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzUxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzUxOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM1MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM1MjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNTMxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzUzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzUzOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM1NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM1NDM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNTUxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTEzNTU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNTU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzU2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzU2MTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExMzU2NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzU2OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM1NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM1NzE7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTM1NzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM1Nzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNTc5OzEyOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTExMzU5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM1OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM1OTU7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzYxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzYxNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM2MjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM2MjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNjI4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTEzNjMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNjM1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzYzNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzYzOTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMzY0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzY0Njs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExMzY1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzY1NDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTM2NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM2NzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTM2NzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM2NzY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEzNjkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNjkzOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEzNjk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNzAwOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMzcxMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzcxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMzcxNjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzcxODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM3MjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM3MjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNzI3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzczNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzczNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM3Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM3Mzk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNzQ1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzc0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzc0ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM3NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM3NTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNzU3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzc2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzc2Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM3NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM3NzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNzc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNzc5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzc4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzc4MTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExMzc4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzc4NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM3ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM3OTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzNzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzNzkzOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTEzODAxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzgwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzgwNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM4MTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzODEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzODE0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzgxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzgxOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM4MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM4MjU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTEzODMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzODMzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExMzgzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzg0MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTM4NDM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM4NDU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTM4NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTM4NDk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEzODY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzODY2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEzODY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzODcwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEzODczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzODc0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEzODgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzODg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEzODg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzODg2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTEzODg4OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzODk0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEzODk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzODk3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMzkwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzkwOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMzkxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzkxMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMzkxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzkxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExMzkxNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExMzkyMDs1NzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTEzOTc3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzOTc5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTEzOTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTEzOTgzOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDAwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDAwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDAwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDAwNjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDAxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDAxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDAxNzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQwMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQwMjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQwMzA7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE0MDUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MDU1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE0MDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MDY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE0MDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MDY3OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDA5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDA5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDA5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDA5MzsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQxMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQxMTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQxMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQxMTc7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE0MTI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MTMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE0MTMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MTM1OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE0MTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MTQyOzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDE3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDE3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDE3NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDE3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDE3OTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDE4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDE4ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDE4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDE5MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQyMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQyMDI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQyMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQyMTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQyMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQyMTQ7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQyMTg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQyMjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQyMjE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQyMjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0MjI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MjI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDIzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDIzMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQyMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQyMzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0MjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MjQzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDI0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDI0OTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQyNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQyNTg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0MjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MjY3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDI2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDI3MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQyNzQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0Mjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MjgwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDI4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDI4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQyODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQyODc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0MjkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0Mjk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDI5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDI5NzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExNDMwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDMwMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQzMDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQzMDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0MzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MzA5Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTE0MzE3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDMyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDMyMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQzMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQzMjc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0MzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MzM2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDM0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDM0NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQzNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQzNDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0MzUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MzUyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDM1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDM1ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQzNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQzNjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0MzY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0MzY1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDM3MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDM3MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQzNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQzNzU7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTE0Mzg2OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQzOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQzOTk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTQ0MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ0MDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NDA3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NDExOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE0NDE1OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ0MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ0Mzc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTQ0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ0Mzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NDQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDQ0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDQ0Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ0NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ0NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NDU5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDQ2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDQ2NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ0NzI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTQ0Nzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ0ODA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NDgxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NDg1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE0NDg5OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ1MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ1MTc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTQ1MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ1MTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NTIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDUyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDUyNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ1MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ1MzM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NTM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDU0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDU0Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ1NDk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NTU0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDU2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDU2MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ1NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ1NjY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NTc0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE0NTc5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NTgyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDU4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDU4NDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExNDU4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDU5MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ1OTQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ1OTY7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTQ2MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ2MDM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTQ2MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ2MDc7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE0NjIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NjI0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE0NjI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NjI4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNDY0Mjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDY0ODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNDY1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDY1NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQ2Njc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ2Njk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTQ2NzA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ2NzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0Njc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0Njc4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDY3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDY4MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ2ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ2ODg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NjkyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDY5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDY5ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ3MDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NzA4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDcxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDcxMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ3MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ3MTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NzIwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDcyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDcyOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ3MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ3MzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NzM2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDc0MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDc0NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ3NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ3NDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NzUwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDc1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDc1Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ3NjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0NzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NzY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDc3MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ3NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ3Nzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0Nzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0NzgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDc4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDc4NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ3OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ3OTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0Nzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0ODAwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDgwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDgwNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ4MTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0ODE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0ODE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDgxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDgyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ4MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ4MjI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0ODI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0ODI5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDgzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDgzNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ4MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ4MzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0ODQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0ODQyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDg0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDg0ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ4NTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0ODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0ODYwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDg2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDg2Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ4NzM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0ODc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0ODc4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDg4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDg4MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ4ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ4ODU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0ODkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0ODkyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDg5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDg5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ4OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ5MDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0OTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0OTA0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDkxNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ5MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ5MjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0OTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0OTI0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDkzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDkzMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ5MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ5MzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0OTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0OTM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDk0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDk0Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ5NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ5NDk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0OTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0OTU1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDk2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDk2MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ5NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ5NjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0OTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0OTY5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDk3NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDk3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ5ODE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE0OTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE0OTg2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNDk4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNDk4OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTQ5OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTQ5OTE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTAwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTAwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUwMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUwMDY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MDE0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTAyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTAyMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUwMzA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MDQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTA0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTA0NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUwNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUwNTA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MDU4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTA2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTA2ODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MDc4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MDgyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTA4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTA4NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUwOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUwOTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MDk1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTEwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTEwMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUxMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUxMTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MTEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTExNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTExNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUxMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUxMjA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MTI3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MTMxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTEzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTEzMzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUxNDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MTQ3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTE1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTE1NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUxNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUxNjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MTY3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTE3MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUxNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUxNzU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MTgwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTE4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTE4Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUxOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUxOTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MTk1OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUyMDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUyMTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MjEyOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE1MjE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MjE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTIxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTIyMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUyMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUyMjQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTUyMzE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MjM2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTI0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTI0MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUyNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUyNDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MjQ4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTI1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTI1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUyNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUyNTY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MjY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MjY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTI2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTI3MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUyNzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1Mjc5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MjgyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTI4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTI4NDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTExNTI5MTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MzAyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTMwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUzMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUzMTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MzE2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTMyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTMyMjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUzMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUzMzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MzM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTMzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTMzOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUzNDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUzNDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MzQ5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MzUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTM1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTM1Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUzNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUzNTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MzY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTM2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTM2ODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUzNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUzNzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1MzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1MzgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTM4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTM4NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTUzOTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTUzOTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1Mzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1Mzk5Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTE1NDA2OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTU0MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU0MTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1NDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NDIwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTQyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTQyOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTU0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU0MzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1NDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NDM2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTQ0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTQ0MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTU0NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU0NDU7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTU0NTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1NDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NDU5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTQ2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTQ2NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTU0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU0Njk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1NDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NDczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTQ3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTQ3NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTU0ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU0ODQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1NDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NDkzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTQ5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTQ5NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTU0OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU1MDA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1NTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NTA2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTUwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTUwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTU1MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU1MTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE1NTE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NTIxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNTUyMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTUyNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNTUyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTUyOTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU1NDk7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU1NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU1NTU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTU1NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU1NTk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1NTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NTcxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE1NTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NTc1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTU4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTU4ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTU4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTU5MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNTU5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTU5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTU5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTU5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTU5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTYwMDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU2MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU2MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU2MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU2MTQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1NjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NjI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1NjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NjI3OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTY1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTY1MzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU2NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU2NjQ7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU2NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU2NzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU2NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU2NzM7Mjg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1NzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NzAyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTcxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTcxNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNTcyMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTcyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTcyMzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTczMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTczMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTczMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTczNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNTczNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTczODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNTc0MTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTc0NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTc0ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNTc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTc1MjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU3NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU3NjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU3NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU3Njc7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1Nzg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1Nzg3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1Nzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1NzkwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTgwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTgwMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTgxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTgxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTgxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTgxNTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNTgyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTgyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTgyNDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNTgyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTgyNzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU4Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU4NDA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU4NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU4NDM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU4NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU4NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU4NDc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU4NTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTU4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU4NTU7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1ODY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1ODY2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1ODY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1ODY4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTg4Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTg4NjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNTg4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTg4OTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU5MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU5MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU5MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU5MDU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1OTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1OTE3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1OTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1OTIwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTkzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTkzMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNTkzMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNTkzODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU5NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU5NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTU5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTU5NTM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1OTY0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1OTY5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1OTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1OTc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1OTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1OTgxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE1OTg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1OTg2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1OTkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1OTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1OTkyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE1OTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE1OTk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE1OTk4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MDAzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE2MDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MDA3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MDEzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MDE4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE2MDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MDIyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MDI5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MDMxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjA0NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjA0OTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNjA1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjA1NTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjA2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjA2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjA2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjA2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjA2NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjA2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjA3MDszOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYxMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYxMTA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYxMTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYxMjQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTYxMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYxMjc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYxMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYxMzU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYxMzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYxNDA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYxNDM7Mzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MTgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MTg0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MTkwOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MTk2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MTk4OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjIxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjIxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjIxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjIxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjIxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjIxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjIxNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjIxOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjIyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjIyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjIyNjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNjIzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjIzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjIzMjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjIzODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjI0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjI0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjI0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjI0NjsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYyNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYyNzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYyNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYyNzI7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYyNzY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYyODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYyODI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYyODc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2Mjk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MzAwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MzAzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjMxNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjMyMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNjMyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjMyNDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYzMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYzMzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTYzMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTYzNDA7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MzcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MzcyOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2Mzc2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MzgxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MzkwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2MzkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2MzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2Mzk0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2NDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NDAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2NDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NDAzOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjQxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjQxODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjQyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjQyMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjQyMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjQyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjQyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjQzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjQzMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjQzNTszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY0NzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY0NzM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTY0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY0ODA7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2NDkzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NDk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2NDk2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NDk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNjUwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjUwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTY1MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY1MDY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE2NTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NTE0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNjUxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjUxODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTY1MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY1MjQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE2NTMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NTMzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNjUzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjUzNTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExNjUzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjU0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTY1NDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY1NDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE2NTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NTQ3Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTE2NTU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNjU1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjU1OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTY1NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY1NjU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE2NTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NTcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNjU3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjU3NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTY1NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY1Nzc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE2NTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NTgzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNjU4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjU4Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTY1OTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY1OTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE2NTk2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NTk4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE2NjAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NjAyOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjYxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjYxODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjYxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjYyMjs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjYyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjYyODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjYzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjYzNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjYzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjYzNjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY2NDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY2NTA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTY2NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY2NTM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY2NjA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY2NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY2NjM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTY2Njc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY2Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY2Njk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTY2NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY2NzY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY2Nzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY2ODE7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTY2ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY2ODg7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2NzA2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NzA4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2NzA5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NzExOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2NzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2NzE4OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjczODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNjc0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjc0MjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY3NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY3NTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY3NTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY3NjE7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2NzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2Nzc0OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjc5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjc5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjc5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjc5NDsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY4MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY4MjQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTY4MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY4MzE7NDA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2ODcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2ODcyOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjg4NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjg4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjg5MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjg5MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNjg5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjg5NjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY5MTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTY5MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY5MTU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTY5MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY5MjM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTY5MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTY5Mjc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2OTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2OTM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2OTM5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2OTQyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2OTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2OTQ5OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2OTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2OTU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE2OTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE2OTU2OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNjk4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjk4NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExNjk4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNjk5MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTcwMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTcwMDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTcwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTcwMDM7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3MDM4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MDQyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzA1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzA1Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzA1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzA2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzA2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzA2MjsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTcwOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTcwOTE7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3MTAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MTA2OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3MTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MTEzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3MTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MTE2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzEyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzEzMDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzEzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzEzNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzEzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzEzOTsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTcxNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTcxNjg7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3MTkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MTkzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3MTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MjAwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3MjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MjAzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzIxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzIxNzszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTcyNTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTcyNTU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTcyNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTcyNjI7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTcyNjk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTcyNzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTcyNzI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTcyNzQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTcyNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTcyNzg7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3Mjk3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE3MzAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MzAxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3MzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MzA5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE3MzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3MzEzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzMyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzMyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzMyNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzMyODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzMzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzMzNTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzMzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzM0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzM0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzM0MjsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTczNjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTczNzI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTczNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTczNzY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3Mzg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3Mzg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3Mzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3Mzg5OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzQyNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzQyODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTc0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc0Mzk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTc0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc0NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTc0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc0NDg7Mjg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3NDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NDc3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzQ4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzQ5Mjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzQ5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzQ5OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzUwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzUwMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTc1MTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc1MTY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTc1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc1MjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTc1MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc1MjU7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3NTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NTU4OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzU4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzU4Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzU4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzU5MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExNzU5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzU5MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTc2MDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc2MDc7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3NjQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NjQ1OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE3NjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NjUyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3NjU5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NjYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE3NjYyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NjY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzY2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzY3MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc2NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc2NzI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3Njc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NjgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzY4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzY4NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc2OTI7MTQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzcwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzcwNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc3MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc3MTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3NzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NzE1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzcxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzcyMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc3MjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3NzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NzI5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzczNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzczOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc3NDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3NzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NzQ0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzc0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzc0OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc3NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc3NTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3NzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3NzU1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzc1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzc2MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc3Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc3Njg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3Nzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3Nzc2OzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc3OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc3OTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3Nzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3Nzk1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzc5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzgwMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc4MDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc4MDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3ODA5OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE3ODEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3ODE1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzgxNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzgxOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc4MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc4MjE7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTc4Mjk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3ODM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3ODM3OzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc4NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc4NTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3ODU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3ODU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzg1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzg2MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc4NjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3ODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3ODY5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzg3NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc4ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc4ODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3ODg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3ODg1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzg4OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzg5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc4OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc4OTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3ODk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3ODk4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzkwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzkwMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc5MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc5MDY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3OTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3OTE0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzkyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzkyMjsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3OTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3OTM3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzk0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzk0MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc5NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc5NDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE3OTUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE3OTUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzk1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzk1NTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTc5NjY7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExNzk3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzk3OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExNzk4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExNzk4NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTc5ODc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTc5OTE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTc5OTU7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODAxNzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExODAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODAxOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgwMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgwMjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4MDI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MDI2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODAzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODAzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgwMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgwMzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4MDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MDQ0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODA1Mjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExODA1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODA2MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgwNjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgwNjU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTgwNjk7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODA5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODA5NzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExODA5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODA5OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgxMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgxMDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4MTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MTA2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODExMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgxMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgxMTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4MTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MTIyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODEyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODEyOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgxMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgxMzQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4MTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MTQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODE0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODE0Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgxNTQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTgxNTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgxNjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4MTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MTY0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE4MTY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MTcyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODE3NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODE3Njs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExODE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODE4MzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTgyMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgyMDE7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE4MjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MjE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE4MjE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MjE4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExODIzMjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODIzODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExODI0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODI0NTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTgyNjA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgyNjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTgyNjM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgyNjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4MjY4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MjcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODI3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODI3NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgyODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgyODI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4Mjg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MjkwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODI5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODI5NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgzMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgzMDE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODMxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODMxMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgzMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgzMTk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4MzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MzI1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODMzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODMzMTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgzNDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgzNDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4MzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MzQ1OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE4MzQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MzUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODM1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODM1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgzNTc7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTgzNjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4MzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4MzcwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODM3Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgzNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgzODA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4Mzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4Mzg5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODM5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODM5MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTgzOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTgzOTY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4NDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NDA0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODQwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODQwODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg0MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg0MTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4NDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NDIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODQyMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg0Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg0MzA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4NDM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NDM5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODQ0MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg0NDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4NDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NDUwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODQ1NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg0NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg0NjI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4NDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NDY1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODQ3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODQ3Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg0Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg0Nzk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4NDg1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NDg4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODQ4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODQ5MDsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTg1MDE7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODUxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODUxNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExODUxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODUyMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg1MjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg1MjY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTg1MzA7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODU1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODU1MjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExODU1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODU1NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg1NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg1NTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4NTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NTYxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODU2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODU3MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg1NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg1NzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4NTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NTc5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODU4Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExODU5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODU5NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg1OTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg2MDA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTg2MDQ7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODYzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODYzMjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExODYzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODYzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg2MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg2Mzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4NjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NjQxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODY0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODY0ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg2NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg2NTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4NjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NjU3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODY2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODY2NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg2Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg2Njk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4Njc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4Njc3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODY4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODY4MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg2ODk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTg2OTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg2OTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4Njk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4Njk5OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE4NzA0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NzA3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODcwOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODcxMTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExODcxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODcxODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExODcyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODcyNjsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTg3NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg3NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTg3NTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg3NTQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE4NzY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4NzcxOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE4Nzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4Nzc4OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExODc5NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODc5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExODgwMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODgwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg4MDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg4MDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4ODA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4ODEwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODgxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODgxODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg4MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg4MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4ODI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4ODMwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODgzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODgzNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg4NDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4ODQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4ODQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODg1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODg1Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg4NTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg4NjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4ODYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4ODY0OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE4ODY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4ODcwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODg3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODg3NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg4NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg4NzY7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTg4ODQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4ODg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4ODg5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODg5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODg5Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg4OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg5MDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4OTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4OTA0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODkwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODkwNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg5MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg5MTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4OTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4OTIxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExODkzMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExODkzMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg5MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg5MzU7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTE4OTQ2OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg5NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg5NTk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTg5NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg5NjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE4OTY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE4OTcxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE4OTc1OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTg5OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg5OTc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTg5OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTg5OTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5MDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5MDAyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTAwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTAwNjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTkwMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkwMTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5MDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5MDE5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTAyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTAyNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTkwMzI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTkwMzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkwNDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5MDQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5MDQ1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE5MDQ5OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTkwNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkwNzc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMTkwNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkwNzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5MDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5MDgyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTA4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTA4Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTkwOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkwOTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5MDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5MDk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTEwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTEwMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTkxMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkxMDk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5MTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5MTE0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTEyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTkxMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkxMjY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5MTM0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE5MTM5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5MTQyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTE0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTE0NDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExOTE0OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTE1MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTkxNTQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkxNTY7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTkxNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkxNjM7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTkxNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkxNzE7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5MTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5MTg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5MTg2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5MTg5OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExOTIwMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTIwNjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExOTIxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTIxMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExOTIyMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTIyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExOTIyNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTIyNzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExOTIzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTIzNDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExOTIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTI0MDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTkyNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkyNTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTkyNTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkyNjA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5Mjc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5Mjc3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE5Mjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5MjgwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExOTI5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTI5MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExOTI5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTI5NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExOTI5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExOTMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTMwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExOTMwMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTMwNjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTExOTMxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTMxMzs1NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTkzNjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkzNzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTkzNzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkzNzU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTkzODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTkzODI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5MzkzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5Mzk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5Mzk2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5Mzk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTQwMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTQwNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk0MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk0MDc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NDE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTQxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTQxNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk0MTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NDIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTQyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTQyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk0Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk0MzA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NDQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTQ0NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk0NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk0NTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NDU1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTQ2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTQ2Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk0NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk0Njc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NDczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTQ3NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTQ3ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk0ODA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NDkwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTQ5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTQ5NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk1MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk1MDI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NTA4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NTExOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTUxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTUxMzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExOTUxNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTUxOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk1MjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk1MjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NTI1Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTE5NTMzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTUzNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTUzOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk1NDE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk1NDM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTk1NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk1NDY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTk1NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk1NTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTk1NTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk1NTg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTk1NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk1NjU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTk1Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk1Njk7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTk1NzI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTk1NzY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTk1Nzg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk1ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTk1ODE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk1ODM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NTg2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NTkwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTU5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTU5Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk1OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk2MDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NjA0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk2MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk2MTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NjIyOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk2MzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk2MzU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5NjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NjM3OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTE5NjQwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NjQzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTY0NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTY0NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk2NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk2NDk7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMTk2NTc7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTY2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTY2ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk2NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk2NzU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTY4NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTY4ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk2OTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk2OTI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTk2OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk2OTY7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5NzIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NzIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5NzIyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NzI1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5NzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NzI4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5NzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NzMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5NzMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NzMzOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5NzQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NzQ0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTE5NzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NzQ4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5NzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NzU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5NzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5NzYwOzQyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTExOTgwMjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTgwODsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMTk4MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk4MjQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMTk4MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk4MzE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5ODQxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5ODQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTE5ODQ0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5ODQ2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTg0OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTg1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk4NTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5ODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5ODYzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTg2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTg2NzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5ODc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5ODc4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTg4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTg4NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk4OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk4OTI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5OTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5OTAxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTkwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTkwNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk5MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk5MDg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5OTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5OTE0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTkxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTkxNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk5MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk5MjE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5OTI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5OTI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTkzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTkzMTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTExOTkzNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTkzNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk5Mzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk5NDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5OTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5OTQzOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTE5OTUxOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk5NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk5NjI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5OTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5OTY5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTk3Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk5ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk5ODU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTE5OTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTE5OTg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTExOTk5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTExOTk5Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMTk5OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMTk5OTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMDAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDAwNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAwMTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAwMTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMDE1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDAyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDAyNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAwMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAwMjc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMDM3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAwNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAwNDg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMDU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDA1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDA2MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAwNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAwNjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMDY2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDA2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDA2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAwNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAwNzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMDc0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDA4MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAwODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAwODU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMDkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMDk2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDA5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDA5ODsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjAxMDk7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDEyMjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMDEyNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDEyOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAxMzA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAxMzQ7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjAxMzg7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDE1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDE2MDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMDE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDE2MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAxNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAxNjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMTY5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDE3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDE3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAxODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAxODI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMTg3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDE5NTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMDIwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDIwMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAyMDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAyMDg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjAyMTI7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDI0MDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMDI0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDI0MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAyNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAyNDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMjQ5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDI1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDI1Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAyNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAyNjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMjY1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDI3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDI3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAyNzc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMjg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMjg1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDI4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDI4OTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjAyOTc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjAzMDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAzMDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwMzA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMzA3OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIwMzEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMzE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDMxNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDMxOTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyMDMyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDMyNjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyMDMyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDMzMDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjAzNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAzNTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjAzNTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjAzNTY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIwMzcwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMzczOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTIwMzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwMzgwOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMDQwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDQwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMDQwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDQwNTsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjA0MzA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA0MzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjA0MzM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA0MzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNDM4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNDQyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDQ0NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA0NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA0NTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNDU2OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA0NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA0Njc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNDc0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDQ4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDQ4MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA0ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA0OTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNDkzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDQ5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDQ5Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA1MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA1MDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNTA2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDUwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDUxMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA1MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA1MTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNTIwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIwNTIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNTI2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDUyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDUzMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA1MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA1MzI7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjA1NDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNTQ0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA1NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA1NTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNTYyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDU2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDU2OTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA1Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA1Nzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNTgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDU4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDU4NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA1OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA1OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNTk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDU5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDU5ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA2MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA2MDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNjA4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDYxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDYxNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA2MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA2MjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNjI2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDYzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDYzNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA2Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA2Mzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNjQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDY0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDY0NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA2NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA2NDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNjQ4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDY1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDY1Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA2NjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNjYzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDY3MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDY3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA2NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA2Nzc7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTIwNjg4OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA3MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA3MDE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjA3MDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA3MDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNzA5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNzEzOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIwNzE3OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA3Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA3Mzk7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjA3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA3NDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNzQ0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDc0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDc0ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA3NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA3NTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNzYxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDc2Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA3NzQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjA3Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA3ODI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwNzgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwNzg3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIwNzkxOzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA4MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA4MTk7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjA4MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA4MjE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwODIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwODI0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDgyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDgyODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA4MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA4MzU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwODM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwODQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDg0NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA4NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA4NTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwODU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwODU2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDg2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDg2NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA4Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA4Njg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwODc2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIwODgxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwODg0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDg4Njs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMDg5MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDg5NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjA4OTY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA4OTg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjA5MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA5MDU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjA5MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA5MDk7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIwOTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwOTMwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIwOTMxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwOTM1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMDk0OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDk1Mjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyMDk1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDk1OTsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjA5ODI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA5ODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjA5ODU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjA5ODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIwOTkwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIwOTk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMDk5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMDk5Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEwMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEwMDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMDA4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTAxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTAxNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEwMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEwMjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMDI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTAzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTAzMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEwMzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEwMzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMDQwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTA0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTA0ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEwNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEwNTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMDYwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTA2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTA2NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEwNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEwNjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMDcyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTA3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTA3OTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMDkwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTA5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTA5NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEwOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEwOTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMTAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMTA2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTEwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTEwODszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMTExMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTExNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjExMTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjExMTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMTIwOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTIxMTI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTEzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTEzMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjExMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjExMzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMTM3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTE0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTE0Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjExNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjExNTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMTUzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTE2MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjExNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjExNjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMTY3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjExNzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjExODE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMTgyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMTg0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjExOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjExOTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMTk5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTIwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTIwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEyMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEyMDY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMjEyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTIxNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTIxOTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEyMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEyMjk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMjM1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTI0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTI0MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEyNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEyNDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMjQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTI1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTI1Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEyNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEyNTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMjU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMjYyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTI2MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTI2NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEyNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEyNzU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMjg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMjg1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTI5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTI5NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEzMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEzMDE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMzA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMzA3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTMxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTMxMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEzMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEzMjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMzI1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTMzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTMzNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEzNDI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEzNDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMzQ3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMzQ5OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEzNjE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEzNjM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMzcyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTM3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTM3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEzODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEzODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxMzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxMzg1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTM5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTM5MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjEzOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjEzOTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNDAzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTQwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTQwNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE0MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE0MTY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNDIyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTQyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTQzMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE0MzE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE0MzM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNDQwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTQ1MDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNDYxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTQ3MDsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNDgzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTQ4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTQ4OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE0OTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE0OTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNTAwOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTIxNTA4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTUxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTUxMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE1MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE1MTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNTE5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE1Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE1MzA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNTM4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTU0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTU0NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE1NDk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNTU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTU1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTU2MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE1Njg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE1NzI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNTczOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNTc1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTU3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTU3ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE1ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE1ODQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNTg3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTU4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTU5MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE1OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE1OTc7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTYwODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE2MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE2MTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNjE3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTYyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTYyNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE2MjY7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTIxNjM3OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE2NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE2NTA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjE2NTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE2NTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNjU4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNjYyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIxNjY2OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE2ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE2ODg7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjE2ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE2OTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNjkzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTY5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTY5Nzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE3MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE3MDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNzEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTcxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTcxNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE3MjM7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjE3Mjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE3MzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNzMyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNzM2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIxNzQwOzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE3Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE3Njg7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjE3Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE3NzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNzczOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTc3Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE3ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE3ODQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxNzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxNzg5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTc5Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE3OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE4MDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxODA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxODA1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTgxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTgxMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE4MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE4MTc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIxODI1OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIxODMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxODMzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMTgzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTgzNTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMTg0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTg0MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjE4NDU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE4NDc7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjE4NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE4NTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjE4NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE4NTg7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIxODcyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTIxODc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxODc2OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIxODgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxODgxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIxODgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxODg1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMTg5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTkwMjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMTkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTkxMDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMTkxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTkxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMTkxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTkxOTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMTkyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTkyOTsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjE5NDY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjE5NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjE5NTA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIxOTY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxOTY3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTIxOTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIxOTcxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMTk4MTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTk4NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyMTk4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTk5MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMTk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMTk5ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjAwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjAwMTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyMjAwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjAwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjAwODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjAxMjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjAyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjAyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjAyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjAyNDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjAzMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjAzNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjAzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjA0MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyMjA0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjA0NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjA0Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjA1MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjA1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjA2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjA2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjA2MjsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjIwODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIwODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjIwODQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIwODc7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjIwOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIwOTQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIyMTA0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMTA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIyMTA3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMTA5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjExMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjExNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIxMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIxMTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMTIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjEyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjEyNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIxMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIxMzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMTM2OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIxNDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIxNTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMTUyOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIyMTU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMTU4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjE1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjE2MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIxNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIxNjQ7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjIxNzI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMTc5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjE4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjE4MjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMTkzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjE5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjE5NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIyMDA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMjA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMjA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjIxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjIxMTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjIyMjI7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjIzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjIzNTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMjIzOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjI0MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIyNDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIyNDc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjIyNTE7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjI3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjI3MzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMjI3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjI3NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIyNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIyNzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMjgyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjI5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjI5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIyOTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMjk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMzAwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjMwODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMjMxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjMxNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIzMTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIzMjE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjIzMjU7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjM1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjM1MzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMjM1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjM1NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIzNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIzNTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMzYyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjM2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjM2OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIzNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIzNzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMzc4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjM4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjM4NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjIzODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjIzOTA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyMzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyMzk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjQwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjQwMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI0MTA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjI0MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI0MTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNDIwOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIyNDI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNDI4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjQzMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjQzMjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyMjQzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjQzOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyMjQ0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjQ0MzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjI0NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI0NTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjI0NTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI0NjI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIyNDc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNDc5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTIyNDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNDg2OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjUwOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjUxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMjUxMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjUxNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI1MTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI1MjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNTIyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjUyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjUzMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI1MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI1MzQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjU0NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI1NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI1NTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNTU0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjU1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjU1ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI1NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI1NjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNTY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjU2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjU3MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI1NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI1NzY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNTgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNTg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjU4Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI1OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI1OTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNjAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjYwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjYwMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI2MDU7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjYyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjYyODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI2MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI2MzI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNjM3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjY0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjY0MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI2NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI2NDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNjQ3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjY0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjY1MDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNjYwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNjY0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjY2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjY2Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI2NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI2NzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNjc2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjY4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjY4MTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI2OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI2OTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNjk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjY5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjY5OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI3MDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNzEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjcxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjcxNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI3MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI3MTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNzI2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjcyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjcyOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI3MzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI3MzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNzM1OzIyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI3NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI3NTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNzYyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjc2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjc2NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI3NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI3NzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyNzc3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjc4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjc4MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI3ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI3OTA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyNzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyODAwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjgwMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjgwNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI4MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI4MDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyODEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyODEzOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI4MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI4MjQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyODMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyODM0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjgzNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjgzOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI4NDE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjI4NDg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyODUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyODU0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjg1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjg1ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI4NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI4NjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyODY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyODY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjg3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjg3MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI4NzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI4Nzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyODc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyODgwOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTIyODg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjg5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjg5MjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyOTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyOTAzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjkwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjkwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI5MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI5MTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyOTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyOTE2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjkyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjkyMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI5MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI5MjQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyOTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyOTI4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjkzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjkzNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI5NDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI5NDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIyOTQ0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIyOTQ4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjk0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjk1MDsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjI5NjE7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMjk3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjk3NDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMjk3ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMjk4MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjI5ODI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjI5ODY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjI5OTA7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzAxMjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMzAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzAxNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMwMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMwMTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzMDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMDIxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzAyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzAzMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMwMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMwMzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzMDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMDM5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzA0Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMzA1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzA1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMwNTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMwNjA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjMwNjQ7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzA5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzA5MjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMzA5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzA5NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMwOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMwOTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzMTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMTAxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzEwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzEwODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMxMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMxMTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzMTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMTE3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzEyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzEyNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMxMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMxMjk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzMTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMTM3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzE0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzE0MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMxNDk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjMxNTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMxNTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzMTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMTU5OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIzMTY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMTY3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzE2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzE2OTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjMxODA7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzIwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzIwNTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMzIwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzIxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMyMTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMyMTc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjMyMjE7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzI0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzI0NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMyNDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzMjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMjUzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzI1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzI1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMyNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMyNjI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzMjY5OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTIzMjc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMjc3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzI3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzI3OTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMzI4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzI4NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjMyODk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMyOTE7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjMyOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMyOTg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjMzMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMzMDQ7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIzMzIyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTIzMzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMzI2OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIzMzMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMzMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIzMzM0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzMzM3OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMzM1MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzM1NDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMzM1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzM2MDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjMzNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMzNzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjMzNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMzNzc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjMzODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjMzODI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMzODg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjMzOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMzOTE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjMzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjMzOTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjMzOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM0MDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjM0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM0MDI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjM0MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM0MDU7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjM0MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM0MTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjM0MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM0MTM7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIzNDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNDQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIzNDQ1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNDQ5OzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMzQ4NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzQ5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMzQ5MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzQ5NDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyMzQ5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzQ5NzsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjM1MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM1MTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjM1MjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM1MjQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIzNTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNTM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIzNTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNTQxOzQzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMzU4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzU4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMzU4ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzU5MTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyMzU5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzU5ODsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjM2MTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM2MTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjM2MTY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM2MTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNjIxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNjI0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzYyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzYyNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM2MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM2MzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNjM4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzY0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzY0MzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNjUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNjU0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzY1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzY1OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM2NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM2NjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNjY3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzY3Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM2Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM2Nzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNjgxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzY4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzY4NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM2ODg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM2OTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNjk0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzY5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzcwMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM3MDM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNzA4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNzExOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzcxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzcxMzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyMzcxNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzcxOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM3MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM3MjE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjM3Mjg7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzczODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzczOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM3NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM3NDY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNzQ5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzc1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzc1Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM3NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM3NTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNzY0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzc3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzc3MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM3NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM3NzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNzgwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzc4NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzc4ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM3ODk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM3OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzNzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzNzk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzc5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzc5ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM4MDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM4MDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzODEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzODExOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTIzODE4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzgyMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM4Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM4Mjg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzODMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzODMxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzgzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzgzNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM4Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM4NDA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzg1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzg1MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM4NTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzODU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzODYyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzg2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzg2NDs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEyMzg3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM4Nzc7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzg4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzg4ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM4OTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzODk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzODk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzkwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzkwMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjM5MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM5MDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTIzOTEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzOTE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyMzkxNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzkxOTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjM5MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjM5MzU7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTIzOTU3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTIzOTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTIzOTYxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMzk3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzk3Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMzk3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzk4MDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMzk4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzk4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyMzk4NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzk5MDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyMzk5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyMzk5NzszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQwMzA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0MDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MDQyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0MDQ4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MDUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0MDUxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MDUzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDA1Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDA2MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQwNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQwNjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MDY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDA3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDA3MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQwNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQwNzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MDgxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDA4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDA4Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQwOTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQwOTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MDk3OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI0MTAwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MTAzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDEwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDEwNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQxMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQxMDk7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjQxMTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MTIxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDEyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDEyODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQxMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQxMzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MTM3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDEzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDE0MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQxNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQxNDQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MTUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MTUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDE1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDE1NTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjQxNjY7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDE3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDE3OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyNDE4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDE4NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQxODc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQxOTE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjQxOTU7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDIxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDIxNzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyNDIxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDIxOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQyMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQyMjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MjI2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDIzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDIzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQyMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQyMzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MjQ0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDI1Mjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyNDI1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDI2MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQyNjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQyNjU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjQyNjk7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDI5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDI5NzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyNDI5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDI5OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQzMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQzMDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MzA2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDMxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDMxMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQzMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQzMTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MzIyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDMyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDMyOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQzMzQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MzQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDM0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDM0Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQzNTQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjQzNTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQzNjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0MzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MzY0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI0MzY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0MzcyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDM3NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDM3Njs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyNDM4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDM4MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyNDM4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDM4NzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ0MDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ0MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ0MDY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0NDIwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NDIzOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI0NDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NDMwOzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNDQ2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDQ2MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNDQ2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDQ2NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNDQ2NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDQ2ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNDQ2OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDQ3MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ0NzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ0Nzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0NDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NDc5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDQ4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDQ4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ0OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ0OTE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0NDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NDk4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDUwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDUwMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ1MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ1MDc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0NTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NTEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDUxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDUxNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ1MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ1MTk7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDUyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDUzMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ1Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ1NDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0NTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NTQzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDU0Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDU1MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ1NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ1NTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0NTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NTU5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDU2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDU2Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ1NzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ1NzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0NTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NTc2OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI0NTc5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NTgyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDU4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDU4NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ1ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ1ODg7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjQ1OTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0NjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NjAzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDYwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDYwNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ2MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ2MTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0NjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NjE3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDYyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDYyMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ2MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ2MjQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDYzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDYzNTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ2NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ2NDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0NjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NjQ4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDY1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDY1Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ2NTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ2NjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0NjYzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NjY1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDY3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDY3Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ2Nzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ2ODA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0NjgyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0Njg0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI0Njg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0Njg4OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNDcwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDcwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNDcwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDcxMjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyNDcxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDcxNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ3MjY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ3MzI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjQ3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ3MzU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0NzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NzQ3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0NzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NzUwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0NzUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NzUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0NzU0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NzU4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0NzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NzY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0NzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0NzcwOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNDc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDc5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNDc5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDc5NTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ4MDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ4MTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4MTM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjQ4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4MTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ4MTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4MjM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ4MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4MzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ4MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4MzU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ4Mzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4NDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjQ4NDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4NDQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjQ4NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4NTE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0ODYxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0ODYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI0ODY0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0ODY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDg2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDg3MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ4NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4NzQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0ODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0ODgyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDg4Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ4OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ4OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0ODkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0ODk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDg5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDg5ODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ5MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ5MDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0OTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0OTE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDkxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDkxODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ5MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ5MjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0OTI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0OTI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDkzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDkzMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ5MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ5Mzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0OTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0OTM5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDk0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDk0NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ5NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ5NTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0OTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0OTU2OzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjQ5NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjQ5NzE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI0OTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI0OTc0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNDk3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNDk3OTszMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MDEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MDEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTAxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTAxNTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUwMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUwMjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MDI3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTAzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTAzMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUwMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUwMzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MDM5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTA0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTA0Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUwNTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUwNTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MDU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MDYyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTA2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTA2NDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEyNTA3MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUwNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUwNzg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MDg1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTA5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTA5NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUwOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUwOTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MTAxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTEwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTEwNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUxMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUxMTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MTE0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTEyMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTEyNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUxMjc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUxMjk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MTMxOzI5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUxNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUxNjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MTYzOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTI1MTcxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTE3NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUxNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUxNzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MTgzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTE5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTE5Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUyMDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MjAzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTIwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTIwNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUyMTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUyMTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MjE2OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEyNTIyNzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MjQwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI1MjQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MjQ3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTI0ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTI1Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyNTI1NjsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1Mjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1Mjc4OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI1Mjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MjgwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTI4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTI4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUyODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUyODc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1Mjk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1Mjk2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTI5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTMwMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUzMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUzMDU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MzEzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI1MzE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MzIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTMyMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTMyNjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyNTMzMDsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MzU4OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI1MzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MzYwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTM2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTM2MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUzNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUzNjc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1MzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1Mzc0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTM3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTM3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjUzODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjUzODM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1Mzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1MzkwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTM5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTM5NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU0MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU0MDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1NDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NDA3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTQxNTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyNTQyMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTQyMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU0MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU0MjU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjU0MzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU0MzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1NDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NDM1OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEyNTQ0NjsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1NDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NDcxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI1NDc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NDc4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTQ3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTQ4Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyNTQ4NjsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1NTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NTA2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTUxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTUxMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU1MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU1MTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1NTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NTIyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTUyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTUyNTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU1MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU1MzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1NTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NTM3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTU0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTU0Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU1NDk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1NTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NTU5OzE1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU1NzQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjU1Nzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU1ODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1NTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NTg1OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI1NTkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NTkzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTU5NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTU5Nzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyNTYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTYwNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyNTYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTYwODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjU2MjQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjU2Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU2Mjg7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjU2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU2MzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjU2Mzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU2NDA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1NjU0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NjYwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI1NjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NjYzOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1NjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NjcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1NjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1NjczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1Njc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1Njc1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1Njc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1Njc4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1Njg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1Njg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1Njg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1Njg3OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNTcwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTcwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNTcwNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTcwODszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjU3NDM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU3NDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjU3NDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU3NTI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjU3NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU3NTk7Mzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1Nzk4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1ODAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI1ODAxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1ODAzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTgwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTgwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU4MTE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1ODE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1ODE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTgyMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU4Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU4Mjg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1ODM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1ODM4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTg0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTg0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU4NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU4NDc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1ODU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1ODU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTg1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTg2MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU4NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU4NjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1ODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1ODY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTg3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTg3Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU4Nzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU4ODA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1ODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1ODgyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTg4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTg4NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU4OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU4OTE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTkwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTkwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU5MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU5MDY7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjU5MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU5MTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1OTEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1OTE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTkxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTkxODs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEyNTkyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU5MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU5MzE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1OTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1OTQxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTk0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTk0NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU5NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU5NTA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1OTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1OTU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTk2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTk2Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU5Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU5Njk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1OTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1OTcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTk3Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU5ODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU5ODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI1OTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI1OTg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNTk4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNTk4ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjU5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjU5OTQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjAwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjAwNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYwMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYwMDk7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTI2MDIwOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYwMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYwMzM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjYwMzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYwNDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MDQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MDQ1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI2MDQ5OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYwNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYwNzE7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjYwNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYwNzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MDc2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjA3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjA4MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYwODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYwODk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MDkzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjA5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjA5ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYxMDY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjYxMTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYxMTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MTE1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MTE5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI2MTIzOzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYxNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYxNTE7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjYxNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYxNTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MTU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjE1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjE2MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYxNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYxNjc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MTcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjE3Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYxODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYxODM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MTg4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjE5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjE5NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYyMDA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MjA4OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI2MjEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MjE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjIxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjIxODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyNjIyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjIyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYyMjg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYyMzA7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjYyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYyMzc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjYyNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYyNDQ7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI2MjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MjYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI2MjY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MjY3OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNjI4MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjI4NDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyNjI5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjI5MTsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjYzMTg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYzMjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjYzMjE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYzMjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MzI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MzI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjMzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjMzMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYzMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYzMzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MzQxOzE1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYzNTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MzYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjM2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjM2NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYzNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYzNjk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2MzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2Mzc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjM3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjM3Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYzODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjYzODU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2Mzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2MzkwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjM5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjM5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjYzOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY0MDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NDAzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjQwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjQxMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY0MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY0MTQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjQyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjQyNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY0MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY0MzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NDM1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjQzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjQzNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY0NDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY0NDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NDQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjQ1MTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY0NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY0NjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NDY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjQ3MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY0NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY0NzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NDc1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjQ4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjQ4Mjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY0OTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NDk3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjQ5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjUwMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY1MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY1MDM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NTA3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NTExOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjUxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjUxMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY1MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY1MTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NTI0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjUyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjUyODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY1MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY1Mzc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NTQ0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjU0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjU0OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY1NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY1NTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NTU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjU2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjU2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY1NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY1NjU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NTcyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NTc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjU3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjU3ODsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NTkwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjU5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjU5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY1OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY2MDA7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjY2MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY2MDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NjA3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NjEwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjYxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjYxMjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEyNjYxOTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NjMwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjYzNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY2Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY2NDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NjQ0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjY0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjY1MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY2NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY2NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NjU5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjY2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjY2MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY2NjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NjczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjY3NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjY3ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY2Nzk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY2ODE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NjgzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjY4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjY5MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY2OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY2OTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2Njk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2Njk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjcwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjcwMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY3MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY3MDk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NzEyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjcxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjcxNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY3MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY3MjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NzI1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjczMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjczMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY3MzU7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjY3NDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NzQ3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjc1Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY3NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY3NTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2NzYzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjc2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjc2NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY3Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY3NzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2Nzc0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjc3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjc3OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY3ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY3ODI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2NzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2Nzg0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY3OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY3OTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2Nzk3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2ODAxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjgwMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjgwNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY4MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY4MDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2ODE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2ODE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjgxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjgxODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY4MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY4MjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2ODI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2ODI2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjgzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjgzMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY4MzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY4Mzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2ODQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2ODQxOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTI2ODQ5OzE1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY4NjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2ODY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2ODcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjg3NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY4Nzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2ODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2ODgyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjg4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjg4NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY4OTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2ODk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2ODk4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjkwMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjkwNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY5MDc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY5MDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2OTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2OTEzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjkxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjkxNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjY5MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY5MjM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI2OTI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2OTMxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNjkzMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjkzNTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjY5NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY5NTE7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI2OTY1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI2OTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI2OTY5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNjk3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjk4MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyNjk4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNjk4NDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjY5OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjY5OTY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjcwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjcwMDM7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjcwMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjcwMDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjcwMTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjcwMTM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3MDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3MDI5OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3MDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3MDM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3MDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3MDM3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI3MDQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3MDQyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3MDQ4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI3MDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3MDUxOzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNzA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzA3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNzA3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzA4MTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNzA4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzA4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNzA4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzA4OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyNzA5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzA5MzszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjcxMjU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjcxMzE7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjcxMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjcxMzQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3MTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3MTQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3MTQ2Ozg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3MTU0OzczOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMjcyMjc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjcyMzM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjcyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjcyMzc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjcyNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjcyNDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjcyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjcyNDk7NDM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3MjkyOzE2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzMwODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjczMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjczMjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjczMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjczMjM7NDI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3MzY1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3MzcwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNzM4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzM4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNzM4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzM4MzszNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc0MTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc0MjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc0MjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc0MjY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjc0MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc0MzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc0MzI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc0Mzc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3NDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NDUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3NDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NDUyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNzQ2Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzQ2ODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc0Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc0Nzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc0ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc0ODE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc0ODY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc0OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc0OTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc0OTU7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3NTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NTIyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3NTI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NTMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3NTMzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NTM2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI3NTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NTQzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3NTQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NTUyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3NTUzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NTU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzU1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzU2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc1NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc1NjM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3NTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NTcxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzU3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzU3NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc1Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc1ODA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3NTg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NTkwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzU5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzU5MjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyNzU5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzU5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc1OTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc2MDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3NjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NjA0Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTI3NjEyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzYxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzYxNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc2MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc2MjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3NjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NjI3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzYzMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzYzNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc2Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc2Mzg7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTI3NjQ5OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc2NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc2NjI7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjc2NjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc2Njk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3NjcwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3Njc0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI3Njc4OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc2OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc3MDA7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjc3MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc3MDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3NzA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NzA1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzcwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzcwOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc3MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc3MTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3NzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NzIyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzcyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzcyNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc3MzU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjc3NDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc3NDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3NzQ0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3NzQ4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI3NzUyOzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc3ODA7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjc3ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc3ODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3Nzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3Nzg1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzc4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzc4OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc3OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc3OTY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3ODAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3ODAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzgwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzgwNTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc4MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc4MTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3ODE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3ODE3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzgyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzgyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc4Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc4Mjk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3ODM3OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI3ODQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3ODQ1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzg0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzg0Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyNzg1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzg1NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc4NTc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc4NTk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjc4NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc4NjY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjc4Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc4NzA7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3ODg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3ODg2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI3ODg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3ODkwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyNzkwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzkwNzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyNzkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzkxNDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc5MjU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc5Mjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjc5Mjg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc5MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3OTMzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3OTM2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzkzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzkzODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc5NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc5NDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3OTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3OTQ4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzk1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzk1ODsxNTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3OTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3OTc0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzk4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzk4NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjc5ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjc5ODc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI3OTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI3OTk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyNzk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyNzk5ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgwMDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgwMDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4MDA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MDA2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODAxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODAxMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgwMTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4MDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MDE5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODAyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODAyMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgwMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgwMjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4MDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MDMxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODAzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODAzNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgwMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgwMzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4MDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MDQxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODA0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODA1MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgwNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgwNTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4MDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MDU4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODA2Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODA2NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgwNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgwNjk7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODA4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODA4MTsxNTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4MDk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MDk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODEwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODEwMTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyODEwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODEwNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgxMDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgxMTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4MTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MTE0Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTI4MTIxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODEyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODEyOTsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4MTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MTQ3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODE0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODE1MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgxNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgxNTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4MTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MTYxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODE3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODE3MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgxNzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgxNzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4MTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MTc5Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTI4MTg3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODE4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODE4OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgxOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgxOTk7MTQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODIxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODIxNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjgyMTg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgyMjA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjgyMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgyMzA7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4MjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MjYxOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4MjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MjcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4MjcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4Mjc0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4MjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4Mjg0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyODI5NDs5OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODMwMzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyODMwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODMwNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjgzMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgzMTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjgzMTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgzMjI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjgzMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgzMzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjgzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgzMzQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjgzMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjgzMzg7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4MzUyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI4MzU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4MzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4MzU4OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyODM3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODM3NTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyODM4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODM4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyODM4ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODM5MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyODM5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODM5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyODM5Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODQwMTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyODQxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODQxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyODQxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODQxMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyODQxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODQxNzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjg0MzU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjg0Mzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjg0NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg0NDE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjg0NTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg0NTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjg0NTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg0NTc7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjg0NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg0NjQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4NDc0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NDc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4NDc3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NDc5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODQ4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODQ4NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg0ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg0ODc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NDk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODQ5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODQ5OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg1MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg1MDQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NTEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODUxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODUxNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg1MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg1MTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NTIzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODUyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODUyOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg1MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg1MzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NTM3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODU0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODU0MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg1NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg1NDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NTUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODU1Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODU1NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg1NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg1NTk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NTY1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODU2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODU2ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg1NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg1NzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NTc3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODU3OTsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NTk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODYwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODYwMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg2MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg2MDQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NjA5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODYxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODYxMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg2MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg2MTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NjIxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODYyODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODYzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg2MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg2MzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NjM4OzIyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg2NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg2NjE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NjY3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODY3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODY3MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg2NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg2NzU7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODY4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODY4NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg2ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg2OTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NjkzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODY5ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODcwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg3MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg3MDQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NzEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NzEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODcxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODcxNTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyODcxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODcyMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg3MjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg3MjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NzI4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTI4NzM1OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg3NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg3NDY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NzUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NzUzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODc1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODc1NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg3NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg3NjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NzY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NzY1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODc3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODc3MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg3ODA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4NzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4NzgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODc4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODc4Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg3OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg3OTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4Nzk1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4Nzk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODgwMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODgwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg4MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg4MDY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4ODE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4ODE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODgxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODgxOTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEyODgyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg4MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg4MzE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4ODM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4ODM2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODgzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODgzOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg4NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg4NDM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4ODQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4ODQ4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODg1NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg4NTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg4NjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4ODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4ODYzOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTI4ODcxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODg3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODg3Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg4ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg4ODI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4ODg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4ODg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODg5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODg5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg4OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg4OTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4OTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4OTAxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODkwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODkwNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg5MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg5MTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4OTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4OTE4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODkyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODkyNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg5MzA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg5MzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4OTM1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4OTM3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODk0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODk0Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg5NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg5NDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4OTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4OTUyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODk1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODk1Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg5NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg5NjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI4OTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4OTY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyODk3MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyODk3MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjg5NzU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjg5Nzc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI4OTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI4OTkzOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTAxMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyOTAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTAxNDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjkwMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkwMjY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjkwMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkwMzM7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjkwMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkwMzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjkwNDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkwNDM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjkwNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkwNTA7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI5MDc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MDc4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTA4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTA5MDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTA5NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTA5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTA5OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTEwMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkxMDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkxMDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MTA5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTExNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTExNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkxMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkxMjE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MTI0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTEyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTEyNjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkxMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkxMzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MTM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTE0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTE0Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkxNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkxNDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MTUzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTE1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTE2MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkxNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkxNjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MTY3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTE3Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTE4MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkxODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkxODI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MTkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTE5NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkxOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkxOTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MjAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MjAyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTIxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTIxMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkyMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkyMTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MjIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTIyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTIyNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkyMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkyMzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MjM2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTI0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTI0MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkyNDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkyNDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MjQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MjUwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTI1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTI1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkyNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkyNjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MjY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MjY2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTI3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTI3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkyNzc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5Mjg0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTI4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTI4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkyOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkyOTE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5Mjk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5Mjk4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTMwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTMwNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkzMTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkzMTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MzE1OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI5MzE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MzIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTMyMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTMyNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkzMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkzMjc7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMjkzMzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MzQxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTM0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTM0ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkzNTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MzYwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTM2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTM2NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkzNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkzNzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MzczOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTM3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTM3Nzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjkzODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjkzODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5MzkwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5MzkyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTM5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTM5NDsyOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NDI0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTQyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTQyNjs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEyOTQzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk0MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk0Mzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NDM5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTQ0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTQ0ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk0NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk0NTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NDU1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTQ2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTQ2MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk0NjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NDczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTQ3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk0ODA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NDg5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NDkzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTQ5NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTQ5Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk1MDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NTA5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTUxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTUxMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk1MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk1MTY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NTI2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTUzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTUzMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk1MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk1MzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NTQwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTU0NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTU0ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk1NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk1NTA7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTI5NTYxOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk1NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk1NzQ7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjk1Nzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk1ODE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NTgyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NTg2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI5NTkwOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk2MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk2MTI7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjk2MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk2MTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NjE3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTYyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTYyMTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk2Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk2MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NjM0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTYzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTYzOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk2NDc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjk2NTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk2NTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NjU2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NjYwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI5NjY0OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk2OTI7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjk2OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk2OTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5Njk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5Njk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTcwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTcwMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk3MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk3MDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NzEzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTcxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTcxNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk3MjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NzI5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTczNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTczNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk3NDE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5NzQ5OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI5NzU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5NzU3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTc1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTc1OTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyOTc2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTc2NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk3Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk3Njk7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTI5NzgwOzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk4MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk4MDU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjk4MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk4MTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5ODEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5ODE2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTI5ODIwOzE5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk4Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk4NDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5ODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5ODQ1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTg0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTg0OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk4NTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5ODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5ODU5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTg2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTg2NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk4NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk4NzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5ODc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5ODc3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTg4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTg4Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk4OTM7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEyOTkwODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEyOTkxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTkxNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMjk5MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk5MTk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMjk5MjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk5Mjc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTI5OTI5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5OTMxOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTI5OTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5OTM4OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTI5OTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTI5OTQ0OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTk2NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEyOTk2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTk2ODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTk3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEyOTk3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEyOTk4MDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMjk5OTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMjk5OTc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMjk5OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAwMDA7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAwMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAwMDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAwMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAwMTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAwMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAwMTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAwMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAwMTU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAwMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAwMjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAwMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAwMjQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwMDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwMDQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwMDQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwMDQ1OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDA4MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDA4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDA4NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDA4OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMDA5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDA5Mzs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDA5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDA5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDA5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDEwMDszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAxMzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAxMzU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzAxMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAxMzk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwMTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwMTUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwMTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwMTUyOzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDE4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDE4NTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDE5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDE5MjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAyMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAyMDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAyMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAyMDY7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwMjI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwMjMxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMwMjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwMjM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwMjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwMjM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwMjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwMjM5OzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDI2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDI2NTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDI3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDI3MTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDI3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDI4MDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAyOTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAyOTU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzAyOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAyOTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAzMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAzMDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAzMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAzMDM7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAzMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAzMDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzAzMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAzMTA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwMzIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwMzIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMwMzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwMzIzOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDM0NDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDM1MDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMDM1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDM1NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMDM2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDM2MTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDM2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDM3MDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDM3MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDM3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMDM3NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDM3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzAzODE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAzODQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwMzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwMzg2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDM5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDM5NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzAzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzAzOTg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNDA4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDQxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDQxNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA0MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA0MTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNDIyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDQyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDQyODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA0Mzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNDQxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDQ0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDQ0NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA0NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA0NTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNDU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNDU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDQ2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDQ2MTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzMDQ2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDQ2NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA0Njg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA0NzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNDczOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTMwNDgwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDQ4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDQ5MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA0OTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNDk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNDk5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDUwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDUwMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA1MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA1MDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNTExOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDUxNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA1MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA1MjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNTI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDUzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDUzMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA1Mzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA1NDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNTQzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNTQ1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDU0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDU1MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA1NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA1NTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNTU3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDU2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDU2NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA1Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA1Njg7Mzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDYwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA2MDk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA2MTE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNjIxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDYyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDYyNTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA2MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA2MzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNjM1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDYzNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDYzOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA2NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA2NDE7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzA2NDk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNjU2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDY2MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA2NjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNjcwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDY3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDY3Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA2ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA2ODY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNjg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNjg5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDY5Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA2OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA2OTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNzA4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDcxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDcxMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA3MTQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA3MTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNzIwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDczMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA3MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA3MzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNzM3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDc0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDc0NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA3NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA3NTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNzU3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDc2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDc2NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA3Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA3NzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNzc0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDc4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDc4MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA3ODU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA3ODg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwNzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwNzkwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDc5Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA3OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA4MDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwODAyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwODA3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDgwODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDgxMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA4MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA4MTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwODIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwODIxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDgyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDgyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA4Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA4Mjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwODMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwODMzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDgzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDg0MDsxODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwODU5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDg2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDg2MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA4NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA4NjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwODY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwODcwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDg3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDg3NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA4Nzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA4ODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwODg0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwODg2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDg5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDg5NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA4OTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA4OTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwOTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwOTAxOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEzMDkxMjsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwOTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwOTI1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMwOTI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwOTMyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDkzMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDkzNzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzMDk0MTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwOTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwOTYzOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMwOTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwOTY1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDk2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDk2ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA5NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA5NzI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwOTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMwOTgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMDk4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMDk4NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzA5ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzA5OTA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMwOTk4OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMxMDAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMDA2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTAwNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTAxMTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzMTAxNTsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMDQzOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMxMDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMDQ1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTA0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTA0ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzEwNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzEwNTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMDU5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTA2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTA2NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzEwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzEwNjg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMDc1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTA3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTA4MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzEwODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzEwODg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMDkyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTEwMDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzMTEwNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTEwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzExMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzExMTA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzExMTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzExMTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMTIwOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEzMTEzMTsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMTU2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMxMTYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMTYzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTE2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTE2Nzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzMTE3MTsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMTkxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTE5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTE5NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzExOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzEyMDA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMjA3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTIwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTIxMDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzEyMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzEyMTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMjIyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTIyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTIyODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzEyMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzEyMzQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMjQ0OzE1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzEyNTk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzEyNjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzEyNjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMjcwOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMxMjc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMjc4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTI4MDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEzMTI4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzEyOTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzEyOTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxMjk1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMjk3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMxMzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMzA0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMxMzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMzA4OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMTMyNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMTMyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTMyODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzEzMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzEzMzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzEzNDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzEzNDM7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMxMzU3OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMzYzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMxMzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxMzY2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMTM3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTM3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMTM3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTM3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMTM4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTM4MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMTM4Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTM4ODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzEzOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzEzOTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzE0MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE0MDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzE0MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE0MDM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzE0MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE0MDY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzE0MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE0MTY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzE0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE0MTk7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMxNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNDUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMxNDUyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNDU2OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMTQ5MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTQ5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMTQ5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTUwMDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMTUwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTUwNzs0MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzE1NDk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE1NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzE1NTI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE1NTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNTU3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNTYwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTU2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTU2Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE1Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE1NzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNTc0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTU4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTU4MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE1ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE1ODQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNTg4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTU5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTU5ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE2MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE2MDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNjA1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTYxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTYxMTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE2MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE2MjA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNjI4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNjMyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTYzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTYzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE2MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE2Mzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNjQxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTY0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTY0Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE2NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE2NTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNjYwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTY2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTY2NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE2NzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE2NzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNjc4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTY4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTY4Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE2ODk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNjk1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTcwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTcwNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE3MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE3MDg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNzE4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTcyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTcyNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE3Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE3MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNzM0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTczOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTc0MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE3NDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE3NDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNzQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTc1Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE3NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE3NTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNzYyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTc2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTc2NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE3NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE3Njc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNzczOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTc3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTc3OTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE3ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE3ODg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxNzkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxNzkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTc5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTc5NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE4MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE4MDU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxODE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxODE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTgxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTgxOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE4MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE4MjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxODI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxODI2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTgyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTgyODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxODM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxODM5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTg0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTg0MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE4NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE4NDY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxODU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxODU1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTg1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTg1ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE4NjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxODY5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTg3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTg3NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE4Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE4Nzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxODgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxODgxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTg5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTg5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE4OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE4OTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxODk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxODk5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTkwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTkwODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE5MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE5MTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxOTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxOTIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTkyMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE5Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE5MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxOTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxOTM0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE5NDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE5NDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxOTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxOTQ5OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMxOTUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxOTU1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTk1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTk1OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE5NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE5NjE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzE5Njg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxOTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxOTc0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTk3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTk3ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzE5ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzE5ODU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMxOTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMxOTg4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMTk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMTk5ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIwMDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMDExOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjAxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjAyMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIwMjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIwMjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMDI3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMDI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjAzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjAzMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIwMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIwNDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMDQzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjA0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjA0Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIwNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIwNTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMDYxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjA2NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjA2OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIwNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIwNzE7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzIwNzk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMDg2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjA4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjA4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIwOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIwOTM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMTAzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjEwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjEwNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIxMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIxMTA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMTE2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjEyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjEyNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIxMzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIxMzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMTM4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMTQwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjE0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIxNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIxNDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMTUzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjE2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjE2MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIxNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIxNjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMTcwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjE3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjE4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIxODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIxODQ7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTMyMTk1OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIyMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIyMDg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzIyMTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIyMTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMjE2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMjIwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMyMjI0OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIyNDY7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzIyNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIyNDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMjUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjI1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjI1NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIyNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIyNjQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMjY4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjI3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjI3Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIyODE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzIyODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIyODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMjkwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMjk0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMyMjk4OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIzMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIzMjY7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzIzMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIzMjg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMzMxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjMzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjMzNTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIzNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIzNDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMzQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjM1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjM1MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIzNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIzNTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMzYzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjM3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjM3MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzIzNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzIzNzU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyMzgzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMyMzg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyMzkxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjM5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjM5Mzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzMjM5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjQwMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzI0MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI0MDM7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTMyNDE0OzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzI0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI0Mzk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzI0NDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI0NDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyNDQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNDUwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMyNDU0OzE5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzI0NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI0NzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyNDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNDc5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjQ4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjQ4NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzI0ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI0ODg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyNDkyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMyNDk3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNTAwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjUwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjUwNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzMjUwODsyMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyNTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNTMxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjUzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjUzNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzI1NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI1NDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyNTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNTQ1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjU0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjU0ODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzI1NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI1NTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyNTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNTYxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjU2NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzI1NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI1NzU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMyNTgzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMyNTg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNTkxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMjU5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjU5Mzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzMjU5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjYwMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzI2MDM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI2MDU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzI2MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI2MTI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzI2MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI2MTY7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMyNjQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNjQyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMyNjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNjQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMyNjUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNjUzOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjY2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjY3MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI2ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI2ODE7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI2ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI2OTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzI2OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI2OTU7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI3MDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI3MDM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzI3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI3MDc7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMyNzE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNzIxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMyNzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyNzI1OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjczODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjc0MTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjc0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjc0ODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjc1Nzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjc2MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMjc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjc2Njs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjc3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjc3MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjc3Njs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMjc4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjc4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjc4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjc4Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjc4NzszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI4MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI4MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI4MjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI4Mjk7NTU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTEzMjg4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjg4NTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMjg4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjg4ODs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjg5NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMjg5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMjg5OTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI5MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI5MjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI5MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI5MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI5MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI5MjQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI5MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI5Mjc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI5MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI5MzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzI5MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzI5Mzc7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMyOTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyOTYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMyOTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyOTYyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMyOTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyOTY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMyOTY2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMyOTcwOzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzAwODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzAxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzAxMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzAxNjs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzAyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzAyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzAyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzAyMzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMwMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMwMzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMwMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMwNDA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMwNDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMwNTE7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzMDYyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzMDY2OzM2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xMzMxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMxMDM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzMxMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMxMDY7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMxMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMxMTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMxMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMxMTU7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzMTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzMTM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzMTQwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzMTQ0OzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzE4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzE4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzE4Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzE5MDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzE5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzE5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzIwMTsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMyMjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMyMjY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzMjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzMjM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzMjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzMjM5OzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzI2OTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzI3NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMzI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzI4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzI4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzI4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzI4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzI4NDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzI5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzI5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzI5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzI5NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMzMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMzMDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMzMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMzMDc7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzMzMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzMzMzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzMzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzMzQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzMzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzMzQyOzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzM3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzM3NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMzODc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzMzOTA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzMzOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM0MDA7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM0MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM0MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM0MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM0MDc7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNDMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNDM0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMzNDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNDM3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNDQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNDQyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNDQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNDUxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzQ2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzQ2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzQ2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzQ2ODszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM1MDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM1MDc7Mzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNTQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNTQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNTQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNTUyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMzNTU1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNTU4Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNTY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNTY5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMzNTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNTczOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMzNTc2OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNTgzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzU5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzU5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzU5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzU5ODsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM2MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM2MTg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM2MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM2MjE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNjMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNjM0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTMzNjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNjM3OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzY1MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzY1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzY1NDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM2NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM2NzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM2NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM2NzQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM2NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM2Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM2Nzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM2ODI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNjk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNjk3OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzcyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzcyNTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM3Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM3Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM3Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM3NDA7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNzUzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNzU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzNzU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzNzYyOzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzMzc5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzgwMDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzMzgwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzgwNzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM4MTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzM4MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM4MjA7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzODMzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzODM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTMzODM2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzODM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzg0MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzg0NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzM4NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM4NDY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMzODUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzODU0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzg1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzg1ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzM4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM4NjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMzODY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzODY4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzg3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzg3Mjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzM4ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM4ODI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMzODgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzODg0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzg5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzg5MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzM4OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM4OTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMzODk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzOTAwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzkxMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzM5MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM5MTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMzOTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzOTIwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTMzOTIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzOTI2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzkyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzkzMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzM5MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM5MzI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzM5Mzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMzOTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzOTQxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzk0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzk0Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzM5NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM5NTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMzOTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzOTU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzk1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzk1OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzM5NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM5NjU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMzOTczOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzOTc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzk3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzk3ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEzMzk4NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzM5ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzM5OTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTMzOTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTMzOTk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzMzk5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzMzk5OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQwMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQwMDU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0MDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MDE0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDAxNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQwMTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQwMjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0MDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MDI0Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTM0MDMyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDAzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDAzNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQwNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQwNDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0MDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MDQ2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDA0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDA1MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQwNjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0MDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MDYyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDA3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDA3MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQwNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQwNzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0MDc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MDc4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDA4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDA4ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQwOTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQwOTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0MDk3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MDk5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDEwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDEwODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQxMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQxMTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0MTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MTE1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDEyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDEyNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQxMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQxMjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0MTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MTMyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDE0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDE0MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQxNDU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQxNDc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzQxNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQxNTE7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0MTc2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTM0MTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MTgwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0MTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MTgzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTM0MTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MTg3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0MTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MTkzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0MTk0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MTk3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0MjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MjA0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0MjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MjEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0MjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MjE1OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNDIzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDI0MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzNDI0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDI0NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzQyNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQyNTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzQyNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQyNTc7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0Mjg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MjkwOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTM0Mjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0Mjk3OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNDMxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDMyMDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzQzMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQzMzI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzQzMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQzMzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzQzMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQzMzc7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0MzQ4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MzUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0MzUxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MzUzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDM1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDM1OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQzNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQzNjE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0MzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0MzY4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDM3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDM3MjsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0MzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0Mzg0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDM4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDM4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQzOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQzOTE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NDAwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NDAzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDQwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDQwNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ0MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ0MDk7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzQ0MTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NDIxOzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ0MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ0MzM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NDM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NDQxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDQ0Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDQ0NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ0NDg7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTM0NDU5OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ0NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ0NzI7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzQ0NzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ0Nzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NDgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NDg0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM0NDg4OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ1MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ1MTA7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzQ1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ1MTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NTE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDUxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDUxOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ1Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ1Mjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NTMyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDUzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDUzNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ1NDU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzQ1NTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ1NTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NTU0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NTU4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM0NTYyOzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ1ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ1OTA7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzQ1OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ1OTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NTk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDU5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDU5OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ2MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ2MDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NjExOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDYxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDYxNTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ2MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ2MjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NjI3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDYzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDYzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ2Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ2Mzk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NjQ3OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM0NjUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NjU1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDY1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDY1Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzNDY2MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDY2NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ2NjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ2NzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0NjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NjcyOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTM0Njc5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDY4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDY4NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ2ODk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ2OTE7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzQ2OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ2OTg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzQ3MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ3MDI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0NzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NzE3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0NzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NzIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0NzIxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NzI0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNDczODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDc0MTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzNDc0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDc0ODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzQ3NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ3NjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzQ3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ3NjM7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0NzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NzgxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0NzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0NzgzOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNDgwMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDgwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNDgwNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDgwNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ4MDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ4MTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0ODE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0ODE1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDgyMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ4MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ4Mjc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0ODMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0ODMzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDgzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDgzNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ4Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ4NDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0ODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0ODQ1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDg1NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ4NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ4NjM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0ODY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0ODcxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDg3MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDg3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ4Nzc7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzQ4ODU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0ODkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0ODkxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDg5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDg5NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ4OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ4OTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0OTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0OTAzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDkxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDkxMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzQ5MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ5MjE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM0OTI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0OTI5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNDkzMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDkzMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzNDkzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNDkzNzsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzQ5NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ5NjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzQ5NjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ5NjU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzQ5Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzQ5Njk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0OTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0OTg2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM0OTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM0OTg4OzQyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTAzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTAzMTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzUwNDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUwNDY7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzUwNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUwNTM7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM1MDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MDg2Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM1MDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MDk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM1MDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MDk3OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTExNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTExNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTExNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTExNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTExOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTEyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTEyMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTEyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUxMjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUxMzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MTMyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTEzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTE0MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUxNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUxNDQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MTUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTE1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTE1NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUxNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUxNTk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MTY5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTE3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTE3NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUxODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUxODE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MTg1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTE5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTE5NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUxOTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUyMDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MjA0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTIxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTIxNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUyMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUyMTc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MjI2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTIzMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTIzNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUyMzc7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzUyNDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUyNDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MjQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MjQ3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTI0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTI0OTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEzNTI1Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUyNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUyNjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MjY3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUyNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUyNzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MjgxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTI4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTI4Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUyOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUyOTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1Mjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1Mjk3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTMwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTMwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUzMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUzMDY7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzUzMTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MzE4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTMyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTMyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUzMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUzMjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MzMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MzMzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTM0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTM0Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUzNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUzNDk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MzU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTM1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTM1OTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUzNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUzNjg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MzcyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1Mzc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTM3NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTM3OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzUzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzUzODk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1MzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1MzkyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTQwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTQwMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzU0MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU0MDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1NDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1NDEwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTQxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTQxODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzU0MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU0MjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1NDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1NDI1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTQzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTQzNTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM1NDQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1NDQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNTQ1MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTQ1Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTQ1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTQ2MDszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU0OTY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU1MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU1MDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU1MDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU1MDg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzU1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU1MTI7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU1MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU1MTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU1MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU1MTg7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM1NTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1NTM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM1NTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1NTM4OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTU2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTU2MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzNTU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTU2Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTU3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTU3OTs1MDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU2Mjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU2MzI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzU2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU2MzY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU2NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU2NDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU2NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU2NDY7MzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM1NjgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1Njg1OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM1NjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1NjkyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTcwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTcwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTcwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTcwNjszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU3Mzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU3NDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzU3NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU3NDU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM1NzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1NzU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM1NzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1NzYxOzQwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTgwMTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTgwNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzNTgxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTgxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTgxMjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzNTgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTgxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTgxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTgxODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTgxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTgyMDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU4MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU4MzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU4MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU4MzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU4MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU4MzY7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU4NDU7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU4NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU4NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzU4NTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzU4NTU7NDM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM1ODk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM1ODk5OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTkzNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTkzODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzNTk0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTk0MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTk0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTk0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTk0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTk0Njs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTk1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTk1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNTk1Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNTk2MTs0OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzYwMTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYwMTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzYwMTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYwMTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzYwMTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYwMjI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzYwMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYwMjU7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzYwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYwMzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzYwMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYwMzI7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM2MDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MDQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM2MDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MDQ4OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNjA2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjA3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNjA3MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjA3NTs0OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzYxMjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYxMjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzYxMjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYxMzE7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM2MTQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MTQ5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTM2MTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MTU2OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNjE3NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjE3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNjE3NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjE3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzYxODI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYxODU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2MTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MTg3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjE5NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzYxOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYxOTk7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjIwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjIxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzYyMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYyMTQ7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzYyMTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYyMjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2MjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MjIyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjIyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjIyNzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2MjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MjM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjI0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjI0Mjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzYyNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYyNTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2MjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MjU1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjI2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjI2MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzYyNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYyNjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2MjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MjcwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzYyODA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYyODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2Mjg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2Mjg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjI4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjI4Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzYyOTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYyOTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2Mjk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2Mjk2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjMwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjMwMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzYzMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYzMDg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2MzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MzE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjMxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjMxOTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2MzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MzMxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjMzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjMzNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzYzNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYzNDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2MzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MzQ1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjM1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjM1MTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2MzYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MzY1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjM2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjM2Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzYzNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYzNzU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2Mzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2MzgwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjM4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjM4NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzYzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYzODk7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzYzOTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzYzOTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2Mzk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2Mzk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjQwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjQwMTs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEzNjQwOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY0MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY0MTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NDE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjQyMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY0MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY0MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NDMwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY0NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY0NDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NDQzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjQ0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjQ0NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY0NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY0NTA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NDU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjQ1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjQ2MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY0NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY0NjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NDY5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NDczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjQ3NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjQ3Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY0ODU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjQ5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjQ5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY0OTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NTAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjUwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjUwNTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY1MTI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NTE4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjUyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjUyMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY1MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY1Mjc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NTM2OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY1NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY1NDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NTUwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NTUyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjU1Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY1NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY1NjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NTczOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjU4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjU4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY1ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY1ODY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NTkzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjU5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjYwMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY2MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY2MDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NjA3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjYxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjYxNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY2MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY2MjE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NjIzOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NjI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjYzMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjYzMjs4MDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NzEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjcxNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjcxNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY3MjQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NzMyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjczNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjczNjsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NzQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjc1MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY3NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY3NTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NzYxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjc2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjc2NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY3Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY3Njk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NzcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjc3Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY3ODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY3ODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2NzkwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2NzkyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjc5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjc5OTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2ODEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2ODExOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjgxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjgxNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY4MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY4MjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2ODIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2ODIzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjgzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjgzMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY4NDE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2ODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2ODQ2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjg0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjg1MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY4NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY4NjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2ODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2ODYzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjg2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjg3MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY4NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY4NzQ7NTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzY4Nzk7MTg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjg5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjkwMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY5MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY5MDI7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTM2OTEzOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY5MjY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzY5MzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY5MzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2OTM0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2OTM4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM2OTQyOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY5NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY5NjQ7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzY5NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY5NjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2OTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2OTY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjk3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjk3Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY5ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzY5ODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM2OTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM2OTg2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNjk5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNjk5MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzY5OTk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzcwMDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcwMDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MDA4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MDEyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM3MDE2OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzcwNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcwNDQ7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzcwNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcwNDY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MDQ5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzA1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzA1Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzcwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcwNjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MDY1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzA2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzA2OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzcwNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcwNzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MDgxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzA4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzA4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzcwOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcwOTM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MTAxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM3MTA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MTA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzExMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzExMTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzNzExNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzExOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzcxMjE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcxMjM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzcxMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcxMzA7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzcxMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcxMzY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM3MTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MTUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM3MTUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MTU1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzNzE2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzE3Mjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzNzE3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzE3OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzNzE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzE4MzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzcyMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcyMDI7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM3MjE1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MjE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM3MjE4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MjIwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzIyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzIyNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzcyMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcyMjg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MjM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzI0MDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MjUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MjUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzI1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzI1NTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzNzI1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzI2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzcyNjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcyNjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MjY3Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTM3Mjc1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzI4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzI4MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzcyODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcyODU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MjkyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzI5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzI5NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzcyOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzcyOTk7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzMwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzMxMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzczMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzczMTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MzE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzMxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzMxOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzczMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzczMjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MzI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzMzMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzMzNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzczMzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzczMzk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MzQ1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzM1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzM1NDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MzY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MzY1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzM3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzM3NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzczNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzczNzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3MzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3MzgxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzM4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzM4Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzczOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzczOTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3Mzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NDAwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzQwMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzQwNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc0MDg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc0MTA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NDE3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzQyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzQyNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc0Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc0Mjg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NDMxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzQzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzQzNTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc0NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc0NDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NDQ1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzQ0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzQ0OTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NDU5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NDYzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzQ2NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzQ2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc0Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc0NzA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NDgwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzQ4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzQ4Nzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc0OTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NTAwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzUwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzUwNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc1MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc1MTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NTIxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzUyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzUyNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc1MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc1MzM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NTQwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzU0Mjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzU0ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc1NDk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc1NTE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzU2MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzU2MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc1NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc1NjY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NTc2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzU3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc1ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc1ODE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NTkxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzU5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzU5NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc1OTk7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzc2MDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NjAyOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM3NjAzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzYwODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc2MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc2MTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NjE5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzYyMzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzNzYyNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc2MjY7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzc2Mjc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NjMyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NjM2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzYzNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzYzOTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc2NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc2NDc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NjU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzY1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzY1OTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NjcxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzY3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzY3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc2Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc2Nzg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3Njg0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzY4ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc2OTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3Njk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3Njk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzY5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzY5OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc3MDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc3MTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NzEzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NzE1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzcyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzcyMjsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NzM0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzczNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzczNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc3NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc3NDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NzQ2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzc1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzc1Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc3NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc3NjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3NzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3NzY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzc3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzc3Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc3ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc3ODM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3Nzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3Nzg2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzc5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzc5NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc3OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc3OTc7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTM3ODA4OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc4MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc4MjE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzc4MjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc4Mjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3ODI5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3ODMzOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM3ODM3OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc4NTk7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzc4NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc4NjE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3ODYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3ODY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzg2ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc4Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3ODgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3ODgxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzg4Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc4OTQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzc4OTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc5MDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3OTAzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3OTA3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM3OTExOzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc5Mzk7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzc5NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc5NDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3OTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3OTQ0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzk0ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc5NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc5NTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3OTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3OTYwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzk2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzk2NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc5NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc5NzE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3OTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM3OTc2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzNzk4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzNzk4NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzc5ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzc5ODg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM3OTk2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM4MDAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MDA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODAwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODAwNjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzODAxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODAxNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgwMTY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgwMTg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzgwMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgwMjU7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzgwMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgwMzE7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM4MDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MDUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM4MDUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MDU1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODA2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODA3Mjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzODA3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODA3OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzODA4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODA4MzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzgxMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgxMDI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM4MTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MTE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM4MTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MTE2OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODEyOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODEzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODEzMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODEzNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgxMzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgxNDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4MTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MTQyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODE0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODE1MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgxNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgxNTQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODE2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODE2NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgxNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgxNzU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODE4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODE4Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgxOTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgxOTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4MTk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MTk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODIwMTs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEzODIwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgyMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgyMTM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4MjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MjIzOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgyMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgyMzQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4MjM5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MjQyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODI0MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODI0NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgyNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgyNDg7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTM4MjU5OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgyNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgyNzI7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzgyNzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgyNzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4MjgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4Mjg0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM4Mjg4OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgzMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgzMTA7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzgzMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgzMTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MzE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODMxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODMxOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgzMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgzMjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4MzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MzMyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODMzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODMzNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgzNDU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzgzNTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgzNTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4MzU0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4MzU4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM4MzYyOzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzgzODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgzOTA7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzgzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzgzOTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4Mzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4Mzk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODM5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODM5OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg0MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg0MDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4NDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NDExOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODQxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODQxNTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg0MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg0MjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4NDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NDI3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODQzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODQzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg0Mzk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4NDQ3OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM4NDUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NDU1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODQ1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODQ1Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzODQ2MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODQ2NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg0NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg0Njc7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzg0NzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4NDc3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NDgwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODQ4MjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODQ4NDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzODQ5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODQ5MTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODQ5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODQ5NzsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzg1MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg1MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzg1MjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg1MjY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM4NTQwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NTQzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTM4NTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NTQ2OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODU2NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODU2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODU3MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzODU3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODU3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODU3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzODU3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODU4MTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzODU4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODU4ODs1NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzg2NDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg2NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzg2NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg2NDk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzg2NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg2NTY7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM4Njc2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4Njc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM4Njc5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NjgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODY4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODY4NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg2ODk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4NjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4Njk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODY5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODY5ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg3MDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4NzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NzA4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODcxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODcxNzsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4NzI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NzMxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODczMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODczMzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzODczNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODczOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg3NDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg3NDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4NzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NzQ1Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTM4NzUzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODc1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODc1Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg3NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg3NjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4NzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NzY3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODc3NjsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4Nzg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4NzkwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODc5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODc5MjsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzg4MDM7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODgxNjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzODgyMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODgyMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg4MjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg4Mjg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzg4MzI7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODg1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODg1NDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzODg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODg1NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg4NTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4ODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4ODYzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODg3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODg3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg4NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg4NzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4ODgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4ODgxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODg4OTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzODg5NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODg5NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg4OTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg5MDI7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzg5MDY7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODkzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODkzNDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzODkzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODkzNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg5Mzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4OTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4OTQzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODk0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODk1MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg5NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg5NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4OTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4OTU5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODk2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODk2Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg5NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg5NzE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM4OTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM4OTc5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzODk4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzODk4Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzg5OTE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzg5OTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzg5OTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5MDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MDAxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM5MDA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MDA5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTAxMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTAxMzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzOTAxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTAyMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzOTAyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTAyNDsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzkwNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkwNDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzkwNDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkwNDg7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM5MDYyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MDY1OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTM5MDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MDcyOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzOTA5NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTA5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzOTA5NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTA5OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkxMDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkxMDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5MTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MTA3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTExNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTExNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkxMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkxMTk7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTEyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTEzMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkxNDA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTE1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTE1MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkxNTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkxNjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5MTYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MTY0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTE2Njs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTEzOTE3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkxNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkxNzg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5MTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MTg4OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkxOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkxOTk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5MjA0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MjA3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTIwODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTIxMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkyMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkyMTM7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTM5MjI0OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkyMzc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzkyNDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkyNDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5MjQ1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MjQ5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM5MjUzOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkyNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkyNzU7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzkyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkyNzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5Mjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MjgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTI4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTI4NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkyOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkyOTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5Mjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5Mjk3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTMwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTMwMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkzMTA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzkzMTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkzMTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5MzE5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MzIzOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM5MzI3OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkzNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkzNTU7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzkzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkzNTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5MzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MzYwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTM2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTM2NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkzNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkzNzE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5Mzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5Mzc2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTM3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTM4MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzkzODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzkzODc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5MzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5MzkyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTM5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTQwMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk0MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk0MDQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5NDEyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM5NDE3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NDIwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTQyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTQyMjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzOTQyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTQzMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk0MzI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzk0Mzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5NDQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NDQ1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTQ0NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTQ0OTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzOTQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTQ1Njs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzOTQ2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTQ2MjsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzk0ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk0ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzk0ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk0OTE7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM5NTA1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NTA4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTM5NTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NTExOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzOTUzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTUzMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzOTUzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTUzNTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzOTUzOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzOTU0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTU0MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTEzOTU0Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTU0Njs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTEzOTU1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTU1Mzs1OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzk2MTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk2MTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xMzk2MTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk2MTk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xMzk2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk2MjY7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM5NjQ2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NjQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTM5NjQ5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NjUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTY1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTY1NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk2NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk2NTk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5NjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NjY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTY3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTY3MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk2Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk2ODA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5Njg1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5Njg4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTY4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTY5MDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzOTY5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTY5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk2OTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk3MDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5NzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NzAyOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTM5NzEwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTcxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTcxOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk3MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk3MjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5NzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NzI4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTczMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTczMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk3MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk3Mzc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5NzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NzQ0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTc0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTc0Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk3NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk3NTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5NzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NzU2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTc1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTc1OTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5NzY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5NzcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTc3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTc3NDsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xMzk3ODU7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTc5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTc5ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzOTgwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTgwNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk4MDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk4MTA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzk4MTQ7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTgzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTgzNjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzOTgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTgzODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk4NDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5ODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5ODQ1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTg1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTg1NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk4NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk4NTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5ODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5ODYzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTg3MTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzOTg3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTg3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk4ODA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk4ODQ7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzk4ODg7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTkxNjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTEzOTkxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTkxODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk5MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk5MjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5OTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5OTI1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTkzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTkzMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk5MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk5Mzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5OTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5OTQxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTk0ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk5NTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5OTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5OTYxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTk2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTk2NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xMzk5NzM7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xMzk5Nzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xMzk5ODE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTM5OTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5OTgzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTM5OTg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTM5OTkxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTEzOTk5MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTEzOTk5NTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MDAwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDAwMjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDAwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDAwOTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAwMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAwMjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAwMjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAwMzI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMDQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMDQ5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQwMDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMDU2OzMzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDA4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDA5MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAxMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAxMDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAxMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAxMDQ7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMTE3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMTE5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMTIwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMTI0OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQwMTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMTMxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQwMTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMTM1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDE0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDE0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDE0NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDE1MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MDE1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDE1NDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDE1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDE2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDE2Mjs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MDE2NzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAxNzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAxODI7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAxODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAxODg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAxOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAxOTE7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMjExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMjEzOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDIzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDIzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDIzMzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAyNDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAyNTA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDAyNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAyNTM7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMjY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMjY5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMjczOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMjc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMjc5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMjgyOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDI5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDMwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MDMwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDMwMjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAzMTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAzMTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAzMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAzMjA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDAzMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAzMjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAzMjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAzMzA7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAzMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAzMzY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDAzMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAzMzk7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMzU3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMzYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMzYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMzY0OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQwMzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMzcxOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMzc3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMzc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQwMzgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwMzg0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDM4NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDM5MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDAzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDAzOTI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwMzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNDAwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDQwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDQwNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA0MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA0MDk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNDE4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDQyMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA0Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA0MzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNDMzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDQ0MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA0NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA0NDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNDQ3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDQ1MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDQ1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA0NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA0NTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNDYxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDQ2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDQ2Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA0NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA0NzM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNDgzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDQ4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDQ4ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA0OTI7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDUwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDUwNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA1MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA1MTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNTE0OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQwNTE3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNTIwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDUyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDUyNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA1MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA1MjY7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNDA1MzM7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDU0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDU0NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA1NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA1NTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNTU0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDU1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDU1ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA1NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA1NjQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNTc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDU3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA1ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA1ODE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNTg2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNTkwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDU5MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDU5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA1OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA1OTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNjAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNjAxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDYwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDYwNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA2MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA2MTA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNjIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDYyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDYyMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA2Mjc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNjM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNjM5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDY0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDY0MTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE0MDY0ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA2NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA2NTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNjU4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDY2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDY2MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA2NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA2NjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNjcwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDY3Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA2ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA2ODE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNjg2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDY5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDY5NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA2OTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA3MDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNzAzOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTQwNzExOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDcxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDcxNjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA3MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA3MjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNzI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNzMwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDczNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDczNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA3Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA3NDA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNzQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDc1MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA3NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA3NTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNzU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDc2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDc2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA3NjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA3Njc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNzY4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNzcwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDc3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDc4MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA3ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA3OTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwNzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwNzk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDc5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDc5OTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwODEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwODExOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDgxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDgxNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA4MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA4MjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwODI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwODI2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDgzMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDgzNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA4MzY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA4Mzg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwODQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwODQ0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDg0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDg0NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA4NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA4NDk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwODU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwODU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDg1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDg2MDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwODcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwODcxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDg3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDg4MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA4ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA4ODM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwODg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwODg3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDg5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDg5MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA4OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA4OTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwODk5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwOTAzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDkwNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDkwNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA5MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA5MTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwOTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwOTE5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDkyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDkyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA5MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA5MzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwOTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwOTMzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDkzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDkzNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA5NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA5NDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwOTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwOTQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDk1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDk1MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDA5NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDA5NTY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQwOTYzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQwOTY3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MDk2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MDk2OTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNDA5ODA7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTAwNTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0MTAwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTAxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDEwMTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDEwMTc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDEwMjE7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTA0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTA0NDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0MTA0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTA0NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDEwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDEwNDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMDUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMDUzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTA2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTA2MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDEwNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDEwNjk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMDc3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMDgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTA4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTA4NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDEwODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDEwODg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMDkyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTEwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTEwMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDExMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDExMDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMTA4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTExMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTExNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDExMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDExMTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMTIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTEyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTEyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDExMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDExMzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMTMzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTE0Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDExNDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDExNTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMTUzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMTU2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTE2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTE2MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDExNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDExNjc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMTcyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTE3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTE3OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDExODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDExODI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMTg3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDExOTc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDEyMDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDEyMDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQxMjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMjA3OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQxMjEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMjE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MTIxNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTIxOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MTIyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTIyMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTIyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTIyNjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDEyNDI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDEyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDEyNDY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxMjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMjU4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxMjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMjY1OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxMjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMjcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxMjcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMjc1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQxMjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMjc4OzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTMwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTMxMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTMxMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTMxNTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MTMyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTMyMjszNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDEzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDEzNTc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxMzY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMzcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxMzczOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxMzc2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTM5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTM5Mjs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTM5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTM5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTQwMDszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE0MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE0MzE7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxNDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNDQzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxNDQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNDUyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQxNDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNDU2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTQ2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTQ2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTQ2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTQ2OTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE0ODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE0ODY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDE0ODk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE0OTI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE1MDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE1MDQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDE1MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE1MDc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE1MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE1MTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE1MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE1MTc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDE1MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE1MjI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE1MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE1MjU7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxNTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNTQwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxNTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNTQzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQxNTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNTQ4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxNTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNTUxOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTU3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTU3MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTU3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTU3NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTU3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTU4MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTU4NDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTU5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTU5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTU5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTU5NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MTU5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTU5OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MTYwMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTYwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTYwNTszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTYwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTYwOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE2MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE2MjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE2MjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE2Mjg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDE2MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE2MzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE2MzQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE2Mzg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDE2NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE2NDI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxNjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNjU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxNjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNjU3OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTY3OTs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTY4NzszNTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTQxNzIyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNzI0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQxNzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxNzI3OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTc0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTc0NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTc0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTc0OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTc1MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTc1Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTc1ODszODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE3OTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4MDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE4MDE7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4MDc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDE4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4MTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE4MTI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDE4MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4MTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4MTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE4MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4MjA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE4MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4MjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE4MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE4MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4Mjc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxODQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxODQxOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxODQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxODQ3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxODUyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQxODU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxODU1OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTg3NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTg3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTg3NzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE4OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE4OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4OTY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE4OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE4OTk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE5MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE5MDI7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxOTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxOTIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQxOTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQxOTIyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTkzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTkzNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MTkzNTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MTk0MTszODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE5Nzk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE5ODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE5ODU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE5OTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDE5OTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDE5OTY7NTQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE0MjA1MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjA1MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MjA1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjA1NTsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIwODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIwODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIwODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIwODY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIwODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIwODk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIwOTI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyMTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMTA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyMTA1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMTEwOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyMTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMTE5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyMTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMTIxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQyMTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMTI1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQyMTI4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjE0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjE0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjE0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjE0NDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjE0Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjE1MjszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIxODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIxODU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIxODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIxODg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIxOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIxOTg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIyMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIyMDE7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyMjE1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMjIwOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjI0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjI0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjI0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjI0NTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIyNTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIyNjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIyNjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIyNjU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDIyNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIyNzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIyNzE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIyNzY7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIyODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIyODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDIyODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIyODc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyMzAyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMzA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyMzA3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMzEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyMzExOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMzE0OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQyMzIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMzIxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyMzMwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMzMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyMzMzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMzM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MjMzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjM0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDIzNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIzNDM7NTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNDIzNDg7MTY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MjM2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjM2NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDIzNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIzNjk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQyMzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyMzc4OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDIzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDIzODk7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MjQwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjQwNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDI0MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI0MTA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQyNDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNDE3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MjQyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjQyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDI0MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI0MjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQyNDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNDI5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0MjQzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjQ0MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDI0NDI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI0NDQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDI0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI0NDg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI0NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI0NTE7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNDg3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNDkzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQyNDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNDk3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjUwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjUwOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjUxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjUxMzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI1Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI1Mjk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI1MzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI1Mzg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNTQ5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNTUyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNTU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNTYxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQyNTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNTY1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjU3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjU3Njs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjU4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjU4MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MjU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjU4NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI1OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI1OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI1OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI2MDA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNjE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNjE3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQyNjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNjIwOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjYzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjYzNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjYzNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjY0MTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MjY0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjY0ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MjY1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjY1MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MjY1NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjY1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjY1ODszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjY2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjY2MjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI2NzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI2Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI2Nzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI2ODE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI2ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI2ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI2ODk7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNzI3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNzMzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNzM2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQyNzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNzM5OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNzQ2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNzQ5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQyNzUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNzU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNzU2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNzYwOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNzY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyNzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyNzY5OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mjc4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mjc4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mjc4NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mjc4OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0Mjc5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mjc5MjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI4MDc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI4MTA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI4MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI4MTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI4MTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI4MTg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDI4MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI4MjU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDI4Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI4Mjk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDI4MzI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI4MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI4MzU7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI4Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI4Mzk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyODUxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyODU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyODU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyODU4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQyODYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyODYyOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyODY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyODY3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyODcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyODczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyODc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyODc1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyODc3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyODgwOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQyODg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyODg2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyODg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyODg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyODkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyODkxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjkwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjkwNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MjkwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MjkwODsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI5MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI5MjQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI5MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI5Mjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI5Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI5Mjk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDI5MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDI5MzI7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyOTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyOTQ5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQyOTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQyOTUyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mjk2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mjk2NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mjk2NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mjk2OTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mjk3MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mjk3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mjk3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mjk4MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0Mjk4MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mjk4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mjk4Njs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mjk5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mjk5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mjk5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mjk5NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0Mjk5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzAwMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MzAwMzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwMTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwMjE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwMjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwMjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwMjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwMzA7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwMzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwMzY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDMwMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwNDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwNDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDMwNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwNDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwNDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwNDk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwNTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwNTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMwNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMwNTY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzMDcxOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzMDc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMDc3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzMDgxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzA5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzA5Mjs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzA5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzA5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzA5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzEwMDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMxMTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMxMTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDMxMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMxMTg7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzMTMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzMTM1OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzE1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzE1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzE1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzE1ODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMxNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMxNzA7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMxNzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMxNzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDMxODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMxODE7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzMTk0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzMTk2OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzIxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzIxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzIxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzIxOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMyMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMyMzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMyMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMyMzQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzMjQ2OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzI2Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzI2NjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMyNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMyNzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMyODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMyODE7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMyODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMyOTA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMzA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzMzA1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzMxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzMxNzs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzMyMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzMyNTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MzMyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzMyODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzMzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzMzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzMzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzMzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzMzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzMzNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzMzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzMzODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzM0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzM0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzM0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzM0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzM0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzM0ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzM1MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzM1NTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMzNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMzNzI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDMzNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDMzNzU7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzMzkyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzMzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzMzk1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzQwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzQxMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzQxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzQxMzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM0MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM0MzE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM0MzM7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM0Mzk7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzNDUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzNDUzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzNDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzNDU2OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzQ3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzQ3MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzQ3NjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM0ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM0ODk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM0OTI7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzNTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzNTExOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzNTEzOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzNTE5OzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzU0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzU0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzU1MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzU1NTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM1NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM1NzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM1NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM1NzQ7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzNjAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzNjAxOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzYxNzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzYyMjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM2Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM2Mzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM2NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM2NDE7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzNjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzNjY4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzY4Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzY4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzY4ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MzY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzY5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzY5NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzY5OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0MzcwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzcwMjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM3MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM3MTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM3MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM3MjA7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzNzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzNzM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzNzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzNzM2OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzNzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzNzQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzNzQxOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzNzQ3OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mzc2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mzc2MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mzc2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mzc2NDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM3Nzk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM3ODU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM3OTM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM3OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM3OTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM4MDQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzODE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzODE5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzODIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzODIxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzgzNDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzgzOTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mzg0Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mzg1MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mzg1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mzg1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Mzg1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Mzg1OTs2MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTQzOTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzOTIwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQzOTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzOTIzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzkzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzkzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0MzkzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0MzkzNzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM5NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM5NTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM5NTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM5NjA7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM5Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM5Njg7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM5NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM5NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDM5Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDM5Nzg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQzOTg5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQzOTkzOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ0MDAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MDA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ0MDA1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MDEwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ0MDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MDEzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ0MDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MDIwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ0MDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MDIzOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NDAzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDAzOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NDA0MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDA0NDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NDA1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDA1MTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NDA1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDA2MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NDA2MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDA2NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NDA2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDA3MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NDA3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDA3Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NDA3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDA4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NDA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDA4MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NDA4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDA4NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NDA4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDA5MDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NDA5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDEwMTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDQxMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQxMTg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDQxMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQxMjg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDQxMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQxMzE7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDQxMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQxMzk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDQxNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQxNDI7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDQxNDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQxNTI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDQxNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQxNTk7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDQxNjY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQxNjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDQxNjk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQxNzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MTc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MTc3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDE3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDE3OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQxODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQxODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MTkxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDE5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDE5Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQyMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQyMDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MjA2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDIwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDIxMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQyMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQyMTY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MjIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MjI2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDIyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDIyODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQyMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQyMzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MjQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDI0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDI0NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQyNDY7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDI2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDI2NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQyNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQyNjg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MjczOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDI3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDI3NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQyNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQyODA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MjgzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDI4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDI4NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQyOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQyOTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0Mjk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDI5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDI5ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQzMDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQzMDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MzA2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDMwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDMxMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQzMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQzMTQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MzIxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MzI1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDMyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDMyNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQzMzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MzM4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDM0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDM0MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQzNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQzNDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MzUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDM1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDM1MzsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0MzcxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDM3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDM3NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQzNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQzODA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0MzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0Mzg0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDM4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDM5MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQzOTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQzOTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0Mzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0Mzk5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDQwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDQwODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ0MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ0MTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NDIyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDQyOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDQzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ0MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ0MzQ7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDQ0Mzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ0NDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NDQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NDQ0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDQ0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDQ0Njs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE0NDQ1Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ0NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ0NjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NDYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NDY0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDQ3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDQ3MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ0NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ0NzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NDgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDQ4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDQ4NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ0OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ0OTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NDk1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NDk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDUwMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDUwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ1MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ1MDQ7NDI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDU0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDU0NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ1NDk7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNDQ1NTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NTU5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ1Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ1NzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NTc1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDU4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDU4MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ1ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ1ODQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NTkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDU5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDU5NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ2MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ2MDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NjA1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDYwODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NjE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NjIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDYyMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDYyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ2Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ2Mjg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NjM0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDYzNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ2NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ2NDE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NjQ3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDY1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDY1NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ2NjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NjYzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDY2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDY2NTsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NjgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDY4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDY4Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ2OTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0Njk1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0Njk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDcwMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDcwMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ3MDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NzA4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDcwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDcxMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ3MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ3MTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NzE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NzE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDcyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDcyMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ3MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ3Mjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NzMxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDczNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDczNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ3NDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0NzQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0NzUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDc1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDc1MzsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNDQ3NjQ7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDc3Nzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NDc4MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDc4NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ3ODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ3ODk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDQ3OTM7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDgxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDgxNTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NDgxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDgxNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ4MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ4MjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0ODIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0ODI0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDgzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDgzMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ4MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ4Mzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0ODQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0ODQyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDg1MDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NDg1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDg1ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ4NTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ4NjM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDQ4Njc7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDg5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDg5NTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NDg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDg5NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ4OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ5MDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0OTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0OTA0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDkxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDkxMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ5MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ5MTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0OTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0OTIwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDkyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDkyNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ5MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ5MzI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0OTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0OTQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDk0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDk0NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDQ5NTI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDQ5NTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDQ5NjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ0OTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0OTYyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ0OTY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ0OTcwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NDk3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NDk3MjsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNDQ5ODM7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTAwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTAwODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NTAxMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTAxNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDUwMTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUwMTk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDUwMjM7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTA0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTA0Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDUwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUwNTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1MDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1MDU1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTA2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTA2MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDUwNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUwNjU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1MDcyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ1MDc3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1MDgwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTA4Mjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NTA4NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTA5MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDUwOTI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUwOTQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDUxMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUxMDE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ1MTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1MTEyOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTEzNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NTEzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTEzODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTE0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTE0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTE0NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTE1MDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDUxNjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUxNjc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDUxNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUxNzA7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDUxNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUxNzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDUxNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUxODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDUxODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUxODI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDUxODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUxODU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDUxOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUxOTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDUxOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUxOTU7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ1MjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1MjExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ1MjEyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1MjE2OzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTI1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTI1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTI1ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTI2MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NTI2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTI2NjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDUyODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUyODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDUyODQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUyODg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDUyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUyOTU7NDg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ1MzQzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1MzQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ1MzQ3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1MzUxOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ1MzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1MzU4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ1MzYyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ1MzYzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1MzY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ1MzY2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1MzY4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTM3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTM3NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDUzNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUzNzY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1MzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1Mzg0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTM4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTM4ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDUzOTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDUzOTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1Mzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NDAwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTQwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTQwODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU0MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU0MTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NDE3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTQyMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU0MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU0MjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NDI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NDI4OzE3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU0NDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NDUwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTQ1NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU0NTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU0NjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NDY1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTQ3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTQ3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU0NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU0NzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NDc5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTQ4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTQ4NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU0ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU0ODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NDkxOzE3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU1MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU1MDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NTEzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTUxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTUxODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU1MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU1MjI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NTI4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTUzMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTUzNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU1MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU1Mzc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NTQ2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTU1NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU1NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU1NjA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NTY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NTcwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTU3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTU3MjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NTU3NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTU3ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU1Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU1ODI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NTg0Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTQ1NTkyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTU5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTU5Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU2MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU2MDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NjA2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTYwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTYwOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU2MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU2MTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NjIxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTYyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTYyNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU2MjY7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTY0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTY0NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU2NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU2NDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NjUzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTY1Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTY2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU2NjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU2NjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NjY3OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE0NTY3ODsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NjkxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ1Njk1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1Njk4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTY5OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTcwMzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NTcwNzsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NzI5OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ1NzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NzMxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTczMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTczNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU3Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU3Mzg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NzQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTc1MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU3NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU3NTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1NzY0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ1NzY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1NzcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTc3Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTc3Nzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NTc4MTsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1ODA5OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ1ODEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1ODExOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTgxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTgxNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU4MTg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1ODI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1ODI1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTgyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTgzMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU4MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU4MzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1ODQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1ODQxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTg0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTg0Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU4NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU4NTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1ODU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1ODU4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NTg2Njs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NTg3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTg3NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDU4NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU4NzY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDU4ODE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU4ODQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ1ODg2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1ODg4OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ1ODk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1ODk1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTkwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTkwNjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTkwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTkwOTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDU5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU5MjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDU5Mjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU5MzA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ1OTQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ1OTQ3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTk1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTk1ODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NTk2Nzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTk3MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NTk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NTk3NjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDU5OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU5OTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDU5OTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDU5OTg7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDYwMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYwMDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDYwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYwMDc7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ2MDQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MDQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ2MDQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MDQ5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ2MDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MDU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ2MDU1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MDU5OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ2MDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MDY2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ2MDY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MDY4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ2MDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MDcyOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NjA4NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjA4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NjA5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjA5Mzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NjA5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjEwMDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NjEwNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjEwOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NjExMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjExMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYxMTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYxMTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MTIwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjEyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjEyODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYxMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYxMzI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MTM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjE0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYxNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYxNDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MTUzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjE1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjE1ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYxNjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYxNjc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MTY5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjE3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjE3NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYxNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYxODA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MTg2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjE5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjE5MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYxOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYxOTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MTk3OzE3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYyMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYyMTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MjE5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjIyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjIyNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYyMjg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYyMzI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MjM0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjI0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjI0MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYyNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYyNDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MjQ4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjI1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjI1NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYyNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYyNTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MjYwOzE3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYyNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYyNzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MjgyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjI4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjI4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYyOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYyOTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2Mjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2Mjk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjMwMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjMwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYzMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYzMDY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MzE1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjMyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjMyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYzMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYzMjk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MzM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MzM5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjM0MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjM0NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYzNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYzNDY7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNDYzNTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2MzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2MzU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjM2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjM2Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYzNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYzNjk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2Mzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2Mzc2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjM3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjM3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYzODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYzODM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2Mzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2Mzg5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjM5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjM5NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDYzOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDYzOTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NDA1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NDA4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjQwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjQxMDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE0NjQxNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY0MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY0MjQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NDI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NDI4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjQzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjQzNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY0Mzg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NDQ0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjQ1MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY0NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY0NTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NDYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NDYzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjQ2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjQ2NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY0Njk7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNDY0Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NDgxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjQ4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjQ4ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY0OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY0OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NDk0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjQ5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjUwMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY1MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY1MDY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NTA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjUxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjUxMTsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NTI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjUzMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjUzNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY1Mzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY1Mzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NTQ0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjU0ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjU1MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY1NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY1NTQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NTYzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjU2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjU3MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY1NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY1NzU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NTgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjU4Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY1OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY1OTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NTk5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NjAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjYwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjYwNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY2MTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY2MTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NjE1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NjE3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjYyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjYyNjs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NjYzMjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NjQyOzc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ2NjQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NjUwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjY1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjY1NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY2NjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NjYyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjY3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjY3MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY2Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY2Nzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NjgxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjY4Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjY5MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY2OTE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY2OTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2Njk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2Njk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjcwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjcwMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY3MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY3MDY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NzE1OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ2NzIxOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY3MzE7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDY3Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY3Mzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NzQ0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0Njc0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Njc0OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY3NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY3NTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2NzU4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2NzYyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0Njc2MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Njc2NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY3NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY3NzI7MjM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0Njc5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Njc5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY3OTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY4MDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2ODAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2ODAyOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE0NjgxMzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2ODI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2ODI2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ2ODMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2ODMzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjgzNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjgzODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0Njg0MjsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2ODYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2ODY0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ2ODY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2ODY2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0Njg2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Njg2OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY4NzM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2ODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2ODgyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0Njg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Njg4Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY4OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY4OTE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2ODk5OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ2OTA0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2OTA3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NjkwODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NjkxMjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NjkxNjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2OTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2OTQ0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ2OTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2OTQ2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0Njk0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Njk0OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY5NTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2OTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2OTYwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0Njk2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Njk2NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY5Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY5Njk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2OTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2OTc2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0Njk4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Njk4MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDY5ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDY5ODk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ2OTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ2OTkzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NzAwMTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NzAwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzAwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDcwMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcwMTE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDcwMTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcwMTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ3MDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MDIxOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE0NzAzMjsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ3MDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MDU3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ3MDYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MDY0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NzA2NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzA2ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NzA3MjsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ3MDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MDkyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NzA5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzA5Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDcxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcxMDM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ3MTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MTEwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NzExMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzExNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDcxMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcxMTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ3MTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MTI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NzEyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzEzMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDcxMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcxMzc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ3MTQ0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ3MTQ5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MTUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NzE1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzE1NTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0NzE2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzE2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDcxNjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcxNjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ3MTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MTcwOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTQ3MTc3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0NzE4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzE4MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDcxODU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcxODc7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDcxOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcxOTQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3MjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MjA1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3MjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3MjA4OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzIyMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NzIyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzIyNzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzIzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzIzNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NzIzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzIzODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzI0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzI0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzI0NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzI1MDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDcyNjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcyNjc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDcyNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDcyNzE7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3Mjg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3Mjg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3Mjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3Mjg3OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzMwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzMwNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NzMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzMwOTszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzMxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzMxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzMxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzMxNTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzMyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzMyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzMyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzMyMzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzMzMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzMzMzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NzMzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzMzNjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzM0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzM0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzM0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzM0NTszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzM0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzM0OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzM1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzM1Mjs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzM1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzM1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzM1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzM2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzM2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzM2MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzM2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzM2NTszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzM2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzM2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzM3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzM3MTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDczODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDczODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDczODc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDczOTE7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3NDI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NDI5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3NDMwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NDM0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzQ0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzQ0NTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzQ1NDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzQ2MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NzQ2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzQ2MzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc0ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc0ODE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc0ODU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc0OTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc0OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc0OTQ7NDI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3NTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NTM3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3NTQ1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NTQ5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ3NTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NTUyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3NTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NTYwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3NTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NTYzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ3NTY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3NTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NTY5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ3NTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NTc2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ3NTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NTgwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzU5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzU5ODs2MjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTQ3NjYwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3NjYyOzY0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNDc3MjY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc3Mjg7MzI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE0Nzc2MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Nzc2MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0Nzc2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Nzc2NTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc3ODA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc3ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc3ODM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc3ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc3ODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc3ODc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc3OTI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3ODAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3ODAzOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3ODA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3ODEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3ODExOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzgyMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzgyNjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0NzgyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzgyOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc4NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc4NDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc4NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc4NDQ7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc4NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc4NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc4NTI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc4NTg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3ODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3ODY5Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3ODc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3ODc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3ODc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3ODgwOzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0NzkxMDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0NzkxNjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc5MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc5MzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc5MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc5MzQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3OTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3OTUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3OTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3OTUyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3OTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3OTU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ3OTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ3OTYxOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0Nzk3Nzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0Nzk4MzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc5OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDc5OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDc5OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgwMDA7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgwMDY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgwMTI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgwMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgwMjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgwMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgwMjQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgwMzM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgwMzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgwMzk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgwNDQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDgwNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgwNDc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4MDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4MDYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4MDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4MDYyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODA3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODA3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODA3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODA3Nzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODA4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODA4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODA4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODA4Njs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODA5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODA5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODA5Njs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODEwMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgxMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgxMTM7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgxMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgxMjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgxMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgxMjQ7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4MTU0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4MTYwOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODE3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODE3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODE3ODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODE4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODE4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODE4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODE4Njs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODE5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODE5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODE5NTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgyMTA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgyMTY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgyMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgyMjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgyMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgyMjg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgyMzc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgyNDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgyNDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgyNDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgyNDk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDgyNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgyNTQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDgyNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgyNTc7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4MjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4MjcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4MjczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4Mjc0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4Mjc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4Mjc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4Mjc4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4MjgzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODI5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODI5NDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODI5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODMwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODMwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODMwMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDgzMTI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgzMTc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDgzMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDgzMjA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4MzMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4MzMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4MzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4MzM1OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4MzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4MzQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4MzQzOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4MzQ5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODM1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODM2MDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODM2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODM2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODM3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODM3MTszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDg0MDE7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg0MDc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NDIzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NDI1OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODQ0MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODQ0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODQ0Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODQ1MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODQ1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODQ1MjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDg0Njg7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg0NzQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NDg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NDkxOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NDk3OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NTAzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NTEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NTE1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NTI0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NTI5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NTMwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NTM1OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NTQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NTQzOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODU2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODU2NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODU2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODU2NjszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODU2OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODU3NDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0ODU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODU3NzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDg1ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg1OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDg1OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg1OTI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NjA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NjA3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NjE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NjE2Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NjI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NjI2OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NjMyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODY0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODY0Mzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODY1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODY1MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODY1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODY1NDszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDg2ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg2ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDg2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg2ODk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NzAwOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NzA2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODcyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODcyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODcyNDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODczMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODczMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODczMjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODczODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODczOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODc0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODc0MTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDg3NTY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg3NjI7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4NzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NzgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4Nzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4Nzg1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4Nzg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4Nzg4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4Nzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4NzkwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4Nzk5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4ODA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4ODA1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4ODA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4ODEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4ODEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4ODE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4ODE3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ4ODIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4ODIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4ODIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4ODI3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4ODMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4ODM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ4ODM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4ODM2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ4ODM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4ODQwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODg1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODg1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODg1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODg2MTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0ODg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODg2ODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODg3NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODg3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0ODg3ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODg4MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDg4ODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg4ODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ4ODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4ODg4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0ODg5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODg5NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDg4OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg5MDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ4OTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4OTA0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0ODkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODkxMDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDg5MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg5MTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ4OTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4OTIyOzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDg5MzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg5MzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ4OTM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4OTQwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0ODk0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODk0Mjs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE0ODk1MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDg5NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg5NTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ4OTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ4OTYwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0ODk2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODk2OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDg5NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg5NzI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0ODk4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0ODk4NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDg5ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDg5ODc7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTQ4OTk4OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkwMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkwMTE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDkwMTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkwMTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MDE5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MDIzOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ5MDI3OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkwNDk7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDkwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkwNTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MDU0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTA1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTA1ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkwNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkwNjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MDcxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTA3Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkwODQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDkwODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkwOTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MDkzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MDk3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ5MTAxOzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkxMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkxMjk7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDkxMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkxMzE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MTM0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTEzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTEzODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkxNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkxNDU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MTUwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTE1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTE1NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkxNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkxNjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MTY2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTE3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTE3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkxNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkxNzg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MTg2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ5MTkxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MTk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTE5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTE5Njs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0OTIwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTIwNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkyMDY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkyMDg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDkyMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkyMTU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDkyMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkyMTk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDkyMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkyMjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDkyMzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkyMzM7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ5MjQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MjUwOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTQ5MjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MjU3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0OTI2NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTI2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0OTI3MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTI3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkyNzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkyNzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5Mjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MjgwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTI4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTI4ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkyODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkyOTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5Mjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5Mjk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTI5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTI5ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkzMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkzMDI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MzA5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTMxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTMyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkzMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkzMjI7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDkzMjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkzMjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MzI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MzMyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTMzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTMzNDs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE0OTM0Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkzNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkzNDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MzUwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTM1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTM1NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDkzNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDkzNjE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5MzY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5MzcxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTM3MzsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNDkzODQ7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTM5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTM5Nzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0OTQwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTQwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk0MDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk0MDk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDk0MTM7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTQzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTQzNTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0OTQzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTQzNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk0Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk0NDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5NDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NDQ0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTQ1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTQ1MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk0NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk0NTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5NDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NDYyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTQ3MDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0OTQ3NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTQ3ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk0Nzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk0ODM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDk0ODc7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTUxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTUxNTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE0OTUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTUxNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk1MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk1MjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5NTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NTI0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTUzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTUzMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk1MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk1MzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5NTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NTQwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTU0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTU0Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk1NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk1NTI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5NTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NTYwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTU2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTU2NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk1NzI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNDk1Nzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk1ODA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5NTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NTgyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ5NTg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NTkwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTU5MjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTU5NDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE0OTYwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTYwMTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0OTYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTYwODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0OTYxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTYxODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0OTYxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTYyMjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNDk2MzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk2Mzk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNDk2NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk2NDY7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTQ5NjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NjcwOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0OTY4NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTY4ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE0OTY4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTY5MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk2OTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk2OTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5Njk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NzAwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTcwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTcwODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk3MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk3MTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5NzE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NzE5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTcyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTcyNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk3MzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5NzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NzM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTc0Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk3NTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk3NTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5NzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NzU2OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTQ5NzU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NzYyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTc2MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTc2NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk3Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk3Njg7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNDk3NzU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5NzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5NzgxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTc4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTc4ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk3OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk3OTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5Nzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5Nzk1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTgwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTgwMTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk4MTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5ODEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5ODE0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTgxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTgxODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk4MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk4Mjc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5ODMzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5ODM2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTgzODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE0OTg0NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk4NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk4NDk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5ODU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5ODU2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTg1OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk4NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk4NjM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5ODY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5ODY4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTg3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTg3ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk4ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk4ODE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5ODg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5ODg1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTg5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTg5NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk5MDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk5MDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5OTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5OTA2Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTQ5OTE0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTkyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTkyMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk5Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk5Mjk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5OTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5OTM4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTk0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTk0MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk5NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk5NDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5OTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5OTUxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTk1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTk1ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNDk5NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNDk5NjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5OTY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5OTY3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE0OTk2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE0OTk2OTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE0OTk3NDsyMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTQ5OTk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTQ5OTk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDAwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDAwMTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNTAwMTI7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDAyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDAyNTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1MDAyOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDAzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAwMzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAwMzc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTAwNDE7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDA2MzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1MDA2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDA2NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAwNjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwMDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMDcyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDA4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDA4MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAwODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAwODU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwMDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMDkwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDA5ODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1MDEwMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDEwNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAxMDc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAxMTE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTAxMTU7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDE0MzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1MDE0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDE0NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAxNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAxNDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwMTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMTUyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDE1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDE1OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAxNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAxNjQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwMTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMTY4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDE3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDE3NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAxNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAxODA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwMTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMTg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDE5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDE5Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAyMDA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTAyMDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAyMDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwMjA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMjEwOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUwMjE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMjE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDIxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDIyMDsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNTAyMzE7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDI1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDI1Njs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1MDI2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDI2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAyNjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAyNjc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTAyNzE7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDI5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDI5MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAyOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAyOTY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwMzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMzAyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDMwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAzMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAzMTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwMzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMzE3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDMyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDMyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAzMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAzMjk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwMzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMzM2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDM0Mzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1MDM0ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDM1MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTAzNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAzNTQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTAzNTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTAzNjI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwMzY0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMzY2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUwMzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMzczOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwMzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMzgwOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwMzg4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUwMzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMzkyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwMzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwMzk5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUwNDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDAzOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDA4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNDA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDEyOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDQyNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDQyOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MDQzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDQzMzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTA0NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA0NDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTA0NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA0NDk7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNDY0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDcwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUwNDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDczOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDgyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDg0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDg3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDkzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNDk2OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDUwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDUxMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDUxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDUxMzszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDUxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDUxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDUxOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDUyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDUyMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDUyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDUyNDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDUyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDUyODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDUzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDUzMTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTA1NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA1NDU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTA1NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA1NDg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTA1NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA1NTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTA1NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA1NTY7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTA1NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA1NjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTA1NjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA1NjY7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNjAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNjA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUwNjA1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNjA5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUwNjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNjE2OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDY0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDY0NDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDY0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDY0ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDY0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDY1MDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDY1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDY1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDY1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDY1ODszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDY2MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDY2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MDY2NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDY2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA2Njk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA2NzI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwNjczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNjc0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDY4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDY4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA2ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA2ODY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwNjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNjk1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDcwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDcwNDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA3MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA3MTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwNzE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNzE5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDcyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDcyODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA3MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA3MzI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDc0Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA3NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA3NTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwNzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNzU1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDc2MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDc2NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA3Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA3Njg7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTA3NzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA3NzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwNzc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwNzc4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDc3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDc4MDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE1MDc4Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA3OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA3OTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwNzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwODAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDgwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDgwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA4MDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwODEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwODEzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDgyMzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA4MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA4MzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwODM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwODM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDgzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDgzOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA4NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA4NDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwODUxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwODU0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDg1Njs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE1MDg2MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA4NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA4Njc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwODczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwODc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDg3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDg3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA4ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA4ODE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwODg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwODg2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDg5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDg5Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA5MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA5MDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwOTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwOTA4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDkxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDkxMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA5MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA5MjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwOTI0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwOTI4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDkyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDkzMDs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE1MDkzODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA5NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA5NDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwOTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwOTUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDk1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDk1NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA5NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA5NTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwOTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwOTYzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDk3MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA5NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA5Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUwOTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUwOTgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MDk4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MDk4NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTA5ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTA5ODk7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTUxMDAwOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTEwMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEwMTM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTEwMTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEwMjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMDIxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMDI1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUxMDI5OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTEwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEwNTE7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTEwNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEwNTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMDU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MTA1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTA2MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTEwNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEwNjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMDczOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MTA3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTA3ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTEwODY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTEwOTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEwOTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMDk1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMDk5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUxMTAzOzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTExMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTExMzE7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTExMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTExMzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMTM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MTEzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTE0MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTExNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTExNDc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMTUyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MTE1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTE1Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTExNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTExNjM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMTY4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MTE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTE3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTExNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTExODA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMTg4OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUxMTkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMTk2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MTE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTE5ODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1MTIwMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTIwNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTEyMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEyMDg7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTUxMjE5OzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTEyNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEyNDQ7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTEyNDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEyNTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMjUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMjU1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUxMjU5OzE5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTEyNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEyNzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMjg0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MTI4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTI5MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTEyOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEyOTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMzAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMzAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MTMwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTMwNTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTEzMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEzMTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMzE3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MTMyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTMyNDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTEzMzE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTEzMzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEzNDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMzQyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUxMzQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMzUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MTM1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTM1Mjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE1MTM1OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTEzNjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTEzNjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUxMzY3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMzY5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUxMzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMzc2Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxMzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxMzg2OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTQwMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MTQwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTQwNDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTQxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTQxMTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MTQxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTQxNTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTQxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTQyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTQyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTQyNDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE0Mzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE0NDI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTE0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE0NDY7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNDYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNDYyOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTQ3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTQ4MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MTQ4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTQ4NDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTQ5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTQ5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTQ5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTQ5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTQ5NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTQ5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTQ5ODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTUwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTUwNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTUwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTUwNzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE1MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE1MjE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE1MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE1MjQ7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE1Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE1Mjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE1Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE1MzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE1MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE1MzI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE1MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE1MzU7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE1Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE1Mzk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE1NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE1NDI7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNTU2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNTU5OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNTY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNTY3OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNTcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNTczOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNTc3OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTYxMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTYxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTYxNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTYxOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MTYyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTYyMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTYzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTYzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTYzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTYzNTszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE2NjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE2Njk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTE2NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE2NzM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE2ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE2ODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE2ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE2ODM7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNzEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNzE1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNzI1OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNzMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNzMzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUxNzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNzM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNzM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNzQxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNzUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxNzUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxNzUzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTc2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTc2NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MTc3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTc3MTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTc3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTc3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTc4MDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTc4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTc4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTc5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTc5MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTc5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTc5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTc5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTc5NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE4MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE4MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE4MDk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE4MTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE4MTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTE4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE4MTg7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE4MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE4MjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE4MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE4MjU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxODM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxODM3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxODQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxODQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxODQ1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxODQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxODUwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUxODUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxODU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxODU1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUxODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxODU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxODYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxODYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxODYzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTg3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTg3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTg3NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTg3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTg3OTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTg4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTg4ODs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTg5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTg5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTg5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTg5ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MTkwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTkwMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE5MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE5MTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE5MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE5MTU7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxOTQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxOTQ2OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxOTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxOTUzOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxOTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxOTU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUxOTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUxOTYwOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MTk3OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MTk4MzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTE5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTE5OTQ7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIwMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIwMDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIwMDM7Mjg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyMDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMDMyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjA0NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA0ODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MjA1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA1MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjA1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA1NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjA1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA1Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjA2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA2NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjA2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjA3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA3MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjA3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA3NTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjA4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjA4NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA5MDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjA5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjA5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjA5NzsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIxMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIxMjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIxMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIxMjI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyMTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMTM0OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyMTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMTM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyMTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMTQwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjE1Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjE1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjE1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjE1ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MjE2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjE2MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MjE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjE2NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjE2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjE2OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjE3MjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIxODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIxODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIxODQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIxODk7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIxOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIxOTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIxOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIxOTY7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyMjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMjE5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyMjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMjIxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjIzMzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIyNDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIyNTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIyNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIyNTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTIyNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIyNTk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTIyNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIyNjI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIyNjU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIyNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIyNjg7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIyNzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIyNzg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIyODM7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIyODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIyODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIyODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIyOTA7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyMzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMzEwOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyMzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMzE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyMzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyMzE2OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjMyODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjMzMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjMzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjMzNDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MjMzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjMzOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjM0MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjM0NTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjM0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjM1MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjM1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjM1MjsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIzNzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIzODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIzODE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIzODU7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIzODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIzOTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTIzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTIzOTI7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI0MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI0MDE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI0MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI0MDg7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI0MTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI0MjA7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI0MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI0MjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI0Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI0Mjg7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI0MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI0Mzc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI0NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI0NDU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI0NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI0NTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI0NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI0NTQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyNDY2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNDcwOzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjUwNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjUwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjUwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjUxMjs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjUxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjUxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjUxOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MjUyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjUyMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjUzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjUzMzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjUzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjU0MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjU0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjU0MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI1NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI1NTU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI1NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI1NjY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI1NzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI1NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI1NzY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyNTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNTg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUyNTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNTg5OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjYxMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjYxNTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjYyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjYyMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MjYyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjYyNTsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI2NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI2NDk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTI2NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI2NTY7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI2NjE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI2NjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTI2NjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI2NjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyNjY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNjcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjY3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjY3NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI2ODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyNjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNjg2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjY5Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI3MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI3MDE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyNzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNzEwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjcxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjcxMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI3MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI3MTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyNzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNzIzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjczMDsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyNzQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNzQ0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Mjc0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mjc0NjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1Mjc0OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mjc1MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI3NTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI3NTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyNzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNzU4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTUyNzY1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Mjc3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mjc3MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI3Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI3Nzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyNzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyNzgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Mjc4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mjc4NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI3OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI3OTE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyODAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyODAxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjgwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjgwNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI4MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI4MDg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyODE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyODE3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjgyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjgyNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI4Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI4Mjg7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNTI4MzU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyODQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyODQyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Mjg0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mjg0OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI4NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI4NTI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Mjg2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mjg2MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI4NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI4NjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyODcyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyODc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Mjg3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mjg3ODs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE1Mjg4Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI4OTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyOTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyOTAxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjkxMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI5MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI5MTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyOTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyOTE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MjkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MjkyMzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI5MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI5MzM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyOTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyOTQwOzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTI5NTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTI5NTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyOTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyOTU2OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE1Mjk2NzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUyOTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyOTgwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUyOTg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUyOTg3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Mjk4ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mjk5Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1Mjk5NjsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMDE4OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUzMDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMDIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzAyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzAyMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTMwMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMwMjc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMDM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzAzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzA0MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTMwNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMwNDU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMDUzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUzMDU4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMDYxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzA2Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzA2Njs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1MzA3MDsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMDk4OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUzMDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMTAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzEwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzEwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTMxMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMxMDc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMTE0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzExODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzExOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTMxMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMxMjM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMTMwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzEzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzEzNTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTMxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMxNDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMTQ3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzE1NTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1MzE2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzE2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTMxNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMxNjU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTMxNzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMxNzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMTc1OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE1MzE4NjsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMjExOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUzMjE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMjE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzIxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzIyMjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1MzIyNjsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMjQ2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzI1MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTMyNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMyNTc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMjY0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzI3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzI3MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTMyNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMyNzU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMjgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzI4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzI4Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTMyOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMyOTQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzMzAxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUzMzA2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMzEwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzMxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzMxMjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1MzMxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzMyMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTMzMjI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMzMjQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTMzMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMzMzE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTMzMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTMzMzg7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzMzUxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUzMzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMzU1OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzMzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMzYyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUzMzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMzY2Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzMzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMzc0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzMzc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzMzc4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MzM5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzM5NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1MzM5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzM5OTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTM0MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM0MTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTM0MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM0MTU7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDMzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUzNDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDM3OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDQzOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDUxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDU4OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDY0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTUzNDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDY3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDc0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDc2OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDgwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDgzOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDkzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNDk2OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNTAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNTAyOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MzUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzUxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1MzUxODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzUyMjszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTM1NTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM1NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTM1NjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM1NjU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTM1NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM1NzI7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNjAwOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNjA4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNjEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzNjExOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNjEzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzYxNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzYxOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM2MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM2MjE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzNjI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNjI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzYzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzYzMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM2NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM2NDE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzNjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNjQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzY1MTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzNjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNjYyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzY2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzY2NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM2NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM2NzE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzNjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNjgwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzY4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzY4Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM2OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM2OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzNjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNjk0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzcwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzcwNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM3MDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM3MTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzNzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNzEyOzg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTUzNzIwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzcyNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM3Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM3Mjk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzNzM0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNzM3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzczODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mzc0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM3NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM3NDM7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTUzNzU0OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM3NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM3Njc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTM3NzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM3NzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzNzc1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzNzc5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUzNzgzOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM4MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM4MDU7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTM4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM4MDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzODA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzODEwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzgxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzgxNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM4MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM4MjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzODI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzODI3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzgzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzgzMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM4NDA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTM4NDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM4NDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzODQ5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzODUzOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUzODU3OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM4ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM4ODU7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTM4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM4ODc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzODg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzODkwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Mzg5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mzg5NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM5MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM5MDE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzOTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzOTA2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzkxMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM5MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM5MTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzOTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzOTIyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1MzkyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1MzkzMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM5MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM5MzQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTUzOTQyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTUzOTQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzOTUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Mzk1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mzk1Mjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1Mzk1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Mzk2MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTM5NjI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM5NjQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTM5NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM5NzE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTM5NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTM5NzU7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzOTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzOTkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTUzOTkxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTUzOTk0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NDAwODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDAxNDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NDAyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDAyMTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTQwMzE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQwMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTQwMzQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQwMzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MDM5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MDQyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDA0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDA0NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQwNDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MDUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MDUzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDA1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDA1Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQwNjM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQwNjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MDY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDA3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDA3Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQwNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQwNzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MDgyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDA4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDA4Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQwOTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MDk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDA5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDA5OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQxMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQxMDU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MTEzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDExNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDExODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQxMjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQxMjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MTI3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDEyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDEzMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQxNDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MTQzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDE0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDE0NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQxNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQxNTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MTU0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDE1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDE1ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQxNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQxNjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MTY4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDE3Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQxNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQxODA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MTkwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDE5ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQyMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQyMDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MjA1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MjA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDIxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDIxMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQyMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQyMTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MjE5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDIyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDIyMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQyMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQyMjg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MjM2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MjQwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDI0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDI0MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQyNDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MjQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MjUwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDI1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDI1Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQyNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQyNjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MjY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDI3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDI3Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQyNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQyODA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MjgzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDI5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDI5Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQzMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQzMDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MzA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MzA1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDMwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDMxMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQzMTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQzMTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MzIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MzIxOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU0MzI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MzI3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDMyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDMzMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQzMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQzMzM7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNTQzNDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MzQ1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDM1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDM1MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQzNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQzNTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MzU4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDM2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDM2Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQzNjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQzNjk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0MzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0MzcxOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE1NDM4MjsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0Mzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0Mzk1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU0Mzk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NDAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDQwMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDQwNzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1NDQxMTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0NDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NDMzOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU0NDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NDM1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDQzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDQzODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ0NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ0NDI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0NDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NDUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDQ1NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ0NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ0NjA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0NDY4OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU0NDczOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NDc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDQ3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDQ4MTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1NDQ4NTsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0NTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NTEzOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU0NTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NTE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDUxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDUxODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ1MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ1MjI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0NTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NTI5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDUzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDUzNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ1Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ1Mzg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0NTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NTQ1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDU0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDU1MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ1NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ1NTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0NTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NTYyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDU3MDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1NDU3NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDU3ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ1Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ1ODA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTQ1ODU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ1ODg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0NTkwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NTkyOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU0NTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NTk5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU0NjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NjAzOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NDYxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDYxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NDYxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDYyMTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTQ2MzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ2Mzg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTQ2NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ2NDI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU0NjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NjU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU0NjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NjYwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU0NjY5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0Njc1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU0Njc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0Njc4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NDY4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDY4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NDY5MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDY5NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NDY5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDY5ODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTQ3MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ3MTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTQ3MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ3MTc7MzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU0NzUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0NzU1OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NDc3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDc3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NDc3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDc3Mzs0OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTQ4MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ4MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTQ4MjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ4Mjk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTQ4MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ4MzY7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU0ODUyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0ODU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU0ODU1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0ODU3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDg2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDg2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ4NjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0ODY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0ODcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDg3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ4Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ4Nzg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0ODg0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0ODg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDg4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDg5MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ4OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ4OTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0ODk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0OTAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDkwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDkwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ5MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ5MDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0OTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0OTEzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDkyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDkyMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ5MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ5MjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0OTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0OTI5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDkzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDkzNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ5Mzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0OTQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0OTQ1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDk0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDk0Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ5NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ5NTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0OTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0OTYwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDk2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDk2NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ5Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ5Njg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0OTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0OTcxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDk3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDk3NTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU0OTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU0OTg2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NDk5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NDk5MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTQ5OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTQ5OTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MDAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTAwNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUwMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUwMTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MDE3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTAyMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTAyNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUwMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUwMjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MDMyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTA0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTA0MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUwNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUwNDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MDUyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTA1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTA1ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUwNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUwNjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MDY2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTA2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTA2ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUwNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUwNzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MDgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTA4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTA4NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUwODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUwODg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MDk4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTEwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTEwMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUxMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUxMDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MTA4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MTEyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTExMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTExNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUxMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUxMTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MTI1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MTI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTEzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTEzMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUxMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUxMzU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MTQxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTE0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTE0OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUxNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUxNTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MTU4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTE2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTE2NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUxNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUxNjg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MTc3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MTc5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTE4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUxODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUxODc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MTkyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MTk2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTE5ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUyMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUyMDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MjA3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTIxNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUyMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUyMTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MjI2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTIzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTIzODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUyMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUyNDA7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTUyNDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUyNDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MjQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MjUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTI1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTI1Mjs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE1NTI2MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUyNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUyNjY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1Mjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1Mjc1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTI3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUyODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUyODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1Mjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1Mjg2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTI5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTI5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUyOTU7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTU1MzA2OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUzMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUzMTk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTUzMjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUzMjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MzI3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MzMxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU1MzM1OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUzNTc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTUzNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUzNTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1MzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1MzYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTM2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTM2Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUzNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTUzNzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1Mzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1Mzc5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTM4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTM4NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTUzOTI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTUzOTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU0MDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1NDAxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NDA1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU1NDA5OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTU0MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU0Mzc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTU0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU0Mzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1NDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NDQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTQ0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTQ0Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTU0NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU0NTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1NDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NDU4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTQ2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTQ2Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTU0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU0Njk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1NDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NDc0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTQ4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTQ4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTU0ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU0ODY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1NDk0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU1NDk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NTAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTUwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTUwNDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1NTUwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTUxMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTU1MTQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU1MTY7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTU1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU1MjM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTU1MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU1Mjc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1NTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NTQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1NTQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NTQ1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTU1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTU2Mjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NTU2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTU2OTsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTU1OTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU1OTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTU1OTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU1OTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1NTk4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NjAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTYwNDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTU2MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU2MTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1NjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NjE2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTYyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTYyNTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTU2MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU2MzI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTY0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTY0NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTU2NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU2NDc7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTU2NTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU2NTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1NjU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NjU3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NTY1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTY1OTs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE1NTY2Nzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTU2NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU2NzY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1NjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NjgzOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTU2OTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU2OTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU1Njk4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NzAwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU1NzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NzA0OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTcyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTcyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTcyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTczMTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NTczNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTczODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTU3NDk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU3NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTU3NTI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU3NTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTU3NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU3NTg7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1Nzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1Nzc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1Nzc5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1NzgyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU1Nzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1Nzg1OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTgwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTgwMjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NTgwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTgwOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTU4MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU4MjQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTU4MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU4Mjc7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1ODQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1ODUwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1ODUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1ODUzOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTg2ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTg3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTg3MTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTg4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTg4MTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NTg4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTg4ODsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTU5MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU5MDY7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1OTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1OTI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1OTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1OTI5OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU1OTM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1OTM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1OTM4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU1OTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1OTQyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1OTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1OTUyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU1OTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU1OTU0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NTk2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTk3MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NTk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NTk3NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTU5ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU5ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTU5ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTU5ODk7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MDI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MDI3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MDM0OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MDM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MDQxOzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjA2ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjA3MTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NjA3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjA3NTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjA4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjA4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjA4NDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYwOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYwOTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYwOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYwOTg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MTA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MTEyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU2MTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MTE2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjEyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjEyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjEyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjEyOTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYxNDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYxNDY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTYxNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYxNDk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MTYxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MTY0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MTY3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU2MTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MTc0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjE4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjE4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjE4OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjE5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjE5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjIwMTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjIxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjIxMzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NjIxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjIxNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYyMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYyMjc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYyMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYyMzA7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYyMzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYyMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYyMzk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYyNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYyNDI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYyNTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYyNTQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTYyNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYyNTc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYyNjU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTYyNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTYyNjg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2Mjc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2Mjc5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MjgyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2Mjg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2Mjg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MjkxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2Mjk0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MzAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MzA2OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU2MzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MzEyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MzIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MzIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MzI0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2MzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2MzI3OzM5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjM2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjM2Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjM3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjM3OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NjM4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjM4Mjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjM4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjM5MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjM5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjM5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjM5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjM5NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjM5ODszOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY0Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY0Mzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY0NDM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTY0NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY0NTA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2NDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NDYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2NDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NDY1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2NDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NDc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2NDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NDc3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2NDg2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NDg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2NDkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NDkzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjUwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjUwNDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjUxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjUxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjUxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjUxMzsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY1NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY1NDI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2NTU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NTU3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU2NTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NTYxOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2NTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NTY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU2NTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NTY5OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NjU5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjU5NjszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY2MzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2MzQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTY2NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2NDE7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY2NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2NDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY2NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2NTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY2NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2NTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY2NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2NTc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY2NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2NjI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY2NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2NzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY2NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2NzQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY2ODM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2ODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTY2ODY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY2ODg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2NjkxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2Njk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NjY5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjY5Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY3MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY3MDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2NzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NzA4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NjcxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjcxNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY3MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY3MTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2NzIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NzIxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NjcyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjcyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY3Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY3MzA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2NzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NzM2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NjczODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjczOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY3NDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY3NDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2NzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NzQ3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Njc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njc1MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY3NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY3NTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2NzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2NzYwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Njc2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njc2NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY3Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY3NzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2NzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2Nzc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Njc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njc3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY3ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY3ODE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2Nzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2Nzg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Njc4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njc4ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY3OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY3OTI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2Nzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2ODAwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NjgwNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjgwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY4MTE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2ODIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2ODIxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NjgyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjgyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY4Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY4Mjg7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NjgzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjgzOTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY4NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY4NDc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2ODUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2ODUyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Njg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njg1Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY4NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY4NjI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2ODY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2ODcxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Njg3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njg3MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY4NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY4NzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2ODc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2ODgwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY4OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY4OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2ODkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2ODk0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NjkwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjkwNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY5MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY5MDg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2OTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2OTE0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NjkxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NjkyMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY5MjM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY5Mjc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2OTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2OTI5Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTU2OTM3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Njk0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njk0MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY5NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY5NDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2OTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2OTUwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Njk1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njk1NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY5NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY5NTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2OTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2OTYzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Njk2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njk2OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTY5NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTY5NzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU2OTc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU2OTc4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Njk4MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njk4MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1Njk4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Njk4NjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcwMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcwMDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcwMDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcwMDU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTcwMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcwMDk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcwMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcwMTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcwMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcwMjE7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3MDU4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MDYxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU3MDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MDY1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NzA3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzA3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NzA3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzA3OTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcwOTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcwOTM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTcwOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcwOTY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcxMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcxMDY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcxMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcxMDk7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcxMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcxMTc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcxMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcxMjA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3MTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MTMyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3MTM0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MTM4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3MTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MTQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3MTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MTUwOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NzE3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzE3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NzE3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzE3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NzE3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzE3NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NzE3OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzE4MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcxOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcxOTU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcxOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcxOTg7MzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3MjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MjMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3MjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MjM0OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3MjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MjM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3MjM5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MjQzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NzI1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzI1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1NzI1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzI2Mjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1NzI2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzI2OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcyNzk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcyODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTcyODI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTcyODQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3Mjg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MjkwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzI5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzI5Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTcyOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTczMDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3MzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MzA0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzMxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzMxMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTczMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTczMTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3MzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MzE4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzMyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzMyODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTczMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTczMzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3MzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MzM4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzM0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzM0MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTczNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTczNDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3MzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MzUwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzM1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzM2MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTczNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTczNjQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3MzcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3Mzc0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzM3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzM3NjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1NzM3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzM4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTczODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTczODQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3Mzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3MzkwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzM5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzM5NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTczOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTczOTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NDA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NDA2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzQwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzQwOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc0MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc0MTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NDIyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzQyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzQyNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc0MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc0Mjc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NDM2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzQzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzQzOTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NDUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NDUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzQ1NTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1NzQ1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzQ2MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc0NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc0NjQ7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTc0Njg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NDczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzQ3NDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1NzQ3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc0NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc0Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NDgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzQ4MjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1NzQ4MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc0ODU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NDkyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzQ5NDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1NzQ5NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc0OTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NTAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzUwNDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1NzUwNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc1MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc1MTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NTE0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU3NTE4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzUyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzUyNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc1Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc1MzA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NTQwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzU0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzU0Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc1NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc1NTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NTU4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NTYxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzU2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzU2Mzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1NzU2ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzU3MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc1NzM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTc1Nzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc1ODA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NTgyOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU3NTg1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NTg4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzU4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzU5MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc1OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc1OTY7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzYwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzYwNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc2MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc2MDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NjExOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzYxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzYxODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc2MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc2MjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NjI2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzYzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzYzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc2MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc2Mzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NjQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NjQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzY0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzY0Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc2NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc2NTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NjU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NjU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzY2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzY2MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc2NjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NjY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzY3Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc2Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc2Nzg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3Njg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3Njg2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzY4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzY4OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc2OTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3Njk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3Njk2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzcwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzcwMjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NzEyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NzE0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzcxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzcxOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc3MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc3MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NzI5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NzMzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1NzczNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1NzczNTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc3NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc3NDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NzQ2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Nzc0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Nzc1MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTc3NTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc3NTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU3NzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NzYwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU3NzY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3NzY3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1Nzc2OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Nzc3MTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1Nzc3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Nzc3NTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTc3ODY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTc3ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc3OTA7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTc3OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc3OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTc3OTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc4MDI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTc4MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc4MDY7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTc4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc4MTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTc4MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc4MTM7Mzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3ODUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3ODU1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU3ODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3ODU5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1Nzg2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Nzg3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1Nzg3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Nzg3MjszNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTc5MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc5MTI7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTc5MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc5MTk7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTc5Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc5Mjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTc5Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTc5MzA7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU3OTU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3OTYyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU3OTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU3OTY2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1Nzk3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Nzk3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1Nzk3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1Nzk3OTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTc5OTc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgwMDM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTgwMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgwMDY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTgwMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgwMTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTgwMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgwMTc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MDMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MDM0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MDM4OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU4MDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MDQ1Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MDUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MDU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MDU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MDU5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU4MDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MDYyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MDY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MDcwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MDczOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODA4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODA4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODA4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODA4NjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTgwOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgwOTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTgwOTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgxMDM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTgxMTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgxMTQ7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTgxMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgxMjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTgxMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgxMjM7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MTYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MTYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MTY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MTY3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU4MTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MTcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MTczOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MTc3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODE4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODE4ODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODE5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODE5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODE5NzszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTgyMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgyMzA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MjQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MjQ2OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MjUzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MjU2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODI2Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODI3MTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODI3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODI4MDsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTgzMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgzMDk7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MzI4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MzMyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MzM5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4MzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4MzQyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODM1Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODM1NzszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTgzOTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgzOTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTgzOTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTgzOTk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTg0MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg0MDY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTg0MTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg0MTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTg0MTY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg0MTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NDIxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NDI0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODQyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODQyNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg0MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg0MzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NDM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NDM4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODQ0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODQ0NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg0NDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NDUyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODQ2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODQ2Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg0Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg0Njg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NDcyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODQ3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODQ3NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg0ODA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NDg0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODQ5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODQ5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg0OTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NTA1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NTA4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODUwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODUxMDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1ODUxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODUxNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg1MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg1MTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NTI0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODUyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODUyODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg1MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg1MzI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NTQwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODU0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODU0Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg1NDk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NTU2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODU1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODU1OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg1NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg1NjE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NTcwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODU3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODU3MzsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NTg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NTg3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODU4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODU4OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1ODU5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODU5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg1OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg1OTg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTg2MDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NjA3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODYwODsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1ODYwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg2MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg2MTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NjE1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODYxNjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1ODYxNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg2MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg2MTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NjI2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODYyODsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1ODYyOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg2MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg2MzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NjM2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODYzODsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1ODYzOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg2NDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg2NDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NjQ4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU4NjUyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODY1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODY1ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg2NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg2NjQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NjczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4Njc0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODY4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODY4MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg2ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg2ODY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NjkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4Njk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODY5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODY5Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1ODcwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODcwNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg3MDc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTg3MTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg3MTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NzE2OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU4NzE5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NzIyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODcyNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg3MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg3MzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NzM1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODc0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg3NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg3NDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NzUwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODc1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODc1NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg3NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg3NjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4NzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4NzY2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODc3MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODc3Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg3Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg3Nzg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4Nzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4Nzg1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODc4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODc4OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg3OTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg4MDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4ODAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4ODAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODgwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODgwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg4MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg4MDk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU4ODE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4ODE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1ODgxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODgxOTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1ODgyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODgyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTg4Mjg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg4MzA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTg4MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg4MzQ7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4ODUzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU4ODU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4ODU3Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4ODY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4ODY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4ODY2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4ODY5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU4ODcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4ODczOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4ODc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4ODc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4ODc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4ODgwOzM5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1ODkxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODkyMjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1ODkyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1ODkyNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTg5MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg5Mzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTg5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTg5Mzk7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4OTc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4OTc5OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4OTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4OTg2Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4OTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4OTk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU4OTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU4OTk3OzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTAyNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTAyOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1OTAzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTAzMzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTkwNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkwNDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTkwNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkwNDY7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5MDY0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MDcwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU5MDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MDczOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5MDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MDgxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5MDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MDg0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTA5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTEwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTEwMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTEwNTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1OTExMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTExMjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTExOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTEyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTEyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTEyNjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1OTEyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTEyOTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTEzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTEzNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTEzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTE0MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTkxNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkxNTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTkxNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkxNTM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5MTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MTY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5MTY2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MTcwOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5MTc3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MTgxOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5MTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MTg4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5MTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MTkwOzM3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTIyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTIzMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTIzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTIzNDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1OTIzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTIzOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTI0MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTI0NDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTI1MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTI1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTI1NDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTkyNjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkyNjk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTkyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkyNzQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTkyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkyNzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTkyNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkyNzk7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5MzAzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MzA3Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU5MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5MzE1OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTMyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTMyOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTMzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTMzMTszNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTkzNjU7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkzNzM7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNTkzNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkzNzk7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTkzODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkzODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTkzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTkzODk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5Mzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NDAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NDAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NDA0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NDA3OzMzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTQ0MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTQ0NDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk0NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk0NTg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk0NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk0NjE7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NDkzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NDk0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NDk5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NTA4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NTEzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NTE2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NTE4OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTU0Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTU0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTU0Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTU1MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE1OTU1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTU1NDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTU2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTU2MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTU2NTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk1NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk1NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk1Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk1Nzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk1Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk1ODA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk1ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk1ODM7MzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NjE3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NjIwOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTYzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTYzNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE1OTYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTYzNzszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk2Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk2Njk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk2NzA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk2NzU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk2ODQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk2ODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk2ODk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk2OTM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk2OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk3MDA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNTk3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk3MDM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NzE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NzE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NzE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NzIxOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTU5NzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NzI4Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NzM1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NzM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTU5NzM4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NzQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTc0MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTc0NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk3NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk3NDg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5NzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NzU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTc1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTc2MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk3NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk3NjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5NzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5NzczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTc3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk3ODA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5Nzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5Nzg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTc4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTc4ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk3OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk3OTI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5ODAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5ODAyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTgwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTgxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk4MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk4MTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5ODE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5ODIwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTgyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTgyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk4Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk4Mjg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5ODM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5ODM2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTgzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTgzOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk4NDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5ODUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5ODUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTg1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk4NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk4NTc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5ODY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5ODY2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTg2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTg2OTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5ODgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5ODgzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTg4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTg4NTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1OTg4ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTg5MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk4OTM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTk4OTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk5MDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5OTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5OTAyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTU5OTA2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTkxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTkxMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk5MTI7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTk5MTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5OTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5OTE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTkxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTkxOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk5MjA7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTk5MjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5OTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5OTIzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTkyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTkzMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk5MzI7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTk5MzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5OTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5OTM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTkzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTk0MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk5NDI7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNTk5NDM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5OTQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5OTUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTk1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTk1Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE1OTk1Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk5NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk5NjI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5OTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5OTY4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTk3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTk3ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNTk5ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNTk5ODU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTU5OTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTU5OTkwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE1OTk5NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE1OTk5OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAwMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAwMDE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjAwMDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAwMDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMDExOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTYwMDE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMDE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDAxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDAyMDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2MDAyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDAyNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAwMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAwMjg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMDM0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAwNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAwNDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMDQ3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDA0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDA0OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAwNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAwNTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMDYwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDA2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDA2NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAwNzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMDc1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDA3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDA4MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAwODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAwODQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMDkyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDA5NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDA5NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAwOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAwOTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMTA0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDEwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDEwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAxMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAxMTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMTE2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDEyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDEyNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAxMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAxMjc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMTMwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDEzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDEzNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAxNDA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDE1MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDE1Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAxNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAxNTc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMTY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDE2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDE2ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAxNzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAxNzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMTgxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDE4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDE4NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAxODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAxODg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwMTkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMTk2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDE5ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2MDIwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDIwNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjAyMDc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAyMDk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjAyMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAyMTM7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwMjI2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYwMjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMjMwOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwMjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMjM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwMjM5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMjQyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYwMjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMjQ2OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwMjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMjUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwMjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMjUzOzM5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDI5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDI5NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MDI5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDI5OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjAzMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAzMTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjAzMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjAzMTI7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwMzQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMzUyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwMzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMzU5Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwMzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMzY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwMzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwMzcwOzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDM5OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQwNDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MDQwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQwNzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDQxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQxNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDQxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQxODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDQyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDQyMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQyNjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MDQzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQzMzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDQ0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQ0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDQ0NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQ0NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MDQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQ1MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDQ1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQ1ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDQ2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDQ2MTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA0NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA0NzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA0NzQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA0Nzg7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA0ODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA0ODk7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA0OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA0OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA1MDA7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwNTI5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwNTMzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwNTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwNTQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwNTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwNTQyOzM2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDU3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDU4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDU4MTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA1OTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA2MDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA2MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA2MDY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjA2MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA2MTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA2MTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA2MTY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwNjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwNjI3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwNjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwNjM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwNjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwNjM2OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDY2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDY2OTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA2ODE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA2ODU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA2OTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA2OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA2OTU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwNzA2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwNzEwOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwNzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwNzE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwNzE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwNzE5OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDc1MjsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA3NzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA3NzU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA3ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA3ODI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjA3ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA3ODU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYwNzk2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwODAwOzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDgzNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDgzOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDg0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDg0Mzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MDg0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDg1MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDg1NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDg1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MDg2MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDg2MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjA4NjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA4Njg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwODY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwODcwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDg3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDg3ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjA4ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA4ODY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwODg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwODkwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDg5Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjA5MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA5MDM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwOTA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwOTEyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDkxNDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2MDkxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDkyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjA5MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA5MjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwOTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwOTI2Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTYwOTM0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDkzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDkzOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjA5NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA5NDI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwOTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwOTQ5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDk1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDk1NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjA5NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA5NjI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwOTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwOTY4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDk3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDk4MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjA5ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjA5ODI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNjA5ODk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYwOTkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYwOTk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MDk5NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MDk5OTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MTAwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTAwNjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MTAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTAxNDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjEwMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEwMjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjEwMjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEwMzI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxMDQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMDQ5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYxMDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMDU2Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxMDY1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMDY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxMDY4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMDcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTA3Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTA3NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjEwNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEwNzk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMDg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTA5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTA5MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjEwOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEwOTM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMTAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTEwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjExMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjExMDk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMTE5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTEyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjExMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjExMjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMTMxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTEzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTEzODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjExNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjExNDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMTQ1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTE1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTE1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjExNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjExNTU7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjExNTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMTYzOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTYxMTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMTY4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTE3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTE3MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjExNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjExNzc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMTg0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTE5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTE5Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjExOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjExOTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMjAzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTIwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTIwODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjEyMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEyMTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMjIxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTIyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTIyNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjEyMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEyMzQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMjQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMjQ0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTI0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTI0NjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2MTI0OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTI1MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjEyNTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEyNTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMjU4Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTYxMjY2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTI2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTI2ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjEyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEyNzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMjgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTI4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTI4NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjEyOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEyOTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMjk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTMwMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjEzMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEzMDc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMzE0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTMxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTMxNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjEzMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEzMjE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYxMzI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMzI5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MTMzMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTMzMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MTMzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTMzNzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjEzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEzNTc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjEzNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEzNjM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjEzNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjEzNjc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxMzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMzc4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYxMzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxMzgyOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTM5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTM5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTM5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTQwMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MTQwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTQwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTQwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTQwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTQwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTQwODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTQxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTQxMzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MTQxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTQxNzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE0Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE0Mjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE0Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE0MzA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNDQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNDQ3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYxNDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNDUwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTQ2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTQ2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTQ2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTQ2MzsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE0ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE0ODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE0ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE0ODg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE0OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE0OTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE0OTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE0OTY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjE0OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE1MDA7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNTE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNTE2OzMzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTU0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTU1MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTU1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTU1MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTU1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTU1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTU1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTU1NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTU1OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTU2MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MTU2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTU2NjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE1Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE1Nzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE1Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE1ODA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNTkzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNTk2OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTYwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTYwOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTYxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTYxMjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE2Mjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE2Mjg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE2MzM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNjQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNjQ4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTY1OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTY2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTY2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTY2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTY2ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTY3MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MTY3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTY3NDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE2ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE2ODY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE2ODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE2OTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE2OTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE2OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE2OTU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNzA4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNzEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNzExOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTcyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTcyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTcyNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTcyODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MTczMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTczMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE3NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE3NDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE3NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE3NDU7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxNzgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxNzg0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTc5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTc5NTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTgwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTgwMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTgwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTgwNDsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE4MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE4MzM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxODQ1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxODQ5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYxODUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxODUyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTg2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTg2NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTg2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTg2NzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE4Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE4ODA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE4ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE4ODM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE4ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE4ODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE4ODc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE4OTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE4OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE4OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjE4OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjE4OTY7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxOTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxOTI5OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYxOTM0OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxOTM4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxOTQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxOTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxOTQ0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYxOTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxOTQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxOTUwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxOTU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxOTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxOTU3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYxOTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYxOTU5OzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTk5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTk5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTk5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTk5MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MTk5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MTk5Njs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MjAwMDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MjAwNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjAwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MjAwOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjAxMzszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjIwNDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIwNTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjIwNTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIwNTU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjIwNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIwNjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjIwNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIwNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjIwNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIwNjY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyMDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMDc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyMDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMDc5OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MjEwMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjEwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MjEwNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjEwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIxMTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIxMTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyMTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMTE2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjEyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjEyNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIxMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIxMjY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyMTMzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMTM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjEzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjEzOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIxNDM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyMTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMTUzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjE1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjE1Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIxNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIxNjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyMTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMTcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjE3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjE3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIxNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIxNzg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyMTgzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMTg4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjE4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjE5MDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2MjE5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjE5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIxOTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIyMDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyMjAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMjAyOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTYyMjA5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjIxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjIxNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIyMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIyMjA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyMjI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMjI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjIzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjIzMTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE2MjIzNjszMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyMjY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMjcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjI3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjI3NDsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNjIyODU7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjI5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjI5ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2MjMwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjMwNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIzMDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIzMTA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjIzMTQ7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjMzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjMzNjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2MjMzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjMzODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIzNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIzNDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyMzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMzQ1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjM1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjM1NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIzNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIzNTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyMzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyMzYzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjM3MTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2MjM3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjM3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjIzODA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjIzODQ7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjIzODg7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjQxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjQxNjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2MjQxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjQxODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI0MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI0MjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyNDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNDI1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjQzMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI0MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI0Mzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyNDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNDQxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjQ0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjQ0ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI0NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI0NTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyNDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNDYxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjQ2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjQ2NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI0NzM7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjI0Nzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI0ODE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyNDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNDgzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTYyNDg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNDkxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjQ5MzsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNjI1MDQ7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjUyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjUyOTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2MjUzMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjUzNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI1Mzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI1NDE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjI1NDU7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjU2NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI1Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI1NzA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyNTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNTc3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjU3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjU4MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI1ODQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjI1ODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI1OTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyNTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNTk0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTYyNTk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNjAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjYwNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjYwNjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MjYxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjYxMzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MjYxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjYxODsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjI2MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI2MzI7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjI2Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI2NDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjI2NDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI2NDQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyNjU4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNjYxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYyNjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNjY0Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyNjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNjcyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyNjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNjc1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYyNjc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyNjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNjgxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyNjgyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNjg2OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MjcyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjcyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MjcyNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjcyODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MjczMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjczNDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MjczNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjczODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MjczOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mjc0MDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjI3NjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI3NjM7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyNzg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNzg3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyNzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyNzk0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyODAyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyODA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyODA1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyODA3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjgxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjgxMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI4MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI4MTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyODIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyODIzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MjgzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MjgzMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI4Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI4Mzg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyODQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyODQ4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2Mjg1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mjg1MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI4NTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyODYwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2Mjg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mjg2ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjI4NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI4NzY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYyODgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyODg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2Mjg4NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mjg4OTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2Mjg5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mjg5NDsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjI5MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI5MTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjI5MTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjI5MjI7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyOTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyOTQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYyOTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyOTQzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYyOTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYyOTQ3OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Mjk2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mjk2ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Mjk2OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mjk3Mzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2Mjk3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mjk4MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2Mjk4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mjk4NTszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjMwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMwMTY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjMwMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMwMjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjMwMjQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMwMjk7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzMDU1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMDU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzMDYwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMDY0OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYzMDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMDcxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYzMDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMDc2OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MzEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzEwNTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MzExMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzExMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MzExMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzExODsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjMxNDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMxNDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjMxNDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMxNTI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjMxNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMxNTk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjMxNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMxNjQ7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzMTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMTg5OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzMTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMTk2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzMTk3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMjAyOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MzIyMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzIyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MzIyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzIzMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MzIzMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzIzNjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjMyNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMyNTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjMyNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMyNTM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjMyNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMyNjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjMyNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMyNjM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjMyNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMyNjc7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzMjg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMjg3OzUwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MzMzNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzMzOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MzM0MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzM0MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjMzNDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMzNDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYzMzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMzUwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzM1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzM1ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjMzNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMzNjA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYzMzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMzY4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzM3Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjMzNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMzNzk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYzMzg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzMzkxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzM5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzM5Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjMzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjMzOTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYzNDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNDAxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzQwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzQwNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjM0MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM0MTI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzQyMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjM0Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM0MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYzNDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNDM0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzQ0MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzQ0NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjM0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM0NDY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYzNDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNDU0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzQ1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzQ1OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjM0NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM0NjM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYzNDY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNDY4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzQ3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzQ3MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjM0NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM0NzU7MTg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzQ5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzQ5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjM0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM0OTg7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjM1MDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM1MDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYzNTA1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNTA4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzUwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzUxMDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE2MzUxNTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYzNTM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNTM5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzU0MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzU0Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MzU0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzU0ODsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjM1NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM1NzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjM1NzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM1Nzk7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzNTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNTk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzNTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNTk5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYzNjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNjAzOzM0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MzYzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzY0MDsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjM2NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM2NTk7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzNjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNjczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzNjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNjc1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTYzNjc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNjc5OzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2MzcxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzcyMDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MzcyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzcyMzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjM3Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM3NDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjM3NDE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM3NDU7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzNzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzNzcxOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Mzc4NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mzc4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Mzc5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mzc5MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2Mzc5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mzc5NjsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjM4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM4MTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjM4MTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM4MjM7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzODUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzODU0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Mzg2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mzg3MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Mzg3MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mzg3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Mzg3NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mzg3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjM4ODE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM4ODU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYzODg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzODg3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2Mzg5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mzg5Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjM4OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM4OTg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTYzOTA3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzOTEwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2MzkxMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzkxNDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2MzkxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2MzkxOTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjM5Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM5Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjM5Mzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM5NDI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjM5NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjM5NTI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzOTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzOTY0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTYzOTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTYzOTY2OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Mzk4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mzk4Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Mzk5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Mzk5NjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQwMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQwMTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQwMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQwMTI7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0MDMxOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0MDM3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0MDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0MDQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0MDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0MDQ4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY0MDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0MDUyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDA2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDA2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDA2ODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NDA3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDA3NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NDA3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDA4MDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQwOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQwOTg7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQxMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQxMDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQxMDY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQxMTE7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjQxMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQxMTg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0MTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0MTMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0MTMyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0MTM4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY0MTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0MTQzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDE1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDE1NjsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQxNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQxNzg7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjQxODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQxODQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQxOTA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjQxOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQxOTU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0MjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0MjA4OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDIyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDIzMDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NDIzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDIzNjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDI0Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NDI0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDI0NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQyNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQyNTg7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0Mjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0Mjc4OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY0MjgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0Mjg0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0MjkwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY0Mjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0Mjk1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDMwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDMxMDsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQzMzQ7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjQzMzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQzNDA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQzNDY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjQzNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQzNTE7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0MzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0MzY0OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDM4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDM4Njs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NDM5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDM5Mjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDM5ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NDQwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDQwMzsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ0MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ0MjU7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0NDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0NDU2OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY0NDYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0NDYyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0NDY4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY0NDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0NDczOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDQ4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDQ4ODsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ1MTI7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjQ1MTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ1MTg7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ1MjQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjQ1Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ1Mjk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0NTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0NTQwOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDU1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDU2MDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NDU2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDU2Njs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDU3Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NDU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDU3NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ1ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ1ODk7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0NjA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0NjEwOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY0NjE1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0NjE2OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0NjIyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY0NjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0NjI3OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDY0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDY0MTsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ2NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ2NjQ7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjQ2Njk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ2NzA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ2NzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ2NzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ2ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ2ODE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ2ODY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ2ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ2OTE7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0NzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0NzE2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDcyNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDcyOTsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ3NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ3NTQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0NzY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0NzY3OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDc4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDc5MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ4MDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ4MDM7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0ODI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0ODMwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDg0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDg0MzsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ4Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ4Njg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0ODc4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0ODgxOzMzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDkxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDkxNTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ5MjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ5Mjg7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY0OTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY0OTU1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NDk2NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NDk2ODsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjQ5OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjQ5OTE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1MDAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MDA0OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTAyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTAyODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjUwMzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjUwNDE7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1MDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MDY3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTA3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTA4MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NTA4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTA4MzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjUwOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjUwOTY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjUwOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjUwOTk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjUxMDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjUxMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjUxMDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjUxMDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjUxMTA7Mzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1MTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MTQ5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY1MTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MTUzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTE2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTE2NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTE2NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTE3MDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NTE3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTE3Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NTE4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTE4MjsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjUxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjUyMDA7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjUyMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjUyMDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjUyMDg7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjUyMTQ7Mjg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1MjQyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MjQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1MjQ4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MjUyOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1MjU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MjU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1MjU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MjYyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY1MjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MjY1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTI4MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTI4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTI4Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NTI4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTI4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTI4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTI5MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTI5NDs0MDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjUzMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjUzMzU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjUzMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjUzMzk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1MzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MzUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1MzUxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MzU2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY1MzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MzYzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY1MzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1MzY4OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTM4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTM4Njs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTM5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTM5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTM5NDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTQwMDszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU0MzA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU0MzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU0MzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU0NDA7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU0NDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU0NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU0NDc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU0NDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU0NTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU0NTI7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1NDY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NDcwOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTQ5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTQ5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTQ5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTQ5NTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NTUwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTUwMjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTUxMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTUxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTUxMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTUxNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NTUxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTUxOTsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU1NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU1NDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU1NDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU1NTI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjU1NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU1NTk7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1NTgyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NTg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1NTg1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NTg3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1NTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NTkzOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTYxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTYxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTYxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTYyMDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NTYyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTYyNzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU2Mzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU2Mzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU2NDA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU2NDI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjU2NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU2NTA7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1NjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NjcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1NjczOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1Njc2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY1NjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NjgzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1NjkyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1Njk0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY1Njk1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1Njk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTcwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTcwMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU3MDU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1NzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NzEwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTcxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTcxMzsxMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1NzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NzI3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTczMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU3MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU3Mzc7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTc1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTc1NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU3NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU3NjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1NzY1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NzY4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTc3MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU3NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU3NzM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1NzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1NzgyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTc4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTc4ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU3OTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU3OTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1Nzk5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1ODAxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY1ODA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1ODA2OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTgyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NTgyNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTgyNzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NTgzMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU4NDI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU4NDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjU4NDU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU4NDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1ODUwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1ODU0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTg1Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU4NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU4NjQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1ODY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1ODY4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTg3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTg3ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU4ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU4ODM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1ODg5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1ODkyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTg5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTg5NDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2NTg5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTkwMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU5MDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU5MDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1OTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1OTA2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTY1OTEzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTkxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTkxOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU5MjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1OTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1OTI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTkzMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU5Mzk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1OTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1OTQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTk1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTk1Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU5NTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU5NjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1OTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1OTYzOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTY1OTcwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NTk3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NTk3Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU5ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU5ODQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY1OTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY1OTg3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjU5OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjU5OTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MDAxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjAwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjAxMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYwMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYwMTI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNjYwMTk7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjAzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjAzNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYwMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYwNDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MDQzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjA0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjA0NzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MDU4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjA2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjA2NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYwNjg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MDc2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjA3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjA4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYwODM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYwODU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MDkwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjA5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjA5MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYwOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYwOTc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MTA0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYxMTQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYxMTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MTE5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjEyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjEyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYxMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYxMjk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MTM2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjE0Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYxNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYxNDk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MTUzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MTU2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjE1NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjE1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYxNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYxNjI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MTcwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjE3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjE3Nzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYxODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYxODY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MTg5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjE5NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjE5OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYyMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYyMDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MjA2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjIxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjIxMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYyMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYyMTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MjI3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MjMwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjIzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjIzMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYyMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYyMzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MjQxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjI1MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYyNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYyNTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MjU2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjI2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjI2MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYyNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYyNjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MjcyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjI3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjI3OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYyODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYyODQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2Mjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2Mjg3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjI5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjI5NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYyOTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYzMDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MzA0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MzA2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjMxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjMxMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYzMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYzMTQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MzIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjMyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjMyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYzMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYzMzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MzM0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjMzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjMzNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYzNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYzNDE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MzQ3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjM1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjM1NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYzNTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2MzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2MzYxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjM2ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjM3MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYzNzI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYzNzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2Mzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2Mzc4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjM4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjM4NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjYzOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjYzOTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2Mzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NDAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjQwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjQwMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY0MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY0MTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NDE0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjQyMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY0MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY0MjY7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjQ0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjQ0MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY0NDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY0NDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NDQ5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NDUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjQ1NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY0NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY0NTg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NDY0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NDY2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjQ3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjQ3NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY0NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY0Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NDgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjQ4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjQ4NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY0ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY0OTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NDk0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjQ5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjQ5NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY1MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY1MDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NTA0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjUwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjUxMDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY1MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY1MTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NTIwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NTI0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjUyNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjUyNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY1MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY1MzE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NTM2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjUzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjUzOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY1NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY1NDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NTUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjU1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjU1NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY1NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY1NjE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NTY3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NTY5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjU3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjU3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY1NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY1Nzc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NTg0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjU4NzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NTk3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NjAxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjYwMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjYwNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY2MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY2MTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NjE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjYxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjYxOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY2MjY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NjMyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjYzNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY2NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY2NDY7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjY2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjY2Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY2Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY2Njk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NjcxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2Njc1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjY3NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjY3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY2ODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2Njg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2Njg1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjY5MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjY5MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY2OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY2OTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2Njk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NzAwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY3MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY3MTE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NzE4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjcyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjcyMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY3MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY3MzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NzM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2NjczODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjczOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY3NDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY3NDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2NzUwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2NzUyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2Njc1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Njc1OTsxNTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2Nzc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2Nzc1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2Njc3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Njc3OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY3ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY3ODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2Nzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2Nzg2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2Njc4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Njc4OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjY3OTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY3OTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY2ODAxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2ODAzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY2ODA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2ODA4OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NjgyODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NjgzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjgzMjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NjgzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NjgzOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2Njg0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Njg0Mzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Njg1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Njg1MTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2Njg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Njg1OTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY4NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY4NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY4Nzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY4ODA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjY4ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY4ODQ7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY4ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY4ODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY4ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY4OTA7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY4OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY4OTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY4OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY4OTg7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY5MDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY5MDg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjY5MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY5MTI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY5MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY5MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjY5MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjY5MjQ7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY2OTU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2OTU4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY2OTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2OTYyOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY2OTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2OTcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY2OTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY2OTczOzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzAwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzAwNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NzAwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzAwOTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjcwMjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjcwMzA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjcwMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjcwMzQ7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3MDUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MDUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3MDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MDU1OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzA3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzA4MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2NzA4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzA4NjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjcxMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjcxMDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjcxMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjcxMDQ7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3MTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MTI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3MTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MTI3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzEzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzE0MTs1NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTY3MTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MTk4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY3MjAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MjAxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzIxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzIxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzIxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzIxNDsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjcyMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjcyMzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjcyMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjcyMzY7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjcyNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjcyNDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjcyNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjcyNDc7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3MjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MjY0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3MjY1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MjY5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY3Mjc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3Mjc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3Mjc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3MjgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MjgzOzMwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNjczMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjczMTQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjczMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjczMTc7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3MzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MzM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3MzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3MzM2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzM0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzM0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzM0ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzM1Mjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzM2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzM2MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzM2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzM2NDsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjczODA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjczODQ7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NDAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NDA0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NDA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NDA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NDEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NDEzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY3NDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NDE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NDE5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NDIzOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzQ0MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzQ0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzQ0Mzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzQ0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzQ0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzQ1MTszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjc0ODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc0ODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjc0OTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc0OTM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjc0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc0OTY7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NTE2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NTE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NTIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NTIyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NTMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NTMzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NTM3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NTQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NTQ4OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzU2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzU2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzU2OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzU3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzU3Mjs1ODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTY3NjMwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NjMyOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NjM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NjM4OzM0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzY3MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzY3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2NzY3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2NzY3OTsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjc3MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc3MDI7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NzIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NzIxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NzMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NzMxOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3NzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3NzM2OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Nzc1Mzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Nzc1OTs3NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTY3ODM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3ODM2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY3ODM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3ODM5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3ODQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3ODQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3ODUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3ODUxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3ODYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3ODYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3ODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3ODYzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3ODY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3ODY2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3ODY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3ODcxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3ODgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3ODgxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Nzg5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Nzg5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Nzg5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Nzg5NDsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjc5MTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc5MTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjc5MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc5MTg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3OTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3OTMwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3OTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3OTMyOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3OTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3OTQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY3OTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY3OTQzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Nzk1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Nzk1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2Nzk1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2Nzk1NjsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjc5Nzc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc5ODM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjc5ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc5ODc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjc5OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc5OTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjc5OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjc5OTc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4MDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MDA4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4MDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MDEwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4MDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MDEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4MDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MDE1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODAyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODAyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODAyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODAyODsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjgwNDk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgwNTU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjgwNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgwNjM7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjgwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgwNzI7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4MDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MDkwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODEwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODEwMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODEwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODEwNDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODExMzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjgxMzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgxMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjgxMzQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgxMzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjgxMzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgxMzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4MTQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MTQ1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODE0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODE0Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjgxNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgxNTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4MTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MTU5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODE2Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjgxNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgxNzE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4MTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MTc2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODE4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODE4MjsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4MTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MTk0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODIwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODIwMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjgyMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgyMDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4MjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MjEyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODIxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODIyMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjgyMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgyMjM7MTM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODIzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODIzNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjgyNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgyNDU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4MjQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MjUyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODI1MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODI1NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjgyNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgyNTg7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNjgyNjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4MjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MjcwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODI3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODI3Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjgyODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgyODI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4Mjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4Mjg3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODI5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODI5MzsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4MzA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MzA1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODMxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODMxMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjgzMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgzMTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4MzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MzIzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODMyOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODMzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjgzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgzMzQ7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTY4MzQ1OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjgzNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgzNTg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjgzNjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgzNjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4MzY2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4MzcwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTY4Mzc0OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjgzOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgzOTY7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjgzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjgzOTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4NDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NDAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODQwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODQwNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjg0MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg0MTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4NDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NDE4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODQyMzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjg0MzE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjg0MzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg0Mzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4NDQwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NDQ0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTY4NDQ4OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjg0NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg0NzY7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNjg0Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg0Nzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4NDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NDgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODQ4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODQ4NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjg0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg0OTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4NDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NDk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODUwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODUwMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjg1MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg1MDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4NTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NTEzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODUyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODUyMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjg1MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg1MjU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4NTMzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTY4NTM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NTQxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODU0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODU0Mzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE2ODU0ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODU1MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjg1NTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg1NTU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg1NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg1NjI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg1NzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg1NzQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4NTg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NTkxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4NjAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NjAxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4NjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NjExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4NjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NjEzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY4NjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NjE3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODYyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODYzMDsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg2NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg2NDk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjg2NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg2NTY7MzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4NjkyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4Njk0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4Njk1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4Njk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2ODcwMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODcwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjg3MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg3MDY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4NzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NzEyOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjg3MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg3MjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY4NzI3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NzI5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY4NzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4NzM0OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODc1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODc1NDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODc2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODc2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODc2MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODc2NTsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg3OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg3OTM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4ODAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4ODA2OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODgzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODgzNTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODg0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODg0NTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg4NTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg4NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg4NTg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg4Njc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg4NzI7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY4ODkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY4ODk1OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODkxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODkyMDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2ODkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODkyMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODkzMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODkzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODkzNjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2ODk0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODk0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODk0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2ODk0Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2ODk0NzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg5NjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg5NzA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg5Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg5Nzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg5ODE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjg5ODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg5ODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg5ODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjg5OTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg5OTM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjg5OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjg5OTY7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjkwMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjkwMDU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjkwMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjkwMDg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjkwMTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjkwMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjkwMTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjkwMTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjkwMTk7NTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MDcyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MDc2Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MDg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MDg2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5MDkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MDkxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MDk0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MDk1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MDk4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5MTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MTAxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTExNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTExNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTExNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTExODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2OTEyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTEyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTEyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTEyNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTEyOTsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjkxNTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjkxNTY7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MTY5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MTcxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5MTc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MTc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MTc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MTgzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5MTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MTg2OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTIwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTIwMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTIwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTIwNjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2OTIxMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTIxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTIxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTIxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTIxNzsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjkyNDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjkyNDc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MjYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MjY1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5MjY5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MjcwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MjczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5Mjc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5Mjc3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5Mjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MjgwOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTI5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTI5ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTMwMTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2OTMwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTMwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTMwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTMwODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTMxMjsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjkzMzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjkzNDM7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MzYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MzYyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5MzY2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MzY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5MzcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5MzcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5Mzc0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5Mzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5Mzc3OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTM5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTM5NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTM5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTM5OTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2OTQwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTQwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTQwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTQwNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTQxMDsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk0Mzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk0NDI7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NDYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NDYyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5NDY2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NDY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NDcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NDcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NDc0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5NDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NDc3OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTQ5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTQ5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTQ5ODs0MDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk1Mzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk1NDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk1NDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk1NDU7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NTY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NTY3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5NTcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NTcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NTc1OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTU5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTU5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTU5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTU5Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2OTYwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTYwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTYwNTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk2MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk2MjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk2MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk2MjI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjk2MjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk2Mjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk2MzA7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NjQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NjUxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5NjU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NjU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NjU5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NjY5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NjcxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5Njc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5Njc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5Njc5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTY5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTY5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTY5Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2OTY5NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTY5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTcwMTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTcxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTcxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTcxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTcxMzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2OTcxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTcxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTcyMTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk3NDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk3NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk3NDQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjk3NDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk3NDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk3NTI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NzY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NzY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5NzY3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTY5NzcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5NzcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5Nzc1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTc4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTc4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTc4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTc4ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2OTc5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTc5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTc5NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk4MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk4MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk4MDk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjk4MTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk4MTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk4MTc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk4MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk4Mjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk4Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk4Mjk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjk4MzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk4MzQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk4MzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk4Mzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk4Mzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY5ODQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5ODQ2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2OTg0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTg0ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNjk4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk4NTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY5ODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5ODYwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2OTg2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTg2NzsxMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTY5ODgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5ODgzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE2OTg4NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTg4Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE2OTg5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTg5MjsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk5MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk5MjE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk5Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk5Mjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNjk5Mjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk5MzI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNjk5MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNjk5MzY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5OTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5OTQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTY5OTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTY5OTUwOzMzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTk4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTk4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE2OTk4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE2OTk4NjsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAwMDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAwMTI7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwMDQyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMDQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwMDQ1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMDQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDA1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDA1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzAwNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAwNTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMDU4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDA2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDA2MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzAwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAwNjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMDcyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDA3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDA3NzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMDg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDA5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDA5MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzAwOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAwOTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMTAwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDEwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDEwNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzAxMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAxMTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMTE5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDEyNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDEyOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzAxMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAxMzE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDE0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDE0MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzAxNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAxNDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMTQ3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDE1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDE1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzAxNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAxNjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMTY2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDE3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDE3NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzAxNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAxODA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMTgzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDE4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDE4NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzAxODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAxOTA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMTk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMjAxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDIwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDIwMzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE3MDIwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDIwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzAyMTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAyMTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMjE1Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTcwMjIyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDIyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDIyODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzAyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAyMzc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcwMjQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMjQ1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MDI0NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDI0OTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MDI1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDI1NDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAyNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAyNzA7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAyNzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAyNzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAyODE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzAyODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAyODU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAyOTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAyOTU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAzMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAzMDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAzMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAzMDc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzAzMTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAzMTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAzMTU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzAzMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAzMTg7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwMzMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMzMzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwMzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMzM2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwMzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMzM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwMzQwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwMzQ0OzM1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzAzNzk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAzODE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAzODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzAzODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzAzOTA7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwNDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNDE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwNDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNDIwOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDQzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDQ0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDQ0MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDQ0NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MDQ0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDQ0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDQ1MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDQ1NDsyNjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTcwNDgwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNDgyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwNDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNDg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwNDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNDkxOzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDUyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDUyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDUyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDUyMzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA1NDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA1NDQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzA1NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA1NDc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA1NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA1NTU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA1NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA1NTg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA1Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA1Njg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA1Njk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA1NzU7Mzk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3MDYxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDYxNzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MDYxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDYyMDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA2Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA2Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA2Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA2NDA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA2NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA2NTA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA2NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA2NTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA2NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA2NTU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA2NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA2NTg7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwNjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNjc1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwNjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNjc4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwNjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNjgxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwNjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNjg0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDY5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDcwMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDcwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDcwMzszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDcwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDcwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDcwODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDcxNDs2MzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTcwNzc3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwNzgxOzY0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzA4NDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA4NDk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzA4NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA4NTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA4NTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA4NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA4NTc7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwODcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwODczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwODc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwODc1OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwODc4OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwODg0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwODkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwODkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcwODkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcwODkzOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDkwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDkwOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MDkxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MDkxMTsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA5Mjg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5MzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA5MzQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA5Mzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5NDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA5NDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5NDY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzA5NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5NDk7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA5NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5NTc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA5NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5NjA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA5Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA5NzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5NzU7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzA5ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5ODM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA5ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA5OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzA5OTI7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzA5OTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzA5OTg7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzEwMDY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzEwMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzEwMDk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxMDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxMDIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxMDIyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxMDI3OzYwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzEwODc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzEwOTA7NjM7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3MTE1MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTE1Njs2MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTcxMjE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxMjE5OzM2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzEyNTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzEyNTg7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzEyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzEyNjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzEyNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzEyNjc7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxMjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxMjg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxMjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxMjg2OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTI5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTI5OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTMwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTMwMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTMwNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTMwNjs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTMxMzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzEzMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzEzMzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzEzMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzEzMzI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxMzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxMzQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxMzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxMzQ3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTM1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTM1OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTM2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTM2MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTM2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTM2ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTM2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTM3MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MTM3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTM3NTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MTM3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTM3ODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzEzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzEzODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzEzOTA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzEzOTU7NjA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3MTQ1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTQ1ODs2MzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTcxNTIxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxNTI0OzUyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzE1NzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzE1Nzk7MzQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3MTYxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTYxNjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTYyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTYyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTYyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTYyNTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzE2NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzE2NDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzE2NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzE2NDQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzE2NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzE2NTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzE2NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzE2NTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzE2NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzE2NTk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzE2NjE7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzE2Njg7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxNjg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxNjg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxNjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxNjg3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxNjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxNjk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxNjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxNjk5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTcxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTcxMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTcxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTcxNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTcxNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTcyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTcyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTcyMjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MTcyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTcyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTcyODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTczMzs2MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTcxNzkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxNzk2OzYyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzE4NTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzE4NjE7NTk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3MTkyMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTkyMzs0NDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTcxOTY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxOTcwOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxOTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxOTc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcxOTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcxOTc5OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTk5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTk5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MTk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MTk5ODs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjAwNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjAwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjAxMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjAxMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjAxNDs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjAyMjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIwMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIwMzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIwNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIwNDE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIwNTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIwNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIwNTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIwNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIwNTY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIwNTg7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIwNjU7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMDgyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMDg0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMDkzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMDk1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjEwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjEwNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjEwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjExMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjExMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjExMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjExNDs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjEyMTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIxMzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIxNDA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIxNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIxNTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIxNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIxNTI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMTY0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMTY3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMTY5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMTczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMTc0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMTc4OzczOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzIyNTE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIyNTM7MTc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3MjI3MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjI3MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MjI3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjI3NTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjI4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjI4NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjI4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjI4NzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIzMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIzMDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIzMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIzMDU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIzMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIzMDg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIzMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIzMTE7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMzI3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMzI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMzMwOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMzM4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyMzQwOzk7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyMzQ5OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjM2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjM2NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjM2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjM2ODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjM3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjM3NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjM3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjM3ODsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIzOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIzOTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzIzOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzIzOTc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI0MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI0MDQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI0MDY7OTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI0MTU7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyNDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNDMxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyNDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNDM0OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyNDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNDM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyNDQwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNDQ1OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjQ3Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjQ3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjQ3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjQ4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjQ4MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjQ4NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MjQ4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjQ4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjQ5MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjQ5NDsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI1MTU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI1MjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI1MjE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI1MjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI1MjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI1MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcyNTI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNTMyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MjUzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjUzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzI1MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI1Mzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcyNTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNTM5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MjU0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjU0OTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzI1NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI1NTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcyNTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNTY2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MjU3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjU3Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzI1Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI1Nzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcyNTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNTgyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MjU4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjU4Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzI1OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI1OTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcyNTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNTk1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MjYwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjYwNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzI2MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI2MDc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcyNjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNjE0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MjYxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjYxNzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcyNjI3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNjMwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MjYzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjYzMjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE3MjYzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjYzODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzI2Mzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI2NDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcyNjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNjQ0Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTcyNjUxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MjY1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjY1Nzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzI2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI2NjY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTcyNjcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNjc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MjY3NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjY3ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MjY4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjY4MzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI3MDM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI3MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI3MTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI3MTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI3MTQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzI3MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI3MTc7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyNzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNzM3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyNzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNzQwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTcyNzQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyNzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNzQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyNzQ3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyNzUxOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Mjc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mjc3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Mjc3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mjc3MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3Mjc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mjc3NjsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI3OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI3OTU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyODA4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyODExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyODEyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyODE4OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyODIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyODI0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjgzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjgzNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjgzODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3Mjg0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mjg0Mjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Mjg1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mjg1MzsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI4NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI4NzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI4Nzc7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyODkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyODk2OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjkxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MjkxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MjkxODsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI5MzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI5MzU7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyOTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyOTU3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTcyOTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTcyOTU5OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Mjk3NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mjk3ODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI5OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI5OTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzI5OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzI5OTc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzMwMDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzMwMDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMwMDU7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMDMyOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzA0NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzA0ODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MzA1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzA1MTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzMwNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMwNzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzMwNzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMwNzU7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMDkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMDk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMDk2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMDk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMDk5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMTAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MzEwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzEwNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzMxMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMxMDk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTczMTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMTE2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MzExOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzEyMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzMxMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMxMzA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MzE0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzE0MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzMxNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMxNDU7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xNzMxNDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMxNTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTczMTUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMTU1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MzE1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzE1Nzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE3MzE2NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzMxNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMxNzA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTczMTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMTc5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MzE4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzE4NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzMxODk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMxOTE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzMxOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMxOTY7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMjE0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMjIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMjIyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMjI1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTczMjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMjI4OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzI0ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzI1MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MzI1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzI1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzI1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzI1ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzI2MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3MzI2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzI2NTsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzMyODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMyODc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzMyODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMyOTA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMzAyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMzA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMzA1OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzMyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzMyNjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzMyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzMyOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzMzNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMzNDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzMzNDM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMzNDg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzMzNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMzNTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzMzNTM7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMzNTk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzMzNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzMzNjI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMzc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMzc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczMzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczMzc3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzM4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzM4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzM5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzM5MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzM5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzM5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzM5NTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzQwMjszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzM0MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM0MzU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczNDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczNDQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczNDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczNDQ5OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3MzQ2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzQ2MjsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzM0ODc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM0OTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzM0OTQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM0OTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzM1MDA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM1MDU7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzM1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM1MTE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzM1MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM1MjE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzM1Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM1Mjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzM1Mjk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM1MzU7Njk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3MzYwNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzYwODs2NDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTczNjcyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczNjc2OzE4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzM2OTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM2OTg7NDc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3Mzc0NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mzc0OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3Mzc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mzc1MjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzM3NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM3NjQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzM3NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM3Njc7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczNzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczNzk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczODAwOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczODA3OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTczODEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczODEzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczODE5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczODI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczODI2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczODMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczODMyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczODM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczODM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczODQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTczODQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczODQ0OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Mzg2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mzg2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Mzg2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mzg2NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3Mzg2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Mzg3MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mzg3MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Mzg3MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mzg3NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzM4Nzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM4ODE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTczODgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczODgzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3Mzg5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mzg5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzM4OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM4OTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTczOTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczOTAxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MzkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzkxMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzM5MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM5MTQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTczOTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczOTI0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3MzkyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3MzkyNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzM5MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM5MzM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTczOTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczOTQwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3Mzk0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mzk0MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzM5NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM5NDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTczOTUwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczOTU0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3Mzk1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Mzk1Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzM5NjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzM5Njc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTczOTY5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczOTcxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTczOTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTczOTc2OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDAwNTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDAxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDAxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDAxNjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NDAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDAxOTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQwMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQwMzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQwMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQwMzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQwMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQwMzg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQwNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQwNDE7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MDYyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MDYzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MDY3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc0MDczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MDc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MDc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MDc4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MDgxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MDg5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MDkyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDEwMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDEwNTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQxMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQxMjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQxMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQxMjQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzQxMjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQxMjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQxMzI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MTQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MTQ2OzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDE3MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDE3NTsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQxOTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQxOTU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MjA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MjA5OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDI0MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDI0NDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQyNTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQyNTk7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0Mjc4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MjgxOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDMwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDMwMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDMwNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NDMwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDMwODsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQzMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQzMjc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MzQwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MzQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0MzQzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MzQ1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NDM0ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDM1MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzQzNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQzNTQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc0MzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MzYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NDM2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDM2Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzQzNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQzNzI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc0MzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0MzgxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NDM4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDM4NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzQzOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQzOTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc0Mzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0Mzk4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NDQwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDQwNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzQ0MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ0MTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc0NDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NDEzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NDQxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDQxNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzQ0MjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ0MjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc0NDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NDI3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NDQzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDQzODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzQ0NDA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ0NDI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzQ0NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ0NDc7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NDY5OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NDc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NDc3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NDgwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NDkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NDkyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc0NDk2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NDk3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NTAwOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDUxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDUxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDUxOTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NDUyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDUyNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDUyODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NDUzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDUzMTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ1NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ1NDU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ1NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ1NDg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ1NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ1NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ1NTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ1NTY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ1NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ1NjM7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ1Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ1Njg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ1Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ1NzA7NTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NjIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NjI3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc0NjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NjMwOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NjM2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NjM5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc0NjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NjQ0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NjQ3OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDY2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDY2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDY2MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDY2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDY2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDY2Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDY3MjsyMDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc0NjkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0Njk1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc0Njk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0Njk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NzAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NzAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NzAzOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NzExOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NzE2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc0NzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NzIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NzIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NzI0Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NzMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0NzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0NzM0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDc0NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDc0OTsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ3NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ3NzQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ3NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ3Nzc7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzQ3ODI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ3ODQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ3ODk7MTY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3NDgwNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDgwODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDgxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDgxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDgxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDgxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDgxODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NDgyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDgyMjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDgzMDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDgzNTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDg0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDg0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDg0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDg0NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ4NTc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ4NjI7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ4Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ4Njg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ4Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ4NzA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0ODgyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0ODg3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0ODkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0ODk0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0ODk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0ODk2OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDkyNDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDkyOTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ5NDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ5NDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ5NTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ5NTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzQ5NTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ5NTc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzQ5NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzQ5NjA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0OTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0OTc1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0OTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0OTc4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0OTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0OTgxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc0OTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc0OTg0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDk5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDk5NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NDk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NDk5ODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUwMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUwMTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUwMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUwMTc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUwMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUwMjc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUwMzA7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUwMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUwMzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUwMzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUwMzk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzUwNDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUwNDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUwNTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUwNTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUwNTQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzUwNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUwNjI7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUwNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUwNjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUwNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUwNzE7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1MDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MDg4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1MDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MDkwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1MDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MTAwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1MTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MTAzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1MTA1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MTA5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1MTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MTE3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1MTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MTIwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTEzMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTEzMzszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUxNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUxNjQ7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUxNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUxNzM7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUxODE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUxODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUxODQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUxODY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc1MTg5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MTkzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTE5NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzUyMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUyMDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc1MjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MjA3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTIxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTIxMzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzUyMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUyMjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc1MjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MjI2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTIzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTIzNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzUyMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUyMzk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc1MjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MjQ1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTI1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTI1MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzUyNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUyNTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc1MjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MjU3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTI2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTI2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzUyNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUyNzA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc1Mjc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1Mjc3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTI4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTI4MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzUyODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUyODc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc1MjkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1Mjk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTI5NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTI5OTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NTMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTMwNDsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUzMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUzMjY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUzMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUzMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUzMzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUzMzc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzUzMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUzNDA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1MzUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MzUzOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc1MzU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1MzYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MzYzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc1MzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1MzY2OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTM4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTM4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTM4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTM4NjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzUzOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzUzOTk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU0MDI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU0MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU0MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU0MDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU0MTA7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzU0MTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU0MTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU0MjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU0MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU0MjQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU0MzI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU0MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU0MzU7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1NDQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NDQ4OzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTQ3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTQ3OTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTQ4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTQ4ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NTQ5MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTQ5NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTQ5Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTUwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTUwOTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU1Mjk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU1MzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU1MzI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU1MzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc1NTM3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NTQxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTU0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTU0MzsxMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc1NTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NTU3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTU2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTU2Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzU1NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU1Njc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc1NTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NTcxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTU3Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzU1ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU1ODQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc1NTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NTg3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NTU5NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTU5OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzU2MDE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU2MDM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzU2MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU2MDg7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1NjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NjI4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1NjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NjM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1NjM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NjM5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1NjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NjQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1NjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NjUxOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc1NjU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1NjU3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NjYwOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTY3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTY3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTY3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTY3OTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NTY4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTY4NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTY4ODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTY5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTY5NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTY5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTY5OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU3MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU3MTI7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1NzI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NzMxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc1NzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1NzM0OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTc0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTc0ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTc1MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTc1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTc1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTc1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTc1OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NTc2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTc2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTc2NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTc2OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NTc3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTc3MjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU3ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU3ODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU3ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU3ODc7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1Nzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1Nzk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1ODAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1ODAxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1ODAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1ODA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1ODA1OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1ODExOzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTg0NDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU4NTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzU4NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzU4NTg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc1ODcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc1ODcxOzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTg5Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTkwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTkwMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTkwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTkwNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTkxMTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NTkxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTkxNzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTkyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTkyNzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTkzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTkzNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NTkzNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NTk0MDs2OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc2MDA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MDEyOzY0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzYwNzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYwNzk7MTg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3NjA5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjEwMDs0NzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc2MTQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MTUwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc2MTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MTUzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjE2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjE2NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjE2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjE2ODszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzYxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyMDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzYyMDE7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyMDc7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzYyMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyMTM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzYyMTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyMjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzYyMjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyMjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzYyMzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzYyMzQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyMzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzYyMzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyMzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2MjQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MjQ1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NjI0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjI0Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzYyNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyNTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2MjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MjU5OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzYyNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyNzE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2Mjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2Mjc2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NjI4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjI4NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzYyODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYyODk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2MjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MjkzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NjI5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjI5OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzYzMDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYzMDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2MzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MzEwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTc2MzEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MzE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NjMxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjMyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzYzMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYzMjI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xNzYzMjk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2MzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MzM1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NjM0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjM0MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzYzNDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzYzNDk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2MzUxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MzUzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc2MzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2MzU4OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjM3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjM3Njs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjM4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjM4MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjM4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjM4NzszMzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc2NDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NDIxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc2NDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NDI0OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjQzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjQzODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjQ0MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjQ0NDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NjQ1MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjQ1MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjQ1NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NjQ1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjQ1ODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjQ2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjQ2ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjQ3MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY0ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY0ODI7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY0OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY0OTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY0OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY0OTM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY1MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY1MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY1MDU7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2NTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NTI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2NTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NTI5OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjU0MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjU0NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NjU0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjU0ODsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY1NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY1NjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY1Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY1Njg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2NTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NTc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2NTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NTgxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2NTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NTkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2NTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NTkzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjYwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjYwNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NjYxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjYxMTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY2MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY2MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY2Mjc7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY2MzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY2Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY2Mzg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2NjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NjQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2NjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NjUxOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjY3MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjY3NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NjY3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjY3OTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjY4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjY4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjY4ODsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY3MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY3MDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY3MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY3MDg7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2NzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NzIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2NzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2NzI0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjczNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjczNTs2MzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc2Nzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2Nzk5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc2ODAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2ODAzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjgxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjgxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjgxODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjgyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjgyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NjgyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjgyODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY4NDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY4NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY4NDM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY4NTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY4NTM7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc2ODc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2ODc2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Njg4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Njg4Nzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Njg5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Njg5NTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY5MDk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY5MTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzY5MTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY5MTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2OTE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2OTIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NjkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NjkyMzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2OTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2OTM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NjkzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Njk0MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzY5NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY5NDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2OTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2OTUzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3Njk2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Njk2MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzY5NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY5NjU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2OTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2OTcxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3Njk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Njk3NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzY5Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY5Nzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2OTgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc2OTg3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3Njk4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Njk4OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzY5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzY5OTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc2OTk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MDAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NzAwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzAwNDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE3NzAwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzAxMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzcwMTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcwMTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc3MDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MDE2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTc3MDIzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NzAyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzAyOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzcwMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcwMzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc3MDQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MDQ0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3NzA0NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzA0ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NzA1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzA1MzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzcwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcwNzI7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzcwNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcwNzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzcwODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcwODM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzcwODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcwODc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzcwOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcwOTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzcwOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcwOTk7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3MTE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MTE5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc3MTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MTIzOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3MTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MTMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3MTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MTM0OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzE1MDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzE1Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzE2NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzcxNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcxNzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzcxNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcxNzk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3MTk1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MTk4OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzIxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzIxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzIxNzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzcyMzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzcyMzg7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3MjUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MjU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3MjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MjU2OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzI3MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzI3Njs1NzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc3MzMzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MzM2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc3MzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MzM5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3MzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MzQ5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3MzUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3MzUyOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzM2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzM2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzM3MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzM3NDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NzM3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzM3NzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzczODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzczOTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzczOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzczOTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzczOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzczOTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzczOTY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc0MDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzc0MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc0MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc0MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc0MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc0MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc0MDk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc0MTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc0MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc0MjE7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NDM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NDM5Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NDQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NDUwOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzQ2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzQ2ODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc0ODA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc0ODY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc0OTY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc0OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc0OTk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NTEyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzUyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzUyMzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NzUyODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzUzMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzUzNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzUzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzUzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzUzOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzU0MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NzU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzU0NTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc1NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc1NTY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc1NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc1NTk7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NTc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NTc4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NTgyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc3NTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NTg1OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzU5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzU5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzYwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzYwMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzYwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzYwNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzYxMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3NzYxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzYxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzYxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzYxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzYxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzYxODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc2Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc2Mjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc2MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc2MzE7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NjQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NjQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NjUwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NjYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NjYyOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3NzY4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3NzY4MTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc2OTQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc3MDA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc3MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc3MTA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc3MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc3MTM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc3MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc3MjM7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NzM3OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc3NzQyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NzQ0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NzQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NzQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NzUyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3NzUzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NzU2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc3NzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3NzU5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzc3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzc3MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzc3NTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3Nzc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzc3ODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzc4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzc4ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzc5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzc5MTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc4MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc4MDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc4MDk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc4MTU7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3ODQwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3ODQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3ODQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3ODQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3ODQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3ODUyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc3ODU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3ODU5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc3ODYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3ODYyOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzg3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzg4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzg4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzg4MjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc4OTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc4OTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc4OTg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzc5MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc5MDI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc5MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc5MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc5MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzc5MTQ7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc3OTM3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3OTQxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc3OTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc3OTQ1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzk1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzk2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzk2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzk2Mjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzk3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzk3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzk3Mzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzk4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzk4MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3Nzk4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3Nzk4NTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzc5OTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgwMDA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzgwMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgwMDQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4MDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4MDE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4MDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4MDE5OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODA1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODA1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODA1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODA1NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzgwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgwNjg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4MDgwOzg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4MDg4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODEwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODEwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODEwNTsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzgxMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgxMzA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4MTQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4MTQ1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODE1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODE1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODE1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODE2MDsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzgxODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgxODM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzgxOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgxOTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzgxOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgxOTU7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4MjExOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4MjE1OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODI1MTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzgyNjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgyNjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzgyNjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgyNzI7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4Mjg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4MjkxOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODMxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODMxNzsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzgzMzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgzNDM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzgzNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzgzNDY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4MzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4MzU3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4MzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4MzYwOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODM3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODM3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODM3OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODM4MzsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzg0MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg0MDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzg0MDc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg0MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzg0MTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg0MTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc4NDE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NDE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3ODQxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODQyMDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzg0Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg0Mjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc4NDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NDMyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3ODQzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODQzODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzg0NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg0NDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc4NDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NDUxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3ODQ2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODQ2MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzg0NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg0NjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc4NDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NDY5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3ODQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODQ3Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzg0ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg0ODE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc4NDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NDg0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3ODQ5MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODQ5NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzg0OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg0OTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc4NTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NTAxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3ODUwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODUwOTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xNzg1MTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg1MTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTc4NTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NTIxOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTc4NTI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NTI3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE3ODUyOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODUzMTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3ODUzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODUzNjszNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzg1NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg1NzE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzg1Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg1Nzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzg1Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg1ODI7NDI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4NjI0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NjI5OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODY1Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODY2MTszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzg2OTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg2OTY7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc4NzIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4NzI3OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3ODc1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODc2MjsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzg3Nzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzg3ODE7Njg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3ODg0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODg1MDs1MjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc4OTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4OTAzOzU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3ODkwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3ODkwOTs2NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc4OTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc4OTc1OzY4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzkwNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzkwNDQ7NzA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3OTExNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTExNTszOTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc5MTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5MTU1OzE4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzkxNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzkxNzQ7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc5MTkwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5MTk0OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTIxNDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTIxOTszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzkyNTA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzkyNTU7Mjg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc5MjgzOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5MjkwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc5MjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5MjkzOzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTMyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTMyNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTMyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTMyNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTMyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTMzMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTMzMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTMzNTs1NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc5MzkxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5MzkzOzE4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xNzk0MTE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk0MTM7NjU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3OTQ3ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTQ4MDsxODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc5NDk4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5NTAwOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTUyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTUyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTUyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTUzMDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE3OTUzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTUzMzszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk1NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk1NjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk1NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk1Njc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk1Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk1NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk1NzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk1NzU7MTk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3OTU5NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTU5NjsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk2MTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk2MjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk2MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk2MjU7NzE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE3OTY5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTY5Nzs2NzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTc5NzY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5NzY1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc5NzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5NzY4OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTc5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTc5NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTc5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTc5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTgwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTgwMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTgwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTgwNDszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk4MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk4MzU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk4Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk4Mzg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk4NDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk4NDI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk4NDY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xNzk4NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk4NTA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk4NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk4NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk4NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk4NjI7NDU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc5OTA3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5OTExOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc5OTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5OTE1OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc5OTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5OTIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc5OTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5OTI0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc5OTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5OTM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc5OTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5OTM2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTk0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTk0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE3OTk0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE3OTk0OTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk5Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk5NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xNzk5NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xNzk5NzI7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTc5OTgyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5OTg4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTc5OTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTc5OTkxOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDAwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDAwODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDAxMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDAxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDAxNjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDAxOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDAyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDAyMTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDAyOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDAzNDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDAzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDA0MDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDA0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDA0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDA0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDA0ODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODAwNTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODAwNjQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODAwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODAwNzI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwMDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMDg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwMDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMDg3OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgwMDkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwMDkzOzEwOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDEwMzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MDEwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDEwNjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDExMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDExNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDExNjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MDEyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDEyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDEyMzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDEyOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODAxNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODAxNDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODAxNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODAxNDQ7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwMTYzOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMTY5OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDE4Njs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MDE5MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDE5Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDE5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDE5OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDIwNDsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODAyMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODAyMjE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwMjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMjMyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwMjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMjQwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDI1Mjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDI1NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MDI1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDI2MDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDI2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDI2NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDI2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDI3MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MDI3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDI3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDI3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDI3Nzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDI4MzszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODAzMTQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODAzMTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODAzMjA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODAzMjU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwMzM4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMzQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwMzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMzQ0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgwMzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMzQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwMzUwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMzU1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwMzY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMzY1Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgwMzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwMzczOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MDM5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDM5NjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODA0MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA0MDg7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODA0MTM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODA0MTU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA0MjA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODA0Mjk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA0MzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODA0MzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA0Mzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODA0Mzg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA0NDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODA0NDE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA0NDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNDQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNDQ5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDQ1MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA0NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA0NTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNDYzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDQ3MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA0NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA0NzM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNDgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDQ4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDQ4Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA0OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA0OTE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNDk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNDk5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDUwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDUwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA1MTE7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xODA1MTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA1MTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNTE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNTIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDUyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDUyMzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE4MDUzMDsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNTQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDU0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDU0Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA1NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA1NTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNTU5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDU2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDU2MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA1NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA1NjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNTcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNTc1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDU3Nzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE4MDU4NDsxMzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNTk4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDYwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDYwMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA2MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA2MDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNjExOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDYxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDYxNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA2MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA2MjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNjIzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDYzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDYzMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA2MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA2MzU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNjQxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDY0Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDY1MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA2NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA2NTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNjU2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDY1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDY1OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA2NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA2NjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNjY5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDY3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDY3Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA2ODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA2ODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNjg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNjg1Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTgwNjkyOzIyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA3MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA3MTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNzIyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDcyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDcyNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA3Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA3MzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNzM1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDczNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDczODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA3NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA3NDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNzQ3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDc0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDc1MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA3NTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA3NjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNzYzOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTgwNzcwOzE4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA3ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA3ODk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwNzk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwNzk2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDc5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDc5OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA4MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA4MDQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwODA5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDgxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDgxMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA4MTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwODIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwODIxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDgyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDgyNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA4MzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA4MzU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwODM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwODM3Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTgwODQ0OzIyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA4NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA4Njc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwODczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwODc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDg3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDg3Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA4ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA4ODM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwODg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDg5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDg5Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA4OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA4OTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwOTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwOTAxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDkwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDkwNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA5MTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA5MTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwOTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwOTE3Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTgwOTI0OzE4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA5NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA5NDM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwOTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwOTUwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDk1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDk1MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA5NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA5NTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwOTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwOTYzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDk2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDk2ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA5NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA5NzI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwOTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwOTc4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDk4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDk4MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODA5ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODA5ODQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgwOTkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgwOTk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MDk5NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MDk5OTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MTAwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTAwNDszNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEwNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEwNDE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEwNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEwNDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEwNDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEwNTI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODEwNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEwNTY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMDY2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMDcwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgxMDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMDc0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTA4NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTA4OTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MTA5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTA5NzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODExMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODExMTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODExMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODExMTc7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMTQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMTQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMTQ0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMTQ3OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTE2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTE2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTE2ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTE3MDs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTE3ODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MTE4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTE4MTsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEyMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEyMDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEyMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEyMDc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEyMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEyMTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEyMTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEyMTU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMjI3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMjMwOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTI1Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTI1NzsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEyNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEyODA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEyODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEyODM7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEyODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEyODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEyOTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEyOTM7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMzEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMzE1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTMyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTMzMDsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEzNTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODEzNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODEzNTk7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxMzc4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxMzgxOzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTQwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTQwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTQwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTQxMDsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODE0Mjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE0MzI7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNDYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNDY1OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTQ4ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTQ5MTszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODE1MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE1MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODE1MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE1MjQ7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNTQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNTUwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNTYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNTYyOzM3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTU5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTYwMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODE2MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE2MTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODE2MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE2MTY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODE2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE2MjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODE2Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE2Mjg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNjM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNjQxOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTY2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTY2MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTY2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTY2NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODE2NzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE2Nzc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODE2Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE2ODA7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNjk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNzAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNzAxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNzA1OzM0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTczOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTc0MDsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODE3NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE3NjA7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNzg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNzg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxNzg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxNzkxOzQ5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xODE4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE4NDE7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODE4NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODE4NDQ7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxODYzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxODY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxODY2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgxODcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxODcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxODcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgxODczOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgxODc3OzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTkxNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTkxODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MTkxOTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MTkyNTs3NzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTgyMDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyMDAzOzcwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xODIwNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODIwNzQ7NzQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE4MjE0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjE0OTsxNzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTgyMTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyMTY3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgyMTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyMTcxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MjE4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjE4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MjE4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjE4NjsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODIyMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODIyMDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODIyMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODIyMTE7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgyMjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyMjM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgyMjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyMjM2OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MjI1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjI1ODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MjI2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjI2MTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODIyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODIyNzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODIyNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODIyNzY7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgyMjg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyMjkwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MjMwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjMwMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MjMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjMwNDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODIzMTc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODIzMTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODIzMjA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODIzMjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyMzI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyMzI4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjMyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjMzMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODIzMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODIzMzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyMzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyMzQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjM0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjM0Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODIzNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODIzNTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyMzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyMzYxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjM2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjM2NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODIzNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODIzNjg7MTY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjM4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjM4NTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyMzk2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNDAwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjQwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjQwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI0MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI0MDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNDEwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjQxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjQxOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI0MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI0MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNDMwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjQzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjQzNjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI0NDY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNDU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjQ1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjQ2MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI0NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI0Njc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNDc1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNDc5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjQ4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjQ4MTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNDk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjQ5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjQ5ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI1MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI1MDY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNTEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjUxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjUxNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI1MjM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNTI5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjUzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjUzNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI1NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI1NDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNTQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNTUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjU1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjU1MzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE4MjU1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjU1OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI1NjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI1NjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNTY1Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTgyNTcyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjU3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjU3ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI1ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI1ODM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNTkwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjU5Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjYwMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI2MDI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI2MDQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODI2MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI2MDk7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgyNjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNjQwOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgyNjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNjQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgyNjQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNjUxOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgyNjU5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNjYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgyNjYyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNjY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjY2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjY3MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI2NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI2NzI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNjc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNjc5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjY4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjY4NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI2ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI2ODY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNjk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNjk2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjY5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjcwMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI3MDM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNzExOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNzE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjcxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjcxNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI3MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI3MjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNzI2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjczMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjczMTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI3NDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNzQ0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mjc0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mjc1MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI3NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI3NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNzU5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mjc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mjc2NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI3Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI3Njk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNzcyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mjc3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mjc4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI3ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI3ODQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyNzg5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mjc5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mjc5NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI3OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI3OTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyNzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyODAwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjgwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjgwNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI4MTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyODE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyODE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjgxODsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE4MjgxOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI4Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI4Mjg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyODMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyODMzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjgzNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjgzODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI4Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI4NDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyODQ1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mjg0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mjg0ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI4NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI4NTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyODYzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mjg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mjg2ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI4NzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyODc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyODc2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mjg4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mjg4MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI4ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI4ODQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyODkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyODkyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mjg5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mjg5NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI4OTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI5MDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyOTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyOTA1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjkxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjkxNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI5MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI5MTk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyOTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyOTI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MjkzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MjkzMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI5MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI5MzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyOTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyOTM5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mjk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mjk0NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI5NTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI5NTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyOTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyOTU4OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTgyOTYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyOTY0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mjk2NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mjk2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI5Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI5NzA7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xODI5Nzc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyOTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyOTgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4Mjk4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mjk4Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODI5OTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODI5OTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgyOTk3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgyOTk5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzMDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMDA0OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzAyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzAyNTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzAzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzAzMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzAzMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzAzNjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MzA0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzA0MzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODMwNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODMwNTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODMwNTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODMwNjM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODMwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODMwNjg7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMDg4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMDkyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzMDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMDk3OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzEyMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzEyNDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MzEyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzEyOTsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODMxNTY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODMxNjE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMTcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMTc0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzMTc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMTc5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMTg0OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzMTg5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMTkwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMTk0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzMTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMTk5OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzIxOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzIyMzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MzIyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzIyODsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODMyNTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODMyNTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODMyNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODMyNTk7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMjg1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMjkwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzMjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMjkzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzMwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzMwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzMwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzMwODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODMzMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODMzMjA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODMzMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODMzMjM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODMzMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODMzMjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODMzMjc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODMzMzM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMzQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMzQ2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzMzUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMzUxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMzU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMzU4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzMzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMzYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzMzY0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMzcwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzMzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzMzczOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzM4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzM4NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzM4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzM4NzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODM0MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM0MDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODM0MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM0MDY7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzNDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNDI1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzNDI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNDI4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzNDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNDMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzNDMyOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNDM5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzQ1MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzQ1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzQ1Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MzQ1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzQ1Nzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzQ2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzQ2NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzQ2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzQ3MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzQ3NTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4MzQ4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzQ4MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzQ4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzQ4NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzQ4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzQ4ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzQ5MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODM0OTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM0OTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgzNDk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNDk5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MzUwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzUwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODM1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM1MTE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgzNTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNTE4OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODM1Mjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM1MzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgzNTM0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNTM2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzNTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNTQxOzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzU2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzU2ODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzU3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzU3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzU3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzU3OTs1NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODM2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM2MzY7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODM2NDE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODM2NDM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM2NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODM2NDY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM2NDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgzNjUxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNjU0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MzY1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzY1NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODM2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM2NjA7MTM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MzY3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzY3NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODM2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM2ODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgzNjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNjg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4MzY4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzY5MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODM2OTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM3MDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTgzNzAyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNzA0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzNzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNzA5OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzczMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzczMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzczMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzczNjs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4Mzc0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mzc0MjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODM3NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM3NTM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzNzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNzY0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzNzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzNzY2OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4Mzc4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mzc4NTszMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODM4MTg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODM4MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM4MjI7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzODQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzODQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzODQzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzODQ3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzODUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzODU0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzODU5OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4Mzg4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mzg4MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4Mzg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mzg4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4Mzg4Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mzg5Mjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzkwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzkwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4MzkwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4MzkwMzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODM5MjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM5MjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODM5MjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM5Mjg7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODM5MzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODM5MzQ7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTgzOTcxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTgzOTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTgzOTc1OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4Mzk5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Mzk5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDAwMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDAwNDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NDAxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDAxMTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NDAxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDAxNjszNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQwNTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQwNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQwNTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQwNTU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQwNjA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQwNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQwNjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQwNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQwNzE7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0MDgyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg0MDg2OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDEwNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDEwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDEwOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDExMzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NDExOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDEyMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NDEyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDEyNTszNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQxNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQxNjM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQxNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQxNjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQxNjc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQxNzI7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQxNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQxNzg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQxODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQxODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQxODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQxOTA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0MjAxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg0MjA1OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDIyNjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDIzMTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDI0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDI0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDI0MjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQyNTQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQyNTk7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQyNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQyNjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQyNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQyNzA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0MjgyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0Mjg2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0Mjg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0MjkwOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0MjkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0Mjk2OzQwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDMzNjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NDMzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDM0MDsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQzNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQzNjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQzNjg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQzNzI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODQzNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQzNzk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODQzODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQzODQ7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NDE1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NDE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NDE5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NDI0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NDMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NDM1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDQ0OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDQ1MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDQ1NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDQ1ODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NDQ2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDQ2NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NDQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDQ3MDszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ1MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ1MDI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ1MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ1MDY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ1MTE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODQ1MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ1MTU7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ1MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ1MjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ1MjM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ1MjU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ1MzA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODQ1MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ1MzM7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NTQ3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NTUzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NTU2OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDU3Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDU4MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NDU4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDU4NDsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ2MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ2MDM7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ2MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ2MDk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ2MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ2MTI7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NjMwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NjM1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg0NjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NjM4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDY1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDY1Mzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDY1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDY1OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDY2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDY2MjsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ2ODI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ2ODc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODQ2ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ2OTA7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NzA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NzA3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NzEzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0NzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0NzE2OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDczNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDc0MDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDc0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDc0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDc1MTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDc1Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDc2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDc2Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDc2Njs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NDc3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDc3Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NDc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDc3ODszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ4MTA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ4MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ4MTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ4MTQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ4MTk7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ4Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ4Mjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ4Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ4MzA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0ODQxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg0ODQ1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDg1Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDg2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDg2MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDg2NDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDg2Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDg3MjsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ4OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ4OTc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODQ5MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODQ5MDE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0OTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0OTEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg0OTEzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0OTE3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg0OTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0OTI0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg0OTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg0OTI5OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDk0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDk0Nzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDk1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDk1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NDk1NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NDk2MDszODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODQ5OTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUwMDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUwMDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUwMDY7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUwMDk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUwMTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUwMTI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUwMTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1MDE3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MDIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTAyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTAyMzsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1MDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MDM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTAzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTAzOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODUwNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUwNDU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1MDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MDUwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTA1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTA1Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODUwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUwNjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1MDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MDY1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTA3MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTA3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODUwNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUwNzc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1MDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MDg3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTA5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTA5Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODUwOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUxMDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1MTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MTA0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTEwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTEwOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODUxMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUxMTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1MTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MTE5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODUxMjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUxMzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1MTM0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MTM2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg1MTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MTQxOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTE2MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTE2MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTE2NjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NTE2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTE2OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTE3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTE3OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTE4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTE4Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NTE4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTE4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTE4ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTE4OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTE5MzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUyMTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUyMTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUyMTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUyMTk7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUyMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUyMjg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUyMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUyMzA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODUyMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUyMzQ7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg1MjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MjY0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTI3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTI3NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NTI3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTI4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTI4MTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUyOTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUyOTU7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg1MzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MzA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg1MzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1MzA4OzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTMzMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTMzNjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NTMzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTMzOTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUzNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUzNTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUzNTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUzNTU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUzNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUzNjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODUzNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUzNjU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODUzNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODUzNjk7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg1MzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1Mzk0OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTQxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTQxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTQxNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTQxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTQxNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTQxOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODU0MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODU0MjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1NDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NDI3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTQzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTQzNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODU0Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODU0NDA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1NDQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NDUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTQ1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTQ1MjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE4NTQ1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTQ1ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODU0NTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODU0NjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1NDYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NDY0Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTg1NDcxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTQ3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTQ3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODU0ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODU0ODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1NDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NDg1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTQ4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTQ4OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODU0OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODU0OTc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1NTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NTA1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4NTUwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTUwODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODU1MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODU1MTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg1NTIwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NTIyOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg1NTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NTI5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg1NTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NTM0OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTU0NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NTU1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTU1MTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTU1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTU1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTU2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTU2MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NTU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTU2NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODU1Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODU1Nzk7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg1NTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NTk3OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTYxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTYxNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NTYxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTYxODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODU2Mjg7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODU2MzQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg1NjQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NjUxOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTY3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTY3MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTY3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTY3NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NTY3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTY3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTY4Mjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NTY4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTY4OTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTY5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTY5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTY5OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTcwMzsxNTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTg1NzE4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NzIwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg1NzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NzI1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTczNjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTc0MTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTc1MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTc1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTc1MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODU3NjQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODU3Njk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg1Nzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NzgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg1NzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1NzgyOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg1NzkwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1Nzk1OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTgxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTgxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NTgxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTgxNDsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODU4Mzc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODU4NDI7NjY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE4NTkwODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NTkxMTs2OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTg1OTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg1OTgzOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjAwNDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjAwOTs1MTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTg2MDYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2MDYzOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjA3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjA3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjA3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjA3OTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODYwOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODYwOTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODYwOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODYwOTg7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2MTIxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2MTI2Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2MTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2MTM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2MTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2MTM2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjE0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjE0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjE0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjE0OTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODYxNjM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODYxNjg7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2MTgzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2MTg3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2MTg5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2MTk0OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2MTk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2MjAwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2MjA0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2MjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2MjA5OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjIyMjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjIyNzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjIzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjIzNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjIzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjIzOTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODYyNTI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODYyNTc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2MjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2MjY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2MjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2MjcwOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2Mjc4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2MjgzOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjI5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjMwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjMwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjMwMjsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODYzMjU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODYzMzA7NjY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE4NjM5NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjM5OTs2OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTg2NDY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2NDcxOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjQ5Mjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjQ5Nzs1MTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTg2NTQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2NTUxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjU2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjU2NzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODY1ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY1ODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODY1ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY1ODY7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2NjA5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2NjE0Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2NjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2NjIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2NjIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2NjI0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjYzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjYzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjYzNzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODY2NTE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY2NTY7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2NjcxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2Njc1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2Njc3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2NjgyOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2Njg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2Njg4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2NjkyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2Njk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2Njk3OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NjcxMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NjcxNjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODY3MzA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY3MzU7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2NzUwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2NzU0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2NzU2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2NzYxOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2NzY2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2NzY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2NzcxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2Nzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2Nzc2OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4Njc4ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Njc5MzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODY4MDU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY4MTA7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2ODI1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2ODI5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2ODMxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2ODM2OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2ODQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2ODQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2ODQ2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2ODUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2ODUxOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4Njg3MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Njg3NTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODY4OTQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY4OTk7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2OTE0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2OTE4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2OTIwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2OTI1OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2OTMwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2OTMxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2OTM1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2OTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg2OTQwOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4Njk1NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Njk2MDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODY5NzU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODY5ODA7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg2OTk1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg2OTk5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3MDAxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MDA2OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg3MDExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3MDEyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MDE2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg3MDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MDIxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzAzMjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzAzNzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzA0Njs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzA1MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzA1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzA1MzsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODcwNzQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODcwNzk7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3MDk0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg3MDk4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3MTAwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MTA1OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg3MTEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3MTExOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MTE1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg3MTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MTIwOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzEzMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzEzODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODcxNDk7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODcxNTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODcxNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODcxNTY7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3MTc3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MTgyOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzE5Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzIwMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzIwMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzIwODs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzIxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzIxNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzIxODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzIyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzIyMzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODcyNDA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODcyNDU7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3MjYyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MjY3OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzI4Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzI4NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzI4ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzI5Mzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzI5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzI5OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzMwMzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzMwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzMwODsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODczMjE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODczMjY7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3MzM5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3MzQ0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzM1OTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzM2MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzM2NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzM3MDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzM3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzM3Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzM4MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzM4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzM4NTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODczOTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODc0MDQ7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3NDIxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3NDI2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzQ0MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzQ0NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzQ0Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzQ1Mjs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzQ1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzQ1ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzQ2Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzQ2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzQ2NzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODc0Nzk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODc0ODQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3NDk5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3NTA0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzUxOTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzUyMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzUyNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzUzMDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzUzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzUzNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzU0MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzU0NTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODc1NjE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODc1NjY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3NTgwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3NTg1OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzYwMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzYwNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzYwNjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzYxMTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzYxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzYxNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzYyMTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzYyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzYyNjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODc2NDA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODc2NDU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3NjU3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3NjYyOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzY3Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzY4MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzY4Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzY4ODs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzY5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzY5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzY5ODsxNTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTg3NzEzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3NzE1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg3NzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3NzIwOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzczODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4Nzc0MzsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODc3NjM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODc3Njg7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODc3NzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODc3NzQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODc3Nzg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODc3ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODc3ODM7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3Nzk3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3ODAyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzgxNDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzgxOTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzgyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzgyNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzgyOTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4NzgzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzgzNDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODc4NTQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODc4NTk7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3ODgxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3ODg2OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg3ODkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3ODkyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3ODk2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg3OTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3OTAxOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4NzkyMjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4NzkyNzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODc5NDE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODc5NDY7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3OTc4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3OTgzOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg3OTg4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg3OTg5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3OTkzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg3OTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg3OTk4OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODAxNzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODAyMjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODgwMzQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODgwMzk7Mjg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4MDY3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4MDcyOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg4MDc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4MDc4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4MDgyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg4MDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4MDg3OzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODExMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODExODsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODgxNDY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODgxNTE7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4MTgzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4MTg4OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg4MTkzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4MTk0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4MTk4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg4MjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4MjAzOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODIyNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODIzMDsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODgyNTQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODgyNTk7Mjg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4Mjg3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4MjkyOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg4Mjk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4Mjk4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4MzAyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg4MzA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4MzA3OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODMyNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODMzMDszOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODgzNjk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODgzNzQ7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODgzNzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODgzODA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODgzODQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODgzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODgzODk7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4NDA5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4NDE0OzQxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODQ1NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODQ2MDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODQ2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODQ2Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODQ3MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODQ3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODQ3NTsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODg0OTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODg1MDQ7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4NTMwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4NTM1OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODU2Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODU3Mjs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODU3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODU3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODU4Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODU4NzsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODg2MDc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODg2MTI7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4NjM0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4NjM5OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODY2Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODY3Mjs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODY3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODY3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODY4Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODY4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODY4NzsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODg3MDg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODg3MTM7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4NzMwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4NzM1OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODc2Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODc3Mjs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODc3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODc3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODc4Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODc4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODc4NzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODg4MDY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODg4MTE7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4ODI2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4ODMxOzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODg1OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODg2NDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODg2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODg3MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODg3NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODg3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODg3OTsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODg5MDI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODg5MDc7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg4OTIxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg4OTI2OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODk1ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODk2Mzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODk2ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4ODk2OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODk3Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4ODk3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4ODk3ODsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODg5OTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODkwMDQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MDE2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MDIxOzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTA0OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTA1NDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4OTA1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTA2MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTA2NDsyMDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTg5MDg0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MDg2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg5MDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MDkxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MDk4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MTAzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MTA5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MTE0OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg5MTE5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MTIwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MTI0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg5MTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MTI5Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MTM3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MTQyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MTQ5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MTU0OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg5MTU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MTYwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MTY0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg5MTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MTY5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MTc4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MTgzOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MTkxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MTk2OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg5MjAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MjAyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MjA2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg5MjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MjExOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTIzMDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTIzNTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODkyNDk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODkyNTQ7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODkyNTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODkyNjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODkyNjQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODkyNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODkyNjk7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5Mjg0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5Mjg5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTMwMDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTMwNTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4OTMxMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTMxMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTMxNTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4OTMxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTMyMDsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODkzNDQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODkzNDk7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MzcyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5Mzc3OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg5MzgyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5MzgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5Mzg3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTg5MzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5MzkyOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTQxMjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTQxNzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk0MzY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk0NDE7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODk0NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk0NDc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk0NTE7MTg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE4OTQ2OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTQ3MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4OTQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTQ3NjsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk0OTY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk1MDE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk1MTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk1MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk1MTM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5NTI0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NTI2OzMzOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xODk1NTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk1NjI7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xODk1Njc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk1Njg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk1NzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk1NzI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk1NzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk1NzU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk1Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5NTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NTgzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTU4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTU4NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk1OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk1OTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5NjAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NjAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTYwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTYwNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk2MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk2MTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5NjE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NjIxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTYyMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTYyNTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4OTYzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTYzMzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTY0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTY0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTY0MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTY0Njs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE4OTY1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTY1Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTY1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTY2MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE4OTY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTY2MzsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk2ODk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xODk2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk2OTI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5NzAzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NzA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTg5NzA2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NzA4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTcxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTcxNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk3MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk3MTY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5NzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NzI0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTczMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTczMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk3MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk3MzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5NzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NzQyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTc0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTc0OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk3NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk3NTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5NzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NzU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTc2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTc2MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk3NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk3Njc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5NzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NzcyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTc3NzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5Nzg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5NzkwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTc5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTc5Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk4MDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk4MDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5ODA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5ODA2OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk4MTg7MTg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTgzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTgzNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk4Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk4NDA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5ODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5ODQ2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTg0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTg1MDsxODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5ODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5ODY5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTg3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTg3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk4NzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk4Nzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5ODgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5ODg0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTg4Njs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE4OTg5NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk4OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk4OTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5OTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5OTAyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTkwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTkwNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk5MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk5MTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5OTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5OTE5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTkyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTkyMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk5Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk5Mjk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5OTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5OTMxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTkzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTkzNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk5NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk5NDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5OTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5OTQ3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk5NTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk5NjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5OTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5OTYyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTk2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTk2ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk5NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk5NzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5OTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5OTc1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTk4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTk4MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xODk5ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xODk5ODg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTg5OTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTg5OTkxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE4OTk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE4OTk5ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTAwMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTAwMDE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwMDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMDA3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDAwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDAwOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTAwMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTAwMTQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDAyNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDAyNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTAwMjk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTAwMzE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTAwMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTAwMzk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwMDU1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkwMDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMDU5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwMDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMDY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwMDY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMDcxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkwMDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMDc1OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwMDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMDgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwMDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMDgyOzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDExNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDExNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5MDEyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDEyMTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTAxMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTAxMzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTAxMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTAxMzQ7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwMTY0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMTY4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkwMTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMTcyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDE4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDE4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDE4Nzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDE5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDE5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDE5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDE5NjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTAyMDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTAyMTA7NjM7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE5MDI3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDI3NDs2NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTkwMzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwMzQwOzQ0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0xOTAzODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTAzODU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTAzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTAzOTI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwNDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNDA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwNDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNDA3OzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDQzODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDQ0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDQ0MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDQ0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA0NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA0NDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNDUxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDQ1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDQ1OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA0NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA0Njc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNDcxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDQ3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDQ3ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA0ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA0ODE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNDkwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDQ5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDQ5NzsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNTEyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDUxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDUxNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA1MTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA1MjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNTI1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDUzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDUzMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA1NDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA1NDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNTQ1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNTQ5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDU1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDU1MTs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE5MDU1OTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNTcwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDU3OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA1ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA1ODY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNTg5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDU5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDU5NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA2MDU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNjE1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDYyMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDYyNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA2MjY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA2Mjg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNjMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNjMxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDYzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDYzNjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA2NDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA2NDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNjQ5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNjUxOzc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkwNjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNjU5OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDY3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDY3MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDY3MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDY3Njs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5MDY4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDY4MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTA2OTQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA2OTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTA2OTc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA2OTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNzAyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNzA1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDcwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDcwNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA3MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA3MTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNzIzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDcyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDcyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA3Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA3MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNzM0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDczOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDc0MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA3NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA3NDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNzUwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDc1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDc2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA3NjM7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTA3NjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA3Njk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNzcwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNzczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDc3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDc3NTs4OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE5MDc4Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA3ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA3ODg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwNzkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwNzkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDc5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDc5NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA3OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA3OTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwODAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwODAyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDgwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDgwODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA4MTE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwODE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwODIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDgyMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA4Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA4Mjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwODMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwODMyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDgzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDgzNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA4Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA4NDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwODQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwODQ0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDg0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDg1MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTA4NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA4NTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkwODYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwODYzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MDg2NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDg2Nzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5MDg3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDg3NTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTA4ODk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTA4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA4OTM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwOTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwOTA0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkwOTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwOTA4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwOTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwOTE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwOTE5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwOTIyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkwOTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwOTI2OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDk0NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MDk0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MDk0NzsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTA5NzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA5NzQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTA5Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTA5Nzg7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwOTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwOTk0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkwOTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkwOTk2OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTAxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTAxOTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTEwMzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEwMzM7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTEwNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEwNDE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxMDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMDUyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxMDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMDU0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxMDYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMDY0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxMDY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMDY2OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTA4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTA4NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTA4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTA4ODs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTA5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTA5NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTA5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTA5OTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTExMTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTExMTg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTExMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTExMjU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxMTM3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMTM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxMTQwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMTQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTE0NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTE0ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTExNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTExNTA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxMTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMTU4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTE2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTExNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTExNzA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxMTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMTc3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTE4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTE4MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTExODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTExODY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxMTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMTkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTE5NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTEyMDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEyMDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxMjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMjA1OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTkxMjA4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMjExOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTIxMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTIxNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTEyMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEyMTc7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xOTEyMjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxMjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMjMwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTIzMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTEyMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEyNDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxMjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMjQ0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTI0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTI0OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTEyNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEyNTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxMjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMjU4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTI2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTI2NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTEyNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEyNzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxMjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMjczOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTI4MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTEyODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEyODQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxMjg4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMjkyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTI5MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTI5NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTEzMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEzMDQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxMzA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMzEyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTMxNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTMxNjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5MTMyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTMyNDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTEzMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEzMzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTEzNDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEzNDM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTEzNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEzNTA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxMzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMzYyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxMzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMzY0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTM3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTM3NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTM3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTM3OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTM4MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTM4MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTM4NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTM4NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTEzODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTEzOTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxMzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxMzk0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTM5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTQwMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE0MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE0MDQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNDE0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTQyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTQyMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE0Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE0Mjg7MTQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTQ0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTQ0Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE0NDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNDUxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTQ1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTQ1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE0NjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE0NjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNDY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTQ3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTQ3MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE0NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE0Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNDgxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTQ4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTQ4NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE0ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE0ODg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNDk1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTUwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTUwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE1MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE1MDY7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTE1MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE1MTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNTEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNTE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTUxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTUxODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE5MTUyNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE1MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE1MzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNTM1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTUzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTU0MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE1NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE1NDc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNTUzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNTU3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTU1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTU1OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5MTU2MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTU2NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE1Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE1Njg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTE1NzI7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTU4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTU4NDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5MTU4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTU4NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE1ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE1OTA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNTk4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTYwNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE2MTA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTE2MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE2MTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNjE5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNjIxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTkxNjI1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTYzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTYzNTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5MTYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTYzNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE2NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE2NDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNjQ5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTY1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTY1Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE2NTk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTE2NjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE2Njc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNjY4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNjcwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTkxNjc0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE2ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE2ODU7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTE2ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE2ODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNjkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTY5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTY5NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE2OTk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTE3MDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE3MDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNzA5OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTkxNzE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNzE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTcxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTcxOTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE5MTcyNjsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNzM4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTc0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTc0NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE3NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE3NDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNzUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNzUzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTc1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTc1Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE3NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE3NjI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNzY5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTc3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTc3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE3NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE3NzY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNzgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNzg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTc4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTc4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE3OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE3OTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkxNzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxNzk1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MTc5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTgwMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTE4MDQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE4MDY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTE4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE4MTE7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxODMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxODMxOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxODM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxODM4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkxODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxODQ2OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTg1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTg2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTg2MzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTE4NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE4NzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTE4NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE4NzY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTE4ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTE4ODE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE4ODQ7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxOTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxOTEyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxOTE5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxOTIyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkxOTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxOTI1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTkzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTkzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MTkzOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MTk0MzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTE5NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTE5NTk7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxOTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxOTc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxOTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxOTc3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkxOTgxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkxOTgyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxOTg2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkxOTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkxOTkwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjAwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjAwNzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjAxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjAxOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTIwMzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTIwMzU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTIwMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTIwMzg7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyMDY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyMDY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyMDY5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyMDc0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjA4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjA5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjA5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjA5MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5MjA5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjA5NjszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTIxMjg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTIxMzM7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyMTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyMTU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyMTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyMTU3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjE2OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjE3NDsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTIxOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTIxOTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTIxOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTIxOTY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyMjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyMjA4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyMjA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyMjEwOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjIzMDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjIzNTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTIyNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTIyNTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTIyNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTIyNTg7MzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyMjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyMjkyOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjMwODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjMxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjMxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjMxNzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5MjMxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjMyMDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTIzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTIzMzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTIzMzU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTIzNDA7Njk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE5MjQwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjQxMjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5MjQxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjQxNTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI0MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI0MzY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI0Mzk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI0NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI0NDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI0NDM7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI0NDk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTI0NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI0NTM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI0NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI0NjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI0NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI0NjU7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyNTAyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyNTA4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkyNTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyNTEyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjUyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjUyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjUyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjUyNTszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI1NjA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI1NjY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI1NzM7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI1ODI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI1ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI1ODQ7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyNjExOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyNjE3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjYyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjYyODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjYzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjYzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjYzNzszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI2Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI2NzA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyNjgyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyNjg4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkyNjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyNjkyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjcwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjcwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MjcwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MjcwNTsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI3MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI3MzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI3MzU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyNzQ3OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyNzUzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkyNzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyNzU3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5Mjc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mjc3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5Mjc3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mjc3MjszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI4MDc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI4MTM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTI4MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI4MTY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyODI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyODI3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyODI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyODMwOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5Mjg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mjg0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5Mjg0NTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mjg1MjszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI4ODc7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTI4OTQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyOTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyOTA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkyOTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkyOTA3OzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5Mjk0NTs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mjk1Mjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5Mjk2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mjk2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5Mjk2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mjk2MzszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTI5OTM7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMwMDA7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTMwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMwMDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTMwMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMwMDk7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkzMDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzMDQyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzA1NDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzA2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzA2MTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzA2NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5MzA3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzA3MTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzA3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzA4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzA4MjsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTMxMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMxMDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTMxMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMxMTA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkzMTIyOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzMTI4OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzE2Mzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzE2OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzE3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzE3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzE4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzE4MTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTMxOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMxOTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTMxOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMxOTU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTMyMDQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMyMDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTMyMTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMyMTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTMyMTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMyMTk7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkzMjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzMjU3OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzI3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzI3MzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTMyODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTMyODk7NjI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE5MzM1MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzM1MzsxODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTkzMzcxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzMzczOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTkzMzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzMzc2OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzM4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzM5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzM5MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzM5Njs1MjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTkzNDQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzNDUxOzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzQ4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzQ4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzQ4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzQ4NjsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTM1MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM1MDc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTM1MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM1MTA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTM1MTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTM1MTY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM1MjE7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkzNTMzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzNTM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkzNTM4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzNTQyOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzU2NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzU2OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5MzU3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzU3MjsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTM2MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM2MDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTM2MDM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM2MDg7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTkzNjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzNjQwOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzY1Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzY2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzY2MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzY2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzY2NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzY2ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5MzY2OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzY3MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM2NzQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM2Nzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzNjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzNjgwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MzY4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzY4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM2OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM2OTM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzNzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzNzAzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MzcwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzcwODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM3MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM3MTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzNzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzNzE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MzcxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzcyMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM3MjQ7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTM3MzA7MTM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mzc0Mzs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5Mzc1MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mzc1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM3NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM3NTc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzNzY2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzNzY4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mzc3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mzc3MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM3NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM3NzU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzNzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzNzgxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mzc4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mzc4NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM3ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM3ODc7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mzc5NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mzc5OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM4MDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzODEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzODExOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MzgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzgxNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM4MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM4MTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzODIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzODIzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MzgzMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzgzNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM4MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM4MzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzODQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzODQyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mzg0OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mzg1MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM4NTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzODU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzODU5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mzg2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mzg2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM4Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM4NzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzODczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzODc0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM4ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM4ODU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzODkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzODkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mzg5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mzg5NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM4OTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM5MDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzOTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzOTA0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MzkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzkxNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM5MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM5MTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzOTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzOTI4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5MzkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5MzkzMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM5Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM5Mzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzOTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzOTQyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mzk0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mzk0ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM5NTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzOTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzOTU3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mzk2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mzk2Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM5Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM5Njg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTkzOTc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTkzOTc4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mzk3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mzk4MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM5ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTM5ODU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Mzk5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Mzk5NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTM5OTg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQwMDA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MDA5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDAxMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQwMTY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MDIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MDI2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDAyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDAyODszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5NDAzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDAzNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQwMzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQwMzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MDQwOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE5NDA1MTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MDYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MDY0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk0MDY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MDcxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDA3Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDA3Njs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5NDA4MDsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MTAyOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk0MTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MTA0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDEwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDEwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQxMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQxMTE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MTIwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDEyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDEyNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQxMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQxMjk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MTM3OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk0MTQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MTQ1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDE0Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDE1MDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5NDE1NDsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MTgyOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk0MTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MTg0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDE4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQxOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQxOTE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MTk4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDIwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDIwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQyMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQyMDc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MjE0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDIxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDIxOTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQyMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQyMjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MjMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MjMxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDIzOTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5NDI0NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDI0NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQyNDk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTQyNTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQyNTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0MjU5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MjYxOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk0MjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MjY4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk0MjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0MjczOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0MjgxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0Mjg0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDI5ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDMwMjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDMwOTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDMxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDMxNzs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDMyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDMyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDMyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDMyNDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDMzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDMzMzszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQzNjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQzNzE7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTQzNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQzNzQ7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQzNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQzODA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQzODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQzODM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTQzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQzODg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQzOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQzOTE7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NDA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NDA3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NDEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NDExOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NDE1OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NDIxOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NDI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NDI5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk0NDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NDMzOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NDQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NDQ1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDQ1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDQ1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDQ1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDQ1OTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQ0NzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ0NzU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQ0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ0ODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQ0ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ0ODc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NDk5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NTAzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDUxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDUxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDUxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDUxNjsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQ1NDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ1NDg7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NTY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NTcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NTcyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NTc0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0NTc1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NTc3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDU4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDU4MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ1ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ1ODU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0NTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NTkyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDU5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDU5Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ2MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ2MDY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0NjExOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NjEzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDYxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDYyMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ2MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ2MjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0NjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NjI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDYzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDYzMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ2MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ2MzU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0NjQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NjQyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDY0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDY0NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ2NTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ2NTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0NjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NjU3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDY2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDY2NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ2NzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ2NzU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0Njc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0Njc3OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk0NjgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NjgzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDY4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDY4NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ2ODk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xOTQ2OTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0Njk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0Njk5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDcwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDcwMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ3MDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0NzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NzEyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDcxNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDcxODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ3MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ3MjA7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xOTQ3Mjc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0NzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NzM3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDc0Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ3NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ3NDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0NzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NzUxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDc1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDc2MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ3NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ3NjI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xOTQ3Njk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0Nzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0Nzc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDc3ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ3ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ3ODQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0NzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0NzkzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDc5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDc5Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ4MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ4MDI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0ODExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0ODEyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDgxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDgxNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ4MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ4MTk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xOTQ4MjY7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDgzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDgzOTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0ODUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0ODUyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDg1OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ4NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ4NjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0ODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0ODY5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDg3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDg3NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ4Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ4Nzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0ODgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0ODgxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDg4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDg4ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTQ4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ4OTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk0ODk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0OTAxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NDkwMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDkwNTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NDkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDkxMDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQ5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ5MjY7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQ5Mjk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTQ5MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ5MzM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0OTQzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk0OTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0OTQ3Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk0OTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0OTU1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk0OTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk0OTU5OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDk3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDk3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDk3NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDk3Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NDk4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NDk4NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQ5OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTQ5OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTQ5OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTUwMDA7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1MDE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1MDE5OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1MDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1MDI1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTAzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTAzNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTAzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTAzODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTUwNTQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTUwNjA7Njc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE5NTEyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTEyODszOTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMTk1MTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1MTY4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk1MTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1MTcxOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTE4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTE4OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTE5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTE5MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTE5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTE5Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTIwMDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NTIwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTIwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTIxMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTIxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTIxNDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NTIxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTIxNzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTUyMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTUyMzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTUyMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTUyMzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTUyMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTUyMzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTUyMzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTUyNDE7NzE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTE5NTMxMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTMxNDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTMxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTMyMDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTUzMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTUzMzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTUzMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTUzMzM7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1MzQ5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1MzUzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk1MzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1MzU3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1MzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1MzY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1MzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1MzY5OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTM5Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTM5NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NTM5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTQwMDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTQwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTQwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTQwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTQxMDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU0MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU0MjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU0MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU0MjU7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NDQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NDQ1OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTQ2Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTQ2NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NTQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTQ3MDsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU0ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU0ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU0ODg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU0OTM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU1MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU1MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU1MDU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU1MDc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU1MTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU1MTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU1MTY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTU1MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU1MjA7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU1Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU1Mjg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NTQwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NTQ0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NTUwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTU2MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTU2NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTU2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTU2ODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTU3NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTU3OTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NTU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTU4NzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU1OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU2MDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU2MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU2MDI7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NjE2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NjE5OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTYzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTYzNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTYzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTY0MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTY0OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTY1MzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU2NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU2NzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU2NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU2NzM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU2ODI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU2ODY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTU2ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU2ODk7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NzA0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NzA1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NzEwOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NzE3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NzE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NzE5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NzIxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NzI2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTczNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTczODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTczOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTc0MDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU3NTM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU3NTg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NzY5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1NzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1NzcxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk1Nzc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1Nzc1OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTc5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTc5NTsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU4MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU4MTM7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1ODI3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1ODMyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1ODM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1ODM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1ODQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1ODQxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk1ODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1ODQ1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTg1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTg2MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTg2OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTg3NDsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTU5MDA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTU5MDU7MzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk1OTM4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk1OTQzOzMzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTk3Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTk4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTk4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTk4Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NTk4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTk4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTk4ODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NTk5Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NTk5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjAwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjAwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjAwMjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjAwOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjAxNDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYwMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYwMjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYwMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYwMjg7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYwMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYwMzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYwMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYwMzc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MDUwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MDU1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjA2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjA2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjA2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjA2ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NjA3MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjA3Mzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjA3ODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjA4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjA4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjA4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjA4NzszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjA5MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjA5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjA5NTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjEwMTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NjEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjEwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjEwNjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NjEwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjExMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjExMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjExMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjExMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjExNDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYxMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYxMjU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYxMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYxMzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYxMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYxMzQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MTQ2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MTQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MTUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MTUzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjE2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjE2NDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjE2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjE2OTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjE3NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjE3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjE3OTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYxOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYxOTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYxOTI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYxOTc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYyMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYyMDQ7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYyMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYyMDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYyMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYyMTE7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MjMwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MjM1OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjI1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjI1OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjI2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjI2Mjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjI2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjI3MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjI3ODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYyODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYyOTA7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MzAyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk2MzA2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MzA4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MzEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MzEzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MzE3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk2MzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MzIwOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MzI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2MzI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2MzMwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjM0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjM0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjM0NDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjM0OTszMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTYzODI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTYzODc7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2NDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NDExOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2NDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NDE5OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjQzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjQzNzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTY0NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY0NDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTY0NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY0NTE7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTY0NTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY0NjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTY0NjQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY0Njg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTY0NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY0NzE7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2NDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NDg2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2NDg3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NDkyOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjUxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjUxMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTY1MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY1MjQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2NTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NTM2Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2NTQ0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NTQ5OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjU3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjU3NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjU3Nzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjU4NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjU5MDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTY2MDc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY2MTI7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2NjMzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NjM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2NjM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NjQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2NjQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NjQ1OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NjY2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjY2MTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTY2NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY2NzM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2Njg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2Njg1OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2Njg4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NjkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2NjkxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NjkzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NjY5Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjcwMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTY3MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY3MDI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2NzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NzA5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NjcxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjcxMzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTY3MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY3MjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2NzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NzI3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NjcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjczMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTY3MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY3MzQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2NzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NzQyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Njc1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Njc1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTY3NTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY3NTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2NzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NzU5OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE5Njc3MDsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2NzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NzgzOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk2Nzg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2NzkwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Njc5MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Njc5NTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5Njc5OTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2ODIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2ODIxOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk2ODIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2ODIzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NjgyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjgyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTY4Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY4MzA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2ODM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2ODM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Njg0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Njg0Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTY4NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY4NDg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2ODU2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk2ODYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2ODY0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Njg2NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Njg2OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5Njg3MzsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2OTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2OTAxOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk2OTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2OTAzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NjkwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjkwNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTY5MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY5MTA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2OTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2OTE3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NjkyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjkyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTY5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY5MjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2OTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2OTMzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NjkzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NjkzODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTY5NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY5NDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2OTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2OTUwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Njk1ODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5Njk2MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Njk2NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTY5Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY5Njg7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTY5NzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTY5NzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk2OTc4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2OTgwOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk2OTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2OTg3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk2OTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk2OTkyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk2OTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MDAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3MDAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MDA0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzAxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzAyMTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzAyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzAyOTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzAzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzAzNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzAzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzAzOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NzA0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzA0MzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTcwNTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTcwNTY7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3MDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MDc5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3MDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MDg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3MDg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MDg5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk3MDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MDkzOzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzExODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzEyNDsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTcxNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTcxNTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTcxNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTcxNTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTcxNTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTcxNTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTcxNjI7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3MTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MTkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3MTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MTkyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk3MTk2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3MTk3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MjAwOzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzIyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzIyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzIyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzIyOTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5NzIzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzIzNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzIzNzsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTcyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTcyNjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTcyNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTcyNjc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTcyNzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTcyNzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTcyNzY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTcyNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTcyODA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTcyODk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTcyOTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTcyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTcyOTU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTczMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTczMDQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3MzE5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MzIyOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzM0MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzM0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzM0MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzM0NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTczNDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTczNTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3MzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MzU0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzM2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzM2MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTczNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTczNjQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3MzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3MzczOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzM3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzM3ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTczODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTczODM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3Mzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3Mzg5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzM5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzM5Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc0MDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NDA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NDA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzQxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzQxMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc0MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc0MTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NDE4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzQyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzQyODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc0MzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc0Mzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NDQxOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk3NDQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NDQ3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzQ0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzQ0OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc0NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc0NTM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NDYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzQ2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzQ2NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc0Njk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NDczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzQ3NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc0Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc0Nzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NDgxOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk3NDgyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzQ4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzQ4NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc0OTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc0OTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NDk3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk3NTAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NTA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzUwNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzUwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc1MTE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xOTc1MTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NTI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzUyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzUzMDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc1Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc1Mzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NTQxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzU0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzU0NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc1NDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc1NTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NTU0OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE5NzU2NTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NTc4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk3NTgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NTg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzU4Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzU5MDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5NzU5NDsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NjE2OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk3NjE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NjE4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzYyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzYyMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc2MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc2MjU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NjM0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzYzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzYzODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc2NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc2NDM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NjUxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk3NjU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NjU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzY2MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzY2NDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5NzY2ODsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3Njk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3Njk2OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk3Njk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3Njk4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzcwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzcwMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc3MDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NzEyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzcxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzcxNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc3MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc3MjE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NzI4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzczMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzczMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc3NDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NzQ1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Nzc1Mzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5Nzc1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Nzc2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc3NjM7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTc3Njg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc3NzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3NzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3NzczOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE5Nzc4NDsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3ODA5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk3ODEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3ODE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5NzgxNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzgyMTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5NzgyNTsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3ODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3ODQ1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Nzg0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Nzg1MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc4NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc4NTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3ODYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3ODYxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5Nzg2NTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5Nzg3MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5Nzg3MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTc4NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc4NzU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTc4ODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc4ODM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk3ODg1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3ODg3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk3ODkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3ODk0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3OTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3OTAzOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzkxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzkxNzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzkyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzkyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5NzkyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5NzkzMDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTc5NDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTc5NDg7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3OTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3OTcxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3OTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3OTc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk3OTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3OTgxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk3OTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk3OTg1OzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5ODAxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODAxMzsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTgwNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgwNDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTgwNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgwNDM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTgwNDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTgwNDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgwNTE7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk4MDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4MDc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk4MDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4MDgxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk4MDg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk4MDg2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4MDg5OzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5ODExNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODExNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5ODExNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODExODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5ODEyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5ODEyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODEyNjsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTgxNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgxNTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTgxNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgxNTY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTgxNjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTgxNjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgxNjQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTgxNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgxNjc7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTgxNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgxNzY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTgxNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgxNzk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTgxODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTgxODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgxODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTgxODY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgxOTA7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk4MjI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4MjI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk4MjI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4MjMyOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk4MjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4MjM5OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5ODI1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODI1NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5ODI2MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODI2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5ODI2NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODI2ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTgyNzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgyNzU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4Mjc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4Mjc3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODI4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODI4NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTgyODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgyODc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4Mjk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4Mjk2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODMwMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTgzMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgzMDY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4MzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4MzEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODMxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODMxNjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTgzMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgzMjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4MzI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4MzMyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODMzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODMzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTgzMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgzMzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4MzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4MzQxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODM1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODM1MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTgzNTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgzNjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4MzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4MzY0OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk4MzY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4MzcwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODM3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODM3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTgzNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgzNzY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4Mzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4Mzg1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODM4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODM4OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTgzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTgzOTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4Mzk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4Mzk2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODM5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODM5OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg0MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg0MDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NDA0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk4NDA1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODQwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODQwODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg0MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg0MTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NDIwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk4NDI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NDI3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODQyODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODQzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg0MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg0MzQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0xOTg0NDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NDQ5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODQ1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODQ1Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg0NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg0NjE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NDYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NDY0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODQ3MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg0NzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg0NzU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NDc3Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTk4NDg0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODQ5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODQ5Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg0OTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NTA2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODUwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODUwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg1MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg1MTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NTIwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODUyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODUzMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg1MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg1MzM7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTk4NTQ0OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg1NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg1NTc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTg1NjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg1NjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NTY1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NTY5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk4NTczOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg1OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg1OTU7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTg1OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg1OTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NjAwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODYwNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg2MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg2MTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NjE3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODYyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODYyMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg2MzA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTg2MzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg2Mzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NjM5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NjQzOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk4NjQ3OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg2NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg2NzU7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTg2NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg2Nzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4Njc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NjgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODY4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODY4NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg2OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg2OTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4Njk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4Njk2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODY5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODcwMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg3MDc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NzEyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODcxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODcyMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg3MjQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4NzMyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk4NzM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4NzQwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODc0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODc0Mjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5ODc0NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODc1MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg3NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg3NTI7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMTk4NzYzOzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg3ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg3ODg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTg3OTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg3OTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4Nzk2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4ODAwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk4ODA0OzE5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg4MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg4MjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4ODI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4ODI5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODgzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODgzNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg4Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg4NDA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4ODQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4ODQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODg1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODg1MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg4NTU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTg4NjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg4NjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4ODY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4ODY1OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk4ODcwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4ODczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5ODg3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODg3NTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE5ODg4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTg4ODU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg4ODg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk4ODkwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4ODkyOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk4ODk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4ODk5Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk4OTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4OTA4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5ODkyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODkyMjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5ODkzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5ODkzMTsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTg5NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg5NTQ7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTg5NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg5NjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTg5NjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTg5Njc7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk4OTgxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4OTg0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk4OTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4OTg3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk4OTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4OTk2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk4OTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk4OTk5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk5MDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MDA0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5MDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MDA3Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5MDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MDE1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5MDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MDE4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk5MDIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5MDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MDI0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5MDI1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MDI5OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTA2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTA2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTA2ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTA3MTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5OTA3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTA3ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5OTA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTA4Mjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTA5MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5OTA5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTA5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTA5Nzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTEwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTEwNjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTExNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTExNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTExODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTEyMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkxMjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkxMjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MTI4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTEzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTEzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkxMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkxMzk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MTQ2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTE1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTE1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkxNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkxNTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MTYwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTE2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTE2OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkxNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkxNzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MTc1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTE4MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTE4NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkxODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkxODY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MTg5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTE5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTE5NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkyMDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MjAzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTIxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTIxMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkyMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkyMTY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MjIxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTIyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTIyNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkyMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkyMjg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MjM0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTI0MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTI0NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkyNDY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MjQ5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkyNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkyNjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MjY0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTI3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTI3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkyNzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5Mjc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MjgwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkyOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkyOTE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5Mjk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MzAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTMwNDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5OTMwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTMxMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkzMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkzMTI7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTMyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTMyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkzMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkzMjk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MzM3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTM0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTM0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkzNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkzNDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MzUxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTM1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTM1NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkzNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkzNjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MzY0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTM3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTM3NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTkzNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTkzNzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5MzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5MzgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTM4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTM4Mzs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5OTM4OTsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NDA2Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk5NDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NDE0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTQxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTQxNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk0MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk0MjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NDI0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTQzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTQzMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk0MzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk0Mzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NDQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTQ0NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk0NDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NDUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NDUzOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk0NjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NDY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTQ3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTQ3Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk0ODA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NDg1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTQ5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTQ5Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk0OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk0OTc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NTA0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NTA4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTUwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTUxMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk1MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk1MTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NTE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTUyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTUyMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk1MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk1MzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NTM3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTU0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTU0MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk1NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk1NDY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NTU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NTU3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTU1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTU1OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5OTU2MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTU2NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk1Njc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk1NzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NTcyOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE5OTU4MzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NTk2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk5NjAwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NjAzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTYwNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTYwODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5OTYxMjsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NjM0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk5NjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NjM2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTYzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTYzOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk2NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk2NDM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NjUyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTY1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTY1Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk2NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk2NjE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NjY5OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk5Njc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5Njc3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTY3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTY4Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5OTY4NjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NzE0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMTk5NzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NzE2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTcxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTcxOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk3MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk3MjM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NzI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NzMwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTczNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTczNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk3Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk3Mzk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NzQ2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTc1MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk3NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk3NTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NzYzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTc3MTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTE5OTc3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTc3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0xOTk3ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk3ODE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0xOTk3ODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk3ODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5NzkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5NzkzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTc5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTc5NTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTE5OTgwMDsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMTk5ODE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5ODE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTE5OTgxOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTgyMTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5OTgyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTgyODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5OTgzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTgzMzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTg0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTg0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTg0MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTg0NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTE5OTg0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTg1MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTk4NjA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk4NjY7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0xOTk4NzE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5ODgxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5ODg0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5ODkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5ODk0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5ODk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5ODk2OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTkxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTkyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTkyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTkyMjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTkzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTkzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTkzMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTE5OTkzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTE5OTkzODszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0xOTk5Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0xOTk5NzA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5OTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5OTgxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMTk5OTg1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMTk5OTg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMTk5OTkwOzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMDAxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDAyMDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDAwMzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAwMzQ7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAwMDU5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMDYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAwMDYyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMDY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDA2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDA3MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAwNzI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMDc5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDA4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDA4MzsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMDk1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDA5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDEwMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAxMDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMTA3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDExNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDExNjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAxMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAxMjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMTI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMTMxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDEzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDEzMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAxMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAxMzc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMTQ3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDE0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDE1MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAxNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAxNTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMTYwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDE2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDE2Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAxNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAxNzE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMTc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDE3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDE3Nzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAxODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAxODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMTkxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDE5NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAyMDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMjA1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDIwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDIwNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAyMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAyMTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMjIxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDIyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDIyNDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMjM1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDIzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDI0MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAyNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAyNDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMjQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMjUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDI1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDI1MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAyNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAyNTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMjY1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDI2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDI3MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAyNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAyNzM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMjgyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDI4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDI4NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAyODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAyODk7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDAyOTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMjk4Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjAwMzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMzA2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDMxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDMxMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAzMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAzMTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMzE4OzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjAwMzI0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDMyODs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwMDMzNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAzMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAzMzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMzQxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDM0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDM1MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAzNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAzNTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMzU3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDM2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDM2Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAzNzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAzNzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMzc2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDM4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDM4Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDAzOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDAzOTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwMzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwMzk1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDQwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDQwNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA0MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA0MTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNDE1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDQxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDQyMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA0MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA0MjY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNDMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNDM0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDQzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDQzNjsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNDQ5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDQ1NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA0NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA0NTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNDYzOzY7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjAwNDY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDQ3Mjs3OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwMDQ3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDQ4MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA0ODU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNDg3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNDkxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDQ5Mzs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwMDQ5OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA1MDQ7NzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDA1MTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNTEzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDUxNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA1MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA1MjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNTMxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDUzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDUzNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA1Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA1Mzg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNTQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNTQ5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDU1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDU1MTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwMDU1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDU1NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA1NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA1NTk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNTY1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDU2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDU2OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA1NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA1Nzc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNTgzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDU4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDU4NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA1ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA1OTA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNTk2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDU5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDU5OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA2MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA2MDM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNjEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNjEzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDYyMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDYyNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA2Mjc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNjMwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDYzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDYzOTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNjUyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDY1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDY1Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA2NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA2NjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNjcwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDY3MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA2NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA2Nzc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNjg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNjg1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDY5MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDY5NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA2OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA2OTY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNzAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNzAxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDcwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDcwMzs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwMDcwOTsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNzI2Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjAwNzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNzM0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDczNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDczNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA3NDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNzQ0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDc1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDc1MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA3NTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA3NTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNzYxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDc2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDc2NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA3Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA3Njg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNzczOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA3ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA3ODY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwNzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwNzg5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDc5Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA3OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA4MDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwODA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwODA1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDgxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDgxMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA4MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA4MTc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwODI0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwODI4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDgyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDgzMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA4MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA4MzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwODM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwODM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDg0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDg0Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA4NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA4NTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwODU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwODU3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDg2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDg2MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA4NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA4NjY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwODc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwODc3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDg3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDg3OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwMDg4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDg4NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA4ODc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA4OTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwODkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwODkyOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjAwODk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDkwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDkwMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA5MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA5MDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwOTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwOTA3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA5MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA5MTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwOTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwOTIxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDkyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDkyNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA5Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA5MzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwOTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwOTMzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDkzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDk0MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA5NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA5NDI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMDA5NDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwOTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwOTUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDk1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDk1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA5NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA5NTc7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDk2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDk2ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA5NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA5NzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwOTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwOTc1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDk3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDk4MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDA5ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDA5ODM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAwOTg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAwOTkwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMDk5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMDk5Mjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwMDk5OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEwMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEwMDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMDA5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTAxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTAxNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEwMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEwMTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMDIyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTAyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTAyNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEwMzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMDM0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMDM3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTAzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTAzOTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwMTA0Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEwNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEwNTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMDU3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTA2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTA2NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEwNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEwNjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMDcxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTA3NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEwNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEwNzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMDgzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMDg2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTA4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTA4ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwMTA5NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEwOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEwOTk7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDExMDU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMTA5Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjAxMTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMTE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTExOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTEyMDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDExMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDExMjk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMTM2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTE0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTE0NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDExNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDExNDg7NjswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDExNTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMTU5Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjAxMTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMTY3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTE3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTE3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDExODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDExODM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMTg1OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwMTE5NjsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMjA5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjAxMjEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMjE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTIxNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTIyMTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwMTIyNTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMjQ3OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjAxMjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMjQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTI1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTI1MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEyNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEyNTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMjY1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTI2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTI2OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEyNzQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMjgyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjAxMjg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMjkwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTI5MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTI5NTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwMTI5OTsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMzI3OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjAxMzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMzI5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTMzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTMzMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEzMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEzMzY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMzQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMzQzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTM0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTM0ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEzNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEzNTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMzU5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTM2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTM2NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEzNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEzNzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxMzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxMzc2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTM4NDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwMTM4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTM5MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDEzOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDEzOTQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDEzOTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE0MDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxNDAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxNDA2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTQwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQwODs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwMTQxMzsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAxNDI3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxNDMwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMTQzMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQzNDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwMTQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQ0MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwMTQ0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQ0Njs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTQ1MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwMTQ1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQ1NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTQ1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQ2MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwMTQ2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQ2NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTQ2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQ2NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwMTQ3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQ3MTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTQ3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQ3ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwMTQ4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQ4Mjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTQ4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQ5MDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwMTQ5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTQ5ODs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTUwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTUwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTUwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTUwNzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwMTUxMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1MjM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1MjY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1MzM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1NDE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1NDk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDE1NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1NTI7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1NjI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1NjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1NjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1NzA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDE1NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1NzQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1ODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE1ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE1ODY7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAxNjA5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxNjEzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjAxNjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxNjE3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAxNjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxNjI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAxNjI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxNjI5OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTY0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTY0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTY0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTY0NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTY0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTY0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTY1MTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE2NjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE2NjY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDE2Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE2NzA7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE2Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE2Nzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE2Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE2ODA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE2ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE2OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE2OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE2OTI7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAxNzE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxNzE5OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTczMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTczNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwMTczODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTczOTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE3NDk7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE3NTc7NDQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwMTgwMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTgwMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTgxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTgxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTgxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTgxNTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE4MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE4MzU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAxODQ2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxODUwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAxODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxODYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAxODYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxODYyOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTg3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTg4MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE4OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE4OTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE4OTM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAxOTAzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAxOTA3OzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMTkzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTkzNDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE5NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE5NDU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDE5NDk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDE5NTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDE5NTU7Mzc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwMTk5MjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMTk5NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMjAwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjAwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMjAwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjAwNjsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDIwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIwMzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDIwMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIwMzI7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDIwNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIwNDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDIwNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIwNDM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDIwNDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIwNDk7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAyMDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMDc5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMjA5MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjA5NDsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDIxMTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIxMjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDIxMjM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIxMjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDIxMjY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIxMjg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMTMxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMTM1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjEzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjEzNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIxNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIxNDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMTQ3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjE1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjE1Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIxNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIxNTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMTYxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjE2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjE2NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIxNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIxNzU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMTgzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjE4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjE4NTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwMjE4ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjE5MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIxOTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIxOTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMTk3Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjAyMjA0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjIxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjIxNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIyMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIyMjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMjI1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjIyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjIyODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIyMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIyMzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMjM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjI0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjI0Mjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIyNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIyNTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMjU4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMjYxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjI2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjI2Mzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwMjI3MDsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMjg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMjg4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjI5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjI5NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIyOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIyOTg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMzA4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjMxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjMxMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIzMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIzMTc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMzI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMzI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjMzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjMzMTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwMjMzODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIzNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIzNDc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMzUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMzUyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjM1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjM1NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIzNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIzNjA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMzY2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMzY5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjM3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjM3MTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwMjM3ODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDIzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDIzODg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyMzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyMzk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjM5ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI0MDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNDA3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjQxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjQxMzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI0MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI0MjM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNDMwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjQzNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjQzNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI0Mzk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMDI0NDY7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjQ2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjQ2MjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNDczOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjQ3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjQ3NzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNDg4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjQ5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjQ5MTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNTAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNTA2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjUwNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjUwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI1MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI1MTM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNTIzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjUyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjUzMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI1MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI1Mzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNTQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjU0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjU0NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI1NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI1NTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNTU3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjU2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjU2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI1Njk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI1NzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNTc0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNTc2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjU4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjU4MTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI1OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI1OTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNTk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjU5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjU5Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI2MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI2MDE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNjA4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjYxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjYxMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI2MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI2MTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNjIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNjI0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjYyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjYyNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI2MzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNjM5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNjQzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjY0NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjY0Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI2NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI2NTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNjUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNjU0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjY2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjY2MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI2NjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNjcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjY3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjY3NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI2NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI2Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNjgxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjY4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjY4Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI2OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI2OTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNjk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjcwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjcwMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI3MDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI3MTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNzEyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNzE0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI3MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI3MjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNzI5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI3Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI3NDA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNzQ5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjc1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjc1NzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNzcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjc3Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjc3NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI3Nzg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI3ODA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjAyNzg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyNzg3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwMjc5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjc5NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDI3OTg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI4MDA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDI4MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI4MDU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAyODE3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjAyODIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyODIxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMjgzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjgzMjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwMjgzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjgzNjsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI4NTU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDI4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI4NTk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI4Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI4Njk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDI4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI4NzM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAyODgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyODg0Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjAyODkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAyODkyOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMjkwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjkwOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMjkxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjkxMzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMjkxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjkyMDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMjkyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjkyNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMjkyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMjkyNzsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI5NTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI5NTc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDI5NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI5NjE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI5NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI5NzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI5NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI5NzM7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI5ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI5ODI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI5ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI5ODQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI5OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI5OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDI5OTY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDI5OTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMwMDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDMwMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMwMDU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDMwMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMwMTQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzMDI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzMDI5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjAzMDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzMDMzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzA0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzA0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzA0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzA0NjszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDMwODE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMwODQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDMwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMwOTI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzMTA3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzMTEwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzMTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzMTIwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzEzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzEzMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzEzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzEzMzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDMxNDk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMxNTU7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzMTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzMTcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzMTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzMTcyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzE4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzE4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzE4NzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDMyMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMyMDc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDMyMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMyMTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDMyMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMyMTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDMyMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMyMTU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDMyMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMyMjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDMyMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMyMjY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzMjM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzMjQwOzY0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMDMzMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMzMDU7NjI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwMzM2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzM2ODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwMzM3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzM3MTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDMzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMzODg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDMzOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDMzOTE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM0MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM0MDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM0MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM0MDM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzNDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNDE0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzNDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNDE3OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzQzMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzQzMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzQzNzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM0NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM0NTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM0NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM0NTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDM0NTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM0NTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM0NjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM0NjM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM0Njc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzNDc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNDc4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzNDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNDg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzNDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNDg3OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzUxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzUxNjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM1Mjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM1MzE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM1NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM1NDE7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM1NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM1NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM1NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM1NDg7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzNTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNTg0OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzYwNDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM2MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM2MTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM2MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM2MjE7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM2MjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM2Mjc7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzNjYyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNjY1OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzNjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNjcyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzNjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNjc1OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzY5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzcwMTsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM3Mjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM3MzE7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM3Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM3Mzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM3NDE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM3NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM3NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM3NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM3NTM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzNzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNzY0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzNzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzNzY2OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzc4NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzc5MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM4MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM4MDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM4MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM4MDQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzODE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzODE5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzODIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzODIxOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzgzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzgzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzg0MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM4NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM4NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM4NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM4NTM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzODY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzODY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzODY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzODY3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzg3ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzg4MTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM4OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM4OTQ7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM5MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM5MDM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjAzOTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjAzOTE2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwMzkyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwMzkyODsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDM5NDU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDM5NTE7NjA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwNDAxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDAxMjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNDAxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDAxNTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQwMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQwMjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQwMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQwMjg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQwMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQwMzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQwMzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQwMzY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0MDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0MDQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0MDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0MDQ5OzM0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDA4Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDA4NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNDA5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDA5MTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQxMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQxMDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQxMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQxMTA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQxMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQxMjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQxMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQxMjI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0MTMzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0MTM4OzQ2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMDQxODQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQxODY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDQxODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQxODk7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0MjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0MjA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0MjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0MjA5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0MjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0MjEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0MjEzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0MjE4OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0MjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0MjIzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0MjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0MjI1OzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDI1MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDI1Njs2MzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjA0MzE5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0MzIyOzYyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMDQzODQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQzODc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDQzODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQzOTA7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NDA3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NDEwOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDQyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDQyNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDQyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDQzMDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ0NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ0NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ0NDY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ0NTI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NDY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NDY5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA0NDczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NDc0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NDc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NDgwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NDg1OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NDkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NDkyOzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDUxODs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDUyMzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDUyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDUzMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDUzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDUzMjsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ1NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ1NjE7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NTczOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NTc4OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NTgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NTg1OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDYwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDYwNTsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ2MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ2MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ2MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ2MjQ7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ2Mjc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ2MzI7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NjY3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NjcyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0Njc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0Njc5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0NjgyOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDcwNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDcxMDsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ3Mzc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ3NDI7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ3NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ3NTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ3NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ3NTI7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ3NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ3NjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ3NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ3NjM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0NzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0Nzc0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0Nzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0Nzc2OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDc5Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDgwMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ4MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ4MTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ4MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ4MTY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0ODMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0ODMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0ODMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0ODMzOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDg0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDg1MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDg1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDg1MjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ4NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ4NjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ4NjU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0ODc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0ODc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0ODc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0ODc5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDg5MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDg5NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ5MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ5MDg7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ5MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ5MTc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA0OTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0OTMwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNDk0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDk0MjsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ5NTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ5NjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ5NjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ5Njc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ5Njg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ5NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDQ5NzE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ5NzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA0OTc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0OTc5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNDk4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDk4MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDQ5ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDQ5ODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA0OTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA0OTkxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNDk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNDk5ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUwMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUwMDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MDA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTAxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTAxMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUwMTY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MDIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MDI2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTAyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTAyODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUwMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUwMzI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MDQxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTA0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTA0NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUwNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUwNTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MDU4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTA2MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUwNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUwNjY7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTA3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTA3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUwODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUwODE7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDUwODQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUwODc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MDg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MDkxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTA5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTA5Mzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwNTEwMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUxMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUxMDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MTA0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTExMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUxMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUxMTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MTIwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTEyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTEyNTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUxMzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUxMzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MTM2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjA1MTQzOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUxNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUxNTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MTYzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTE2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUxNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUxNzA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MTc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MTc5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTE4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTE4MTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwNTE4ODsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MjA2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTIxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTIxMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUyMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUyMTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA1MjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MjI1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNTIzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTIzNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDUyMzY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUyMzg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDUyNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUyNDM7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1MjY1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA1MjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MjY5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1MjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MjcyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA1Mjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1Mjc2OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTI4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTI5MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNTI5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTI5NDsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDUzMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUzMTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDUzMTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUzMTc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDUzMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUzMjc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1MzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MzM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1MzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1MzQwOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTM1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTM1OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNTM2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTM2Mzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTM3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTM3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTM3NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDUzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUzODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDUzODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDUzOTA7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NDA4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NDExOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA1NDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NDE1Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NDIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NDI2OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA1NDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NDMwOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTQ0Mzs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTQ1MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNTQ1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTQ1MzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU0NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU0NjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU0NjY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU0Njk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU0NzA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU0NzQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU0ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU0ODI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU0ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU0ODQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NDk2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NDk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NTAwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTUxMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTUxNjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU1Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU1Mjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU1MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU1MzE7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU1Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU1Mzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU1NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU1NDE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU1NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU1NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU1NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU1NTM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NTY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NTY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NTY4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NTcyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA1NTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NTc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NTc4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NTgyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTU5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTU5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTU5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTU5NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU2MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU2MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU2MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU2MTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU2MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU2MTM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NjI1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NjI5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NjM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NjM5OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTY1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTY1MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTY1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTY1NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTY2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTY2NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNTY2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTY2NjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU2Nzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU2ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU2ODE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU2ODU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU2OTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU2OTY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU2OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU2OTk7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1NzEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1NzE1OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMDU3MzY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU3Mzg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU3NDE7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU3NDk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU3NTQ7MTY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwNTc3MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTc3MjsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDU3ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU3OTA7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1ODA5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA1ODEzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA1ODE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA1ODE4OzY4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMDU4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDU4ODc7Njk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwNTk1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNTk1Nzs1MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjA2MDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2MDA4OzY4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMDYwNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDYwNzc7NzA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwNjE0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjE0ODs1NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjA2MjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2MjA0OzY2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMDYyNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDYyNzE7Njc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwNjMzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjMzOTs2NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjA2NDA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2NDA2OzU0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMDY0NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY0NjE7NjY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwNjUyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjUyODs1MzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjA2NTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2NTgyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA2NTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2NTg1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2NTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2NTg4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2NTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2NTkwOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjYwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjYwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjYwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjYwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjYwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjYwNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjYwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjYwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjYxMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjYxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjYxMzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY2MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY2MzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY2MzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY2Mzc7NjI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwNjY5OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjcwMTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNjcwNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY3MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY3MTc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY3MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY3MjA7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2NzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2NzM4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjc0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjc1MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNjc1NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjc1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjc1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjc2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjc2MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNjc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjc2NjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY3ODA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY3ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY3ODI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY3ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY3ODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY3ODY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY3OTA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDY3OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY3OTQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2ODA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2ODA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2ODA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2ODA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2ODEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2ODExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2ODEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2ODEzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjgyNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjgyODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNjgzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjgzMjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY4NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY4NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY4NDc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2ODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2ODYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2ODYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2ODYyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjg3Mzs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjg4MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNjg4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjg4NDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY4OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY4OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY4OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY5MDA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2OTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2OTEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2OTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2OTE1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2OTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2OTE3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA2OTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA2OTIwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjkzMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNjkzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjkzNjsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY5NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY5NTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDY5NTY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDY5NjE7MjE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwNjk4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNjk4NTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwNjk5MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDcwMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcwMDE7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA3MDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MDE1OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwNzAzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzAzMzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDcwNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcwNDc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDcwNTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDcwNTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcwNTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDcwNTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcwNjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDcwNjI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcwNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDcwNjU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcwNjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MDcwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MDc0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzA3Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcwODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcwODQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MDg4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzA5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzA5ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcxMDM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MTA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MTEyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzExMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzExNDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwNzExNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzEyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcxMjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcxMjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MTI2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjA3MTMzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzEzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzEzOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcxNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcxNDY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MTQ5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzE1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzE1Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcxNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcxNTk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MTY5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzE3Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcxNzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcxODE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MTgzOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjA3MTkwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzE5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzE5Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcyMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcyMDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MjA3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcyMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcyMTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MjIxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzIyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzIzMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcyMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcyMzI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMDcyMzk7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzI1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzI1NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcyNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcyNjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MjYzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzI2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzI2NzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3Mjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3Mjc4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzI4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzI4NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDcyODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDcyODg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3Mjk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3Mjk2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzI5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzMwMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDczMDI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDczMDQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MzA5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzMxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzMxMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDczMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDczMTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MzIzOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDczMzM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDczMzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MzM4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzM0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzM0NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDczNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDczNDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3MzU1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzM2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzM2Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDczNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDczNjg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3MzcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3Mzc1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzM3NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzM3ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDczODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDczODE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3Mzg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3Mzg5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzM5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzM5Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc0MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc0MDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NDA4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzQxNjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzQxODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc0MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc0MjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NDI1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzQzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzQzMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc0Mzg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NDQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NDQ5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzQ1MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc0NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc0NTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NDYwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzQ3MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc0NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc0NzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NDc1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzQ3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzQ4MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc0ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc0ODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NDkxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzQ5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzQ5ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc1MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc1MDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NTA2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzUxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzUxNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc1MTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc1MjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NTIzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NTI1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzUyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzUzMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc1MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc1MzM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NTQxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzU0NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc1NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc1NDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NTUzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzU1NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc1NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc1NjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NTY2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzU3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzU3MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc1NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc1NzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NTgwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzU4NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzU5MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc1OTE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc1OTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NTk3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzYwNDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc2MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc2MTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NjE5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzYyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzYyMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc2Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc2Mjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NjMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NjMzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzY0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzY0MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc2NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc2NDU7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzY2MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzY2NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc2NjU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc2Njc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NjcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzY3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzY3NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc2NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc2Nzc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NjgzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3Njg1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzY5MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc2OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc2OTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3Njk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NzAwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzcwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzcwNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc3MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc3MDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NzEzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzcxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzcxNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc3MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc3MjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NzIzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzcyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzcyOTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc3MzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc3NDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NzQxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NzQzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzc0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzc0NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc3NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc3NTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NzU1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzc1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzc1ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc3NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc3NjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3NzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3NzcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzc3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzc3NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc3ODA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3Nzg2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3Nzg4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzc5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzc5MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc3OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc3OTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3ODAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3ODAzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzgwNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzgwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc4MTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc4MTI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzgyMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc4Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc4MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3ODMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3ODM0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzgzODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc4NDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3ODUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3ODUxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzg1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzg1Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc4NjU7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzg4MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzg4NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc4ODU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc4ODc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3ODkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3ODk0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzg5NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc5MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc5MDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3OTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3OTA0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzkwOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzkxMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc5MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc5MTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3OTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3OTE5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc5Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc5MzA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3OTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3OTM3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzk0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzk0Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc5NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc5NTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3OTUzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3OTU3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzk1ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzk2MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDc5NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDc5NjQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3OTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3OTcxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzk3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzk3ODsxNTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA3OTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA3OTk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwNzk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwNzk5ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgwMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgwMDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MDA1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODAwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODAwODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgwMTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgwMTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MDIwOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwODAzMTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MDQ0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA4MDQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MDUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODA1Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODA1Njs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwODA2MDsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MDgyOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA4MDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MDg0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODA4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODA4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgwOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgwOTE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MTAwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODEwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODEwNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgxMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgxMDk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MTE3OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA4MTIyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MTI1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODEyNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODEzMDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwODEzNDsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MTYyOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA4MTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MTY0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODE2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODE2NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgxNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgxNzE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MTc4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODE4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgxODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgxODc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MTk0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODE5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODE5OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgyMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgyMDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MjExOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODIxOTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwODIyNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODIyNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgyMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgyMjk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDgyMzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgyMzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MjM5OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwODI1MDsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4Mjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4Mjc1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA4Mjc5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MjgyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODI4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODI4Njs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwODI5MDsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MzEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODMxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODMxNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgzMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgzMjE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MzI4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODMzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODMzMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgzMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgzMzY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MzQ0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODM0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODM0ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgzNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgzNTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA4MzYyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA4MzY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4MzcxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwODM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODM3Mzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwODM3ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODM4MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDgzODM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgzODU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDgzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgzOTI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDgzOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDgzOTc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA4NDA5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA4NDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4NDEzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA4NDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4NDIwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA4NDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4NDI0Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA4NDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4NDMyOzc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA4NDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4NDQwOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODQ1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODQ1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODQ1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODQ2MTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg0NzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg0Nzg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDg0ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg0ODI7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg0ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg0ODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg0ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg0ODg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg0OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg0OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg0OTY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg1MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg1MDY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDg1MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg1MTA7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA4NTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4NTI0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA4NTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4NTI2OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODU0OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODU1MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwODU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODU1NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg1NjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg1Njk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDg1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg1NzM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg1ODI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg1ODg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDg1OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg1OTE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg1OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg1OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg1OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg2MDA7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg2MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg2MDQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg2MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg2MDc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg2MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg2MTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg2MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg2MTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg2MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg2MTc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg2MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg2MjA7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg2MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg2MjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg2MjY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA4NjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4NjQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA4NjQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4NjQ2OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODY4MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODY4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODY4NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODY4OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODY5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODY5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODcwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODcwMTszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg3MzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg3MzU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg3NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg3NDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg3NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg3NDY7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA4Nzc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4Nzc4OzY2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMDg4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg4NDU7Mjg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIwODg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODg3NDsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg5MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg5MDE7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg5MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg5MTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg5MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg5MTI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg5MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg5MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg5MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg5MjQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg5MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg5Mjc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMDg5MzE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDg5MzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg5MzY7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA4OTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4OTYzOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA4OTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA4OTcxOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODk4ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODk5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwODk5MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwODk5MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDg5OTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDg5OTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MDAxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTAwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTAwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkwMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkwMTM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MDIzOzEzOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkwMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkwMzc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MDQ1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTA1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTA1NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkwNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkwNTk7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDkwNjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkwNjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MDY2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MDY5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTA3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTA3MTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIwOTA3ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkwODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkwODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MDkxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTA5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTEwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkxMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkxMDQ7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjA5MTE1OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkxMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkxMjg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDkxMzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkxMzU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MTM2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MTQwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA5MTQ0OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkxNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkxNjY7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDkxNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkxNjg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MTcxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTE3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTE3NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkxODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkxODQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MTg4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTE5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTE5Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkyMDE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDkyMDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkyMDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MjEwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MjE0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA5MjE4OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkyNDY7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDkyNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkyNDg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MjUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTI1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTI1NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkyNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkyNjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MjY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTI3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTI3MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkyNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkyNzg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MjgzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTI5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTI5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkyOTU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MzAzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA5MzA4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MzExOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTMxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTMxMzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwOTMxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTMyMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkzMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkzMjM7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjA5MzM0OzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkzNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkzNTk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDkzNjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkzNjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5MzY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5MzcxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA5Mzc1OzE5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDkzOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDkzOTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5Mzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NDAwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTQwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTQwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk0MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk0MTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5NDE2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA5NDIxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NDI0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTQyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTQyNjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwOTQzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTQzNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk0MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk0MzY7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMDk0NDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5NDQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NDQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTQ1MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTQ1Mzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwOTQ1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTQ2MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIwOTQ2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTQ2NTs0NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDk1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk1MTE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDk1MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk1MjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDk1MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk1MjU7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA5NTM5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NTQyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA5NTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NTQ1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA5NTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NTU1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA5NTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NTU4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjA5NTYyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA5NTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NTY0OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIwOTU5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTYwMjszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMDk2MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk2MzQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA5NjQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NjQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjA5NjQ4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NjUwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTY1MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTY1NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk2NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk2NTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5NjY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NjY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTY2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTY3MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk2Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk2ODA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5Njg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5Njg5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTY5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTY5Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk3MDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk3MDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5NzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NzEwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA5NzEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NzE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTcxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTcyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk3MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk3MjI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMDk3Mjk7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTc1MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk3NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk3NTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5NzY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5NzY3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTc2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTc2OTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMDk3ODA7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTc5Mzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwOTc5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTgwMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk4MDE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk4MDU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDk4MDk7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTgzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTgzMTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwOTgzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTgzMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk4MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk4MzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5ODM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5ODQwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTg0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTg0OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk4NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk4NTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5ODU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5ODU4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTg2Njs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwOTg3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTg3NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk4NzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk4Nzk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDk4ODM7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTkxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTkxMTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIwOTkxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTkxMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk5MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk5MTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5OTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5OTIwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTkyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTkyNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk5MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk5MzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5OTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5OTM2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTk0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTk0Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk5NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk5NDg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5OTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5OTU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTk1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTk2MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMDk5Njg7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMDk5NzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMDk5NzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjA5OTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5OTc4OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjA5OTgzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjA5OTg2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIwOTk4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIwOTk4ODsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMDk5OTk7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDAyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDAyNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMDAyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDAzMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTAwMzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAwMzY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTAwNDA7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDA1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDA2MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTAwNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAwNjU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwMDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwMDc0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDA3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDA3Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTAwODE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTAwODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAwODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwMDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwMDkxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEwMDk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwMDk5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDEwMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDEwMzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxMDEwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDExMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxMDExNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDExNTs1MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTAxNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAxNjc7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEwMTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwMTkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEwMTkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwMTk1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMDIwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDIxMjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxMDIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDIxNTsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTAyMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAyMzk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTAyNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAyNDI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTAyNDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTAyNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAyNDg7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEwMjgzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwMjg2OzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMDMxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDMxNzsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTAzNDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAzNDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTAzNDU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAzNDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwMzUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwMzUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDM1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDM1NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTAzNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAzNjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwMzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwMzY3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDM3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDM3Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTAzODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTAzODI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDM5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDM5Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA0MDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA0MDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNDA3OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEwNDEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNDEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDQxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDQxNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA0MTk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMTA0MjY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNDM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDQzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDQzOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA0NDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA0NTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNDUyOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxMDQ2MzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNDc2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEwNDgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNDgzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDQ4NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDQ4ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMDQ5MjsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNTE0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEwNTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNTE2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDUxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDUxOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA1MjM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNTMyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDUzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDUzNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA1NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA1NDE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNTQ5OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEwNTU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNTU3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDU1ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDU2Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMDU2NjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNTk0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEwNTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNTk2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDU5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDU5OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA2MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA2MDM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNjA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNjEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDYxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDYxNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA2MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA2MTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNjI2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDYzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDYzMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA2Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA2Mzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNjQzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDY1MTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMDY1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDY1OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA2NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA2NjE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTA2NjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA2Njk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNjcxOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxMDY4MjsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNzA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNzA3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEwNzExOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNzE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDcxNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDcxOTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMDcyMzsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNzQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNzQzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDc0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDc0ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA3NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA3NTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNzYwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMDc2NDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMDc2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDc3MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTA3NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA3NzQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTA3Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA3ODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEwNzg0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNzg2OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjEwNzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNzkzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjEwNzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwNzk4OzUxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMDg0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDg1MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMDg1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDg2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMDg2MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDg2NDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTA4Nzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA4ODE7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTA4ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA4ODQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTA4OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA4OTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTA4OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA4OTc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTA5MDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTA5MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA5MDM7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEwOTM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEwOTQxOzMzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMDk3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMDk3NTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTA5ODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTA5ODk7NjY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIxMTA1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTA1NjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxMTA1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTA1OTszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTEwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTEwOTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTEwOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTEwOTU7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExMTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMTE1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExMTE2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMTIwOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMTEzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTEzOTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTExNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTExNTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTExNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTExNTU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTExNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTExNTk7Mzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExMTk3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMjAxOzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMTIzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTIzMjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTEyNDc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTEyNTI7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExMjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMjcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExMjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMjczOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjExMjc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExMjc5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMjgyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExMjgzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMjg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExMjg2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMjg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTI5MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTI5NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTEyOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTEyOTY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExMzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMzA0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTMwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTMwODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTEzMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTEzMTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExMzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMzIzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTMyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTMyOTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTEzMzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTEzNDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExMzQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMzQzOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjExMzQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMzQ5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTM1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTM1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTEzNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTEzNTU7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMTEzNjI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExMzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMzcxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTM3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTM3NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTEzODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTEzODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExMzg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExMzg4OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxMTM5OTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNDExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNDEyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjExNDE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNDE5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTQyMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTQyNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMTQyODsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNDUwOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjExNDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNDUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTQ1NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTE0NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE0NTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNDY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNDY4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTQ3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTQ3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTE0NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE0Nzc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNDg1OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjExNDkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNDkzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTQ5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTQ5ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMTUwMjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNTMwOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjExNTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNTMyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTUzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTUzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTE1Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE1Mzk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNTQ2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTU1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTU1MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTE1NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE1NTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNTYyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTU2Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTE1NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE1NzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNTc5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTU4Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMTU5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTU5NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTE1OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE1OTc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTE2MDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE2MDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNjA3OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxMTYxODsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNjQzOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjExNjQ3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNjUwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTY1MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTY1NTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMTY1OTsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNjc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNjc5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTY4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTY4NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTE2OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE2OTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNjk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNjk2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMTcwMDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMTcwNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTcwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTE3MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE3MTA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTE3MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE3MTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjExNzIwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNzIyOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjExNzI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNzI5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjExNzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExNzM0OzQxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMTc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTc3Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMTc4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTc4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMTc4NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTc5MDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTE4MDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE4MDc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTE4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE4MTA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTE4MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE4MjA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTE4MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE4MjM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTE4Mjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTE4Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE4Mjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTE4MzA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE4MzQ7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExODY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExODcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjExODczOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjExODc2OzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMTkwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMTkwNTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTE5MTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTE5MTk7ODA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIxMTk5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjAwMDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxMjAwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjAwMzsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTIwMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIwMzE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTIwMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIwMzQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyMDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMDQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyMDUwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMDU0OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjA3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjA3MzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTIwODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIwODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTIwODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIwODk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTIwOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIwOTM7Mzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyMTMxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMTM1OzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjE2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjE2MTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTIxNzY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIxODE7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyMTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMTk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyMTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMTk3OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjEyMjAyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyMjAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMjA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyMjA3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMjA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyMjEwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMjEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjIxNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjIxODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTIyMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIyMjA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyMjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMjI4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjIzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjIzMjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTIyNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIyNDI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyMjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMjQ5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjI1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjI2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTIyNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIyNjM7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTIyNjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIyNjk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyMjcwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMjczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjI3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjI3NTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxMjI4MjsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyMjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMjk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjMwMTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTIzMDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIzMTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyMzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMzE0OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxMjMyNTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyMzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMzM4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEyMzQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMzQ1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjM0Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjM1MDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMjM1NDsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyMzc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMzc2OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEyMzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMzc4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjM4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjM4MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTIzODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTIzODU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyMzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyMzk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjM5ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI0MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI0MDM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyNDExOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEyNDE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNDE5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjQyMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjQyNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMjQyODsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyNDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNDU2OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEyNDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNDU4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjQ2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjQ2MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI0NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI0NjU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyNDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNDcyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjQ3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjQ3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI0ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI0ODE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyNDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNDg4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjQ5Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI1MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI1MDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyNTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNTA1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjUxMzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMjUxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjUyMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI1MjM7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTI1Mjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI1MzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyNTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNTMzOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxMjU0NDsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyNTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNTY5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEyNTczOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNTc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjU3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjU4MTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMjU4NTsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyNjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNjA1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjYwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjYxMDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI2MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI2MTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyNjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNjIyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjYyNjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMjYzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjYzNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI2MzY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTI2NDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI2NDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyNjQ2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNjQ4OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjEyNjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNjU1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjEyNjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNjYwOzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjY5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjY5NjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTI3MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI3MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTI3MTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI3MTY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyNzMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNzMzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjEyNzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyNzM2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjc1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjc1MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjc1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjc1NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxMjc1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjc2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjc2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjc2Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjc2NjszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTI4MDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI4MDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTI4MDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI4MDg7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEyODM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyODM1OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjg1MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjg1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMjg1NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjg1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI4NjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI4NjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyODY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyODY1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjg3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjg3MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI4Nzc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyODg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyODg3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjg5Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI5MDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI5MDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyOTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyOTExOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEyOTE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyOTE3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjkxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjkyMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI5MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI5MjM7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMTI5MzA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyOTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyOTM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjk0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjk0Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTI5NTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTI5NTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyOTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyOTU2OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxMjk2NzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEyOTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyOTgwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEyOTg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEyOTg3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMjk4ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMjk5Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMjk5NjsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMDE4OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEzMDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMDIwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzAyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzAyMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTMwMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMwMjc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMDM2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzAzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzA0MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTMwNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMwNDU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMDUzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEzMDU4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMDYxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzA2Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzA2Njs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMzA3MDsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMDk4OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEzMDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMTAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzEwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzEwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTMxMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMxMDc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMTE0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzExODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzExOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTMxMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMxMjM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMTMwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzEzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzEzNTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTMxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMxNDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMTQ3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzE1NTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMzE2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzE2MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTMxNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMxNjU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTMxNzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMxNzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMTc1OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxMzE4NjsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMjExOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEzMjE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMjE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzIxOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzIyMzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMzIyNzsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMjQ3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzI1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzI1Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTMyNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMyNjE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMjY0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzI2ODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMzI3MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzI3NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTMyNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMyNzg7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTMyODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMyODY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzMjg4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMjkwOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjEzMjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMjk3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjEzMzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzMzAyOzQxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMzM0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzM0NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMzM1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzM1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMzM1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzM1ODsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTMzNzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMzNzU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTMzNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMzNzg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTMzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMzODg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTMzOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMzOTE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTMzOTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTMzOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTMzOTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTMzOTg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM0MDI7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEzNDM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNDQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEzNDQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNDQ0OzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMzQ3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzQ3NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTM0ODQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM0ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTM0ODg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM0OTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNDkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNDk2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzQ5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzQ5ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM1MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM1MDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNTEwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzUxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzUyMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM1MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM1Mjc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNTM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNTM5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzU0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzU0MTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMzU0NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzU0NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM1NDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM1NTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNTUzOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjEzNTYwOzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM1NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM1NzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNTc5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzU4NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzU5MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM1OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM1OTI7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjEzNjAzOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM2MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM2MTY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTM2MjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM2MjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNjI0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNjI4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEzNjMyOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM2NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM2NTQ7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTM2NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM2NTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNjU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzY2Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM2NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM2NzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNjc2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzY4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzY4MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM2ODk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTM2OTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM2OTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNjk4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNzAyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEzNzA2OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM3MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM3MzQ7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTM3MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM3MzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNzM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzc0Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM3NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM3NTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNzU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzc1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzc1OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM3NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM3NjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNzcxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzc3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzc3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM3ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM3ODM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzNzkxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEzNzk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzNzk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzgwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzgwMTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMzgwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzgwOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM4MTE7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjEzODIyOzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM4NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM4NDc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTM4NTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM4NTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzODU1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzODU5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEzODYzOzE5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM4ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM4ODM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzODg4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzg5NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM4OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM5MDA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjEzOTA0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjEzOTA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzOTEyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxMzkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzkxNDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxMzkxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzkyMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTM5MjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM5MjY7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTM5MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM5MzM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTM5Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTM5Mzg7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjEzOTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjEzOTc0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMzk4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzk5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxMzk5MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxMzk5NDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTQwMDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQwMTE7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTQwMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQwMTQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE0MDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MDMwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE0MDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MDMzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE0MDM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE0MDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MDM5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE0MDQwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MDQ0OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDA3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDA4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDA4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDA4NjsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTQxMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQxMTM7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE0MTI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MTMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE0MTMzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MTM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDEzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDE0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQxNDM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0MTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MTUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDE1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDE1NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQxNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQxNjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0MTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MTY5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDE3Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQxODU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQxODg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0MTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MTkwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE0MTkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MTk2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDE5NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDIwMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQyMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQyMDI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMTQyMDk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0MjE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MjE4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDIyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDIyMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQyMzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQyMzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0MjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MjM1OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxNDI0NjsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0MjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MjU5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE0MjYzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MjY2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDI2Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDI3MTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNDI3NTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0Mjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0Mjk3OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE0Mjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0Mjk5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDMwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDMwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQzMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQzMDY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MzE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDMxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDMxOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQzMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQzMjQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0MzMyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE0MzM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MzQwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDM0MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDM0NTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNDM0OTsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0Mzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0Mzc3OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE0Mzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0Mzc5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDM4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDM4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQzODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQzODY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0MzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0MzkzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDM5ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ0MDI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0NDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NDA5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDQxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDQxNDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ0MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ0MjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0NDI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NDI2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDQzNDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNDQzOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDQ0MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ0NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ0NDQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTQ0NDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ0NTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0NDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NDU0OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxNDQ2NTsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0NDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NDkwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE0NDk0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NDk3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDQ5ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDUwMjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNDUwNjsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0NTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NTI2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDUzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDUzMTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ1Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ1NDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0NTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NTQzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDU0Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNDU1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDU1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ1NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ1NTc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTQ1NjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ1NjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0NTY3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NTY5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE0NTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NTc2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE0NTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NTgxOzQxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDYyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDYyMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDYzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDYzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDYzNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDYzNzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxNDYzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDY0MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDY0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDY1MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDY1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDY1Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxNDY1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDY1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDY1OTszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTQ2OTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ2OTc7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE0NzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NzIzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDczMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDczNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNDczNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDczOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ3NDI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ3NDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0NzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NzQ4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDc1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDc1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ3NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ3NjE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0NzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NzY4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDc3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDc3MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ3NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ3NzU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0NzgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0NzgxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDc4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDc4Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ3OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ3OTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0Nzk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0Nzk2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDgwMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDgwNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ4MTA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0ODE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0ODE5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDgyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDgyMTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0ODMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0ODMzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDg0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDg0MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ4NDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0ODUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0ODUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDg1NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ4NTk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0ODY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0ODY1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDg3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDg3MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ4NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ4NzU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0ODc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0ODgwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDg4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDg4NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ4ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ4OTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0ODkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0ODkzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDg5NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ5MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ5MDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0OTA4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0OTEyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDkxNDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNDkxNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDkyMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ5MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ5MjI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0OTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0OTI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDkzMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ5MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ5MzY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0OTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0OTQzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDk0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDk0NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ5NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ5NDg7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDk2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDk2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ5Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ5NzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0OTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0OTc1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDk3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDk3OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTQ5ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTQ5ODU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE0OTg4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE0OTkyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNDk5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNDk5NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUwMDM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MDEzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTAxNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUwMjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUwMjc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MDI5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE1MDMzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MDM2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTAzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTA0MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUwNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUwNDI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMTUwNDk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MDU1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTA2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTA2MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUwNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUwNjU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MDcxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTA4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTA4MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUwODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUwODc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MDk0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTA5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTA5OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUxMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUxMDI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MTA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MTEyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTExMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTExNDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxNTEyMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUxMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUxMjg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MTM1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTEzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTEzODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUxNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUxNDI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MTQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTE1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTE1MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUxNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUxNTg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MTY1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTE2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTE3MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUxNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUxNzI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMTUxNzk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MTg2OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUxOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUxOTc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MjA1OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUyMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUyMTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MjIwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTIyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTIyNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUyMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUyMzA7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTI0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTI0NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUyNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUyNDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MjUxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTI1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTI1ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUyNjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MjY5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTI3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTI3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUyODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUyODE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1Mjg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1Mjg4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTI5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTI5MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUyOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUyOTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MzAyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTMxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTMxMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUzMTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUzMjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MzIzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTMyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTMyNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUzMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUzMzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MzM5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTM0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTM0NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUzNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUzNTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1MzU4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTM2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTM2ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUzNzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUzNzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1Mzc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1Mzc1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTM4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTM4MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUzODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTUzODU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1MzkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1Mzk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTM5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTM5NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTUzOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU0MDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NDA0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTQwNzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNTQwODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU0MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU0MTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NDIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTQyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTQyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU0Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU0Mjk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NDM0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NDM3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTQzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTQzOTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMTU0NTA7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTQ2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTQ2Mzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNTQ2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTQ3MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU0NzE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU0NzU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTU0Nzk7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTUwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTUwMTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNTUwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTUwMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU1MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU1MDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NTEwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTUxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTUxOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU1MjM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NTI4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTUzNjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNTU0MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTU0NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU1NDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU1NDk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTU1NTM7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTU4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTU4MTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNTU4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTU4MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU1ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU1ODY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NTkwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTU5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTU5Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU2MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU2MDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NjA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NjA2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTYxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTYxMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU2MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU2MTg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NjI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTYyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTYzMDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU2Mzg7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTU2NDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU2NDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NjQ4OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE1NjUzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NjU2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTY1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTY1ODsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMTU2Njk7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTY5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTY5NDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNTY5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTcwMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU3MDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU3MDU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTU3MDk7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTcyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTcyOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU3MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU3MzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NzQxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTc0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTc0NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU3NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU3NTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NzU0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTc1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTc1Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU3NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU3NjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1NzY5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTc3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTc3NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU3ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU3ODE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1NzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1Nzg0OzMzOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU4MTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU4MjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1ODIyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1ODI1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE1ODI5OzE5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU4NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU4NDk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1ODUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1ODU0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTg2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTg2MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU4NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU4NjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1ODY4OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE1ODczOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1ODc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTg3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTg3ODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNTg4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTg4NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTU4ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU4ODg7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMTU4OTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE1ODk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1OTAxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNTkwMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTkwNTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxNTkxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTkxMjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxNTkxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNTkxNzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTU5MzY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTU5Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU5NDA7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTU5NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU5NDc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTU5NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU5NTE7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTU5NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTU5NTk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE1OTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1OTcyOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE1OTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1OTgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE1OTgxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE1OTg0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNTk5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjAwMTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxNjAwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjAwNDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYwMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYwMjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYwMjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYwMjU7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTYwMzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYwMzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYwMzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYwMzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYwNDA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTYwNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYwNDM7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYwNTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYwNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYwNTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTYwNTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYwNjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYwNjE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYwNjY7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MTAxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MTA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MTA2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MTEwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE2MTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MTEzOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjEyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjEyODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjEzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjEzMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjEzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjEzNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjEzNTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjE0MDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYxNTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTYxNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYxNTg7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MTc2Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MTg0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE2MTg4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MTkwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE2MTk0OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MTk3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjAyOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE2MjA4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjA5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjE3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE2MjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjIxOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjI3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjM1Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjQ1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE2MjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjQ4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjU3OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjYxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjY0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2Mjc0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2Mjc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2Mjc3OzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjgxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2MjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2MjgzOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjI5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjI5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjMwMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjMwNDszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYzMzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYzNDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYzNDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYzNDc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTYzNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYzNTE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYzNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYzNjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTYzNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTYzNjM7MzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2Mzk0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2Mzk3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE2NDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NDAxOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NDEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NDExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NDEyOzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjQ0MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjQ0Njs0MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY0ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY0OTA7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY0OTg7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY1MDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY1MDk7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NTM2Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NTQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NTQ3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NTU3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NTU5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NTYyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE2NTY2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NTY4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NTczOzU5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMTY2MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY2MzM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTY2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY2MzY7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NjYyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjY3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjY3NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjY3ODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxNjY4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjY4Mjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjY4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjY5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjY5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjY5Mjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjcwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjcwMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjcwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjcwNDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY3MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY3MTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY3MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY3MTc7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2NzM4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NzQyOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE2NzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2NzQ2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjc1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjc1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjc1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjc2MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjc3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjc3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjc3MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjc3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjc3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjc3NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY3ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY3ODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY3ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY3OTA7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2ODExOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2ODE3Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2ODI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2ODI1Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE2ODMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE2ODM0OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxNjg1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjg1NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY4Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY4Njk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY4NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY4NzE7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY4Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY4ODA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTY4ODQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY4ODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY4ODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTY4OTA7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTY4OTU7NTQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIxNjk0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNjk1MDs1MzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjE3MDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MDA0OzE4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMTcwMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcwMjM7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE3MDQyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MDQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE3MDQ1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MDQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzA1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzA1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcwNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcwNTU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MDYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MDY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzA2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzA2ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcwNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcwNzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MDc5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzA4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzA4NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcwODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcwOTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MDk0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzA5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzEwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcxMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcxMDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MTA3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzExMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzExMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcxMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcxMTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MTIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzEyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzEyNjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MTM3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzE0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcxNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcxNDc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MTU0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzE2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzE2Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcxNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcxNjg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MTcyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MTc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzE3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzE3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcxODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcxODI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MTg4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzE5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzE5MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcxOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcxOTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MjAzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzIwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzIwODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcyMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcyMTE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MjE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MjIwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzIyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzIyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcyMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcyMjg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MjMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MjMzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzIzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzIzNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcyNDI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcyNDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MjQ4OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcyNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcyNTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MjYxOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcyNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcyNzI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3Mjc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3Mjc3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzI4MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTcyODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTcyODg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MjkzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzI5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzMwMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTczMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTczMDQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MzA5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzMxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzMxNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTczMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTczMTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MzI0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzMyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzMyODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTczMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTczMzM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MzM4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzM0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzM0Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTczNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTczNDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MzUwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzM1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzM1Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTczNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTczNjI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MzY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MzY1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzM2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzM3MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTczNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTczNzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3Mzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3MzgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzM4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzM4NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTczODg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTczOTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3MzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3Mzk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzM5ODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NDA5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzQxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzQxNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc0MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc0MTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NDIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NDI2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzQyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzQyODszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNzQzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzQzNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc0MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc0MzY7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTc0Mzk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NDQ0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE3NDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NDQ5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzQ1NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc0NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc0NjA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NDY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NDY4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzQ3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzQ3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc0ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc0ODI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NDkwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzQ5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzUwMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc1MDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc1MDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NTA3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzUxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzUxNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc1MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc1MTg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NTI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NTI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzUzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzUzMTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxNzUzNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzUzOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc1NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc1NDE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTc1NDU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NTU1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzU2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzU2Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc1NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc1NzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NTc3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzU4Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc1OTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc1OTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NjAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NjAxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE3NjA1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzYxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzYxNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc2MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc2MjE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NjMwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzYzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzYzNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc2NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc2NDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NjQ3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzY1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzY1NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc2NjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NjY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NjY1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzY2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzY3MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc2NzQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc2Nzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3Njc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NjgwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzY4ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc2OTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc2OTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NzAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NzAxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE3NzA1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzcxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzcxNTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NzI2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzczNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzczNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc3NDE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NzUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzc1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzc1NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc3NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc3NjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3NzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3NzY2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzc3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzc3NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc3NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc3NzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3Nzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3Nzc5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzc4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzc4Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc3OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc3OTI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3ODAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3ODAxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzgwNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzgwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc4MTA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTc4MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc4MTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3ODE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3ODIwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE3ODI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3ODI3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzgyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzgzMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc4MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc4MzM7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMTc4NDA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3ODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3ODQ2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzg1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzg1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc4NTY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3ODYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3ODYyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzg3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzg3MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc4NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc4NzU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3ODgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3ODg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzg4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzg4Nzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxNzg5NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc5MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc5MDE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3OTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3OTA4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzkxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzkxMTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3OTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3OTIyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzkyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzkyNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc5MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc5MzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3OTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3OTM4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzkzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzk0MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc5NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc5NDM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3OTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3OTUwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzk1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzk1NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc5NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc5NTk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMTc5NjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3OTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3OTcxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzk3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzk3NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc5ODE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3OTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3OTg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxNzk4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxNzk4ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTc5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTc5OTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE3OTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE3OTk3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODAwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODAwNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgwMDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgwMTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MDE0OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxODAyNTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MDM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MDM4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE4MDQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MDQ1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODA0Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODA1MDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxODA1NDsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MDc2OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE4MDc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MDc4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODA4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODA4MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgwODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgwODU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MDk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODA5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODA5ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgxMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgxMDM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MTExOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE4MTE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MTE5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODEyMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODEyNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxODEyODsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MTU2OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE4MTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MTU4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODE2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODE2MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgxNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgxNjU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MTcyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODE3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODE3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgxODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgxODE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MTg4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODE5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODE5Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgyMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgyMDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MjA1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODIxMzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxODIxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODIyMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgyMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgyMjM7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTgyMjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgyMzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MjMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MjMzOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIxODI0NDsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MjY5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE4MjczOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4Mjc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODI3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODI4MDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxODI4NDsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MzA0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODMwOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgzMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgzMTY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MzIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MzIyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODMyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODMyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgzMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgzMjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MzMyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODMzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODM0MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgzNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgzNDQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4MzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4MzUwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODM1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODM1NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgzNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTgzNTk7MzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODM5Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODM5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTgzOTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg0MDA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTg0MDQ7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODQyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODQyNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg0MzI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NDM5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODQ0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODQ0NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg0NDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NDUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODQ1NTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg0NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg0NjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NDYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NDY0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODQ3MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg0NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg0NzU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NDgwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg0OTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg0OTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NDk1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NDk4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODUwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODUwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg1MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg1MTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NTE1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODUyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODUyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg1Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg1Mjk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NTM3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODUzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODU0MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg1NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg1NTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NTU1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODU1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODU1ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg1NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg1NjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NTcwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODU3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODU3MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg1NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg1Nzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NTgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODU4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODU4NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg1OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg1OTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NTk4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODYwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODYwMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg2MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg2MDM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NjA4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODYxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODYxODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg2MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg2MjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NjI1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODYzNDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIxODYzOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODY0NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg2NDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg2NDg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTg2NTI7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODY3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODY3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg2NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg2Nzc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4Njg0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODY4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODY4Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTg2OTE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMTg2OTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg2OTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE4NzAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NzAxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjE4NzA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4NzA5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxODcxMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODcxMzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxODcxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODcyMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxODcyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODcyNTsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg3NDI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTg3NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg3NDY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg3NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg3NTM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTg3NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg3NTc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg3NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg3NjU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg3NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg3NzI7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg3Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg3Nzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg3Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg3ODI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE4Nzk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4Nzk5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE4ODAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4ODAzOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxODgxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODgxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxODgxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODgxOTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg4MzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4Mzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTg4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4NDE7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4NDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg4NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4NDc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg4NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4NTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4NTU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg4NjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4NjU7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg4NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4NzE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg4Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4Nzk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTg4ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4ODM7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg4OTE7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg4OTc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTg4OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5MDA7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg5MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg5MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5MDk7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg5MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5MTM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg5MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5MTY7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg5MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg5MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5MjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5MjY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg5Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5Mjk7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg5MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5MzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTg5MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTg5MzU7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE4OTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4OTUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE4OTUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE4OTU1OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxODk5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODk5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxODk5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxODk5ODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxOTAwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTAwMTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTAwNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTAwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTAxMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxOTAxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTAxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTAxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTAxNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTAyMTszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTkwNTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkwNTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTkwNjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkwNjM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5MDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MDc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5MDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MDc3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5MDgzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MDg2Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5MDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MDk2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5MDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MDk4OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5MTAyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MTA1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTExNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTExNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTExNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTExODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTEyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTEyNjsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTkxNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkxNDc7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTkxNTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTkxNTQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkxNTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTkxNTc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkxNTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5MTYyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MTY1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxOTE2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTE2Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTkxNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkxNzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5MTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MTc4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxOTE4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTE4NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTkxOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkxOTQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5MjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MjA0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxOTIwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTIwODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTkyMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkyMTU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5MjIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MjI0OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTkyMzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkyMzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5MjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MjQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxOTI0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTI0NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTkyNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkyNTI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5MjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MjU4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxOTI2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTI2Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTkyNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkyNjk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5Mjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5Mjc1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxOTI4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTI4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMTkyODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkyODY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjE5MjkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5Mjk2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIxOTI5ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTMwMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxOTMwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTMwNTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTMxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTMxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTMxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTMxNzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTMyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTMyNzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTkzMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkzMzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTkzNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTkzNDE7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5MzU4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MzYxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5MzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5MzcxOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTM4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTM4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTM4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTM4NzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk0MDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk0MDk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NDIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NDIzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NDI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NDI4Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NDM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NDM5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NDQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NDQ0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NDU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NDU2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NDU4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NDYxOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTQ4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTQ4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTQ4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTQ4NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTQ4NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTQ4OTsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk1MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk1MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk1MTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk1MTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk1MjA7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NTM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NTQwOzYxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMTk2MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk2MDI7Mjg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIxOTYzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTYzMTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxOTYzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTYzNDsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk2NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk2NTM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk2NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk2NTY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTk2NjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk2NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk2NjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk2NjM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk2Njc7NDg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5NzE1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5NzE5OzQzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTc2Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTc2NjsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk3OTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk3OTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk3OTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk4MDE7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5ODI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5ODI4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE5ODMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5ODMxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTg0NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTg0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTg0Nzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIxOTg1MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTg1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTg1MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTg1NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTg1ODsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk4ODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk4ODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk4OTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk4OTM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMTk4OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk4OTY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5OTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5OTExOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5OTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5OTE0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjE5OTE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5OTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5OTIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjE5OTIxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjE5OTI1OzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTk1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTk1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIxOTk2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIxOTk2MzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMTk5Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMTk5ODI7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwMDAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMDA0OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIwMDA5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDAxOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDAyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDAyMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDAyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAwMjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAwMzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIwMDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMDMyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDAzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDAzOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAwNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAwNDM7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDA1MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDA1NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAwNTg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAwNjA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjAwNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAwNjU7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwMDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMDgyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwMDgzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMDg2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDA5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDA5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDA5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDEwMDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjAxMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAxMTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjAxMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAxMTQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwMTI2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMTI5OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDE0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDE0NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDE0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDE0NzszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDE1MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDE1MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDE1MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDE1NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAxNTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAxNjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIwMTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMTYzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDE3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDE3MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAxNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAxNzU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIwMTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMTgyOzEzOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAxOTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAxOTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIwMTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMjAwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjIwMjAzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMjA2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDIwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDIxMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAyMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAyMTI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMjAyMTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIwMjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMjI2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDIzMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAyMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAyMzY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIwMjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMjQzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDI0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDI0Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAyNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAyNTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIwMjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMjU2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDI1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDI1ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAyNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAyNjA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIwMjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMjY3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDI3MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDI3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAyNzY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAyNzg7MTg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMDI5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDI5NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjAyOTk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAzMDE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjAzMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjAzMDY7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwMzIzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIwMzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMzI3Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwMzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMzM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwMzM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMzM5Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwMzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwMzQ5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDM2MDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDM2NjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMDM2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDM2OTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDM3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDM3NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDM3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDM4MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDM4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDM4MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDM4NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDM4ODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMDM5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDM5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDM5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDM5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDQwMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA0MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA0MTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA0MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA0MTU7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNDMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNDM0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIwNDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNDM3Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNDQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNDQ3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNDQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNDUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNDUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNDU1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIwNDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNDU5Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNDY3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNDY5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDQ3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDQ4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDQ4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDQ4Mjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDQ4OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDQ5MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMDQ5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDQ5NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA1MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA1MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA1MTE7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNTI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNTMwOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNTM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNTQwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDU1Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDU1NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMDU1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDU2MDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA1NzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA1NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA1NzU7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNTkzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNTk1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNjA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNjA3OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDYyMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDYyNDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDYzMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDYzNjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA2NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA2NDg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNjU4Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNjY1OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMjA2ODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA2ODk7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA2OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA2OTg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNzA4Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNzE1OzE2OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMjA3MzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA3MzQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwNzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwNzQ3OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDc2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDc2MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMDc2NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDc2Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDc3MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMDc3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDc3NDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDc4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDc4MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDc4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDc4NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA3OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA3OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA3OTk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA4MDQ7NjE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIyMDg2NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDg2ODsyMTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjIwODg5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwODkyOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIwODk3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwOTA1OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwOTExOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDkyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDkyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDkyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDkyNDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA5MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA5Mzc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwOTQ3Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwOTU0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwOTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwOTYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIwOTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIwOTYzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMDk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMDk3NjsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA5ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjA5OTA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjA5OTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjA5OTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEwMDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjEwMDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEwMDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjEwMDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEwMDg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjEwMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEwMTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjEwMTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEwMTg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjEwMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEwMjI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMDM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMDM3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTA0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTA0ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTA0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTA1MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTA1Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTA2MTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMTA2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTA2NTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjEwNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEwNzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjEwNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEwNzk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMDk2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMDk4OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTExMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTExMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTExMzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjExMjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjExMjk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjExMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjExMzM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMTQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMTQ4OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTE2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTE2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTE2ODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTE3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTE3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTE3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTE4MDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjExOTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjExOTc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjEyMDQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEyMDk7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMjIzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTIzMzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTIzODsyMTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjIxMjU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMjYyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTI3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTI3NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjEyODQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEyOTA7MTY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIyMTMwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTMwOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjEzMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEzMjI7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMzM2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIxMzQwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxMzQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMzQ2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIxMzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxMzQ5OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTM2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTM2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTM2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTM2NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjEzNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEzNzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjEzNzk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjEzODQ7NTg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIyMTQ0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTQ0NTsxNjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjIxNDYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNDY0OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIxNDY5Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxNDc3OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNDgzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTQ5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTQ5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTQ5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTQ5NjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjE1MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE1MDk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxNTE5Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNTI2Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxNTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNTM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxNTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNTM2OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTU0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTU0OTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjE1NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE1NjM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjE1Njc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjE1Njk7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE1NzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjE1NzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE1Nzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjE1Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE1ODI7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxNjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNjA1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxNjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNjA4Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIxNjE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNjE4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIxNjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNjIyOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTYzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTYzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTYzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTYzNTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTY0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTY0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTY0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTY0NTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTY1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTY1NTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjE2NzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE2Nzc7NDg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIyMTcyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTcyNjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTczMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTczNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMTczNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTczNjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjE3NDc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE3NDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjE3NTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE3NTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxNzU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNzU4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMTc1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTc2MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE3Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE3Njg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxNzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNzcyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMTc3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTc3OTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxNzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxNzkyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMTc5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTc5Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE4MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE4MDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxODA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxODA3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE4MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE4MTg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxODI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxODI3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMTgyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTgyOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE4MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE4MzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxODM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxODM2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMTg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTg0NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE4NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE4NDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxODUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxODUyOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE4NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE4NjM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxODcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxODc0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMTg3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTg3NjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyMTg3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTg4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE4ODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE4ODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxODg4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjIxODk1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMTkwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTkwMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE5MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE5MDk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxOTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxOTEyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMTkxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTkxOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE5MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE5MjI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxOTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxOTMwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMTkzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTkzMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE5MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE5MzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxOTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxOTM2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMTk0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTk0Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE5NDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE5NTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxOTUyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxOTU0OzE4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE5NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE5NzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIxOTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxOTc1Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjIxOTgzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIxOTg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMTk4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMTk4Nzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjE5OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjE5OTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyMDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMDAzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjAwNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjIwMTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIwMTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyMDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMDIxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjAzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjAzMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjIwMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIwMzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyMDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMDQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjA0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjA0Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjIwNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIwNTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyMDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMDYwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjA2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjA2Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjIwNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIwNzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyMDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMDc2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjA3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjA4MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjIwODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIwODk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyMDkxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMDkzOzc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIyMTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMTAxOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjEyMTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMjEyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjEyNTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjEzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjEzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjEzNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjEzNzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMjEzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjE0MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjE0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjE0ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjE1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjE1MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjE1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjE1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjE1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjE1OTs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMjE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjE2Njs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMjE3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjE3MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjE3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjE3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjE3OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjE4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjE4OTsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjIyMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIyMDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjIyMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIyMDU7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIyMjI0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMjI3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIyMjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMjMwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjI0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjI0NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjI0ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMjI1MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjI1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjI1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjI1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjI1OTs0OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjIzMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIzMDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjIzMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIzMTE7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjIzMTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIzMjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjIzMjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIzMjY7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIyMzUxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMzU0OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIyMzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMzYxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIyMzY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIyMzY2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMzY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIyMzY5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMzcxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjM3NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjM3ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjIzNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIzODA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyMzg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyMzg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjM5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjM5MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjIzOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjIzOTY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNDAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNDA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjQwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjQwNjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyMjQwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjQxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI0MTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI0MTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNDE4OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIyMjQyOTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNDQyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjIyNDQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNDQ5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjQ1MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjQ1NDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyMjQ1ODsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNDgwOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjIyNDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNDgyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjQ4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjQ4NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI0ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI0ODk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNDk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjUwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjUwMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI1MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI1MDc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNTE1OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjIyNTIwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNTIzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjUyNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjUyODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyMjUzMjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNTYwOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjIyNTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNTYyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjU2NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI1Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI1Njk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNTc2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjU4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjU4MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI1ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI1ODU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNTkyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjU5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjU5Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI2MDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNjA5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjYxNzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyMjYyMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjYyNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI2Mjc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjI2MzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI2MzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNjM3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNjM5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIyNjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNjQ2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIyNjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNjUxOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjY2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjY2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjY2NzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjI2ODE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI2ODQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIyNjk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNzAwOzI4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjcyODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjczMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMjczMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjczMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI3MzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI3Mzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNzQxOzE2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI3NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI3NTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNzYzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjc2Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI3NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI3NzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNzc3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjc4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjc4MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI3ODc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI3OTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyNzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNzkyOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjIyNzk1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyNzk4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjc5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjgwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI4MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI4MDQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMjI4MTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyODE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyODE3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjgyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjgyMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI4MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI4MjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyODMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyODMzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjgzOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjg0MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI4NDU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjI4NDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI4NTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyODUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyODU0OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjIyODU4OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI4Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI4NzA7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjI4NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI4NzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyODc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyODc2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjg4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjg4NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI4ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI4OTA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyODk2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjIyOTAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyOTA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjkwNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjkwNzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyMjkxMTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI5MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI5MjE7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjI5MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI5MjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyOTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyOTI3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjkzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjkzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI5Mzk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyOTQ1OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjIyOTUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyOTUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjk1NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjk1Njs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyMjk2MDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyOTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyOTcxOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjIyOTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyOTczOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjk3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjk3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjI5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjI5ODE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIyOTg1OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjIyOTkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIyOTkzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMjk5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMjk5NTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyMzAwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzAwMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjMwMDU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMwMDc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjMwMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMwMTI7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMDMxOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMDM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMDM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMDM5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMDQyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIzMDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMDQ1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzA1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzA1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzA1Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzA2MTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjMwODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMwODI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjMwODY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjMwODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMwOTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjMwOTI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMwOTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjMwOTU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMwOTc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjMxMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMxMDI7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMTI0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMTMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMTMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMTM1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzE0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzE0NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjMxNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMxNTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjMxNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMxNTk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMTc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMTc4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIzMTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMTgxOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzIwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzIwMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzIwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzIwNTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzIwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzIwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzIwOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzIxMzszOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjMyNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMyNTM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMjY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMjY2Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMjc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMjc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMjc4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzI5MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzI5NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzI5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzI5Njs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMzMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzMwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzMwMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzMwNjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyMzMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzMwOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjMzMjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMzMjI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjMzMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMzMjU7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMzM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzMzM3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzMzQyOzM5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzM4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzM4MjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjMzOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjMzOTU7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzNDE2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNDIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzNDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNDIyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIzNDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNDI3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzNDI4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNDMzOzM5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzQ3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzQ3MzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM0ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM0ODY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM0OTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM0OTg7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzNTExOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNTE2OzM5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzU1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzU1NjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM1Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM1Njk7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzNTkwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNTk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzNTk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNTk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzNjAwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNjAzOzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzYzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzYzMTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzYzODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzY0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzY0MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzY0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM2NDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM2NDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzNjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNjUxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzY1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzY1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM2NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM2NjE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzNjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNjcxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzY4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzY4MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM2ODc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM2OTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzNjkyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNjk0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjIzNjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzNjk5OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzcxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzcyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzcyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzcyNDszOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM3NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM3NjY7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM3NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM3NzI7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM3Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM3Nzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM3ODA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjM3ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM3ODQ7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM3OTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM3OTU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM4MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM4MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM4MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM4MDU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzODE3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzODIwOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzODI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzODI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjIzODI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzODMwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyMzg0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzg0NTszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM4NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM4NzY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM4ODM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM4ODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjM4ODY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM4ODg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzODkxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzODk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzg5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzg5Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM5MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM5MDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzOTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzOTA5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzkxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzkxMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM5MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM5MjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzOTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzOTI2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzkzMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzkzNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM5MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM5Mzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzOTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzOTQyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzk1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzk1MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM5NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM5NTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzOTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzOTY1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzk3MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM5NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM5NzU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjIzOTg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjIzOTg3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyMzk4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzk4OTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyMzk5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyMzk5NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjM5OTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjM5OTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0MDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MDAxOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjI0MDA4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDAxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDAxMzsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0MDI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MDI1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDAzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDAzMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQwMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQwMzg7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDA1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDA1MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQwNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQwNTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0MDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MDYwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDA2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDA2NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQwNzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQwNzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0MDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MDc1Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjI0MDgyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDA4NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDA4ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQwOTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQwOTI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjQwOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQwOTk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjQxMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQxMDQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MTE2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI0MTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MTI0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MTMwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MTMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MTM0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDE0ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDE1MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNDE1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDE1NDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQxNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQxNjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQxNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQxNjk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MTgxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MTg0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MTg3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI0MTkzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MTk0OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MjAwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI0MjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MjAzOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MjA5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MjEyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MjIyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MjIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MjI3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MjM3OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDI1MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDI1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDI1MzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQyNzI7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQyODA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQyODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQyODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQyOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQyOTE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQyOTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQzMDA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjQzMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQzMDM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MzEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MzE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0MzE1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0MzIwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDMzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDMzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDMzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDMzNzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDM0NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDM1MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDM1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDM1ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDM1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDM2MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNDM2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDM2NDsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQzODk7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0NDA1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NDA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0NDEwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NDE0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI0NDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NDE5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0NDIwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NDI1Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0NDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NDMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0NDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NDM1OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDQ1MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDQ1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDQ1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDQ1OTsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQ0ODM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ0ODc7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0NTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NTEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0NTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NTEyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0NTE0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NTE4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI0NTIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NTIxOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDUzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDUzNjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDUzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDUzOTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNDU0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDU0NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDU0Njs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDU1MTszNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQ1ODc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ1OTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQ1OTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ1OTY7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI0NjEyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NjE2OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNDYzNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDYzOTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNDY0NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQ2NTQ7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ2NTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQ2NjA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ2NjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjQ2NjM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ2NjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0NjY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NjcxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDY3Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ2Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ2Nzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0NjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NjgyOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ2OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ2OTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0Njk5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NzAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDcwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDcwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ3MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ3MDk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0NzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NzE3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDcyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDcyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ3Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ3Mjg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0NzM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NzQwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDc0MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDc0NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ3NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ3NDc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjQ3NTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ3NTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0NzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NzU2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjI0NzYzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDc2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDc2OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ3NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ3NzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0Nzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0Nzc3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDc4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDc4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ3ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ3ODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0NzkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0NzkxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDc5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDgwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ4MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ4MDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0ODA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0ODA4OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIyNDgxOTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0ODMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0ODMyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjI0ODM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0ODM5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDg0MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDg0NDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNDg0ODsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0ODY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0ODcwOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjI0ODcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0ODcyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDg3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDg3NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ4Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ4Nzk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0ODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0ODg4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDg5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDg5Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ4OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ4OTc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0OTA1OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjI0OTEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0OTEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDkxNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDkxODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNDkyMjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0OTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0OTUwOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjI0OTUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0OTUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDk1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDk1NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ5NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ5NTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0OTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0OTY2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDk3MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ5NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ5NzU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0OTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0OTgyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNDk4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNDk4Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjQ5OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjQ5OTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI0OTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI0OTk5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTAwNzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNTAxMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTAxNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjUwMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUwMTc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjUwMjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUwMjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1MDI3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1MDI5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI1MDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1MDM2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI1MDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1MDQxOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTA1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTA1Njs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTA2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTA2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTA2NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjUwNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUwNzk7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjUwODI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUwODU7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjUwOTA7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI1MTA3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1MTEwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTEyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTEyNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTEyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTEyNzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTEzNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTE0MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNTE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTE0Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTE0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTE1MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTE1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTE1Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNTE1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTE1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTE1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTE2MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTE2NDsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjUxODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUxODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjUxODc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUxODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjUxOTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUxOTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1MTk1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1MTk4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTE5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTIwMDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIyNTIwNTs0NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1MjUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1MjUzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTI1NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTI1Nzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNTI2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTI2NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNTI2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTI2OTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjUyODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUyODk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjUyOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUyOTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjUyOTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUzMDA7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI1MzE0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1MzE3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTMyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTMyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTMyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTMzMDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTMzNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTMzOTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNTM0NDszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjUzNzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUzNzk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjUzODg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUzOTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjUzOTE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjUzOTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1Mzk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1Mzk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTQwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTQwMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU0MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU0MDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NDEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTQxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTQxNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU0MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU0MjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NDI5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NDMxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTQzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTQzNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU0NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU0NDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NDQ1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTQ1MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU0NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU0NTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NDYyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NDY1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTQ2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTQ2Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU0NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU0Nzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NDgwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTQ4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTQ4ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU0OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU0OTE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NTAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTUwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTUwMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU1MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU1MDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NTEzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTUxNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU1MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU1MjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NTI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NTI4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTUyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTUzMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU1MzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU1Mzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NTQwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NTQzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTU0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTU0NTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIyNTU1Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU1NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU1NTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NTYxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTU2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTU2NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU1NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU1NzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NTc4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NTgxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTU4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTU4MzsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMjU1OTQ7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTYwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTYwNzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNTYxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTYxNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU2MTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU2MTk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjU2MjM7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTY0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTY0NTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNTY0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTY0NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU2NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU2NTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NjUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NjU0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTY2MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU2NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU2Njc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NjcyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTY4MDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNTY4NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTY4ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU2ODk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU2OTM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjU2OTc7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTcyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTcyNTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNTcyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTcyNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU3Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU3MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NzM0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTc0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTc0MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU3NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU3NDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NzUwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTc1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTc1Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU3NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU3NjI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NzcwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTc3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTc3NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU3ODI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjU3ODc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU3OTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1NzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1NzkyOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjI1Nzk3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1ODAwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTgwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTgwMjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNTgwNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTgwODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU4MTA7MTI7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjI1ODIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTgyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTgyNjsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1ODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1ODQ2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNTg1NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTg1NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjU4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU4NTk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjU4NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU4NjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI1ODY4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1ODcwOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI1ODc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1ODc3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI1ODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1ODgyOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTg5ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNTkwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTkwNjs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTkxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTkxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTkxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTkxNjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjU5MzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU5MzM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI1OTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1OTQ2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI1OTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1OTQ4OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI1OTUzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1OTU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI1OTU2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1OTU4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI1OTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI1OTYzOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNTk4MDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNTk4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNTk4NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjU5OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU5OTU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjU5OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjU5OTk7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYwMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYwMDU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjYwMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYwMDk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MDIwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MDIxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MDI0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MDMwOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MDM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MDM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MDM4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjA0OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjA1MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNjA1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjA1NTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjA2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjA2MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjA2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjA2NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNjA2OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjA3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjA3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjA3Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjA3Njs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNjA4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjA4NDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYwOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYwOTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYwOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYwOTg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYxMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYxMDQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYxMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYxMDc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MTIwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MTI0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI2MTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MTI4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjE0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjE0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjE0NTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYxNTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYxNTk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjYxNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYxNjI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MTc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MTc4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MTgzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI2MTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MTg2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjIwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjIwMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjIwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjIwNTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjIxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjIxNjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjIyMjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYyMzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYyMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYyMzk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MjQ5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MjU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MjU2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI2MjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MjYxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI2MjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MjY0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjI4MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjI4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjI4MzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYyOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYyOTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYyOTU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYzMDE7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MzE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MzE2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MzE4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MzI3OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MzMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MzMzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MzM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MzM4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MzQyOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI2MzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MzQ1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjM1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjM1ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjM2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjM2MTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYzNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYzNzY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjYzNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjYzNzk7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2Mzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2MzkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2MzkxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2Mzk2Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2NDA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2NDA2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2NDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2NDA5OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjQyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjQyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjQyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjQzMDszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjQzMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjQzNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjQzODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjQ0MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNjQ0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjQ0Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjQ1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjQ1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjQ1ODs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjQ2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjQ2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjQ2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjQ2NTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY0NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY0NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY0Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY0Nzg7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2NDk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2NDk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2NTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2NTAxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjUxMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjUxNTsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY1NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY1NDQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2NTU1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2NTU5OzQ5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjYwODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjYxMjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNjYxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjYxNTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY2MjY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY2Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY2Mjk7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2NjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2NjQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2NjQ2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2NjUxOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjY2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjY2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjY2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjY2ODsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY2Nzg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY2ODM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjY2ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY2ODY7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2Njk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2NzAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2NzAxOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2NzA3OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI2NzA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2NzEwOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjcyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjcyNjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjcyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjcyOTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY3NDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY3NDM7NzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY3NTA7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2NzcyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI2Nzc2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2Nzc4OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2Nzg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2Nzg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2Nzg2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI2NzkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2NzkxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI2NzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2Nzk0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjgwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjgxMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjgxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjgxMzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjgyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjgyNDs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjgzMTszOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY4NzA7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY4NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY4Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY4Nzg7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjY4ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY4ODM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjY4ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY4ODY7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2OTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2OTAyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI2OTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI2OTA1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjkxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNjkxNzs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNjkyNDs0MDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY5NjQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY5NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY5NzE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY5NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjY5Nzc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjY5ODI7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3MDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MDE1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzAyNzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzAzMjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNzAzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzAzNTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjcwNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjcwNTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjcwNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjcwNTQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjcwNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjcwNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjcwNjU7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjcwNzE7NTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3MTI4OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MTMzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3MTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MTM1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI3MTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MTQwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI3MTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MTQzOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzE1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzE1OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzE2MjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjcxNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjcxNzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjcxNzQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjcxODA7NTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3MjMzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MjM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3MjM5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MjQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3MjQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MjQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3MjQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MjUxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3MjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MjU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3MjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MjYxOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzI3MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzI3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzI3NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzI3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjcyNzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjcyODI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3MjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3Mjg0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzI4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzI5MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjcyOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjcyOTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3Mjk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MzAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzMwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzMwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjczMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjczMDc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MzE1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzMyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzMyMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjczMjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjczMzE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3MzMzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MzM1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI3MzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3MzQwOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzM1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzM1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzM2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzM2MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyNzM2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzM2Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzM3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzM3NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzM3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzM3OTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjczOTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjczOTc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjc0MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc0MDQ7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjc0MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc0MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjc0MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc0MTE7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3NDM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NDQxOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI3NDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NDQ1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzQ1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzQ1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzQ1ODszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjc0OTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc0OTY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjc0OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc1MDA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3NTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NTEzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3NTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NTE1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzUyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzUyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzUyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzUyOTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjc1NDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc1NDM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjc1NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc1NDc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjc1NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc1NTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjc1NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc1NTk7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3NTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NTc4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzU4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzU4OTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjc2MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc2MDY7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI3NjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NjM0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyNzY0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzY0NTsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjc2NjY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc2Njg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjc2Njk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc2NzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3Njc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3Njc3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzY3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzY3OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc2ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc2ODQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3Njg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3Njg4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzY5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzY5NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc3MDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc3MDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3NzA1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NzA4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzcwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzcxMDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIyNzcxNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc3MjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3NzI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NzMwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzczNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzczODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc3NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc3NDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3NzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NzUwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzc1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzc1NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc3NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc3NjA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3NzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3NzcwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzc3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzc3MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc3NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc3Nzc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3NzgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3Nzg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzc4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzc4NzsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMjc3OTg7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzgxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzgxMTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNzgxNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzgxODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc4MTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc4MjM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjc4Mjc7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzg0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzg0OTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNzg1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzg1MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc4NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc4NTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3ODU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3ODU4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzg2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzg2NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc4NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc4NzE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3ODc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3ODc2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzg4NDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNzg4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzg5MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc4OTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc4OTc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjc5MDE7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzkyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzkyOTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyNzkzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzkzMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc5MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc5MzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3OTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3OTM4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzk0NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc5NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc5NTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3OTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3OTU0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzk2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzk2MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc5NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc5NjY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3OTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3OTc0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyNzk3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyNzk3ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjc5ODY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjc5OTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjc5OTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI3OTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI3OTk2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjI4MDAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MDA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODAwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODAwNjsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMjgwMTc7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODA0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODA0Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyODA0NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODA0OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgwNTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgwNTM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMjgwNTc7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODA3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODA4MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgwODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgwODU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MDkyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODA5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODA5Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgxMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgxMDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MTA1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODEwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODEwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgxMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgxMTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MTE2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODExOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODEyMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgxMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgxMzA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MTM2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODEzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODEzOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgxNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgxNDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MTQ3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MTUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODE1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODE1Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgxNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgxNTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MTY0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODE2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODE2OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgxNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgxNzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MTg0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODE4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODE4OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgxOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgxOTc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MjA1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODIwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODIwODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgyMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgyMTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MjE3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODIxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODIyMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgyMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgyMjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MjMwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODIzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODIzNTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4MjQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MjQ4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODI0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODI1MDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIyODI1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODI1ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjgyNjA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgyNjI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjgyNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgyNjk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjgyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgyNzQ7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4Mjg5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI4MjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MjkzOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4MzAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MzAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4MzAyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4MzA1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyODMxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODMyMjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyODMyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODMyNjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyODMzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODMzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyODMzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODMzNTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjgzNTA7OTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgzNTk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjgzNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgzNjI7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjgzNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgzNzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjgzNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgzNzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjgzNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgzNzQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjgzNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgzNzc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjgzODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgzODQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjgzODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjgzODc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4Mzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NDAwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4NDAxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NDA1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI4NDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NDA4Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4NDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NDE2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4NDE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NDE4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4NDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NDIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4NDIyOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NDI3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyODQzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODQzOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyODQ0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODQ0MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyODQ0Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODQ0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyODQ0ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODQ1Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyODQ1Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODQ2MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyODQ2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODQ2Mzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyODQ3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODQ3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyODQ3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODQ3Mzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyODQ4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODQ4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyODQ4Mjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODQ4NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg0OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg0OTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg1MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg1MDE7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg1MDg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg1MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg1MTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg1MTc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjg1MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg1MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg1MjM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg1Mjg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjg1MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg1MzE7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4NTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NTU3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4NTU4OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NTY0OzYyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMjg2MjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg2MzA7NjQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIyODY5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODY5ODszODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg3MzY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg3NDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg3NDI7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg3NDc7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4NzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NzU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4NzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NzYxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4NzY4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4NzcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI4NzczOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4Nzc3OzQ3OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMjg4MjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg4MjY7NTU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIyODg4MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODg4MzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg4OTg7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjg5MDM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg5MDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg5MDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg5MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg5MTI7NTI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIyODk2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODk2NTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg5ODQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg5ODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjg5ODc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjg5OTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI4OTkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI4OTk2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyODk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyODk5ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkwMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkwMDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MDA5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTAxOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkwMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkwMjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MDMwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTAzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTAzMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkwMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkwMzc7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTA0NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTA0OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkwNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkwNTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MDU4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTA2MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkwNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkwNjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MDcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MDc1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTA3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTA3NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkwNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkwODA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MDg0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTA5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTA5NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkwOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkwOTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MTAzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTEwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTEwODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkxMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkxMTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MTE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTEyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTEyMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkxMzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkxMzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MTM1OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjI5MTM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MTQxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTE0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTE0NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkxNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkxNDc7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMjkxNTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MTYwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTE2Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkxNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkxNzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MTc1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTE3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTE3OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkxODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkxODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MTg4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjI5MTk1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTIwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTIwMjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkyMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkyMDk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MjExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MjEyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTIxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTIxNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkyMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkyMjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MjI2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTIyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTIyOTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMjkyMzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkyNDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MjQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MjQ2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTI0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTI0ODsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMjkyNTk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MjY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTI3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTI3MzsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5Mjk0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5Mjk3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTI5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTI5OTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIyOTMwNDs0MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjI5MzQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5MzQ4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIyOTM1MDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTM1Mjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyOTM1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTM1NzsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjkzNzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjkzODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkzODE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjkzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkzODg7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjkzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjkzOTI7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjkzOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk0MDA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjk0MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk0MDQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NDE5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI5NDI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NDI2Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NDM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NDM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NDM5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI5NDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NDQyOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTQ1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTQ1NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTQ1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTQ2MDsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk0ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk0ODQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk0ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk0ODc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NDk4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NTAxOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NTEwOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI5NTE2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NTE3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NTIwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTUzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTUzMzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk1NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk1NTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk1NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk1NTM7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NTgzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTU5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTU5NDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk2MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk2MTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk2MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk2MTI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjk2MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk2MTY7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NjM0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NjQyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NjQ1OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NjUyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NjYyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NjY0OzQyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTcwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTcwOTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTcxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTcxODs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTcyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTcyNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk3MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk3Mzc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk3NDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk3NDY7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjk3NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk3NDk7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NzY0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5NzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5NzY3OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTc5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTc5MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTc5Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTc5Nzs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTgwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTgwMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTgwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTgwNDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIyOTgwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTgwODsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk4Mjg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk4MzI7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk4Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk4Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk4Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk4NDA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMjk4NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk4NDQ7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5ODc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5ODc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5ODc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5ODc5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI5ODgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5ODg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5ODg1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5ODg5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTkwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTkwMTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk5MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk5MTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMjk5MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMjk5MTU7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5OTQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5OTQ1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5OTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5OTU1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5OTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5OTY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjI5OTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5OTY3OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjI5OTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjI5OTcxOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTk4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIyOTk4ODs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIyOTk5Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDAwMDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDAwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDAwNzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDAxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDAxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDAxNzszNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzAwNTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAwNTc7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzAwNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAwNjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzAwNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAwNjQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzAwNjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAwNjg7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMwMDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMDg2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDA5Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDEwMTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDEwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDEwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDEwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDEwOTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMDExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDExMzsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzAxMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAxMzc7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMwMTU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMTU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMwMTYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMTYzOzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDE5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDE5MTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDE5ODsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzAyMTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAyMTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzAyMTY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAyMTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMjIxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMjI0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDIyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDIyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzAyMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAyMzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMjM1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDI0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDI0MzsxNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMjU4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDI2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDI2MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzAyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAyNjU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMjY5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDI3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDI3NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzAyODI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAyODU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMjg3OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMwMjkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMjkzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDI5NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDI5NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzAyOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAyOTk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMzAzMDY7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDMxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDMxNzsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMzM1OzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzAzNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAzNTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMzUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMzUzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDM1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDM1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzAzNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAzNjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwMzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwMzY2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDM3NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDM3NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzAzNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzAzNzk7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjMwMzkwOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA0MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA0MDM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzA0MDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA0MTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNDExOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNDE1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMwNDE5OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA0NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA0NDE7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzA0NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA0NDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNDQ2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDQ1MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA0NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA0NTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNDYzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDQ2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDQ2ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA0NzY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzA0ODE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA0ODQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNDg1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNDg5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMwNDkzOzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA1MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA1MjE7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzA1MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA1MjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNTI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDUyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDUzMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA1MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA1Mzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNTQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDU0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDU0Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA1NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA1NTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNTU4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDU2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDU2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA1Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA1NzA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNTc4OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMwNTgzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNTg2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDU4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDU4ODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMDU5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDU5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA1OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA1OTg7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjMwNjA5OzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA2MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA2MzQ7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzA2Mzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA2NDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNjQyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNjQ2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMwNjUwOzE5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA2Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA2NzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNjc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNjc1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDY4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDY4NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA2ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA2ODc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMwNjkxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMwNjk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNjk5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMDcwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDcwMTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMDcwNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDcwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzA3MTE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA3MTM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzA3MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA3MjA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzA3MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA3MjU7Mjg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMwNzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwNzU0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDc2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDc2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDc3MDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzA3ODQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA3ODg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzA3OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA3OTE7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMwODAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwODAzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMwODA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwODA2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjMwODEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMwODExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwODEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMwODEzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwODE3OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDg1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDg1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDg1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDg1OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMDg2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDg2Mjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDg3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDg3MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDg3NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMDg3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDg3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDg4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDg4MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDg4NTs1MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzA5Mzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA5NDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzA5NDI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA5NDY7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMwOTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwOTYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMwOTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMwOTYzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMDk3NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDk3NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMDk3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMDk4MDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzA5OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA5OTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzA5OTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzA5OTY7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzEwMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEwMDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzEwMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEwMDY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzEwMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEwMTA7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMxMDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMDM1OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTA1MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTA1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTA1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTA1ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMTA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTA2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTA2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTA2ODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTA3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTA3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTA3ODsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzEwOTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEwOTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzEwOTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzExMDA7NTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMxMTUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMTUzOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMxMTYxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMTYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMxMTY0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMTY2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTE2OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTE3MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzExNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzExNzQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMTc5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTE4MzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMTk0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTIwMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEyMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEyMDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMjA4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTIxNTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEyMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEyMjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMjI4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTIzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTIzNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEyMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEyMzY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMjQ1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMjQ3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEyNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEyNTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMjYxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTI2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTI2ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEyNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEyNzI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMjc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMjc3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTI4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTI4Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEyODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEyODg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMjkxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMjk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTI5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTI5NzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMzA4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTMxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTMxNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEzMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEzMjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMzIzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTMyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTMyOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEzMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEzMzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMzM2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTM0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTM0NDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzEzNTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzEzNTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxMzU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxMzU4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTM1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTM2MDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIzMTM2NTs0MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNDA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNDA5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTQxMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQxMzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMTQxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQyMDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMTQyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQyNTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTQzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQzNTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTQ0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQ0Mzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQ1MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTQ1MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQ1NTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMTQ1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQ1ODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTQ2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQ2NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTQ2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQ2OTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMTQ3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTQ3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQ3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMTQ3Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTQ4MDs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMTQ4NTsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzE1MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE1MTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzE1MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE1MTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzE1MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE1MTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzE1MjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE1MjQ7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzE1Mjk7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMxNTQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNTUxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMxNTUyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNTU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMxNTU1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNTU3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTU2MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTU2NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE1NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE1NjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNTcxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTU3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE1ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE1ODM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNTkwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE2MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE2MDE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNjA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNjA4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTYxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTYxNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE2MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE2MjA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNjI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNjMyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTYzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTYzNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMTYzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTY0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE2NDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE2NDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNjQ3Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjMxNjU0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTY2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTY2MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE2NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE2NjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNjY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNjY5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTY3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTY3Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE2ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE2ODU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNjg3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTY5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTY5Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE2OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE3MDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNzA0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTcwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTcxMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE3MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE3MTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNzE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNzIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTcyMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTcyNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE3MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE3MzE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNzM4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTc0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTc0MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE3NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE3NDc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNzUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNzUyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTc1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTc1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE3NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE3NjI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNzcwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTc3Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE3ODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE3ODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxNzg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxNzg4OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIzMTc5OTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxODExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxODEyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMxODE2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxODE5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTgyMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTgyNDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMTgyODsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxODQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxODUwOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMxODUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxODUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTg1NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE4NTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxODY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxODY4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTg3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTg3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE4Nzc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxODg1OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMxODkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxODkzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTg5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTg5ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMTkwMjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxOTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxOTMwOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMxOTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxOTMyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTkzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTkzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE5Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE5Mzk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxOTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxOTQ2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTk1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTk1MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE5NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE5NTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxOTYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxOTYyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTk2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTk2Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE5NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE5NzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMxOTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMxOTc5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMTk4Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMTk5MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMTk5NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzE5OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzE5OTc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzIwMDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIwMDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMDA3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMDA5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjMyMDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMDE2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjMyMDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMDIxOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMjA0Mzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMjA1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjA1MTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMjA1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjA1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMjA2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjA2MzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzIwNzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIwODA7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMyMDk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMDk5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMyMTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMTAxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMyMTA4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMTEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMyMTExOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMTEzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjExNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjExOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIxMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIxMjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMTI2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjEzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjEzNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIxMzg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMTQ1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjE1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjE1MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIxNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIxNTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMTYwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjE2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjE3MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIxNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIxNzI7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzIxNzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIxNzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMTgzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjE4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjE4NTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIzMjE5Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIyMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIyMDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMjA0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjIwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjIwOTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIyMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIyMTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMjIxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjIyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjIyNDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIyMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIyMzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMjM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMjM1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjI0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjI0MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIyNDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMjUzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjI1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjI1NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIyNTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIyNjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMjY0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMjY2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjI3MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjI3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIyNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIyNzc7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjMyMjg4OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIzMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIzMDE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzIzMDU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIzMDg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMzA5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMzEzOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMyMzE3OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIzMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIzMzk7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzIzNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIzNDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMzQ0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjM0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjM0ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIzNTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMzYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMzYxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjM2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjM2Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzIzNzQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzIzNzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzIzODI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyMzgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyMzg3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMyMzkxOzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI0MTk7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzI0MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI0MjE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNDI0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjQyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjQyODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI0MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI0MzU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNDQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjQ0NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI0NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI0NTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNDU2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjQ2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjQ2NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI0Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI0Njg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNDc2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMyNDgxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNDg0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjQ4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjQ4Njs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMjQ5MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjQ5NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI0OTY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI0OTg7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzI1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI1MDU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzI1MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI1MTA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMyNTIyOzc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjMyNTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNTMwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMyNTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNTQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMyNTQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNTQ0OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMjU1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjU2MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMjU2NTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMjU3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjU3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMjU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjU3Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMjU4NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjU4ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMjU4OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjU5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI1OTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI1OTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNTk5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjYwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjYwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI2MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI2MDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNjA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNjEwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjYxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjYxNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI2MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI2MTg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNjI1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjYyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjYzMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI2MzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI2Mzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNjQwOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMyNjQzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNjQ2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjY0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjY0ODszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMjY1MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI2NTY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzI2NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI2NjE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNjY4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjY3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjY3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI2Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI2Nzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNjgyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjY5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjY5Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI2OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI2OTk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNzA0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjcwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjcwOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI3MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI3MTI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNzIwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNzIzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjcyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjcyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI3Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI3Mjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNzMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNzMzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjczNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjczODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI3NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI3NDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNzQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNzUwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjc1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjc1ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI3NjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI3Njc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNzY5OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMyNzczOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNzc2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjc3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjc4MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI3ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI3ODI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMzI3ODk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyNzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyNzk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjc5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjc5ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI4MDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI4MDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyODA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyODA3OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIzMjgxODsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyODMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyODMxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMyODM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyODM4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjgzOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjg0Mzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMjg0NzsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyODY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyODY5OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMyODcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyODcxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjg3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI4Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI4Nzg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyODg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyODg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjg5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjg5MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI4OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI4OTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyOTA0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMyOTA5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyOTEyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjkxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjkxNzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMjkyMTsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyOTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyOTQ5OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMyOTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyOTUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjk1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjk1NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI5NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI5NTg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyOTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyOTY1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjk2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjk3MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI5NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI5NzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyOTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyOTgxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMjk4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMjk4Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzI5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzI5OTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMyOTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMyOTk4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzAwNjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMzAxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzAxNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzMwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMwMTY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzMwMjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMwMjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzMDI2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMDI4OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjMzMDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMDM1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjMzMDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMDQwOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzA1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzA1Mzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzA1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzA1OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzA2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzA2MzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzMwNzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMwODA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzMwODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMwODQ7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMzMDk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMDk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMzMDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMTAwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzExMTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzExNzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMzEyMjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzMxMzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMxNDE7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMzMTYyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMTY1OzQ3OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMzMyMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMyMTM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzMyMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMyMTY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMzMjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMjI4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMzMjMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMjMxOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzI0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzI0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzI0Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzI1MTs0NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzMyOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMyOTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzMyOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMyOTg7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMzMzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMzA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMzMzEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMzExOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzMyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzMyNjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMzMzMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzMzMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzMzNjsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzMzNTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMzNjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzMzNjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzMzNjY7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMzMzkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzMzkzOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzQxNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzQxODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMzQyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzQyMTsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzM0MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM0Mzc7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMzNDU4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzNDYxOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzQ3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzQ3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzQ3ODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzQ4NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzQ5MDs0NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjMzNTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzNTM3OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzU1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzU1OTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMzU2NDsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzM1NzQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM1NzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzM1Nzc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM1Nzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzNTgyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzNTg1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzU4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzU4Nzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIzMzU5Mjs0NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzNjM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzNjQwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzY0MjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzY0NDs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMzY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzY1MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMzY1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzY1NjsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzM2NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM2NzY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzM2ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM2ODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzM2ODQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM2ODc7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjMzNzAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzNzA0OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzcxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzcxNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzcxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzcxNzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzMzcyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzcyNjs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzMzczMTszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzM3NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM3NjY7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzM3NzU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM3Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzM3Nzg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM3ODA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzNzgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzNzg3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzc4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzc4OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM3OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM3OTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzNzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzNzk4OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM4MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM4MDk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzODE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzODE2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzgyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzgyMzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM4MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM4MzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzODM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzODM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzgzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzgzOTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM4NDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzODQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzODQ4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzg1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzg1Mjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM4NTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM4NjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzODYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzODYyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzg2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzg2NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM4NzM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzODc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzODc2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzg4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzg4MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM4ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM4ODU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzODg4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzg5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzg5Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM4OTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM5MDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzOTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzOTAyOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjMzOTA1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzOTA4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzkwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzkxMDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzMzkxMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM5MTg7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzM5MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM5MjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzOTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzOTI3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM5Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM5Mzg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzOTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzOTQ0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzk0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzk0Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM5NTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzOTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzOTU2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzk1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzk1ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM5NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM5NjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzOTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzOTY3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzk3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzk3MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM5NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM5NzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzOTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzOTc5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzk4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzMzk4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzM5ODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzM5ODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjMzOTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjMzOTkxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzMzk5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDAwMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQwMDM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzQwMDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQwMTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MDExOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MDE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDAxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDAxNjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIzNDAyMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQwMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQwMzA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDA0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDA0MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQwNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQwNDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MDU1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDA2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDA2NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQwNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQwNjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MDcxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDA3Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDA4MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQwODE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQwODM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MDg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDA4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDA5MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQwOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQwOTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MTA1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDEwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDEwODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQxMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQxMTg7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDEyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDEyOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQxMzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MTQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDE0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDE0NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQxNDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQxNTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MTUxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MTUzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDE1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDE1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQxNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQxNjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MTY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDE2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDE2ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQxNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQxNzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MTc5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDE4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDE4Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQxOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQxOTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MTk2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDE5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQyMDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MjAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MjAyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDIwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDIwNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQyMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQyMTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MjE3Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDIyNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDIyOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQyMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQyMzE7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjM0MjQyOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQyNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQyNTU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzQyNTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQyNjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MjYzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MjY3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM0MjcxOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQyOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQyOTM7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzQyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQyOTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0Mjk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0Mjk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDMwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDMwMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQzMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQzMTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MzE1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDMxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDMyMDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQzMjg7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzQzMzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQzMzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MzM3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0MzQxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM0MzQ1OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQzNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQzNzM7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzQzNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQzNzU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0Mzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0Mzc4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDM4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDM4Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQzODk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0MzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0Mzk0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDM5ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQ0MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ0MDU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0NDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0NDEwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDQxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDQxODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQ0MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ0MjI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM0NDMwOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM0NDM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0NDM4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNDQzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDQ0MDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzNDQ0NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDQ0ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzQ0NTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ0NTI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzQ0NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ0NTk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzQ0NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ0NjQ7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM0NDgzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM0NDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0NDg3Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM0NDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0NDk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM0NDk2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0NDk5OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDUxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDUxNjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzNDUxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDUyMDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzQ1MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ1MzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzQ1Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ1Mzg7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM0NTYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0NTYzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM0NTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0NTY2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDU4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDU4MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDU4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDU4NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDU4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDU4ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDU4OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDU5Mzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzNDU5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDYwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDYwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDYwNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDYwODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzNDYxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDYxMTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDYxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDYxOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDYyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDYyMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDYyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDYyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDYyNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDYyOTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDYzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDYzNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDYzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDYzODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDY0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDY0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDY0NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDY0Nzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDY1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDY1NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNDY1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDY1NzsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzQ2ODI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ2ODU7NTk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIzNDc0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDc0NTs0NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjM0NzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0NzkyOzYxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMzQ4NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ4NTQ7Mjk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIzNDg4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDg4NDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzNDg4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNDg4NzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzQ5MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ5MDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzQ5MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ5MDY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzQ5MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ5MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzQ5MTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ5MTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzQ5MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ5MTg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzQ5MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ5MjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzQ5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzQ5MjY7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM0OTQ3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM0OTUxOzYyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMzUwMTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUwMTU7NjM7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIzNTA3ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTA4MDszMTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjM1MTExOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MTEzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM1MTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MTE2Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM1MTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MTI0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM1MTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MTI2OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM1MTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MTMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM1MTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MTM0OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNTE1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTE1MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNTE1Mjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTE1Nzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNTE2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTE2NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNTE2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTE2NjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzUxNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUxNzg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzUxODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUxODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzUxODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUxODY7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM1MjAzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MjA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM1MjA4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MjExOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM1MjEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MjE1OzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNTI0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTI0MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNTI0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTI0NDsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzUyNjg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUyNzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzUyNzE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUyNzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1Mjc2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MjgwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTI4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTI4Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzUyODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUyODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1MjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MjkxOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzUzMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUzMDI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1MzA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MzA4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTMxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTMxNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzUzMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUzMjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1MzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MzI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTMzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTMzMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzUzMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUzMzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1MzM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MzQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTM0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTM0NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzUzNDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUzNTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1MzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MzU0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTM1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTM1Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzUzNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUzNjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1MzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MzY4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTM3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTM3NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzUzNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUzNzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1Mzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1MzgwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTM4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTM4NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzUzODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzUzOTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1MzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1Mzk0OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM1Mzk3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NDAwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTQwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTQwMjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzNTQwNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU0MTA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzU0MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU0MTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NDE5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU0Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU0MzA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NDM2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTQ0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTQ0MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU0NDY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NDUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTQ1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU0NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU0NTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NDYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTQ2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTQ2Njs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU0NzA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU0NzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NDc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NDc2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTQ3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTQ3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU0ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU0ODM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NDg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTQ4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTQ5MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU0OTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU1MDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NTAyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM1NTA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NTA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTUxMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTUxMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU1MTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU1MTU7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMzU1MjI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NTI4OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU1Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU1Mzk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NTQ1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTU1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTU1Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU1NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU1NjE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NTY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTU2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTU2ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU1NzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU1Nzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NTc4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NTgwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTU4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTU4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU1ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU1ODc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NTkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NTk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTU5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTU5NzsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMzU2MDg7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTYyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTYyMTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzNTYyNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTYyODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU2Mjk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU2MzM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzU2Mzc7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTY1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTY1OTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzNTY2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTY2MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU2NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU2NjQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NjY4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTY3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTY3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU2ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU2ODE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1Njg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1Njg2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTY5NDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzNTY5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTcwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU3MDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU3MDc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzU3MTE7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTczODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTczOTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzNTc0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTc0MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU3NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU3NDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NzQ4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTc1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTc1NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU3NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU3NjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1NzY0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTc3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTc3MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU3NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU3NzY7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1NzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1Nzg0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTc4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTc4ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU3OTY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzU4MDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU4MDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1ODA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1ODA2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM1ODExOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1ODE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNTgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTgxNjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIzNTgyMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzU4MjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU4Mjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM1ODMxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1ODMzOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM1ODM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1ODQwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM1ODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1ODQ1OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNTg2NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzNTg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTg2ODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNTg3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTg3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNTg3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTg3OTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzU4OTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU4OTY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzU4OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU5MDA7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM1OTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1OTE2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM1OTE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM1OTE4OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNTk0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTk0MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzNTk0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNTk0NjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzU5NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU5NjI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzU5NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU5NjU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzU5Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU5Njg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzU5Njk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU5NzM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzU5Nzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzU5ODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU5ODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzU5ODQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU5ODg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzU5OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU5OTE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzU5OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzU5OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzU5OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYwMDA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYwMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYwMDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYwMDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYwMDg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYwMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYwMTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYwMTY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYwMTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYwMjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYwMjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYwMjU7NTk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIzNjA4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjA4NTs0NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjM2MTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2MTMyOzYxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMzYxOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYxOTQ7Mjk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIzNjIyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjIyNDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzNjIyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjIyNzsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYyNDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYyNDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYyNDY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYyNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYyNDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYyNTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYyNTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzYyNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYyNTg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYyNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYyNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzYyNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYyNjY7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM2Mjg3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2MjkxOzYyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMzYzNTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzYzNTU7NjM7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIzNjQxODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjQyMDszMTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjM2NDUxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NDUzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM2NDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NDU2OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM2NDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NDYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM2NDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NDY1OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM2NDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NDcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM2NDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NDczOzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjQ4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjQ5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjQ5MTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjQ5Njs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjUwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjUwMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjUwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjUwNDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY1MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY1MTY7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY1MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY1MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY1MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY1MjQ7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM2NTQxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NTQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM2NTQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NTQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM2NTUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NTUzOzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjU3OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjU4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjU4MTsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY2MDU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY2MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY2MDg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY2MTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2NjEzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NjE2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjYxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjYxODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzY2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY2MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2NjI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NjMwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjYzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjYzODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzY2NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY2NDI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2NjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NjQ2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjY1MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzY2NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY2NTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2NjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NjU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjY2MzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2NjczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2Njc0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjY4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjY4MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzY2ODQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY2ODg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2Njg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NjkwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjY5Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzY3MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY3MDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2NzA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NzA5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNjcxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjcxNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzY3MjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY3MjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM2NzI4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NzMwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM2NzM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2NzM1OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjc1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjc2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjc2MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjc2NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjc3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjc3NDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY3ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY3ODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY3ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY3OTA7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM2ODA5OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2ODE1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM2ODE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2ODE4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjgzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjgzMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjgzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjgzNjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzNjg0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjg0MTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjg0NDsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY4NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY4NzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY4NzM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY4Nzc7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzY4ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY4ODM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzY4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY4ODc7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY4OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY4OTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY4OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY4OTg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY5MDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY5MDQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzY5MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzY5MTQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM2OTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2OTI1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM2OTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM2OTI3OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNjk0Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNjk0Nzs2MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjM3MDA3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3MDA5OzY1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMzcwNzQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzcwNzY7NTY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTIzNzEzMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzEzNDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzNzEzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzEzNzsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzcxNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzcxNTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzcxNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzcxNTc7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3MTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3MTc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3MTgwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3MTg1OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzIwOTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzIxNTsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzcyNDQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzcyNTA7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3Mjc3OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3MjgzOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzMwNDs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzMxMTsxMjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjM3MzIzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3MzI3OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzM0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzM0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzM0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzM0NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzczNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzczNTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzczNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzczNTk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3MzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3MzcyOzE1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMzczODc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzczOTE7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3NDIwOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NDI2OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzQ0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzQ0MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzQ0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzQ0NTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzc0NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc0NTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzc0NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc0NTg7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3NDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NDcyOzE0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yMzc0ODY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc0ODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzc0ODk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc0OTM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzc0OTc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc1MDI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzc1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc1MDU7MjU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3NTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NTMxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3NTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NTM0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3NTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NTQzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3NTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NTQ2OzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzU3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzU3MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzU3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzU3Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzU4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzU4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzU4Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzU5MjsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzc2MTY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc2MjI7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3NjUxOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NjU3OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzY4NDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzY5MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzY5OTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzcwNTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzNzcxNDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzcyMDsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzc3NDk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc3NTU7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3NzY1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NzY5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3NzcwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NzczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3Nzc0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3Nzc2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM3Nzc3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3Nzc5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzc4Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzc4NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc3ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc3ODg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3NzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3NzkzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzc5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzc5NzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3ODA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3ODA4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzgxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzgxNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc4MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc4MTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3ODIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3ODIxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzgzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzgzMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc4Mzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc4NDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3ODQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3ODQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzg0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzg0NjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3ODU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3ODU3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzg2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzg2MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc4NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc4NjY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3ODcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3ODcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzg3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzg3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc4Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc4ODA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3ODg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3ODg2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzg4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzg4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc4OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc4OTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3OTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3OTAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzkwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzkwNzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc5MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc5MDk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3OTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3OTE0OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc5MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc5MjU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3OTMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3OTMyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzkzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzkzNjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc5NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc5NDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3OTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3OTUxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzk1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzk1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc5NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc5NjI7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3OTY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3OTcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzNzk3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzNzk3NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc5Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc5Nzg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3OTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM3OTgzOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzc5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzc5OTQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM3OTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MDAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODAwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODAwMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgwMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgwMTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MDE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODAxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODAxNjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MDI3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODAzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODAzNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgwMzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgwNDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MDQ1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODA0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODA1MDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MDYxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODA2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODA2ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgwNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgwNzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MDc5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODA4Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgwODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgwODk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MDkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MDkyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODA5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODA5NDsyMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MTE2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MTIwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODEyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgxMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgxMjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MTMxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODEzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODEzNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgxNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgxNDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MTQ1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODE1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODE1NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgxNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgxNjQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MTY4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODE3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODE3MzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MTg1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MTg4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODE4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODE5MDszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzODE5MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODE5NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgxOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgxOTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MjAzOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgyMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgyMTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MjIxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODIyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODIyNTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MjM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MjM2Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODI0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODI0NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgyNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgyNDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MjUyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODI1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODI1Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgyNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgyNjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MjY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODI3MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODI3NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgyNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgyNzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MjgxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODI4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODI4Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgyOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgyOTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4Mjk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4Mjk1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODMwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODMwNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgzMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgzMDg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MzEzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODMxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODMyMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgzMjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgzMjg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MzI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MzMwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODMzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODMzNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgzNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgzNDI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MzUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MzUxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODM1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODM1Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgzNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgzNjM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4MzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4MzY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODM3Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgzODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgzODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4Mzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4Mzg1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODM5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODM5NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzgzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzgzOTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NDAyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NDA2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODQwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODQwODsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NDE5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODQyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODQyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg0MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg0MzE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NDM1OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg0NDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NDUxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODQ1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODQ1NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg0NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg0NjE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NDY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODQ3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODQ3MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg0Nzc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg0ODE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NDgzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODQ4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODQ4ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg0OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg0OTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NTAwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODUwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODUwNjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NTE3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODUyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODUyMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg1MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg1MjY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NTMzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODUzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODUzODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg1NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg1NDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NTQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODU1MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODU1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg1NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg1NTc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NTY3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODU3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODU3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg1NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg1NzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NTgyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODU5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODU5MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg1OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg1OTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NTk3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODYwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODYwMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg2MDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NjA5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODYxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODYxNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg2MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg2MTg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NjI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NjI4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODYzMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODYzNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg2MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg2Mzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NjQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NjQyOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg2NTI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg2NTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NjU4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM4NjYyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NjY1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODY2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODY2NzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzODY3MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODY3MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg2NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg2NzU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4Njc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NjgwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODY4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODY4NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg2ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg2OTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4Njk0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODcwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODcwMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg3MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg3MDQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NzEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODcxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODcxNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg3MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg3MjA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODczMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODczMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg3MzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4NzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4NzM5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODc0Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODc0NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg3NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg3NDk7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODc1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODc2MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg3NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg3NjY7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODc3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg3ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg3ODE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4Nzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4Nzg1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODc5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODc5MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg3OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg3OTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4Nzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4Nzk4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODgwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODgwNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg4MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg4MTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4ODEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4ODEzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODgyMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODgyNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg4MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg4Mjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4ODMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4ODMxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODgzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODgzNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg4NDE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4ODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4ODQ2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODg1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODg1NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg4NTk7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODg2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODg3MDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg4Nzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4ODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4ODgyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODg4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODg4OTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4ODk5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4OTAzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODkwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODkwNTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzODkwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODkxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg5MTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg5MTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4OTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4OTE5Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjM4OTI2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODkzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODkzNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg5NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg5NDI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4OTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4OTQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODk1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODk1MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg5NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg5NTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4OTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4OTYwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODk2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODk2ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg5NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg5NzI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM4OTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM4OTc0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzODk3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzODk4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzg5ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzg5ODQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMzg5OTE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MDAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MDAxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTAwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTAwODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkwMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkwMTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MDE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MDE3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTAyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTAyMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkwMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkwMjc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MDM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTAzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTA0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkwNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkwNDM7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yMzkwNTA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTA2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTA2MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkwNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkwNjY7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTA3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTA3Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkwODI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkwODU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MDg3OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIzOTA5ODsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MTExOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM5MTE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MTE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTExOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTEyMzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzOTEyNzsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MTQ5OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM5MTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MTUxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTE1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTE1NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkxNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkxNTg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MTY3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTE3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTE3MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkxNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkxNzY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MTg0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM5MTg5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MTkyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTE5Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTE5Nzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzOTIwMTsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MjI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MjI5OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM5MjMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MjMxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTIzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTIzNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkyMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkyMzg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MjQ1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTI0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTI1MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkyNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkyNTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MjYxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTI2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTI2Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkyNzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5Mjc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5Mjc4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTI4Njs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzOTI5MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTI5NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkyOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkyOTY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzkzMDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkzMDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MzA2OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTIzOTMxNzsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5MzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MzQyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjM5MzQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MzQ5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTM1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTM1Mzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzOTM1NzsyMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5Mzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5MzgwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTM4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTM4NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzkzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzkzODk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5Mzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5Mzk5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTQwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTQwNDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzk0MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk0MTA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5NDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NDEzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTIzOTQyMDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTIzOTQyNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTQyODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yMzk0Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk0MzA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yMzk0MzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk0Mzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjM5NDQwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NDQyOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM5NDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NDQ5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM5NDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NDU0OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTQ3MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzOTQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTQ3NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzk0ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk0ODc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzk0OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk0OTE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM5NTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NTAyOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM5NTA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NTA4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTUxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTUyMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTUyMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTUyNDsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzk1Mzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk1NDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yMzk1NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk1NDU7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM5NTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NTY0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM5NTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NTY2OzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTU5MDs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTU5Njs3NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjM5NjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NjczOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM5Njc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5Njc2OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTY5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTY5NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTY5ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTcwMjs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzOTcwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTcwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTcxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTcxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTcxNjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTIzOTcxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTcxOTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzk3Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk3MzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzk3MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk3MzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzk3MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk3MzQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzk3MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk3Mzc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzk3NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk3NDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzk3NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk3NDk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzk3NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk3NTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzk3NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk3NjE7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM5NzkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5NzkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM5NzkzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5Nzk3OzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTgzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTgzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTgzOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTg0Mzs0NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yMzk4ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yMzk4OTA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjM5OTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5OTAxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTkxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTkxNjs1NjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjM5OTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5OTczOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjM5OTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjM5OTc2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTk4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTk4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTIzOTk4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTIzOTk4OTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwMDg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwMTE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwMjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwMjM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwMzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwMzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwMzk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwNDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwNTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwNTQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDAwNjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwNjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAwNjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAwNjg7MzA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI0MDA5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDA5OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0MDEwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDEwMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAxMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAxMTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAxMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAxMTU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAxMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAxMjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAxMjY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAxMzA7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAxNDA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAxNDM7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAxNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAxNTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAxNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAxNTQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMTY0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMTY4Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMTc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMTgwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMTg5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMTkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMTkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMTk2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQwMTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMTk5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDIwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDIxMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDIxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDIxMjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDIyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDIyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDIyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDIyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDIyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDIyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDIyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDIyODsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAyNDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAyNDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAyNDk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAyNTM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAyNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAyNjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAyNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAyNjU7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMjg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMjg2Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMjk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMjk2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMjk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMjk4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMzAwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMzAzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMzA0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMzA3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMzE3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMzIwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMzI5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMzMyOzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQwMzM3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMzQ1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwMzQ5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDM2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDM2MTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDM3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDM3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDM3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDM3MzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAzODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAzODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDAzODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDAzODY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwMzk2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNDAxOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDQyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDQyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDQyNTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA0MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA0MzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA0Mzg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNDUxOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwNDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNDYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwNDYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNDYzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDQ3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDQ3NTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0MDQ3OTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDQ4MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDQ4MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDQ4NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDQ4NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA0ODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA0OTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwNDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNDk0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDQ5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDUwMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA1MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA1MTA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwNTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNTE3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDUyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDUyMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA1MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA1MjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwNTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNTMxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDU0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDU0MTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwNTUxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNTU0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDU1NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDU1ODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0MDU2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDU2MzsyOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA1OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA1OTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA1OTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA1OTc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDA1OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA2MDA7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwNjE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNjE5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwNjIwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNjI0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQwNjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNjI3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDYzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDY0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDY0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDY0MjsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA2NjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA2Njc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA2NzI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwNjg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNjg4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwNjg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNjkwOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDcxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDcxNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDcxODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDcyMjs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0MDcyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDcyNzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0MDcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDczMDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA3NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA3NDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA3NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA3NDU7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwNzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNzY5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQwNzcwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwNzc1OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDc5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDc5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MDc5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDc5MzsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA4MTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA4MjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA4MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA4MjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA4MjU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA4Mjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDA4Mjg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA4MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwODMzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwODM2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDgzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDgzODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA4NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA4NDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwODQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwODQ3OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA4NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA4NTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwODYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwODYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDg2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDg2Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA4NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA4NzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwODgyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDg4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDg4NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA4ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA4OTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwODkzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwODk2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDg5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDg5ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA5MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA5MDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwOTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwOTA1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDkxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDkxNTs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0MDkyMTsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwOTM4Ozc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQwOTQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwOTQ2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDk0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDk0OTs2OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0MDk1NTsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwOTcyOzc7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQwOTc5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDk4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDk4MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDA5ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA5ODU7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDA5ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDA5OTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQwOTkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQwOTk1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MDk5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MDk5Nzs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI0MTAwNDsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMDE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMDE2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTAxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTAyMDsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMDMyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTAzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTA0MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDEwNDE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEwNDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMDQ3OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI0MTA1ODsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMDcxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQxMDc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMDc4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTA3OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTA4Mzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0MTA4NzsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMTA5OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQxMTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMTExOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTExMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTExNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDExMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDExMTg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMTI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTEzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTEzMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDExMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDExMzY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMTQ0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQxMTQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMTUyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTE1Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTE1Nzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0MTE2MTsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMTg5OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQxMTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMTkxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTE5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTE5NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDExOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDExOTg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMjA1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTIwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTIxMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDEyMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEyMTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMjIxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTIyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTIyNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDEyMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEyMzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMjM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMjM4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTI0Njs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0MTI1MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTI1NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDEyNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEyNTY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDEyNjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEyNjQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMjY1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMjY5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTI3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTI3MTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI0MTI3ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDEyODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEyODY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxMjg4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMjkwOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQxMjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMjk3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQxMzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMzAyOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTMxNzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0MTMyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTMyMTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDEzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEzMzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDEzMzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEzMzg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDEzNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEzNDE7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxMzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMzU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxMzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxMzU3OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTM3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTM3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTM3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTM3ODsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDEzOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDEzOTg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE0MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE0MDE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE0MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE0MDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE0MDU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE0MTA7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDE0MTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE0MTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE0MjA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE0MjE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE0MjQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDE0MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE0Mjc7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNDQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNDQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNDQzOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTQ2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTQ2MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTQ2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTQ2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTQ2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTQ2NzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTQ2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTQ3MDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE0ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE0ODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE0ODU7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNTA0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNTA3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNTEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNTExOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNTE1OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQxNTIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNTIyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNTI2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNTI3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNTMwOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQxNTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNTMzOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTU0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTU0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTU0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTU0OTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE1Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE1Njg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE1NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE1NzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE1NzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE1NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE1NzY7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNTkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNTkxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNTk1OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQxNjAxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNjAyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNjA2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNjA3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNjExOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQxNjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNjE0OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTYyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTYyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTYyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTYzMDsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE2NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE2NDk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE2NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE2NTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE2NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE2NTQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE2NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE2NTc7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNjcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNjczOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNjc3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQxNjgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNjg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNjg3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNjg4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNjkxOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQxNjkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNjk0OzMzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTcyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTcyODsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE3NDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE3NDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE3NDc7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDE3NTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE3NTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE3NTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE3NTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE3NjE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNzcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxNzczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxNzc0OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTc4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTc4NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTc4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTc4OTsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE4MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE4MDg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE4MTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE4MTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE4MTY7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxODM3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxODQwOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTg1NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTg1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTg1Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTg2NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTg2OTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE4ODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE4OTE7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQxOTEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxOTE1OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MTkzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTkzODs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0MTk0MzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE5NTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE5NTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDE5NTY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE5NTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxOTYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxOTY0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTk2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTk2Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDE5NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE5NzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxOTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxOTc4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTk4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTk4NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDE5ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDE5OTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQxOTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQxOTk0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MTk5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MTk5OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDIwMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIwMDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQyMDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMDA3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MjAxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjAxMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDIwMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIwMTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQyMDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMDIzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MjAyNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjAyOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDIwMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIwMzE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQyMDM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMDM5Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MjA0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjA0NzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQyMDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMDYwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MjA2ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjA3MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDIwNzM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIwNzU7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDIwNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIwODA7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyMDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMDk2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyMDk3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMTAwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyMTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMTEwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjEyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjEyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjEyNDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDIxNDE7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIxNDc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDIxNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIxNTA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyMTYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMTYzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyMTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMTY2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQyMTcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyMTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMTcyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyMTczOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMTc3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyMTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMTg3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjE5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjE5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjIwMDsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDIyMTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIyMjA7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDIyMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIyMjY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDIyMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIyMzA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDIyMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIyMzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDIyNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIyNDE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDIyNDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIyNDc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDIyNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIyNTE7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDIyNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIyNTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDIyNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDIyNjE7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyMjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMjg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyMjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMjg2OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjMwOTs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjMxNzs2MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjQyMzc3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyMzc5OzY1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNDI0NDQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI0NDY7NTY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI0MjUwMjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjUwNDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0MjUwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjUwNzsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI1MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI1MjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI1Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI1Mjg7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI1MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI1Mzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI1Mzg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI1NDM7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyNTY1OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyNTcxOzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjU5ODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjYwNDsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI2Mjk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI2MzU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI2NDM7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI2NDk7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyNjY3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyNjcxOzE1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNDI2ODY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI2OTA7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyNzE3OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyNzIzOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0Mjc0Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mjc0NjsxNDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjQyNzYwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyNzYyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyNzYzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyNzY3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQyNzcxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyNzc1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQyNzc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyNzc4OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjgwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjgwMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjgwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjgwNTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjgxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjgxNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjgxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjgxNzsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI4NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI4NDI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI4NDU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI4NTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI4NTY7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI4NjE7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQyODgzOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQyODg5OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MjkxNjs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MjkyMjsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI5NDc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI5NTM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI5NjI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI5Njg7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDI5Nzc7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDI5ODM7Mjc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQzMDEwOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMDE2OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MzAyNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzAzMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MzAzMTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzAzNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0MzAzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzA0MDsyNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDMwNjU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMwNjc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDMwNjg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMwNzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMDczOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMDc3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzA3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzA3OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMwODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMwODQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMDg4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzA5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzA5ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMxMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMxMDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMTA1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzExMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzExMTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMxMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMxMjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMTIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMTI0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzEzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzEzMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMxMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMxMzU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMTQwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzE0NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzE0NzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMTU4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzE2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzE2MTsyNjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMTg3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMTkwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzE5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzE5MjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0MzE5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzE5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMxOTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMyMDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMjA0Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjQzMjExOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzIxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzIxNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMyMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMyMjE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMjI3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzIzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzIzODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMyMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMyNDA7NTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDMyNDU7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzI2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzI3MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMyNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMyNzI7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjQzMjgzOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMyOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMyOTY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDMzMDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMzMDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMzA0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMzA4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQzMzEyOzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMzMzQ7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDMzMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMzMzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMzM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzM0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzM0Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMzNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMzNTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMzU2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzM2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzM2MTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDMzNjk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDMzNzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDMzNzc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzMzc4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzMzgyOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQzMzg2OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM0MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM0MTQ7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDM0MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM0MTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNDE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNDE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzQyMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM0Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM0MzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNDM1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzQzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzQzOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM0NDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNDUxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzQ1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzQ1OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM0NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM0NjM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNDcxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQzNDc2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNDc5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzQ4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzQ4MTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0MzQ4NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzQ4OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM0OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM0OTE7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjQzNTAyOzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM1MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM1Mjc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDM1MzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM1MzQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNTM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNTM4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQzNTQyOzIyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM1NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM1NjU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNTcwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzU3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzU3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM1ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM1ODE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNTg3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzU4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzU5MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM1OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM1OTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNTk4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzYwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzYwMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM2MDU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNjE1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzYyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzYyMTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM2MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM2MjQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNjMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNjMxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzYzMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzYzNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM2Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM2Mzg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNjQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNjQ0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzY0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzY0OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM2NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM2NTQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNjY0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzY2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzY2OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM2NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM2NzQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNjgyOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzY4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzY5MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM2OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM2OTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNjk5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzcwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzcwMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM3MDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNzEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNzExOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzcxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzcxNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM3MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM3MjA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzczMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzczMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM3MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM3MzU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDM3NDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM3NDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzNzQ2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNzQ4OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQzNzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNzU1OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQzNzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzNzYwOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0Mzc3MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0Mzc3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mzc3Nzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0Mzc4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mzc4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0Mzc4NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mzc4ODs0ODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjQzODM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzODM3OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0Mzg1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mzg1Nzs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0Mzg2NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mzg2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0Mzg2NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mzg2OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM4NzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM4NzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzODc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzODc4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Mzg4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mzg4MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM4ODc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzODk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzODk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzkwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzkwMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM5MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM5MDk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzOTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzOTEyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzkxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzkxNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM5MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM5MjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzOTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzOTI3OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQzOTMwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzOTMzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0MzkzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0MzkzNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM5NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM5NDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzOTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzOTQ3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Mzk1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mzk1Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM5NTg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM5NjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzOTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzOTY1OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM5NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM5NzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzOTc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzOTgwOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Mzk4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Mzk5MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDM5OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDM5OTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQzOTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQzOTk5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDAwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDAwNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQwMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQwMDY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MDExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MDEyOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQwMjI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQwMjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MDI3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDAyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDAyOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQwMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQwMzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MDQxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDA0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDA0Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQwNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQwNTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MDU3OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQwNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQwNjk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MDc1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDA3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDA4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQwODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQwODQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MDg4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDA5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDA5NDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MTA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MTA1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDExMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDExMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQxMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQxMTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MTIyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MTI1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDEyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDEyNzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NDEzMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDEzNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQxMzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQxMzg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MTQwOzc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjQ0MTQ3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDE1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDE1MzsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MTY1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDE3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDE3MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQxNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQxNzk7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDE5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDE5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQxOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQxOTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MjAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MjA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDIwNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDIwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQyMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQyMTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MjE3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDIyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDIyMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQyMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQyMjU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MjMyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDIzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDIzNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQyMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQyMzk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MjQ5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDI1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDI1NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQyNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQyNjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MjYyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDI2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDI2NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQyNjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQyNjk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MjcxOzU7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjQ0Mjc2OzIyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQyOTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQzMDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MzAzOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI0NDMxNDsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MzI3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ0MzMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MzM0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDMzNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDMzOTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NDM0MzsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MzY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MzY1OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ0MzY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MzY3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDM2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDM3MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQzNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQzNzQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0MzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0MzgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDM4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDM4Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQzOTI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NDAwOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ0NDA1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NDA4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDQwOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDQxMzs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NDQxNzsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NDQ1OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ0NDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NDQ3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDQ1MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ0NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ0NTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NDYxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDQ2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDQ2NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ0Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ0NzA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NDc3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDQ4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDQ4Mjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ0ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ0OTA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NDkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NDk0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDUwMjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NDUwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDUxMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ1MTI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDQ1MTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ1MjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NTIyOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI0NDUzMzsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NTU4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ0NTYyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NTY1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDU2NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDU2OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NDU3MzsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NTkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NTkzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDU5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDU5ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ2MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ2MDQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NjA3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDYxMTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NDYxNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDYxOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ2MjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ2MjM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDQ2Mjc7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDY0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDY1MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ2NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ2NTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NjYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDY2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDY2Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ2NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ2NzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0Njc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0Njc1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDY3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDY3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ2ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ2ODM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0Njg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0Njg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDY4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDY5MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ2OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ3MDA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NzA2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDcwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDcwOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ3MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ3MTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NzE3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NzIxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDcyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDcyMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ3Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ3Mjk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NzM0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDczODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDczOTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ3NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ3NDk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0NzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0NzU0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDc1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDc1OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ3NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ3Njc7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0Nzc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0Nzc1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDc3ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ3ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ3ODQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0Nzg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0Nzg3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDc4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDc5MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ3OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ3OTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0Nzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0ODAwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDgwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDgwNTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0ODE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0ODE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDgxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDgyMDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NDgyNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDgyOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ4MzE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ4MzM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDQ4Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ4NDA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDQ4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ4NDU7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ0ODYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0ODY0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ0ODcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0ODcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ0ODcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0ODc1OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NDg4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDg5MjsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0NDg5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDg5NTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NDkwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDkwMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NDkwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDkwNTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0NDkwOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NDkxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDkxMTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NDkyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDkyMTsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDQ5NDc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ5NTE7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ0OTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0OTczOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ0OTgyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0OTg0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ0OTg1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ0OTg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NDk5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NDk5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDQ5OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDQ5OTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ0OTk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MDAwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTAwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTAwNDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MDE1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTAyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTAyNTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MDM2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTA0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTA0MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUwNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUwNDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MDQ5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTA1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTA1NTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUwNjQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUwNjc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MDY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MDY5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTA3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTA3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUwNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUwNzY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MDg2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTA4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTA4OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUwOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUwOTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MDk2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTEwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTEwNDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUxMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUxMTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MTE3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTEyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTEyMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUxMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUxMjU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MTMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MTM1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTEzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTEzNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUxNDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MTQ0Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTE1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTE1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUxNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUxNTY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MTYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MTY0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTE2NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTE2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUxNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUxNzA7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDUxNzc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MTgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MTgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTE4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTE4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUxOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUxOTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MTk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTIwMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUyMDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUyMDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MjEwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MjEzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTIxNTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDUyMjY7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTI1MTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NTI1NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTI1ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUyNTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUyNjM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDUyNjc7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTI4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTI5MDsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NTI5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTI5MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUyOTU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1Mjk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1Mjk5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTMwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTMwODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUzMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUzMTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MzE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MzE3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTMyNTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NTMzMDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTMzNDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDUzMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUzMzY7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDUzNDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDUzNDQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MzQ2OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI0NTM1NzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1MzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1MzcwOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ1Mzc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1Mzc3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTM3ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTM4Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NTM4NjsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1NDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NDA4OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ1NDA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NDEwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTQxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTQxMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU0MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU0MTc7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1NDI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NDI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTQyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTQzMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU0MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU0MzU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1NDQzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ1NDQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NDUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTQ1Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTQ1Njs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NTQ2MDsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1NDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NDg4OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ1NDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NDkwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTQ5MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU0OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU0OTc7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1NTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NTA0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTUwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTUwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU1MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU1MTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1NTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NTIwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTUyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTUyNTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU1MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU1MzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1NTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NTM3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTU0NTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NTU1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTU1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU1NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU1NTU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDU1NjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU1NjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1NTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NTY1Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjQ1NTcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTU3NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTU3ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU1ODA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU1ODI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDU1ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU1ODk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDU1OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU1OTQ7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ1NjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NjE3OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ1NjIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NjI0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ1NjMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NjMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ1NjMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NjM1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTY0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTY0NzszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTY1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTY1MzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0NTY1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTY1Njs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTY2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTY2MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTY2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTY2Njs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0NTY3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTY3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTY3MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTY3Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTY3NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0NTY3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTY4MDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDU3MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU3MDE7Mzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ1NzM5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NzQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ1NzQzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1NzQ2OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTc2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTc2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTc2ODs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTc3NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTc3Nzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTc4NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTc4ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NTc4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTc5MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU3OTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU3OTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1Nzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1ODAwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTgwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTgwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU4MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU4MDk7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTgxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTgyMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU4Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU4MzA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTg0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTg0MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU4NDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU4NDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1ODQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1ODUwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTg1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTg1NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU4NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU4NjA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1ODY5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1ODcyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTg3NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU4Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1ODgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1ODgxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTg5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTg5MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU4OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU4OTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1ODk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1ODk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTkwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTkwMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU5MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU5MDk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1OTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1OTE2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTkyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTkyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU5MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1OTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1OTMwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTkzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTk0MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU5NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU5NDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1OTQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1OTQ1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTk0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTk0OTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU5NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU5NTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1OTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1OTYxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTk2NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTk2OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU5NzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU5NzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1OTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1OTc1Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjQ1OTgyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NTk4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NTk4ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDU5OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDU5OTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ1OTk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ1OTk2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjAwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjAwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYwMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYwMDY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2MDExOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MDE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjAxNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjAxODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYwMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYwMjA7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjQ2MDMxOzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYwNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYwNTY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDYwNjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYwNjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2MDY0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MDY4OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ2MDcyOzIyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYwOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYwOTU7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDYwOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYwOTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2MDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MTAwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjEwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjEwNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYxMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYxMTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2MTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MTE3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjEyMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYxMzA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDYxMzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYxMzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2MTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MTQxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ2MTQ2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MTQ5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjE1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjE1MTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDYxNjI7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjE3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjE3NTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NjE3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjE4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYxODM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYxODc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDYxOTE7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjIxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjIxMzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NjIxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjIxNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYyMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYyMTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2MjIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MjIyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjIzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjIzMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYyMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYyMzU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2MjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MjQwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjI0ODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NjI1MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjI1NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYyNTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYyNjE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDYyNjU7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjI5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjI5MzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NjI5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjI5NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYyOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYyOTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2MzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MzAyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjMwOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYzMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYzMTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2MzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MzE4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjMyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjMyNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYzMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYzMzA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2MzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MzM4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjM0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjM0Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYzNTA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDYzNTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYzNTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2MzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MzYwOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ2MzY1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2MzY4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjM2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjM3MDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI0NjM3NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDYzODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDYzODM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2Mzg1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2Mzg3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQ2MzkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2Mzk0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQ2Mzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2Mzk5OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NjQyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjQyMjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NjQyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjQyOTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NjQzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjQzNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NjQzNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjQ0MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY0NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY0NTI7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY0NTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY0NTg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDY0NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY0NjE7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY0Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY0Njg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY0NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY0NzE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDY0NzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY0NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY0Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY0Nzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY0ODI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDY0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY0ODU7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ2NTA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NTA2OzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NjU0NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjU0NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NjU0ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjU1MTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY1NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY1NzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY1NzM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY1Nzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY1ODI7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY1OTE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY1OTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDY1OTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY1OTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2NjAwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NjA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjYwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjYwNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY2MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY2MTE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2NjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NjE1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjYyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjYyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY2Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY2Mjk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2NjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NjM3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjYzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjY0MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY2NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY2NDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2NjUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NjUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjY1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjY1NTszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NjY1ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjY2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY2NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY2NjM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2NjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NjcyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjY3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjY3NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY2Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY2ODA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2Njg2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2Njg4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjY5MzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2NzAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NzA0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjcwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjcwODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY3MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY3MTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2NzIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NzIxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjcyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjcyNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY3Mjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY3MzI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2NzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NzM0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjczOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Njc0MDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2NzUwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NzUyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Njc1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Njc1NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY3NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY3NTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2NzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NzYyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Njc2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Njc2OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY3NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY3NzQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2NzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2NzgzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Njc4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Njc4NTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2Nzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2Nzk3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjgwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjgwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY4MDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY4MTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2ODExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2ODEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjgxNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY4MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY4MjI7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjgzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjgzMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY4NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY4NDE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2ODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2ODQ2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Njg1MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Njg1MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY4NTU7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDY4NTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY4NjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2ODYzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2ODY2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Njg2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Njg2ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI0Njg3NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY4ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY4ODE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2ODkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2ODkxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Njg5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Njg5Nzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY5MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY5MDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2OTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2OTA5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjkxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjkxNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY5MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY5MjA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2OTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2OTIzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NjkyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NjkzMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY5MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY5MzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2OTM2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2OTQwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Njk0MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Njk0Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY5NTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2OTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2OTU5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Njk2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Njk2NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY5Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY5NzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2OTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2OTcyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Njk3NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Njk3OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDY5ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDY5ODE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDY5ODg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ2OTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ2OTkyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzAwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzAwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDcwMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDcwMDY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3MDEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MDE1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzAxNzs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI0NzAyMjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3MDQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MDUyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzA1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzA1NDsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDcwNjU7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzA3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzA3ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NzA4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzA4NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDcwODY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDcwOTA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDcwOTQ7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzExNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzExNjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NzExNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzExODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDcxMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDcxMjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3MTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MTI1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzEzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzEzNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDcxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDcxMzg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3MTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MTQzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzE1MTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NzE1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzE1OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDcxNjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDcxNjQ7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDcxNjg7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzE5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzE5NjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NzE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzE5ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDcyMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDcyMDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3MjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MjA1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzIxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzIxMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDcyMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDcyMTc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3MjIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MjIxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzIyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzIyODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDcyMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDcyMzM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3MjQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MjQxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzI0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzI0NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDcyNTM7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDcyNTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDcyNjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3MjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MjYzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ3MjY4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MjcxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzI3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzI3MzsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDcyODQ7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzMwOTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NzMxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzMxNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDczMTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDczMjA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDczMjQ7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzM0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzM0Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDczNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDczNTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3MzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MzU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzM2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzM2Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDczNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDczNjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3MzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MzcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzM3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzM3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDczNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDczODA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3MzgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3MzgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzM4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzM4Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDczOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDczOTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NDAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NDAzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzQwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzQwNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc0MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc0MTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NDE0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NDE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzQxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzQyMDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc0MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc0MjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NDMxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzQzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzQzNjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc0NDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NDUxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzQ1Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc0NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc0NjQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NDcyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzQ3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzQ3NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc0ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc0ODE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NDg0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzQ4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzQ4Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc0OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc0OTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NDk3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzUwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzUwMjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NTEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NTE1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzUxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzUxNzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0NzUyMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzUyNTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc1Mjc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc1Mjk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDc1MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc1MzY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDc1NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc1NDE7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3NTU0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQ3NTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NTU4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3NTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NTY1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQ3NTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NTY5OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3NTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NTc0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3NTc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NTc4OzQ3OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNDc2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc2MjY7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3NjUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NjUxOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3NjU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NjU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3NjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NjU3Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ3NjY0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NjY3OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NzY4MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzY4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0NzY4NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzY4ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc2OTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc2OTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3Njk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3Njk3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzcwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzcwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc3MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc3MDY7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzcxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzcxNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc3MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc3MjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NzI1Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzczNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzczNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc3Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc3Mzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NzQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NzQzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Nzc0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Nzc0Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc3NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc3NTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NzYwOzEzOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc3NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc3NzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3Nzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3Nzc3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Nzc4Mzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Nzc4NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc3ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc3ODk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3NzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3NzkzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzgwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzgwMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc4MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc4MDg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3ODEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3ODE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzgxNjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc4MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc4MjU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3ODMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3ODMyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzgzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzgzOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc4NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc4NDM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3ODQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3ODQ5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Nzg1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Nzg1MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc4NTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3ODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3ODYzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Nzg2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Nzg2OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc4NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc4NzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3ODc1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3ODc5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Nzg4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Nzg4MTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3ODkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3ODkyOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ3ODk1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3ODk4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Nzg5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzkwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc5MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc5MDQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDc5MTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3OTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3OTE3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzkyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzkyNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc5MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc5Mjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3OTMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3OTMxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0NzkzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0NzkzNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc5NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc5NDY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3OTU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3OTU4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Nzk1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Nzk2MDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI0Nzk2Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDc5NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDc5NzQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3OTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3OTgxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Nzk4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Nzk4NDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ3OTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ3OTk1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0Nzk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0Nzk5ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgwMDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgwMDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MDA4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MDEyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODAxNDsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDgwMjU7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODAzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODAzODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0ODA0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODA0NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgwNDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgwNTA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDgwNTQ7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODA3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODA3NjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0ODA3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODA3ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgwODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgwODE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MDg1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODA5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODA5NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgwOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgwOTg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MTAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MTAzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODExMTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0ODExNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODExOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgxMjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgxMjQ7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDgxMjg7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODE1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODE1NjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0ODE1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODE1ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgxNjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgxNjE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MTY1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODE3Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgxNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgxNzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MTgxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODE4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODE4ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgxOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgxOTM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MjAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MjAxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODIwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODIwNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgyMTM7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDgyMTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgyMjE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MjIzOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ4MjI4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MjMxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODIzMzsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDgyNDQ7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODI2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODI2OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0ODI3MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODI3NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgyNzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgyODA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNDgyODQ7MjI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODMwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODMwNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgzMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgzMTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MzE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MzE5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODMyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODMyMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgzMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgzMjk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MzMyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODMzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODMzNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgzMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgzNDA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MzQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MzQzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODM0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODM0Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgzNTc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MzYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MzYzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODM2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODM2Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgzNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgzNzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4Mzc0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4Mzc4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODM3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODM4MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDgzODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDgzODY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4MzkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4MzkxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODM5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODM5Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDg0MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg0MDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4NDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NDExOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODQxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODQxNjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDg0MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg0MjQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4NDMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NDMyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODQzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODQzNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDg0NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg0NDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4NDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NDQ0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODQ0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODQ0Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDg0NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg0NTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4NDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NDU3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODQ2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODQ2MjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ4NDcyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NDc1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0ODQ3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODQ3Nzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI0ODQ4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODQ4NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDg0ODc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg0ODk7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDg0OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg0OTY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDg1MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg1MDE7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4NTE5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQ4NTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NTIzOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4NTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NTMwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQ4NTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NTM0Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4NTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NTQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4NTQzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NTQ2OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0ODU2MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODU2MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0ODU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODU2NzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg1ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg1ODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg1ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg1ODM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4NTk4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NjAxOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4NjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NjA3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4NjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NjA5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0ODYyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODYyMTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0ODYyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODYzMDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0ODYzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODYzODsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg2NTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg2NTc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDg2NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg2NjE7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg2NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg2NjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg2NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg2Njc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg2NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg2NzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg2NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg2NzU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg2ODI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg2ODU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDg2ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg2ODg7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg2OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg2OTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg2OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg2OTU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg2OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg2OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg2OTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg3MDM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg3MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg3MTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg3MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg3MTI7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg3MTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg3MjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg3MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg3MjQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDg3Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg3Mjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg3MzA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg3MzQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDg3MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg3Mzc7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg3NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg3NDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg3NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg3NDQ7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4NzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NzU5OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4NzY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NzY2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4NzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4NzY4OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0ODc4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODc4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0ODc4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODc4NDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0ODc5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODc5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0ODc5NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODc5NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0ODc5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0ODgwMDsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg4MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg4MjQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDg4MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg4Mjc7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4ODQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4ODQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4ODUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4ODUxOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4ODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4ODYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjQ4ODYxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ4ODY1OzcxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNDg5MzY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDg5Mzg7Nzg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI0OTAxNjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTAxODsyOTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjQ5MDQ3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MDQ5OzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0OTA4NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTA5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0OTA5MTs4OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTA5OTsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDkxMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkxMjc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDkxMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkxMzU7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDkxNDA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDkxNDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkxNDU7NTI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI0OTE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTE5ODsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDkyMTc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkyMTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDkyMjA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkyMjI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5MjI1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MjI5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTIzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTIzMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkyMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkyMzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5MjM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MjQwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkyNTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkyNTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5MjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MjU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTI1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTI2MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkyNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkyNjQ7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5MjczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5Mjc0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTI3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkyODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkyODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5Mjg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5Mjg1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTI5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTI5NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkyOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkyOTk7MTM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTMxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTMxMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkzMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkzMTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5MzIyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MzI2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTMyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTMyODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkzMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkzMzI7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5MzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MzQyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTM0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTM0Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkzNTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkzNTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5MzU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MzU3OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjQ5MzYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MzYzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTM2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTM2NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkzNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkzNjk7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDkzNzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5MzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5MzgyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTM4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTM4OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDkzOTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDkzOTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5Mzk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5Mzk2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTQwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTQwMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk0MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk0MTE7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTQyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTQyMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk0Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk0Mjg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NDMxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTQzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTQzMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk0Mzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NDQxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTQ0NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTQ0OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk0NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk0NTE7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNDk0NTg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NDY1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTQ3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTQ3MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk0NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk0NzU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTQ4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTQ4NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk0ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk0ODk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NDk3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTQ5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTQ5OTsyMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NTIwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTUyMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTUyMzszNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NTU4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTU1OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTU2MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk1NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk1NjM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NTcyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTU3OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk1ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk1ODY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NTkwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTU5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTU5NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk1OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk1OTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NjAzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTYxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTYxMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk2MTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk2MjI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NjIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NjI0Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjQ5NjMxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTY0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTY0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk2NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk2NDM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NjUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NjUzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTY1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTY1OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk2NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk2NjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NjY3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTY3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTY3MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk2NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk2NzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5Njc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5Njc5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTY4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTY4NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk2ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk2ODg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NjkyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5Njk2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTY5NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTY5OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk3MDM7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NzEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NzEzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI0OTcxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTcxNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNDk3MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk3MjU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjQ5NzI3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NzI5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQ5NzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5NzM0OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0OTc1NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0OTc1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTc1OTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0OTc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTc2NjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0OTc2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTc3MDs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI0OTc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTc3ODs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI0OTc4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTc4NjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk3OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk3OTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk3OTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4MDE7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDk4MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4MDU7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4MTE7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4MTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4MTk7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4MjY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4MzI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDk4MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4MzU7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4NDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4NDQ7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4NDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4NTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4NTQ7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNDk4NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4NTg7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4NjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4NjU7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4Njk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4NzM7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4Nzc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4Nzk7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4ODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4ODk7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4OTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk4OTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk4OTc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk5MDI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk5MDU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNDk5MDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNDk5MDk7Njg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI0OTk3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI0OTk3ODsxNTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjQ5OTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5OTk0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjQ5OTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjQ5OTk3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDAwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDAxMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDAxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDAxMzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDAxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDAxOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDAyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDAyMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAwMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAwMzQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAwMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAwMzc7MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAwNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAwNDE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAwNDM7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAwNDg7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAwNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAwNTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAwNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAwNTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAwNjA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAwNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAwNjM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMDc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMDc5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMDgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMDgyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDA5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDA5NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDA5Nzs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDEwMjs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDEwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDExMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDExMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDExMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDExMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDExNDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDExNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDExNzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAxMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAxMzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAxMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAxMzY7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMTUwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMTUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMTU1OzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDE4MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDE4NTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1MDE4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDE4ODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDE5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDE5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDE5ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDIwMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDIwMjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDIwNzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAyMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAyMjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAyMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAyMjU7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMjM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMjM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMjM5OzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMjQzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMjQ4OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDI1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDI2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDI2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDI2MjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAyNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAyNzQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAyNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAyNzY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAyODI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAyODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAyODc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAyOTE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTAyOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAyOTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAyOTc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAzMDI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMzE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMzIwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDMzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDMzMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDMzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDMzNDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDM0MDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDM0NTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAzNTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTAzNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTAzNTk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMzcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMzczOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMzc3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMzgxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwMzgyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwMzg2OzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MDQxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDQxOTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTA0MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA0MzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTA0MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA0MzM7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwNDQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNDQ2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUwNDUwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwNDUyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNDU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwNDU2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNDU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUwNDU5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNDYxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDQ2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDQ2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA0Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA0NzA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNDc1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDQ3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDQ3OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA0ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA0ODk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNDk2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDQ5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDUwMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA1MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA1MDQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNTEwOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA1MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA1MjE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNTMwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDUzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDUzNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA1NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA1NDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNTQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNTQ3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDU0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDU0OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA1NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA1NTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNTY1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNTY3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDU3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDU3Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA1ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA1ODI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNTg5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDU5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDU5Mzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA2MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA2MDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNjA1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDYwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDYxMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA2MTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA2MjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNjI1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDYzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDYzMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA2Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA2Mzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNjQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNjQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDY0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDY0Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA2NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA2NTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNjU2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDY2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDY2MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA2NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA2NjU7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDY3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDY3Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA2ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA2ODM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNjg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNjg4OzEzOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA3MDE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA3MDU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNzA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNzA3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDcxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDcxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA3MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA3MTQ7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDcyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDcyNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA3Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA3MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNzM0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDczODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDczOTsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNzUwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNzU0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDc1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDc1NjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MDc1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDc2MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA3NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA3NjQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNzcxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDc3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDc3NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA3Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA3Nzg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwNzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwNzg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDc4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDc4ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA3ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA3OTA7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDgwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDgwODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA4MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA4MTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwODE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwODE3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDgyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDgyMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA4MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA4Mjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwODMwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwODM0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDgzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDgzNjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA4NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA4NDU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwODU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwODU1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDg1OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA4NjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA4Njk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwODcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwODcxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjUwODc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwODc4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDg3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDg4MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA4ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA4ODQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNTA4OTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwODk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwODk3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA5MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA5MDg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwOTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwOTE1OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA5MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA5MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwOTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwOTMwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDkzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDkzNjsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwOTQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwOTUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDk1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDk1MzsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwOTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwOTY0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDk2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDk2ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA5NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA5NzI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwOTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwOTc4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDk4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDk4MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTA5ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTA5ODU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUwOTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUwOTkxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MDk5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MDk5ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEwMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEwMDI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMDA1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTAwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTAxMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEwMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEwMTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMDE5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMDIyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTAyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTAyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEwMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEwMjg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMDM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMDM4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTAzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTA0MDsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNTEwNTE7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTA2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTA2NDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MTA2ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTA3MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEwNzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEwNzY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTEwODA7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTEwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTEwMjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MTEwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTEwNDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTExMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTExMDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMTExOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTExOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTEyMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTExMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTExMjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMTI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMTI5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTEzNzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MTE0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTE0NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTExNDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTExNTA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTExNTQ7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTE4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTE4MjsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MTE4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTE4NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTExODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTExODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMTkxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTE5ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEyMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEyMDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMjA3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTIxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTIxNDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEyMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEyMTk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMjI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTIzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTIzMTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEyMzk7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTEyNDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEyNDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMjQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMjQ5OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjUxMjU0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMjU3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTI1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTI1OTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNTEyNzA7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTI5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTI5NTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MTI5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTMwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEzMDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEzMDY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTEzMTA7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTMyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTMzMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEzMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEzMzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMzM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMzM5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTM0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTM0NTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEzNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEzNTE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMzUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMzU0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTM2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTM2MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEzNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEzNjY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxMzcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxMzcyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTM3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTM3ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTEzODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTEzODE7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MTM5Njs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MTQwMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTQwNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTE0MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE0MDc7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTE0MTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE0MTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUxNDE3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxNDE5OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUxNDI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxNDI2OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUxNDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxNDMxOzI0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTQ1Njs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTQ2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTQ2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTQ2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTQ2NzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE0ODE7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE0ODc7NzI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI1MTU1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTU2MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1MTU2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTU2MzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE1Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE1Nzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE1ODA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE1ODQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTE1OTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE1OTE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE1OTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE1OTU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE1OTk7NzA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI1MTY2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTY3MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1MTY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTY3Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTY3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTY4MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTY4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTY4Mzs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1MTY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTY4ODsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTY5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTY5MTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE3MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE3MDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE3MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE3MDU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxNzE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxNzE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxNzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxNzIwOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTc0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTc0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTc0NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTc0OTszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE3ODQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE3ODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE3ODg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE3OTM7Mzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxODMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxODM1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUxODM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxODM4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxODQ1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxODQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxODQ4OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUxODUyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxODUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxODU0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxODU1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxODU5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUxODYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxODYzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxODcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxODczOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxODc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxODc1OzM3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTkxMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTkxNjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1MTkxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTkyMDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTkyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTkyOTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MTkzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MTkzMTszNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE5NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE5Njc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTE5Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTE5Njk7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUxOTgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUxOTg3OzI2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjAxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjAxNDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjAyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjAyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjAyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjAyNTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjAzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjAzNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjAzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjAzNzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjAzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjA0MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1MjA0NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjA0Njs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjA1Mjs2MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjUyMTEyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMTE0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUyMTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMTE3OzI1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjE0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjE0MzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIxNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIxNTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIxNTU7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIxNjA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTIxNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIxNjQ7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIxNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIxNzI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIxNzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIxNzQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIxODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIxODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIxODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIxODY7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMTk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMTk5OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjIyMDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjIyNTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1MjIyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjIyOTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIyNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIyNDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIyNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIyNDM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIyNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIyNTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIyNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIyNTU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIyNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIyNTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIyNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIyNjA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMjcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMjczOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjI5NDs3OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjMwMTs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjMwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjMwOTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjMxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjMxODsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTIzNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTIzNDE7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMzUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMzUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMzU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMzU1Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMzYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMzY0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUyMzY4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMzcwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMzc0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMzc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMzc4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMzgwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUyMzg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMzg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyMzg2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyMzkwOzI0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNTI0MTQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI0MTY7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUyNDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNDM1OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjQ1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjQ1OTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1MjQ2NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjQ2Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjQ3MDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjQ3OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjQ4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MjQ4Mzs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjQ4OTs1NDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjUyNTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNTQ0OzUzOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNTI1OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI1OTg7MTg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI1MjYxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjYxNzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTI2MzY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI2Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTI2Mzk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI2NDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyNjQ0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNjQ4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MjY0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjY1MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI2NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI2NTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyNjYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNjYyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MjY2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjY2NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI2Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI2Njg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyNjcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNjczOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MjY3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjY3Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI2ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI2ODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyNjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNjkxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MjY5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjY5ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI3MDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyNzEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNzExOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MjcxNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjcyMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI3MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI3MjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyNzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNzI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MjcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjczMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI3MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI3Mzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyNzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNzQyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Mjc0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mjc0NTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI3NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI3NTQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyNzU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNzU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Mjc2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mjc2Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI3Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI3Njk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyNzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNzczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Mjc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mjc3Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI3ODM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI3ODY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyNzg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNzg4OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjUyNzkxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyNzk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Mjc5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mjc5Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI4MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI4MDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyODA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyODA3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MjgwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjgxMDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI4MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI4MTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyODE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyODIwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MjgyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjgyMjsxNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyODM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyODQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Mjg0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mjg0NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI4NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI4NDk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyODUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyODUzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Mjg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mjg1OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI4NjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI4NjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyODY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyODY4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Mjg3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mjg3Nzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI4ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI4ODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyODkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyODkxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Mjg5ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjkwMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI5MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI5MDM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTI5MDc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI5MTA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyOTExOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyOTE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MjkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MjkxNjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI1MjkyMzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI5Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI5MzA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Mjk0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mjk0MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI5NDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI5NDk7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Mjk1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mjk2MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI5NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI5NjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyOTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyOTcwOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI5ODI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI5ODU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUyOTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUyOTg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Mjk5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mjk5MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTI5OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTI5OTg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMDA1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzAwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzAwOTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMwMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMwMTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMDIyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzAyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzAyODs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMwMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMwMzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMDQxOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzA1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzA1MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMwNTM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMwNTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMDU5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzA2Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMwNjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMwNzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMDczOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzA4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzA4Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMwODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMwODc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMDkxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzA5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzA5NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMwOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMxMDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMTAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMTA0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzExMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzExMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMxMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMxMTY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMTE5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzEyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzEyMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMxMjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMxMjU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMTMxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMTM0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzEzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzEzNjsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNTMxNDc7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzE1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzE2MDs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MzE2NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzE2NzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMxNjg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMxNzI7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTMxNzY7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzE5ODsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MzE5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzIwMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMyMDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMyMDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMjA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMjA3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzIxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzIxNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMyMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMyMjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMjI1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzIzMzs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MzIzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzI0MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMyNDI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMyNDY7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTMyNTA7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzI3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzI3ODsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MzI3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzI4MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMyODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMyODM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMjg3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzI5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzI5NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMyOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMyOTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMzAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMzAzOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzMwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzMxMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMzMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMzMTU7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMzIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMzIzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzMyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzMyNzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMzMzU7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTMzNDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTMzNDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzMzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMzQ1OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjUzMzUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzMzUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzM1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzM1NTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNTMzNjY7MjQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzM5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzM5MTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1MzM5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzM5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTMzOTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM0MDM7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTM0MDc7MTk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzQyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzQyNzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTM0MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM0MzI7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzNDQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNDQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzQ0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzQ0NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTM0NDg7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTM0NTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM0NTY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzNDU3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNDYxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjUzNDY1OzE5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTM0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM0ODU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzNDg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNDkwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzQ5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzQ5NDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTM0OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM0OTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzNTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNTAyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzUwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzUwNjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTM1MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM1MTI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzNTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNTE5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzUyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzUyMjs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTM1Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM1MzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzNTMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNTM0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzUzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzU0MDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTM1NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM1NDY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzNTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNTQ5OzE1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTM1NjQ7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTM1Njk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM1NzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjUzNTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNTc1OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjUzNTgwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNTgzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1MzU4NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzU4Nzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1MzU5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzU5NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1MzU5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzU5OTsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTM2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM2Mjc7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTM2MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM2MzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTM2MzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM2Mzk7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzNjUzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNjU2OzcyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNTM3Mjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM3Mjk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTM3MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM3MzI7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzNzQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNzQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzNzQ5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNzUzOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUzNzU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzNzYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNzYzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzNzY0OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNzY4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUzNzcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNzcxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzNzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNzc5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzNzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNzgyOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjUzNzg2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzNzg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNzg4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzNzg5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzNzk0OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MzgyOTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzgzMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1MzgzNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1MzgzODs2OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjUzOTA3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzOTA5OzE4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNTM5Mjc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM5Mjk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTM5MzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTM5MzI7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzOTQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzOTQ3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzOTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzOTUwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzOTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzOTUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjUzOTU0OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjUzOTU5OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1Mzk2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mzk3MDs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1Mzk3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mzk3NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1Mzk3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Mzk3NzsyNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQwMDE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQwMDY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTQwMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQwMTA7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQwMTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQwMTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQwMTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQwMjA7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU0MDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0MDMxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU0MDMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0MDMzOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDA0NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDA0OTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1NDA1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDA1Mzs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDA2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDA2MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDA2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDA2NTs0MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQxMDY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQxMTA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTQxMTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQxMTQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQxMjM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQxMjc7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTQxMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQxMzA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQxMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQxMzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQxNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQxNDE7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU0MTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0MTY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU0MTY2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0MTcxOzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDIwNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDIxMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDIxMTs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDIxNzs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDIyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDIyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDIyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDIyODszMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQyNjE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQyNjU7NDk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI1NDMxNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDMxNjsyNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQzNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQzNDM7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQzNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQzNTI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQzNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQzNTQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQzNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQzNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQzNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQzNjY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQzNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQzNjk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTQzNzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQzNzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQzNzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQzODA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQzODQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTQzODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQzODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQzOTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQzOTQ7MjA7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI1NDQxNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDQxNjsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTQ0MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ0MzU7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU0NDU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0NDU5OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU0NDY0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU0NDY2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0NDcwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU0NDcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0NDc0OzQxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDUxNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDUxODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDUyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDUyODs1NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjU0NTgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0NTg0OzU0OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNTQ2Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ2Mzk7NTM7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI1NDY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDY5MzsxODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjU0NzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0NzEyOzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDczMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDczMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NDczNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDczNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTQ3Mzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ3NDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0NzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0NzQ1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NDc0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDc1MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTQ3NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ3NTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0NzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0NzU4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NDc2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDc2ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTQ3Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ3NzA7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTQ3NzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ3NzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0Nzc3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0NzgwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NDc4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDc4Mjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI1NDc4OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTQ3OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ3OTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0Nzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0Nzk4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NDgwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDgwNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTQ4MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ4MTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0ODE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0ODE2OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTQ4Mjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ4MzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0ODMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0ODMyOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI1NDg0MzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0ODU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0ODU2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU0ODYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0ODYzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NDg2NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDg2ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NDg3MjsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0ODkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0ODk0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU0ODk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0ODk2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NDg5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDg5OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTQ5MDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ5MDM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0OTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0OTEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NDkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDkxNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTQ5MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ5MjE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0OTI5OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU0OTM0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0OTM3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NDkzODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDk0Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NDk0NjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0OTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0OTc0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU0OTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0OTc2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NDk3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDk3OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTQ5ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ5ODM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU0OTg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU0OTkwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NDk5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NDk5NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTQ5OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTQ5OTk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1MDA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MDA2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTAxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTAxMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTUwMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTUwMTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1MDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MDIzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTAzMTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NTAzNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTAzOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTUwNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTUwNDE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTUwNDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTUwNDk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1MDUxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MDUzOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU1MDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MDYwOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU1MDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MDY1Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU1MDczOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU1MDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MDc3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU1MDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MDgzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU1MDg0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MDg3OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTEwMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTEwNTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTExNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTExNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTExNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTExNzs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTEyMjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTEyNTszMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTUxNTg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTUxNjE7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTUxNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTUxNjQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU1MTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MTc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU1MTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MTc5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU1MTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MTgyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU1MTgzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MTg3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTE5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTE5OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTIwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTIwMTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTIwMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTIwNzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTUyMTk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTUyMjM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU1MjM4OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU1MjQzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU1MjQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MjQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU1MjQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MjUyOzUzOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNTUzMDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTUzMDY7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU1MzI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MzI1OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTM0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTM0OTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1NTM1NDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTM1NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTM1OTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTM2ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTM3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NTM3MTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTM3MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTUzNzY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTUzODA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1MzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1MzgyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTM4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTM4NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTUzOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTUzOTE7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1Mzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1Mzk4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTQwNjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTQxMDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU0MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU0MTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NDE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NDE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTQxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTQxOTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU0MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU0MjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NDI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NDMwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTQzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTQzNDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NDQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NDQ1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTQ1MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU0NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU0NTU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NDYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NDYyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTQ3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTQ3MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU0NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU0NzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NDgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NDg0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTQ4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTQ4NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU0ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU0OTA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NDk2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTUwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTUwMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU1MDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NTExOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTUxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTUxNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU1MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU1MTk7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NTI4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTUzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTUzMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU1MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU1MzY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NTQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NTQxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTU0MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTU0NDs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU1NTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU1NTQ7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NTU2OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU1NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU1Njc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NTY5OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU1Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU1ODA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NTg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NTg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTU4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTU4ODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU1OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU1OTY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NjAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NjAxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTYwODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU2MTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU2MTI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NjE3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTYyMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTYyNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU2MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU2Mjc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NjMyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTYzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTYzNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU2NDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU2NDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NjQ1OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU1NjQ4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NjUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTY1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTY1MzszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NTY1Njs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU2NjE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTU2NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU2NjY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NjcxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTY3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTY3Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU2Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU2ODA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1Njg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1Njg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTY4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTY4ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU2OTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU2OTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1Njk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NzAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTcwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTcwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU3MDc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NzEyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTcxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTcxNjsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NzI2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NzMwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTczMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTczMjs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU3Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU3Mzg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NzQxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTc0NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTc0OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU3NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU3NTE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTU3NTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU3NTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1NzU5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NzYyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTc2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTc2NDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI1NTc3MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU3NzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU3NzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1Nzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1NzgwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTc4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTc4Nzs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU3OTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU3OTY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1ODA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1ODA1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTgxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTgxNDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU4MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU4MjM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1ODI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1ODI4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTgzNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTgzODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU4Mzk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU4NDE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1ODQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1ODQ2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTg1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTg1MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU4NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU4NTU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1ODYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1ODYxOzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU4NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU4NzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1ODc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1ODc2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTg3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTg4MDsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1ODkwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1ODkyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTg5NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTg5ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU4OTk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU5MDE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1OTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1OTA5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTkxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTkxOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU5MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU5MjI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1OTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1OTI3OzEwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTU5Mzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTU5NDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1OTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1OTQyOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI1NTk1MzsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU1OTY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1OTY2OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU1OTcwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU1OTczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NTk3NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NTk3ODs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NTk4MjsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MDAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MDA0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU2MDA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MDA2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NjAwODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjAwOTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTYwMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYwMTM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MDIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MDIyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NjAyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjAyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTYwMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYwMzE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MDM5OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU2MDQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MDQ3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NjA0ODs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjA1Mjs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NjA1NjsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MDgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MDg0OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU2MDg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MDg2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NjA4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjA4OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTYwOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYwOTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MDk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MTAwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NjEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjEwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTYxMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYxMDk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MTE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MTE2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NjEyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjEyMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTYxMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYxMjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MTMzOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NjE0MTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NjE0NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjE0OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTYxNTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYxNTE7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTYxNTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYxNTk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MTYxOzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI1NjE3MjsyNDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MTk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MTk3OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU2MjAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MjA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NjIwNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjIwOTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NjIxMzsxOTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MjMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MjMzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NjIzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjIzODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTYyNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYyNDU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MjQ4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NjI1Mjs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NjI1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjI2MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTYyNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYyNjI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTYyNjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYyNzA7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU2MjcyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2Mjc0OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU2MjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2MjgxOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU2Mjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2Mjg2OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjMwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjMwMTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjMwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjMwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjMwODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjMxMTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTYzMjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYzMjg7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTYzMzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYzMzQ7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTYzMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYzNDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTYzNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYzNDI7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTYzNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYzNDY7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTYzNTQ7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYzNjA7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTYzNjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYzNjM7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTYzNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYzNjk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTYzNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYzNzI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTYzNzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTYzNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYzNzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTYzNzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTYzODM7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NDE4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NDIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NDIyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NDI1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjQzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjQzNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjQzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjQzOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjQ0MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjQ0NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjQ1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjQ1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjQ1NjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY0NzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY0NzQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NDg1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NDg3OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NDkyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NDk1OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjUwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjUwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjUwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjUwODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1NjUxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjUxMzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjUxNzsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY1NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY1NDU7NzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY1NTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY1NTU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTY1NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY1NTg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NTcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NTcyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NTc2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjU5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjU5MjsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY2MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY2MDg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY2MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY2MTA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTY2MTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY2MTU7ODswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY2MjM7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTY2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY2MjY7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NjU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NjU3Ozc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NjY0OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjY3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjY4MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjY4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjY4MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1NjY4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjY4NjszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY3MTg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY3MjM7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NzQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NzQ1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2NzQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2NzQ3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1Njc1OTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Njc2NDsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY3ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY3ODQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY3ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY3ODY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2Nzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2Nzk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2Nzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2ODAwOzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjgyMDs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjgyNTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY4NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY4NDY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY4NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY4NDg7MzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2ODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2ODgyOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2ODkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2ODkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2ODkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2ODk0OzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjkwNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjkxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NjkxMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NjkxNjsyODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTY5NDQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTY5NDg7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU2OTcxOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2OTc2OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU2OTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU2OTc5OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1Njk5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Njk5NjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1Njk5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Njk5OTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1NzAwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NzAwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzAwNTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NzAwNjs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzAxMTszMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTcwNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcwNDM7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU3MDYwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MDY0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU3MDY1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MDY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU3MDY5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MDcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU3MDcyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MDc0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzA3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzA4MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcwODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcwODI7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MDg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MDg3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzA5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzA5MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcwOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcwOTY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MTAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MTAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzEwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzEwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcxMDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcxMDk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MTE5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzEyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzEyNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcxMjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcxMjk7MTE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzE0MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzE0MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcxNDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcxNDU7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTcxNDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcxNTE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MTUzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzE1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzE1Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcxNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcxNjI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MTY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MTY4Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzE3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzE3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcxODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcxODI7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MTg4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MTg5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzE5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzE5Mjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcxOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcxOTc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MjAxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MjA0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzIwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzIwNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcyMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcyMTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MjE1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzIxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzIxOTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcyMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcyMjQ7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MjI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MjI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzIzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzIzMzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcyNDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcyNDM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MjQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MjQ1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU3MjQ5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MjUyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzI1MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzI1NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcyNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcyNTg7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNTcyNjU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MjcxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzI3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzI3NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcyNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcyNzk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MjgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3Mjg0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzI5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzI5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTcyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTcyOTU7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjU3MzA2OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTczMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTczMTk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTczMjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTczMjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MzI3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MzMxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU3MzM1OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTczNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTczNTc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTczNTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTczNTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3MzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3MzYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzM2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzM2Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTczNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTczNzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3Mzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3Mzc5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzM4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzM4NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTczOTI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTczOTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc0MDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3NDAxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NDA1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU3NDA5OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc0MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc0Mzc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTc0Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc0Mzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3NDQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NDQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzQ0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzQ0Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc0NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc0NTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3NDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NDU4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzQ2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzQ2Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc0Njk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3NDczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NDc0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzQ4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzQ4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc0ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc0ODY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3NDk0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU3NDk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NTAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzUwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzUwNDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NzUwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzUxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc1MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc1MTQ7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjU3NTI1OzI0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc1NDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc1NTA7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTc1NTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc1NTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3NTU4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NTYxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU3NTY1OzIwOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc1ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc1ODY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3NTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NTkxOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzU5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzU5NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc1OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc2MDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3NjAxOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU3NjA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NjA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzYxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzYxMTs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1NzYxNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzYxOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc2MjE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc2MjM7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTc2Mjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc2MzA7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTc2MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc2MzU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU3NjQ4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU3NjUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NjUyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU3NjU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NjU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU3NjYwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NjYzOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NzY3NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzY4MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1NzY4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzY4Mzs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NzY4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzY5MDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NzY5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzY5MzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NzY5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzY5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1NzY5Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzcwMTszNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTc3Mzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc3NDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTc3NDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc3NDQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTc3NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc3NTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTc3NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc3NTY7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTc3NjI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc3NjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTc3NjU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc3Njc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3NzcwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3NzczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Nzc3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Nzc3NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc3Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc3ODA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3NzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3Nzg0OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Nzc4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Nzc4ODs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc3OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc3OTU7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3Nzk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3Nzk4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzgwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzgwNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc4MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc4MDk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3ODE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3ODE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzgxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzgxODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc4MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc4MjE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3ODI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3ODI2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzgzMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzgzMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc4MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc4MzU7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTc4Mzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc4NDE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3ODQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3ODQzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Nzg0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Nzg0NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc4NTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc4NTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3ODU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3ODU3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Nzg1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Nzg2MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc4NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc4NjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3ODY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3ODcwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Nzg3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Nzg3MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc4NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc4Nzc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3ODgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3ODgyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Nzg4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Nzg4NzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc4ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc4OTA7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3ODk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3OTAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzkwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzkwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc5MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc5MDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3OTEwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3OTE0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzkxNjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc5MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc5MTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3OTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3OTIzOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1NzkzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1NzkzMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc5MzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc5MzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3OTM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3OTM5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Nzk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Nzk0NTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc5NTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3OTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3OTU4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Nzk2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Nzk2Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc5Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc5Njk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3OTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3OTcyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1Nzk4MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1Nzk4NDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTc5ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTc5ODY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU3OTk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU3OTk1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODAwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODAwMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgwMDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MDEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MDE1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODAxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODAxNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgwMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgwMjM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MDI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MDI3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODAzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODAzMTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgwMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgwMzc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MDQwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODA0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODA0NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgwNDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgwNDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MDUxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODA1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODA1NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgwNTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgwNjA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MDY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MDY1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODA2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODA2ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgwNzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgwNzI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MDc1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODA3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODA3OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgwODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgwODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MDkxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU4MDk1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MDk4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODA5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODEwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgxMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgxMDQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNTgxMTE7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MTIwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODEyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODEyNDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgxMjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgxMjg7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MTM1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODEzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODE0MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgxNDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgxNDM7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MTUxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODE1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODE1MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgxNTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgxNjA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MTYxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MTYzOzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgxNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgxNzg7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTgxNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgxODA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MTg2Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODE5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODE5NDs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgyMDA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MjA0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODIwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODIxMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgyMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgyMTM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MjE1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MjE2OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODIyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODIyMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgyMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgyMjY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MjMxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MjM1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODIzNjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODIzODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgyNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgyNDY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MjQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MjUwOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODI1NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODI1ODs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgyNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgyNjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MjY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MjY3OzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgyODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgyODI7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTgyODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgyODQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4Mjg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4Mjg3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODI4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODI5MDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgyOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgyOTQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4Mjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4Mjk3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODMwMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODMwNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgzMDc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgzMDk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MzE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MzE1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODMxOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODMyMDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgzMjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgzMjM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MzMyOzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTgzNDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTgzNDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MzQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MzQ5OzExOzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI1ODM2MDsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4MzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MzczOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU4Mzc3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4MzgwOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODM4MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODM4NTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1ODM4OTsyMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4NDEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NDExOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU4NDEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NDEzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODQxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODQxNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTg0MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg0MjA7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4NDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NDI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODQzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODQzMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTg0Mzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg0Mzg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4NDQ2OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU4NDUxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NDU0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODQ1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODQ1OTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1ODQ2MzsyNzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4NDkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NDkxOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU4NDkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NDkzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODQ5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODQ5NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTg0OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg1MDA7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4NTA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NTA3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODUxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODUxMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTg1MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg1MTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4NTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NTIzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODUyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODUyODs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTg1MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg1MzY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4NTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NTQwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1ODU0ODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1ODU1MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODU1NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTg1NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg1NTg7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTg1NjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg1NjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU4NTY4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NTcwOzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU4NTc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NTc3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU4NTgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NTgyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODU5NDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1ODU5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODU5ODs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODYwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODYwODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODYwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODYxMjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTg2MjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg2Mjk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTg2MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg2MzM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTg2NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg2NDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTg2NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg2NDU7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU4Njc1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4Njc4OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU4NjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NjgyOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU4NjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NjkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU4NjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NjkzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODcwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODcwNTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTg3MjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg3MjU7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU4NzQ3OzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NzUzOzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU4NzU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4NzU2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODc3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODc3MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODc3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODc3NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODc3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODc3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODc3OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODc4Mzs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1ODc4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODc5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODc5MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODc5NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODc5ODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1ODgwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODgwMTs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODgxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODgxMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODgxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODgxMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODgxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODgxNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODgxNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODgyMTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODgyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODgzMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODgzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODgzMjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODgzNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODgzNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODgzODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODg0MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1ODg0NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODg0OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1ODg1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODg1Mjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODg2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODg2MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODg2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODg2NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODg3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODg3NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODg3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODg3Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODg4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODg4NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODg4Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODg5MTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODg5OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODkwMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODkwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODkwMjs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODkxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODkxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODkxNDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODkyMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODkyNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1ODkyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODkzMDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1ODkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1ODkzMzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTg5NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg5NDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTg5NDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg5NDk7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNTg5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTg5NTM7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU4OTcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4OTcxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU4OTcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU4OTczOzQxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1OTAxNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTAxODs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1OTAyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTAyNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1OTAyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTAyOTs0MzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTkwNzI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkwNzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNTkwNzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkwNzk7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU5MTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MTEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjU5MTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MTE0OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1OTEzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTEzODs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1OTE0MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1OTE0NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTE0NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1OTE0NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTE0OTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkxNTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkxNTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MTU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MTU3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTE2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTE2MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkxNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkxNjY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MTY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MTcwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTE3Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkxODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkxODQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MTg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MTg3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTE5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTE5NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkxOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkxOTg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MjA0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTIwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTIwNzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkyMDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkyMTA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MjE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MjE1OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTIxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTIyMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkyMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkyMjQ7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTkyMjc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkyMzA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MjMyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTIzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTIzNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkyMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkyNDA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MjQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MjQ2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTI1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTI1MzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkyNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkyNTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MjYwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTI2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTI2OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkyNzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkyNzU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MjgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MjgyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTI4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTI4NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkyODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkyODk7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5Mjk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5Mjk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTMwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTMwMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkzMDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkzMDU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MzEyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTMxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTMxNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkzMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkzMjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MzI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MzI3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTMzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTMzMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkzMzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkzMzY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MzQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MzQyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTM0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTM0ODs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkzNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkzNTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MzU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5MzYwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTM2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTM2MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkzNjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkzNjc7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MzcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5Mzc0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTM3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTM3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkzNzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkzODA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5MzgzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5Mzg0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTM4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTM5MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTkzOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTkzOTM7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NDAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NDAyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTQwNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTQwNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk0MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk0MDk7MTM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTQyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTQyMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk0MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk0Mjc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NDMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NDM1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTQzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTQzNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk0NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk0NDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NDQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NDQ3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTQ1MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk0NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk0NTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NDU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NDYwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTQ2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTQ2NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk0Njk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NDcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NDcxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTQ3NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk0Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk0ODA7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NDg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NDg1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTQ4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTQ4ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk0OTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk0OTI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NDk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NDk1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTQ5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTQ5OTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk1MDY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk1MDk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NTExOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU5NTE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NTE4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTUxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTUyMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk1MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk1MjQ7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNTk1MzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NTM3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTU0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTU0MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk1NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk1NDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NTUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NTUxOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTU1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTU1OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk1NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk1NjQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NTY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NTY3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTU3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTU3NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk1NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk1Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NTgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NTg0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTU4NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTU4NzsxNTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NjAyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NjAzOzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU5NjA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NjA1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTYxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTYxMzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk2MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk2MTk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NjIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NjIzOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTYyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTYyOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk2MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk2MzE7MTc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTY0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTY0OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk2NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk2NTI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NjU1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NjU4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTY1OTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTY2MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk2NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk2NjQ7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NjY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NjcwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTY3NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTY3Nzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk2ODI7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5Njg0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5Njg1Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTY5MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTY5NDsxMjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NzA2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NzA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTcxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTcxMTsxMTsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNTk3MjI7MTI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTczNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTczNTs0OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1OTczOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTc0MjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk3NDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk3NDc7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTk3NTE7MjE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTc3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTc3MzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1OTc3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTc3NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk3Nzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk3Nzg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5NzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5NzgyOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTc5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTc5MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk3OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk3OTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5Nzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5ODAwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTgwODs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1OTgxMzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTgxNjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk4MTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk4MjE7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTk4MjU7Mjc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTg1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTg1MzsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI1OTg1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTg1NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk4NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk4NTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5ODYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5ODYyOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTg2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTg2OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk4NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk4NzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5ODc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5ODc4OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTg4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTg4NTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk4ODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk4OTA7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5ODk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5ODk4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTkwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTkwMjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk5MTA7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNTk5MTU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk5MTg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5OTE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5OTIwOzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjU5OTI1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5OTI4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI1OTkyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTkzMDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI1OTkzNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNTk5NDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNTk5NDM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjU5OTQ1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5OTQ3OzY7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU5OTUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5OTU0OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjU5OTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjU5OTU5OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1OTk3MTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI1OTk3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTk3NTs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1OTk4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTk4MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI1OTk4MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI1OTk4NjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAwMDA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAwMDM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjAwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAwMDc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAwMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAwMTc7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwMDQxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMDQ0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYwMDQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMDQ4OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwMDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMDU1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwMDU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMDU3OzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDA4MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDA4MzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MDA4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDA4NzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAwOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAwOTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAxMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAxMDE7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwMTEyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMTEzOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwMTIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMTIzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwMTI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMTI1OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDE0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDE0ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDE0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDE1MDs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDE1ODs2OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDE2NDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MDE2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDE2NzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAxODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAxODM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAxODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAxODY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAxODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAxODk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAxOTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAxOTQ7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjAyMDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyMDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyMDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyMDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyMDk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjAyMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyMTI7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyMTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyMjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyMjE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyMjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyMjU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyMjk7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyMzU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyMzc7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyMzk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyNDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyNDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyNDY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjAyNTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyNTQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjAyNTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyNTc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAyNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAyNjY7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwMjc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMjc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwMjgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMjg0OzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwMjg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMjkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwMjkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMjkyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDMwNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDMwNzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDMwODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDMxMTszMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAzNDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAzNDI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjAzNDY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAzNDg7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAzNTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjAzNTE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAzNTM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwMzU2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMzU5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDM2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDM2MTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjAzNjg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjAzNjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwMzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMzczOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDM3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDM4MDsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwMzkxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwMzk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDM5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDM5NjszOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI2MDM5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDQwMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA0MDM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA0MDY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNDA4Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjYwNDE1OzExOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA0MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA0Mjc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNDMxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDQzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDQzNTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA0NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA0NDQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNDUwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNDUxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDQ1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDQ2MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA0NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA0NjI7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNjA0Njk7MTU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDQ4NDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDQ4ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA0ODk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA0OTE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNDk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNDk3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDUwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDUwMTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA1MDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA1MDg7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNTE0OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDUxODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDUxOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA1MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA1MjI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNTI4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDUzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDUzMTs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA1Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA1Mzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNTQzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDU0NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDU0Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA1NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA1NTQ7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNTYxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNTY0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDU2NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDU2Nzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA1NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA1NzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNTc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNTc1OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDU3ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDU3OTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA1ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA1ODY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNTkyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDU5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDU5NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA2MDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA2MDE7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNjAzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNjA0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDYwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDYxMjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA2MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA2MTQ7ODsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNjA2MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA2MjU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNjI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNjI3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDYzNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDYzNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA2NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA2NDM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNjQ2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNjQ3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDY1NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDY1OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA2NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA2NjE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNjcwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNjcxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDY3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDY3ODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA2ODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA2ODI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNjg2Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDY5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDY5NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA2OTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA3MDA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNzA1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNzA2OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDcxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDcxMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA3MTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA3MTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYwNzE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNzIwOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MDcyNjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDcyOTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjA3MzE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA3MzM7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjA3NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA3NDE7MjQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwNzY1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYwNzY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwNzY5OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDc4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDc4Mjs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MDc4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDc5MDsxNjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjA4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA4MDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjA4MDg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA4MTE7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjA4MjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA4MjE7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwODMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwODM1Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwODQ0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwODQ1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDg1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDg1NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDg1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDg1OTsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjA4NzY7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA4ODI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjA4ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA4ODU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwODk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwODk4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwOTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwOTAxOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDkyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDkyNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDkyODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MDkzNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDkzNTs1OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MDk0MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDk0MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDk0NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MDk0NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDk0ODsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MDk1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MDk1MTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjA5NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA5NjQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjA5NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA5Njc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjA5NzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA5NzI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjA5NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjA5NzU7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwOTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwOTkyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYwOTkzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYwOTk3OzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTAzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTAzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTAzOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTA0MjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjEwNTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjEwNTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjEwNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjEwNTU7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxMDcxOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxMDc0Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxMDgxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxMDg1OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxMDg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxMDg4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxMDkwOzEwOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTEwMDsyMTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjYxMTIxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxMTIzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxMTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxMTI2OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTEzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTEzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTEzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTE0MDsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjExNjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjExNjI7MTY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2MTE3ODsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTE4MDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjExOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjExOTg7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxMjE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxMjE3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYxMjIxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxMjIzOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxMjI4OzIwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTI0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTI0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTI1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTI1MTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjEyNjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjEyNjY7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxMjg2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxMjg5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYxMjkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxMjkzOzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTMwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTMwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTMwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTMwNjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTMxNDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTMxNzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjEzMzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjEzMzk7NDg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2MTM4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTM4ODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTM5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTM5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTM5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTM5ODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjE0MDk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE0MTI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjE0MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE0MTk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjE0MjM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjE0MjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE0MjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjE0Mjc7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE0Mjk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNDMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNDM1OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTQzNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTQzNzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE0NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE0NDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNDQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNDQ5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTQ1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTQ1OTs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE0Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE0Njg7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNDcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNDczOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTQ3ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTQ4MTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE0ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE0ODM7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNjE0ODY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE0ODk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNDkwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNDk0OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTQ5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTQ5Njs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI2MTUwMzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE1MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE1MDU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNTA5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTUxMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTUxMTsxMDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNTIxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNTIyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTUyNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTUyNzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE1MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE1MzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNTM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNTM3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTU0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTU0Mjs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE1NTA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE1NTM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNTU1Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjYxNTYyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTU2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTU2NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE1NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE1NzE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNTc1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNTc2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTU4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTU4MTs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE1ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE1ODg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNTkxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTU5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTU5Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE2MDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE2MDU7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNjEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNjE0OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTYxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTYxNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE2MjA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE2MjM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNjI0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNjI1OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTYzMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTYzMTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE2MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE2MzY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNjM5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTY0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTY0Mzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE2NTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE2NTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNjU2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNjU3Ozg7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjYxNjY1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNjY4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTY2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTY3MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE2Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE2Nzk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNjg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNjg2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTY4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTY5MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE2OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE2OTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNzAxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNzAyOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTcwNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTcwNzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE3MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE3MTE7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNzIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNzIxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTczMDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE3Mzg7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE3NDI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNzQ0Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTc1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTc1NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE3NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE3NjQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNzcyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNzczOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTc3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTc3Njs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE3ODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE3ODQ7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxNzkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxNzkzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTc5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTc5Nzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE4MDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE4MDQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxODA3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxODExOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTgxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTgxMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjE4MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE4MTc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYxODI2OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxODMxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MTgzMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTgzNTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MTg0MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTg0MzsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjE4NTY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjE4NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE4NjA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjE4NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE4NjM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjE4NjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE4Njc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjE4NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE4NzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjE4NzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE4Nzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjE4ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE4ODE7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxODk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxODk3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxODk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxODk5OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTkyMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTkyMTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTkyMzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjE5MzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE5Mzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjE5NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjE5NDE7MTc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxOTU4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxOTU5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYxOTYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYxOTYxOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MTk4NDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTk4NzszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MTk5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MTk5MTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjIwMTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjIwMTE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjIwMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjIwMTM7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMDI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMDI5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMDMwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMDMxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMDMzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMDM2Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYyMDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMDQ0Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMDUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMDUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMDU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMDU1OzU7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYyMDYwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMDYxOzg7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMDY5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYyMDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMDcyOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMDc0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMDc1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMDc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMDc3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjA4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjA4OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjA5MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjA5NDszODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjYyMTMyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMTM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMTM2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMTM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMTM4OzMxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjE2OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjE3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjE3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjE3MjszOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjE3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjE3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjE3NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjE3ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjE3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjE4MDsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjIyMDE7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjIyMDY7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjIyMTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjIyMTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjIyMTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjIyMTc7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMjQwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMjQzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMjQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMjQ3OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYyMjUxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMjU1OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYyMjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMjU4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMjYxOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMjYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMjY0OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjI4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjI4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjI4Mjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjI4NjszODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjYyMzI0OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMzI2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMzI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMzI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyMzI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyMzMwOzI5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjM1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjM2MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjM2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjM2MjsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjIzODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjIzODY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjIzODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjIzODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjIzODk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjIzOTA7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyNDExOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNDE1Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyNDIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNDI0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyNDI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNDI2OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjQ0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjQ0ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjQ1MDsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI0Njc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI0NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI0NzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI0NzQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjI0NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI0Nzc7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI0ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI0ODM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI0ODU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI0OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI0OTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI0OTY7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI1MDA7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI1MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI1MDk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI1MTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI1MTE7Mjg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyNTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNTQwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyNTQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNTQyOzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjU2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjU2MTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MjU2NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjU2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjU3MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjU3MTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjU3NDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MjU3ODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjU4MTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MjU4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjU4NDs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjU4OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjU5MDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjU5MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjU5MjsxNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI2MDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI2MTA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI2MTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI2MTU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI2MjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI2MjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI2MjY7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyNjU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNjU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyNjU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNjU4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyNjYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNjYxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyNjYyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNjYzOzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjY4MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjY4MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjY4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjY4MzsyMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI3MDc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjI3MTE7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI3MTM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI3MTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI3MTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI3MjA7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjI3MjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI3Mjc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI3MzY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI3Mzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI3Mzk7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI3NDE7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyNzQ0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNzQ3OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Mjc0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Mjc0OTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI3NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI3NTQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyNzU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNzU4OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Mjc2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Mjc2NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI3NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI3NzM7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyNzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNzc3Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Mjc4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Mjc4NTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI3ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI3ODk7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyNzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyNzk1OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MjgwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjgwMjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI4MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI4MDc7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyODEyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyODE1OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MjgxNzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjgxOTs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MjgyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjgyNDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI4MzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI4MzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI4Mzc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI4NDA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjI4NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI4NDQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI4NTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI4NTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjI4NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI4NTY7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYyODkzOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyODk5OzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjkyMDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjkyMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MjkyMzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjkyNTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI5Mjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI5MzE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyOTMyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyOTMzOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2MjkzNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MjkzODszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI5NDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI5NDI7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyOTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyOTQ4Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Mjk1NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Mjk1NzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI5NjA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI5NjE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyOTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyOTY5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Mjk3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Mjk3Mzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI5Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI5Nzk7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYyOTg1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYyOTg2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Mjk5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Mjk5MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjI5OTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjI5OTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYzMDAxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMDAzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYzMDA3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMDA4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzAxODszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MzAyMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzAyMjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMwMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMwMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMwMzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMwMzc7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjMwNDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMwNDE7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzMDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMDUyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzMDUzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMDU0OzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzA4OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzA5Mjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzA5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzA5OTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzEwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzEwNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzEwNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzEwNjsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMxMzM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMxMzY7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjMxMzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMxNDA7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzMTUyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMTUzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzMTU0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMTU1OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzE2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzE2NzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzE2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzE2OTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMxODA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMxODM7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjMxODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMxODc7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMxOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMxOTc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMxOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMxOTk7MTg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzMjE3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMjE4OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzIyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzIyOTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMyNDM7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMyNDc7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjMyNTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMyNTU7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMyNjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMyNjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMyNjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMyNjY7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzMjg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMjkwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzMwMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzMwNDs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MzMxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzMxMjsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMzMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMzMzM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMzMzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMzMzU7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjMzNDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMzNDE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMzNDQ7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMzNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMzNTA7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMzNTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMzNTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjMzNTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjMzNTg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzMzY5OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMzc0OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYzMzc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMzc3Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzMzg2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMzg3OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzMzg5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMzkwOzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzMzk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMzk2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzMzk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzMzk5OzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYzNDAzOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNDA0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNDA1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNDA2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNDEwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjYzNDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNDE0OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNDIwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNDIxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNDIzOzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzQ0NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzQ0OTsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2MzQ1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzQ1Mjs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzQ2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzQ2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzQ2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzQ2MzsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjM0ODQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM0ODU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjM0ODY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM0ODc7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNTEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNTExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNTEyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNTEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNTE0OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNTE3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzUyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzUyODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzUyOTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzUzNDsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjM1NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM1NTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjM1NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM1NTc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjM1NjE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjM1NjI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM1NjY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjM1Njc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM1NzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjM1NzE7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM1NzQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjM1NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM1Nzc7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNTg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNTg4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzNTkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNTkxOzIxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzYxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzYxMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2MzYxNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzYxODs3MTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjYzNjg5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzNjkxOzcwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjM3NjE7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM3NjM7NzI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2MzgzNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2MzgzNzs3NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjYzOTEyOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzOTE0OzI3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2Mzk0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Mzk0MjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjM5NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM5NTM7MjE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzOTc0OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzOTc3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzOTc4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzOTgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjYzOTgxOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzOTgzOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Mzk4NjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Mzk4OTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjM5OTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjM5OTE7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjYzOTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjYzOTk5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDAwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDAwMzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQwMTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQwMTM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0MDE5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MDIwOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDAyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDAyNTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQwMzA7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQwMzM7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0MDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MDM1OzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjY0MDM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MDQxOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDA0MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDA0NTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQwNDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQwNDc7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNjQwNTQ7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0MDYwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MDYxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDA2NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDA2ODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQwNzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQwNzM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0MDc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MDgwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDA4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDA4Mzs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQwOTA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQwOTE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0MDk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MDk2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDEwMDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDEwMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQxMDU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQxMDc7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjQxMTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQxMTI7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0MTIzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY0MTI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MTI3Ozc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0MTM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MTM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0MTM2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MTM5OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY0MTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MTQzOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0MTQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MTQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0MTQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MTUwOzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NDE4MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDE4NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2NDE4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDE4OTsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjQxOTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQyMDA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjQyMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQyMDI7MzA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0MjMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MjM1OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY0MjM4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MjM5OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NDI1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDI1MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NDI1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDI1NDs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NDI2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDI2MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NDI2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDI2MzsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjQyNzQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQyNzc7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjQyODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQyODQ7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjQyOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQyOTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjQyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQyOTU7MjI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0MzE3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MzIwOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY0MzIzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MzI0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0MzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MzM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0MzM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0MzM2OzIyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NDM1ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDM1OTs1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NDM2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDM2NTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjQzNzk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQzODU7MjM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0NDA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NDA5OzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0NDE1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NDE4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0NDE5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NDIxOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDQyNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDQyNjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ0Mjk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ0MzI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NDM0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDQ0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDQ0MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ0NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ0NDY7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NDU2OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDQ2MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDQ2MTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ0NjY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ0Njg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NDcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NDcyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDQ3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDQ3NjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ0Nzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ0Nzk7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NDgzOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDQ5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDQ5Mzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ0OTg7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NTAxOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDUwOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDUxMDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ1MTQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ1MTc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NTE5OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDUyNDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDUyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ1MzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ1MzE7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NTM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NTM2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDUzODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDUzOTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ1NDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ1NDE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NTQ2OzE7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjY0NTQ3OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDU0OTsxOzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI2NDU1MDs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ1NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ1NTU7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NTY1Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDU3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDU3MzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ1NzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ1Nzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NTgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NTgxOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDU4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDU4NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ1ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ1ODg7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NTk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NTk4OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDYwMDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDYwMTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ2MDQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ2MDc7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NjA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NjA5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDYxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDYxNjs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ2MjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ2MjY7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NjI4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NjI5OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDYzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDYzMzs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ2NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ2NDM7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NjQ5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NjUwOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDY1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDY1NjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ2NTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ2NjA7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NjY1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NjY2OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDY2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDY2OTs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ2Nzg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ2ODE7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NjgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NjgzOzM7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjY0Njg2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0Njg5OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDY5MDszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDY5MzsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ2OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ2OTU7MTE7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjY0NzA2OzEyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ3MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ3MTk7NDswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNjQ3MjM7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ3MjY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NzI3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NzMxOzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjY0NzM1OzIxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ3NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ3NTc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNjQ3NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ3NTk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0NzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0NzYyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDc2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDc2Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ3NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ3NzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0Nzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0Nzc5OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDc4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDc4NDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ3OTI7NTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNjQ3OTc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ4MDA7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0ODAxOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0ODA1OzQ7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjY0ODA5OzI3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ4MzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ4Mzc7MTswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNjQ4Mzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ4Mzk7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0ODQxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0ODQyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDg0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDg0Njs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ4NTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ4NTM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0ODU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0ODU4OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDg2MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDg2Mjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ4Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ4Njk7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0ODczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0ODc0Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDg4MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDg4MjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ4ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ4ODY7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY0ODk0OzU7MDtmYWxzZTtmYWxzZTsxMjc7MTI3OzE1OTs7OwotMjY0ODk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0OTAyOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NDkwMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDkwNDs1OzA7ZmFsc2U7ZmFsc2U7MTI3OzEyNzsxNTk7OzsKLTI2NDkwOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDkxMjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjQ5MTQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ5MTY7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjQ5MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ5MjM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjQ5Mjc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ5Mjg7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0OTQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0OTQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY0OTQ1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY0OTQ4OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NDk2MjszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDk2NTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2NDk3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NDk3MzsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjQ5ODc7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ5OTA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjQ5OTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjQ5OTQ7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1MDA2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MDA3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTAxNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTAxODs3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTAyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTAyNjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUwMzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUwMzc7ODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUwNDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUwNDY7NTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUwNTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUwNTI7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1MDY1OzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MDcwOzM3OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjUxMDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUxMDg7NzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjUxMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUxMTY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1MTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MTI4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1MTI5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MTMwOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTE0MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTE0MjsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTE0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTE0NTsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUxNTc7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUxNjI7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjUxNjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUxNjU7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1MTc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MTc5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1MTgwOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MTg0OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTE5NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTE5NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTE5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTE5ODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUyMTA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUyMTQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUyMjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUyMjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUyMjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUyMjY7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1MjM4OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MjQxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1MjQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MjQzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY1MjQ3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MjQ4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1MjQ5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MjUzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTI2NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTI2NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTI2NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTI2NzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUyNzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUyODM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUyOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUyOTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUyOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUyOTU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1MzA3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MzEwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1MzExOzY7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1MzE3OzY1OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjUzODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUzODM7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUzOTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUzOTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjUzOTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjUzOTU7Mzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1NDMyOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1NDM1OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTQ0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTQ0ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTQ0OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTQ1MDsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU0NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU0NjI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU0NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU0NjQ7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1NDk5OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1NTAyOzY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1NTA4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1NTA5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1NTEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1NTExOzQwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTU1MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTU1MjsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU1NjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU1NjM7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1NTc3OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1NTgxOzc7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1NTg4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1NTkwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1NTkxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1NTkyOzM1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTYyNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTYzMDsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU2NDI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU2NDM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU2NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU2NDU7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU2NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU2NTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU2NTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU2NTc7MzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1NjkwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1NjkzOzQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1Njk3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1Njk4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1Njk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1NzAwOzM4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTczODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTczOTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTc0NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTc0ODsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU3NjI7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU3Njg7NzY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2NTg0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTg0NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2NTg0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTg0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTg1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTg1MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTg1MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTg1MzsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU4NzU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU4Nzg7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjU4ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU4ODE7MTM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1ODk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1ODk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY1ODk2OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY1OTAwOzEzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTkxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTkxNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTkxNjs2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTkyMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTkyMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTkyNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTkyNTs0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTkyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTkzMDsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTkzMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTkzMzsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTkzNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTkzODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTkzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTk0MDs0OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2NTk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTk0NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NTk0Njs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NTk1MDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU5NjM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU5NjQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU5NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU5NjY7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU5NzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU5NzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU5NzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU5NzM7NjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU5Nzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU5ODA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU5ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU5ODM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU5ODU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU5ODg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjU5ODk7NjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU5OTU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjU5OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjU5OTg7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY2MDEzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2MDE0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY2MDE1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2MDE5OzYzOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjYwODI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjYwODQ7MzE7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2NjExNTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjExNzsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjYxMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjYxMzg7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY2MTQ5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2MTUzOzcxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjYyMjQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjYyMjY7NDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjYyMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjYyMzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjYyMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjYyMzM7Mzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY2MjcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2MjcyOzg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY2MjgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2MjgxOzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NjI5NTs1OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjMwMDsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjYzMTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjYzMTk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjYzMjg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjYzMzE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjYzMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjYzMzM7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjYzMzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjYzMzg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjYzMzk7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjYzNDM7NjY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2NjQwOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjQxMTsyNDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjY2NDM1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NDM3OzE4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NjQ1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjQ1Njs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NjQ2NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjQ2ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NjQ2OTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjQ3MzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NjQ3NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjQ3Njs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2NjQ4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjQ4NDsxMzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjY0OTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY0OTg7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjY0OTk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY1MDI7NjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjY1MDg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY1MDk7MjY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY2NTM1OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NTM3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY2NTM4OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NTQwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjU0MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjU0NjsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY1NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY1NDg7NzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NTU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NTU2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjU1OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjU2MDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY1Njk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY1NzA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NTczOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NTc0OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjU3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjU4MDs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY1ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY1ODk7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NTk4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NTk5OzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjYwMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjYwMjszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY2MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY2MDY7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NjEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NjExOzc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjYxODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjYyMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY2MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY2MjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NjI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NjI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjYyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjYzMDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY2Mzk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY2NDA7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjY1MTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY2NTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY2NTY7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NjU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NjYwOzg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjY2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjY2OTs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY2NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY2NzU7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2Njc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2Njc5Ozk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjY4ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjY4OTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY2OTE7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY2OTU7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2Njk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2Njk3OzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjcwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjcwMzszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY3MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY3MDc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NzEwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NzExOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjcxNjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjcxNzs1OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY3MjI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY3MjM7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NzI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NzI2OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjcyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjczMDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY3MzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY3MzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NzM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NzM3OzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Njc0MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Njc0MTszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY3NDQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY3NDU7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NzUwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NzUzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Njc1NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Njc1NTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY3NTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY3NTg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NzYxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NzYyOzk7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Njc3MTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Njc3MjsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY3NzQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY3NzU7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2NzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2NzgyOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Njc4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Njc4Njs4OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY3OTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY3OTU7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2Nzk5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2ODAwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjgwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjgwMzsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY4MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY4MDY7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2ODExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2ODEyOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjgxNDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjgxNTs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY4MTk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY4MjA7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2ODIzOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2ODI2OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjgyNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjgyODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY4MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY4MzM7NDswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2ODM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2ODM4Ozc7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Njg0NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Njg0Njs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY4NTU7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY4NTc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2ODU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2ODYwOzM7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Njg2MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Njg2NDs5OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY4NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY4NzQ7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2ODc2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2ODc3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Njg4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Njg4NDszOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY4ODc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY4ODg7ODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2ODk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2ODk3OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjkwMTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjkwNTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY5MDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY5MDc7MjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2OTA5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2OTEwOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjkxMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjkxMzs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY5MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY5MTg7MTA7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NjkyODszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NjkzMTsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY5MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY5MzM7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNjY5MzY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY5Mzk7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2OTQwOzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2OTQzOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Njk0NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Njk0NTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI2Njk1MjsxMTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2OTYzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2OTY0OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Njk3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Njk3MTsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY5NzM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY5NzQ7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2OTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2OTc4OzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2Njk4MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Njk4Mzs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjY5ODk7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjY5OTI7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY2OTkzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY2OTk0Ozc7MTtmYWxzZTtmYWxzZTsxMjc7MTU5OzE5MTs7OwotMjY3MDAxOzE0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjcwMTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcwMTY7NjswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY3MDIyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3MDIzOzI7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NzAyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzAyNjs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjcwMzA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcwMzE7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY3MDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3MDM3Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NzA0NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzA0ODsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjcwNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcwNTA7NzsxO2ZhbHNlO2ZhbHNlOzEyNzsxNTk7MTkxOzs7Ci0yNjcwNTc7OTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY3MDY2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3MDY3OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NzA3MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzA3NDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjcwNzY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcwNzc7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY3MDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3MDgxOzQ7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2NzA4NTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzA4ODsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjcwOTA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcwOTI7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjcwOTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcwOTc7MTY7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3MTEzOzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY3MTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3MTE3OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzEyOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzEzMDszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2NzEzMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzEzNDsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjcxNDk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcxNTA7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjcxNTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcxNTQ7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3MTY0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3MTY1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3MTY2OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3MTY5OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY3MTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3MTcyOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzE4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzE4NTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzE4NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzE4ODsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjcyMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcyMDE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjcyMDI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcyMDY7Mzg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2NzI0NDsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzI0Njs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2NzI1MjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzI1MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzI1NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzI1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzI2MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2NzI2MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzI2MzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjcyNzU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcyNzY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjcyNzc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjcyNzg7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3MjkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3MjkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3MjkyOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3Mjk2OzQ4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjczNDQ7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjczNDY7MzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3Mzc4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3Mzc5OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzM5MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzM5MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzM5MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzM5MzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc0MDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc0MDY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjc0MTA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc0MTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc0MTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc0MTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc0MTk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjc0MjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc0MjI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3NDM0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3NDM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3NDM2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3NDM3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzQ0ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzQ0OTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzQ1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzQ1MTsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc0NjU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc0NjY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc0Njg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc0Njk7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3NDgwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3NDgxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3NDgyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3NDgzOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzQ5NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzQ5NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzQ5NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzQ5NzsxNTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc1MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc1MTM7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc1MTQ7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc1MTg7NDg7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2NzU2NjsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzU2ODs2NTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjY3NjMzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3NjM1Ozc4OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjc3MTM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc3MTU7MzsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjc3MTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc3MTk7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3NzMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3NzMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3NzMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3NzM0Ozk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3NzQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3NzQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3NzQ1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3NzQ2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2Nzc2MTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Nzc2NTszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2Nzc2ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Nzc2OTsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc3ODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc3ODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc3ODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc3ODM7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3Nzk0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3Nzk1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3Nzk2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3Nzk3OzEwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzgwNzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzgxMTszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc4NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc4NDQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3ODU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3ODU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3ODU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3ODU4OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2Nzg3MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Nzg3MTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2Nzg3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Nzg3MzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc4ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc4ODY7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjc4OTA7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc4OTI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc4OTU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc4OTY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc4OTk7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjc5MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc5MDI7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3OTE0OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3OTE1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3OTE2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3OTE3OzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzkyODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzkyOTsyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2NzkzMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2NzkzMjsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc5NDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc5NDQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjc5NDU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjc5NDY7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3OTU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3OTU4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY3OTU5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY3OTYwOzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2Nzk3NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Nzk3NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2Nzk3Nzs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2Nzk4MTs2OTswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjY4MDUwOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4MDUyOzMyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODA4NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODA4NTsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODA4NjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODA4NzsxMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgwOTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgwOTg7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgxMDA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgxMDE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjgxMDU7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgxMDc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgxMTE7NTI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2ODE2MzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODE2NTsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgxODQ7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgxODc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgxODg7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgxOTE7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjgxOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgxOTY7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgxOTc7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgyMDE7NDY7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2ODI0NzsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODI0OTszMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgyODE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgyODI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgyODM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgyODQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgyOTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgyOTQ7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgyOTU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgyOTY7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4MzExOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4MzEyOzExOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODMyMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODMyNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODMyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODMyNjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgzMzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgzMzk7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjgzNDM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjgzNDU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjgzNDk7NTI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2ODQwMTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODQwMzsxOTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjg0MjI7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg0MjU7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjg0MjY7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg0Mjk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjg0MzA7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg0MzI7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY4NDM1OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4NDM4OzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2ODQzOTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODQ0MDs3OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjg0NDc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg0NDg7MzswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY4NDUxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4NDUyOzU7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2ODQ1NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODQ2MDsxOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjg0NjE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg0NjI7MzswO2ZhbHNlO2ZhbHNlOzEyNzsxMjc7MTU5Ozs7Ci0yNjg0NjU7MzswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg0Njg7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY4NDY5OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4NDczOzE7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2ODQ3NDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODQ3NTs3OzE7ZmFsc2U7ZmFsc2U7MTI3OzE1OTsxOTE7OzsKLTI2ODQ4MjsxODswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY4NTAwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4NTAxOzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2ODUwNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODUwODs0OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjg1MTI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg1MTM7NTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY4NTE4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4NTE5OzY7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2ODUyNTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODUyNjs2OzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjg1MzI7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg1MzY7MTswO2ZhbHNlO2ZhbHNlOzYzOzk1OzE5MTs7OwotMjY4NTM3OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4NTM5Ozg7MDtmYWxzZTtmYWxzZTs2Mzs5NTsxOTE7OzsKLTI2ODU0NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODU1MDsyOzA7ZmFsc2U7ZmFsc2U7NjM7OTU7MTkxOzs7Ci0yNjg1NTI7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg1NTQ7NDsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjg1NTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg1NTk7MTU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4NTc0OzM7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY4NTc3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4NTc4OzE5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODU5NzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODU5ODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODU5OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODYwMjsxNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjg2MTY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg2MTc7MTQ7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4NjMxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4NjMyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4NjMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4NjM0OzE2OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODY1MDsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODY1MTs4OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODY1OTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODY2MjszOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2ODY2NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODY2NjsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjg2Nzg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg2ODM7NzI7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2ODc1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODc1Njs3MDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjY4ODI2OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4ODI3OzM3OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjg4NjQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg4NjU7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNjg4Njc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg4Njg7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4ODg3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4ODg4OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4ODkwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4ODkxOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4ODkyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4ODkzOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4ODk1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4ODk2OzE1OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODkxMTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODkxMjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2ODkxMzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2ODkxNDsxODswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjg5MzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg5MzM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjg5MzU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjg5Mzk7Mjk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4OTY4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4OTY5OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY4OTcxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY4OTcyOzMwOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTAwMjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTAwMzsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTAwNDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTAwODs2OzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2OTAxNDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTAxNTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTAxODsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTAxOTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTAyMjsyNzswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjkwNDk7OTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjkwNTg7NTk7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2OTExNzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTExODsxMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjkxMjk7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjkxMzA7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjkxMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjkxMzI7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5MTY3OzM7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5MTcwOzYyOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjkyMzI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjkyMzM7NjU7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2OTI5ODsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTI5OTszODswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjY5MzM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5MzM4OzI7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjY5MzQwOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5MzQxOzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTM1MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTM1NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTM1NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTM1NjsyMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjkzNzg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjkzNzk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjkzODA7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjkzODE7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjkzODI7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjkzODM7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjkzODU7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjkzODk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjkzOTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjkzOTk7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjk0MDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk0MDI7MzU7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5NDM3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NDM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5NDM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NDQwOzM7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5NDQzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NDQ0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5NDQ1OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NDQ5OzE0OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTQ2MzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTQ2NjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTQ2NzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTQ3MDsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2OTQ3MjsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTQ3MzsxMjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjk0ODU7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk0ODY7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjk0ODg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk0ODk7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjk0OTg7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk0OTk7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjk1MDA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk1MDQ7OTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjk1MTM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk1MTQ7MTE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5NTI1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NTI2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5NTI3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NTI4OzE3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTU0NTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTU0OTs2MjswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjY5NjExOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NjEzOzcwOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjk2ODM7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk2ODU7NDQ7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2OTcyOTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTczMTsyMDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjk3NTE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk3NTI7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNjk3NTQ7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk3NTU7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5NzY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NzY4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5NzY5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NzcwOzk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5Nzc5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NzgwOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjY5NzgxOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5NzgyOzIzOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI2OTgwNTs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTgwOTs2NDswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjY5ODczOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjY5ODc1OzcxOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNjk5NDY7MjswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNjk5NDg7Mjc7MDtmYWxzZTtmYWxzZTs2MzsxMjc7OTU7OzsKLTI2OTk3NTsyOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTk3NzsyOzE7ZmFsc2U7ZmFsc2U7MTI3OzA7ODU7OzsKLTI2OTk3OTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI2OTk4MDsyMTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzAwMDE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzAwMDI7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzAwMDM7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzAwMDQ7MjswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzAwMDY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzAwMDc7MTswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzAwMDg7NTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzAwMTM7MjA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMDMzOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMDM0OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMDM1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMDM2OzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMDM4OzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMDQyOzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMDQzOzQ7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMDQ3Ozg7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMDU1OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMDU2OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMDU3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMDU4OzEyOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MDA3MDs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MDA3NDs5OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MDA4MzsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MDA4NDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MDA4NTsxOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MDA4NjszNDswO2ZhbHNlO2ZhbHNlOzA7MDswOzs7Ci0yNzAxMjA7NDswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzAxMjQ7MjsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNzAxMjY7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzAxMjc7MTI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMTM5OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMTQwOzI7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMTQyOzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMTQzOzQ7MTtmYWxzZTtmYWxzZTsxMjc7MDs4NTs7OwotMjcwMTQ3OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMTQ4OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMTQ5OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMTUwOzU7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMTU1OzQ3OzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MDIwMjs0OzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MDIwNjsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MDIwNzszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MDIxMDsxOzA7ZmFsc2U7ZmFsc2U7MDswOzA7OzsKLTI3MDIxMTszOzA7ZmFsc2U7ZmFsc2U7Ozs7OzsKLTI3MDIxNDs1MzswO2ZhbHNlO2ZhbHNlOzYzOzEyNzs5NTs7OwotMjcwMjY3OzE7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMjY4OzYzOzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNzAzMzE7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzAzMzI7MTk7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwMzUxOzc7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwMzU4OzU5OzA7ZmFsc2U7ZmFsc2U7NjM7MTI3Ozk1Ozs7Ci0yNzA0MTc7MTswO2ZhbHNlO2ZhbHNlOzs7Ozs7Ci0yNzA0MTg7NTsxO2ZhbHNlO2ZhbHNlOzEyNzswOzg1Ozs7Ci0yNzA0MjM7MTA7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwNDMzOzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwNDM1OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwNDM2OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwotMjcwNDM4OzE7MDtmYWxzZTtmYWxzZTswOzA7MDs7OwotMjcwNDM5OzI7MDtmYWxzZTtmYWxzZTs7Ozs7OwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci90ZXh0LnR4dCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdGV4dC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDI5ZWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci90ZXh0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDc5NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b207Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQSBTdHlsZWRUZXh0IGlzIGFuIGVkaXRhYmxlIHVzZXIgaW50ZXJmYWNlIG9iamVjdCB0aGF0IGRpc3BsYXlzIGxpbmVzIAotICogb2YgdGV4dC4gIFRoZSBmb2xsb3dpbmcgc3R5bGUgYXR0cmlidXRlcyBjYW4gYmUgZGVmaW5lZCBmb3IgdGhlIHRleHQ6IAotICogPHVsPgotICogPGxpPmZvcmVncm91bmQgY29sb3IgCi0gKiA8bGk+YmFja2dyb3VuZCBjb2xvcgotICogPGxpPmZvbnQgc3R5bGUgKGJvbGQsIGl0YWxpYywgYm9sZC1pdGFsaWMsIHJlZ3VsYXIpCi0gKiA8bGk+dW5kZXJsaW5lCi0gKiA8bGk+c3RyaWtlb3V0Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBJbiBhZGRpdGlvbiB0byB0ZXh0IHN0eWxlIGF0dHJpYnV0ZXMsIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIGEgbGluZSBtYXkgCi0gKiBiZSBzcGVjaWZpZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpcyB3aWRnZXQgd2hlbiBzcGVjaWZ5aW5nIHRleHQgc3R5bGUgaW5mb3JtYXRpb24uICAKLSAqIFlvdSBtYXkgdXNlIHRoZSBBUEkgdGhhdCBpcyBkZWZpbmVkIGZvciBTdHlsZWRUZXh0IG9yIHlvdSBtYXkgZGVmaW5lIHlvdXIgb3duIAotICogTGluZVN0eWxlTGlzdGVuZXIuICBJZiB5b3UgZGVmaW5lIHlvdXIgb3duIGxpc3RlbmVyLCB5b3Ugd2lsbCBiZSByZXNwb25zaWJsZSAKLSAqIGZvciBtYWludGFpbmluZyB0aGUgdGV4dCBzdHlsZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHdpZGdldC4gIElNUE9SVEFOVDogWW91IG1heSAKLSAqIG5vdCBkZWZpbmUgeW91ciBvd24gbGlzdGVuZXIgYW5kIHVzZSB0aGUgU3R5bGVkVGV4dCBBUEkuICBUaGUgZm9sbG93aW5nCi0gKiBTdHlsZWRUZXh0IEFQSSBpcyBub3Qgc3VwcG9ydGVkIGlmIHlvdSBoYXZlIGRlZmluZWQgYSBMaW5lU3R5bGVMaXN0ZW5lcjoKLSAqIDx1bD4KLSAqIDxsaT5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaW50KQotICogPGxpPmdldFN0eWxlUmFuZ2VzKCkKLSAqIDxsaT5yZXBsYWNlU3R5bGVSYW5nZXMoaW50LGludCxTdHlsZVJhbmdlW10pCi0gKiA8bGk+c2V0U3R5bGVSYW5nZShTdHlsZVJhbmdlKQotICogPGxpPnNldFN0eWxlUmFuZ2VzKFN0eWxlUmFuZ2VbXSkKLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpcyB3aWRnZXQgd2hlbiBzcGVjaWZ5aW5nIGxpbmUgYmFja2dyb3VuZCBjb2xvcnMuCi0gKiBZb3UgbWF5IHVzZSB0aGUgQVBJIHRoYXQgaXMgZGVmaW5lZCBmb3IgU3R5bGVkVGV4dCBvciB5b3UgbWF5IGRlZmluZSB5b3VyIG93biAKLSAqIExpbmVCYWNrZ3JvdW5kTGlzdGVuZXIuICBJZiB5b3UgZGVmaW5lIHlvdXIgb3duIGxpc3RlbmVyLCB5b3Ugd2lsbCBiZSByZXNwb25zaWJsZSAKLSAqIGZvciBtYWludGFpbmluZyB0aGUgbGluZSBiYWNrZ3JvdW5kIGNvbG9yIGluZm9ybWF0aW9uIGZvciB0aGUgd2lkZ2V0LiAgCi0gKiBJTVBPUlRBTlQ6IFlvdSBtYXkgbm90IGRlZmluZSB5b3VyIG93biBsaXN0ZW5lciBhbmQgdXNlIHRoZSBTdHlsZWRUZXh0IEFQSS4gIAotICogVGhlIGZvbGxvd2luZyBTdHlsZWRUZXh0IEFQSSBpcyBub3Qgc3VwcG9ydGVkIGlmIHlvdSBoYXZlIGRlZmluZWQgYSAKLSAqIExpbmVCYWNrZ3JvdW5kTGlzdGVuZXI6Ci0gKiA8dWw+Ci0gKiA8bGk+Z2V0TGluZUJhY2tncm91bmQoaW50KQotICogPGxpPnNldExpbmVCYWNrZ3JvdW5kKGludCxpbnQsQ29sb3IpCi0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgY29udGVudCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyB3aWRnZXQgbWF5IGFsc28gYmUgdXNlci1kZWZpbmVkLiAgVG8gZG8gc28sCi0gKiB5b3UgbXVzdCBpbXBsZW1lbnQgdGhlIFN0eWxlZFRleHRDb250ZW50IGludGVyZmFjZSBhbmQgdXNlIHRoZSBTdHlsZWRUZXh0IEFQSQotICogc2V0Q29udGVudChTdHlsZWRUZXh0Q29udGVudCkgdG8gaW5pdGlhbGl6ZSB0aGUgd2lkZ2V0LiAKLSAqIDwvcD4KLSAqIDxwPgotICogSU1QT1JUQU5UOiBUaGlzIGNsYXNzIGlzIDxlbT5ub3Q8L2VtPiBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICogPGRsPgotICogPGR0PjxiPlN0eWxlczo8L2I+PGRkPkZVTExfU0VMRUNUSU9OLCBNVUxUSSwgUkVBRF9PTkxZLCBTSU5HTEUsIFdSQVAKLSAqIDxkdD48Yj5FdmVudHM6PC9iPjxkZD5FeHRlbmRlZE1vZGlmeSwgTGluZUdldEJhY2tncm91bmQsIExpbmVHZXRTZWdtZW50cywgTGluZUdldFN0eWxlLCBNb2RpZnksIFNlbGVjdGlvbiwgVmVyaWZ5LCBWZXJpZnlLZXkKLSAqIDwvZGw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZWRUZXh0IGV4dGVuZHMgQ2FudmFzIHsKLQlzdGF0aWMgZmluYWwgY2hhciBUQUIgPSAnXHQnOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUGxhdGZvcm1MaW5lRGVsaW1pdGVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCXN0YXRpYyBmaW5hbCBpbnQgQklESV9DQVJFVF9XSURUSCA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRICT0gNjQ7Ci0Jc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVCA9IDY0OwotCXN0YXRpYyBmaW5hbCBpbnQgVl9TQ1JPTExfUkFURSA9IDUwOwotCXN0YXRpYyBmaW5hbCBpbnQgSF9TQ1JPTExfUkFURSA9IDEwOwotCQotCXN0YXRpYyBmaW5hbCBpbnQgRXh0ZW5kZWRNb2RpZnkgPSAzMDAwOwotCXN0YXRpYyBmaW5hbCBpbnQgTGluZUdldEJhY2tncm91bmQgPSAzMDAxOwotCXN0YXRpYyBmaW5hbCBpbnQgTGluZUdldFN0eWxlID0gMzAwMjsKLQlzdGF0aWMgZmluYWwgaW50IFRleHRDaGFuZ2luZyA9IDMwMDM7Ci0Jc3RhdGljIGZpbmFsIGludCBUZXh0U2V0ID0gMzAwNDsKLQlzdGF0aWMgZmluYWwgaW50IFZlcmlmeUtleSA9IDMwMDU7Ci0Jc3RhdGljIGZpbmFsIGludCBUZXh0Q2hhbmdlZCA9IDMwMDY7Ci0Jc3RhdGljIGZpbmFsIGludCBMaW5lR2V0U2VnbWVudHMgPSAzMDA3OwotCQotCUNvbG9yIHNlbGVjdGlvbkJhY2tncm91bmQ7CS8vIHNlbGVjdGlvbiBiYWNrZ3JvdW5kIGNvbG9yCi0JQ29sb3Igc2VsZWN0aW9uRm9yZWdyb3VuZDsJLy8gc2VsZWN0aW9uIGZvcmVncm91bmQgY29sb3IKLQlTdHlsZWRUZXh0Q29udGVudCBsb2dpY2FsQ29udGVudDsJLy8gbmF0aXZlIGNvbnRlbnQgKGRlZmF1bHQgb3IgdXNlciBzcGVjaWZpZWQpCi0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudDsJCQkvLyBsaW5lIHdyYXBwaW5nIGNvbnRlbnQsIHNhbWUgYXMgbG9naWNhbENvbnRlbnQgaWYgd29yZCB3cmFwIGlzIG9mZgotCURpc3BsYXlSZW5kZXJlciByZW5kZXJlcjsKLQlMaXN0ZW5lciBsaXN0ZW5lcjsKLQlUZXh0Q2hhbmdlTGlzdGVuZXIgdGV4dENoYW5nZUxpc3RlbmVyOwkvLyBsaXN0ZW5lciBmb3IgVGV4dENoYW5naW5nLCBUZXh0Q2hhbmdlZCBhbmQgVGV4dFNldCBldmVudHMgZnJvbSBTdHlsZWRUZXh0Q29udGVudAotCURlZmF1bHRMaW5lU3R5bGVyIGRlZmF1bHRMaW5lU3R5bGVyOy8vIHVzZWQgZm9yIHNldFN0eWxlcyBBUEkgd2hlbiBubyBMaW5lU3R5bGVMaXN0ZW5lciBpcyByZWdpc3RlcmVkCi0JTGluZUNhY2hlIGxpbmVDYWNoZTsKLQlib29sZWFuIHVzZXJMaW5lU3R5bGUgPSBmYWxzZTsJCS8vIHRydWU9d2lkZ2V0IGlzIHVzaW5nIGEgdXNlciBkZWZpbmVkIGxpbmUgc3R5bGUgbGlzdGVuZXIgZm9yIGxpbmUgc3R5bGVzLiBmYWxzZT13aWRnZXQgaXMgdXNpbmcgdGhlIGRlZmF1bHQgbGluZSBzdHlsZXIgdG8gc3RvcmUgbGluZSBzdHlsZXMKLQlib29sZWFuIHVzZXJMaW5lQmFja2dyb3VuZCA9IGZhbHNlOwkvLyB0cnVlPXdpZGdldCBpcyB1c2luZyBhIHVzZXIgZGVmaW5lZCBsaW5lIGJhY2tncm91bmQgbGlzdGVuZXIgZm9yIGxpbmUgYmFja2dyb3VuZHMuIGZhbHNlPXdpZGdldCBpcyB1c2luZyB0aGUgZGVmYXVsdCBsaW5lIHN0eWxlciB0byBzdG9yZSBsaW5lIGJhY2tncm91bmRzCi0JaW50IHZlcnRpY2FsU2Nyb2xsT2Zmc2V0ID0gMDsJCS8vIHBpeGVsIGJhc2VkCi0JaW50IGhvcml6b250YWxTY3JvbGxPZmZzZXQgPSAwOwkJLy8gcGl4ZWwgYmFzZWQKLQlpbnQgdG9wSW5kZXggPSAwOwkJCQkJLy8gdG9wIHZpc2libGUgbGluZQotCWludCBsYXN0UGFpbnRUb3BJbmRleCA9IC0xOwotCWludCB0b3BPZmZzZXQgPSAwOwkJCQkJLy8gb2Zmc2V0IG9mIGZpcnN0IGNoYXJhY3RlciBpbiB0b3AgbGluZQotCWludCBjbGllbnRBcmVhSGVpZ2h0ID0gMDsJCQkvLyB0aGUgY2xpZW50IGFyZWEgaGVpZ2h0LiBOZWVkZWQgdG8gY2FsY3VsYXRlIGNvbnRlbnQgd2lkdGggZm9yIG5ldyAKLQkJCQkJCQkJCQkvLyB2aXNpYmxlIGxpbmVzIGR1cmluZyBSZXNpemUgY2FsbGJhY2sKLQlpbnQgY2xpZW50QXJlYVdpZHRoID0gMDsJCQkvLyB0aGUgY2xpZW50IGFyZWEgd2lkdGguIE5lZWRlZCBkdXJpbmcgUmVzaXplIGNhbGxiYWNrIHRvIGRldGVybWluZSAKLQkJCQkJCQkJCQkvLyBpZiBsaW5lIHdyYXAgbmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkCi0JaW50IGxpbmVIZWlnaHQ7CQkJCQkJLy8gbGluZSBoZWlnaHQ9Zm9udCBoZWlnaHQKLQlpbnQgdGFiTGVuZ3RoID0gNDsJCQkJCS8vIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgdGFiCi0JaW50IGxlZnRNYXJnaW47Ci0JaW50IHRvcE1hcmdpbjsKLQlpbnQgcmlnaHRNYXJnaW47Ci0JaW50IGJvdHRvbU1hcmdpbjsKLQlDdXJzb3IgaWJlYW1DdXJzb3I7CQkKLQlpbnQgY29sdW1uWDsJCQkJCQkJLy8ga2VlcCB0cmFjayBvZiB0aGUgaG9yaXpvbnRhbCBjYXJldCBwb3NpdGlvbgotCQkJCQkJCQkJCS8vIHdoZW4gY2hhbmdpbmcgbGluZXMvcGFnZXMuIEZpeGVzIGJ1ZyA1OTM1Ci0JaW50IGNhcmV0T2Zmc2V0ID0gMDsKLQlQb2ludCBzZWxlY3Rpb24gPSBuZXcgUG9pbnQoMCwgMCk7CS8vIHggYW5kIHkgYXJlIHN0YXJ0IGFuZCBlbmQgY2FyZXQgb2Zmc2V0cyBvZiBzZWxlY3Rpb24KLQlQb2ludCBjbGlwYm9hcmRTZWxlY3Rpb247ICAgICAgICAgICAvLyB4IGFuZCB5IGFyZSBzdGFydCBhbmQgZW5kIGNhcmV0IG9mZnNldHMgb2YgcHJldmlvdXMgc2VsZWN0aW9uCi0JaW50IHNlbGVjdGlvbkFuY2hvcjsJCQkJLy8gcG9zaXRpb24gb2Ygc2VsZWN0aW9uIGFuY2hvci4gMCBiYXNlZCBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgdGV4dAotCVBvaW50IGRvdWJsZUNsaWNrU2VsZWN0aW9uOwkJCS8vIHNlbGVjdGlvbiBhZnRlciBsYXN0IG1vdXNlIGRvdWJsZSBjbGljawotCWJvb2xlYW4gZWRpdGFibGUgPSB0cnVlOwotCWJvb2xlYW4gd29yZFdyYXAgPSBmYWxzZTsKLQlib29sZWFuIGRvdWJsZUNsaWNrRW5hYmxlZCA9IHRydWU7CS8vIHNlZSBnZXREb3VibGVDbGlja0VuYWJsZWQgCi0JYm9vbGVhbiBvdmVyd3JpdGUgPSBmYWxzZTsJCQkvLyBpbnNlcnQvb3ZlcndyaXRlIGVkaXQgbW9kZQotCWludCB0ZXh0TGltaXQgPSAtMTsJCQkJCS8vIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhlIHVzZXIgY2FuIHR5cGUgaW4gdGhlIHdpZGdldC4gVW5saW1pdGVkIGJ5IGRlZmF1bHQuCi0JSGFzaHRhYmxlIGtleUFjdGlvbk1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQlDb2xvciBiYWNrZ3JvdW5kID0gbnVsbDsJCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgNDc5MQotCUNvbG9yIGZvcmVncm91bmQgPSBudWxsOwkJCS8vCi0JQ2xpcGJvYXJkIGNsaXBib2FyZDsKLQlib29sZWFuIG1vdXNlRG93biA9IGZhbHNlOwotCWJvb2xlYW4gbW91c2VEb3VibGVDbGljayA9IGZhbHNlOwkvLyB0cnVlPWEgZG91YmxlIGNsaWNrIG9jdXJyZWQuIERvbid0IGRvIG1vdXNlIHN3aXBlIHNlbGVjdGlvbi4KLQlpbnQgYXV0b1Njcm9sbERpcmVjdGlvbiA9IFNXVC5OVUxMOwkvLyB0aGUgZGlyZWN0aW9uIG9mIGF1dG9zY3JvbGxpbmcgKHVwLCBkb3duLCByaWdodCwgbGVmdCkKLQlpbnQgYXV0b1Njcm9sbERpc3RhbmNlID0gMDsKLQlpbnQgbGFzdFRleHRDaGFuZ2VTdGFydDsJCQkvLyBjYWNoZSBkYXRhIG9mIHRoZSAKLQlpbnQgbGFzdFRleHRDaGFuZ2VOZXdMaW5lQ291bnQ7CQkvLyBsYXN0IHRleHQgY2hhbmdpbmcgCi0JaW50IGxhc3RUZXh0Q2hhbmdlTmV3Q2hhckNvdW50OwkJLy8gZXZlbnQgZm9yIHVzZSBpbiB0aGUgCi0JaW50IGxhc3RUZXh0Q2hhbmdlUmVwbGFjZUxpbmVDb3VudDsJLy8gdGV4dCBjaGFuZ2VkIGhhbmRsZXIKLQlpbnQgbGFzdFRleHRDaGFuZ2VSZXBsYWNlQ2hhckNvdW50OwkKLQlib29sZWFuIGlzTWlycm9yZWQ7Ci0JYm9vbGVhbiBiaWRpQ29sb3JpbmcgPSBmYWxzZTsJCS8vIGFwcGx5IHRoZSBCSURJIGFsZ29yaXRobSBvbiB0ZXh0IHNlZ21lbnRzIG9mIHRoZSBzYW1lIGNvbG9yCi0JSW1hZ2UgbGVmdENhcmV0Qml0bWFwID0gbnVsbDsKLQlJbWFnZSByaWdodENhcmV0Qml0bWFwID0gbnVsbDsKLQlpbnQgY2FyZXREaXJlY3Rpb24gPSBTV1QuTlVMTDsKLQlib29sZWFuIGFkdmFuY2luZyA9IHRydWU7Ci0JQ2FyZXQgZGVmYXVsdENhcmV0ID0gbnVsbDsKLQlib29sZWFuIHVwZGF0ZUNhcmV0RGlyZWN0aW9uID0gdHJ1ZTsKLQotCWZpbmFsIHN0YXRpYyBib29sZWFuIElTX0NBUkJPTiwgSVNfR1RLLCBJU19NT1RJRjsKLQlmaW5hbCBzdGF0aWMgYm9vbGVhbiBET1VCTEVfQlVGRkVSOwotCXN0YXRpYyB7Ci0JCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCQlJU19DQVJCT04gPSAiY2FyYm9uIi5lcXVhbHMocGxhdGZvcm0pOwotCQlJU19HVEsgPSAiZ3RrIi5lcXVhbHMocGxhdGZvcm0pOwotCQlJU19NT1RJRiA9ICJtb3RpZiIuZXF1YWxzKHBsYXRmb3JtKTsKLQkJRE9VQkxFX0JVRkZFUiA9ICFJU19DQVJCT047Ci0JfQotCi0JLyoqCi0JICogVGhlIFByaW50aW5nIGNsYXNzIGltcGxlbWVudHMgcHJpbnRpbmcgb2YgYSByYW5nZSBvZiB0ZXh0LgotCSAqIEFuIGluc3RhbmNlIG9mIDxjbGFzcz5QcmludGluZyA8L2NsYXNzPiBpcyByZXR1cm5lZCBpbiB0aGUgCi0JICogU3R5bGVkVGV4dCNwcmludChQcmludGVyKSBBUEkuIFRoZSBydW4oKSBtZXRob2QgbWF5IGJlIAotCSAqIGludm9rZWQgZnJvbSBhbnkgdGhyZWFkLgotCSAqLwotCXN0YXRpYyBjbGFzcyBQcmludGluZyBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgc3RhdGljIGludCBMRUZUID0gMDsJCQkJCQkvLyBsZWZ0IGFsaWduZWQgaGVhZGVyL2Zvb3RlciBzZWdtZW50Ci0JCWZpbmFsIHN0YXRpYyBpbnQgQ0VOVEVSID0gMTsJCQkJCS8vIGNlbnRlcmVkIGhlYWRlci9mb290ZXIgc2VnbWVudAotCQlmaW5hbCBzdGF0aWMgaW50IFJJR0hUID0gMjsJCQkJCQkvLyByaWdodCBhbGlnbmVkIGhlYWRlci9mb290ZXIgc2VnbWVudAotCi0JCVN0eWxlZFRleHQgcGFyZW50OwotCQlQcmludGVyIHByaW50ZXI7Ci0JCVByaW50UmVuZGVyZXIgcmVuZGVyZXI7Ci0JCVN0eWxlZFRleHRQcmludE9wdGlvbnMgcHJpbnRPcHRpb25zOwotCQlTdHlsZWRUZXh0Q29udGVudCBwcmludGVyQ29udGVudDsJCQkJLy8gY29weSBvZiB0aGUgd2lkZ2V0IGNvbnRlbnQKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWE7CQkJCQkJCS8vIGNsaWVudCBhcmVhIHRvIHByaW50IG9uCi0JCUZvbnQgcHJpbnRlckZvbnQ7Ci0JCUZvbnREYXRhIGRpc3BsYXlGb250RGF0YTsKLQkJSGFzaHRhYmxlIHByaW50ZXJDb2xvcnM7CQkJCQkJLy8gcHJpbnRlciBjb2xvciBjYWNoZSBmb3IgbGluZSBiYWNrZ3JvdW5kcyBhbmQgc3R5bGUKLQkJSGFzaHRhYmxlIGxpbmVCYWNrZ3JvdW5kcyA9IG5ldyBIYXNodGFibGUoKTsJLy8gY2FjaGVkIGxpbmUgYmFja2dyb3VuZHMKLQkJSGFzaHRhYmxlIGxpbmVTdHlsZXMgPSBuZXcgSGFzaHRhYmxlKCk7CQkJLy8gY2FjaGVkIGxpbmUgc3R5bGVzCi0JCUhhc2h0YWJsZSBiaWRpU2VnbWVudHMgPSBuZXcgSGFzaHRhYmxlKCk7CQkvLyBjYWNoZWQgYmlkaSBzZWdtZW50cyB3aGVuIHJ1bm5pbmcgb24gYSBiaWRpIHBsYXRmb3JtCi0JCUdDIGdjOwkJCQkJCQkJCQkJLy8gcHJpbnRlciBHQwotCQlpbnQgcGFnZVdpZHRoOwkJCQkJCQkJCS8vIHdpZHRoIG9mIGEgcHJpbnRlciBwYWdlIGluIHBpeGVscwotCQlpbnQgc3RhcnRQYWdlOwkJCQkJCQkJCS8vIGZpcnN0IHBhZ2UgdG8gcHJpbnQKLQkJaW50IGVuZFBhZ2U7CQkJCQkJCQkJLy8gbGFzdCBwYWdlIHRvIHByaW50Ci0JCWludCBwYWdlU2l6ZTsJCQkJCQkJCQkvLyBudW1iZXIgb2YgbGluZXMgb24gYSBwYWdlCi0JCWludCBzdGFydExpbmU7CQkJCQkJCQkJLy8gZmlyc3QgKHdyYXBwZWQpIGxpbmUgdG8gcHJpbnQKLQkJaW50IGVuZExpbmU7CQkJCQkJCQkJLy8gbGFzdCAod3JhcHBlZCkgbGluZSB0byBwcmludAotCQlib29sZWFuIHNpbmdsZUxpbmU7CQkJCQkJCQkvLyB3aWRnZXQgc2luZ2xlIGxpbmUgbW9kZQotCQlQb2ludCBzZWxlY3Rpb24gPSBudWxsOwkJCQkJLy8gc2VsZWN0ZWQgdGV4dAotCQlib29sZWFuIG1pcnJvcmVkOwkJCQkJCS8vaW5kaWNhdGVzIHRoZSBwcmludGluZyBnYyBzaG91bGQgYmUgbWlycm9yZWQKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgPGNsYXNzPlByaW50aW5nPC9jbGFzcz4uCi0JICogQ29waWVzIHRoZSB3aWRnZXQgY29udGVudCBhbmQgcmVuZGVyaW5nIGRhdGEgdGhhdCBuZWVkcyAKLQkgKiB0byBiZSByZXF1ZXN0ZWQgZnJvbSBsaXN0ZW5lcnMuCi0JICogPC9wPgotCSAqIEBwYXJhbSBwYXJlbnQgU3R5bGVkVGV4dCB3aWRnZXQgdG8gcHJpbnQuCi0JICogQHBhcmFtIHByaW50ZXIgcHJpbnRlciBkZXZpY2UgdG8gcHJpbnQgb24uCi0JICogQHBhcmFtIHByaW50T3B0aW9ucyBwcmludCBvcHRpb25zCi0JICovCQkKLQlQcmludGluZyhTdHlsZWRUZXh0IHBhcmVudCwgUHJpbnRlciBwcmludGVyLCBTdHlsZWRUZXh0UHJpbnRPcHRpb25zIHByaW50T3B0aW9ucykgewotCQlQcmludGVyRGF0YSBkYXRhID0gcHJpbnRlci5nZXRQcmludGVyRGF0YSgpOwotCi0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnByaW50ZXIgPSBwcmludGVyOwotCQl0aGlzLnByaW50T3B0aW9ucyA9IHByaW50T3B0aW9uczsKLQkJdGhpcy5taXJyb3JlZCA9IChwYXJlbnQuZ2V0U3R5bGUoKSAmIFNXVC5NSVJST1JFRCkgIT0gMDsKLQkJc2luZ2xlTGluZSA9IHBhcmVudC5pc1NpbmdsZUxpbmUoKTsKLQkJc3RhcnRQYWdlID0gMTsKLQkJZW5kUGFnZSA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQlpZiAoZGF0YS5zY29wZSA9PSBQcmludGVyRGF0YS5QQUdFX1JBTkdFKSB7Ci0JCQlzdGFydFBhZ2UgPSBkYXRhLnN0YXJ0UGFnZTsKLQkJCWVuZFBhZ2UgPSBkYXRhLmVuZFBhZ2U7Ci0JCQlpZiAoZW5kUGFnZSA8IHN0YXJ0UGFnZSkgewotCQkJCWludCB0ZW1wID0gZW5kUGFnZTsKLQkJCQllbmRQYWdlID0gc3RhcnRQYWdlOwotCQkJCXN0YXJ0UGFnZSA9IHRlbXA7Ci0JCQl9CQkJCi0JCX0gCi0JCWVsc2UgCi0JCWlmIChkYXRhLnNjb3BlID09IFByaW50ZXJEYXRhLlNFTEVDVElPTikgewotCQkJc2VsZWN0aW9uID0gcGFyZW50LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JCX0KLQotCQlkaXNwbGF5Rm9udERhdGEgPSBwYXJlbnQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JCWNvcHlDb250ZW50KHBhcmVudC5nZXRDb250ZW50KCkpOwotCQljYWNoZUxpbmVEYXRhKHByaW50ZXJDb250ZW50KTsKLQl9Ci0JLyoqCi0JICogQ2FjaGVzIHRoZSBiaWRpIHNlZ21lbnRzIG9mIHRoZSBnaXZlbiBsaW5lLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gbGluZU9mZnNldCBvZmZzZXQgb2YgdGhlIGxpbmUgdG8gY2FjaGUgYmlkaSBzZWdtZW50cyBmb3IuIAotCSAqIAlSZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50LgotCSAqIEBwYXJhbSBsaW5lIGxpbmUgdG8gY2FjaGUgYmlkaSBzZWdtZW50cyBmb3IuIAotCSAqLwotCXZvaWQgY2FjaGVCaWRpU2VnbWVudHMoaW50IGxpbmVPZmZzZXQsIFN0cmluZyBsaW5lKSB7Ci0JCWludFtdIHNlZ21lbnRzID0gcGFyZW50LmdldEJpZGlTZWdtZW50cyhsaW5lT2Zmc2V0LCBsaW5lKTsKLQkJCi0JCWlmIChzZWdtZW50cyAhPSBudWxsKSB7Ci0JCQliaWRpU2VnbWVudHMucHV0KG5ldyBJbnRlZ2VyKGxpbmVPZmZzZXQpLCBzZWdtZW50cyk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ2FjaGVzIHRoZSBsaW5lIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGdpdmVuIGxpbmUuCi0JICogPC9wPgotCSAqIEBwYXJhbSBsaW5lT2Zmc2V0IG9mZnNldCBvZiB0aGUgbGluZSB0byBjYWNoZSB0aGUgYmFja2dyb3VuZCAKLQkgKiAJY29sb3IgZm9yLiBSZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50LgotCSAqIEBwYXJhbSBsaW5lIGxpbmUgdG8gY2FjaGUgdGhlIGJhY2tncm91bmQgY29sb3IgZm9yCi0JICovCi0Jdm9pZCBjYWNoZUxpbmVCYWNrZ3JvdW5kKGludCBsaW5lT2Zmc2V0LCBTdHJpbmcgbGluZSkgewotCQlTdHlsZWRUZXh0RXZlbnQgZXZlbnQgPSBwYXJlbnQuZ2V0TGluZUJhY2tncm91bmREYXRhKGxpbmVPZmZzZXQsIGxpbmUpOwotCQkKLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCWxpbmVCYWNrZ3JvdW5kcy5wdXQobmV3IEludGVnZXIobGluZU9mZnNldCksIGV2ZW50KTsKLQkJfQotCX0KLQkvKioKLQkgKiBDYWNoZXMgYWxsIGxpbmUgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHJlcXVlc3RlZCBmcm9tIGEgbGlzdGVuZXIuCi0JICogPC9wPgotCSAqIEBwYXJhbSBwcmludGVyQ29udGVudCA8Y2xhc3M+U3R5bGVkVGV4dENvbnRlbnQ8L2NsYXNzPiB0byByZXF1ZXN0IAotCSAqIAlsaW5lIGRhdGEgZm9yLgotCSAqLwotCXZvaWQgY2FjaGVMaW5lRGF0YShTdHlsZWRUZXh0Q29udGVudCBwcmludGVyQ29udGVudCkgewkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmludGVyQ29udGVudC5nZXRMaW5lQ291bnQoKTsgaSsrKSB7Ci0JCQlpbnQgbGluZU9mZnNldCA9IHByaW50ZXJDb250ZW50LmdldE9mZnNldEF0TGluZShpKTsKLQkJCVN0cmluZyBsaW5lID0gcHJpbnRlckNvbnRlbnQuZ2V0TGluZShpKTsKLQkKLQkJCWlmIChwcmludE9wdGlvbnMucHJpbnRMaW5lQmFja2dyb3VuZCkgewotCQkJCWNhY2hlTGluZUJhY2tncm91bmQobGluZU9mZnNldCwgbGluZSk7Ci0JCQl9Ci0JCQlpZiAocHJpbnRPcHRpb25zLnByaW50VGV4dEJhY2tncm91bmQgfHwKLQkJCQlwcmludE9wdGlvbnMucHJpbnRUZXh0Rm9yZWdyb3VuZCB8fAotCQkJCXByaW50T3B0aW9ucy5wcmludFRleHRGb250U3R5bGUpIHsKLQkJCQljYWNoZUxpbmVTdHlsZShsaW5lT2Zmc2V0LCBsaW5lKTsKLQkJCX0KLQkJCWlmIChwYXJlbnQuaXNCaWRpKCkpIHsKLQkJCQljYWNoZUJpZGlTZWdtZW50cyhsaW5lT2Zmc2V0LCBsaW5lKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBDYWNoZXMgYWxsIGxpbmUgc3R5bGVzIG9mIHRoZSBnaXZlbiBsaW5lLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gbGluZU9mZnNldCBvZmZzZXQgb2YgdGhlIGxpbmUgdG8gY2FjaGUgdGhlIHN0eWxlcyBmb3IuCi0JICogCVJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQuCi0JICogQHBhcmFtIGxpbmUgbGluZSB0byBjYWNoZSB0aGUgc3R5bGVzIGZvci4KLQkgKi8KLQl2b2lkIGNhY2hlTGluZVN0eWxlKGludCBsaW5lT2Zmc2V0LCBTdHJpbmcgbGluZSkgewotCQlTdHlsZWRUZXh0RXZlbnQgZXZlbnQgPSBwYXJlbnQuZ2V0TGluZVN0eWxlRGF0YShsaW5lT2Zmc2V0LCBsaW5lKTsKLQkJCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHlsZVJhbmdlW10gc3R5bGVzID0gZXZlbnQuc3R5bGVzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlQ29weSA9IG51bGw7Ci0JCQkJaWYgKCFwcmludE9wdGlvbnMucHJpbnRUZXh0QmFja2dyb3VuZCAmJiBzdHlsZXNbaV0uYmFja2dyb3VuZCAhPSBudWxsKSB7Ci0JCQkJCXN0eWxlQ29weSA9IChTdHlsZVJhbmdlKSBzdHlsZXNbaV0uY2xvbmUoKTsKLQkJCQkJc3R5bGVDb3B5LmJhY2tncm91bmQgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAoIXByaW50T3B0aW9ucy5wcmludFRleHRGb3JlZ3JvdW5kICYmIHN0eWxlc1tpXS5mb3JlZ3JvdW5kICE9IG51bGwpIHsKLQkJCQkJaWYgKHN0eWxlQ29weSA9PSBudWxsKSB7Ci0JCQkJCQlzdHlsZUNvcHkgPSAoU3R5bGVSYW5nZSkgc3R5bGVzW2ldLmNsb25lKCk7Ci0JCQkJCX0KLQkJCQkJc3R5bGVDb3B5LmZvcmVncm91bmQgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAoIXByaW50T3B0aW9ucy5wcmludFRleHRGb250U3R5bGUgJiYgc3R5bGVzW2ldLmZvbnRTdHlsZSAhPSBTV1QuTk9STUFMKSB7Ci0JCQkJCWlmIChzdHlsZUNvcHkgPT0gbnVsbCkgewotCQkJCQkJc3R5bGVDb3B5ID0gKFN0eWxlUmFuZ2UpIHN0eWxlc1tpXS5jbG9uZSgpOwotCQkJCQl9Ci0JCQkJCXN0eWxlQ29weS5mb250U3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVDb3B5ICE9IG51bGwpIHsKLQkJCQkJc3R5bGVzW2ldID0gc3R5bGVDb3B5OwotCQkJCX0KLQkJCX0JCi0JCQlsaW5lU3R5bGVzLnB1dChuZXcgSW50ZWdlcihsaW5lT2Zmc2V0KSwgZXZlbnQpOwotCQl9Ci0JfQotCS8qKgotCSAqIENvcGllcyB0aGUgdGV4dCBvZiB0aGUgc3BlY2lmaWVkIDxjbGFzcz5TdHlsZWRUZXh0Q29udGVudDwvY2xhc3M+LgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gb3JpZ2luYWwgdGhlIDxjbGFzcz5TdHlsZWRUZXh0Q29udGVudDwvY2xhc3M+IHRvIGNvcHkuCi0JICovCi0Jdm9pZCBjb3B5Q29udGVudChTdHlsZWRUZXh0Q29udGVudCBvcmlnaW5hbCkgewotCQlpbnQgaW5zZXJ0T2Zmc2V0ID0gMDsKLQkJCi0JCXByaW50ZXJDb250ZW50ID0gbmV3IERlZmF1bHRDb250ZW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3JpZ2luYWwuZ2V0TGluZUNvdW50KCk7IGkrKykgewotCQkJaW50IGluc2VydEVuZE9mZnNldDsKLQkJCWlmIChpIDwgb3JpZ2luYWwuZ2V0TGluZUNvdW50KCkgLSAxKSB7Ci0JCQkJaW5zZXJ0RW5kT2Zmc2V0ID0gb3JpZ2luYWwuZ2V0T2Zmc2V0QXRMaW5lKGkgKyAxKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWluc2VydEVuZE9mZnNldCA9IG9yaWdpbmFsLmdldENoYXJDb3VudCgpOwotCQkJfQotCQkJcHJpbnRlckNvbnRlbnQucmVwbGFjZVRleHRSYW5nZShpbnNlcnRPZmZzZXQsIDAsIG9yaWdpbmFsLmdldFRleHRSYW5nZShpbnNlcnRPZmZzZXQsIGluc2VydEVuZE9mZnNldCAtIGluc2VydE9mZnNldCkpOwotCQkJaW5zZXJ0T2Zmc2V0ID0gaW5zZXJ0RW5kT2Zmc2V0OwotCQl9Ci0JfQotCS8qKgotCSAqIFJlcGxhY2VzIGFsbCBkaXNwbGF5IGNvbG9ycyBpbiB0aGUgY2FjaGVkIGxpbmUgYmFja2dyb3VuZHMgYW5kIAotCSAqIGxpbmUgc3R5bGVzIHdpdGggcHJpbnRlciBjb2xvcnMuCi0JICovCi0Jdm9pZCBjcmVhdGVQcmludGVyQ29sb3JzKCkgewotCQlFbnVtZXJhdGlvbiB2YWx1ZXMgPSBsaW5lQmFja2dyb3VuZHMuZWxlbWVudHMoKTsKLQkJcHJpbnRlckNvbG9ycyA9IG5ldyBIYXNodGFibGUoKTsKLQkJd2hpbGUgKHZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3R5bGVkVGV4dEV2ZW50IGV2ZW50ID0gKFN0eWxlZFRleHRFdmVudCkgdmFsdWVzLm5leHRFbGVtZW50KCk7Ci0JCQlldmVudC5saW5lQmFja2dyb3VuZCA9IGdldFByaW50ZXJDb2xvcihldmVudC5saW5lQmFja2dyb3VuZCk7Ci0JCX0KLQkJCi0JCXZhbHVlcyA9IGxpbmVTdHlsZXMuZWxlbWVudHMoKTsKLQkJd2hpbGUgKHZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3R5bGVkVGV4dEV2ZW50IGV2ZW50ID0gKFN0eWxlZFRleHRFdmVudCkgdmFsdWVzLm5leHRFbGVtZW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50LnN0eWxlcy5sZW5ndGg7IGkrKykgewotCQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBldmVudC5zdHlsZXNbaV07Ci0JCQkJQ29sb3IgcHJpbnRlckJhY2tncm91bmQgPSBnZXRQcmludGVyQ29sb3Ioc3R5bGUuYmFja2dyb3VuZCk7Ci0JCQkJQ29sb3IgcHJpbnRlckZvcmVncm91bmQgPSBnZXRQcmludGVyQ29sb3Ioc3R5bGUuZm9yZWdyb3VuZCk7Ci0JCQkJCi0JCQkJaWYgKHByaW50ZXJCYWNrZ3JvdW5kICE9IHN0eWxlLmJhY2tncm91bmQgfHwgCi0JCQkJCXByaW50ZXJGb3JlZ3JvdW5kICE9IHN0eWxlLmZvcmVncm91bmQpIHsKLQkJCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSkgc3R5bGUuY2xvbmUoKTsKLQkJCQkJc3R5bGUuYmFja2dyb3VuZCA9IHByaW50ZXJCYWNrZ3JvdW5kOwotCQkJCQlzdHlsZS5mb3JlZ3JvdW5kID0gcHJpbnRlckZvcmVncm91bmQ7Ci0JCQkJCWV2ZW50LnN0eWxlc1tpXSA9IHN0eWxlOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoZSByZXNvdXJjZXMgYW5kIHRoZSA8Y2xhc3M+UHJpbnRSZW5kZXJlcjwvY2xhc3M+LgotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHByaW50ZXJDb2xvcnMgIT0gbnVsbCkgewotCQkJRW51bWVyYXRpb24gY29sb3JzID0gcHJpbnRlckNvbG9ycy5lbGVtZW50cygpOwotCQkJCi0JCQl3aGlsZSAoY29sb3JzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJQ29sb3IgY29sb3IgPSAoQ29sb3IpIGNvbG9ycy5uZXh0RWxlbWVudCgpOwotCQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXByaW50ZXJDb2xvcnMgPSBudWxsOwotCQl9Ci0JCWlmIChnYyAhPSBudWxsKSB7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCQlnYyA9IG51bGw7Ci0JCX0KLQkJaWYgKHByaW50ZXJGb250ICE9IG51bGwpIHsKLQkJCXByaW50ZXJGb250LmRpc3Bvc2UoKTsKLQkJCXByaW50ZXJGb250ID0gbnVsbDsKLQkJfQotCQlpZiAocmVuZGVyZXIgIT0gbnVsbCkgewotCQkJcmVuZGVyZXIuZGlzcG9zZSgpOwotCQkJcmVuZGVyZXIgPSBudWxsOwotCQl9Ci0JfQotCS8qKgotCSAqIEZpbmlzaCBwcmludGluZyB0aGUgaW5kaWNhdGVkIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHBhZ2UgcGFnZSB0aGF0IHdhcyBwcmludGVkCi0JICovCi0Jdm9pZCBlbmRQYWdlKGludCBwYWdlKSB7Ci0JCXByaW50RGVjb3JhdGlvbihwYWdlLCBmYWxzZSk7Ci0JCXByaW50ZXIuZW5kUGFnZSgpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNsYXNzPlByaW50UmVuZGVyZXI8L2NsYXNzPiBhbmQgY2FsY3VsYXRlIHRoZSBsaW5lIHJhbmdlCi0JICogdG8gcHJpbnQuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplUmVuZGVyZXIoKSB7Ci0JCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJUG9pbnQgZHBpID0gcHJpbnRlci5nZXREUEkoKTsKLQkJCi0JCXByaW50ZXJGb250ID0gbmV3IEZvbnQocHJpbnRlciwgZGlzcGxheUZvbnREYXRhLmdldE5hbWUoKSwgZGlzcGxheUZvbnREYXRhLmdldEhlaWdodCgpLCBTV1QuTk9STUFMKTsKLQkJY2xpZW50QXJlYSA9IHByaW50ZXIuZ2V0Q2xpZW50QXJlYSgpOwotCQlwYWdlV2lkdGggPSBjbGllbnRBcmVhLndpZHRoOwotCQkvLyBvbmUgaW5jaCBtYXJnaW4gYXJvdW5kIHRleHQKLQkJY2xpZW50QXJlYS54ID0gZHBpLnggKyB0cmltLng7IAkJCQkKLQkJY2xpZW50QXJlYS55ID0gZHBpLnkgKyB0cmltLnk7Ci0JCWNsaWVudEFyZWEud2lkdGggLT0gKGNsaWVudEFyZWEueCArIHRyaW0ud2lkdGgpOwotCQljbGllbnRBcmVhLmhlaWdodCAtPSAoY2xpZW50QXJlYS55ICsgdHJpbS5oZWlnaHQpOyAKLQkJCi0JCS8vIG1ha2UgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBwcmludGVyIGdjIG1hdGNoIHRoZSBjb250cm9sCi0JCWludCBzdHlsZSA9IG1pcnJvcmVkID8gU1dULlJJR0hUX1RPX0xFRlQgOiBTV1QuTEVGVF9UT19SSUdIVDsKLQkJZ2MgPSBuZXcgR0MocHJpbnRlciwgc3R5bGUpOwotCQlnYy5zZXRGb250KHByaW50ZXJGb250KTsKLQkJcmVuZGVyZXIgPSBuZXcgUHJpbnRSZW5kZXJlcigKLQkJCXByaW50ZXIsIHByaW50ZXJGb250LCBnYywgcHJpbnRlckNvbnRlbnQsCi0JCQlsaW5lQmFja2dyb3VuZHMsIGxpbmVTdHlsZXMsIGJpZGlTZWdtZW50cywgCi0JCQlwYXJlbnQudGFiTGVuZ3RoLCBjbGllbnRBcmVhKTsKLQkJaWYgKHByaW50T3B0aW9ucy5oZWFkZXIgIT0gbnVsbCkgewotCQkJaW50IGxpbmVIZWlnaHQgPSByZW5kZXJlci5nZXRMaW5lSGVpZ2h0KCk7Ci0JCQljbGllbnRBcmVhLnkgKz0gbGluZUhlaWdodCAqIDI7Ci0JCQljbGllbnRBcmVhLmhlaWdodCAtPSBsaW5lSGVpZ2h0ICogMjsKLQkJfQotCQlpZiAocHJpbnRPcHRpb25zLmZvb3RlciAhPSBudWxsKSB7Ci0JCQljbGllbnRBcmVhLmhlaWdodCAtPSByZW5kZXJlci5nZXRMaW5lSGVpZ2h0KCkgKiAyOwotCQl9Ci0JCXBhZ2VTaXplID0gY2xpZW50QXJlYS5oZWlnaHQgLyByZW5kZXJlci5nZXRMaW5lSGVpZ2h0KCk7Ci0JCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSByZW5kZXJlci5nZXRDb250ZW50KCk7Ci0JCXN0YXJ0TGluZSA9IDA7Ci0JCWlmIChzaW5nbGVMaW5lKSB7Ci0JCQllbmRMaW5lID0gMDsKLQkJfQotCQllbHNlIHsKLQkJCWVuZExpbmUgPSBjb250ZW50LmdldExpbmVDb3VudCgpIC0gMTsKLQkJfQotCQlQcmludGVyRGF0YSBkYXRhID0gcHJpbnRlci5nZXRQcmludGVyRGF0YSgpOwotCQlpZiAoZGF0YS5zY29wZSA9PSBQcmludGVyRGF0YS5QQUdFX1JBTkdFKSB7Ci0JCQlzdGFydExpbmUgPSAoc3RhcnRQYWdlIC0gMSkgKiBwYWdlU2l6ZTsKLQkJfSAKLQkJZWxzZQotCQlpZiAoZGF0YS5zY29wZSA9PSBQcmludGVyRGF0YS5TRUxFQ1RJT04pIHsKLQkJCXN0YXJ0TGluZSA9IGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KHNlbGVjdGlvbi54KTsKLQkJCWlmIChzZWxlY3Rpb24ueSA+IDApIHsKLQkJCQllbmRMaW5lID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoc2VsZWN0aW9uLnggKyBzZWxlY3Rpb24ueSAtIDEpOwotCQkJfSAKLQkJCWVsc2UgewotCQkJCWVuZExpbmUgPSBzdGFydExpbmUgLSAxOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByaW50ZXIgY29sb3IgZm9yIHRoZSBnaXZlbiBkaXNwbGF5IGNvbG9yLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gY29sb3IgZGlzcGxheSBjb2xvcgotCSAqIEByZXR1cm4gY29sb3IgY3JlYXRlIG9uIHRoZSBwcmludGVyIHdpdGggdGhlIHNhbWUgUkdCIHZhbHVlcyAKLQkgKiAJYXMgdGhlIGRpc3BsYXkgY29sb3IuCi0gCSAqLwotCUNvbG9yIGdldFByaW50ZXJDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBwcmludGVyQ29sb3IgPSBudWxsOwotCQkKLQkJaWYgKGNvbG9yICE9IG51bGwpIHsKLQkJCXByaW50ZXJDb2xvciA9IChDb2xvcikgcHJpbnRlckNvbG9ycy5nZXQoY29sb3IpOwkJCi0JCQlpZiAocHJpbnRlckNvbG9yID09IG51bGwpIHsKLQkJCQlwcmludGVyQ29sb3IgPSBuZXcgQ29sb3IocHJpbnRlciwgY29sb3IuZ2V0UkdCKCkpOwotCQkJCXByaW50ZXJDb2xvcnMucHV0KGNvbG9yLCBwcmludGVyQ29sb3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmludGVyQ29sb3I7Ci0JfQotCS8qKgotCSAqIFByaW50cyB0aGUgbGluZXMgaW4gdGhlIHNwZWNpZmllZCBwYWdlIHJhbmdlLgotCSAqLwotCXZvaWQgcHJpbnQoKSB7Ci0JCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSByZW5kZXJlci5nZXRDb250ZW50KCk7Ci0JCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCWludCBsaW5lSGVpZ2h0ID0gcmVuZGVyZXIuZ2V0TGluZUhlaWdodCgpOwotCQlpbnQgcGFpbnRZID0gY2xpZW50QXJlYS55OwotCQlpbnQgcGFnZSA9IHN0YXJ0UGFnZTsKLQkJCi0JCWZvciAoaW50IGkgPSBzdGFydExpbmU7IGkgPD0gZW5kTGluZSAmJiBwYWdlIDw9IGVuZFBhZ2U7IGkrKywgcGFpbnRZICs9IGxpbmVIZWlnaHQpIHsKLQkJCVN0cmluZyBsaW5lID0gY29udGVudC5nZXRMaW5lKGkpOwotCQkJCi0JCQlpZiAocGFpbnRZID09IGNsaWVudEFyZWEueSkgewotCQkJCXN0YXJ0UGFnZShwYWdlKTsKLQkJCX0KLQkJCXJlbmRlcmVyLmRyYXdMaW5lKAotCQkJCWxpbmUsIGksIHBhaW50WSwgZ2MsIGJhY2tncm91bmQsIGZvcmVncm91bmQsIHRydWUpOwotCQkJaWYgKHBhaW50WSArIGxpbmVIZWlnaHQgKiAyID4gY2xpZW50QXJlYS55ICsgY2xpZW50QXJlYS5oZWlnaHQpIHsKLQkJCQkvLyBjbG9zZSBmdWxsIHBhZ2UKLQkJCQllbmRQYWdlKHBhZ2UpOwotCQkJCXBhaW50WSA9IGNsaWVudEFyZWEueSAtIGxpbmVIZWlnaHQ7Ci0JCQkJcGFnZSsrOwotCQkJfQotCQl9Ci0JCWlmIChwYWludFkgPiBjbGllbnRBcmVhLnkpIHsKLQkJCS8vIGNsb3NlIHBhcnRpYWwgcGFnZQotCQkJZW5kUGFnZShwYWdlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBQcmludCBoZWFkZXIgb3IgZm9vdGVyIGRlY29yYXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlIHBhZ2UgbnVtYmVyIHRvIHByaW50LCBpZiBzcGVjaWZpZWQgaW4gdGhlIFN0eWxlZFRleHRQcmludE9wdGlvbnMgaGVhZGVyIG9yIGZvb3Rlci4KLQkgKiBAcGFyYW0gaGVhZGVyIHRydWUgPSBwcmludCB0aGUgaGVhZGVyLCBmYWxzZSA9IHByaW50IHRoZSBmb290ZXIKLQkgKi8KLQl2b2lkIHByaW50RGVjb3JhdGlvbihpbnQgcGFnZSwgYm9vbGVhbiBoZWFkZXIpIHsKLQkJaW50IGxhc3RTZWdtZW50SW5kZXggPSAwOwotCQlmaW5hbCBpbnQgU2VnbWVudENvdW50ID0gMzsKLQkJU3RyaW5nIHRleHQ7Ci0JCQotCQlpZiAoaGVhZGVyKSB7Ci0JCQl0ZXh0ID0gcHJpbnRPcHRpb25zLmhlYWRlcjsKLQkJfQotCQllbHNlIHsKLQkJCXRleHQgPSBwcmludE9wdGlvbnMuZm9vdGVyOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IFNlZ21lbnRDb3VudDsgaSsrKSB7Ci0JCQlpbnQgc2VnbWVudEluZGV4ID0gdGV4dC5pbmRleE9mKFN0eWxlZFRleHRQcmludE9wdGlvbnMuU0VQQVJBVE9SLCBsYXN0U2VnbWVudEluZGV4KTsKLQkJCVN0cmluZyBzZWdtZW50OwotCQkJCi0JCQlpZiAoc2VnbWVudEluZGV4ID09IC0xKSB7Ci0JCQkJc2VnbWVudCA9IHRleHQuc3Vic3RyaW5nKGxhc3RTZWdtZW50SW5kZXgpOwotCQkJCXByaW50RGVjb3JhdGlvblNlZ21lbnQoc2VnbWVudCwgaSwgcGFnZSwgaGVhZGVyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlZ21lbnQgPSB0ZXh0LnN1YnN0cmluZyhsYXN0U2VnbWVudEluZGV4LCBzZWdtZW50SW5kZXgpOwotCQkJCXByaW50RGVjb3JhdGlvblNlZ21lbnQoc2VnbWVudCwgaSwgcGFnZSwgaGVhZGVyKTsKLQkJCQlsYXN0U2VnbWVudEluZGV4ID0gc2VnbWVudEluZGV4ICsgU3R5bGVkVGV4dFByaW50T3B0aW9ucy5TRVBBUkFUT1IubGVuZ3RoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogUHJpbnQgb25lIHNlZ21lbnQgb2YgYSBoZWFkZXIgb3IgZm9vdGVyIGRlY29yYXRpb24uCi0JICogSGVhZGVycyBhbmQgZm9vdGVycyBoYXZlIHRocmVlIGRpZmZlcmVudCBzZWdtZW50cy4KLQkgKiBPbmUgZWFjaCBmb3IgbGVmdCBhbGlnbmVkLCBjZW50ZXJlZCwgYW5kIHJpZ2h0IGFsaWduZWQgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VnbWVudCBkZWNvcmF0aW9uIHNlZ21lbnQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gYWxpZ25tZW50IGFsaWdubWVudCBvZiB0aGUgc2VnbWVudC4gMD1sZWZ0LCAxPWNlbnRlciwgMj1yaWdodCAKLQkgKiBAcGFyYW0gcGFnZSBwYWdlIG51bWJlciB0byBwcmludCwgaWYgc3BlY2lmaWVkIGluIHRoZSBkZWNvcmF0aW9uIHNlZ21lbnQuCi0JICogQHBhcmFtIGhlYWRlciB0cnVlID0gcHJpbnQgdGhlIGhlYWRlciwgZmFsc2UgPSBwcmludCB0aGUgZm9vdGVyCi0JICovCi0Jdm9pZCBwcmludERlY29yYXRpb25TZWdtZW50KFN0cmluZyBzZWdtZW50LCBpbnQgYWxpZ25tZW50LCBpbnQgcGFnZSwgYm9vbGVhbiBoZWFkZXIpIHsJCQotCQlpbnQgcGFnZUluZGV4ID0gc2VnbWVudC5pbmRleE9mKFN0eWxlZFRleHRQcmludE9wdGlvbnMuUEFHRV9UQUcpOwotCQkKLQkJaWYgKHBhZ2VJbmRleCAhPSAtMSkgewotCQkJZmluYWwgaW50IFBhZ2VUYWdMZW5ndGggPSBTdHlsZWRUZXh0UHJpbnRPcHRpb25zLlBBR0VfVEFHLmxlbmd0aCgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc2VnbWVudC5zdWJzdHJpbmcgKDAsIHBhZ2VJbmRleCkpOwotCQkJYnVmZmVyLmFwcGVuZCAocGFnZSk7Ci0JCQlidWZmZXIuYXBwZW5kIChzZWdtZW50LnN1YnN0cmluZyhwYWdlSW5kZXggKyBQYWdlVGFnTGVuZ3RoKSk7Ci0JCQlzZWdtZW50ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKHNlZ21lbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpbnQgc2VnbWVudFdpZHRoOwotCQkJaW50IGRyYXdYID0gMDsKLQkJCWludCBkcmF3WSA9IDA7Ci0JCQlUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KHByaW50ZXIpOwotCQkJbGF5b3V0LnNldFRleHQoc2VnbWVudCk7Ci0JCQlsYXlvdXQuc2V0Rm9udChwcmludGVyRm9udCk7Ci0JCQlzZWdtZW50V2lkdGggPSBsYXlvdXQuZ2V0TGluZUJvdW5kcygwKS53aWR0aDsKLQkJCWlmIChoZWFkZXIpIHsKLQkJCQlkcmF3WSA9IGNsaWVudEFyZWEueSAtIHJlbmRlcmVyLmdldExpbmVIZWlnaHQoKSAqIDI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkcmF3WSA9IGNsaWVudEFyZWEueSArIGNsaWVudEFyZWEuaGVpZ2h0ICsgcmVuZGVyZXIuZ2V0TGluZUhlaWdodCgpOwotCQkJfQotCQkJaWYgKGFsaWdubWVudCA9PSBMRUZUKSB7Ci0JCQkJZHJhd1ggPSBjbGllbnRBcmVhLng7Ci0JCQl9Ci0JCQllbHNlCQkJCQotCQkJaWYgKGFsaWdubWVudCA9PSBDRU5URVIpIHsKLQkJCQlkcmF3WCA9IChwYWdlV2lkdGggLSBzZWdtZW50V2lkdGgpIC8gMjsKLQkJCX0KLQkJCWVsc2UgCi0JCQlpZiAoYWxpZ25tZW50ID09IFJJR0hUKSB7Ci0JCQkJZHJhd1ggPSBjbGllbnRBcmVhLnggKyBjbGllbnRBcmVhLndpZHRoIC0gc2VnbWVudFdpZHRoOwotCQkJfQotCQkJbGF5b3V0LmRyYXcoZ2MsIGRyYXdYLCBkcmF3WSk7Ci0JCQlsYXlvdXQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCS8qKgotCSAqIFN0YXJ0cyBhIHByaW50IGpvYiBhbmQgcHJpbnRzIHRoZSBwYWdlcyBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU3RyaW5nIGpvYk5hbWUgPSBwcmludE9wdGlvbnMuam9iTmFtZTsKLQkJCi0JCWlmIChqb2JOYW1lID09IG51bGwpIHsKLQkJCWpvYk5hbWUgPSAiUHJpbnRpbmciOwotCQl9CQkKLQkJaWYgKHByaW50ZXIuc3RhcnRKb2Ioam9iTmFtZSkpIHsKLQkJCWNyZWF0ZVByaW50ZXJDb2xvcnMoKTsKLQkJCWluaXRpYWxpemVSZW5kZXJlcigpOwotCQkJcHJpbnQoKTsKLQkJCWRpc3Bvc2UoKTsKLQkJCXByaW50ZXIuZW5kSm9iKCk7CQkJCi0JCX0KLQl9Ci0JLyoqCi0JICogU3RhcnQgcHJpbnRpbmcgYSBuZXcgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZSBwYWdlIG51bWJlciB0byBiZSBzdGFydGVkCi0JICovCi0Jdm9pZCBzdGFydFBhZ2UoaW50IHBhZ2UpIHsKLQkJcHJpbnRlci5zdGFydFBhZ2UoKTsKLQkJcHJpbnREZWNvcmF0aW9uKHBhZ2UsIHRydWUpOwotCX0JCi0JfQotCS8qKgotCSAqIFRoZSA8Y29kZT5SVEZXcml0ZXI8L2NvZGU+IGNsYXNzIGlzIHVzZWQgdG8gd3JpdGUgd2lkZ2V0IGNvbnRlbnQgYXMKLQkgKiByaWNoIHRleHQuIFRoZSBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIHRoZSBSVEYgc3BlY2lmaWNhdGlvbiAKLQkgKiB2ZXJzaW9uIDEuNS4KLQkgKiA8cD4KLQkgKiB0b1N0cmluZygpIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgdmFsaWQgUlRGIHN0cmluZyBvbmx5IGFmdGVyIAotCSAqIGNsb3NlKCkgaGFzIGJlZW4gY2FsbGVkLiAKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogV2hvbGUgYW5kIHBhcnRpYWwgbGluZXMgYW5kIGxpbmUgYnJlYWtzIGNhbiBiZSB3cml0dGVuLiBMaW5lcyB3aWxsIGJlCi0JICogZm9ybWF0dGVkIHVzaW5nIHRoZSBzdHlsZXMgcXVlcmllZCBmcm9tIHRoZSBMaW5lU3R5bGVMaXN0ZW5lciwgaWYgCi0JICogc2V0LCBvciB0aG9zZSBzZXQgZGlyZWN0bHkgaW4gdGhlIHdpZGdldC4gQWxsIHN0eWxlcyBhcmUgYXBwbGllZCB0bwotCSAqIHRoZSBSVEYgc3RyZWFtIGxpa2UgdGhleSBhcmUgcmVuZGVyZWQgYnkgdGhlIHdpZGdldC4gSW4gYWRkaXRpb24sIHRoZSAKLQkgKiB3aWRnZXQgZm9udCBuYW1lIGFuZCBzaXplIGlzIHVzZWQgZm9yIHRoZSB3aG9sZSB0ZXh0LgotCSAqIDwvcD4KLQkgKi8KLQljbGFzcyBSVEZXcml0ZXIgZXh0ZW5kcyBUZXh0V3JpdGVyIHsKLQkJc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0ZPUkVHUk9VTkQgPSAwOwotCQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQkFDS0dST1VORCA9IDE7Ci0JCVZlY3RvciBjb2xvclRhYmxlID0gbmV3IFZlY3RvcigpOwotCQlib29sZWFuIFdyaXRlVW5pY29kZTsKLQkJCi0JLyoqCi0JICogQ3JlYXRlcyBhIFJURiB3cml0ZXIgdGhhdCB3cml0ZXMgY29udGVudCBzdGFydGluZyBhdCBvZmZzZXQgInN0YXJ0IgotCSAqIGluIHRoZSBkb2N1bWVudC4gIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+bGVuZ3RoPC9jb2RlPmNhbiBiZSBzZXQgdG8gc3BlY2lmeSBwYXJ0aWFsIAotCSAqIGxpbmVzLgotCSAqIDxwPgotCSAqCi0JICogQHBhcmFtIHN0YXJ0IHN0YXJ0IG9mZnNldCBvZiBjb250ZW50IHRvIHdyaXRlLCAwIGJhc2VkIGZyb20gCi0JICogCWJlZ2lubmluZyBvZiBkb2N1bWVudAotCSAqIEBwYXJhbSBsZW5ndGggbGVuZ3RoIG9mIGNvbnRlbnQgdG8gd3JpdGUKLQkgKi8KLQlwdWJsaWMgUlRGV3JpdGVyKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzdXBlcihzdGFydCwgbGVuZ3RoKTsKLQkJY29sb3JUYWJsZS5hZGRFbGVtZW50KGdldEZvcmVncm91bmQoKSk7Ci0JCWNvbG9yVGFibGUuYWRkRWxlbWVudChnZXRCYWNrZ3JvdW5kKCkpOwkJCi0JCXNldFVuaWNvZGUoKTsKLQl9Ci0JLyoqCi0JICogQ2xvc2VzIHRoZSBSVEYgd3JpdGVyLiBPbmNlIGNsb3NlZCBubyBtb3JlIGNvbnRlbnQgY2FuIGJlIHdyaXR0ZW4uCi0JICogPGI+Tk9URTo8L2I+ICA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBkb2VzIG5vdCByZXR1cm4gYSB2YWxpZCBSVEYgc3RyaW5nIHVudGlsIAotCSAqIDxjb2RlPmNsb3NlKCk8L2NvZGU+IGhhcyBiZWVuIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJaWYgKCFpc0Nsb3NlZCgpKSB7Ci0JCQl3cml0ZUhlYWRlcigpOwotCQkJd3JpdGUoIlxufX1cMCIpOwotCQkJc3VwZXIuY2xvc2UoKTsKLQkJfQotCX0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjb2xvciBpbiB0aGUgUlRGIGNvbG9yIHRhYmxlLgotCSAqIDxwPgotCSAqCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvcgotCSAqIEBwYXJhbSBkZWZhdWx0SW5kZXggcmV0dXJuIHZhbHVlIGlmIGNvbG9yIGlzIG51bGwKLQkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNvbG9yIGluIHRoZSBSVEYgY29sb3IgdGFibGUKLQkgKiAJb3IgImRlZmF1bHRJbmRleCIgaWYgImNvbG9yIiBpcyBudWxsLgotCSAqLwotCWludCBnZXRDb2xvckluZGV4KENvbG9yIGNvbG9yLCBpbnQgZGVmYXVsdEluZGV4KSB7Ci0JCWludCBpbmRleDsKLQkJCi0JCWlmIChjb2xvciA9PSBudWxsKSB7Ci0JCQlpbmRleCA9IGRlZmF1bHRJbmRleDsKLQkJfQotCQllbHNlIHsJCQotCQkJaW5kZXggPSBjb2xvclRhYmxlLmluZGV4T2YoY29sb3IpOwotCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJaW5kZXggPSBjb2xvclRhYmxlLnNpemUoKTsKLQkJCQljb2xvclRhYmxlLmFkZEVsZW1lbnQoY29sb3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBVbmljb2RlIFJURiBzaG91bGQgYmUgd3JpdHRlbi4KLQkgKiBEb24ndCB3cml0ZSBVbmljb2RlIFJURiBvbiBXaW5kb3dzIDk1Lzk4L01FIG9yIE5ULgotCSAqLwotCXZvaWQgc2V0VW5pY29kZSgpIHsKLQkJZmluYWwgU3RyaW5nIFdpbjk1ID0gIndpbmRvd3MgOTUiOwotCQlmaW5hbCBTdHJpbmcgV2luOTggPSAid2luZG93cyA5OCI7Ci0JCWZpbmFsIFN0cmluZyBXaW5NRSA9ICJ3aW5kb3dzIG1lIjsJCQotCQlmaW5hbCBTdHJpbmcgV2luTlQgPSAid2luZG93cyBudCI7Ci0JCVN0cmluZyBvc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpOwotCQlTdHJpbmcgb3NWZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy52ZXJzaW9uIik7Ci0JCWludCBtYWpvclZlcnNpb24gPSAwOwotCQkKLQkJaWYgKG9zTmFtZS5zdGFydHNXaXRoKFdpbk5UKSAmJiBvc1ZlcnNpb24gIT0gbnVsbCkgewotCQkJaW50IG1ham9ySW5kZXggPSBvc1ZlcnNpb24uaW5kZXhPZignLicpOwotCQkJaWYgKG1ham9ySW5kZXggIT0gLTEpIHsKLQkJCQlvc1ZlcnNpb24gPSBvc1ZlcnNpb24uc3Vic3RyaW5nKDAsIG1ham9ySW5kZXgpOwotCQkJCXRyeSB7Ci0JCQkJCW1ham9yVmVyc2lvbiA9IEludGVnZXIucGFyc2VJbnQob3NWZXJzaW9uKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJLy8gaWdub3JlIGV4Y2VwdGlvbi4gdmVyc2lvbiBudW1iZXIgcmVtYWlucyB1bmtub3duLgotCQkJCQkvLyB3aWxsIHdyaXRlIHdpdGhvdXQgVW5pY29kZQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIW9zTmFtZS5zdGFydHNXaXRoKFdpbjk1KSAmJgotCQkJIW9zTmFtZS5zdGFydHNXaXRoKFdpbjk4KSAmJgotCQkJIW9zTmFtZS5zdGFydHNXaXRoKFdpbk1FKSAmJgotCQkJKCFvc05hbWUuc3RhcnRzV2l0aChXaW5OVCkgfHwgbWFqb3JWZXJzaW9uID4gNCkpIHsKLQkJCVdyaXRlVW5pY29kZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlXcml0ZVVuaWNvZGUgPSBmYWxzZTsKLQkJfQotCX0KLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBvZiAic3RyaW5nIiB0byB0aGUgUlRGIGRhdGEuCi0JICogQ29weSBmcm9tIDxjb2RlPnN0YXJ0PC9jb2RlPiB1cCB0bywgYnV0IGV4Y2x1ZGluZywgPGNvZGU+ZW5kPC9jb2RlPi4KLQkgKiA8cD4KLQkgKgotCSAqIEBwYXJhbSBzdHJpbmcgc3RyaW5nIHRvIGNvcHkgYSBzZWdtZW50IGZyb20uIE11c3Qgbm90IGNvbnRhaW4KLQkgKiAJbGluZSBicmVha3MuIExpbmUgYnJlYWtzIHNob3VsZCBiZSB3cml0dGVuIHVzaW5nIHdyaXRlTGluZURlbGltaXRlcigpCi0JICogQHBhcmFtIHN0YXJ0IHN0YXJ0IG9mZnNldCBvZiBzZWdtZW50LiAwIGJhc2VkLgotCSAqIEBwYXJhbSBlbmQgZW5kIG9mZnNldCBvZiBzZWdtZW50Ci0JICovCi0Jdm9pZCB3cml0ZShTdHJpbmcgc3RyaW5nLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJZm9yIChpbnQgaW5kZXggPSBzdGFydDsgaW5kZXggPCBlbmQ7IGluZGV4KyspIHsKLQkJCWNoYXIgY2ggPSBzdHJpbmcuY2hhckF0KGluZGV4KTsKLQkJCWlmIChjaCA+IDB4RkYgJiYgV3JpdGVVbmljb2RlKSB7Ci0JCQkJLy8gd3JpdGUgdGhlIHN1YiBzdHJpbmcgZnJvbSB0aGUgbGFzdCBlc2NhcGVkIGNoYXJhY3RlciAKLQkJCQkvLyB0byB0aGUgY3VycmVudCBvbmUuIEZpeGVzIGJ1ZyAyMTY5OC4KLQkJCQlpZiAoaW5kZXggPiBzdGFydCkgewotCQkJCQl3cml0ZShzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkpOwotCQkJCX0KLQkJCQl3cml0ZSgiXFx1Iik7Ci0JCQkJd3JpdGUoSW50ZWdlci50b1N0cmluZygoc2hvcnQpIGNoKSk7Ci0JCQkJd3JpdGUoJyAnKTsJCQkJCQkvLyBjb250cm9sIHdvcmQgZGVsaW1pdGVyCi0JCQkJc3RhcnQgPSBpbmRleCArIDE7Ci0JCQl9Ci0JCQllbHNlCi0JCQlpZiAoY2ggPT0gJ30nIHx8IGNoID09ICd7JyB8fCBjaCA9PSAnXFwnKSB7Ci0JCQkJLy8gd3JpdGUgdGhlIHN1YiBzdHJpbmcgZnJvbSB0aGUgbGFzdCBlc2NhcGVkIGNoYXJhY3RlciAKLQkJCQkvLyB0byB0aGUgY3VycmVudCBvbmUuIEZpeGVzIGJ1ZyAyMTY5OC4KLQkJCQlpZiAoaW5kZXggPiBzdGFydCkgewotCQkJCQl3cml0ZShzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkpOwotCQkJCX0KLQkJCQl3cml0ZSgnXFwnKTsKLQkJCQl3cml0ZShjaCk7Ci0JCQkJc3RhcnQgPSBpbmRleCArIDE7Ci0JCQl9Ci0JCX0KLQkJLy8gd3JpdGUgZnJvbSB0aGUgbGFzdCBlc2NhcGVkIGNoYXJhY3RlciB0byB0aGUgZW5kLgotCQkvLyBGaXhlcyBidWcgMjE2OTguCi0JCWlmIChzdGFydCA8IGVuZCkgewotCQkJd3JpdGUoc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7Ci0JCX0KLQl9CQotCS8qKgotCSAqIFdyaXRlcyB0aGUgUlRGIGhlYWRlciBpbmNsdWRpbmcgZm9udCB0YWJsZSBhbmQgY29sb3IgdGFibGUuCi0JICovCi0Jdm9pZCB3cml0ZUhlYWRlcigpIHsKLQkJU3RyaW5nQnVmZmVyIGhlYWRlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJRm9udERhdGEgZm9udERhdGEgPSBnZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJaGVhZGVyLmFwcGVuZCgie1xccnRmMVxcYW5zaSIpOwotCQkvLyBzcGVjaWZ5IGNvZGUgcGFnZSwgbmVjZXNzYXJ5IGZvciBjb3B5IHRvIHdvcmsgaW4gYmlkaSAKLQkJLy8gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgVW5pY29kZSBSVEYuCi0JCVN0cmluZyBjcGcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKS50b0xvd2VyQ2FzZSgpOwotCQlpZiAoY3BnLnN0YXJ0c1dpdGgoImNwIikgfHwgY3BnLnN0YXJ0c1dpdGgoIm1zIikpIHsKLQkJCWNwZyA9IGNwZy5zdWJzdHJpbmcoMiwgY3BnLmxlbmd0aCgpKTsKLQkJCWhlYWRlci5hcHBlbmQoIlxcYW5zaWNwZyIpOwotCQkJaGVhZGVyLmFwcGVuZChjcGcpOwotCQl9Ci0JCWhlYWRlci5hcHBlbmQoIlxcdWMwXFxkZWZmMHtcXGZvbnR0Ymx7XFxmMFxcZm5pbCAiKTsKLQkJaGVhZGVyLmFwcGVuZChmb250RGF0YS5nZXROYW1lKCkpOwotCQloZWFkZXIuYXBwZW5kKCI7fX1cbntcXGNvbG9ydGJsIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sb3JUYWJsZS5zaXplKCk7IGkrKykgewotCQkJQ29sb3IgY29sb3IgPSAoQ29sb3IpIGNvbG9yVGFibGUuZWxlbWVudEF0KGkpOwotCQkJaGVhZGVyLmFwcGVuZCgiXFxyZWQiKTsKLQkJCWhlYWRlci5hcHBlbmQoY29sb3IuZ2V0UmVkKCkpOwotCQkJaGVhZGVyLmFwcGVuZCgiXFxncmVlbiIpOwotCQkJaGVhZGVyLmFwcGVuZChjb2xvci5nZXRHcmVlbigpKTsKLQkJCWhlYWRlci5hcHBlbmQoIlxcYmx1ZSIpOwotCQkJaGVhZGVyLmFwcGVuZChjb2xvci5nZXRCbHVlKCkpOwotCQkJaGVhZGVyLmFwcGVuZCgiOyIpOwotCQl9IAotCQkvLyBzb21lIFJURiByZWFkZXJzIGlnbm9yZSB0aGUgZGVmZjAgZm9udCB0YWcuIEV4cGxpY2l0bHkgCi0JCS8vIHNldCB0aGUgZm9udCBmb3IgdGhlIHdob2xlIGRvY3VtZW50IHRvIHdvcmsgYXJvdW5kIHRoaXMuCi0JCWhlYWRlci5hcHBlbmQoIn1cbntcXGYwXFxmcyIpOwotCQkvLyBmb250IHNpemUgaXMgc3BlY2lmaWVkIGluIGhhbGYgcG9pbnRzCi0JCWhlYWRlci5hcHBlbmQoZm9udERhdGEuZ2V0SGVpZ2h0KCkgKiAyKTsKLQkJaGVhZGVyLmFwcGVuZCgiICIpOwotCQl3cml0ZShoZWFkZXIudG9TdHJpbmcoKSwgMCk7Ci0JfQotCS8qKgotCSAqIEFwcGVuZHMgdGhlIHNwZWNpZmllZCBsaW5lIHRleHQgdG8gdGhlIFJURiBkYXRhLiAgTGluZXMgd2lsbCBiZSBmb3JtYXR0ZWQgCi0JICogdXNpbmcgdGhlIHN0eWxlcyBxdWVyaWVkIGZyb20gdGhlIExpbmVTdHlsZUxpc3RlbmVyLCBpZiBzZXQsIG9yIHRob3NlIHNldCAKLQkgKiBkaXJlY3RseSBpbiB0aGUgd2lkZ2V0LgotCSAqIDxwPgotCSAqCi0JICogQHBhcmFtIGxpbmUgbGluZSB0ZXh0IHRvIHdyaXRlIGFzIFJURi4gTXVzdCBub3QgY29udGFpbiBsaW5lIGJyZWFrcwotCSAqIAlMaW5lIGJyZWFrcyBzaG91bGQgYmUgd3JpdHRlbiB1c2luZyB3cml0ZUxpbmVEZWxpbWl0ZXIoKQotCSAqIEBwYXJhbSBsaW5lT2Zmc2V0IG9mZnNldCBvZiB0aGUgbGluZS4gMCBiYXNlZCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgCi0JICogCXdpZGdldCBkb2N1bWVudC4gQW55IHRleHQgb2NjdXJyaW5nIGJlZm9yZSB0aGUgc3RhcnQgb2Zmc2V0IG9yIGFmdGVyIHRoZSAKLQkgKiAJZW5kIG9mZnNldCBzcGVjaWZpZWQgZHVyaW5nIG9iamVjdCBjcmVhdGlvbiBpcyBpZ25vcmVkLgotCSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLQkgKiAgIDxsaT5FUlJPUl9JTyB3aGVuIHRoZSB3cml0ZXIgaXMgY2xvc2VkLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZUxpbmUoU3RyaW5nIGxpbmUsIGludCBsaW5lT2Zmc2V0KSB7Ci0JCVN0eWxlUmFuZ2VbXSBzdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVswXTsKLQkJQ29sb3IgbGluZUJhY2tncm91bmQgPSBudWxsOwotCQlTdHlsZWRUZXh0RXZlbnQgZXZlbnQ7Ci0JCQotCQlpZiAoaXNDbG9zZWQoKSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTyk7Ci0JCX0KLQkJZXZlbnQgPSByZW5kZXJlci5nZXRMaW5lU3R5bGVEYXRhKGxpbmVPZmZzZXQsIGxpbmUpOwotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJc3R5bGVzID0gZXZlbnQuc3R5bGVzOwotCQl9Ci0JCWV2ZW50ID0gcmVuZGVyZXIuZ2V0TGluZUJhY2tncm91bmREYXRhKGxpbmVPZmZzZXQsIGxpbmUpOwotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJbGluZUJhY2tncm91bmQgPSBldmVudC5saW5lQmFja2dyb3VuZDsKLQkJfQotCQlpZiAobGluZUJhY2tncm91bmQgPT0gbnVsbCkgewotCQkJbGluZUJhY2tncm91bmQgPSBnZXRCYWNrZ3JvdW5kKCk7Ci0JCX0KLQkJd3JpdGVTdHlsZWRMaW5lKGxpbmUsIGxpbmVPZmZzZXQsIHN0eWxlcywgbGluZUJhY2tncm91bmQpOwotCX0KLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBzcGVjaWZpZWQgbGluZSBkZWxtaW1pdGVyIHRvIHRoZSBSVEYgZGF0YS4KLQkgKiA8cD4KLQkgKgotCSAqIEBwYXJhbSBsaW5lRGVsaW1pdGVyIGxpbmUgZGVsaW1pdGVyIHRvIHdyaXRlIGFzIFJURi4KLQkgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0JICogICA8bGk+RVJST1JfSU8gd2hlbiB0aGUgd3JpdGVyIGlzIGNsb3NlZC48L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHZvaWQgd3JpdGVMaW5lRGVsaW1pdGVyKFN0cmluZyBsaW5lRGVsaW1pdGVyKSB7Ci0JCWlmIChpc0Nsb3NlZCgpKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPKTsKLQkJfQotCQl3cml0ZShsaW5lRGVsaW1pdGVyLCAwLCBsaW5lRGVsaW1pdGVyLmxlbmd0aCgpKTsKLQkJd3JpdGUoIlxccGFyICIpOwotCX0KLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBzcGVjaWZpZWQgbGluZSB0ZXh0IHRvIHRoZSBSVEYgZGF0YS4KLQkgKiBVc2UgdGhlIGNvbG9ycyBhbmQgZm9udCBzdHlsZXMgc3BlY2lmaWVkIGluICJzdHlsZXMiIGFuZCAibGluZUJhY2tncm91bmQiLgotCSAqIEZvcm1hdHRpbmcgaXMgd3JpdHRlbiB0byByZWZsZWN0IHRoZSB0ZXh0IHJlbmRlcmluZyBieSB0aGUgdGV4dCB3aWRnZXQuCi0JICogU3R5bGUgYmFja2dyb3VuZCBjb2xvcnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIGxpbmUgYmFja2dyb3VuZCBjb2xvci4KLQkgKiBCYWNrZ3JvdW5kIGNvbG9ycyBhcmUgd3JpdHRlbiB1c2luZyB0aGUgXGhpZ2hsaWdodCB0YWcgKHZzLiB0aGUgXGNiIHRhZykuCi0JICogPHA+Ci0JICoKLQkgKiBAcGFyYW0gbGluZSBsaW5lIHRleHQgdG8gd3JpdGUgYXMgUlRGLiBNdXN0IG5vdCBjb250YWluIGxpbmUgYnJlYWtzCi0JICogCUxpbmUgYnJlYWtzIHNob3VsZCBiZSB3cml0dGVuIHVzaW5nIHdyaXRlTGluZURlbGltaXRlcigpCi0JICogQHBhcmFtIGxpbmVPZmZzZXQgb2Zmc2V0IG9mIHRoZSBsaW5lLiAwIGJhc2VkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSAKLQkgKiAJd2lkZ2V0IGRvY3VtZW50LiBBbnkgdGV4dCBvY2N1cnJpbmcgYmVmb3JlIHRoZSBzdGFydCBvZmZzZXQgb3IgYWZ0ZXIgdGhlIAotCSAqIAllbmQgb2Zmc2V0IHNwZWNpZmllZCBkdXJpbmcgb2JqZWN0IGNyZWF0aW9uIGlzIGlnbm9yZWQuCi0JICogQHBhcmFtIHN0eWxlcyBzdHlsZXMgdG8gdXNlIGZvciBmb3JtYXR0aW5nLiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSBsaW5lQmFja2dyb3VuZCBsaW5lIGJhY2tncm91bmQgY29sb3IgdG8gdXNlIGZvciBmb3JtYXR0aW5nLiAKLQkgKiAJTWF5IGJlIG51bGwuCi0JICovCi0Jdm9pZCB3cml0ZVN0eWxlZExpbmUoU3RyaW5nIGxpbmUsIGludCBsaW5lT2Zmc2V0LCBTdHlsZVJhbmdlW10gc3R5bGVzLCBDb2xvciBsaW5lQmFja2dyb3VuZCkgewotCQlpbnQgbGluZUxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0JCWludCBsaW5lSW5kZXg7Ci0JCWludCBjb3B5RW5kOwotCQlpbnQgc3RhcnRPZmZzZXQgPSBnZXRTdGFydCgpOwkJCi0JCWludCBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIHN1cGVyLmdldENoYXJDb3VudCgpOwotCQlpbnQgbGluZUVuZE9mZnNldCA9IE1hdGgubWluKGxpbmVMZW5ndGgsIGVuZE9mZnNldCAtIGxpbmVPZmZzZXQpOwotCQlpbnQgd3JpdGVPZmZzZXQgPSBzdGFydE9mZnNldCAtIGxpbmVPZmZzZXQ7Ci0JCQotCQlpZiAod3JpdGVPZmZzZXQgPj0gbGluZS5sZW5ndGgoKSkgewotCQkJcmV0dXJuOwkJCQkJLy8gd2hvbGUgbGluZSBpcyBvdXRzaWRlIHdyaXRlIHJhbmdlCi0JCX0KLQkJZWxzZQotCQlpZiAod3JpdGVPZmZzZXQgPiAwKSB7Ci0JCQlsaW5lSW5kZXggPSB3cml0ZU9mZnNldDsJCS8vIGxpbmUgc3RhcnRzIGJlZm9yZSBSVEYgd3JpdGUgc3RhcnQKLQkJfQotCQllbHNlIHsKLQkJCWxpbmVJbmRleCA9IDA7Ci0JCX0KLQkJaWYgKGxpbmVCYWNrZ3JvdW5kICE9IG51bGwpIHsKLQkJCXdyaXRlKCJ7XFxoaWdobGlnaHQiKTsKLQkJCXdyaXRlKGdldENvbG9ySW5kZXgobGluZUJhY2tncm91bmQsIERFRkFVTFRfQkFDS0dST1VORCkpOwotCQkJd3JpdGUoIiAiKTsgCi0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsJCQotCQkJU3R5bGVSYW5nZSBzdHlsZSA9IHN0eWxlc1tpXTsKLQkJCWludCBzdGFydCA9IHN0eWxlLnN0YXJ0IC0gbGluZU9mZnNldDsKLQkJCWludCBlbmQgPSBzdGFydCArIHN0eWxlLmxlbmd0aDsKLQkJCWludCBjb2xvckluZGV4OwotCQkJLy8gc2tpcCBvdmVyIHBhcnRpYWwgZmlyc3QgbGluZQotCQkJaWYgKGVuZCA8IHdyaXRlT2Zmc2V0KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkvLyBzdHlsZSBzdGFydHMgYmV5b25kIGxpbmUgZW5kIG9yIFJURiB3cml0ZSBlbmQKLQkJCWlmIChzdGFydCA+PSBsaW5lRW5kT2Zmc2V0KSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvLyB3cml0ZSBhbnkgdW5zdHlsZWQgdGV4dAotCQkJaWYgKGxpbmVJbmRleCA8IHN0YXJ0KSB7IAotCQkJCS8vIGNvcHkgdG8gc3RhcnQgb2Ygc3R5bGUKLQkJCQkvLyBzdHlsZSBzdGFydGluZyBiZXRvbmQgZW5kIG9mIHdyaXRlIHJhbmdlIG9yIGVuZCBvZiBsaW5lIAotCQkJCS8vIGlzIGd1YXJkZWQgYWdhaW5zdCBhYm92ZS4KLQkJCQl3cml0ZShsaW5lLCBsaW5lSW5kZXgsIHN0YXJ0KTsKLQkJCQlsaW5lSW5kZXggPSBzdGFydDsKLQkJCX0KLQkJCS8vIHdyaXRlIHN0eWxlZCB0ZXh0Ci0JCQljb2xvckluZGV4ID0gZ2V0Q29sb3JJbmRleChzdHlsZS5iYWNrZ3JvdW5kLCBERUZBVUxUX0JBQ0tHUk9VTkQpOwotCQkJd3JpdGUoIntcXGNmIik7Ci0JCQl3cml0ZShnZXRDb2xvckluZGV4KHN0eWxlLmZvcmVncm91bmQsIERFRkFVTFRfRk9SRUdST1VORCkpOwotCQkJaWYgKGNvbG9ySW5kZXggIT0gREVGQVVMVF9CQUNLR1JPVU5EKSB7Ci0JCQkJd3JpdGUoIlxcaGlnaGxpZ2h0Iik7Ci0JCQkJd3JpdGUoY29sb3JJbmRleCk7Ci0JCQl9Ci0JCQlpZiAoKHN0eWxlLmZvbnRTdHlsZSAmIFNXVC5CT0xEKSAhPSAwKSB7Ci0JCQkJd3JpdGUoIlxcYiIpOyAKLQkJCX0KLQkJCWlmICgoc3R5bGUuZm9udFN0eWxlICYgU1dULklUQUxJQykgIT0gMCkgewotCQkJCXdyaXRlKCJcXGkiKTsgCi0JCQl9Ci0JCQlpZiAoc3R5bGUudW5kZXJsaW5lKSB7Ci0JCQkJd3JpdGUoIlxcdWwiKTsKLQkJCX0KLQkJCWlmIChzdHlsZS5zdHJpa2VvdXQpIHsKLQkJCQl3cml0ZSgiXFxzdHJpa2UiKTsKLQkJCX0KLQkJCXdyaXRlKCIgIik7IAotCQkJLy8gY29weSB0byBlbmQgb2Ygc3R5bGUgb3IgZW5kIG9mIHdyaXRlIHJhbmdlIG9yIGVuZCBvZiBsaW5lCi0JCQljb3B5RW5kID0gTWF0aC5taW4oZW5kLCBsaW5lRW5kT2Zmc2V0KTsKLQkJCS8vIGd1YXJkIGFnYWluc3QgaW52YWxpZCBzdHlsZXMgYW5kIGxldCBzdHlsZSBwcm9jZXNzaW5nIGNvbnRpbnVlCi0JCQljb3B5RW5kID0gTWF0aC5tYXgoY29weUVuZCwgbGluZUluZGV4KTsKLQkJCXdyaXRlKGxpbmUsIGxpbmVJbmRleCwgY29weUVuZCk7Ci0JCQlpZiAoKHN0eWxlLmZvbnRTdHlsZSAmIFNXVC5CT0xEKSAhPSAwKSB7Ci0JCQkJd3JpdGUoIlxcYjAiKTsgCi0JCQl9Ci0JCQlpZiAoKHN0eWxlLmZvbnRTdHlsZSAmIFNXVC5JVEFMSUMpICE9IDApIHsKLQkJCQl3cml0ZSgiXFxpMCIpOyAKLQkJCX0KLQkJCWlmIChzdHlsZS51bmRlcmxpbmUpIHsKLQkJCQl3cml0ZSgiXFx1bDAiKTsKLQkJCX0JCQkKLQkJCWlmIChzdHlsZS5zdHJpa2VvdXQpIHsKLQkJCQl3cml0ZSgiXFxzdHJpa2UwIik7Ci0JCQl9Ci0JCQl3cml0ZSgifSIpOwotCQkJbGluZUluZGV4ID0gY29weUVuZDsKLQkJfQotCQkvLyB3cml0ZSB1bnN0eWxlZCB0ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUKLQkJaWYgKGxpbmVJbmRleCA8IGxpbmVFbmRPZmZzZXQpIHsKLQkJCXdyaXRlKGxpbmUsIGxpbmVJbmRleCwgbGluZUVuZE9mZnNldCk7Ci0JCX0KLQkJaWYgKGxpbmVCYWNrZ3JvdW5kICE9IG51bGwpIHsKLQkJCXdyaXRlKCJ9Iik7Ci0JCX0KLQl9Ci0JfQotCS8qKgotCSAqIFRoZSA8Y29kZT5UZXh0V3JpdGVyPC9jb2RlPiBjbGFzcyBpcyB1c2VkIHRvIHdyaXRlIHdpZGdldCBjb250ZW50IHRvCi0JICogYSBzdHJpbmcuICBXaG9sZSBhbmQgcGFydGlhbCBsaW5lcyBhbmQgbGluZSBicmVha3MgY2FuIGJlIHdyaXR0ZW4uIFRvIHdyaXRlIAotCSAqIHBhcnRpYWwgbGluZXMsIHNwZWNpZnkgdGhlIHN0YXJ0IGFuZCBsZW5ndGggb2YgdGhlIGRlc2lyZWQgc2VnbWVudCAKLQkgKiBkdXJpbmcgb2JqZWN0IGNyZWF0aW9uLgotCSAqIDxwPgotCSAqIDwvYj5OT1RFOjwvYj4gPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4gaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gYSB2YWxpZCBzdHJpbmcgb25seSBhZnRlciBjbG9zZSgpIAotCSAqIGhhcyBiZWVuIGNhbGxlZC4gCi0JICovCi0JY2xhc3MgVGV4dFdyaXRlciB7Ci0JCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKLQkJcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQ7CS8vIG9mZnNldCBvZiBmaXJzdCBjaGFyYWN0ZXIgdGhhdCB3aWxsIGJlIHdyaXR0ZW4KLQkJcHJpdmF0ZSBpbnQgZW5kT2Zmc2V0OwkJLy8gb2Zmc2V0IG9mIGxhc3QgY2hhcmFjdGVyIHRoYXQgd2lsbCBiZSB3cml0dGVuLiAKLQkJCQkJCQkJCS8vIDAgYmFzZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3aWRnZXQgdGV4dC4gCi0JCXByaXZhdGUgYm9vbGVhbiBpc0Nsb3NlZCA9IGZhbHNlOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSB3cml0ZXIgdGhhdCB3cml0ZXMgY29udGVudCBzdGFydGluZyBhdCBvZmZzZXQgInN0YXJ0IgotCSAqIGluIHRoZSBkb2N1bWVudC4gIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+bGVuZ3RoPC9jb2RlPiBjYW4gYmUgc2V0IHRvIHNwZWNpZnkgcGFydGlhbCBsaW5lcy4KLQkgKiA8cD4KLQkgKgotCSAqIEBwYXJhbSBzdGFydCBzdGFydCBvZmZzZXQgb2YgY29udGVudCB0byB3cml0ZSwgMCBiYXNlZCBmcm9tIGJlZ2lubmluZyBvZiBkb2N1bWVudAotCSAqIEBwYXJhbSBsZW5ndGggbGVuZ3RoIG9mIGNvbnRlbnQgdG8gd3JpdGUKLQkgKi8KLQlwdWJsaWMgVGV4dFdyaXRlcihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOwotCQlzdGFydE9mZnNldCA9IHN0YXJ0OwotCQllbmRPZmZzZXQgPSBzdGFydCArIGxlbmd0aDsKLQl9Ci0JLyoqCi0JICogQ2xvc2VzIHRoZSB3cml0ZXIuIE9uY2UgY2xvc2VkIG5vIG1vcmUgY29udGVudCBjYW4gYmUgd3JpdHRlbi4KLQkgKiA8Yj5OT1RFOjwvYj4gIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IGlzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybiBhIHZhbGlkIHN0cmluZyB1bmxlc3MKLQkgKiB0aGUgd3JpdGVyIGlzIGNsb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJaWYgKCFpc0Nsb3NlZCkgewotCQkJaXNDbG9zZWQgPSB0cnVlOwotCQl9Ci0JfQotCS8qKiAKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZS4KLQkgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlCi0JICovCi0JcHVibGljIGludCBnZXRDaGFyQ291bnQoKSB7Ci0JCXJldHVybiBlbmRPZmZzZXQgLSBzdGFydE9mZnNldDsKLQl9CQotCS8qKiAKLQkgKiBSZXR1cm5zIHRoZSBvZmZzZXQgd2hlcmUgd3JpdGluZyBzdGFydHMuIDAgYmFzZWQgZnJvbSB0aGUgc3RhcnQgb2YgCi0JICogdGhlIHdpZGdldCB0ZXh0LiBVc2VkIHRvIHdyaXRlIHBhcnRpYWwgbGluZXMuCi0JICogQHJldHVybiB0aGUgaW50ZWdlciBvZmZzZXQgd2hlcmUgd3JpdGluZyBzdGFydHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnRPZmZzZXQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgd3JpdGVyIGlzIGNsb3NlZC4KLQkgKiBAcmV0dXJuIGEgYm9vbGVhbiBzcGVjaWZ5aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB3cml0ZXIgaXMgY2xvc2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCXJldHVybiBpc0Nsb3NlZDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nLiAgPGNvZGU+Y2xvc2UoKTwvY29kZT4gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IAotCSAqIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgdmFsaWQgc3RyaW5nLgotCSAqCi0JICogQHJldHVybiB0aGUgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhlIGRhdGEuCi0JICovCi0Jdm9pZCB3cml0ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoc3RyaW5nKTsKLQl9CQotCS8qKgotCSAqIEluc2VydHMgdGhlIGdpdmVuIHN0cmluZyB0byB0aGUgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLQkgKiBEbyBub3RoaW5nIGlmICJvZmZzZXQiIGlzIDwgMCBvciA+IGdldENoYXJDb3VudCgpCi0JICogPHA+Ci0JICoKLQkgKiBAcGFyYW0gc3RyaW5nIHRleHQgdG8gaW5zZXJ0Ci0JICogQHBhcmFtIG9mZnNldCBvZmZzZXQgaW4gdGhlIGV4aXN0aW5nIGRhdGEgdG8gaW5zZXJ0ICJzdHJpbmciIGF0LgotCSAqLwotCXZvaWQgd3JpdGUoU3RyaW5nIHN0cmluZywgaW50IG9mZnNldCkgewotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXIubGVuZ3RoKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlidWZmZXIuaW5zZXJ0KG9mZnNldCwgc3RyaW5nKTsKLQl9CQotCS8qKgotCSAqIEFwcGVuZHMgdGhlIGdpdmVuIGludCB0byB0aGUgZGF0YS4KLQkgKi8KLQl2b2lkIHdyaXRlKGludCBpKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoaSk7Ci0JfQotCS8qKgotCSAqIEFwcGVuZHMgdGhlIGdpdmVuIGNoYXJhY3RlciB0byB0aGUgZGF0YS4KLQkgKi8KLQl2b2lkIHdyaXRlKGNoYXIgaSkgewotCQlidWZmZXIuYXBwZW5kKGkpOwotCX0JCQkKLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBzcGVjaWZpZWQgbGluZSB0ZXh0IHRvIHRoZSBkYXRhLgotCSAqIDxwPgotCSAqCi0JICogQHBhcmFtIGxpbmUgbGluZSB0ZXh0IHRvIHdyaXRlLiBNdXN0IG5vdCBjb250YWluIGxpbmUgYnJlYWtzCi0JICogCUxpbmUgYnJlYWtzIHNob3VsZCBiZSB3cml0dGVuIHVzaW5nIHdyaXRlTGluZURlbGltaXRlcigpCi0JICogQHBhcmFtIGxpbmVPZmZzZXQgb2Zmc2V0IG9mIHRoZSBsaW5lLiAwIGJhc2VkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSAKLQkgKiAJd2lkZ2V0IGRvY3VtZW50LiBBbnkgdGV4dCBvY2N1cnJpbmcgYmVmb3JlIHRoZSBzdGFydCBvZmZzZXQgb3IgYWZ0ZXIgdGhlIAotCSAqCWVuZCBvZmZzZXQgc3BlY2lmaWVkIGR1cmluZyBvYmplY3QgY3JlYXRpb24gaXMgaWdub3JlZC4KLQkgKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0JICogICA8bGk+RVJST1JfSU8gd2hlbiB0aGUgd3JpdGVyIGlzIGNsb3NlZC48L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHZvaWQgd3JpdGVMaW5lKFN0cmluZyBsaW5lLCBpbnQgbGluZU9mZnNldCkgewotCQlpbnQgbGluZUxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0JCWludCBsaW5lSW5kZXg7Ci0JCWludCBjb3B5RW5kOwotCQlpbnQgd3JpdGVPZmZzZXQgPSBzdGFydE9mZnNldCAtIGxpbmVPZmZzZXQ7Ci0JCQotCQlpZiAoaXNDbG9zZWQpIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU8pOwotCQl9CQkKLQkJaWYgKHdyaXRlT2Zmc2V0ID49IGxpbmVMZW5ndGgpIHsKLQkJCXJldHVybjsJCQkJCQkJLy8gd2hvbGUgbGluZSBpcyBvdXRzaWRlIHdyaXRlIHJhbmdlCi0JCX0KLQkJZWxzZQotCQlpZiAod3JpdGVPZmZzZXQgPiAwKSB7Ci0JCQlsaW5lSW5kZXggPSB3cml0ZU9mZnNldDsJCS8vIGxpbmUgc3RhcnRzIGJlZm9yZSB3cml0ZSBzdGFydAotCQl9Ci0JCWVsc2UgewotCQkJbGluZUluZGV4ID0gMDsKLQkJfQotCQljb3B5RW5kID0gTWF0aC5taW4obGluZUxlbmd0aCwgZW5kT2Zmc2V0IC0gbGluZU9mZnNldCk7Ci0JCWlmIChsaW5lSW5kZXggPCBjb3B5RW5kKSB7Ci0JCQl3cml0ZShsaW5lLnN1YnN0cmluZyhsaW5lSW5kZXgsIGNvcHlFbmQpKTsKLQkJfQkJCi0JfQotCS8qKgotCSAqIEFwcGVuZHMgdGhlIHNwZWNpZmllZCBsaW5lIGRlbG1pbWl0ZXIgdG8gdGhlIGRhdGEuCi0JICogPHA+Ci0JICoKLQkgKiBAcGFyYW0gbGluZURlbGltaXRlciBsaW5lIGRlbGltaXRlciB0byB3cml0ZQotCSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLQkgKiAgIDxsaT5FUlJPUl9JTyB3aGVuIHRoZSB3cml0ZXIgaXMgY2xvc2VkLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZUxpbmVEZWxpbWl0ZXIoU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHsKLQkJaWYgKGlzQ2xvc2VkKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPKTsKLQkJfQotCQl3cml0ZShsaW5lRGVsaW1pdGVyKTsKLQl9Ci0JfQotCS8qKgotCSAqIExpbmVDYWNoZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gY2FsY3VsYXRlIGFuZCBpbnZhbGlkYXRlIAotCSAqIGxpbmUgYmFzZWQgZGF0YS4KLQkgKiBJbXBsZW1lbnRvcnMgbmVlZCB0byByZXR1cm4gYSBsaW5lIHdpZHRoIGluIDxjb2RlPmdldFdpZHRoPC9jb2RlPi4KLQkgKi8KLQlpbnRlcmZhY2UgTGluZUNhY2hlIHsKLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSBsaW5lcyBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydExpbmUgZmlyc3QgbGluZSB0byBjYWxjdWxhdGUKLQkgKiBAcGFyYW0gbGluZUNvdW50IG51bWJlciBvZiBsaW5lcyB0byBjYWxjdWxhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjYWxjdWxhdGUoaW50IHN0YXJ0TGluZSwgaW50IGxpbmVDb3VudCk7Ci0JLyoqCi0JICogUmV0dXJucyBhIHdpZHRoIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSA8Y29kZT5TdHlsZWRUZXh0PC9jb2RlPiAKLQkgKiB3aWRnZXQgdG8gc2l6ZSBhIGhvcml6b250YWwgc2Nyb2xsIGJhci4KLQkgKiA8cD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGxpbmUgd2lkdGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldFdpZHRoKCk7Ci0JLyoqCi0JICogUmVzZXRzIHRoZSBsaW5lcyBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiA8Y29kZT5TdHlsZWRUZXh0LnJlZHJhdygpPC9jb2RlPgotCSAqIGFuZCBhbGxvd3MgaW1wbGVtZW50b3JzIHRvIGNhbGwgcmVkcmF3IHRoZW1zZWx2ZXMgZHVyaW5nIHJlc2V0LgotCSAqIDxwPgotCSAqCi0JICogQHBhcmFtIHN0YXJ0TGluZSB0aGUgZmlyc3QgbGluZSB0byByZXNldAotCSAqIEBwYXJhbSBsaW5lQ291bnQgdGhlIG51bWJlciBvZiBsaW5lcyB0byByZXNldAotCSAqIEBwYXJhbSBjYWxjdWxhdGVNYXhXaWR0aCB0cnVlPWltcGxlbWVudG9ycyBzaG91bGQgcmV0YWluIGEgCi0JICogCXZhbGlkIHdpZHRoIGV2ZW4gaWYgaXQgaXMgYWZmZWN0ZWQgYnkgdGhlIHJlc2V0IG9wZXJhdGlvbi4KLQkgKiAJZmFsc2U9dGhlIHdpZHRoIG1heSBiZSBzZXQgdG8gMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZHJhd1Jlc2V0KGludCBzdGFydExpbmUsIGludCBsaW5lQ291bnQsIGJvb2xlYW4gY2FsY3VsYXRlTWF4V2lkdGgpOwotCS8qKgotCSAqIFJlc2V0cyB0aGUgbGluZXMgaW4gdGhlIHNwZWNpZmllZCByYW5nZS4KLQkgKiA8cD4KLQkgKgotCSAqIEBwYXJhbSBzdGFydExpbmUgdGhlIGZpcnN0IGxpbmUgdG8gcmVzZXQKLQkgKiBAcGFyYW0gbGluZUNvdW50IHRoZSBudW1iZXIgb2YgbGluZXMgdG8gcmVzZXQKLQkgKiBAcGFyYW0gY2FsY3VsYXRlTWF4V2lkdGggdHJ1ZT1pbXBsZW1lbnRvcnMgc2hvdWxkIHJldGFpbiBhIAotCSAqIAl2YWxpZCB3aWR0aCBldmVuIGlmIGl0IGlzIGFmZmVjdGVkIGJ5IHRoZSByZXNldCBvcGVyYXRpb24uCi0JICogCWZhbHNlPXRoZSB3aWR0aCBtYXkgYmUgc2V0IHRvIDAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChpbnQgc3RhcnRMaW5lLCBpbnQgbGluZUNvdW50LCBib29sZWFuIGNhbGN1bGF0ZU1heFdpZHRoKTsKLQkvKiogCi0JICogQ2FsbGVkIHdoZW4gYSB0ZXh0IGNoYW5nZSBvY2N1cnJlZC4KLQkgKiA8cD4KLQkgKgotCSAqIEBwYXJhbSBzdGFydE9mZnNldAl0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSB0ZXh0IGNoYW5nZQotCSAqIEBwYXJhbSBuZXdMaW5lQ291bnQgdGhlIG51bWJlciBvZiBpbnNlcnRlZCBsaW5lcwotCSAqIEBwYXJhbSByZXBsYWNlTGluZUNvdW50IHRoZSBudW1iZXIgb2YgZGVsZXRlZCBsaW5lcwotCSAqIEBwYXJhbSBuZXdDaGFyQ291bnQgdGhlIG51bWJlciBvZiBuZXcgY2hhcmFjdGVycwotCSAqIEBwYXJhbSByZXBsYWNlQ2hhckNvdW50IHRoZSBudW1iZXIgb2YgZGVsZXRlZCBjaGFyYWN0ZXJzCi0JICovICAKLQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChpbnQgc3RhcnRPZmZzZXQsIGludCBuZXdMaW5lQ291bnQsIGludCByZXBsYWNlTGluZUNvdW50LCBpbnQgbmV3Q2hhckNvdW50LCBpbnQgcmVwbGFjZUNoYXJDb3VudCk7Ci0JfQotCS8qKgotCSAqIEtlZXBzIHRyYWNrIG9mIGxpbmUgd2lkdGhzIGFuZCB0aGUgbG9uZ2VzdCBsaW5lIGluIHRoZSAKLQkgKiBTdHlsZWRUZXh0IGRvY3VtZW50LgotCSAqIExpbmUgd2lkdGhzIGFyZSBjYWxjdWxhdGVkIHdoZW4gcmVxdWVzdGVkIGJ5IGEgY2FsbCB0byAKLQkgKiA8Y29kZT5jYWxjdWxhdGU8L2NvZGU+IGFuZCBjYWNoZWQgdW50aWwgcmVzZXQgYnkgYSBjYWxsIAotCSAqIHRvIDxjb2RlPnJlZHJhd1Jlc2V0PC9jb2RlPiBvciA8Y29kZT5yZXNldDwvY29kZT4uCi0JICovCi0JY2xhc3MgQ29udGVudFdpZHRoQ2FjaGUgaW1wbGVtZW50cyBMaW5lQ2FjaGUgewotCQlTdHlsZWRUZXh0IHBhcmVudDsJCQkJLy8gcGFyZW50IHdpZGdldCwgdXNlZCB0byBjcmVhdGUgYSBHQyBmb3IgbGluZSBtZWFzdXJpbmcKLQkJaW50W10gbGluZVdpZHRoOwkJCQkvLyB3aWR0aCBpbiBwaXhlbCBvZiBlYWNoIGxpbmUgaW4gdGhlIGRvY3VtZW50LCAtMSBmb3IgdW5rbm93biB3aWR0aAotCQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50OwkJLy8gY29udGVudCB0byB1c2UgZm9yIGxpbmUgd2lkdGggY2FsY3VsYXRpb24KLQkJaW50IGxpbmVDb3VudDsJCQkJCS8vIG51bWJlciBvZiBsaW5lcyBpbiBsaW5lV2lkdGggYXJyYXkKLQkJaW50IG1heFdpZHRoOwkJCQkJLy8gbWF4aW11bSBsaW5lIHdpZHRoIG9mIGFsbCBtZWFzdXJlZCBsaW5lcwotCQlpbnQgbWF4V2lkdGhMaW5lSW5kZXg7CQkJLy8gaW5kZXggb2YgdGhlIHdpZGVzdCBsaW5lCi0JCQkJCi0JLyoqIAotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udGVudFdpZHRoQ2FjaGU8L2NvZGU+IGFuZCBhbGxvY2F0ZXMgc3BhY2UgCi0JICogZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgbGluZXMuCi0JICogPHA+Ci0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBTdHlsZWRUZXh0IHdpZGdldCB1c2VkIHRvIGNyZWF0ZSBhIEdDIGZvciAKLQkgKiAJbGluZSBtZWFzdXJpbmcKLQkgKiBAcGFyYW0gY29udGVudCBhIFN0eWxlZFRleHRDb250ZW50IGNvbnRhaW5pbmcgdGhlIGluaXRpYWwgbnVtYmVyCi0JICogIG9mIGxpbmVzIHRvIGFsbG9jYXRlIHNwYWNlIGZvcgotCSAqLwotCXB1YmxpYyBDb250ZW50V2lkdGhDYWNoZShTdHlsZWRUZXh0IHBhcmVudCwgU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5jb250ZW50ID0gY29udGVudDsKLQkJdGhpcy5saW5lQ291bnQgPSBjb250ZW50LmdldExpbmVDb3VudCgpOwotCQlsaW5lV2lkdGggPSBuZXcgaW50W2xpbmVDb3VudF07Ci0JCXJlc2V0KDAsIGxpbmVDb3VudCwgZmFsc2UpOwotCX0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIHJhbmdlIGlmIGl0IGhhcwotCSAqIG5vdCBiZWVuIGNhbGN1bGF0ZWQgeWV0LgotCSAqIElmIGFueSBsaW5lIGluIHRoZSBnaXZlbiByYW5nZSBpcyB3aWRlciB0aGFuIHRoZSBjdXJyZW50bHkgd2lkZXN0Ci0JICogbGluZSwgdGhlIG1heGltdW0gbGluZSB3aWR0aCBpcyB1cGRhdGVkLAotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydExpbmUgZmlyc3QgbGluZSB0byBjYWxjdWxhdGUgdGhlIGxpbmUgd2lkdGggb2YKLQkgKiBAcGFyYW0gbGluZUNvdW50IG51bWJlciBvZiBsaW5lcyB0byBjYWxjdWxhdGUgdGhlIGxpbmUgd2lkdGggZm9yCi0JICovCi0JcHVibGljIHZvaWQgY2FsY3VsYXRlKGludCBzdGFydExpbmUsIGludCBsaW5lQ291bnQpIHsKLQkJaW50IGNhcmV0V2lkdGggPSAwOwotCQlpbnQgZW5kTGluZSA9IHN0YXJ0TGluZSArIGxpbmVDb3VudDsKLQkJCQotCQlpZiAoc3RhcnRMaW5lIDwgMCB8fCBlbmRMaW5lID4gbGluZVdpZHRoLmxlbmd0aCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWNhcmV0V2lkdGggPSBnZXRDYXJldFdpZHRoKCk7Ci0JCWZvciAoaW50IGkgPSBzdGFydExpbmU7IGkgPCBlbmRMaW5lOyBpKyspIHsKLQkJCWlmIChsaW5lV2lkdGhbaV0gPT0gLTEpIHsKLQkJCQlTdHJpbmcgbGluZSA9IGNvbnRlbnQuZ2V0TGluZShpKTsKLQkJCQlpbnQgbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGkpOwotCQkJCWxpbmVXaWR0aFtpXSA9IGNvbnRlbnRXaWR0aChsaW5lLCBsaW5lT2Zmc2V0KSArIGNhcmV0V2lkdGg7Ci0JCQl9Ci0JCQlpZiAobGluZVdpZHRoW2ldID4gbWF4V2lkdGgpIHsKLQkJCQltYXhXaWR0aCA9IGxpbmVXaWR0aFtpXTsKLQkJCQltYXhXaWR0aExpbmVJbmRleCA9IGk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqIAotCSAqIENhbGN1bGF0ZXMgdGhlIHdpZHRoIG9mIHRoZSB2aXNpYmxlIGxpbmVzIGluIHRoZSBzcGVjaWZpZWQgCi0JICogcmFuZ2UuCi0JICogPHA+Ci0JICoKLQkgKiBAcGFyYW0gc3RhcnRMaW5lCXRoZSBmaXJzdCBjaGFuZ2VkIGxpbmUKLQkgKiBAcGFyYW0gbmV3TGluZUNvdW50IHRoZSBudW1iZXIgb2YgaW5zZXJ0ZWQgbGluZXMKLQkgKi8gIAotCXZvaWQgY2FsY3VsYXRlVmlzaWJsZShpbnQgc3RhcnRMaW5lLCBpbnQgbmV3TGluZUNvdW50KSB7Ci0JCWludCB0b3BJbmRleCA9IHBhcmVudC5nZXRUb3BJbmRleCgpOwotCQlpbnQgYm90dG9tTGluZSA9IE1hdGgubWluKGdldFBhcnRpYWxCb3R0b21JbmRleCgpLCBzdGFydExpbmUgKyBuZXdMaW5lQ291bnQpOwotCQkKLQkJc3RhcnRMaW5lID0gTWF0aC5tYXgoc3RhcnRMaW5lLCB0b3BJbmRleCk7Ci0JCWNhbGN1bGF0ZShzdGFydExpbmUsIGJvdHRvbUxpbmUgLSBzdGFydExpbmUgKyAxKTsKLQl9Ci0JLyoqCi0JICogTWVhc3VyZXMgdGhlIHdpZHRoIG9mIHRoZSBnaXZlbiBsaW5lLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIHRvIG1lYXN1cmUKLQkgKiBAcGFyYW0gbGluZU9mZnNldCBzdGFydCBvZmZzZXQgb2YgdGhlIGxpbmUgdG8gbWVhc3VyZSwgcmVsYXRpdmUgCi0JICogCXRvIHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4gbGluZQotCSAqLwotCWludCBjb250ZW50V2lkdGgoU3RyaW5nIGxpbmUsIGludCBsaW5lT2Zmc2V0KSB7Ci0JCVRleHRMYXlvdXQgbGF5b3V0ID0gcmVuZGVyZXIuZ2V0VGV4dExheW91dChsaW5lLCBsaW5lT2Zmc2V0KTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBsYXlvdXQuZ2V0TGluZUJvdW5kcygwKTsKLQkJcmVuZGVyZXIuZGlzcG9zZVRleHRMYXlvdXQobGF5b3V0KTsKLQkJcmV0dXJuIHJlY3QueCArIHJlY3Qud2lkdGggKyBsZWZ0TWFyZ2luICsgcmlnaHRNYXJnaW47Ci0JfQotCS8qKgotCSAqIEdyb3dzIHRoZSA8Y29kZT5saW5lV2lkdGg8L2NvZGU+IGFycmF5IHRvIGFjY29tb2RhdGUgbmV3IGxpbmUgd2lkdGgKLQkgKiBpbmZvcm1hdGlvbi4KLQkgKiA8cD4KLQkgKgotCSAqIEBwYXJhbSBudW1MaW5lcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGluY3JlYXNlIHRoZSBhcnJheSBieQotCSAqLwotCXZvaWQgZXhwYW5kTGluZXMoaW50IG51bUxpbmVzKSB7Ci0JCWludCBzaXplID0gbGluZVdpZHRoLmxlbmd0aDsKLQkJaWYgKHNpemUgLSBsaW5lQ291bnQgPj0gbnVtTGluZXMpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnRbXSBuZXdMaW5lcyA9IG5ldyBpbnRbTWF0aC5tYXgoc2l6ZSAqIDIsIHNpemUgKyBudW1MaW5lcyldOwotCQlTeXN0ZW0uYXJyYXljb3B5KGxpbmVXaWR0aCwgMCwgbmV3TGluZXMsIDAsIHNpemUpOwotCQlsaW5lV2lkdGggPSBuZXdMaW5lczsKLQkJcmVzZXQoc2l6ZSwgbGluZVdpZHRoLmxlbmd0aCAtIHNpemUsIGZhbHNlKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgd2lkdGggb2YgdGhlIGxvbmdlc3QgbWVhc3VyZWQgbGluZS4KLQkgKiA8cD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBsb25nZXN0IG1lYXN1cmVkIGxpbmUuCi0JICovCi0JcHVibGljIGludCBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIG1heFdpZHRoOwotCX0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBsaW5lIHdpZHRoIGFycmF5IHRvIHJlZmxlY3QgaW5zZXJ0ZWQgb3IgZGVsZXRlZCBsaW5lcy4KLQkgKiA8cD4KLQkgKgotCSAqIEBwYXJhbSBzdGFydExpbmUJdGhlIHN0YXJ0aW5nIGxpbmUgb2YgdGhlIGNoYW5nZSB0aGF0IHRvb2sgcGxhY2UKLQkgKiBAcGFyYW0gZGVsdGEJdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgY2hhbmdlLCA+IDAgaW5kaWNhdGVzIGxpbmVzIGluc2VydGVkLAotCSAqIAk8IDAgaW5kaWNhdGVzIGxpbmVzIGRlbGV0ZWQKLQkgKi8KLQl2b2lkIGxpbmVzQ2hhbmdlZChpbnQgc3RhcnRMaW5lLCBpbnQgZGVsdGEpIHsKLQkJYm9vbGVhbiBpbnNlcnRpbmcgPSBkZWx0YSA+IDA7Ci0JCQotCQlpZiAoZGVsdGEgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChpbnNlcnRpbmcpIHsKLQkJCS8vIHNoaWZ0IHRoZSBsaW5lcyBkb3duIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IGxpbmVzCi0JCQlleHBhbmRMaW5lcyhkZWx0YSk7Ci0JCQlmb3IgKGludCBpID0gbGluZUNvdW50IC0gMTsgaSA+PSBzdGFydExpbmU7IGktLSkgewotCQkJCWxpbmVXaWR0aFtpICsgZGVsdGFdID0gbGluZVdpZHRoW2ldOwotCQkJfQotCQkJLy8gcmVzZXQgdGhlIG5ldyBsaW5lcwotCQkJZm9yIChpbnQgaSA9IHN0YXJ0TGluZSArIDE7IGkgPD0gc3RhcnRMaW5lICsgZGVsdGEgJiYgaSA8IGxpbmVXaWR0aC5sZW5ndGg7IGkrKykgewotCQkJCWxpbmVXaWR0aFtpXSA9IC0xOwotCQkJfQotCQkJLy8gaGF2ZSBuZXcgbGluZXMgYmVlbiBpbnNlcnRlZCBhYm92ZSB0aGUgbG9uZ2VzdCBsaW5lPwotCQkJaWYgKG1heFdpZHRoTGluZUluZGV4ID49IHN0YXJ0TGluZSkgewotCQkJCW1heFdpZHRoTGluZUluZGV4ICs9IGRlbHRhOwotCQkJfQotCQl9IAotCQllbHNlIHsKLQkJCS8vIHNoaWZ0IHVwIHRoZSBsaW5lcwotCQkJZm9yIChpbnQgaSA9IHN0YXJ0TGluZSAtIGRlbHRhOyBpIDwgbGluZUNvdW50OyBpKyspIHsKLQkJCQlsaW5lV2lkdGhbaStkZWx0YV0gPSBsaW5lV2lkdGhbaV07Ci0JCQl9Ci0JCQkvLyBoYXMgdGhlIGxvbmdlc3QgbGluZSBiZWVuIHJlbW92ZWQ/Ci0JCQlpZiAobWF4V2lkdGhMaW5lSW5kZXggPiBzdGFydExpbmUgJiYgbWF4V2lkdGhMaW5lSW5kZXggPD0gc3RhcnRMaW5lIC0gZGVsdGEpIHsKLQkJCQltYXhXaWR0aCA9IDA7Ci0JCQkJbWF4V2lkdGhMaW5lSW5kZXggPSAtMTsKLQkJCX0KLQkJCWVsc2UKLQkJCWlmIChtYXhXaWR0aExpbmVJbmRleCA+PSBzdGFydExpbmUgLSBkZWx0YSkgewotCQkJCW1heFdpZHRoTGluZUluZGV4ICs9IGRlbHRhOwotCQkJfQotCQl9Ci0JCWxpbmVDb3VudCArPSBkZWx0YTsKLQl9Ci0JLyoqCi0JICogUmVzZXRzIHRoZSBsaW5lIHdpZHRoIG9mIHRoZSBsaW5lcyBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLgotCSAqIDxwPgotCSAqCi0JICogQHBhcmFtIHN0YXJ0TGluZQl0aGUgZmlyc3QgbGluZSB0byByZXNldAotCSAqIEBwYXJhbSBsaW5lQ291bnQgdGhlIG51bWJlciBvZiBsaW5lcyB0byByZXNldAotCSAqIEBwYXJhbSBjYWxjdWxhdGVNYXhXaWR0aCB0cnVlPWlmIHRoZSB3aWRlc3QgbGluZSBpcyBiZWluZyAKLQkgKiAJcmVzZXQgdGhlIG1heGltdW0gd2lkdGggb2YgYWxsIHJlbWFpbmluZyBjYWNoZWQgbGluZXMgaXMgCi0JICogCWNhbGN1bGF0ZWQuIGZhbHNlPXRoZSBtYXhpbXVtIHdpZHRoIGlzIHNldCB0byAwIGlmIHRoZSAKLQkgKiAJd2lkZXN0IGxpbmUgaXMgYmVpbmcgcmVzZXQuCi0JICovCi0JcHVibGljIHZvaWQgcmVkcmF3UmVzZXQoaW50IHN0YXJ0TGluZSwgaW50IGxpbmVDb3VudCwgYm9vbGVhbiBjYWxjdWxhdGVNYXhXaWR0aCkgewotCQlyZXNldChzdGFydExpbmUsIGxpbmVDb3VudCwgY2FsY3VsYXRlTWF4V2lkdGgpOwotCX0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGxpbmUgd2lkdGggb2YgdGhlIGxpbmVzIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuCi0JICogPHA+Ci0JICoKLQkgKiBAcGFyYW0gc3RhcnRMaW5lCXRoZSBmaXJzdCBsaW5lIHRvIHJlc2V0Ci0JICogQHBhcmFtIGxpbmVDb3VudCB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIHJlc2V0Ci0JICogQHBhcmFtIGNhbGN1bGF0ZU1heFdpZHRoIHRydWU9aWYgdGhlIHdpZGVzdCBsaW5lIGlzIGJlaW5nIAotCSAqIAlyZXNldCB0aGUgbWF4aW11bSB3aWR0aCBvZiBhbGwgcmVtYWluaW5nIGNhY2hlZCBsaW5lcyBpcyAKLQkgKiAJY2FsY3VsYXRlZC4gZmFsc2U9dGhlIG1heGltdW0gd2lkdGggaXMgc2V0IHRvIDAgaWYgdGhlIAotCSAqIAl3aWRlc3QgbGluZSBpcyBiZWluZyByZXNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChpbnQgc3RhcnRMaW5lLCBpbnQgbGluZUNvdW50LCBib29sZWFuIGNhbGN1bGF0ZU1heFdpZHRoKSB7Ci0JCWludCBlbmRMaW5lID0gc3RhcnRMaW5lICsgbGluZUNvdW50OwotCQkKLQkJaWYgKHN0YXJ0TGluZSA8IDAgfHwgZW5kTGluZSA+IGxpbmVXaWR0aC5sZW5ndGgpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gc3RhcnRMaW5lOyBpIDwgZW5kTGluZTsgaSsrKSB7Ci0JCQlsaW5lV2lkdGhbaV0gPSAtMTsKLQkJfQkJCi0JCS8vIGlmIHRoZSBsb25nZXN0IGxpbmUgaXMgb25lIG9mIHRoZSByZXNldCBsaW5lcywgdGhlIG1heGltdW0gbGluZSAKLQkJLy8gd2lkdGggaXMgbm8gbG9uZ2VyIHZhbGlkCi0JCWlmIChtYXhXaWR0aExpbmVJbmRleCA+PSBzdGFydExpbmUgJiYgbWF4V2lkdGhMaW5lSW5kZXggPCBlbmRMaW5lKSB7Ci0JCQltYXhXaWR0aCA9IDA7Ci0JCQltYXhXaWR0aExpbmVJbmRleCA9IC0xOwotCQkJaWYgKGNhbGN1bGF0ZU1heFdpZHRoKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewotCQkJCQlpZiAobGluZVdpZHRoW2ldID4gbWF4V2lkdGgpIHsKLQkJCQkJCW1heFdpZHRoID0gbGluZVdpZHRoW2ldOwotCQkJCQkJbWF4V2lkdGhMaW5lSW5kZXggPSBpOwotCQkJCQl9Ci0JCQkJfQkJCQotCQkJfQotCQl9Ci0JfQotCS8qKiAKLQkgKiBVcGRhdGVzIHRoZSBsaW5lIHdpZHRoIGFycmF5IHRvIHJlZmxlY3QgYSB0ZXh0IGNoYW5nZS4KLQkgKiBMaW5lcyBhZmZlY3RlZCBieSB0aGUgdGV4dCBjaGFuZ2Ugd2lsbCBiZSByZXNldC4KLQkgKiA8cD4KLQkgKgotCSAqIEBwYXJhbSBzdGFydE9mZnNldAl0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSB0ZXh0IGNoYW5nZQotCSAqIEBwYXJhbSBuZXdMaW5lQ291bnQgdGhlIG51bWJlciBvZiBpbnNlcnRlZCBsaW5lcwotCSAqIEBwYXJhbSByZXBsYWNlTGluZUNvdW50IHRoZSBudW1iZXIgb2YgZGVsZXRlZCBsaW5lcwotCSAqIEBwYXJhbSBuZXdDaGFyQ291bnQgdGhlIG51bWJlciBvZiBuZXcgY2hhcmFjdGVycwotCSAqIEBwYXJhbSByZXBsYWNlQ2hhckNvdW50IHRoZSBudW1iZXIgb2YgZGVsZXRlZCBjaGFyYWN0ZXJzCi0JICovICAKLQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChpbnQgc3RhcnRPZmZzZXQsIGludCBuZXdMaW5lQ291bnQsIGludCByZXBsYWNlTGluZUNvdW50LCBpbnQgbmV3Q2hhckNvdW50LCBpbnQgcmVwbGFjZUNoYXJDb3VudCkgewotCQlpbnQgc3RhcnRMaW5lID0gcGFyZW50LmdldExpbmVBdE9mZnNldChzdGFydE9mZnNldCk7Ci0JCWJvb2xlYW4gcmVtb3ZlZE1heExpbmUgPSAobWF4V2lkdGhMaW5lSW5kZXggPiBzdGFydExpbmUgJiYgbWF4V2lkdGhMaW5lSW5kZXggPD0gc3RhcnRMaW5lICsgcmVwbGFjZUxpbmVDb3VudCk7Ci0JCS8vIGVudGlyZSB0ZXh0IGRlbGV0ZWQ/Ci0JCWlmIChzdGFydExpbmUgPT0gMCAmJiByZXBsYWNlTGluZUNvdW50ID09IGxpbmVDb3VudCkgewotCQkJbGluZUNvdW50ID0gbmV3TGluZUNvdW50OwotCQkJbGluZVdpZHRoID0gbmV3IGludFtsaW5lQ291bnRdOwotCQkJcmVzZXQoMCwgbGluZUNvdW50LCBmYWxzZSk7Ci0JCQltYXhXaWR0aCA9IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsaW5lc0NoYW5nZWQoc3RhcnRMaW5lLCAtcmVwbGFjZUxpbmVDb3VudCk7Ci0JCQlsaW5lc0NoYW5nZWQoc3RhcnRMaW5lLCBuZXdMaW5lQ291bnQpOwotCQkJbGluZVdpZHRoW3N0YXJ0TGluZV0gPSAtMTsKLQkJfQotCQkvLyBvbmx5IGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSBsaW5lcy4gb3RoZXJ3aXNlIG1lYXN1cmVtZW50cyBvZiBjaGFuZ2VkIGxpbmVzIAotCQkvLyBvdXRzaWRlIHRoZSB2aXNpYmxlIGFyZWEgbWF5IHN1YnNlcXVlbnRseSBjaGFuZ2UgYWdhaW4gd2l0aG91dCB0aGUgCi0JCS8vIGxpbmVzIGV2ZXIgYmVpbmcgdmlzaWJsZS4KLQkJY2FsY3VsYXRlVmlzaWJsZShzdGFydExpbmUsIG5ld0xpbmVDb3VudCk7Ci0JCS8vIG1heFdpZHRoTGluZUluZGV4IHdpbGwgYmUgLTEgKGkuZS4sIHVua25vd24gbGluZSB3aWR0aCkgaWYgdGhlIHdpZGdldCBoYXMgCi0JCS8vIG5vdCBiZWVuIHZpc2libGUgeWV0IGFuZCB0aGUgY2hhbmdlZCBsaW5lcyBoYXZlIHRoZXJlZm9yZSBub3QgYmVlbgotCQkvLyBjYWxjdWxhdGVkIGFib3ZlLgotCQlpZiAocmVtb3ZlZE1heExpbmUgfHwgCi0JCQkobWF4V2lkdGhMaW5lSW5kZXggIT0gLTEgJiYgbGluZVdpZHRoW21heFdpZHRoTGluZUluZGV4XSA8IG1heFdpZHRoKSkgewotCQkJLy8gbG9uZ2VzdCBsaW5lIGhhcyBiZWVuIHJlbW92ZWQgb3IgY2hhbmdlZCBhbmQgaXMgbm93IHNob3J0ZXIuCi0JCQkvLyBuZWVkIHRvIHJlY2FsY3VsYXRlIG1heGltdW0gY29udGVudCB3aWR0aCBmb3IgYWxsIGxpbmVzCi0JCQltYXhXaWR0aCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsrKSB7Ci0JCQkJaWYgKGxpbmVXaWR0aFtpXSA+IG1heFdpZHRoKSB7Ci0JCQkJCW1heFdpZHRoID0gbGluZVdpZHRoW2ldOwotCQkJCQltYXhXaWR0aExpbmVJbmRleCA9IGk7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JfQotCX0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBsaW5lIHdyYXBwaW5nIG9mIHRoZSBjb250ZW50LgotCSAqIFRoZSBsaW5lIHdyYXBwaW5nIG11c3QgYWx3YXlzIGJlIGluIGEgY29uc2lzdGVudCBzdGF0ZS4gCi0JICogVGhlcmVmb3JlLCB3aGVuIDxjb2RlPnJlc2V0PC9jb2RlPiBvciA8Y29kZT5yZWRyYXdSZXNldDwvY29kZT4KLQkgKiBpcyBjYWxsZWQsIHRoZSBsaW5lIHdyYXBwaW5nIGlzIHJlY2FsY3VsYXRlZCBpbW1lZGlhdGVseSAKLQkgKiBpbnN0ZWFkIG9mIGluIDxjb2RlPmNhbGN1bGF0ZTwvY29kZT4uCi0JICovCi0JY2xhc3MgV29yZFdyYXBDYWNoZSBpbXBsZW1lbnRzIExpbmVDYWNoZSB7Ci0JCVN0eWxlZFRleHQgcGFyZW50OwotCQlXcmFwcGVkQ29udGVudCB2aXN1YWxDb250ZW50OwotCQkJCQotCS8qKiAKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPldvcmRXcmFwQ2FjaGU8L2NvZGU+IGFuZCBjYWxjdWxhdGVzIGFuIGluaXRpYWwKLQkgKiBsaW5lIHdyYXBwaW5nLgotCSAqIDxwPgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgU3R5bGVkVGV4dCB3aWRnZXQgdG8gd3JhcCBjb250ZW50IGluLgotCSAqIEBwYXJhbSBjb250ZW50IHRoZSBjb250ZW50IHByb3ZpZGVyIHRoYXQgZG9lcyB0aGUgYWN0dWFsIGxpbmUgd3JhcHBpbmcuCi0JICovCi0JcHVibGljIFdvcmRXcmFwQ2FjaGUoU3R5bGVkVGV4dCBwYXJlbnQsIFdyYXBwZWRDb250ZW50IGNvbnRlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXZpc3VhbENvbnRlbnQgPSBjb250ZW50OwotCQl2aXN1YWxDb250ZW50LndyYXBMaW5lcygpOwotCX0KLQkvKioKLQkgKiBEbyBub3RoaW5nLiBMaW5lcyBhcmUgd3JhcHBlZCBpbW1lZGlhdGVseSBhZnRlciByZXNldC4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRMaW5lIGZpcnN0IGxpbmUgdG8gY2FsY3VsYXRlCi0JICogQHBhcmFtIGxpbmVDb3VudCBudW1iZXIgb2YgbGluZXMgdG8gY2FsY3VsYXRlCi0JICovCi0JcHVibGljIHZvaWQgY2FsY3VsYXRlKGludCBzdGFydExpbmUsIGludCBsaW5lQ291bnQpIHsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xpZW50IGFyZWEgd2lkdGguIExpbmVzIGFyZSB3cmFwcGVkIHNvIHRoZXJlCi0JICogaXMgbm8gaG9yaXpvbnRhbCBzY3JvbGwgYmFyLgotCSAqIDxwPgotCSAqCi0JICogQHJldHVybiB0aGUgbGluZSB3aWR0aAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCX0KLQkvKioKLQkgKiBXcmFwcyB0aGUgbGluZXMgaW4gdGhlIHNwZWNpZmllZCByYW5nZS4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gPGNvZGU+U3R5bGVkVGV4dC5yZWRyYXcoKTwvY29kZT4uCi0JICogQSByZWRyYXcgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkuCi0JICogPHA+Ci0JICoKLQkgKiBAcGFyYW0gc3RhcnRMaW5lIHRoZSBmaXJzdCBsaW5lIHRvIHJlc2V0Ci0JICogQHBhcmFtIGxpbmVDb3VudCB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIHJlc2V0Ci0JICogQHBhcmFtIGNhbGN1bGF0ZU1heFdpZHRoIHRydWU9aW1wbGVtZW50b3JzIHNob3VsZCByZXRhaW4gYSAKLQkgKiAJdmFsaWQgd2lkdGggZXZlbiBpZiBpdCBpcyBhZmZlY3RlZCBieSB0aGUgcmVzZXQgb3BlcmF0aW9uLgotCSAqIAlmYWxzZT10aGUgd2lkdGggbWF5IGJlIHNldCB0byAwCi0JICovCi0JcHVibGljIHZvaWQgcmVkcmF3UmVzZXQoaW50IHN0YXJ0TGluZSwgaW50IGxpbmVDb3VudCwgYm9vbGVhbiBjYWxjdWxhdGVNYXhXaWR0aCkgewotCSAgICBpZiAobGluZUNvdW50ID09IHZpc3VhbENvbnRlbnQuZ2V0TGluZUNvdW50KCkpIHsKLQkJCS8vIGRvIGEgZnVsbCByZXdyYXAgaWYgYWxsIGxpbmVzIGFyZSByZXNldAotCQkJdmlzdWFsQ29udGVudC53cmFwTGluZXMoKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJICAgIHZpc3VhbENvbnRlbnQucmVzZXQoc3RhcnRMaW5lLCBsaW5lQ291bnQpOwotCSAgICB9Ci0JfQotCS8qKgotCSAqIFJld3JhcHMgdGhlIGxpbmVzIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UgYW5kIHJlZHJhd3MKLQkgKiB0aGUgd2lkZ2V0IGlmIHRoZSBsaW5lIHdyYXBwaW5nIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqCi0JICogQHBhcmFtIHN0YXJ0TGluZSB0aGUgZmlyc3QgbGluZSB0byByZXNldAotCSAqIEBwYXJhbSBsaW5lQ291bnQgdGhlIG51bWJlciBvZiBsaW5lcyB0byByZXNldAotCSAqIEBwYXJhbSBjYWxjdWxhdGVNYXhXaWR0aCB0cnVlPWltcGxlbWVudG9ycyBzaG91bGQgcmV0YWluIGEgCi0JICogCXZhbGlkIHdpZHRoIGV2ZW4gaWYgaXQgaXMgYWZmZWN0ZWQgYnkgdGhlIHJlc2V0IG9wZXJhdGlvbi4KLQkgKiAJZmFsc2U9dGhlIHdpZHRoIG1heSBiZSBzZXQgdG8gMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGludCBzdGFydExpbmUsIGludCBsaW5lQ291bnQsIGJvb2xlYW4gY2FsY3VsYXRlTWF4V2lkdGgpIHsKLQkJaW50IGl0ZW1Db3VudCA9IGdldFBhcnRpYWxCb3R0b21JbmRleCgpIC0gdG9wSW5kZXggKyAxOwotCSAgICBpbnRbXSBvbGRMaW5lT2Zmc2V0cyA9IG5ldyBpbnRbaXRlbUNvdW50XTsKLQkgICAgCi0JICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKLQkgICAgCW9sZExpbmVPZmZzZXRzW2ldID0gdmlzdWFsQ29udGVudC5nZXRPZmZzZXRBdExpbmUoaSArIHRvcEluZGV4KTsKLQkgICAgfQotCSAgICByZWRyYXdSZXNldChzdGFydExpbmUsIGxpbmVDb3VudCwgY2FsY3VsYXRlTWF4V2lkdGgpOwotCQkvLyBjaGVjayBmb3IgY2FzZXMgd2hpY2ggd2lsbCByZXF1aXJlIGEgZnVsbCByZWRyYXcKLQkgICAgaWYgKGdldFBhcnRpYWxCb3R0b21JbmRleCgpIC0gdG9wSW5kZXggKyAxICE9IGl0ZW1Db3VudCkgewotCSAgICAJLy8gbnVtYmVyIG9mIHZpc2libGUgbGluZXMgaGFzIGNoYW5nZWQKLQkgICAgCXBhcmVudC5pbnRlcm5hbFJlZHJhdygpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgewotCQkgICAgCWlmICh2aXN1YWxDb250ZW50LmdldE9mZnNldEF0TGluZShpICsgdG9wSW5kZXgpICE9IG9sZExpbmVPZmZzZXRzW2ldKSB7Ci0JCSAgICAJCS8vIHdyYXBwaW5nIG9mIG9uZSBvZiB0aGUgdmlzaWJsZSBsaW5lcyBoYXMgY2hhbmdlZAotCQkgICAgCQlwYXJlbnQuaW50ZXJuYWxSZWRyYXcoKTsKLQkJICAgIAkJYnJlYWs7Ci0JCSAgICAJfQotCSAgICAJfQkgICAgCQotCSAgICB9Ci0JfQotCS8qKiAKLQkgKiBQYXNzZXMgdGhlIHRleHQgY2hhbmdlIG5vdGlmaWNhdGlvbiB0byB0aGUgbGluZSB3cmFwIGNvbnRlbnQuCi0JICogPHA+Ci0JICoKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQJdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgdGV4dCBjaGFuZ2UKLQkgKiBAcGFyYW0gbmV3TGluZUNvdW50IHRoZSBudW1iZXIgb2YgaW5zZXJ0ZWQgbGluZXMKLQkgKiBAcGFyYW0gcmVwbGFjZUxpbmVDb3VudCB0aGUgbnVtYmVyIG9mIGRlbGV0ZWQgbGluZXMKLQkgKiBAcGFyYW0gbmV3Q2hhckNvdW50IHRoZSBudW1iZXIgb2YgbmV3IGNoYXJhY3RlcnMKLQkgKiBAcGFyYW0gcmVwbGFjZUNoYXJDb3VudCB0aGUgbnVtYmVyIG9mIGRlbGV0ZWQgY2hhcmFjdGVycwotCSAqLyAgCi0JcHVibGljIHZvaWQgdGV4dENoYW5nZWQoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbmV3TGluZUNvdW50LCBpbnQgcmVwbGFjZUxpbmVDb3VudCwgaW50IG5ld0NoYXJDb3VudCwgaW50IHJlcGxhY2VDaGFyQ291bnQpIHsKLQkJaW50IHN0YXJ0TGluZSA9IHZpc3VhbENvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJdmlzdWFsQ29udGVudC50ZXh0Q2hhbmdlZChzdGFydE9mZnNldCwgbmV3TGluZUNvdW50LCByZXBsYWNlTGluZUNvdW50LCBuZXdDaGFyQ291bnQsIHJlcGxhY2VDaGFyQ291bnQpOwotCi0JCS8vIGlmIHdlIGFyZSB3cmFwcGluZyB0aGVuIGl0IGlzIHBvc3NpYmxlIGZvciBhIGRlbGV0aW9uIG9uIHRoZSBsYXN0Ci0JCS8vIGxpbmUgb2YgdGV4dCB0byBzaG9ydGVuIHRoZSB0b3RhbCB0ZXh0IGxlbmd0aCBieSBhIGxpbmUuICBJZiB0aGlzCi0JCS8vIG9jY3VycyB0aGVuIHRoZSBzdGFydEluZGV4IG11c3QgYmUgYWRqdXN0ZWQgc3VjaCB0aGF0IGEgcmVkcmF3IHdpbGwKLQkJLy8gYmUgcGVyZm9ybWVkIGlmIGEgdmlzaWJsZSByZWdpb24gaXMgYWZmZWN0ZWQuICBmaXhlcyBidWcgNDI5NDcuCi0JCWlmICh3b3JkV3JhcCkgewotCQkJaW50IGxpbmVDb3VudCA9IGNvbnRlbnQuZ2V0TGluZUNvdW50KCk7Ci0JCQlpZiAoc3RhcnRMaW5lID49IGxpbmVDb3VudCkgc3RhcnRMaW5lID0gbGluZUNvdW50IC0gMTsgIAotCQl9Ci0JCWlmIChzdGFydExpbmUgPD0gZ2V0UGFydGlhbEJvdHRvbUluZGV4KCkpIHsKLQkJCS8vIG9ubHkgcmVkcmF3IGlmIHRoZSB0ZXh0IGNoYW5nZSBhZmZlY3RzIHRleHQgaW5zaWRlIG9yIGFib3ZlIAotCQkJLy8gdGhlIHZpc2libGUgbGluZXMuIGlmIGl0IGlzIGJlbG93IHRoZSB2aXNpYmxlIGxpbmVzIGl0IHdpbGwKLQkJCS8vIG5vdCBhZmZlY3QgdGhlIHdvcmQgd3JhcHBpbmcuIGZpeGVzIGJ1ZyAxNDA0Ny4KLQkJCXBhcmVudC5pbnRlcm5hbFJlZHJhdygpOwotCQl9Ci0JfQotCX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gaXRzIHBhcmVudAotICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0gKiA8cD4KLSAqIFRoZSBzdHlsZSB2YWx1ZSBpcyBlaXRoZXIgb25lIG9mIHRoZSBzdHlsZSBjb25zdGFudHMgZGVmaW5lZCBpbgotICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0gKiBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlciAKLSAqICh0aGF0IGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlCi0gKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCi0gKiBsaXN0cyB0aGUgc3R5bGUgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGNsYXNzLgotICogU3R5bGUgYml0cyBhcmUgYWxzbyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0gKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHdpZGdldCB0byBjb25zdHJ1Y3QKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSBTV1QjRlVMTF9TRUxFQ1RJT04KLSAqIEBzZWUgU1dUI01VTFRJCi0gKiBAc2VlIFNXVCNSRUFEX09OTFkKLSAqIEBzZWUgU1dUI1NJTkdMRQotICogQHNlZSBTV1QjV1JBUAotICogQHNlZSAjZ2V0U3R5bGUKLSAqLwotcHVibGljIFN0eWxlZFRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0Jc3VwZXIocGFyZW50LCBjaGVja1N0eWxlKHN0eWxlIHwgU1dULk5PX1JFRFJBV19SRVNJWkUgfCBTV1QuTk9fQkFDS0dST1VORCkpOwotCS8vIHNldCB0aGUgYmcvZmcgaW4gdGhlIE9TIHRvIGVuc3VyZSB0aGF0IHRoZXNlIGFyZSB0aGUgc2FtZSBhcyBTdHlsZWRUZXh0LCBuZWNlc3NhcnkKLQkvLyBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgYmcvZmcgdGhlIElNRSBib3ggdXNlcyBpcyB0aGUgc2FtZSBhcyB3aGF0IFN0eWxlZFRleHQgdXNlcwotCXN1cGVyLnNldEZvcmVncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsKLQlzdXBlci5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0JRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCWlzTWlycm9yZWQgPSAoc3VwZXIuZ2V0U3R5bGUoKSAmIFNXVC5NSVJST1JFRCkgIT0gMDsKLQlpZiAoKHN0eWxlICYgU1dULlJFQURfT05MWSkgIT0gMCkgewotCQlzZXRFZGl0YWJsZShmYWxzZSk7Ci0JfQotCWxlZnRNYXJnaW4gPSByaWdodE1hcmdpbiA9IGlzQmlkaUNhcmV0KCkgPyBCSURJX0NBUkVUX1dJRFRIIC0gMTogMDsKLQlpZiAoKHN0eWxlICYgU1dULlNJTkdMRSkgIT0gMCAmJiAoc3R5bGUgJiBTV1QuQk9SREVSKSAhPSAwKSB7Ci0JCWxlZnRNYXJnaW4gPSB0b3BNYXJnaW4gPSByaWdodE1hcmdpbiA9IGJvdHRvbU1hcmdpbiA9IDI7Ci0JfQotCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoZGlzcGxheSk7Ci0JaW5zdGFsbERlZmF1bHRDb250ZW50KCk7Ci0JaW5pdGlhbGl6ZVJlbmRlcmVyKCk7Ci0JaWYgKChzdHlsZSAmIFNXVC5XUkFQKSAhPSAwKSB7Ci0JCXNldFdvcmRXcmFwKHRydWUpOwotCX0KLQllbHNlIHsKLQkJbGluZUNhY2hlID0gbmV3IENvbnRlbnRXaWR0aENhY2hlKHRoaXMsIGNvbnRlbnQpOwotCX0JCi0JZGVmYXVsdENhcmV0ID0gbmV3IENhcmV0KHRoaXMsIFNXVC5OVUxMKTsKLQlpZiAoaXNCaWRpQ2FyZXQoKSkgewotCQljcmVhdGVDYXJldEJpdG1hcHMoKTsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaW50IGRpcmVjdGlvbiA9IEJpZGlVdGlsLmdldEtleWJvYXJkTGFuZ3VhZ2UoKSA9PSBCaWRpVXRpbC5LRVlCT0FSRF9CSURJID8gU1dULlJJR0hUIDogU1dULkxFRlQ7Ci0JCQkJaWYgKGRpcmVjdGlvbiA9PSBjYXJldERpcmVjdGlvbikgcmV0dXJuOwotCQkJCWlmIChnZXRDYXJldCgpICE9IGRlZmF1bHRDYXJldCkgcmV0dXJuOwotCQkJCWludCBsaW5lSW5kZXggPSBnZXRDYXJldExpbmUoKTsKLQkJCQlTdHJpbmcgbGluZSA9IGNvbnRlbnQuZ2V0TGluZShsaW5lSW5kZXgpOwotCQkJCWludCBsaW5lT2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZUluZGV4KTsKLQkJCQlpbnQgb2Zmc2V0SW5MaW5lID0gY2FyZXRPZmZzZXQgLSBsaW5lT2Zmc2V0OwotCQkJCWludCBuZXdDYXJldFggPSBnZXRYQXRPZmZzZXQobGluZSwgbGluZUluZGV4LCBvZmZzZXRJbkxpbmUpOwotCQkJCXNldENhcmV0TG9jYXRpb24obmV3Q2FyZXRYLCBnZXRDYXJldExpbmUoKSwgZGlyZWN0aW9uKTsKLQkJCX0KLQkJfTsKLQkJQmlkaVV0aWwuYWRkTGFuZ3VhZ2VMaXN0ZW5lcihoYW5kbGUsIHJ1bm5hYmxlKTsKLQl9Ci0Jc2V0Q2FyZXQoZGVmYXVsdENhcmV0KTsJCi0JY2FsY3VsYXRlU2Nyb2xsQmFycygpOwotCWNyZWF0ZUtleUJpbmRpbmdzKCk7Ci0JaWJlYW1DdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfSUJFQU0pOwotCXNldEN1cnNvcihpYmVhbUN1cnNvcik7Ci0JaW5zdGFsbExpc3RlbmVycygpOwotCWluc3RhbGxEZWZhdWx0TGluZVN0eWxlcigpOwotCWluaXRpYWxpemVBY2Nlc3NpYmxlKCk7Ci19Ci0vKioJIAotICogQWRkcyBhbiBleHRlbmRlZCBtb2RpZnkgbGlzdGVuZXIuIEFuIEV4dGVuZGVkTW9kaWZ5IGV2ZW50IGlzIHNlbnQgYnkgdGhlIAotICogd2lkZ2V0IHdoZW4gdGhlIHdpZGdldCB0ZXh0IGhhcyBjaGFuZ2VkLgotICogPHA+Ci0gKgotICogQHBhcmFtIGV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihFeHRlbmRlZE1vZGlmeUxpc3RlbmVyIGV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChleHRlbmRlZE1vZGlmeUxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JU3R5bGVkVGV4dExpc3RlbmVyIHR5cGVkTGlzdGVuZXIgPSBuZXcgU3R5bGVkVGV4dExpc3RlbmVyKGV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIpOwotCWFkZExpc3RlbmVyKEV4dGVuZGVkTW9kaWZ5LCB0eXBlZExpc3RlbmVyKTsKLX0KLS8qKiAKLSAqIE1hcHMgYSBrZXkgdG8gYW4gYWN0aW9uLgotICogT25lIGFjdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIE4ga2V5cy4gSG93ZXZlciwgZWFjaCBrZXkgY2FuIG9ubHkgCi0gKiBoYXZlIG9uZSBhY3Rpb24gKGtleTphY3Rpb24gaXMgTjoxIHJlbGF0aW9uKS4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBrZXkgYSBrZXkgY29kZSBkZWZpbmVkIGluIFNXVC5qYXZhIG9yIGEgY2hhcmFjdGVyLiAKLSAqIAlPcHRpb25hbGx5IE9SZCB3aXRoIGEgc3RhdGUgbWFzay4gIFByZWZlcnJlZCBzdGF0ZSBtYXNrcyBhcmUgb25lIG9yIG1vcmUgb2YKLSAqICBTV1QuTU9EMSwgU1dULk1PRDIsIFNXVC5NT0QzLCBzaW5jZSB0aGVzZSBtYXNrcyBhY2NvdW50IGZvciBtb2RpZmllciBwbGF0Zm9ybSAKLSAqICBkaWZmZXJlbmNlcy4gIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSBjYXNlcyB3aGVyZSB1c2luZyB0aGUgc3BlY2lmaWMgc3RhdGUgbWFza3MKLSAqICAoaS5lLiwgU1dULkNUUkwsIFNXVC5TSElGVCwgU1dULkFMVCwgU1dULkNPTU1BTkQpIG1ha2VzIHNlbnNlLgotICogQHBhcmFtIGFjdGlvbiBvbmUgb2YgdGhlIHByZWRlZmluZWQgYWN0aW9ucyBkZWZpbmVkIGluIFNULmphdmEuIAotICogCVVzZSBTV1QuTlVMTCB0byByZW1vdmUgYSBrZXkgYmluZGluZy4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0S2V5QmluZGluZyhpbnQga2V5LCBpbnQgYWN0aW9uKSB7Ci0JY2hlY2tXaWRnZXQoKTsgCi0JCi0JaW50IGtleVZhbHVlID0ga2V5ICYgU1dULktFWV9NQVNLOwotCWludCBtb2RpZmllclZhbHVlID0ga2V5ICYgU1dULk1PRElGSUVSX01BU0s7Ci0JY2hhciBrZXlDaGFyID0gKGNoYXIpa2V5VmFsdWU7Ci0KLQlpZiAoQ29tcGF0aWJpbGl0eS5pc0xldHRlcihrZXlDaGFyKSkgewotCQkvLyBtYWtlIHRoZSBrZXliaW5kaW5nIGNhc2UgaW5zZW5zaXRpdmUgYnkgYWRkaW5nIGl0Ci0JCS8vIGluIGl0cyB1cHBlciBhbmQgbG93ZXIgY2FzZSBmb3JtCi0JCWNoYXIgY2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2Uoa2V5Q2hhcik7Ci0JCWludCBuZXdLZXkgPSBjaCB8IG1vZGlmaWVyVmFsdWU7Ci0JCWlmIChhY3Rpb24gPT0gU1dULk5VTEwpIHsKLQkJCWtleUFjdGlvbk1hcC5yZW1vdmUobmV3IEludGVnZXIobmV3S2V5KSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAJa2V5QWN0aW9uTWFwLnB1dChuZXcgSW50ZWdlcihuZXdLZXkpLCBuZXcgSW50ZWdlcihhY3Rpb24pKTsKLQkJfQotCQljaCA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShrZXlDaGFyKTsKLQkJbmV3S2V5ID0gY2ggfCBtb2RpZmllclZhbHVlOwotCQlpZiAoYWN0aW9uID09IFNXVC5OVUxMKSB7Ci0JCQlrZXlBY3Rpb25NYXAucmVtb3ZlKG5ldyBJbnRlZ2VyKG5ld0tleSkpOwotCQl9Ci0JCWVsc2UgewotCQkgCWtleUFjdGlvbk1hcC5wdXQobmV3IEludGVnZXIobmV3S2V5KSwgbmV3IEludGVnZXIoYWN0aW9uKSk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoYWN0aW9uID09IFNXVC5OVUxMKSB7Ci0JCQlrZXlBY3Rpb25NYXAucmVtb3ZlKG5ldyBJbnRlZ2VyKGtleSkpOwotCQl9Ci0JCWVsc2UgewotCQkgCWtleUFjdGlvbk1hcC5wdXQobmV3IEludGVnZXIoa2V5KSwgbmV3IEludGVnZXIoYWN0aW9uKSk7Ci0JCX0KLQl9Ci0JCQotfQotLyoqCi0gKiBBZGRzIGEgYmlkaXJlY3Rpb25hbCBzZWdtZW50IGxpc3RlbmVyLiBBIEJpZGlTZWdtZW50RXZlbnQgaXMgc2VudCAKLSAqIHdoZW5ldmVyIGEgbGluZSBvZiB0ZXh0IGlzIG1lYXN1cmVkIG9yIHJlbmRlcmVkLiBUaGUgdXNlciBjYW4gCi0gKiBzcGVjaWZ5IHRleHQgcmFuZ2VzIGluIHRoZSBsaW5lIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgaWYgdGhleSAKLSAqIGhhZCBhIGRpZmZlcmVudCBkaXJlY3Rpb24gdGhhbiB0aGUgc3Vycm91bmRpbmcgdGV4dC4KLSAqIFRoaXMgbWF5IGJlIHVzZWQgd2hlbiBhZGphY2VudCBzZWdtZW50cyBvZiByaWdodC10by1sZWZ0IHRleHQgc2hvdWxkCi0gKiBub3QgYmUgcmVvcmRlcmVkIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuIAotICogRS5nLiwgTXVsdGlwbGUgSmF2YSBzdHJpbmcgbGl0ZXJhbHMgaW4gYSByaWdodC10by1sZWZ0IGxhbmd1YWdlCi0gKiBzaG91bGQgZ2VuZXJhbGx5IHJlbWFpbiBpbiBsb2dpY2FsIG9yZGVyIHRvIGVhY2ggb3RoZXIsIHRoYXQgaXMsIHRoZQotICogd2F5IHRoZXkgYXJlIHN0b3JlZC4gCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBzZWUgQmlkaVNlZ21lbnRFdmVudAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgdm9pZCBhZGRCaWRpU2VnbWVudExpc3RlbmVyKEJpZGlTZWdtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JfQotCVN0eWxlZFRleHRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFN0eWxlZFRleHRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JYWRkTGlzdGVuZXIoTGluZUdldFNlZ21lbnRzLCB0eXBlZExpc3RlbmVyKTsJCi19Ci0vKioKLSAqIEFkZHMgYSBsaW5lIGJhY2tncm91bmQgbGlzdGVuZXIuIEEgTGluZUdldEJhY2tncm91bmQgZXZlbnQgaXMgc2VudCBieSB0aGUgCi0gKiB3aWRnZXQgdG8gZGV0ZXJtaW5lIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZvciBhIGxpbmUuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lcihMaW5lQmFja2dyb3VuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAoIXVzZXJMaW5lQmFja2dyb3VuZCkgewotCQlyZW1vdmVMaW5lQmFja2dyb3VuZExpc3RlbmVyKGRlZmF1bHRMaW5lU3R5bGVyKTsKLQkJZGVmYXVsdExpbmVTdHlsZXIuc2V0TGluZUJhY2tncm91bmQoMCwgbG9naWNhbENvbnRlbnQuZ2V0TGluZUNvdW50KCksIG51bGwpOwotCQl1c2VyTGluZUJhY2tncm91bmQgPSB0cnVlOwotCX0JCi0JU3R5bGVkVGV4dExpc3RlbmVyIHR5cGVkTGlzdGVuZXIgPSBuZXcgU3R5bGVkVGV4dExpc3RlbmVyKGxpc3RlbmVyKTsKLQlhZGRMaXN0ZW5lcihMaW5lR2V0QmFja2dyb3VuZCwgdHlwZWRMaXN0ZW5lcik7CQotfQotLyoqCi0gKiBBZGRzIGEgbGluZSBzdHlsZSBsaXN0ZW5lci4gQSBMaW5lR2V0U3R5bGUgZXZlbnQgaXMgc2VudCBieSB0aGUgd2lkZ2V0IHRvIAotICogZGV0ZXJtaW5lIHRoZSBzdHlsZXMgZm9yIGEgbGluZS4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBhZGRMaW5lU3R5bGVMaXN0ZW5lcihMaW5lU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9Ci0JaWYgKCF1c2VyTGluZVN0eWxlKSB7Ci0JCXJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKGRlZmF1bHRMaW5lU3R5bGVyKTsKLQkJZGVmYXVsdExpbmVTdHlsZXIuc2V0U3R5bGVSYW5nZShudWxsKTsKLQkJdXNlckxpbmVTdHlsZSA9IHRydWU7Ci0JfQotCVN0eWxlZFRleHRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFN0eWxlZFRleHRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JYWRkTGlzdGVuZXIoTGluZUdldFN0eWxlLCB0eXBlZExpc3RlbmVyKTsJCi19Ci0vKioJIAotICogQWRkcyBhIG1vZGlmeSBsaXN0ZW5lci4gQSBNb2RpZnkgZXZlbnQgaXMgc2VudCBieSB0aGUgd2lkZ2V0IHdoZW4gdGhlIHdpZGdldCB0ZXh0IAotICogaGFzIGNoYW5nZWQuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gbW9kaWZ5TGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChtb2RpZnlMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JfQotCVR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBUeXBlZExpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQlhZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0eXBlZExpc3RlbmVyKTsKLX0KLS8qKgkgCi0gKiBBZGRzIGEgc2VsZWN0aW9uIGxpc3RlbmVyLiBBIFNlbGVjdGlvbiBldmVudCBpcyBzZW50IGJ5IHRoZSB3aWRnZXQgd2hlbiB0aGUgCi0gKiBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0gKiA8cD4KLSAqIFdoZW4gPGNvZGU+d2lkZ2V0U2VsZWN0ZWQ8L2NvZGU+IGlzIGNhbGxlZCwgdGhlIGV2ZW50IHggYW1kIHkgZmllbGRzIGNvbnRhaW4KLSAqIHRoZSBzdGFydCBhbmQgZW5kIGNhcmV0IGluZGljZXMgb2YgdGhlIHNlbGVjdGlvbi4KLSAqIDxjb2RlPndpZGdldERlZmF1bHRTZWxlY3RlZDwvY29kZT4gaXMgbm90IGNhbGxlZCBmb3IgU3R5bGVkVGV4dHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9Ci0JVHlwZWRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFR5cGVkTGlzdGVuZXIobGlzdGVuZXIpOwotCWFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHR5cGVkTGlzdGVuZXIpOwkKLX0KLS8qKgkgCi0gKiBBZGRzIGEgdmVyaWZ5IGtleSBsaXN0ZW5lci4gQSBWZXJpZnlLZXkgZXZlbnQgaXMgc2VudCBieSB0aGUgd2lkZ2V0IHdoZW4gYSBrZXkgCi0gKiBpcyBwcmVzc2VkLiBUaGUgd2lkZ2V0IGlnbm9yZXMgdGhlIGtleSBwcmVzcyBpZiB0aGUgbGlzdGVuZXIgc2V0cyB0aGUgZG9pdCBmaWVsZCAKLSAqIG9mIHRoZSBldmVudCB0byBmYWxzZS4gCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgYWRkVmVyaWZ5S2V5TGlzdGVuZXIoVmVyaWZ5S2V5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JfQotCVN0eWxlZFRleHRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFN0eWxlZFRleHRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JYWRkTGlzdGVuZXIoVmVyaWZ5S2V5LCB0eXBlZExpc3RlbmVyKTsJCi19Ci0vKioJIAotICogQWRkcyBhIHZlcmlmeSBsaXN0ZW5lci4gQSBWZXJpZnkgZXZlbnQgaXMgc2VudCBieSB0aGUgd2lkZ2V0IHdoZW4gdGhlIHdpZGdldCB0ZXh0IAotICogaXMgYWJvdXQgdG8gY2hhbmdlLiBUaGUgbGlzdGVuZXIgY2FuIHNldCB0aGUgZXZlbnQgdGV4dCBhbmQgdGhlIGRvaXQgZmllbGQgdG8gCi0gKiBjaGFuZ2UgdGhlIHRleHQgdGhhdCBpcyBzZXQgaW4gdGhlIHdpZGdldCBvciB0byBmb3JjZSB0aGUgd2lkZ2V0IHRvIGlnbm9yZSB0aGUgCi0gKiB0ZXh0IGNoYW5nZS4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSB2ZXJpZnlMaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBhZGRWZXJpZnlMaXN0ZW5lcihWZXJpZnlMaXN0ZW5lciB2ZXJpZnlMaXN0ZW5lcikgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKHZlcmlmeUxpc3RlbmVyID09IG51bGwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9Ci0JVHlwZWRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFR5cGVkTGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCWFkZExpc3RlbmVyKFNXVC5WZXJpZnksIHR5cGVkTGlzdGVuZXIpOwotfQotLyoqIAotICogQXBwZW5kcyBhIHN0cmluZyB0byB0aGUgdGV4dCBhdCB0aGUgZW5kIG9mIHRoZSB3aWRnZXQuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdG8gYmUgYXBwZW5kZWQKLSAqIEBzZWUgI3JlcGxhY2VUZXh0UmFuZ2UoaW50LGludCxTdHJpbmcpCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyBzdHJpbmcpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCX0KLQlpbnQgbGFzdENoYXIgPSBNYXRoLm1heChnZXRDaGFyQ291bnQoKSwgMCk7Ci0JcmVwbGFjZVRleHRSYW5nZShsYXN0Q2hhciwgMCwgc3RyaW5nKTsKLX0KLS8qKgotICogQ2FsY3VsYXRlcyB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB2aXNpYmxlIGxpbmUuCi0gKi8KLXZvaWQgY2FsY3VsYXRlQ29udGVudFdpZHRoKCkgewotCWxpbmVDYWNoZSA9IGdldExpbmVDYWNoZShjb250ZW50KTsKLQlsaW5lQ2FjaGUuY2FsY3VsYXRlKHRvcEluZGV4LCBnZXRQYXJ0aWFsQm90dG9tSW5kZXgoKSAtIHRvcEluZGV4ICsgMSk7Ci19Ci0vKioKLSAqIENhbGN1bGF0ZXMgdGhlIHNjcm9sbCBiYXJzCi0gKi8KLXZvaWQgY2FsY3VsYXRlU2Nyb2xsQmFycygpIHsKLQlTY3JvbGxCYXIgaG9yaXpvbnRhbEJhciA9IGdldEhvcml6b250YWxCYXIoKTsKLQlTY3JvbGxCYXIgdmVydGljYWxCYXIgPSBnZXRWZXJ0aWNhbEJhcigpOwotCQotCXNldFNjcm9sbEJhcnMoKTsKLQlpZiAodmVydGljYWxCYXIgIT0gbnVsbCkgewotCQl2ZXJ0aWNhbEJhci5zZXRJbmNyZW1lbnQoZ2V0VmVydGljYWxJbmNyZW1lbnQoKSk7Ci0JfQkKLQlpZiAoaG9yaXpvbnRhbEJhciAhPSBudWxsKSB7Ci0JCWhvcml6b250YWxCYXIuc2V0SW5jcmVtZW50KGdldEhvcml6b250YWxJbmNyZW1lbnQoKSk7Ci0JfQotfQotLyoqCi0gKiBDYWxjdWxhdGVzIHRoZSB0b3AgaW5kZXggYmFzZWQgb24gdGhlIGN1cnJlbnQgdmVydGljYWwgc2Nyb2xsIG9mZnNldC4KLSAqIFRoZSB0b3AgaW5kZXggaXMgdGhlIGluZGV4IG9mIHRoZSB0b3Btb3N0IGZ1bGx5IHZpc2libGUgbGluZSBvciB0aGUKLSAqIHRvcG1vc3QgcGFydGlhbGx5IHZpc2libGUgbGluZSBpZiBubyBsaW5lIGlzIGZ1bGx5IHZpc2libGUuCi0gKiBUaGUgdG9wIGluZGV4IHN0YXJ0cyBhdCAwLgotICovCi12b2lkIGNhbGN1bGF0ZVRvcEluZGV4KCkgewotCWludCBvbGRUb3BJbmRleCA9IHRvcEluZGV4OwotCWludCB2ZXJ0aWNhbEluY3JlbWVudCA9IGdldFZlcnRpY2FsSW5jcmVtZW50KCk7Ci0JaW50IGNsaWVudEFyZWFIZWlnaHQgPSBnZXRDbGllbnRBcmVhKCkuaGVpZ2h0OwotCQotCWlmICh2ZXJ0aWNhbEluY3JlbWVudCA9PSAwKSB7Ci0JCXJldHVybjsKLQl9Ci0JdG9wSW5kZXggPSBDb21wYXRpYmlsaXR5LmNlaWwodmVydGljYWxTY3JvbGxPZmZzZXQsIHZlcnRpY2FsSW5jcmVtZW50KTsKLQkvLyBTZXQgdG9wIGluZGV4IHRvIHBhcnRpYWxseSB2aXNpYmxlIHRvcCBsaW5lIGlmIG5vIGxpbmUgaXMgZnVsbHkgCi0JLy8gdmlzaWJsZSBidXQgYXQgbGVhc3Qgc29tZSBvZiB0aGUgd2lkZ2V0IGNsaWVudCBhcmVhIGlzIHZpc2libGUuCi0JLy8gRml4ZXMgYnVnIDE1MDg4LgotCWlmICh0b3BJbmRleCA+IDApIHsKLQkJaWYgKGNsaWVudEFyZWFIZWlnaHQgPiAwKSB7Ci0JCQlpbnQgYm90dG9tUGl4ZWwgPSB2ZXJ0aWNhbFNjcm9sbE9mZnNldCArIGNsaWVudEFyZWFIZWlnaHQ7Ci0JCQlpbnQgZnVsbExpbmVUb3BQaXhlbCA9IHRvcEluZGV4ICogdmVydGljYWxJbmNyZW1lbnQ7Ci0JCQlpbnQgZnVsbExpbmVWaXNpYmxlSGVpZ2h0ID0gYm90dG9tUGl4ZWwgLSBmdWxsTGluZVRvcFBpeGVsOwotCQkJLy8gc2V0IHRvcCBpbmRleCB0byBwYXJ0aWFsbHkgdmlzaWJsZSBsaW5lIGlmIG5vIGxpbmUgZnVsbHkgZml0cyBpbiAKLQkJCS8vIGNsaWVudCBhcmVhIG9yIGlmIHNwYWNlIGlzIGF2YWlsYWJsZSBidXQgbm90IHVzZWQgKHRoZSBsYXR0ZXIgc2hvdWxkCi0JCQkvLyBuZXZlciBoYXBwZW4gYmVjYXVzZSB3ZSB1c2UgY2xhaW1Cb3R0b21GcmVlU3BhY2UpCi0JCQlpZiAoZnVsbExpbmVWaXNpYmxlSGVpZ2h0IDwgdmVydGljYWxJbmNyZW1lbnQpIHsKLQkJCQl0b3BJbmRleC0tOwotCQkJfQotCQl9Ci0JCWVsc2UgCi0JCWlmICh0b3BJbmRleCA+PSBjb250ZW50LmdldExpbmVDb3VudCgpKSB7Ci0JCQl0b3BJbmRleCA9IGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgLSAxOwotCQl9Ci0JfQotCWlmICh0b3BJbmRleCAhPSBvbGRUb3BJbmRleCkgewotCQl0b3BPZmZzZXQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZSh0b3BJbmRleCk7Ci0JCWxpbmVDYWNoZS5jYWxjdWxhdGUodG9wSW5kZXgsIGdldFBhcnRpYWxCb3R0b21JbmRleCgpIC0gdG9wSW5kZXggKyAxKTsKLQkJc2V0SG9yaXpvbnRhbFNjcm9sbEJhcigpOwotCX0KLX0KLS8qKgotICogSGlkZXMgdGhlIHNjcm9sbCBiYXJzIGlmIHdpZGdldCBpcyBjcmVhdGVkIGluIHNpbmdsZSBsaW5lIG1vZGUuCi0gKi8KLXN0YXRpYyBpbnQgY2hlY2tTdHlsZShpbnQgc3R5bGUpIHsKLQlpZiAoKHN0eWxlICYgU1dULlNJTkdMRSkgIT0gMCkgewotCQlzdHlsZSAmPSB+KFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5XUkFQIHwgU1dULk1VTFRJKTsKLQl9IGVsc2UgewotCQlzdHlsZSB8PSBTV1QuTVVMVEk7Ci0JCWlmICgoc3R5bGUgJiBTV1QuV1JBUCkgIT0gMCkgewotCQkJc3R5bGUgJj0gflNXVC5IX1NDUk9MTDsKLQkJfQotCX0KLQlyZXR1cm4gc3R5bGU7Ci19Ci0vKioKLSAqIFNjcm9sbHMgZG93biB0aGUgdGV4dCB0byB1c2UgbmV3IHNwYWNlIG1hZGUgYXZhaWxhYmxlIGJ5IGEgcmVzaXplIG9yIGJ5IAotICogZGVsZXRlZCBsaW5lcy4KLSAqLwotdm9pZCBjbGFpbUJvdHRvbUZyZWVTcGFjZSgpIHsKLQlpbnQgbmV3VmVydGljYWxPZmZzZXQgPSBNYXRoLm1heCgwLCBjb250ZW50LmdldExpbmVDb3VudCgpICogbGluZUhlaWdodCAtIGdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQotCWlmIChuZXdWZXJ0aWNhbE9mZnNldCA8IHZlcnRpY2FsU2Nyb2xsT2Zmc2V0KSB7Ci0JCS8vIFNjcm9sbCB1cCBzbyB0aGF0IGVtcHR5IGxpbmVzIGJlbG93IGxhc3QgdGV4dCBsaW5lIGFyZSB1c2VkLgotCQkvLyBGaXhlcyAxR0VZSk0wCi0JCXNldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KG5ld1ZlcnRpY2FsT2Zmc2V0LCB0cnVlKTsKLQl9Ci19Ci0vKioKLSAqIFNjcm9sbHMgdGV4dCB0byB0aGUgcmlnaHQgdG8gdXNlIG5ldyBzcGFjZSBtYWRlIGF2YWlsYWJsZSBieSBhIHJlc2l6ZS4KLSAqLwotdm9pZCBjbGFpbVJpZ2h0RnJlZVNwYWNlKCkgewotCWludCBuZXdIb3Jpem9udGFsT2Zmc2V0ID0gTWF0aC5tYXgoMCwgbGluZUNhY2hlLmdldFdpZHRoKCkgLSAoZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gbGVmdE1hcmdpbiAtIHJpZ2h0TWFyZ2luKSk7Ci0JCi0JaWYgKG5ld0hvcml6b250YWxPZmZzZXQgPCBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0KSB7CQkJCi0JCS8vIGl0ZW0gaXMgbm8gbG9uZ2VyIGRyYXduIHBhc3QgdGhlIHJpZ2h0IGJvcmRlciBvZiB0aGUgY2xpZW50IGFyZWEKLQkJLy8gYWxpZ24gdGhlIHJpZ2h0IGVuZCBvZiB0aGUgaXRlbSB3aXRoIHRoZSByaWdodCBib3JkZXIgb2YgdGhlIAotCQkvLyBjbGllbnQgYXJlYSAod2luZG93IGlzIHNjcm9sbGVkIHJpZ2h0KS4KLQkJc2Nyb2xsSG9yaXpvbnRhbEJhcihuZXdIb3Jpem9udGFsT2Zmc2V0IC0gaG9yaXpvbnRhbFNjcm9sbE9mZnNldCk7CQkJCQkKLQl9Ci19Ci0vKioKLSAqIENsZWFycyB0aGUgd2lkZ2V0IG1hcmdpbi4KLSAqIAotICogQHBhcmFtIGdjIEdDIHRvIHJlbmRlciBvbgotICogQHBhcmFtIGJhY2tncm91bmQgYmFja2dyb3VuZCBjb2xvciB0byB1c2UgZm9yIGNsZWFyaW5nIHRoZSBtYXJnaW4KLSAqIEBwYXJhbSBjbGllbnRBcmVhIHdpZGdldCBjbGllbnQgYXJlYSBkaW1lbnNpb25zCi0gKi8KLXZvaWQgY2xlYXJNYXJnaW4oR0MgZ2MsIENvbG9yIGJhY2tncm91bmQsIFJlY3RhbmdsZSBjbGllbnRBcmVhLCBpbnQgeSkgewotCS8vIGNsZWFyIHRoZSBtYXJnaW4gYmFja2dyb3VuZAotCWdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0JaWYgKHRvcE1hcmdpbiA+IDApIHsKLQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAteSwgY2xpZW50QXJlYS53aWR0aCwgdG9wTWFyZ2luKTsKLQl9Ci0JaWYgKGJvdHRvbU1hcmdpbiA+IDApIHsKLQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCBjbGllbnRBcmVhLmhlaWdodCAtIGJvdHRvbU1hcmdpbiAtIHksIGNsaWVudEFyZWEud2lkdGgsIGJvdHRvbU1hcmdpbik7Ci0JfQotCWlmIChsZWZ0TWFyZ2luID4gMCkgewotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIC15LCBsZWZ0TWFyZ2luLCBjbGllbnRBcmVhLmhlaWdodCk7Ci0JfQotCWlmIChyaWdodE1hcmdpbiA+IDApIHsKLQkJZ2MuZmlsbFJlY3RhbmdsZShjbGllbnRBcmVhLndpZHRoIC0gcmlnaHRNYXJnaW4sIC15LCByaWdodE1hcmdpbiwgY2xpZW50QXJlYS5oZWlnaHQpOwotCX0KLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgd2lkZ2V0IHNlbGVjdGlvbi4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBzZW5kRXZlbnQgYSBTZWxlY3Rpb24gZXZlbnQgaXMgc2VudCB3aGVuIHNldCB0byB0cnVlIGFuZCB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgYWN0dWFsbHkgcmVzZXQuCi0gKi8KLXZvaWQgY2xlYXJTZWxlY3Rpb24oYm9vbGVhbiBzZW5kRXZlbnQpIHsKLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb24ueDsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uLnk7Ci0JaW50IGxlbmd0aCA9IGNvbnRlbnQuZ2V0Q2hhckNvdW50KCk7Ci0JCi0JcmVzZXRTZWxlY3Rpb24oKTsKLQkvLyByZWRyYXcgb2xkIHNlbGVjdGlvbiwgaWYgYW55Ci0JaWYgKHNlbGVjdGlvbkVuZCAtIHNlbGVjdGlvblN0YXJ0ID4gMCkgewotCQkvLyBjYWxsZWQgaW50ZXJuYWxseSB0byByZW1vdmUgc2VsZWN0aW9uIGFmdGVyIHRleHQgaXMgcmVtb3ZlZAotCQkvLyB0aGVyZWZvcmUgbWFrZSBzdXJlIHJlZHJhdyByYW5nZSBpcyB2YWxpZC4KLQkJaW50IHJlZHJhd1N0YXJ0ID0gTWF0aC5taW4oc2VsZWN0aW9uU3RhcnQsIGxlbmd0aCk7Ci0JCWludCByZWRyYXdFbmQgPSBNYXRoLm1pbihzZWxlY3Rpb25FbmQsIGxlbmd0aCk7Ci0JCWlmIChyZWRyYXdFbmQgLSByZWRyYXdTdGFydCA+IDApIHsKLQkJCWludGVybmFsUmVkcmF3UmFuZ2UocmVkcmF3U3RhcnQsIHJlZHJhd0VuZCAtIHJlZHJhd1N0YXJ0LCB0cnVlKTsKLQkJfQotCQlpZiAoc2VuZEV2ZW50KSB7Ci0JCQlzZW5kU2VsZWN0aW9uRXZlbnQoKTsKLQkJfQotCX0KLX0KLXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZSAoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaW50IGNvdW50LCB3aWR0aCwgaGVpZ2h0OwotCWJvb2xlYW4gc2luZ2xlTGluZSA9IChnZXRTdHlsZSgpICYgU1dULlNJTkdMRSkgIT0gMDsKLQkKLQlpZiAoc2luZ2xlTGluZSkgewotCQljb3VudCA9IDE7Ci0JfSBlbHNlIHsKLQkJY291bnQgPSBjb250ZW50LmdldExpbmVDb3VudCgpOwotCX0KLQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHsKLQkJd2lkdGggPSB3SGludDsKLQl9IAotCWVsc2UgewotCQl3aWR0aCA9IERFRkFVTFRfV0lEVEg7Ci0JfQotCWlmICh3SGludCA9PSBTV1QuREVGQVVMVCkgewotCQlMaW5lQ2FjaGUgY29tcHV0ZUxpbmVDYWNoZSA9IGxpbmVDYWNoZTsKLQkJaWYgKHdvcmRXcmFwKSB7Ci0JCQkvLyBzZXQgbm9uLXdyYXBwaW5nIGNvbnRlbnQgd2lkdGggY2FsY3VsYXRvci4gRW5zdXJlcyBpZGVhbCBsaW5lIHdpZHRoIAotCQkJLy8gdGhhdCBkb2VzIG5vdCByZXF1aXJlZCB3cmFwcGluZy4gRml4ZXMgYnVnIDMxMTk1LgotCQkJY29tcHV0ZUxpbmVDYWNoZSA9IG5ldyBDb250ZW50V2lkdGhDYWNoZSh0aGlzLCBsb2dpY2FsQ29udGVudCk7Ci0JCQlpZiAoIXNpbmdsZUxpbmUpIHsKLQkJCQljb3VudCA9IGxvZ2ljYWxDb250ZW50LmdldExpbmVDb3VudCgpOwotCQkJfQotCQl9Ci0JCS8vIE9ubHkgY2FsY3VsYXRlIHdoYXQgY2FuIGFjdHVhbGx5IGJlIGRpc3BsYXllZC4KLQkJLy8gRG8gdGhpcyBiZWNhdXNlIG1lYXN1cmluZyBlYWNoIHRleHQgbGluZSBpcyBhIAotCQkvLyB0aW1lLWNvbnN1bWluZyBwcm9jZXNzLgotCQlpbnQgdmlzaWJsZUNvdW50ID0gTWF0aC5taW4gKGNvdW50LCBnZXREaXNwbGF5KCkuZ2V0Qm91bmRzKCkuaGVpZ2h0IC8gbGluZUhlaWdodCk7Ci0JCWNvbXB1dGVMaW5lQ2FjaGUuY2FsY3VsYXRlKDAsIHZpc2libGVDb3VudCk7Ci0JCXdpZHRoID0gY29tcHV0ZUxpbmVDYWNoZS5nZXRXaWR0aCgpICsgbGVmdE1hcmdpbiArIHJpZ2h0TWFyZ2luOwotCX0KLQllbHNlCi0JaWYgKHdvcmRXcmFwICYmICFzaW5nbGVMaW5lKSB7Ci0JCS8vIGNhbGN1bGF0ZSB0byB3cmFwIHRvIHdpZHRoIGhpbnQuIEZpeGVzIGJ1ZyAyMDM3Ny4gCi0JCS8vIGRvbid0IHdyYXAgbGl2ZSBjb250ZW50LiBGaXhlcyBidWcgMzgzNDQuCi0JCVdyYXBwZWRDb250ZW50IHdyYXBwZWRDb250ZW50ID0gbmV3IFdyYXBwZWRDb250ZW50KHJlbmRlcmVyLCBsb2dpY2FsQ29udGVudCk7Ci0JCXdyYXBwZWRDb250ZW50LndyYXBMaW5lcyh3aWR0aCk7Ci0JCWNvdW50ID0gd3JhcHBlZENvbnRlbnQuZ2V0TGluZUNvdW50KCk7Ci0JfQotCWlmIChoSGludCAhPSBTV1QuREVGQVVMVCkgewotCQloZWlnaHQgPSBoSGludDsKLQl9IAotCWVsc2UgewotCQloZWlnaHQgPSBjb3VudCAqIGxpbmVIZWlnaHQgKyB0b3BNYXJnaW4gKyBib3R0b21NYXJnaW47Ci0JfQotCS8vIFVzZSBkZWZhdWx0IHZhbHVlcyBpZiBubyB0ZXh0IGlzIGRlZmluZWQuCi0JaWYgKHdpZHRoID09IDApIHsKLQkJd2lkdGggPSBERUZBVUxUX1dJRFRIOwotCX0KLQlpZiAoaGVpZ2h0ID09IDApIHsKLQkJaWYgKHNpbmdsZUxpbmUpIHsKLQkJCWhlaWdodCA9IGxpbmVIZWlnaHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQloZWlnaHQgPSBERUZBVUxUX0hFSUdIVDsKLQkJfQotCX0KLQlSZWN0YW5nbGUgcmVjdCA9IGNvbXB1dGVUcmltKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCXJldHVybiBuZXcgUG9pbnQgKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLX0KLS8qKgotICogQ29waWVzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSA8Y29kZT5ETkQuQ0xJUEJPQVJEPC9jb2RlPiBjbGlwYm9hcmQuCi0gKiBUaGUgdGV4dCB3aWxsIGJlIHB1dCBvbiB0aGUgY2xpcGJvYXJkIGluIHBsYWluIHRleHQgZm9ybWF0IGFuZCBSVEYgZm9ybWF0LgotICogVGhlIDxjb2RlPkRORC5DTElQQk9BUkQ8L2NvZGU+IGNsaXBib2FyZCBpcyB1c2VkIGZvciBkYXRhIHRoYXQgaXMKLSAqICB0cmFuc2ZlcnJlZCBieSBrZXlib2FyZCBhY2NlbGVyYXRvciAoc3VjaCBhcyBDdHJsK0MvQ3RybCtWKSBvciAKLSAqICBieSBtZW51IGFjdGlvbi4KLSAqIAotICogPHA+Ci0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBjb3B5KCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JY29weShETkQuQ0xJUEJPQVJEKTsKLX0KLQotLyoqCi0gKiBDb3BpZXMgdGhlIHNlbGVjdGVkIHRleHQgdG8gdGhlIHNwZWNpZmllZCBjbGlwYm9hcmQuICBUaGUgdGV4dCB3aWxsIGJlIHB1dCBpbiB0aGUgCi0gKiBjbGlwYm9hcmQgaW4gcGxhaW4gdGV4dCBmb3JtYXQgYW5kIFJURiBmb3JtYXQuCi0gKiAKLSAqIDxwPlRoZSBjbGlwYm9hcmRUeXBlIGlzICBvbmUgb2YgdGhlIGNsaXBib2FyZCBjb25zdGFudHMgZGVmaW5lZCBpbiBjbGFzcyAKLSAqIDxjb2RlPkRORDwvY29kZT4uICBUaGUgPGNvZGU+RE5ELkNMSVBCT0FSRDwvY29kZT4gIGNsaXBib2FyZCBpcyAKLSAqIHVzZWQgZm9yIGRhdGEgdGhhdCBpcyB0cmFuc2ZlcnJlZCBieSBrZXlib2FyZCBhY2NlbGVyYXRvciAoc3VjaCBhcyBDdHJsK0MvQ3RybCtWKSAKLSAqIG9yIGJ5IG1lbnUgYWN0aW9uLiAgVGhlIDxjb2RlPkRORC5TRUxFQ1RJT05fQ0xJUEJPQVJEPC9jb2RlPiAKLSAqIGNsaXBib2FyZCBpcyB1c2VkIGZvciBkYXRhIHRoYXQgaXMgdHJhbnNmZXJyZWQgYnkgc2VsZWN0aW5nIHRleHQgYW5kIHBhc3RpbmcgCi0gKiB3aXRoIHRoZSBtaWRkbGUgbW91c2UgYnV0dG9uLjwvcD4KLSAqIAotICogQHBhcmFtIGNsaXBib2FyZFR5cGUgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNsaXBib2FyZAotICoKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgdm9pZCBjb3B5KGludCBjbGlwYm9hcmRUeXBlKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoY2xpcGJvYXJkVHlwZSAhPSBETkQuQ0xJUEJPQVJEICYmIAotCQkgY2xpcGJvYXJkVHlwZSAhPSBETkQuU0VMRUNUSU9OX0NMSVBCT0FSRCkgcmV0dXJuOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54OwotCWlmIChsZW5ndGggPiAwKSB7Ci0JCXRyeSB7Ci0JCQlzZXRDbGlwYm9hcmRDb250ZW50KHNlbGVjdGlvbi54LCBsZW5ndGgsIGNsaXBib2FyZFR5cGUpOwotCQl9Ci0JCWNhdGNoIChTV1RFcnJvciBlcnJvcikgewotCQkJLy8gQ29weSB0byBjbGlwYm9hcmQgZmFpbGVkLiBUaGlzIGhhcHBlbnMgd2hlbiBhbm90aGVyIGFwcGxpY2F0aW9uIAotCQkJLy8gaXMgYWNjZXNzaW5nIHRoZSBjbGlwYm9hcmQgd2hpbGUgd2UgY29weS4gSWdub3JlIHRoZSBlcnJvci4KLQkJCS8vIEZpeGVzIDFHRFFBVk4KLQkJCS8vIFJldGhyb3cgYWxsIG90aGVyIGVycm9ycy4gRml4ZXMgYnVnIDE3NTc4LgotCQkJaWYgKGVycm9yLmNvZGUgIT0gRE5ELkVSUk9SX0NBTk5PVF9TRVRfQ0xJUEJPQVJEKSB7Ci0JCQkJdGhyb3cgZXJyb3I7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCB1c2VzIG9ubHkgdGhlIGxpbmUgZGVsaW1pdGVyIHNwZWNpZmllZCBieSB0aGUgCi0gKiBTdHlsZWRUZXh0Q29udGVudCBpbXBsZW1lbnRhdGlvbi4KLSAqIFJldHVybnMgb25seSB0aGUgZmlyc3QgbGluZSBpZiB0aGUgd2lkZ2V0IGhhcyB0aGUgU1dULlNJTkdMRSBzdHlsZS4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRoYXQgbWF5IGhhdmUgbGluZSBkZWxpbWl0ZXJzIHRoYXQgZG9uJ3QgCi0gKiAJbWF0Y2ggdGhlIG1vZGVsIGxpbmUgZGVsaW1pdGVyLiBQb3NzaWJsZSBsaW5lIGRlbGltaXRlcnMgCi0gKiAJYXJlIENSICgnXHInKSwgTEYgKCdcbicpLCBDUi9MRiAoIlxyXG4iKQotICogQHJldHVybiB0aGUgY29udmVydGVkIHRleHQgdGhhdCBvbmx5IHVzZXMgdGhlIGxpbmUgZGVsaW1pdGVyIAotICogCXNwZWNpZmllZCBieSB0aGUgbW9kZWwuIFJldHVybnMgb25seSB0aGUgZmlyc3QgbGluZSBpZiB0aGUgd2lkZ2V0IAotICogCWhhcyB0aGUgU1dULlNJTkdMRSBzdHlsZS4KLSAqLwotU3RyaW5nIGdldE1vZGVsRGVsaW1pdGVkVGV4dChTdHJpbmcgdGV4dCkgewotCVN0cmluZ0J1ZmZlciBjb252ZXJ0ZWRUZXh0OwotCVN0cmluZyBkZWxpbWl0ZXIgPSBnZXRMaW5lRGVsaW1pdGVyKCk7Ci0JaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7CQotCWludCBjckluZGV4ID0gMDsKLQlpbnQgbGZJbmRleCA9IDA7Ci0JaW50IGkgPSAwOwotCQotCWlmIChsZW5ndGggPT0gMCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JY29udmVydGVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQl3aGlsZSAoaSA8IGxlbmd0aCkgewotCQlpZiAoY3JJbmRleCAhPSAtMSkgewotCQkJY3JJbmRleCA9IHRleHQuaW5kZXhPZihTV1QuQ1IsIGkpOwotCQl9Ci0JCWlmIChsZkluZGV4ICE9IC0xKSB7Ci0JCQlsZkluZGV4ID0gdGV4dC5pbmRleE9mKFNXVC5MRiwgaSk7Ci0JCX0KLQkJaWYgKGxmSW5kZXggPT0gLTEgJiYgY3JJbmRleCA9PSAtMSkgewkvLyBubyBtb3JlIGxpbmUgYnJlYWtzPwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQkJCQkJCQkJCS8vIENSIG9jY3VycyBiZWZvcmUgTEYgb3Igbm8gTEYgcHJlc2VudD8KLQkJaWYgKChjckluZGV4IDwgbGZJbmRleCAmJiBjckluZGV4ICE9IC0xKSB8fCBsZkluZGV4ID09IC0xKSB7CQotCQkJY29udmVydGVkVGV4dC5hcHBlbmQodGV4dC5zdWJzdHJpbmcoaSwgY3JJbmRleCkpOwotCQkJaWYgKGxmSW5kZXggPT0gY3JJbmRleCArIDEpIHsJCS8vIENSL0xGIGNvbWJpbmF0aW9uPwotCQkJCWkgPSBsZkluZGV4ICsgMTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWkgPSBjckluZGV4ICsgMTsKLQkJCX0KLQkJfQotCQllbHNlIHsJCQkJCQkJCQkvLyBMRiBvY2N1cnMgYmVmb3JlIENSIQotCQkJY29udmVydGVkVGV4dC5hcHBlbmQodGV4dC5zdWJzdHJpbmcoaSwgbGZJbmRleCkpOwotCQkJaSA9IGxmSW5kZXggKyAxOwotCQl9Ci0JCWlmIChpc1NpbmdsZUxpbmUoKSkgewotCQkJYnJlYWs7Ci0JCX0KLQkJY29udmVydGVkVGV4dC5hcHBlbmQoZGVsaW1pdGVyKTsKLQl9Ci0JLy8gY29weSByZW1haW5pbmcgdGV4dCBpZiBhbnkgYW5kIGlmIG5vdCBpbiBzaW5nbGUgbGluZSBtb2RlIG9yIG5vIAotCS8vIHRleHQgY29waWVkIHRodXMgZmFyIChiZWNhdXNlIHRoZXJlIG9ubHkgaXMgb25lIGxpbmUpCi0JaWYgKGkgPCBsZW5ndGggJiYgKCFpc1NpbmdsZUxpbmUoKSB8fCBjb252ZXJ0ZWRUZXh0Lmxlbmd0aCgpID09IDApKSB7Ci0JCWNvbnZlcnRlZFRleHQuYXBwZW5kKHRleHQuc3Vic3RyaW5nKGkpKTsKLQl9Ci0JcmV0dXJuIGNvbnZlcnRlZFRleHQudG9TdHJpbmcoKTsKLX0KLS8qKgotICogQ3JlYXRlcyBkZWZhdWx0IGtleSBiaW5kaW5ncy4KLSAqLwotdm9pZCBjcmVhdGVLZXlCaW5kaW5ncygpIHsKLQlpbnQgbmV4dEtleSA9IGlzTWlycm9yZWQoKSA/IFNXVC5BUlJPV19MRUZUIDogU1dULkFSUk9XX1JJR0hUOwotCWludCBwcmV2aW91c0tleSA9IGlzTWlycm9yZWQoKSA/IFNXVC5BUlJPV19SSUdIVCA6IFNXVC5BUlJPV19MRUZUOwotCQotCS8vIE5hdmlnYXRpb24KLQlzZXRLZXlCaW5kaW5nKFNXVC5BUlJPV19VUCwgU1QuTElORV9VUCk7CQotCXNldEtleUJpbmRpbmcoU1dULkFSUk9XX0RPV04sIFNULkxJTkVfRE9XTik7Ci0Jc2V0S2V5QmluZGluZyhTV1QuSE9NRSwgU1QuTElORV9TVEFSVCk7Ci0Jc2V0S2V5QmluZGluZyhTV1QuRU5ELCBTVC5MSU5FX0VORCk7Ci0Jc2V0S2V5QmluZGluZyhTV1QuUEFHRV9VUCwgU1QuUEFHRV9VUCk7Ci0Jc2V0S2V5QmluZGluZyhTV1QuUEFHRV9ET1dOLCBTVC5QQUdFX0RPV04pOwotCXNldEtleUJpbmRpbmcoU1dULkhPTUUgfCBTV1QuTU9EMSwgU1QuVEVYVF9TVEFSVCk7Ci0Jc2V0S2V5QmluZGluZyhTV1QuRU5EIHwgU1dULk1PRDEsIFNULlRFWFRfRU5EKTsKLQlzZXRLZXlCaW5kaW5nKFNXVC5QQUdFX1VQIHwgU1dULk1PRDEsIFNULldJTkRPV19TVEFSVCk7Ci0Jc2V0S2V5QmluZGluZyhTV1QuUEFHRV9ET1dOIHwgU1dULk1PRDEsIFNULldJTkRPV19FTkQpOwotCXNldEtleUJpbmRpbmcobmV4dEtleSwgU1QuQ09MVU1OX05FWFQpOwotCXNldEtleUJpbmRpbmcocHJldmlvdXNLZXksIFNULkNPTFVNTl9QUkVWSU9VUyk7Ci0Jc2V0S2V5QmluZGluZyhuZXh0S2V5IHwgU1dULk1PRDEsIFNULldPUkRfTkVYVCk7Ci0Jc2V0S2V5QmluZGluZyhwcmV2aW91c0tleSB8IFNXVC5NT0QxLCBTVC5XT1JEX1BSRVZJT1VTKTsKLQkKLQkvLyBTZWxlY3Rpb24KLQlzZXRLZXlCaW5kaW5nKFNXVC5BUlJPV19VUCB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfTElORV9VUCk7CQotCXNldEtleUJpbmRpbmcoU1dULkFSUk9XX0RPV04gfCBTV1QuTU9EMiwgU1QuU0VMRUNUX0xJTkVfRE9XTik7Ci0Jc2V0S2V5QmluZGluZyhTV1QuSE9NRSB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfTElORV9TVEFSVCk7Ci0Jc2V0S2V5QmluZGluZyhTV1QuRU5EIHwgU1dULk1PRDIsIFNULlNFTEVDVF9MSU5FX0VORCk7Ci0Jc2V0S2V5QmluZGluZyhTV1QuUEFHRV9VUCB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0Jc2V0S2V5QmluZGluZyhTV1QuUEFHRV9ET1dOIHwgU1dULk1PRDIsIFNULlNFTEVDVF9QQUdFX0RPV04pOwotCXNldEtleUJpbmRpbmcoU1dULkhPTUUgfCBTV1QuTU9EMSB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfVEVYVF9TVEFSVCk7CQotCXNldEtleUJpbmRpbmcoU1dULkVORCB8IFNXVC5NT0QxIHwgU1dULk1PRDIsIFNULlNFTEVDVF9URVhUX0VORCk7Ci0Jc2V0S2V5QmluZGluZyhTV1QuUEFHRV9VUCB8IFNXVC5NT0QxIHwgU1dULk1PRDIsIFNULlNFTEVDVF9XSU5ET1dfU1RBUlQpOwotCXNldEtleUJpbmRpbmcoU1dULlBBR0VfRE9XTiB8IFNXVC5NT0QxIHwgU1dULk1PRDIsIFNULlNFTEVDVF9XSU5ET1dfRU5EKTsKLQlzZXRLZXlCaW5kaW5nKG5leHRLZXkgfCBTV1QuTU9EMiwgU1QuU0VMRUNUX0NPTFVNTl9ORVhUKTsKLQlzZXRLZXlCaW5kaW5nKHByZXZpb3VzS2V5IHwgU1dULk1PRDIsIFNULlNFTEVDVF9DT0xVTU5fUFJFVklPVVMpOwkKLQlzZXRLZXlCaW5kaW5nKG5leHRLZXkgfCBTV1QuTU9EMSB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfV09SRF9ORVhUKTsKLQlzZXRLZXlCaW5kaW5nKHByZXZpb3VzS2V5IHwgU1dULk1PRDEgfCBTV1QuTU9EMiwgU1QuU0VMRUNUX1dPUkRfUFJFVklPVVMpOwotICAgICAgICAgICAJICAJCi0JLy8gTW9kaWZpY2F0aW9uCi0JLy8gQ3V0LCBDb3B5LCBQYXN0ZQotCXNldEtleUJpbmRpbmcoJ1gnIHwgU1dULk1PRDEsIFNULkNVVCk7Ci0Jc2V0S2V5QmluZGluZygnQycgfCBTV1QuTU9EMSwgU1QuQ09QWSk7Ci0Jc2V0S2V5QmluZGluZygnVicgfCBTV1QuTU9EMSwgU1QuUEFTVEUpOwotCS8vIEN1dCwgQ29weSwgUGFzdGUgV29yZHN0YXIgc3R5bGUKLQlzZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMiwgU1QuQ1VUKTsKLQlzZXRLZXlCaW5kaW5nKFNXVC5JTlNFUlQgfCBTV1QuTU9EMSwgU1QuQ09QWSk7Ci0Jc2V0S2V5QmluZGluZyhTV1QuSU5TRVJUIHwgU1dULk1PRDIsIFNULlBBU1RFKTsKLQlzZXRLZXlCaW5kaW5nKFNXVC5CUyB8IFNXVC5NT0QyLCBTVC5ERUxFVEVfUFJFVklPVVMpOwotCQotCXNldEtleUJpbmRpbmcoU1dULkJTLCBTVC5ERUxFVEVfUFJFVklPVVMpOwotCXNldEtleUJpbmRpbmcoU1dULkRFTCwgU1QuREVMRVRFX05FWFQpOwotCXNldEtleUJpbmRpbmcoU1dULkJTIHwgU1dULk1PRDEsIFNULkRFTEVURV9XT1JEX1BSRVZJT1VTKTsKLQlzZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMSwgU1QuREVMRVRFX1dPUkRfTkVYVCk7Ci0JCi0JLy8gTWlzY2VsbGFuZW91cwotCXNldEtleUJpbmRpbmcoU1dULklOU0VSVCwgU1QuVE9HR0xFX09WRVJXUklURSk7Ci19Ci0vKioKLSAqIENyZWF0ZSB0aGUgYml0bWFwcyB0byB1c2UgZm9yIHRoZSBjYXJldCBpbiBiaWRpIG1vZGUuICBUaGlzCi0gKiBtZXRob2Qgb25seSBuZWVkcyB0byBiZSBjYWxsZWQgdXBvbiB3aWRnZXQgY3JlYXRpb24gYW5kIHdoZW4gdGhlCi0gKiBmb250IGNoYW5nZXMgKHRoZSBjYXJldCBiaXRtYXAgaGVpZ2h0IG5lZWRzIHRvIG1hdGNoIGZvbnQgaGVpZ2h0KS4KLSAqLwotdm9pZCBjcmVhdGVDYXJldEJpdG1hcHMoKSB7Ci0JaW50IGNhcmV0V2lkdGggPSBCSURJX0NBUkVUX1dJRFRIOwotCURpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLQlpZiAobGVmdENhcmV0Qml0bWFwICE9IG51bGwpIHsKLQkJaWYgKGRlZmF1bHRDYXJldCAhPSBudWxsICYmIGxlZnRDYXJldEJpdG1hcC5lcXVhbHMoZGVmYXVsdENhcmV0LmdldEltYWdlKCkpKSB7Ci0JCQlkZWZhdWx0Q2FyZXQuc2V0SW1hZ2UobnVsbCk7Ci0JCX0KLQkJbGVmdENhcmV0Qml0bWFwLmRpc3Bvc2UoKTsKLQl9Ci0JbGVmdENhcmV0Qml0bWFwID0gbmV3IEltYWdlKGRpc3BsYXksIGNhcmV0V2lkdGgsIGxpbmVIZWlnaHQpOwotCUdDIGdjID0gbmV3IEdDIChsZWZ0Q2FyZXRCaXRtYXApOyAKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBjYXJldFdpZHRoLCBsaW5lSGVpZ2h0KTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JZ2MuZHJhd0xpbmUoMCwwLDAsbGluZUhlaWdodCk7Ci0JZ2MuZHJhd0xpbmUoMCwwLGNhcmV0V2lkdGgtMSwwKTsKLQlnYy5kcmF3TGluZSgwLDEsMSwxKTsKLQlnYy5kaXNwb3NlKCk7CQotCQotCWlmIChyaWdodENhcmV0Qml0bWFwICE9IG51bGwpIHsKLQkJaWYgKGRlZmF1bHRDYXJldCAhPSBudWxsICYmIHJpZ2h0Q2FyZXRCaXRtYXAuZXF1YWxzKGRlZmF1bHRDYXJldC5nZXRJbWFnZSgpKSkgewotCQkJZGVmYXVsdENhcmV0LnNldEltYWdlKG51bGwpOwotCQl9Ci0JCXJpZ2h0Q2FyZXRCaXRtYXAuZGlzcG9zZSgpOwotCX0KLQlyaWdodENhcmV0Qml0bWFwID0gbmV3IEltYWdlKGRpc3BsYXksIGNhcmV0V2lkdGgsIGxpbmVIZWlnaHQpOwotCWdjID0gbmV3IEdDIChyaWdodENhcmV0Qml0bWFwKTsgCi0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgY2FyZXRXaWR0aCwgbGluZUhlaWdodCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCWdjLmRyYXdMaW5lKGNhcmV0V2lkdGgtMSwwLGNhcmV0V2lkdGgtMSxsaW5lSGVpZ2h0KTsKLQlnYy5kcmF3TGluZSgwLDAsY2FyZXRXaWR0aC0xLDApOwotCWdjLmRyYXdMaW5lKGNhcmV0V2lkdGgtMSwxLDEsMSk7Ci0JZ2MuZGlzcG9zZSgpOwotfQotLyoqCi0gKiBNb3ZlcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLiAgVGhlIHRleHQgd2lsbCBiZSBwdXQgaW4gdGhlIAotICogY2xpcGJvYXJkIGluIHBsYWluIHRleHQgZm9ybWF0IGFuZCBSVEYgZm9ybWF0LgotICogPHA+Ci0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBjdXQoKXsKLQljaGVja1dpZGdldCgpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54OwotCQotCWlmIChsZW5ndGggPiAwKSB7Ci0JCXRyeSB7Ci0JCQlzZXRDbGlwYm9hcmRDb250ZW50KHNlbGVjdGlvbi54LCBsZW5ndGgsIERORC5DTElQQk9BUkQpOwotCQl9Ci0JCWNhdGNoIChTV1RFcnJvciBlcnJvcikgewotCQkJLy8gQ29weSB0byBjbGlwYm9hcmQgZmFpbGVkLiBUaGlzIGhhcHBlbnMgd2hlbiBhbm90aGVyIGFwcGxpY2F0aW9uIAotCQkJLy8gaXMgYWNjZXNzaW5nIHRoZSBjbGlwYm9hcmQgd2hpbGUgd2UgY29weS4gSWdub3JlIHRoZSBlcnJvci4KLQkJCS8vIEZpeGVzIDFHRFFBVk4KLQkJCS8vIFJldGhyb3cgYWxsIG90aGVyIGVycm9ycy4gRml4ZXMgYnVnIDE3NTc4LgotCQkJaWYgKGVycm9yLmNvZGUgIT0gRE5ELkVSUk9SX0NBTk5PVF9TRVRfQ0xJUEJPQVJEKSB7Ci0JCQkJdGhyb3cgZXJyb3I7Ci0JCQl9Ci0JCQkvLyBBYm9ydCBjdXQgb3BlcmF0aW9uIGlmIGNvcHkgdG8gY2xpcGJvYXJkIGZhaWxzLgotCQkJLy8gRml4ZXMgYnVnIDIxMDMwLgotCQkJcmV0dXJuOwotCQl9Ci0JCWRvRGVsZXRlKCk7Ci0JfQotfQotLyoqIAotICogQSBtb3VzZSBtb3ZlIGV2ZW50IGhhcyBvY2N1cnJlZC4gIFNlZSBpZiB3ZSBzaG91bGQgc3RhcnQgYXV0b3Njcm9sbGluZy4gIElmCi0gKiB0aGUgbW92ZSBwb3NpdGlvbiBpcyBvdXRzaWRlIG9mIHRoZSBjbGllbnQgYXJlYSwgaW5pdGlhdGUgYXV0b3Njcm9sbGluZy4gIAotICogT3RoZXJ3aXNlLCB3ZSd2ZSBtb3ZlZCBiYWNrIGludG8gdGhlIHdpZGdldCBzbyBlbmQgYXV0b3Njcm9sbGluZy4KLSAqLwotdm9pZCBkb0F1dG9TY3JvbGwoRXZlbnQgZXZlbnQpIHsKLQlSZWN0YW5nbGUgYXJlYSA9IGdldENsaWVudEFyZWEoKTsJCQotCQotCWlmIChldmVudC55ID4gYXJlYS5oZWlnaHQpIHsKLQkJZG9BdXRvU2Nyb2xsKFNXVC5ET1dOLCBldmVudC55IC0gYXJlYS5oZWlnaHQpOwotCX0KLQllbHNlIAotCWlmIChldmVudC55IDwgMCkgewotCQlkb0F1dG9TY3JvbGwoU1dULlVQLCAtZXZlbnQueSk7Ci0JfQotCWVsc2UgCi0JaWYgKGV2ZW50LnggPCBsZWZ0TWFyZ2luICYmICF3b3JkV3JhcCkgewotCQlkb0F1dG9TY3JvbGwoU1QuQ09MVU1OX1BSRVZJT1VTLCBsZWZ0TWFyZ2luIC0gZXZlbnQueCk7Ci0JfQotCWVsc2UgCi0JaWYgKGV2ZW50LnggPiBhcmVhLndpZHRoIC0gbGVmdE1hcmdpbiAtIHJpZ2h0TWFyZ2luICYmICF3b3JkV3JhcCkgewotCQlkb0F1dG9TY3JvbGwoU1QuQ09MVU1OX05FWFQsIGV2ZW50LnggLSAoYXJlYS53aWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbikpOwotCX0KLQllbHNlIHsKLQkJZW5kQXV0b1Njcm9sbCgpOwotCX0KLX0KLS8qKiAKLSAqIEluaXRpYXRlcyBhdXRvc2Nyb2xsaW5nLgotICogPHA+Ci0gKgotICogQHBhcmFtIGRpcmVjdGlvbiBTV1QuVVAsIFNXVC5ET1dOLCBTV1QuQ09MVU1OX05FWFQsIFNXVC5DT0xVTU5fUFJFVklPVVMKLSAqLwotdm9pZCBkb0F1dG9TY3JvbGwoaW50IGRpcmVjdGlvbiwgaW50IGRpc3RhbmNlKSB7Ci0JUnVubmFibGUgdGltZXIgPSBudWxsOwotCQotCWF1dG9TY3JvbGxEaXN0YW5jZSA9IGRpc3RhbmNlOwotCi0JLy8gSWYgd2UncmUgYWxyZWFkeSBhdXRvc2Nyb2xsaW5nIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24gZG8gbm90aGluZwotCWlmIChhdXRvU2Nyb2xsRGlyZWN0aW9uID09IGRpcmVjdGlvbikgewotCQlyZXR1cm47Ci0JfQotCQotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLQkvLyBTZXQgYSB0aW1lciB0aGF0IHdpbGwgc2ltdWxhdGUgdGhlIHVzZXIgcHJlc3NpbmcgYW5kIGhvbGRpbmcKLQkvLyBkb3duIGEgY3Vyc29yIGtleSAoaS5lLiwgYXJyb3dVcCwgYXJyb3dEb3duKS4KLQlpZiAoZGlyZWN0aW9uID09IFNXVC5VUCkgewotCQl0aW1lciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoYXV0b1Njcm9sbERpcmVjdGlvbiA9PSBTV1QuVVApIHsKLQkJCQkJaW50IGxpbmVzID0gKGF1dG9TY3JvbGxEaXN0YW5jZSAvIGdldExpbmVIZWlnaHQoKSkgKyAxOwotCQkJCQlkb1NlbGVjdGlvblBhZ2VVcChsaW5lcyk7Ci0JCQkJCWRpc3BsYXkudGltZXJFeGVjKFZfU0NST0xMX1JBVEUsIHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYXV0b1Njcm9sbERpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQkJZGlzcGxheS50aW1lckV4ZWMoVl9TQ1JPTExfUkFURSwgdGltZXIpOwotCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IFNXVC5ET1dOKSB7Ci0JCXRpbWVyID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChhdXRvU2Nyb2xsRGlyZWN0aW9uID09IFNXVC5ET1dOKSB7Ci0JCQkJCWludCBsaW5lcyA9IChhdXRvU2Nyb2xsRGlzdGFuY2UgLyBnZXRMaW5lSGVpZ2h0KCkpICsgMTsKLQkJCQkJZG9TZWxlY3Rpb25QYWdlRG93bihsaW5lcyk7Ci0JCQkJCWRpc3BsYXkudGltZXJFeGVjKFZfU0NST0xMX1JBVEUsIHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYXV0b1Njcm9sbERpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQkJZGlzcGxheS50aW1lckV4ZWMoVl9TQ1JPTExfUkFURSwgdGltZXIpOwotCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IFNULkNPTFVNTl9ORVhUKSB7Ci0JCXRpbWVyID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChhdXRvU2Nyb2xsRGlyZWN0aW9uID09IFNULkNPTFVNTl9ORVhUKSB7Ci0JCQkJCWRvVmlzdWFsTmV4dCgpOwotCQkJCQlzZXRNb3VzZVdvcmRTZWxlY3Rpb25BbmNob3IoKTsKLQkJCQkJZG9Nb3VzZVNlbGVjdGlvbigpOwotCQkJCQlkaXNwbGF5LnRpbWVyRXhlYyhIX1NDUk9MTF9SQVRFLCB0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWF1dG9TY3JvbGxEaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0JCWRpc3BsYXkudGltZXJFeGVjKEhfU0NST0xMX1JBVEUsIHRpbWVyKTsKLQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTVC5DT0xVTU5fUFJFVklPVVMpIHsKLQkJdGltZXIgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGF1dG9TY3JvbGxEaXJlY3Rpb24gPT0gU1QuQ09MVU1OX1BSRVZJT1VTKSB7Ci0JCQkJCWRvVmlzdWFsUHJldmlvdXMoKTsKLQkJCQkJc2V0TW91c2VXb3JkU2VsZWN0aW9uQW5jaG9yKCk7Ci0JCQkJCWRvTW91c2VTZWxlY3Rpb24oKTsKLQkJCQkJZGlzcGxheS50aW1lckV4ZWMoSF9TQ1JPTExfUkFURSwgdGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhdXRvU2Nyb2xsRGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCQlkaXNwbGF5LnRpbWVyRXhlYyhIX1NDUk9MTF9SQVRFLCB0aW1lcik7Ci0JfQotfQotLyoqCi0gKiBEZWxldGVzIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIuIERlbGV0ZSB0aGUgc2VsZWN0ZWQgdGV4dCBpZiBhbnkuCi0gKiBNb3ZlIHRoZSBjYXJldCBpbiBmcm9udCBvZiB0aGUgZGVsZXRlZCB0ZXh0LgotICovCi12b2lkIGRvQmFja3NwYWNlKCkgewotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JZXZlbnQudGV4dCA9ICIiOwotCWlmIChzZWxlY3Rpb24ueCAhPSBzZWxlY3Rpb24ueSkgewotCQlldmVudC5zdGFydCA9IHNlbGVjdGlvbi54OwotCQlldmVudC5lbmQgPSBzZWxlY3Rpb24ueTsKLQkJc2VuZEtleUV2ZW50KGV2ZW50KTsKLQl9Ci0JZWxzZQotCWlmIChjYXJldE9mZnNldCA+IDApIHsKLQkJaW50IGxpbmUgPSBjb250ZW50LmdldExpbmVBdE9mZnNldChjYXJldE9mZnNldCk7Ci0JCWludCBsaW5lT2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZSk7CQkJCi0JCi0JCWlmIChjYXJldE9mZnNldCA9PSBsaW5lT2Zmc2V0KSB7Ci0JCQlsaW5lT2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZSAtIDEpOwotCQkJZXZlbnQuc3RhcnQgPSBsaW5lT2Zmc2V0ICsgY29udGVudC5nZXRMaW5lKGxpbmUgLSAxKS5sZW5ndGgoKTsKLQkJCWV2ZW50LmVuZCA9IGNhcmV0T2Zmc2V0OwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGxpbmVUZXh0ID0gY29udGVudC5nZXRMaW5lKGxpbmUpOwotCQkJVGV4dExheW91dCBsYXlvdXQgPSByZW5kZXJlci5nZXRUZXh0TGF5b3V0KGxpbmVUZXh0LCBsaW5lT2Zmc2V0KTsKLQkJCWludCBzdGFydCA9IGxheW91dC5nZXRQcmV2aW91c09mZnNldChjYXJldE9mZnNldCAtIGxpbmVPZmZzZXQsIFNXVC5NT1ZFTUVOVF9DSEFSKTsKLQkJCXJlbmRlcmVyLmRpc3Bvc2VUZXh0TGF5b3V0KGxheW91dCk7IAotCQkJZXZlbnQuc3RhcnQgPSBzdGFydCArIGxpbmVPZmZzZXQ7Ci0JCQlldmVudC5lbmQgPSBjYXJldE9mZnNldDsKLQkJfQotCQlzZW5kS2V5RXZlbnQoZXZlbnQpOwotCX0KLX0KLS8qKgotICogUmVwbGFjZXMgdGhlIHNlbGVjdGlvbiB3aXRoIHRoZSBjaGFyYWN0ZXIgb3IgaW5zZXJ0IHRoZSBjaGFyYWN0ZXIgYXQgdGhlIAotICogY3VycmVudCBjYXJldCBwb3NpdGlvbiBpZiBubyBzZWxlY3Rpb24gZXhpc3RzLgotICogSWYgYSBjYXJyaWFnZSByZXR1cm4gd2FzIHR5cGVkIHJlcGxhY2UgaXQgd2l0aCB0aGUgbGluZSBicmVhayBjaGFyYWN0ZXIgCi0gKiB1c2VkIGJ5IHRoZSB3aWRnZXQgb24gdGhpcyBwbGF0Zm9ybS4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBrZXkgdGhlIGNoYXJhY3RlciB0eXBlZCBieSB0aGUgdXNlcgotICovCi12b2lkIGRvQ29udGVudChjaGFyIGtleSkgewotCUV2ZW50IGV2ZW50OwotCQotCWlmICh0ZXh0TGltaXQgPiAwICYmIAotCQljb250ZW50LmdldENoYXJDb3VudCgpIC0gKHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLngpID49IHRleHRMaW1pdCkgewotCQlyZXR1cm47Ci0JfQkKLQlldmVudCA9IG5ldyBFdmVudCgpOwotCWV2ZW50LnN0YXJ0ID0gc2VsZWN0aW9uLng7Ci0JZXZlbnQuZW5kID0gc2VsZWN0aW9uLnk7Ci0JLy8gcmVwbGFjZSBhIENSIGxpbmUgYnJlYWsgd2l0aCB0aGUgd2lkZ2V0IGxpbmUgYnJlYWsKLQkvLyBDUiBkb2VzIG5vdCBtYWtlIHNlbnNlIG9uIFdpbmRvd3Mgc2luY2UgbW9zdCAoYWxsPykgYXBwbGljYXRpb25zCi0JLy8gZG9uJ3QgcmVjb2duaXplIENSIGFzIGEgbGluZSBicmVhay4KLQlpZiAoa2V5ID09IFNXVC5DUiB8fCBrZXkgPT0gU1dULkxGKSB7Ci0JCWlmICghaXNTaW5nbGVMaW5lKCkpIHsKLQkJCWV2ZW50LnRleHQgPSBnZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCX0KLQl9Ci0JLy8gbm8gc2VsZWN0aW9uIGFuZCBvdmVyd3JpdGUgbW9kZSBpcyBvbiBhbmQgdGhlIHR5cGVkIGtleSBpcyBub3QgYQotCS8vIHRhYiBjaGFyYWN0ZXIgKHRhYnMgYXJlIGFsd2F5cyBpbnNlcnRlZCB3aXRob3V0IG92ZXJ3cml0aW5nKT8KLQllbHNlCi0JaWYgKHNlbGVjdGlvbi54ID09IHNlbGVjdGlvbi55ICYmIG92ZXJ3cml0ZSAmJiBrZXkgIT0gVEFCKSB7Ci0JCWludCBsaW5lSW5kZXggPSBjb250ZW50LmdldExpbmVBdE9mZnNldChldmVudC5lbmQpOwotCQlpbnQgbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxpbmVJbmRleCk7Ci0JCVN0cmluZyBsaW5lID0gY29udGVudC5nZXRMaW5lKGxpbmVJbmRleCk7Ci0JCS8vIHJlcGxhY2UgY2hhcmFjdGVyIGF0IGNhcmV0IG9mZnNldCBpZiB0aGUgY2FyZXQgaXMgbm90IGF0IHRoZSAKLQkJLy8gZW5kIG9mIHRoZSBsaW5lCi0JCWlmIChldmVudC5lbmQgPCBsaW5lT2Zmc2V0ICsgbGluZS5sZW5ndGgoKSkgewotCQkJZXZlbnQuZW5kKys7Ci0JCX0KLQkJZXZlbnQudGV4dCA9IG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7a2V5fSk7Ci0JfQotCWVsc2UgewotCQlldmVudC50ZXh0ID0gbmV3IFN0cmluZyhuZXcgY2hhcltdIHtrZXl9KTsKLQl9Ci0JaWYgKGV2ZW50LnRleHQgIT0gbnVsbCkgewotCQlzZW5kS2V5RXZlbnQoZXZlbnQpOwotCX0KLX0KLS8qKgotICogTW92ZXMgdGhlIGNhcmV0IGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgd2lkZ2V0IGNvbnRlbnQuCi0gKi8KLXZvaWQgZG9Db250ZW50RW5kKCkgewotCS8vIHBsYWNlIGNhcmV0IGF0IGVuZCBvZiBmaXJzdCBsaW5lIGlmIHJlY2VpdmVyIGlzIGluIHNpbmdsZSAKLQkvLyBsaW5lIG1vZGUuIGZpeGVzIDQ4MjAuCi0JaWYgKGlzU2luZ2xlTGluZSgpKSB7Ci0JCWRvTGluZUVuZCgpOwotCX0KLQllbHNlIHsKLQkJaW50IGxlbmd0aCA9IGNvbnRlbnQuZ2V0Q2hhckNvdW50KCk7CQkKLQkJaWYgKGNhcmV0T2Zmc2V0IDwgbGVuZ3RoKSB7Ci0JCQljYXJldE9mZnNldCA9IGxlbmd0aDsKLQkJCXNob3dDYXJldCgpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBNb3ZlcyB0aGUgY2FyZXQgaW4gZnJvbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgd2lkZ2V0IGNvbnRlbnQuCi0gKi8KLXZvaWQgZG9Db250ZW50U3RhcnQoKSB7Ci0JaWYgKGNhcmV0T2Zmc2V0ID4gMCkgewotCQljYXJldE9mZnNldCA9IDA7Ci0JCXNob3dDYXJldCgpOwotCX0KLX0KLS8qKgotICogTW92ZXMgdGhlIGNhcmV0IHRvIHRoZSBzdGFydCBvZiB0aGUgc2VsZWN0aW9uIGlmIGEgc2VsZWN0aW9uIGV4aXN0cy4KLSAqIE90aGVyd2lzZSwgaWYgbm8gc2VsZWN0aW9uIGV4aXN0cyBtb3ZlIHRoZSBjdXJzb3IgYWNjb3JkaW5nIHRvIHRoZSAKLSAqIGN1cnNvciBzZWxlY3Rpb24gcnVsZXMuCi0gKiA8cD4KLSAqCi0gKiBAc2VlICNkb1NlbGVjdGlvbkN1cnNvclByZXZpb3VzCi0gKi8KLXZvaWQgZG9DdXJzb3JQcmV2aW91cygpIHsKLQlhZHZhbmNpbmcgPSBmYWxzZTsKLQlpZiAoc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueCA+IDApIHsKLQkJaW50IGNhcmV0TGluZTsKLQkJCi0JCWNhcmV0T2Zmc2V0ID0gc2VsZWN0aW9uLng7Ci0JCWNhcmV0TGluZSA9IGdldENhcmV0TGluZSgpOwotCQlzaG93Q2FyZXQoY2FyZXRMaW5lKTsKLQl9Ci0JZWxzZSB7Ci0JCWRvU2VsZWN0aW9uQ3Vyc29yUHJldmlvdXMoKTsKLQl9Ci19Ci0vKioKLSAqIE1vdmVzIHRoZSBjYXJldCB0byB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gaWYgYSBzZWxlY3Rpb24gZXhpc3RzLgotICogT3RoZXJ3aXNlLCBpZiBubyBzZWxlY3Rpb24gZXhpc3RzIG1vdmUgdGhlIGN1cnNvciBhY2NvcmRpbmcgdG8gdGhlIAotICogY3Vyc29yIHNlbGVjdGlvbiBydWxlcy4KLSAqIDxwPgotICoKLSAqIEBzZWUgI2RvU2VsZWN0aW9uQ3Vyc29yTmV4dAotICovCi12b2lkIGRvQ3Vyc29yTmV4dCgpIHsKLQlhZHZhbmNpbmcgPSB0cnVlOwotCWlmIChzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54ID4gMCkgewotCQlpbnQgY2FyZXRMaW5lOwotCi0JCWNhcmV0T2Zmc2V0ID0gc2VsZWN0aW9uLnk7Ci0JCWNhcmV0TGluZSA9IGdldENhcmV0TGluZSgpOwotCQlzaG93Q2FyZXQoY2FyZXRMaW5lKTsKLQl9Ci0JZWxzZSB7Ci0JCWRvU2VsZWN0aW9uQ3Vyc29yTmV4dCgpOwotCX0KLX0KLS8qKgotICogRGVsZXRlcyB0aGUgbmV4dCBjaGFyYWN0ZXIuIERlbGV0ZSB0aGUgc2VsZWN0ZWQgdGV4dCBpZiBhbnkuCi0gKi8KLXZvaWQgZG9EZWxldGUoKSB7Ci0JRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQlldmVudC50ZXh0ID0gIiI7Ci0JaWYgKHNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbi55KSB7Ci0JCWV2ZW50LnN0YXJ0ID0gc2VsZWN0aW9uLng7Ci0JCWV2ZW50LmVuZCA9IHNlbGVjdGlvbi55OwotCQlzZW5kS2V5RXZlbnQoZXZlbnQpOwotCX0KLQllbHNlCi0JaWYgKGNhcmV0T2Zmc2V0IDwgY29udGVudC5nZXRDaGFyQ291bnQoKSkgewotCQlpbnQgbGluZSA9IGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KGNhcmV0T2Zmc2V0KTsKLQkJaW50IGxpbmVPZmZzZXQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZShsaW5lKTsKLQkJaW50IGxpbmVMZW5ndGggPSBjb250ZW50LmdldExpbmUobGluZSkubGVuZ3RoKCk7Ci0JCQkJCi0JCWlmIChjYXJldE9mZnNldCA9PSBsaW5lT2Zmc2V0ICsgbGluZUxlbmd0aCkgewotCQkJZXZlbnQuc3RhcnQgPSBjYXJldE9mZnNldDsKLQkJCWV2ZW50LmVuZCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxpbmUgKyAxKTsKLQkJfQotCQllbHNlIHsKLQkJCWV2ZW50LnN0YXJ0ID0gY2FyZXRPZmZzZXQ7Ci0JCQlldmVudC5lbmQgPSBnZXRDbHVzdGVyTmV4dChjYXJldE9mZnNldCwgbGluZSk7Ci0JCX0KLQkJc2VuZEtleUV2ZW50KGV2ZW50KTsKLQl9Ci19Ci0vKioKLSAqIERlbGV0ZXMgdGhlIG5leHQgd29yZC4KLSAqLwotdm9pZCBkb0RlbGV0ZVdvcmROZXh0KCkgewotCWlmIChzZWxlY3Rpb24ueCAhPSBzZWxlY3Rpb24ueSkgewotCQkvLyBpZiBhIHNlbGVjdGlvbiBleGlzdHMsIHRyZWF0IHRoZSBhcyBpZiAKLQkJLy8gb25seSB0aGUgZGVsZXRlIGtleSB3YXMgcHJlc3NlZAotCQlkb0RlbGV0ZSgpOwotCX0gZWxzZSB7Ci0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LnRleHQgPSAiIjsKLQkJZXZlbnQuc3RhcnQgPSBjYXJldE9mZnNldDsKLQkJZXZlbnQuZW5kID0gZ2V0V29yZEVuZChjYXJldE9mZnNldCk7Ci0JCXNlbmRLZXlFdmVudChldmVudCk7Ci0JfQotfQotLyoqCi0gKiBEZWxldGVzIHRoZSBwcmV2aW91cyB3b3JkLgotICovCi12b2lkIGRvRGVsZXRlV29yZFByZXZpb3VzKCkgewotCWlmIChzZWxlY3Rpb24ueCAhPSBzZWxlY3Rpb24ueSkgewotCQkvLyBpZiBhIHNlbGVjdGlvbiBleGlzdHMsIHRyZWF0IGFzIGlmIAotCQkvLyBvbmx5IHRoZSBiYWNrc3BhY2Uga2V5IHdhcyBwcmVzc2VkCi0JCWRvQmFja3NwYWNlKCk7Ci0JfSBlbHNlIHsKLQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudGV4dCA9ICIiOwotCQlldmVudC5zdGFydCA9IGdldFdvcmRTdGFydChjYXJldE9mZnNldCk7Ci0JCWV2ZW50LmVuZCA9IGNhcmV0T2Zmc2V0OwotCQlzZW5kS2V5RXZlbnQoZXZlbnQpOwotCX0KLX0KLS8qKgotICogTW92ZXMgdGhlIGNhcmV0IG9uZSBsaW5lIGRvd24gYW5kIHRvIHRoZSBzYW1lIGNoYXJhY3RlciBvZmZzZXQgcmVsYXRpdmUgCi0gKiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLiBNb3ZlIHRoZSBjYXJldCB0byB0aGUgZW5kIG9mIHRoZSBuZXcgbGluZSAKLSAqIGlmIHRoZSBuZXcgbGluZSBpcyBzaG9ydGVyIHRoYW4gdGhlIGNoYXJhY3RlciBvZmZzZXQuCi0gKiAKLSAqIEByZXR1cm4gaW5kZXggb2YgdGhlIG5ldyBsaW5lIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBkb2N1bWVudAotICovCi1pbnQgZG9MaW5lRG93bigpIHsKLQlpZiAoaXNTaW5nbGVMaW5lKCkpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCS8vIGFsbG93IGxpbmUgZG93biBhY3Rpb24gb25seSBpZiByZWNlaXZlciBpcyBub3QgaW4gc2luZ2xlIGxpbmUgbW9kZS4KLQkvLyBmaXhlcyA0ODIwLgotCWludCBjYXJldExpbmUgPSBnZXRDYXJldExpbmUoKTsgCi0JaWYgKGNhcmV0TGluZSA8IGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgLSAxKSB7Ci0JCWNhcmV0TGluZSsrOwotCQljYXJldE9mZnNldCA9IGdldE9mZnNldEF0TW91c2VMb2NhdGlvbihjb2x1bW5YLCBjYXJldExpbmUpOwotCX0KLQlyZXR1cm4gY2FyZXRMaW5lOwotfQotLyoqCi0gKiBNb3ZlcyB0aGUgY2FyZXQgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KLSAqLwotdm9pZCBkb0xpbmVFbmQoKSB7Ci0JaW50IGNhcmV0TGluZSA9IGdldENhcmV0TGluZSgpOwotCWludCBsaW5lT2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUoY2FyZXRMaW5lKTsJCi0JaW50IGxpbmVMZW5ndGggPSBjb250ZW50LmdldExpbmUoY2FyZXRMaW5lKS5sZW5ndGgoKTsKLQlpbnQgbGluZUVuZE9mZnNldCA9IGxpbmVPZmZzZXQgKyBsaW5lTGVuZ3RoOwotCQotCWlmIChjYXJldE9mZnNldCA8IGxpbmVFbmRPZmZzZXQpIHsKLQkJY2FyZXRPZmZzZXQgPSBsaW5lRW5kT2Zmc2V0OwotCQlzaG93Q2FyZXQoKTsKLQl9Ci19Ci0vKioKLSAqIE1vdmVzIHRoZSBjYXJldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgotICovCi12b2lkIGRvTGluZVN0YXJ0KCkgewotCWludCBjYXJldExpbmUgPSBnZXRDYXJldExpbmUoKTsKLQlpbnQgbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGNhcmV0TGluZSk7Ci0JaWYgKGNhcmV0T2Zmc2V0ID4gbGluZU9mZnNldCkgewotCQljYXJldE9mZnNldCA9IGxpbmVPZmZzZXQ7Ci0JCXNob3dDYXJldChjYXJldExpbmUpOwotCX0KLX0KLS8qKgotICogTW92ZXMgdGhlIGNhcmV0IG9uZSBsaW5lIHVwIGFuZCB0byB0aGUgc2FtZSBjaGFyYWN0ZXIgb2Zmc2V0IHJlbGF0aXZlIAotICogdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4gTW92ZSB0aGUgY2FyZXQgdG8gdGhlIGVuZCBvZiB0aGUgbmV3IGxpbmUgCi0gKiBpZiB0aGUgbmV3IGxpbmUgaXMgc2hvcnRlciB0aGFuIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0LgotICogCi0gKiBAcmV0dXJuIGluZGV4IG9mIHRoZSBuZXcgbGluZSByZWxhdGl2ZSB0byB0aGUgZmlyc3QgbGluZSBpbiB0aGUgZG9jdW1lbnQKLSAqLwotaW50IGRvTGluZVVwKCkgewotCWludCBjYXJldExpbmUgPSBnZXRDYXJldExpbmUoKTsKLQlpZiAoY2FyZXRMaW5lID4gMCkgewotCQljYXJldExpbmUtLTsKLQkJY2FyZXRPZmZzZXQgPSBnZXRPZmZzZXRBdE1vdXNlTG9jYXRpb24oY29sdW1uWCwgY2FyZXRMaW5lKTsKLQl9Ci0JcmV0dXJuIGNhcmV0TGluZTsKLX0KLS8qKgotICogTW92ZXMgdGhlIGNhcmV0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0geCB4IGxvY2F0aW9uIG9mIHRoZSBuZXcgY2FyZXQgcG9zaXRpb24KLSAqIEBwYXJhbSB5IHkgbG9jYXRpb24gb2YgdGhlIG5ldyBjYXJldCBwb3NpdGlvbgotICogQHBhcmFtIHNlbGVjdCB0aGUgbG9jYXRpb24gY2hhbmdlIGlzIGEgc2VsZWN0aW9uIG9wZXJhdGlvbi4KLSAqIAlpbmNsdWRlIHRoZSBsaW5lIGRlbGltaXRlciBpbiB0aGUgc2VsZWN0aW9uCi0gKi8KLXZvaWQgZG9Nb3VzZUxvY2F0aW9uQ2hhbmdlKGludCB4LCBpbnQgeSwgYm9vbGVhbiBzZWxlY3QpIHsKLQlpbnQgbGluZSA9ICh5ICsgdmVydGljYWxTY3JvbGxPZmZzZXQpIC8gbGluZUhlaWdodDsKLQlpbnQgbGluZUNvdW50ID0gY29udGVudC5nZXRMaW5lQ291bnQoKTsKLQlpbnQgbmV3Q2FyZXRPZmZzZXQ7Ci0JaW50IG5ld0NhcmV0TGluZTsKLQlib29sZWFuIG9sZEFkdmFuY2luZyA9IGFkdmFuY2luZzsKLQotCXVwZGF0ZUNhcmV0RGlyZWN0aW9uID0gdHJ1ZTsKLQlpZiAobGluZSA+IGxpbmVDb3VudCAtIDEpIHsKLQkJbGluZSA9IGxpbmVDb3VudCAtIDE7Ci0JfQkKLQkvLyBhbGxvdyBjYXJldCB0byBiZSBwbGFjZWQgYmVsb3cgZmlyc3QgbGluZSBvbmx5IGlmIHJlY2VpdmVyIGlzIAotCS8vIG5vdCBpbiBzaW5nbGUgbGluZSBtb2RlLiBmaXhlcyA0ODIwLgotCWlmIChsaW5lIDwgMCB8fCAoaXNTaW5nbGVMaW5lKCkgJiYgbGluZSA+IDApKSB7Ci0JCXJldHVybjsKLQl9Ci0JbmV3Q2FyZXRPZmZzZXQgPSBnZXRPZmZzZXRBdE1vdXNlTG9jYXRpb24oeCwgbGluZSk7Ci0JCi0JaWYgKG1vdXNlRG91YmxlQ2xpY2spIHsKLQkJLy8gZG91YmxlIGNsaWNrIHdvcmQgc2VsZWN0IHRoZSBwcmV2aW91cy9uZXh0IHdvcmQuIGZpeGVzIGJ1ZyAxNTYxMAotCQluZXdDYXJldE9mZnNldCA9IGRvTW91c2VXb3JkU2VsZWN0KHgsIG5ld0NhcmV0T2Zmc2V0LCBsaW5lKTsKLQl9Ci0JbmV3Q2FyZXRMaW5lID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQobmV3Q2FyZXRPZmZzZXQpOwotCS8vIElzIHRoZSBtb3VzZSB3aXRoaW4gdGhlIGxlZnQgY2xpZW50IGFyZWEgYm9yZGVyIG9yIG9uIAotCS8vIGEgZGlmZmVyZW50IGxpbmU/IElmIG5vdCB0aGUgYXV0b3Njcm9sbCBzZWxlY3Rpb24gCi0JLy8gY291bGQgYmUgaW5jb3JyZWN0bHkgcmVzZXQuIEZpeGVzIDFHS00zWFMKLQlpZiAoeSA+PSAwICYmIHkgPCBnZXRDbGllbnRBcmVhKCkuaGVpZ2h0ICYmIAotCQkoeCA+PSAwICYmIHggPCBnZXRDbGllbnRBcmVhKCkud2lkdGggfHwgd29yZFdyYXAgfHwJCi0JCW5ld0NhcmV0TGluZSAhPSBjb250ZW50LmdldExpbmVBdE9mZnNldChjYXJldE9mZnNldCkpKSB7Ci0JCWlmIChuZXdDYXJldE9mZnNldCAhPSBjYXJldE9mZnNldCB8fCBhZHZhbmNpbmcgIT0gb2xkQWR2YW5jaW5nKSB7Ci0JCQljYXJldE9mZnNldCA9IG5ld0NhcmV0T2Zmc2V0OwotCQkJaWYgKHNlbGVjdCkgewotCQkJCWRvTW91c2VTZWxlY3Rpb24oKTsKLQkJCX0KLQkJCXNob3dDYXJldCgpOwotCQl9Ci0JfQotCWlmICghc2VsZWN0KSB7Ci0JCWNhcmV0T2Zmc2V0ID0gbmV3Q2FyZXRPZmZzZXQ7Ci0JCWNsZWFyU2VsZWN0aW9uKHRydWUpOwotCX0KLX0KLS8qKgotICogVXBkYXRlcyB0aGUgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjYXJldCBwb3NpdGlvbgotICovCi12b2lkIGRvTW91c2VTZWxlY3Rpb24oKSB7Ci0JaWYgKGNhcmV0T2Zmc2V0IDw9IHNlbGVjdGlvbi54IHx8IAotCQkoY2FyZXRPZmZzZXQgPiBzZWxlY3Rpb24ueCAmJiAKLQkJIGNhcmV0T2Zmc2V0IDwgc2VsZWN0aW9uLnkgJiYgc2VsZWN0aW9uQW5jaG9yID09IHNlbGVjdGlvbi54KSkgewotCQlkb1NlbGVjdGlvbihTVC5DT0xVTU5fUFJFVklPVVMpOwotCX0KLQllbHNlIHsKLQkJZG9TZWxlY3Rpb24oU1QuQ09MVU1OX05FWFQpOwotCX0KLX0KLS8qKgotICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSB3b3JkIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiAKLSAqIElmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBleHRlbmRzIGZyb20gaGlnaCBpbmRleCB0byBsb3cgaW5kZXggCi0gKiAoaS5lLiwgcmlnaHQgdG8gbGVmdCwgb3IgY2FyZXQgaXMgYXQgbGVmdCBib3JkZXIgb2Ygc2VsZWN0b24gb24gCi0gKiBub24tYmlkaSBwbGF0Zm9ybXMpIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHdvcmQgcHJlY2VlZGluZyB0aGUKLSAqIHNlbGVjdGlvbiBpcyByZXR1cm5lZC4gSWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGV4dGVuZHMgZnJvbSAKLSAqIGxvdyBpbmRleCB0byBoaWdoIGluZGV4IHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSB3b3JkIGZvbGxvd2luZyAKLSAqIHRoZSBzZWxlY3Rpb24gaXMgcmV0dXJuZWQuCi0gKiAKLSAqIEBwYXJhbSB4IG1vdXNlIHggbG9jYXRpb24KLSAqIEBwYXJhbSBuZXdDYXJldE9mZnNldCBjYXJldCBvZmZzZXQgb2YgdGhlIG1vdXNlIGN1cnNvciBsb2NhdGlvbgotICogQHBhcmFtIGxpbmUgbGluZSBpbmRleCBvZiB0aGUgbW91c2UgY3Vyc29yIGxvY2F0aW9uCi0gKi8KLWludCBkb01vdXNlV29yZFNlbGVjdChpbnQgeCwgaW50IG5ld0NhcmV0T2Zmc2V0LCBpbnQgbGluZSkgewotCWludCB3b3JkT2Zmc2V0OwotCi0JLy8gZmxpcCBzZWxlY3Rpb24gYW5jaG9yIGJhc2VkIG9uIHdvcmQgc2VsZWN0aW9uIGRpcmVjdGlvbiBmcm9tIAotCS8vIGJhc2UgZG91YmxlIGNsaWNrLiBBbHdheXMgZG8gdGhpcyBoZXJlIChhbmQgZG9uJ3QgcmVseSBvbiBkb0F1dG9TY3JvbGwpCi0JLy8gYmVjYXVzZSBhdXRvIHNjcm9sbCBvbmx5IGRvZXMgbm90IGNvdmVyIGFsbCBwb3NzaWJsZSBtb3VzZSBzZWxlY3Rpb25zCi0JLy8gKGUuZy4sIG1vdXNlIHggPCAwICYmIG1vdXNlIHkgPiBjYXJldCBsaW5lIHkpCi0gCWlmIChuZXdDYXJldE9mZnNldCA8IHNlbGVjdGlvbkFuY2hvciAmJiBzZWxlY3Rpb25BbmNob3IgPT0gc2VsZWN0aW9uLngpIHsKLQkJc2VsZWN0aW9uQW5jaG9yID0gZG91YmxlQ2xpY2tTZWxlY3Rpb24ueTsKLQl9Ci0JZWxzZQotCWlmIChuZXdDYXJldE9mZnNldCA+IHNlbGVjdGlvbkFuY2hvciAmJiBzZWxlY3Rpb25BbmNob3IgPT0gc2VsZWN0aW9uLnkpIHsKLQkJc2VsZWN0aW9uQW5jaG9yID0gZG91YmxlQ2xpY2tTZWxlY3Rpb24ueDsKLQl9Ci0JaWYgKHggPj0gMCAmJiB4IDwgZ2V0Q2xpZW50QXJlYSgpLndpZHRoKSB7Ci0JCS8vIGZpbmQgdGhlIHByZXZpb3VzL25leHQgd29yZAotCQlpZiAoY2FyZXRPZmZzZXQgPT0gc2VsZWN0aW9uLngpIHsKLQkJCXdvcmRPZmZzZXQgPSBnZXRXb3JkU3RhcnQobmV3Q2FyZXRPZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJd29yZE9mZnNldCA9IGdldFdvcmRFbmROb1NwYWNlcyhuZXdDYXJldE9mZnNldCk7Ci0JCX0KLQkJLy8gbW91c2Ugd29yZCBzZWxlY3Qgb25seSBvbiBzYW1lIGxpbmUgbW91c2UgY3Vyc29yIGlzIG9uCi0JCWlmIChjb250ZW50LmdldExpbmVBdE9mZnNldCh3b3JkT2Zmc2V0KSA9PSBsaW5lKSB7Ci0JCQluZXdDYXJldE9mZnNldCA9IHdvcmRPZmZzZXQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIG5ld0NhcmV0T2Zmc2V0OwotfQotLyoqCi0gKiBTY3JvbGxzIG9uZSBwYWdlIGRvd24gc28gdGhhdCB0aGUgbGFzdCBsaW5lICh0cnVuY2F0ZWQgb3Igd2hvbGUpCi0gKiBvZiB0aGUgY3VycmVudCBwYWdlIGJlY29tZXMgdGhlIGZ1bGx5IHZpc2libGUgdG9wIGxpbmUuCi0gKiBUaGUgY2FyZXQgaXMgc2Nyb2xsZWQgdGhlIHNhbWUgbnVtYmVyIG9mIGxpbmVzIHNvIHRoYXQgaXRzIGxvY2F0aW9uIAotICogcmVsYXRpdmUgdG8gdGhlIHRvcCBsaW5lIHJlbWFpbnMgdGhlIHNhbWUuIFRoZSBleGNlcHRpb24gaXMgdGhlIGVuZCAKLSAqIG9mIHRoZSB0ZXh0IHdoZXJlIGEgZnVsbCBwYWdlIHNjcm9sbCBpcyBub3QgcG9zc2libGUuIEluIHRoaXMgY2FzZSAKLSAqIHRoZSBjYXJldCBpcyBtb3ZlZCBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gc2VsZWN0IHdoZXRoZXIgb3Igbm90IHRvIHNlbGVjdCB0aGUgcGFnZQotICovCi12b2lkIGRvUGFnZURvd24oYm9vbGVhbiBzZWxlY3QsIGludCBsaW5lcykgewotCWludCBsaW5lQ291bnQgPSBjb250ZW50LmdldExpbmVDb3VudCgpOwotCWludCBvbGRDb2x1bW5YID0gY29sdW1uWDsKLQlpbnQgb2xkSFNjcm9sbE9mZnNldCA9IGhvcml6b250YWxTY3JvbGxPZmZzZXQ7Ci0JaW50IGNhcmV0TGluZTsKLQkKLQkvLyBkbyBub3RoaW5nIGlmIGluIHNpbmdsZSBsaW5lIG1vZGUuIGZpeGVzIDU2NzMKLQlpZiAoaXNTaW5nbGVMaW5lKCkpIHsKLQkJcmV0dXJuOwotCX0KLQljYXJldExpbmUgPSBnZXRDYXJldExpbmUoKTsKLQlpZiAoY2FyZXRMaW5lIDwgbGluZUNvdW50IC0gMSkgewotCQlpbnQgdmVydGljYWxNYXhpbXVtID0gbGluZUNvdW50ICogZ2V0VmVydGljYWxJbmNyZW1lbnQoKTsKLQkJaW50IHBhZ2VTaXplID0gZ2V0Q2xpZW50QXJlYSgpLmhlaWdodDsKLQkJaW50IHNjcm9sbExpbmVzID0gTWF0aC5taW4obGluZUNvdW50IC0gY2FyZXRMaW5lIC0gMSwgbGluZXMpOwotCQlpbnQgc2Nyb2xsT2Zmc2V0OwotCQkKLQkJLy8gZW5zdXJlIHRoYXQgc2Nyb2xsTGluZXMgbmV2ZXIgZ2V0cyBuZWdhdGl2ZSBhbmQgYXQgbGVhdCBvbmUgCi0JCS8vIGxpbmUgaXMgc2Nyb2xsZWQuIGZpeGVzIGJ1ZyA1NjAyLgotCQlzY3JvbGxMaW5lcyA9IE1hdGgubWF4KDEsIHNjcm9sbExpbmVzKTsKLQkJY2FyZXRMaW5lICs9IHNjcm9sbExpbmVzOwotCQljYXJldE9mZnNldCA9IGdldE9mZnNldEF0TW91c2VMb2NhdGlvbihjb2x1bW5YLCBjYXJldExpbmUpOyAKLQkJaWYgKHNlbGVjdCkgewotCQkJZG9TZWxlY3Rpb24oU1QuQ09MVU1OX05FWFQpOwotCQl9Ci0JCS8vIHNjcm9sbCBvbmUgcGFnZSBkb3duIG9yIHRvIHRoZSBib3R0b20KLQkJc2Nyb2xsT2Zmc2V0ID0gdmVydGljYWxTY3JvbGxPZmZzZXQgKyBzY3JvbGxMaW5lcyAqIGdldFZlcnRpY2FsSW5jcmVtZW50KCk7Ci0JCWlmIChzY3JvbGxPZmZzZXQgKyBwYWdlU2l6ZSA+IHZlcnRpY2FsTWF4aW11bSkgewotCQkJc2Nyb2xsT2Zmc2V0ID0gdmVydGljYWxNYXhpbXVtIC0gcGFnZVNpemU7Ci0JCX0KLQkJaWYgKHNjcm9sbE9mZnNldCA+IHZlcnRpY2FsU2Nyb2xsT2Zmc2V0KSB7CQkKLQkJCXNldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KHNjcm9sbE9mZnNldCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JLy8gZXhwbGljaXRseSBnbyB0byB0aGUgY2FsY3VsYXRlZCBjYXJldCBsaW5lLiBtYXkgYmUgZGlmZmVyZW50IAotCS8vIGZyb20gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoY2FyZXRPZmZzZXQpIHdoZW4gaW4gd29yZCB3cmFwIG1vZGUKLQlzaG93Q2FyZXQoY2FyZXRMaW5lKTsKLQkvLyByZXN0b3JlIHRoZSBvcmlnaW5hbCBob3Jpem9udGFsIGNhcmV0IHBvc2l0aW9uCi0JaW50IGhTY3JvbGxDaGFuZ2UgPSBvbGRIU2Nyb2xsT2Zmc2V0IC0gaG9yaXpvbnRhbFNjcm9sbE9mZnNldDsKLQljb2x1bW5YID0gb2xkQ29sdW1uWCArIGhTY3JvbGxDaGFuZ2U7Ci19Ci0vKioKLSAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgbGFzdCBmdWxseSB2aXNpYmxlIGxpbmUuCi0gKi8KLXZvaWQgZG9QYWdlRW5kKCkgewotCS8vIGdvIHRvIGVuZCBvZiBsaW5lIGlmIGluIHNpbmdsZSBsaW5lIG1vZGUuIGZpeGVzIDU2NzMKLQlpZiAoaXNTaW5nbGVMaW5lKCkpIHsKLQkJZG9MaW5lRW5kKCk7Ci0JfQotCWVsc2UgewotCQlpbnQgbGluZSA9IGdldEJvdHRvbUluZGV4KCk7Ci0JCWludCBib3R0b21DYXJldE9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxpbmUpICsgY29udGVudC5nZXRMaW5lKGxpbmUpLmxlbmd0aCgpOwkKLQotCQlpZiAoY2FyZXRPZmZzZXQgPCBib3R0b21DYXJldE9mZnNldCkgewotCQkJY2FyZXRPZmZzZXQgPSBib3R0b21DYXJldE9mZnNldDsKLQkJCXNob3dDYXJldCgpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IGZ1bGx5IHZpc2libGUgbGluZS4KLSAqLwotdm9pZCBkb1BhZ2VTdGFydCgpIHsKLQlpbnQgdG9wQ2FyZXRPZmZzZXQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZSh0b3BJbmRleCk7Ci0JCi0JaWYgKGNhcmV0T2Zmc2V0ID4gdG9wQ2FyZXRPZmZzZXQpIHsKLQkJY2FyZXRPZmZzZXQgPSB0b3BDYXJldE9mZnNldDsKLQkJLy8gZXhwbGljaXRseSBnbyB0byB0aGUgY2FsY3VsYXRlZCBjYXJldCBsaW5lLiBtYXkgYmUgZGlmZmVyZW50IAotCQkvLyBmcm9tIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KGNhcmV0T2Zmc2V0KSB3aGVuIGluIHdvcmQgd3JhcCBtb2RlCi0JCXNob3dDYXJldCh0b3BJbmRleCk7Ci0JfQotfQotLyoqCi0gKiBTY3JvbGxzIG9uZSBwYWdlIHVwIHNvIHRoYXQgdGhlIGZpcnN0IGxpbmUgKHRydW5jYXRlZCBvciB3aG9sZSkKLSAqIG9mIHRoZSBjdXJyZW50IHBhZ2UgYmVjb21lcyB0aGUgZnVsbHkgdmlzaWJsZSBsYXN0IGxpbmUuCi0gKiBUaGUgY2FyZXQgaXMgc2Nyb2xsZWQgdGhlIHNhbWUgbnVtYmVyIG9mIGxpbmVzIHNvIHRoYXQgaXRzIGxvY2F0aW9uIAotICogcmVsYXRpdmUgdG8gdGhlIHRvcCBsaW5lIHJlbWFpbnMgdGhlIHNhbWUuIFRoZSBleGNlcHRpb24gaXMgdGhlIGJlZ2lubmluZyAKLSAqIG9mIHRoZSB0ZXh0IHdoZXJlIGEgZnVsbCBwYWdlIHNjcm9sbCBpcyBub3QgcG9zc2libGUuIEluIHRoaXMgY2FzZSB0aGUKLSAqIGNhcmV0IGlzIG1vdmVkIGluIGZyb250IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCi0gKi8KLXZvaWQgZG9QYWdlVXAoYm9vbGVhbiBzZWxlY3QsIGludCBsaW5lcykgewotCWludCBvbGRDb2x1bW5YID0gY29sdW1uWDsKLQlpbnQgb2xkSFNjcm9sbE9mZnNldCA9IGhvcml6b250YWxTY3JvbGxPZmZzZXQ7Ci0JaW50IGNhcmV0TGluZSA9IGdldENhcmV0TGluZSgpOwotCQotCWlmIChjYXJldExpbmUgPiAwKSB7CQotCQlpbnQgc2Nyb2xsTGluZXMgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihjYXJldExpbmUsIGxpbmVzKSk7Ci0JCWludCBzY3JvbGxPZmZzZXQ7Ci0JCQotCQljYXJldExpbmUgLT0gc2Nyb2xsTGluZXM7Ci0JCWNhcmV0T2Zmc2V0ID0gZ2V0T2Zmc2V0QXRNb3VzZUxvY2F0aW9uKGNvbHVtblgsIGNhcmV0TGluZSk7Ci0JCWlmIChzZWxlY3QpIHsKLQkJCWRvU2VsZWN0aW9uKFNULkNPTFVNTl9QUkVWSU9VUyk7Ci0JCX0KLQkJLy8gc2Nyb2xsIG9uZSBwYWdlIHVwIG9yIHRvIHRoZSB0b3AKLQkJc2Nyb2xsT2Zmc2V0ID0gTWF0aC5tYXgoMCwgdmVydGljYWxTY3JvbGxPZmZzZXQgLSBzY3JvbGxMaW5lcyAqIGdldFZlcnRpY2FsSW5jcmVtZW50KCkpOwotCQlpZiAoc2Nyb2xsT2Zmc2V0IDwgdmVydGljYWxTY3JvbGxPZmZzZXQpIHsKLQkJCXNldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KHNjcm9sbE9mZnNldCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JLy8gZXhwbGljaXRseSBnbyB0byB0aGUgY2FsY3VsYXRlZCBjYXJldCBsaW5lLiBtYXkgYmUgZGlmZmVyZW50IAotCS8vIGZyb20gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoY2FyZXRPZmZzZXQpIHdoZW4gaW4gd29yZCB3cmFwIG1vZGUKLQlzaG93Q2FyZXQoY2FyZXRMaW5lKTsKLQkvLyByZXN0b3JlIHRoZSBvcmlnaW5hbCBob3Jpem9udGFsIGNhcmV0IHBvc2l0aW9uCi0JaW50IGhTY3JvbGxDaGFuZ2UgPSBvbGRIU2Nyb2xsT2Zmc2V0IC0gaG9yaXpvbnRhbFNjcm9sbE9mZnNldDsKLQljb2x1bW5YID0gb2xkQ29sdW1uWCArIGhTY3JvbGxDaGFuZ2U7Ci19Ci0vKioKLSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiB0byBleHRlbmQgdG8gdGhlIGN1cnJlbnQgY2FyZXQgcG9zaXRpb24uCi0gKi8KLXZvaWQgZG9TZWxlY3Rpb24oaW50IGRpcmVjdGlvbikgewotCWludCByZWRyYXdTdGFydCA9IC0xOwotCWludCByZWRyYXdFbmQgPSAtMTsKLQkKLQlpZiAoc2VsZWN0aW9uQW5jaG9yID09IC0xKSB7Ci0JCXNlbGVjdGlvbkFuY2hvciA9IHNlbGVjdGlvbi54OwotCX0JCi0JaWYgKGRpcmVjdGlvbiA9PSBTVC5DT0xVTU5fUFJFVklPVVMpIHsKLQkJaWYgKGNhcmV0T2Zmc2V0IDwgc2VsZWN0aW9uLngpIHsKLQkJCS8vIGdyb3cgc2VsZWN0aW9uCi0JCQlyZWRyYXdFbmQgPSBzZWxlY3Rpb24ueDsgCi0JCQlyZWRyYXdTdGFydCA9IHNlbGVjdGlvbi54ID0gY2FyZXRPZmZzZXQ7CQkKLQkJCS8vIGNoZWNrIGlmIHNlbGVjdGlvbiBoYXMgcmV2ZXJzZWQgZGlyZWN0aW9uCi0JCQlpZiAoc2VsZWN0aW9uLnkgIT0gc2VsZWN0aW9uQW5jaG9yKSB7Ci0JCQkJcmVkcmF3RW5kID0gc2VsZWN0aW9uLnk7Ci0JCQkJc2VsZWN0aW9uLnkgPSBzZWxlY3Rpb25BbmNob3I7Ci0JCQl9Ci0JCX0KLQkJZWxzZQkvLyB0ZXN0IHdoZXRoZXIgc2VsZWN0aW9uIGFjdHVhbGx5IGNoYW5nZWQuIEZpeGVzIDFHNzFFTzEKLQkJaWYgKHNlbGVjdGlvbkFuY2hvciA9PSBzZWxlY3Rpb24ueCAmJiBjYXJldE9mZnNldCA8IHNlbGVjdGlvbi55KSB7Ci0JCQkvLyBjYXJldCBtb3ZlZCB0b3dhcmRzIHNlbGVjdGlvbiBhbmNob3IgKGxlZnQgc2lkZSBvZiBzZWxlY3Rpb24pLiAKLQkJCS8vIHNocmluayBzZWxlY3Rpb24JCQkKLQkJCXJlZHJhd0VuZCA9IHNlbGVjdGlvbi55OwotCQkJcmVkcmF3U3RhcnQgPSBzZWxlY3Rpb24ueSA9IGNhcmV0T2Zmc2V0OwkJCi0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWlmIChjYXJldE9mZnNldCA+IHNlbGVjdGlvbi55KSB7Ci0JCQkvLyBncm93IHNlbGVjdGlvbgotCQkJcmVkcmF3U3RhcnQgPSBzZWxlY3Rpb24ueTsKLQkJCXJlZHJhd0VuZCA9IHNlbGVjdGlvbi55ID0gY2FyZXRPZmZzZXQ7Ci0JCQkvLyBjaGVjayBpZiBzZWxlY3Rpb24gaGFzIHJldmVyc2VkIGRpcmVjdGlvbgotCQkJaWYgKHNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbkFuY2hvcikgewotCQkJCXJlZHJhd1N0YXJ0ID0gc2VsZWN0aW9uLng7CQkJCQotCQkJCXNlbGVjdGlvbi54ID0gc2VsZWN0aW9uQW5jaG9yOwotCQkJfQotCQl9Ci0JCWVsc2UJLy8gdGVzdCB3aGV0aGVyIHNlbGVjdGlvbiBhY3R1YWxseSBjaGFuZ2VkLiBGaXhlcyAxRzcxRU8xCi0JCWlmIChzZWxlY3Rpb25BbmNob3IgPT0gc2VsZWN0aW9uLnkgJiYgY2FyZXRPZmZzZXQgPiBzZWxlY3Rpb24ueCkgewotCQkJLy8gY2FyZXQgbW92ZWQgdG93YXJkcyBzZWxlY3Rpb24gYW5jaG9yIChyaWdodCBzaWRlIG9mIHNlbGVjdGlvbikuIAotCQkJLy8gc2hyaW5rIHNlbGVjdGlvbgkJCQotCQkJcmVkcmF3U3RhcnQgPSBzZWxlY3Rpb24ueDsKLQkJCXJlZHJhd0VuZCA9IHNlbGVjdGlvbi54ID0gY2FyZXRPZmZzZXQ7CQkKLQkJfQotCX0KLQlpZiAocmVkcmF3U3RhcnQgIT0gLTEgJiYgcmVkcmF3RW5kICE9IC0xKSB7Ci0JCWludGVybmFsUmVkcmF3UmFuZ2UocmVkcmF3U3RhcnQsIHJlZHJhd0VuZCAtIHJlZHJhd1N0YXJ0LCB0cnVlKTsKLQkJc2VuZFNlbGVjdGlvbkV2ZW50KCk7Ci0JfQotfQotLyoqCi0gKiBNb3ZlcyB0aGUgY2FyZXQgdG8gdGhlIG5leHQgY2hhcmFjdGVyIG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIAotICogbmV4dCBsaW5lIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiBhIGxpbmUuCi0gKi8KLXZvaWQgZG9TZWxlY3Rpb25DdXJzb3JOZXh0KCkgewotCWludCBjYXJldExpbmUgPSBnZXRDYXJldExpbmUoKTsKLQlpbnQgbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGNhcmV0TGluZSk7Ci0JaW50IG9mZnNldEluTGluZSA9IGNhcmV0T2Zmc2V0IC0gbGluZU9mZnNldDsKLQlhZHZhbmNpbmcgPSB0cnVlOwotCWlmIChvZmZzZXRJbkxpbmUgPCBjb250ZW50LmdldExpbmUoY2FyZXRMaW5lKS5sZW5ndGgoKSkgewotCQljYXJldE9mZnNldCA9IGdldENsdXN0ZXJOZXh0KGNhcmV0T2Zmc2V0LCBjYXJldExpbmUpOwotCQlzaG93Q2FyZXQoKTsKLQl9Ci0JZWxzZQotCWlmIChjYXJldExpbmUgPCBjb250ZW50LmdldExpbmVDb3VudCgpIC0gMSAmJiAhaXNTaW5nbGVMaW5lKCkpIHsKLQkJLy8gb25seSBnbyB0byBuZXh0IGxpbmUgaWYgbm90IGluIHNpbmdsZSBsaW5lIG1vZGUuIGZpeGVzIDU2NzMKLQkJY2FyZXRMaW5lKys7CQkKLQkJY2FyZXRPZmZzZXQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZShjYXJldExpbmUpOwotCQkvLyBleHBsaWNpdGx5IGdvIHRvIHRoZSBjYWxjdWxhdGVkIGNhcmV0IGxpbmUuIG1heSBiZSBkaWZmZXJlbnQgCi0JCS8vIGZyb20gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoY2FyZXRPZmZzZXQpIHdoZW4gaW4gd29yZCB3cmFwIG1vZGUKLQkJc2hvd0NhcmV0KGNhcmV0TGluZSk7Ci0JfQotfQotLyoqCi0gKiBNb3ZlcyB0aGUgY2FyZXQgdG8gdGhlIHByZXZpb3VzIGNoYXJhY3RlciBvciB0byB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyAKLSAqIGxpbmUgaWYgdGhlIGN1cnNvciBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4KLSAqLwotdm9pZCBkb1NlbGVjdGlvbkN1cnNvclByZXZpb3VzKCkgewotCWludCBjYXJldExpbmUgPSBnZXRDYXJldExpbmUoKTsKLQlpbnQgbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGNhcmV0TGluZSk7Ci0JaW50IG9mZnNldEluTGluZSA9IGNhcmV0T2Zmc2V0IC0gbGluZU9mZnNldDsKLQlhZHZhbmNpbmcgPSBmYWxzZTsKLQlpZiAob2Zmc2V0SW5MaW5lID4gMCkgewotCQljYXJldE9mZnNldCA9IGdldENsdXN0ZXJQcmV2aW91cyhjYXJldE9mZnNldCwgY2FyZXRMaW5lKTsKLQkJc2hvd0NhcmV0KGNhcmV0TGluZSk7Ci0JfQotCWVsc2UKLQlpZiAoY2FyZXRMaW5lID4gMCkgewotCQljYXJldExpbmUtLTsKLQkJbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGNhcmV0TGluZSk7Ci0JCWNhcmV0T2Zmc2V0ID0gbGluZU9mZnNldCArIGNvbnRlbnQuZ2V0TGluZShjYXJldExpbmUpLmxlbmd0aCgpOwotCQlzaG93Q2FyZXQoKTsKLQl9Ci19Ci0vKioKLSAqIE1vdmVzIHRoZSBjYXJldCBvbmUgbGluZSBkb3duIGFuZCB0byB0aGUgc2FtZSBjaGFyYWN0ZXIgb2Zmc2V0IHJlbGF0aXZlIAotICogdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4gTW92ZXMgdGhlIGNhcmV0IHRvIHRoZSBlbmQgb2YgdGhlIG5ldyBsaW5lIAotICogaWYgdGhlIG5ldyBsaW5lIGlzIHNob3J0ZXIgdGhhbiB0aGUgY2hhcmFjdGVyIG9mZnNldC4KLSAqIE1vdmVzIHRoZSBjYXJldCB0byB0aGUgZW5kIG9mIHRoZSB0ZXh0IGlmIHRoZSBjYXJldCBhbHJlYWR5IGlzIG9uIHRoZSAKLSAqIGxhc3QgbGluZS4KLSAqIEFkanVzdHMgdGhlIHNlbGVjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGNhcmV0IGNoYW5nZS4gVGhpcyBjYW4gZWl0aGVyIGFkZAotICogdG8gb3Igc3VidHJhY3QgZnJvbSB0aGUgb2xkIHNlbGVjdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24KLSAqIGRpcmVjdGlvbi4KLSAqLwotdm9pZCBkb1NlbGVjdGlvbkxpbmVEb3duKCkgewotCWludCBvbGRDb2x1bW5YOwotCWludCBjYXJldExpbmU7Ci0JaW50IGxpbmVTdGFydE9mZnNldDsKLQkKLQlpZiAoaXNTaW5nbGVMaW5lKCkpIHsKLQkJcmV0dXJuOwotCX0KLQljYXJldExpbmUgPSBnZXRDYXJldExpbmUoKTsJCi0JbGluZVN0YXJ0T2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUoY2FyZXRMaW5lKTsKLQkvLyByZXNldCBjb2x1bW5YIG9uIHNlbGVjdGlvbgotCW9sZENvbHVtblggPSBjb2x1bW5YID0gZ2V0WEF0T2Zmc2V0KAotCQljb250ZW50LmdldExpbmUoY2FyZXRMaW5lKSwgY2FyZXRMaW5lLCBjYXJldE9mZnNldCAtIGxpbmVTdGFydE9mZnNldCk7Ci0JaWYgKGNhcmV0TGluZSA9PSBjb250ZW50LmdldExpbmVDb3VudCgpIC0gMSkgewotCQljYXJldE9mZnNldCA9IGNvbnRlbnQuZ2V0Q2hhckNvdW50KCk7Ci0JfQotCWVsc2UgewotCQljYXJldExpbmUgPSBkb0xpbmVEb3duKCk7Ci0JfQotCXNldE1vdXNlV29yZFNlbGVjdGlvbkFuY2hvcigpOwkKLQkvLyBzZWxlY3QgZmlyc3QgYW5kIHRoZW4gc2Nyb2xsIHRvIHJlZHVjZSBmbGFzaCB3aGVuIGtleSAKLQkvLyByZXBlYXQgc2Nyb2xscyBsb3RzIG9mIGxpbmVzCi0JZG9TZWxlY3Rpb24oU1QuQ09MVU1OX05FWFQpOwotCS8vIGV4cGxpY2l0bHkgZ28gdG8gdGhlIGNhbGN1bGF0ZWQgY2FyZXQgbGluZS4gbWF5IGJlIGRpZmZlcmVudCAKLQkvLyBmcm9tIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KGNhcmV0T2Zmc2V0KSB3aGVuIGluIHdvcmQgd3JhcCBtb2RlCi0Jc2hvd0NhcmV0KGNhcmV0TGluZSk7Ci0JLy8gc2F2ZSB0aGUgb3JpZ2luYWwgaG9yaXpvbnRhbCBjYXJldCBwb3NpdGlvbgotCWNvbHVtblggPSBvbGRDb2x1bW5YOwotfQotLyoqCi0gKiBNb3ZlcyB0aGUgY2FyZXQgb25lIGxpbmUgdXAgYW5kIHRvIHRoZSBzYW1lIGNoYXJhY3RlciBvZmZzZXQgcmVsYXRpdmUgCi0gKiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLiBNb3ZlcyB0aGUgY2FyZXQgdG8gdGhlIGVuZCBvZiB0aGUgbmV3IGxpbmUgCi0gKiBpZiB0aGUgbmV3IGxpbmUgaXMgc2hvcnRlciB0aGFuIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0LgotICogTW92ZXMgdGhlIGNhcmV0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IGlmIGl0IGlzIGFscmVhZHkgb24gdGhlCi0gKiBmaXJzdCBsaW5lLgotICogQWRqdXN0cyB0aGUgc2VsZWN0aW9uIGFjY29yZGluZyB0byB0aGUgY2FyZXQgY2hhbmdlLiBUaGlzIGNhbiBlaXRoZXIgYWRkCi0gKiB0byBvciBzdWJ0cmFjdCBmcm9tIHRoZSBvbGQgc2VsZWN0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHByZXZpb3VzIHNlbGVjdGlvbgotICogZGlyZWN0aW9uLgotICovCi12b2lkIGRvU2VsZWN0aW9uTGluZVVwKCkgewotCWludCBvbGRDb2x1bW5YOwotCWludCBjYXJldExpbmUgPSBnZXRDYXJldExpbmUoKTsJCi0JaW50IGxpbmVTdGFydE9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGNhcmV0TGluZSk7Ci0JCi0JLy8gcmVzZXQgY29sdW1uWCBvbiBzZWxlY3Rpb24KLQlvbGRDb2x1bW5YID0gY29sdW1uWCA9IGdldFhBdE9mZnNldCgKLQkJY29udGVudC5nZXRMaW5lKGNhcmV0TGluZSksIGNhcmV0TGluZSwgY2FyZXRPZmZzZXQgLSBsaW5lU3RhcnRPZmZzZXQpOwkKLQlpZiAoY2FyZXRMaW5lID09IDApIHsKLQkJY2FyZXRPZmZzZXQgPSAwOwotCX0KLQllbHNlIHsKLQkJY2FyZXRMaW5lID0gZG9MaW5lVXAoKTsKLQl9Ci0Jc2V0TW91c2VXb3JkU2VsZWN0aW9uQW5jaG9yKCk7Ci0JLy8gZXhwbGljaXRseSBnbyB0byB0aGUgY2FsY3VsYXRlZCBjYXJldCBsaW5lLiBtYXkgYmUgZGlmZmVyZW50IAotCS8vIGZyb20gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoY2FyZXRPZmZzZXQpIHdoZW4gaW4gd29yZCB3cmFwIG1vZGUKLQlzaG93Q2FyZXQoY2FyZXRMaW5lKTsKLQlkb1NlbGVjdGlvbihTVC5DT0xVTU5fUFJFVklPVVMpOwotCS8vIHNhdmUgdGhlIG9yaWdpbmFsIGhvcml6b250YWwgY2FyZXQgcG9zaXRpb24JCi0JY29sdW1uWCA9IG9sZENvbHVtblg7Ci19Ci0vKioKLSAqIFNjcm9sbHMgb25lIHBhZ2UgZG93biBzbyB0aGF0IHRoZSBsYXN0IGxpbmUgKHRydW5jYXRlZCBvciB3aG9sZSkKLSAqIG9mIHRoZSBjdXJyZW50IHBhZ2UgYmVjb21lcyB0aGUgZnVsbHkgdmlzaWJsZSB0b3AgbGluZS4KLSAqIFRoZSBjYXJldCBpcyBzY3JvbGxlZCB0aGUgc2FtZSBudW1iZXIgb2YgbGluZXMgc28gdGhhdCBpdHMgbG9jYXRpb24gCi0gKiByZWxhdGl2ZSB0byB0aGUgdG9wIGxpbmUgcmVtYWlucyB0aGUgc2FtZS4gVGhlIGV4Y2VwdGlvbiBpcyB0aGUgZW5kIAotICogb2YgdGhlIHRleHQgd2hlcmUgYSBmdWxsIHBhZ2Ugc2Nyb2xsIGlzIG5vdCBwb3NzaWJsZS4gSW4gdGhpcyBjYXNlIAotICogdGhlIGNhcmV0IGlzIG1vdmVkIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3Rlci4KLSAqIDxwPgotICogQWRqdXN0cyB0aGUgc2VsZWN0aW9uIGFjY29yZGluZyB0byB0aGUgY2FyZXQgY2hhbmdlLiBUaGlzIGNhbiBlaXRoZXIgYWRkCi0gKiB0byBvciBzdWJ0cmFjdCBmcm9tIHRoZSBvbGQgc2VsZWN0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHByZXZpb3VzIHNlbGVjdGlvbgotICogZGlyZWN0aW9uLgotICogPC9wPgotICovCi12b2lkIGRvU2VsZWN0aW9uUGFnZURvd24oaW50IGxpbmVzKSB7Ci0JaW50IG9sZENvbHVtblg7Ci0JaW50IGNhcmV0TGluZSA9IGdldENhcmV0TGluZSgpOwotCWludCBsaW5lU3RhcnRPZmZzZXQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZShjYXJldExpbmUpOwotCQotCS8vIHJlc2V0IGNvbHVtblggb24gc2VsZWN0aW9uCi0Jb2xkQ29sdW1uWCA9IGNvbHVtblggPSBnZXRYQXRPZmZzZXQoCi0JCWNvbnRlbnQuZ2V0TGluZShjYXJldExpbmUpLCBjYXJldExpbmUsIGNhcmV0T2Zmc2V0IC0gbGluZVN0YXJ0T2Zmc2V0KTsKLQlkb1BhZ2VEb3duKHRydWUsIGxpbmVzKTsKLQljb2x1bW5YID0gb2xkQ29sdW1uWDsKLX0KLS8qKgotICogU2Nyb2xscyBvbmUgcGFnZSB1cCBzbyB0aGF0IHRoZSBmaXJzdCBsaW5lICh0cnVuY2F0ZWQgb3Igd2hvbGUpCi0gKiBvZiB0aGUgY3VycmVudCBwYWdlIGJlY29tZXMgdGhlIGZ1bGx5IHZpc2libGUgbGFzdCBsaW5lLgotICogVGhlIGNhcmV0IGlzIHNjcm9sbGVkIHRoZSBzYW1lIG51bWJlciBvZiBsaW5lcyBzbyB0aGF0IGl0cyBsb2NhdGlvbiAKLSAqIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGluZSByZW1haW5zIHRoZSBzYW1lLiBUaGUgZXhjZXB0aW9uIGlzIHRoZSBiZWdpbm5pbmcgCi0gKiBvZiB0aGUgdGV4dCB3aGVyZSBhIGZ1bGwgcGFnZSBzY3JvbGwgaXMgbm90IHBvc3NpYmxlLiBJbiB0aGlzIGNhc2UgdGhlCi0gKiBjYXJldCBpcyBtb3ZlZCBpbiBmcm9udCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgotICogPHA+Ci0gKiBBZGp1c3RzIHRoZSBzZWxlY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSBjYXJldCBjaGFuZ2UuIFRoaXMgY2FuIGVpdGhlciBhZGQKLSAqIHRvIG9yIHN1YnRyYWN0IGZyb20gdGhlIG9sZCBzZWxlY3Rpb24sIGRlcGVuZGluZyBvbiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uCi0gKiBkaXJlY3Rpb24uCi0gKiA8L3A+Ci0gKi8KLXZvaWQgZG9TZWxlY3Rpb25QYWdlVXAoaW50IGxpbmVzKSB7Ci0JaW50IG9sZENvbHVtblg7Ci0JaW50IGNhcmV0TGluZSA9IGdldENhcmV0TGluZSgpOwotCWludCBsaW5lU3RhcnRPZmZzZXQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZShjYXJldExpbmUpOwotCQotCS8vIHJlc2V0IGNvbHVtblggb24gc2VsZWN0aW9uCi0Jb2xkQ29sdW1uWCA9IGNvbHVtblggPSBnZXRYQXRPZmZzZXQoCi0JCWNvbnRlbnQuZ2V0TGluZShjYXJldExpbmUpLCBjYXJldExpbmUsIGNhcmV0T2Zmc2V0IC0gbGluZVN0YXJ0T2Zmc2V0KTsKLQlkb1BhZ2VVcCh0cnVlLCBsaW5lcyk7Ci0JY29sdW1uWCA9IG9sZENvbHVtblg7Ci19Ci0vKioKLSAqIE1vdmVzIHRoZSBjYXJldCB0byB0aGUgZW5kIG9mIHRoZSBuZXh0IHdvcmQgLgotICovCi12b2lkIGRvU2VsZWN0aW9uV29yZE5leHQoKSB7Ci0JaW50IG5ld0NhcmV0T2Zmc2V0ID0gZ2V0V29yZEVuZChjYXJldE9mZnNldCk7Ci0JLy8gRm9yY2Ugc3ltbWV0cmljYWwgbW92ZW1lbnQgZm9yIHdvcmQgbmV4dCBhbmQgcHJldmlvdXMuIEZpeGVzIDE0NTM2Ci0JYWR2YW5jaW5nID0gZmFsc2U7Ci0JLy8gZG9uJ3QgY2hhbmdlIGNhcmV0IHBvc2l0aW9uIGlmIGluIHNpbmdsZSBsaW5lIG1vZGUgYW5kIHRoZSBjdXJzb3IgCi0JLy8gd291bGQgYmUgb24gYSBkaWZmZXJlbnQgbGluZS4gZml4ZXMgNTY3MwotCWlmICghaXNTaW5nbGVMaW5lKCkgfHwgCi0JCWNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KGNhcmV0T2Zmc2V0KSA9PSBjb250ZW50LmdldExpbmVBdE9mZnNldChuZXdDYXJldE9mZnNldCkpIHsKLQkJY2FyZXRPZmZzZXQgPSBuZXdDYXJldE9mZnNldDsKLQkJc2hvd0NhcmV0KCk7Ci0JfQotfQotLyoqCi0gKiBNb3ZlcyB0aGUgY2FyZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwcmV2aW91cyB3b3JkLgotICovCi12b2lkIGRvU2VsZWN0aW9uV29yZFByZXZpb3VzKCkgewotCWludCBjYXJldExpbmU7CQotCWFkdmFuY2luZyA9IGZhbHNlOwotCWNhcmV0T2Zmc2V0ID0gZ2V0V29yZFN0YXJ0KGNhcmV0T2Zmc2V0KTsKLQljYXJldExpbmUgPSBjb250ZW50LmdldExpbmVBdE9mZnNldChjYXJldE9mZnNldCk7Ci0JLy8gd29yZCBwcmV2aW91cyBhbHdheXMgY29tZXMgZnJvbSBib3R0b20gbGluZS4gd2hlbgotCS8vIHdyYXBwaW5nIGxpbmVzLCBzdGF5IG9uIGJvdHRvbSBsaW5lIHdoZW4gb24gbGluZSBib3VuZGFyeQotCWlmICh3b3JkV3JhcCAmJiBjYXJldExpbmUgPCBjb250ZW50LmdldExpbmVDb3VudCgpIC0gMSAmJgotCQljYXJldE9mZnNldCA9PSBjb250ZW50LmdldE9mZnNldEF0TGluZShjYXJldExpbmUgKyAxKSkgewotCQljYXJldExpbmUrKzsKLQl9Ci0Jc2hvd0NhcmV0KGNhcmV0TGluZSk7Ci19Ci0vKioKLSAqIE1vdmVzIHRoZSBjYXJldCBvbmUgY2hhcmFjdGVyIHRvIHRoZSBsZWZ0LiAgRG8gbm90IGdvIHRvIHRoZSBwcmV2aW91cyBsaW5lLgotICogV2hlbiBpbiBhIGJpZGkgbG9jYWxlIGFuZCBhdCBhIFIyTCBjaGFyYWN0ZXIgdGhlIGNhcmV0IGlzIG1vdmVkIHRvIHRoZSAKLSAqIGJlZ2lubmluZyBvZiB0aGUgUjJMIHNlZ21lbnQgKHZpc3VhbGx5IHJpZ2h0KSBhbmQgdGhlbiBvbmUgY2hhcmFjdGVyIHRvIHRoZSAKLSAqIGxlZnQgKHZpc3VhbGx5IGxlZnQgYmVjYXVzZSBpdCdzIG5vdyBpbiBhIEwyUiBzZWdtZW50KS4KLSAqLwotdm9pZCBkb1Zpc3VhbFByZXZpb3VzKCkgewotCWNhcmV0T2Zmc2V0ID0gZ2V0Q2x1c3RlclByZXZpb3VzKGNhcmV0T2Zmc2V0LCBnZXRDYXJldExpbmUoKSk7Ci0Jc2hvd0NhcmV0KCk7Ci19Ci0vKioKLSAqIE1vdmVzIHRoZSBjYXJldCBvbmUgY2hhcmFjdGVyIHRvIHRoZSByaWdodC4gIERvIG5vdCBnbyB0byB0aGUgbmV4dCBsaW5lLgotICogV2hlbiBpbiBhIGJpZGkgbG9jYWxlIGFuZCBhdCBhIFIyTCBjaGFyYWN0ZXIgdGhlIGNhcmV0IGlzIG1vdmVkIHRvIHRoZSAKLSAqIGVuZCBvZiB0aGUgUjJMIHNlZ21lbnQgKHZpc3VhbGx5IGxlZnQpIGFuZCB0aGVuIG9uZSBjaGFyYWN0ZXIgdG8gdGhlIAotICogcmlnaHQgKHZpc3VhbGx5IHJpZ2h0IGJlY2F1c2UgaXQncyBub3cgaW4gYSBMMlIgc2VnbWVudCkuCi0gKi8KLXZvaWQgZG9WaXN1YWxOZXh0KCkgewotCWNhcmV0T2Zmc2V0ID0gZ2V0Q2x1c3Rlck5leHQoY2FyZXRPZmZzZXQsIGdldENhcmV0TGluZSgpKTsKLQlzaG93Q2FyZXQoKTsKLX0KLS8qKgotICogTW92ZXMgdGhlIGNhcmV0IHRvIHRoZSBlbmQgb2YgdGhlIG5leHQgd29yZC4KLSAqIElmIGEgc2VsZWN0aW9uIGV4aXN0cywgbW92ZSB0aGUgY2FyZXQgdG8gdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uCi0gKiBhbmQgcmVtb3ZlIHRoZSBzZWxlY3Rpb24uCi0gKi8KLXZvaWQgZG9Xb3JkTmV4dCgpIHsKLQlpZiAoc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueCA+IDApIHsKLQkJaW50IGNhcmV0TGluZTsKLQkJCi0JCWNhcmV0T2Zmc2V0ID0gc2VsZWN0aW9uLnk7Ci0JCWNhcmV0TGluZSA9IGdldENhcmV0TGluZSgpOwotCQlzaG93Q2FyZXQoY2FyZXRMaW5lKTsKLQl9Ci0JZWxzZSB7Ci0JCWRvU2VsZWN0aW9uV29yZE5leHQoKTsKLQl9Ci19Ci0vKioKLSAqIE1vdmVzIHRoZSBjYXJldCB0byB0aGUgc3RhcnQgb2YgdGhlIHByZXZpb3VzIHdvcmQuCi0gKiBJZiBhIHNlbGVjdGlvbiBleGlzdHMsIG1vdmUgdGhlIGNhcmV0IHRvIHRoZSBzdGFydCBvZiB0aGUgc2VsZWN0aW9uCi0gKiBhbmQgcmVtb3ZlIHRoZSBzZWxlY3Rpb24uCi0gKi8KLXZvaWQgZG9Xb3JkUHJldmlvdXMoKSB7Ci0JaWYgKHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLnggPiAwKSB7Ci0JCWludCBjYXJldExpbmU7Ci0JCQotCQljYXJldE9mZnNldCA9IHNlbGVjdGlvbi54OwotCQljYXJldExpbmUgPSBnZXRDYXJldExpbmUoKTsKLQkJc2hvd0NhcmV0KGNhcmV0TGluZSk7Ci0JfQotCWVsc2UgewotCQlkb1NlbGVjdGlvbldvcmRQcmV2aW91cygpOwotCX0KLX0KLS8qKgotICogRHJhd3MgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUuCi0gKiBEcmF3IGRpcmVjdGx5IHdpdGhvdXQgaW52YWxpZGF0aW5nIHRoZSBhZmZlY3RlZCBhcmVhIHdoZW4gY2xlYXJCYWNrZ3JvdW5kIGlzIAotICogZmFsc2UuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbgotICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24KLSAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGgKLSAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodAotICogQHBhcmFtIGNsZWFyQmFja2dyb3VuZCB0cnVlPWNsZWFyIHRoZSBiYWNrZ3JvdW5kIGJ5IGludmFsaWRhdGluZyB0aGUgcmVxdWVzdGVkIAotICogCXJlZHJhdyBhcmVhLCBmYWxzZT1kcmF3IHRoZSBmb3JlZ3JvdW5kIGRpcmVjdGx5IHdpdGhvdXQgaW52YWxpZGF0aW5nIHRoZSAKLSAqIAlyZWRyYXcgYXJlYS4KLSAqLwotdm9pZCBkcmF3KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIGNsZWFyQmFja2dyb3VuZCkgewotCWlmIChjbGVhckJhY2tncm91bmQpIHsKLQkJcmVkcmF3KHggKyBsZWZ0TWFyZ2luLCB5ICsgdG9wTWFyZ2luLCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTsKLQl9Ci0JZWxzZSB7Ci0JCWludCBzdGFydExpbmUgPSAoeSArIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0KSAvIGxpbmVIZWlnaHQ7Ci0JCWludCBlbmRZID0geSArIGhlaWdodDsKLQkJaW50IHBhaW50WUZyb21Ub3BMaW5lID0gKHN0YXJ0TGluZSAtIHRvcEluZGV4KSAqIGxpbmVIZWlnaHQ7Ci0JCWludCB0b3BMaW5lT2Zmc2V0ID0gKHRvcEluZGV4ICogbGluZUhlaWdodCAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0KTsKLQkJaW50IHBhaW50WSA9IHBhaW50WUZyb21Ub3BMaW5lICsgdG9wTGluZU9mZnNldCArIHRvcE1hcmdpbjsJLy8gYWRqdXN0IHkgcG9zaXRpb24gZm9yIHBpeGVsIGJhc2VkIHNjcm9sbGluZwotCQlpbnQgbGluZUNvdW50ID0gY29udGVudC5nZXRMaW5lQ291bnQoKTsKLQkJQ29sb3IgYmFja2dyb3VuZCA9IGdldEJhY2tncm91bmQoKTsKLQkJQ29sb3IgZm9yZWdyb3VuZCA9IGdldEZvcmVncm91bmQoKTsKLQkJR0MgZ2MgPSBnZXRHQygpOwotCQotCQlpZiAoaXNTaW5nbGVMaW5lKCkpIHsKLQkJCWxpbmVDb3VudCA9IDE7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IHN0YXJ0TGluZTsgcGFpbnRZIDwgZW5kWSAmJiBpIDwgbGluZUNvdW50OyBpKyssIHBhaW50WSArPSBsaW5lSGVpZ2h0KSB7Ci0JCQlTdHJpbmcgbGluZSA9IGNvbnRlbnQuZ2V0TGluZShpKTsKLQkJCXJlbmRlcmVyLmRyYXdMaW5lKGxpbmUsIGksIHBhaW50WSwgZ2MsIGJhY2tncm91bmQsIGZvcmVncm91bmQsIGNsZWFyQmFja2dyb3VuZCk7Ci0JCX0KLQkJZ2MuZGlzcG9zZSgpOwkKLQl9Ci19Ci0vKiogCi0gKiBFbmRzIHRoZSBhdXRvc2Nyb2xsIHByb2Nlc3MuCi0gKi8KLXZvaWQgZW5kQXV0b1Njcm9sbCgpIHsKLQlhdXRvU2Nyb2xsRGlyZWN0aW9uID0gU1dULk5VTEw7Ci19Ci1wdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZCgpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChiYWNrZ3JvdW5kID09IG51bGwpIHsKLQkJcmV0dXJuIGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQl9Ci0JcmV0dXJuIGJhY2tncm91bmQ7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGJhc2VsaW5lLCBpbiBwaXhlbHMuIAotICogCi0gKiBAcmV0dXJuIGJhc2VsaW5lIHRoZSBiYXNlbGluZQotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50IGdldEJhc2VsaW5lKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIHJlbmRlcmVyLmdldEJhc2VsaW5lKCk7Ci19Ci0vKioKLSAqIEdldHMgdGhlIEJJREkgY29sb3JpbmcgbW9kZS4gIFdoZW4gdHJ1ZSB0aGUgQklESSB0ZXh0IGRpc3BsYXkKLSAqIGFsZ29yaXRobSBpcyBhcHBsaWVkIHRvIHNlZ21lbnRzIG9mIHRleHQgdGhhdCBhcmUgdGhlIHNhbWUKLSAqIGNvbG9yLgotICoKLSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgY29sb3JpbmcgbW9kZQotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBAZGVwcmVjYXRlZCB1c2UgQmlkaVNlZ21lbnRMaXN0ZW5lciBpbnN0ZWFkLgotICogPC9wPgotICovCi1wdWJsaWMgYm9vbGVhbiBnZXRCaWRpQ29sb3JpbmcoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gYmlkaUNvbG9yaW5nOwotfQotLyoqIAotICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZnVsbHkgdmlzaWJsZSBsaW5lLgotICogPHA+Ci0gKgotICogQHJldHVybiBpbmRleCBvZiB0aGUgbGFzdCBmdWxseSB2aXNpYmxlIGxpbmUuCi0gKi8KLWludCBnZXRCb3R0b21JbmRleCgpIHsKLQlpbnQgbGluZUNvdW50ID0gMTsKLQkKLQlpZiAobGluZUhlaWdodCAhPSAwKSB7Ci0JCS8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGxpbmVzIHRoYXQgYXJlIGZ1bGx5IHZpc2libGUKLQkJaW50IHBhcnRpYWxUb3BMaW5lSGVpZ2h0ID0gdG9wSW5kZXggKiBsaW5lSGVpZ2h0IC0gdmVydGljYWxTY3JvbGxPZmZzZXQ7Ci0JCWxpbmVDb3VudCA9IChnZXRDbGllbnRBcmVhKCkuaGVpZ2h0IC0gcGFydGlhbFRvcExpbmVIZWlnaHQpIC8gbGluZUhlaWdodDsKLQl9Ci0JcmV0dXJuIE1hdGgubWluKGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgLSAxLCB0b3BJbmRleCArIE1hdGgubWF4KDAsIGxpbmVDb3VudCAtIDEpKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgY2FyZXQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0LgotICogPHA+Ci0gKgotICogQHJldHVybiB0aGUgY2FyZXQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0LgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldENhcmV0T2Zmc2V0KCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JCi0JcmV0dXJuIGNhcmV0T2Zmc2V0OwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBjYXJldCBvZmZzZXQgYXQgdGhlIGdpdmVuIHggbG9jYXRpb24gaW4gdGhlIGxpbmUuCi0gKiBUaGUgY2FyZXQgb2Zmc2V0IGlzIHRoZSBvZmZzZXQgb2YgdGhlIGNoYXJhY3RlciB3aGVyZSB0aGUgY2FyZXQgd2lsbCBiZQotICogcGxhY2VkIHdoZW4gYSBtb3VzZSBjbGljayBvY2N1cnMuIFRoZSBjYXJldCBvZmZzZXQgd2lsbCBiZSB0aGUgb2Zmc2V0IG9mIAotICogdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgY2xpY2tlZCBvbmUgaWYgdGhlIG1vdXNlIGNsaWNrIG9jY3VycyBhdCB0aGUgc2Vjb25kIAotICogaGFsZiBvZiBhIGNoYXJhY3Rlci4KLSAqIERvZXNuJ3QgcHJvcGVybHkgaGFuZGxlIGxpZ2F0dXJlcyBhbmQgb3RoZXIgY29udGV4dCBkZXBlbmRlbnQgY2hhcmFjdGVycyAKLSAqIHVubGVzcyB0aGUgY3VycmVudCBsb2NhbGUgaXMgYSBiaWRpIGxvY2FsZS4gCi0gKiBMaWdhdHVyZXMgYXJlIGhhbmRsZWQgcHJvcGVybHkgYXMgbG9uZyBhcyB0aGV5IGRvbid0IG9jY3VyIGF0IGxpbmVYT2Zmc2V0LgotICogPHA+Ci0gKgotICogQHBhcmFtIGxpbmUgdGV4dCBvZiB0aGUgbGluZSB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBpbgotICogQHBhcmFtIGxpbmVPZmZzZXQgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGxpbmUuIAotICogCTAgYmFzZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudC4KLSAqIEBwYXJhbSBsaW5lWE9mZnNldCB4IGxvY2F0aW9uIGluIHRoZSBsaW5lCi0gKiBAcmV0dXJuIGNhcmV0IG9mZnNldCBhdCB0aGUgeCBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCi0gKi8KLWludCBnZXRPZmZzZXRBdFgoU3RyaW5nIGxpbmUsIGludCBsaW5lT2Zmc2V0LCBpbnQgbGluZVhPZmZzZXQpIHsKLQlpbnQgeCA9IGxpbmVYT2Zmc2V0IC0gbGVmdE1hcmdpbiArIGhvcml6b250YWxTY3JvbGxPZmZzZXQ7Ci0JVGV4dExheW91dCBsYXlvdXQgPSByZW5kZXJlci5nZXRUZXh0TGF5b3V0KGxpbmUsIGxpbmVPZmZzZXQpOwotCWludFtdIHRyYWlsaW5nID0gbmV3IGludFsxXTsKLQlpbnQgb2Zmc2V0SW5MaW5lID0gbGF5b3V0LmdldE9mZnNldCh4LCAwLCB0cmFpbGluZyk7Ci0JYWR2YW5jaW5nID0gZmFsc2U7Ci0JaWYgKHRyYWlsaW5nWzBdICE9IDApIHsKLQkJaW50IGxpbmVMZW5ndGggPSBsaW5lLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0SW5MaW5lICsgdHJhaWxpbmdbMF0gPj0gbGluZUxlbmd0aCkgewotCQkJb2Zmc2V0SW5MaW5lID0gbGluZUxlbmd0aDsKLQkJCWFkdmFuY2luZyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbGV2ZWw7Ci0JCQlpbnQgb2Zmc2V0ID0gb2Zmc2V0SW5MaW5lOwotCQkJd2hpbGUgKG9mZnNldCA+IDAgJiYgQ2hhcmFjdGVyLmlzRGlnaXQobGluZS5jaGFyQXQob2Zmc2V0KSkpIG9mZnNldC0tOwotCQkJaWYgKG9mZnNldCA9PSAwICYmIENoYXJhY3Rlci5pc0RpZ2l0KGxpbmUuY2hhckF0KG9mZnNldCkpKSB7Ci0JCQkJbGV2ZWwgPSBpc01pcnJvcmVkKCkgPyAxIDogMDsKLQkJCX0gZWxzZSB7Ci0JCQkJbGV2ZWwgPSBsYXlvdXQuZ2V0TGV2ZWwob2Zmc2V0KSAmIDB4MTsKLQkJCX0KLQkJCW9mZnNldEluTGluZSArPSB0cmFpbGluZ1swXTsKLQkJCWludCB0cmFpbGluZ0xldmVsID0gbGF5b3V0LmdldExldmVsKG9mZnNldEluTGluZSkgJiAweDE7Ci0JCQlhZHZhbmNpbmcgID0gKGxldmVsIF4gdHJhaWxpbmdMZXZlbCkgIT0gMDsKLQkJfQotCX0KLQlyZW5kZXJlci5kaXNwb3NlVGV4dExheW91dChsYXlvdXQpOwotCXJldHVybiBvZmZzZXRJbkxpbmU7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGNhcmV0IHdpZHRoLgotICogPHA+Ci0gKgotICogQHJldHVybiB0aGUgY2FyZXQgd2lkdGgsIDAgaWYgY2FyZXQgaXMgbnVsbC4KLSAqLwotaW50IGdldENhcmV0V2lkdGgoKSB7Ci0JQ2FyZXQgY2FyZXQgPSBnZXRDYXJldCgpOwotCWlmIChjYXJldCA9PSBudWxsKSByZXR1cm4gMDsKLQlyZXR1cm4gY2FyZXQuZ2V0U2l6ZSgpLng7Ci19Ci1PYmplY3QgZ2V0Q2xpcGJvYXJkQ29udGVudChpbnQgY2xpcGJvYXJkVHlwZSkgewotCVRleHRUcmFuc2ZlciBwbGFpblRleHRUcmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCXJldHVybiBjbGlwYm9hcmQuZ2V0Q29udGVudHMocGxhaW5UZXh0VHJhbnNmZXIsIGNsaXBib2FyZFR5cGUpOwotfQotaW50IGdldENsdXN0ZXJOZXh0KGludCBvZmZzZXQsIGludCBsaW5lSW5kZXgpIHsKLQlTdHJpbmcgbGluZSA9IGNvbnRlbnQuZ2V0TGluZShsaW5lSW5kZXgpOwotCWludCBsaW5lT2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZUluZGV4KTsJCi0JVGV4dExheW91dCBsYXlvdXQgPSByZW5kZXJlci5nZXRUZXh0TGF5b3V0KGxpbmUsIGxpbmVPZmZzZXQpOwotCW9mZnNldCAtPSBsaW5lT2Zmc2V0OwotCW9mZnNldCA9IGxheW91dC5nZXROZXh0T2Zmc2V0KG9mZnNldCwgU1dULk1PVkVNRU5UX0NMVVNURVIpOwotCW9mZnNldCArPSBsaW5lT2Zmc2V0OwotCXJlbmRlcmVyLmRpc3Bvc2VUZXh0TGF5b3V0KGxheW91dCk7Ci0JcmV0dXJuIG9mZnNldDsKLX0KLWludCBnZXRDbHVzdGVyUHJldmlvdXMoaW50IG9mZnNldCwgaW50IGxpbmVJbmRleCkgewotCVN0cmluZyBsaW5lID0gY29udGVudC5nZXRMaW5lKGxpbmVJbmRleCk7Ci0JaW50IGxpbmVPZmZzZXQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZShsaW5lSW5kZXgpOwkKLQlUZXh0TGF5b3V0IGxheW91dCA9IHJlbmRlcmVyLmdldFRleHRMYXlvdXQobGluZSwgbGluZU9mZnNldCk7Ci0Jb2Zmc2V0IC09IGxpbmVPZmZzZXQ7Ci0Jb2Zmc2V0ID0gbGF5b3V0LmdldFByZXZpb3VzT2Zmc2V0KG9mZnNldCwgU1dULk1PVkVNRU5UX0NMVVNURVIpOwotCW9mZnNldCArPSBsaW5lT2Zmc2V0OwotCXJlbmRlcmVyLmRpc3Bvc2VUZXh0TGF5b3V0KGxheW91dCk7Ci0JcmV0dXJuIG9mZnNldDsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgY29udGVudCBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHVzZWQgZm9yIHRleHQgc3RvcmFnZQotICogb3IgbnVsbCBpZiBubyB1c2VyIGRlZmluZWQgY29udGVudCBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBzZXQuCi0gKiA8cD4KLSAqCi0gKiBAcmV0dXJuIGNvbnRlbnQgaW1wbGVtZW50YXRpb24gdGhhdCBpcyB1c2VkIGZvciB0ZXh0IHN0b3JhZ2Ugb3IgbnVsbCAKLSAqIGlmIG5vIHVzZXIgZGVmaW5lZCBjb250ZW50IGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIHNldC4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFN0eWxlZFRleHRDb250ZW50IGdldENvbnRlbnQoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQkKLQlyZXR1cm4gbG9naWNhbENvbnRlbnQ7Ci19Ci0vKiogCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHdpZGdldCBpbXBsZW1lbnRzIGRvdWJsZSBjbGljayBtb3VzZSBiZWhhdmlvci4KLSAqIDxwPgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiBkb3VibGUgY2xpY2tpbmcgYSB3b3JkIHNlbGVjdHMgdGhlIHdvcmQsIGZhbHNlIGlmIGRvdWJsZSBjbGlja3MKLSAqIGhhdmUgdGhlIHNhbWUgZWZmZWN0IGFzIHJlZ3VsYXIgbW91c2UgY2xpY2tzCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBib29sZWFuIGdldERvdWJsZUNsaWNrRW5hYmxlZCgpIHsKLQljaGVja1dpZGdldCgpOwotCXJldHVybiBkb3VibGVDbGlja0VuYWJsZWQ7Ci19Ci0vKioKLSAqIFJldHVybnMgd2hldGhlciB0aGUgd2lkZ2V0IGNvbnRlbnQgY2FuIGJlIGVkaXRlZC4KLSAqIDxwPgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiBjb250ZW50IGNhbiBiZSBlZGl0ZWQsIGZhbHNlIG90aGVyd2lzZQotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYm9vbGVhbiBnZXRFZGl0YWJsZSgpIHsKLQljaGVja1dpZGdldCgpOwotCXJldHVybiBlZGl0YWJsZTsKLX0KLXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKGZvcmVncm91bmQgPT0gbnVsbCkgewotCQlyZXR1cm4gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotCX0KLQlyZXR1cm4gZm9yZWdyb3VuZDsKLX0KLS8qKiAKLSAqIFJldHVybiBhIEdDIHRvIHVzZSBmb3IgcmVuZGVyaW5nIGFuZCB1cGRhdGUgdGhlIGNhY2hlZCBmb250IHN0eWxlIHRvCi0gKiByZXByZXNlbnQgdGhlIGN1cnJlbnQgc3R5bGUuCi0gKiA8cD4KLSAqCi0gKiBAcmV0dXJuIEdDLgotICovCi1HQyBnZXRHQygpIHsKLQlyZXR1cm4gbmV3IEdDKHRoaXMpOwotfQotLyoqIAotICogUmV0dXJucyB0aGUgaG9yaXpvbnRhbCBzY3JvbGwgaW5jcmVtZW50LgotICogPHA+Ci0gKgotICogQHJldHVybiBob3Jpem9udGFsIHNjcm9sbCBpbmNyZW1lbnQuCi0gKi8KLWludCBnZXRIb3Jpem9udGFsSW5jcmVtZW50KCkgewotCUdDIGdjID0gZ2V0R0MoKTsKLQlpbnQgaW5jcmVtZW50ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCi0JZ2MuZGlzcG9zZSgpOwotCXJldHVybiBpbmNyZW1lbnQ7Ci19Ci0vKiogCi0gKiBSZXR1cm5zIHRoZSBob3Jpem9udGFsIHNjcm9sbCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgotICogPHA+Ci0gKgotICogQHJldHVybiBob3Jpem9udGFsIHNjcm9sbCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLAotICogbWVhc3VyZWQgaW4gY2hhcmFjdGVyIGluY3JlbWVudHMgc3RhcnRpbmcgYXQgMCwgaWYgPiAwIHRoZSBjb250ZW50IGlzIHNjcm9sbGVkCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0SG9yaXpvbnRhbEluZGV4KCkgewkKLQljaGVja1dpZGdldCgpOwotCXJldHVybiBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0IC8gZ2V0SG9yaXpvbnRhbEluY3JlbWVudCgpOwotfQotLyoqIAotICogUmV0dXJucyB0aGUgaG9yaXpvbnRhbCBzY3JvbGwgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZS4KLSAqIDxwPgotICoKLSAqIEByZXR1cm4gdGhlIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUsCi0gKiBtZWFzdXJlZCBpbiBwaXhlbCBzdGFydGluZyBhdCAwLCBpZiA+IDAgdGhlIGNvbnRlbnQgaXMgc2Nyb2xsZWQuCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0SG9yaXpvbnRhbFBpeGVsKCkgewkKLQljaGVja1dpZGdldCgpOwotCXJldHVybiBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0OwotfQotLyoqIAotICogUmV0dXJucyB0aGUgYWN0aW9uIGFzc2lnbmVkIHRvIHRoZSBrZXkuCi0gKiBSZXR1cm5zIFNXVC5OVUxMIGlmIHRoZXJlIGlzIG5vIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBrZXkgYSBrZXkgY29kZSBkZWZpbmVkIGluIFNXVC5qYXZhIG9yIGEgY2hhcmFjdGVyLiAKLSAqIAlPcHRpb25hbGx5IE9SZCB3aXRoIGEgc3RhdGUgbWFzay4gIFByZWZlcnJlZCBzdGF0ZSBtYXNrcyBhcmUgb25lIG9yIG1vcmUgb2YKLSAqICBTV1QuTU9EMSwgU1dULk1PRDIsIFNXVC5NT0QzLCBzaW5jZSB0aGVzZSBtYXNrcyBhY2NvdW50IGZvciBtb2RpZmllciBwbGF0Zm9ybSAKLSAqICBkaWZmZXJlbmNlcy4gIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSBjYXNlcyB3aGVyZSB1c2luZyB0aGUgc3BlY2lmaWMgc3RhdGUgbWFza3MKLSAqICAoaS5lLiwgU1dULkNUUkwsIFNXVC5TSElGVCwgU1dULkFMVCwgU1dULkNPTU1BTkQpIG1ha2VzIHNlbnNlLgotICogQHJldHVybiBvbmUgb2YgdGhlIHByZWRlZmluZWQgYWN0aW9ucyBkZWZpbmVkIGluIFNULmphdmEgb3IgU1dULk5VTEwgCi0gKiAJaWYgdGhlcmUgaXMgbm8gYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldEtleUJpbmRpbmcoaW50IGtleSkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JSW50ZWdlciBhY3Rpb24gPSAoSW50ZWdlcikga2V5QWN0aW9uTWFwLmdldChuZXcgSW50ZWdlcihrZXkpKTsKLQlpbnQgaW50QWN0aW9uOwotCQotCWlmIChhY3Rpb24gPT0gbnVsbCkgewotCQlpbnRBY3Rpb24gPSBTV1QuTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCWludEFjdGlvbiA9IGFjdGlvbi5pbnRWYWx1ZSgpOwotCX0KLQlyZXR1cm4gaW50QWN0aW9uOwotfQotLyoqCi0gKiBHZXRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KLSAqIDxwPgotICoKLSAqIEByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHdpZGdldAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldENoYXJDb3VudCgpIHsKLQljaGVja1dpZGdldCgpOwotCXJldHVybiBjb250ZW50LmdldENoYXJDb3VudCgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiBpbmRleC4KLSAqIFJldHVybnMgbnVsbCBpZiBhIExpbmVCYWNrZ3JvdW5kTGlzdGVuZXIgaGFzIGJlZW4gc2V0IG9yIGlmIG5vIGJhY2tncm91bmQgCi0gKiBjb2xvciBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIHRoZSBsaW5lLiBTaG91bGQgbm90IGJlIGNhbGxlZCBpZiBhCi0gKiBMaW5lQmFja2dyb3VuZExpc3RlbmVyIGhhcyBiZWVuIHNldCBzaW5jZSB0aGUgbGlzdGVuZXIgbWFpbnRhaW5zIHRoZQotICogbGluZSBiYWNrZ3JvdW5kIGNvbG9ycy4KLSAqIAotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgbGluZQotICogQHJldHVybiB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIHdoZW4gdGhlIGluZGV4IGlzIGludmFsaWQ8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIENvbG9yIGdldExpbmVCYWNrZ3JvdW5kKGludCBpbmRleCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JQ29sb3IgbGluZUJhY2tncm91bmQgPSBudWxsOwotCQotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBsb2dpY2FsQ29udGVudC5nZXRMaW5lQ291bnQoKSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCX0KLQlpZiAoIXVzZXJMaW5lQmFja2dyb3VuZCkgewotCQlsaW5lQmFja2dyb3VuZCA9IGRlZmF1bHRMaW5lU3R5bGVyLmdldExpbmVCYWNrZ3JvdW5kKGluZGV4KTsKLQl9Ci0JcmV0dXJuIGxpbmVCYWNrZ3JvdW5kOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBsaW5lIGJhY2tncm91bmQgZGF0YSBmb3IgdGhlIGdpdmVuIGxpbmUgb3IgbnVsbCBpZiAKLSAqIHRoZXJlIGlzIG5vbmUuCi0gKiA8cD4KLSAqIEBwYXJhbSBsaW5lT2Zmc2V0IG9mZnNldCBvZiB0aGUgbGluZSBzdGFydCByZWxhdGl2ZSB0byB0aGUgc3RhcnQKLSAqIAlvZiB0aGUgY29udGVudC4KLSAqIEBwYXJhbSBsaW5lIGxpbmUgdG8gZ2V0IGxpbmUgYmFja2dyb3VuZCBkYXRhIGZvcgotICogQHJldHVybiBsaW5lIGJhY2tncm91bmQgZGF0YSBmb3IgdGhlIGdpdmVuIGxpbmUuCi0gKi8KLVN0eWxlZFRleHRFdmVudCBnZXRMaW5lQmFja2dyb3VuZERhdGEoaW50IGxpbmVPZmZzZXQsIFN0cmluZyBsaW5lKSB7Ci0JcmV0dXJuIHNlbmRMaW5lRXZlbnQoTGluZUdldEJhY2tncm91bmQsIGxpbmVPZmZzZXQsIGxpbmUpOwotfQotLyoqIAotICogR2V0cyB0aGUgbnVtYmVyIG9mIHRleHQgbGluZXMuCi0gKiA8cD4KLSAqCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHdpZGdldAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldExpbmVDb3VudCgpIHsKLQljaGVja1dpZGdldCgpOwotCXJldHVybiBnZXRMaW5lQXRPZmZzZXQoZ2V0Q2hhckNvdW50KCkpICsgMTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRoYXQgY2FuIGJlIGNvbXBsZXRlbHkgZGlzcGxheWVkIGluIHRoZSAKLSAqIHdpZGdldCBjbGllbnQgYXJlYS4KLSAqIDxwPgotICoKLSAqIEByZXR1cm4gbnVtYmVyIG9mIGxpbmVzIHRoYXQgY2FuIGJlIGNvbXBsZXRlbHkgZGlzcGxheWVkIGluIHRoZSB3aWRnZXQgCi0gKiAJY2xpZW50IGFyZWEuCi0gKi8KLWludCBnZXRMaW5lQ291bnRXaG9sZSgpIHsKLQlpbnQgbGluZUNvdW50OwotCQotCWlmIChsaW5lSGVpZ2h0ICE9IDApIHsKLQkJbGluZUNvdW50ID0gZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCAvIGxpbmVIZWlnaHQ7Ci0JfQotCWVsc2UgewotCQlsaW5lQ291bnQgPSAxOwotCX0KLQlyZXR1cm4gbGluZUNvdW50OwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBsaW5lIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGluIHRoZSB0ZXh0Ci0gKiB3aGVyZSAwICZsdD0gb2Zmc2V0ICZsdD0gZ2V0Q2hhckNvdW50KCkgc28gdGhhdCBnZXRMaW5lQXRPZmZzZXQoZ2V0Q2hhckNvdW50KCkpCi0gKiByZXR1cm5zIHRoZSBsaW5lIG9mIHRoZSBpbnNlcnQgbG9jYXRpb24uCi0gKgotICogQHBhcmFtIG9mZnNldCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50LiAKLSAqIAkwIDw9IG9mZnNldCA8PSBnZXRDaGFyQ291bnQoKQotICogQHJldHVybiBsaW5lIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGluIHRoZSB0ZXh0Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIHdoZW4gdGhlIG9mZnNldCBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSAoPCAwIG9yID4gZ2V0Q2hhckNvdW50KCkpPC9saT4gCi0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldExpbmVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQkKLQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBnZXRDaGFyQ291bnQoKSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfUkFOR0UpOwkJCi0JfQotCXJldHVybiBsb2dpY2FsQ29udGVudC5nZXRMaW5lQXRPZmZzZXQob2Zmc2V0KTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbGluZSBkZWxpbWl0ZXIgdXNlZCBmb3IgZW50ZXJpbmcgbmV3IGxpbmVzIGJ5IGtleSBkb3duCi0gKiBvciBwYXN0ZSBvcGVyYXRpb24uCi0gKiA8cD4KLSAqCi0gKiBAcmV0dXJuIGxpbmUgZGVsaW1pdGVyIHVzZWQgZm9yIGVudGVyaW5nIG5ldyBsaW5lcyBieSBrZXkgZG93bgotICogb3IgcGFzdGUgb3BlcmF0aW9uLgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gY29udGVudC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgYSBTdHlsZWRUZXh0RXZlbnQgdGhhdCBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGRhdGEgc3VjaCAKLSAqIGFzIHN0eWxlcyBhbmQgYmFja2dyb3VuZCBjb2xvciBmb3IgYSBsaW5lLgotICogVGhlIHNwZWNpZmllZCBsaW5lIG1heSBiZSBhIHZpc3VhbCAod3JhcHBlZCkgbGluZSBpZiBpbiB3b3JkIAotICogd3JhcCBtb2RlLiBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGZvciBhIGxvZ2ljYWwgCi0gKiAodW53cmFwcGVkKSBsaW5lLgotICogPHA+Ci0gKgotICogQHBhcmFtIGxpbmVPZmZzZXQgb2Zmc2V0IG9mIHRoZSBsaW5lLiBUaGlzIG1heSBiZSB0aGUgb2Zmc2V0IG9mCi0gKiAJYSB2aXN1YWwgbGluZSBpZiB0aGUgd2lkZ2V0IGlzIGluIHdvcmQgd3JhcCBtb2RlLgotICogQHBhcmFtIGxpbmUgbGluZSB0ZXh0LiBUaGlzIG1heSBiZSB0aGUgdGV4dCBvZiBhIHZpc3VhbGxpbmUgaWYgCi0gKiAJdGhlIHdpZGdldCBpcyBpbiB3b3JkIHdyYXAgbW9kZS4KLSAqIEByZXR1cm4gU3R5bGVkVGV4dEV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBsaW5lIGRhdGEgCi0gKiAJZm9yIHRoZSBnaXZlbiBsaW5lLgotICovCi1TdHlsZWRUZXh0RXZlbnQgc2VuZExpbmVFdmVudChpbnQgZXZlbnRUeXBlLCBpbnQgbGluZU9mZnNldCwgU3RyaW5nIGxpbmUpIHsKLQlTdHlsZWRUZXh0RXZlbnQgZXZlbnQgPSBudWxsOwotCQotCWlmIChpc0xpc3RlbmluZyhldmVudFR5cGUpKSB7Ci0JCWV2ZW50ID0gbmV3IFN0eWxlZFRleHRFdmVudChsb2dpY2FsQ29udGVudCk7CQkKLQkJaWYgKHdvcmRXcmFwKSB7Ci0JCSAgICAvLyBpZiB3b3JkIHdyYXAgaXMgb24sIHRoZSBsaW5lIG9mZnNldCBhbmQgdGV4dCBtYXkgYmUgdmlzdWFsICh3cmFwcGVkKQotCQkgICAgaW50IGxpbmVJbmRleCA9IGxvZ2ljYWxDb250ZW50LmdldExpbmVBdE9mZnNldChsaW5lT2Zmc2V0KTsKLQkJICAgIAotCQkgICAgZXZlbnQuZGV0YWlsID0gbG9naWNhbENvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxpbmVJbmRleCk7Ci0JCQlldmVudC50ZXh0ID0gbG9naWNhbENvbnRlbnQuZ2V0TGluZShsaW5lSW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJZXZlbnQuZGV0YWlsID0gbGluZU9mZnNldDsKLQkJCWV2ZW50LnRleHQgPSBsaW5lOwotCQl9Ci0JCW5vdGlmeUxpc3RlbmVycyhldmVudFR5cGUsIGV2ZW50KTsKLQl9Ci0JcmV0dXJuIGV2ZW50OwkKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbGluZSBoZWlnaHQuCi0gKiA8cD4KLSAqCi0gKiBAcmV0dXJuIGxpbmUgaGVpZ2h0IGluIHBpeGVsLgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldExpbmVIZWlnaHQoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gbGluZUhlaWdodDsKLX0KLS8qKgotICogUmV0dXJucyBhIExpbmVDYWNoZSBpbXBsZW1lbnRhdGlvbi4gRGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90Ci0gKiB3b3JkIHdyYXAgaXMgb24gdGhpcyBtYXkgYmUgYSBsaW5lIHdyYXBwaW5nIG9yIGxpbmUgd2lkdGggCi0gKiBjYWxjdWxhdGluZyBpbXBsZW1lbnRhaXRvbi4KLSAqIDxwPgotICogCi0gKiBAcGFyYW0gY29udGVudCBTdHlsZWRUZXh0Q29udGVudCB0byBjcmVhdGUgdGhlIExpbmVDYWNoZSBvbi4KLSAqIEByZXR1cm4gYSBMaW5lQ2FjaGUgaW1wbGVtZW50YXRpb24KLSAqLwotTGluZUNhY2hlIGdldExpbmVDYWNoZShTdHlsZWRUZXh0Q29udGVudCBjb250ZW50KSB7Ci0JTGluZUNhY2hlIGxpbmVDYWNoZTsKLSAgICAKLQlpZiAod29yZFdyYXApIHsKLQkJbGluZUNhY2hlID0gbmV3IFdvcmRXcmFwQ2FjaGUodGhpcywgKFdyYXBwZWRDb250ZW50KSBjb250ZW50KTsKLQl9Ci0JZWxzZSB7Ci0JCWxpbmVDYWNoZSA9IG5ldyBDb250ZW50V2lkdGhDYWNoZSh0aGlzLCBjb250ZW50KTsKLQl9Ci0JcmV0dXJuIGxpbmVDYWNoZTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbGluZSBzdHlsZSBkYXRhIGZvciB0aGUgZ2l2ZW4gbGluZSBvciBudWxsIGlmIHRoZXJlIGlzIAotICogbm9uZS4gSWYgdGhlcmUgaXMgYSBMaW5lU3R5bGVMaXN0ZW5lciBidXQgaXQgZG9lcyBub3Qgc2V0IGFueSBzdHlsZXMsIAotICogdGhlIFN0eWxlZFRleHRFdmVudC5zdHlsZXMgZmllbGQgd2lsbCBiZSBpbml0aWFsaXplZCB0byBhbiBlbXB0eSAKLSAqIGFycmF5LgotICogPHA+Ci0gKiAKLSAqIEBwYXJhbSBsaW5lT2Zmc2V0IG9mZnNldCBvZiB0aGUgbGluZSBzdGFydCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgCi0gKiAJdGhlIGNvbnRlbnQuCi0gKiBAcGFyYW0gbGluZSBsaW5lIHRvIGdldCBsaW5lIHN0eWxlcyBmb3IKLSAqIEByZXR1cm4gbGluZSBzdHlsZSBkYXRhIGZvciB0aGUgZ2l2ZW4gbGluZS4gU3R5bGVzIG1heSBzdGFydCBiZWZvcmUgCi0gKiAJbGluZSBzdGFydCBhbmQgZW5kIGFmdGVyIGxpbmUgZW5kCi0gKi8KLVN0eWxlZFRleHRFdmVudCBnZXRMaW5lU3R5bGVEYXRhKGludCBsaW5lT2Zmc2V0LCBTdHJpbmcgbGluZSkgewotCXJldHVybiBzZW5kTGluZUV2ZW50KExpbmVHZXRTdHlsZSwgbGluZU9mZnNldCwgbGluZSk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHgsIHkgbG9jYXRpb24gb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBjaGFyYWN0ZXIgCi0gKiBib3VuZGluZyBib3ggYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgaW4gdGhlIHRleHQuIFRoZSBwb2ludCBpcyAKLSAqIHJlbGF0aXZlIHRvIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgd2lkZ2V0IGNsaWVudCBhcmVhLgotICogPHA+Ci0gKgotICogQHBhcmFtIG9mZnNldCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50LiAKLSAqIAkwIDw9IG9mZnNldCA8PSBnZXRDaGFyQ291bnQoKQotICogQHJldHVybiB4LCB5IGxvY2F0aW9uIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgY2hhcmFjdGVyIAotICogCWJvdW5kaW5nIGJveCBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBpbiB0aGUgdGV4dC4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0Ugd2hlbiB0aGUgb2Zmc2V0IGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlICg8IDAgb3IgPiBnZXRDaGFyQ291bnQoKSk8L2xpPiAKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbkF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGdldENoYXJDb3VudCgpKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9SQU5HRSk7CQkKLQl9Ci0JaW50IGxpbmUgPSBjb250ZW50LmdldExpbmVBdE9mZnNldChvZmZzZXQpOwotCWludCBsaW5lT2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZSk7Ci0JU3RyaW5nIGxpbmVDb250ZW50ID0gY29udGVudC5nZXRMaW5lKGxpbmUpOwotCWludCB4ID0gZ2V0WEF0T2Zmc2V0KGxpbmVDb250ZW50LCBsaW5lLCBvZmZzZXQgLSBsaW5lT2Zmc2V0KTsKLQlpbnQgeSA9IGxpbmUgKiBsaW5lSGVpZ2h0IC0gdmVydGljYWxTY3JvbGxPZmZzZXQ7Ci0JCi0JcmV0dXJuIG5ldyBQb2ludCh4LCB5KTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiBsaW5lLgotICogPHA+Ci0gKgotICogQHBhcmFtIGxpbmVJbmRleCBpbmRleCBvZiB0aGUgbGluZSwgMCBiYXNlZCByZWxhdGl2ZSB0byB0aGUgZmlyc3QgCi0gKiAJbGluZSBpbiB0aGUgY29udGVudC4gMCA8PSBsaW5lSW5kZXggPCBnZXRMaW5lQ291bnQoKSwgZXhjZXB0Ci0gKiAJbGluZUluZGV4IG1heSBhbHdheXMgYmUgMAotICogQHJldHVybiBvZmZzZXQgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGxpbmUsIHJlbGF0aXZlIHRvCi0gKiAJdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQuIFRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGRvY3VtZW50IGlzCi0gKglhdCBvZmZzZXQgMC4gIAotICogIFdoZW4gdGhlcmUgYXJlIG5vdCBhbnkgbGluZXMsIGdldE9mZnNldEF0TGluZSgwKSBpcyBhIHZhbGlkIGNhbGwgdGhhdCAKLSAqIAlhbnN3ZXJzIDAuCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIHdoZW4gdGhlIG9mZnNldCBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSAoPCAwIG9yID4gZ2V0Q2hhckNvdW50KCkpPC9saT4gCi0gKiA8L3VsPgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50IGdldE9mZnNldEF0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQkKLQlpZiAobGluZUluZGV4IDwgMCB8fCAKLQkJKGxpbmVJbmRleCA+IDAgJiYgbGluZUluZGV4ID49IGxvZ2ljYWxDb250ZW50LmdldExpbmVDb3VudCgpKSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfUkFOR0UpOwkJCi0JfQotCXJldHVybiBsb2dpY2FsQ29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZUluZGV4KTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIHJlbGF0aXZlIAotICogdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgZG9jdW1lbnQuCi0gKiBUaGUgcmV0dXJuIHZhbHVlIHJlZmxlY3RzIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IHRoYXQgdGhlIGNhcmV0IHdpbGwKLSAqIGJlIHBsYWNlZCBhdCBpZiBhIG1vdXNlIGNsaWNrIG9jY3VycmVkIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCi0gKiBJZiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBsb2NhdGlvbiBpcyBiZXlvbmQgdGhlIGNlbnRlciBvZiBhIGNoYXJhY3RlcgotICogdGhlIHJldHVybmVkIG9mZnNldCB3aWxsIGJlIGJlaGluZCB0aGUgY2hhcmFjdGVyLgotICogPHA+Ci0gKgotICogQHBhcmFtIHBvaW50IHRoZSBvcmlnaW4gb2YgY2hhcmFjdGVyIGJvdW5kaW5nIGJveCByZWxhdGl2ZSB0byAKLSAqIAl0aGUgb3JpZ2luIG9mIHRoZSB3aWRnZXQgY2xpZW50IGFyZWEuCi0gKiBAcmV0dXJuIG9mZnNldCBvZiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiByZWxhdGl2ZSAKLSAqIAl0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBkb2N1bWVudC4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiBwb2ludCBpcyBudWxsPC9saT4KLSAqICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgd2hlbiB0aGVyZSBpcyBubyBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldE9mZnNldEF0TG9jYXRpb24oUG9pbnQgcG9pbnQpIHsKLQljaGVja1dpZGdldCgpOwotCVRleHRMYXlvdXQgbGF5b3V0OwotCWludCBsaW5lOwotCWludCBsaW5lT2Zmc2V0OwotCWludCBvZmZzZXRJbkxpbmU7Ci0JU3RyaW5nIGxpbmVUZXh0OwotCQotCWlmIChwb2ludCA9PSBudWxsKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JfQotCS8vIGlzIHkgYWJvdmUgZmlyc3QgbGluZSBvciBpcyB4IGJlZm9yZSBmaXJzdCBjb2x1bW4/Ci0JaWYgKHBvaW50LnkgKyB2ZXJ0aWNhbFNjcm9sbE9mZnNldCA8IDAgfHwgcG9pbnQueCArIGhvcml6b250YWxTY3JvbGxPZmZzZXQgPCAwKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfQkKLQlsaW5lID0gKGdldFRvcFBpeGVsKCkgKyBwb2ludC55KSAvIGxpbmVIZWlnaHQ7CQotCS8vIGRvZXMgdGhlIHJlZmVyZW5jZWQgbGluZSBleGlzdD8KLQlpZiAobGluZSA+PSBjb250ZW50LmdldExpbmVDb3VudCgpKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfQkKLQlsaW5lVGV4dCA9IGNvbnRlbnQuZ2V0TGluZShsaW5lKTsKLQlsaW5lT2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZSk7CQotCQotCWludCB4ID0gcG9pbnQueCAtIGxlZnRNYXJnaW4gKyBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0OwotCWxheW91dCA9IHJlbmRlcmVyLmdldFRleHRMYXlvdXQobGluZVRleHQsIGxpbmVPZmZzZXQpOwotCVJlY3RhbmdsZSByZWN0ID0gbGF5b3V0LmdldExpbmVCb3VuZHMoMCk7Ci0JaWYgKHggPiByZWN0LnggKyByZWN0LndpZHRoKSB7Ci0JCXJlbmRlcmVyLmRpc3Bvc2VUZXh0TGF5b3V0KGxheW91dCk7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfQotCWludFtdIHRyYWlsaW5nID0gbmV3IGludFsxXTsKLQlvZmZzZXRJbkxpbmUgPSBsYXlvdXQuZ2V0T2Zmc2V0KHgsIDAsIHRyYWlsaW5nKTsKLQlpZiAob2Zmc2V0SW5MaW5lICE9IGxpbmVUZXh0Lmxlbmd0aCgpIC0gMSkgewotCQlvZmZzZXRJbkxpbmUgPSBNYXRoLm1pbihsaW5lVGV4dC5sZW5ndGgoKSwgb2Zmc2V0SW5MaW5lICsgdHJhaWxpbmdbMF0pOwkJCi0JfQotCXJlbmRlcmVyLmRpc3Bvc2VUZXh0TGF5b3V0KGxheW91dCk7Ci0JcmV0dXJuIGxpbmVPZmZzZXQgKyBvZmZzZXRJbkxpbmU7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIG9mZnNldCBhdCB0aGUgc3BlY2lmaWVkIHggbG9jYXRpb24gaW4gdGhlIHNwZWNpZmllZCBsaW5lLgotICogPHA+Ci0gKgotICogQHBhcmFtIHgJeCBsb2NhdGlvbiBvZiB0aGUgbW91c2UgbG9jYXRpb24KLSAqIEBwYXJhbSBsaW5lCWxpbmUgdGhlIG1vdXNlIGxvY2F0aW9uIGlzIGluCi0gKiBAcmV0dXJuIHRoZSBvZmZzZXQgYXQgdGhlIHNwZWNpZmllZCB4IGxvY2F0aW9uIGluIHRoZSBzcGVjaWZpZWQgbGluZSwKLSAqIAlyZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudAotICovCi1pbnQgZ2V0T2Zmc2V0QXRNb3VzZUxvY2F0aW9uKGludCB4LCBpbnQgbGluZSkgewotCVN0cmluZyBsaW5lVGV4dCA9IGNvbnRlbnQuZ2V0TGluZShsaW5lKTsKLQlpbnQgbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxpbmUpOwotCXJldHVybiBnZXRPZmZzZXRBdFgobGluZVRleHQsIGxpbmVPZmZzZXQsIHgpICsgbGluZU9mZnNldDsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgcmVjZWl2ZXIuCi0gKgotICogQHJldHVybiB0aGUgb3JpZW50YXRpb24gc3R5bGUKLSAqIAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMi4xLjIKLSAqLwotcHVibGljIGludCBnZXRPcmllbnRhdGlvbiAoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gaXNNaXJyb3JlZCgpID8gU1dULlJJR0hUX1RPX0xFRlQgOiBTV1QuTEVGVF9UT19SSUdIVDsKLX0KLS8qKiAKLSAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHBhcnRpYWxseSB2aXNpYmxlIGxpbmUuCi0gKgotICogQHJldHVybiBpbmRleCBvZiB0aGUgbGFzdCBwYXJ0aWFsbHkgdmlzaWJsZSBsaW5lLgotICovCi1pbnQgZ2V0UGFydGlhbEJvdHRvbUluZGV4KCkgewotCWludCBwYXJ0aWFsTGluZUNvdW50ID0gQ29tcGF0aWJpbGl0eS5jZWlsKGdldENsaWVudEFyZWEoKS5oZWlnaHQsIGxpbmVIZWlnaHQpOwotCXJldHVybiBNYXRoLm1pbihjb250ZW50LmdldExpbmVDb3VudCgpLCB0b3BJbmRleCArIHBhcnRpYWxMaW5lQ291bnQpIC0gMTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgY29udGVudCBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlIHVzaW5nIHRoZSBwbGF0Zm9ybSBsaW5lIAotICogZGVsaW1pdGVyIHRvIHNlcGFyYXRlIGxpbmVzLgotICogPHA+Ci0gKgotICogQHBhcmFtIHdyaXRlciB0aGUgVGV4dFdyaXRlciB0byB3cml0ZSBsaW5lIHRleHQgaW50bwotICogQHJldHVybiB0aGUgY29udGVudCBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlIHVzaW5nIHRoZSBwbGF0Zm9ybSBsaW5lIAotICogCWRlbGltaXRlciB0byBzZXBhcmF0ZSBsaW5lcyBhcyB3cml0dGVuIGJ5IHRoZSBzcGVjaWZpZWQgVGV4dFdyaXRlci4KLSAqLwotU3RyaW5nIGdldFBsYXRmb3JtRGVsaW1pdGVkVGV4dChUZXh0V3JpdGVyIHdyaXRlcikgewotCWludCBlbmQgPSB3cml0ZXIuZ2V0U3RhcnQoKSArIHdyaXRlci5nZXRDaGFyQ291bnQoKTsKLQlpbnQgc3RhcnRMaW5lID0gbG9naWNhbENvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KHdyaXRlci5nZXRTdGFydCgpKTsKLQlpbnQgZW5kTGluZSA9IGxvZ2ljYWxDb250ZW50LmdldExpbmVBdE9mZnNldChlbmQpOwotCVN0cmluZyBlbmRMaW5lVGV4dCA9IGxvZ2ljYWxDb250ZW50LmdldExpbmUoZW5kTGluZSk7Ci0JaW50IGVuZExpbmVPZmZzZXQgPSBsb2dpY2FsQ29udGVudC5nZXRPZmZzZXRBdExpbmUoZW5kTGluZSk7Ci0JCi0JZm9yIChpbnQgaSA9IHN0YXJ0TGluZTsgaSA8PSBlbmRMaW5lOyBpKyspIHsKLQkJd3JpdGVyLndyaXRlTGluZShsb2dpY2FsQ29udGVudC5nZXRMaW5lKGkpLCBsb2dpY2FsQ29udGVudC5nZXRPZmZzZXRBdExpbmUoaSkpOwotCQlpZiAoaSA8IGVuZExpbmUpIHsKLQkJCXdyaXRlci53cml0ZUxpbmVEZWxpbWl0ZXIoUGxhdGZvcm1MaW5lRGVsaW1pdGVyKTsKLQkJfQotCX0KLQlpZiAoZW5kID4gZW5kTGluZU9mZnNldCArIGVuZExpbmVUZXh0Lmxlbmd0aCgpKSB7Ci0JCXdyaXRlci53cml0ZUxpbmVEZWxpbWl0ZXIoUGxhdGZvcm1MaW5lRGVsaW1pdGVyKTsKLQl9Ci0Jd3JpdGVyLmNsb3NlKCk7Ci0JcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24uCi0gKiA8cD4KLSAqIFRleHQgc2VsZWN0aW9ucyBhcmUgc3BlY2lmaWVkIGluIHRlcm1zIG9mIGNhcmV0IHBvc2l0aW9ucy4gIEluIGEgdGV4dAotICogd2lkZ2V0IHRoYXQgY29udGFpbnMgTiBjaGFyYWN0ZXJzLCB0aGVyZSBhcmUgTisxIGNhcmV0IHBvc2l0aW9ucywgCi0gKiByYW5naW5nIGZyb20gMC4uTgotICogPHA+Ci0gKgotICogQHJldHVybiBzdGFydCBhbmQgZW5kIG9mIHRoZSBzZWxlY3Rpb24sIHggaXMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgCi0gKiAJc2VsZWN0ZWQgY2hhcmFjdGVyLCB5IGlzIHRoZSBvZmZzZXQgYWZ0ZXIgdGhlIGxhc3Qgc2VsZWN0ZWQgY2hhcmFjdGVyLgotICogIFRoZSBzZWxlY3Rpb24gdmFsdWVzIHJldHVybmVkIGFyZSB2aXN1YWwgKGkuZS4sIHggd2lsbCBhbHdheXMgYWx3YXlzIGJlICAgCi0gKiAgPD0geSkuICBUbyBkZXRlcm1pbmUgaWYgYSBzZWxlY3Rpb24gaXMgcmlnaHQtdG8tbGVmdCAoUnRvTCkgdnMuIGxlZnQtdG8tcmlnaHQgCi0gKiAgKEx0b1IpLCBjb21wYXJlIHRoZSBjYXJldE9mZnNldCB0byB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc2VsZWN0aW9uIAotICogIChlLmcuLCBjYXJldE9mZnNldCA9PSBzdGFydCBvZiBzZWxlY3Rpb24gaW1wbGllcyB0aGF0IHRoZSBzZWxlY3Rpb24gaXMgUnRvTCkuCi0gKiBAc2VlICNnZXRTZWxlY3Rpb25SYW5nZQotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIG5ldyBQb2ludChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24uCi0gKiA8cD4KLSAqCi0gKiBAcmV0dXJuIHN0YXJ0IGFuZCBsZW5ndGggb2YgdGhlIHNlbGVjdGlvbiwgeCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSAKLSAqIAlmaXJzdCBzZWxlY3RlZCBjaGFyYWN0ZXIsIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIAotICogCXdpZGdldCBjb250ZW50LiB5IGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlbGVjdGlvbi4gCi0gKiAgVGhlIHNlbGVjdGlvbiB2YWx1ZXMgcmV0dXJuZWQgYXJlIHZpc3VhbCAoaS5lLiwgbGVuZ3RoIHdpbGwgYWx3YXlzIGFsd2F5cyBiZSAgIAotICogIHBvc2l0aXZlKS4gIFRvIGRldGVybWluZSBpZiBhIHNlbGVjdGlvbiBpcyByaWdodC10by1sZWZ0IChSdG9MKSB2cy4gbGVmdC10by1yaWdodCAKLSAqICAoTHRvUiksIGNvbXBhcmUgdGhlIGNhcmV0T2Zmc2V0IHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzZWxlY3Rpb24gCi0gKiAgKGUuZy4sIGNhcmV0T2Zmc2V0ID09IHN0YXJ0IG9mIHNlbGVjdGlvbiBpbXBsaWVzIHRoYXQgdGhlIHNlbGVjdGlvbiBpcyBSdG9MKS4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFBvaW50IGdldFNlbGVjdGlvblJhbmdlKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIG5ldyBQb2ludChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHJlY2VpdmVyJ3Mgc2VsZWN0aW9uIGJhY2tncm91bmQgY29sb3IuCi0gKgotICogQHJldHVybiB0aGUgc2VsZWN0aW9uIGJhY2tncm91bmQgY29sb3IKLSAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBDb2xvciBnZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKHNlbGVjdGlvbkJhY2tncm91bmQgPT0gbnVsbCkgewotCQlyZXR1cm4gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTik7Ci0JfQotCXJldHVybiBzZWxlY3Rpb25CYWNrZ3JvdW5kOwotfQotLyoqCi0gKiBHZXRzIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgY2hhcmFjdGVycy4KLSAqIDxwPgotICoKLSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBjaGFyYWN0ZXJzLgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldFNlbGVjdGlvbkNvdW50KCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIGdldFNlbGVjdGlvblJhbmdlKCkueTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgcmVjZWl2ZXIncyBzZWxlY3Rpb24gZm9yZWdyb3VuZCBjb2xvci4KLSAqCi0gKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24gZm9yZWdyb3VuZCBjb2xvcgotICoKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIENvbG9yIGdldFNlbGVjdGlvbkZvcmVncm91bmQoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoc2VsZWN0aW9uRm9yZWdyb3VuZCA9PSBudWxsKSB7Ci0JCXJldHVybiBnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQpOwotCX0KLQlyZXR1cm4gc2VsZWN0aW9uRm9yZWdyb3VuZDsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgdGV4dC4KLSAqIDxwPgotICoKLSAqIEByZXR1cm4gc2VsZWN0ZWQgdGV4dCwgb3IgYW4gZW1wdHkgU3RyaW5nIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGlvbi4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb25UZXh0KCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIGNvbnRlbnQuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54KTsKLX0KLQotcHVibGljIGludCBnZXRTdHlsZSgpIHsKLQlpbnQgc3R5bGUgPSBzdXBlci5nZXRTdHlsZSgpOwotCXN0eWxlICY9IH4oU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuUklHSFRfVE9fTEVGVCB8IFNXVC5NSVJST1JFRCk7Ci0JaWYgKGlzTWlycm9yZWQoKSkgewotCQlzdHlsZSB8PSBTV1QuUklHSFRfVE9fTEVGVCB8IFNXVC5NSVJST1JFRDsKLQl9IGVsc2UgewotCQlzdHlsZSB8PSBTV1QuTEVGVF9UT19SSUdIVDsKLQl9Ci0JcmV0dXJuIHN0eWxlOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHRleHQgc2VnbWVudHMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBpZiB0aGV5IAotICogaGFkIGEgZGlmZmVyZW50IGRpcmVjdGlvbiB0aGFuIHRoZSBzdXJyb3VuZGluZyB0ZXh0LgotICogPHA+Ci0gKgotICogQHBhcmFtIGxpbmVPZmZzZXQgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGxpbmUuIAotICogCTAgYmFzZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudC4KLSAqIEBwYXJhbSBsaW5lIHRleHQgb2YgdGhlIGxpbmUgdG8gc3BlY2lmeSBiaWRpIHNlZ21lbnRzIGZvcgotICogQHJldHVybiB0ZXh0IHNlZ21lbnRzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgaWYgdGhleSBoYWQgYQotICogCWRpZmZlcmVudCBkaXJlY3Rpb24gdGhhbiB0aGUgc3Vycm91bmRpbmcgdGV4dC4gT25seSB0aGUgc3RhcnQgCi0gKiAJaW5kZXggb2YgYSBzZWdtZW50IGlzIHNwZWNpZmllZCwgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAqIAlsaW5lLiBBbHdheXMgc3RhcnRzIHdpdGggMCBhbmQgZW5kcyB3aXRoIHRoZSBsaW5lIGxlbmd0aC4gCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSBzZWdtZW50IGluZGljZXMgcmV0dXJuZWQgCi0gKiAJCWJ5IHRoZSBsaXN0ZW5lciBkbyBub3Qgc3RhcnQgd2l0aCAwLCBhcmUgbm90IGluIGFzY2VuZGluZyBvcmRlciwKLSAqIAkJZXhjZWVkIHRoZSBsaW5lIGxlbmd0aCBvciBoYXZlIGR1cGxpY2F0ZXM8L2xpPgotICogPC91bD4KLSAqLwotaW50IFtdIGdldEJpZGlTZWdtZW50cyhpbnQgbGluZU9mZnNldCwgU3RyaW5nIGxpbmUpIHsKLQlpZiAoIWlzTGlzdGVuaW5nKExpbmVHZXRTZWdtZW50cykpIHsKLQkJcmV0dXJuIGdldEJpZGlTZWdtZW50c0NvbXBhdGliaWxpdHkobGluZSwgbGluZU9mZnNldCk7Ci0JfQotCVN0eWxlZFRleHRFdmVudCBldmVudCA9IHNlbmRMaW5lRXZlbnQoTGluZUdldFNlZ21lbnRzLCBsaW5lT2Zmc2V0LCBsaW5lKTsKLQlpbnQgbGluZUxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0JaW50W10gc2VnbWVudHM7Ci0JaWYgKGV2ZW50ID09IG51bGwgfHwgZXZlbnQuc2VnbWVudHMgPT0gbnVsbCB8fCBldmVudC5zZWdtZW50cy5sZW5ndGggPT0gMCkgewotCQlzZWdtZW50cyA9IG5ldyBpbnRbXSB7MCwgbGluZUxlbmd0aH07Ci0JfQotCWVsc2UgewotCQlpbnQgc2VnbWVudENvdW50ID0gZXZlbnQuc2VnbWVudHMubGVuZ3RoOwotCQkKLQkJLy8gdGVzdCBzZWdtZW50IGluZGV4IGNvbnNpc3RlbmN5Ci0JCWlmIChldmVudC5zZWdtZW50c1swXSAhPSAwKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCQl9IAkKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50Q291bnQ7IGkrKykgewotCQkJaWYgKGV2ZW50LnNlZ21lbnRzW2ldIDw9IGV2ZW50LnNlZ21lbnRzW2kgLSAxXSB8fCBldmVudC5zZWdtZW50c1tpXSA+IGxpbmVMZW5ndGgpIHsKLQkJCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCQkJfSAJCi0JCX0KLQkJLy8gZW5zdXJlIHRoYXQgbGFzdCBzZWdtZW50IGluZGV4IGlzIGxpbmUgZW5kIG9mZnNldAotCQlpZiAoZXZlbnQuc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0gIT0gbGluZUxlbmd0aCkgewotCQkJc2VnbWVudHMgPSBuZXcgaW50W3NlZ21lbnRDb3VudCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShldmVudC5zZWdtZW50cywgMCwgc2VnbWVudHMsIDAsIHNlZ21lbnRDb3VudCk7Ci0JCQlzZWdtZW50c1tzZWdtZW50Q291bnRdID0gbGluZUxlbmd0aDsKLQkJfQotCQllbHNlIHsKLQkJCXNlZ21lbnRzID0gZXZlbnQuc2VnbWVudHM7Ci0JCX0KLQl9Ci0JcmV0dXJuIHNlZ21lbnRzOwotfQotLyoqCi0gKiBAc2VlICNnZXRCaWRpU2VnbWVudHMKLSAqIFN1cHBvcnRzIGRlcHJlY2F0ZWQgc2V0QmlkaUNvbG9yaW5nIEFQSS4gUmVtb3ZlIHdoZW4gQVBJIGlzIHJlbW92ZWQuCi0gKi8KLWludCBbXSBnZXRCaWRpU2VnbWVudHNDb21wYXRpYmlsaXR5KFN0cmluZyBsaW5lLCBpbnQgbGluZU9mZnNldCkgewotCVN0eWxlZFRleHRFdmVudCBldmVudDsKLQlTdHlsZVJhbmdlIFtdIHN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlIFswXTsKLQlpbnQgbGluZUxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0JaWYgKCFiaWRpQ29sb3JpbmcpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7MCwgbGluZUxlbmd0aH07Ci0JfQotCWV2ZW50ID0gcmVuZGVyZXIuZ2V0TGluZVN0eWxlRGF0YShsaW5lT2Zmc2V0LCBsaW5lKTsKLQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQlzdHlsZXMgPSBldmVudC5zdHlsZXM7Ci0JfQotCWlmIChzdHlsZXMubGVuZ3RoID09IDApIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7MCwgbGluZUxlbmd0aH07Ci0JfQotCWludCBrPTAsIGNvdW50ID0gMTsKLQl3aGlsZSAoayA8IHN0eWxlcy5sZW5ndGggJiYgc3R5bGVzW2tdLnN0YXJ0ID09IDAgJiYgc3R5bGVzW2tdLmxlbmd0aCA9PSBsaW5lTGVuZ3RoKSB7Ci0JCWsrKzsKLQl9Ci0JaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbKHN0eWxlcy5sZW5ndGggLSBrKSAqIDIgKyAyXTsKLQlmb3IgKGludCBpID0gazsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykgewotCQlTdHlsZVJhbmdlIHN0eWxlID0gc3R5bGVzW2ldOwotCQlpbnQgc3R5bGVMaW5lU3RhcnQgPSBNYXRoLm1heChzdHlsZS5zdGFydCAtIGxpbmVPZmZzZXQsIDApOwotCQlpbnQgc3R5bGVMaW5lRW5kID0gTWF0aC5tYXgoc3R5bGUuc3RhcnQgKyBzdHlsZS5sZW5ndGggLSBsaW5lT2Zmc2V0LCBzdHlsZUxpbmVTdGFydCk7Ci0JCXN0eWxlTGluZUVuZCA9IE1hdGgubWluIChzdHlsZUxpbmVFbmQsIGxpbmUubGVuZ3RoICgpKTsKLQkJaWYgKGkgPiAwICYmIGNvdW50ID4gMSAmJgotCQkJKChzdHlsZUxpbmVTdGFydCA+PSBvZmZzZXRzW2NvdW50LTJdICYmIHN0eWxlTGluZVN0YXJ0IDw9IG9mZnNldHNbY291bnQtMV0pIHx8Ci0JCQkgKHN0eWxlTGluZUVuZCA+PSBvZmZzZXRzW2NvdW50LTJdICYmIHN0eWxlTGluZUVuZCA8PSBvZmZzZXRzW2NvdW50LTFdKSkgJiYKLQkJCSBzdHlsZS5zaW1pbGFyVG8oc3R5bGVzW2ktMV0pKSB7Ci0JCQlvZmZzZXRzW2NvdW50LTJdID0gTWF0aC5taW4ob2Zmc2V0c1tjb3VudC0yXSwgc3R5bGVMaW5lU3RhcnQpOwotCQkJb2Zmc2V0c1tjb3VudC0xXSA9IE1hdGgubWF4KG9mZnNldHNbY291bnQtMV0sIHN0eWxlTGluZUVuZCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc3R5bGVMaW5lU3RhcnQgPiBvZmZzZXRzW2NvdW50IC0gMV0pIHsKLQkJCQlvZmZzZXRzW2NvdW50XSA9IHN0eWxlTGluZVN0YXJ0OwotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCQlvZmZzZXRzW2NvdW50XSA9IHN0eWxlTGluZUVuZDsKLQkJCWNvdW50Kys7Ci0JCX0KLQl9Ci0JLy8gYWRkIG9mZnNldCBmb3IgbGFzdCBub24tY29sb3JlZCBzZWdtZW50IGluIGxpbmUsIGlmIGFueQotCWlmIChsaW5lTGVuZ3RoID4gb2Zmc2V0c1tjb3VudC0xXSkgewotCQlvZmZzZXRzIFtjb3VudF0gPSBsaW5lTGVuZ3RoOwotCQljb3VudCsrOwotCX0JCQotCWlmIChjb3VudCA9PSBvZmZzZXRzLmxlbmd0aCkgewotCQlyZXR1cm4gb2Zmc2V0czsKLQl9Ci0JaW50IFtdIHJlc3VsdCA9IG5ldyBpbnQgW2NvdW50XTsKLQlTeXN0ZW0uYXJyYXljb3B5IChvZmZzZXRzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBzdHlsZSByYW5nZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgotICogUmV0dXJucyBudWxsIGlmIGEgTGluZVN0eWxlTGlzdGVuZXIgaGFzIGJlZW4gc2V0IG9yIGlmIGEgc3R5bGUgaXMgbm90IHNldAotICogZm9yIHRoZSBvZmZzZXQuIAotICogU2hvdWxkIG5vdCBiZSBjYWxsZWQgaWYgYSBMaW5lU3R5bGVMaXN0ZW5lciBoYXMgYmVlbiBzZXQgc2luY2UgdGhlIAotICogbGlzdGVuZXIgbWFpbnRhaW5zIHRoZSBzdHlsZXMuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gcmV0dXJuIHRoZSBzdHlsZSBmb3IuIAotICogCTAgPD0gb2Zmc2V0IDwgZ2V0Q2hhckNvdW50KCkgbXVzdCBiZSB0cnVlLgotICogQHJldHVybiBhIFN0eWxlUmFuZ2Ugd2l0aCBzdGFydCA9PSBvZmZzZXQgYW5kIGxlbmd0aCA9PSAxLCBpbmRpY2F0aW5nCi0gKiAJdGhlIHN0eWxlIGF0IHRoZSBnaXZlbiBvZmZzZXQuIG51bGwgaWYgYSBMaW5lU3R5bGVMaXN0ZW5lciBoYXMgYmVlbiBzZXQgCi0gKiAJb3IgaWYgYSBzdHlsZSBpcyBub3Qgc2V0IGZvciB0aGUgZ2l2ZW4gb2Zmc2V0LgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCB3aGVuIHRoZSBvZmZzZXQgaXMgaW52YWxpZDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgU3R5bGVSYW5nZSBnZXRTdHlsZVJhbmdlQXRPZmZzZXQoaW50IG9mZnNldCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IGdldENoYXJDb3VudCgpKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfSAJCi0JaWYgKCF1c2VyTGluZVN0eWxlKSB7Ci0JCXJldHVybiBkZWZhdWx0TGluZVN0eWxlci5nZXRTdHlsZVJhbmdlQXRPZmZzZXQob2Zmc2V0KTsKLQl9IAotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBzdHlsZXMuCi0gKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIGEgTGluZVN0eWxlTGlzdGVuZXIgaGFzIGJlZW4gc2V0LiAKLSAqIFNob3VsZCBub3QgYmUgY2FsbGVkIGlmIGEgTGluZVN0eWxlTGlzdGVuZXIgaGFzIGJlZW4gc2V0IHNpbmNlIHRoZSAKLSAqIGxpc3RlbmVyIG1haW50YWlucyB0aGUgc3R5bGVzLgotICogPHA+Ci0gKgotICogQHJldHVybiB0aGUgc3R5bGVzIG9yIGFuIGVtcHR5IGFycmF5IGlmIGEgTGluZVN0eWxlTGlzdGVuZXIgaGFzIGJlZW4gc2V0LgotICAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBTdHlsZVJhbmdlIFtdIGdldFN0eWxlUmFuZ2VzKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JU3R5bGVSYW5nZSBzdHlsZXNbXTsKLQkKLQlpZiAoIXVzZXJMaW5lU3R5bGUpIHsKLQkJc3R5bGVzID0gZGVmYXVsdExpbmVTdHlsZXIuZ2V0U3R5bGVSYW5nZXMoKTsKLQl9Ci0JZWxzZSB7Ci0JCXN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlWzBdOwotCX0KLQlyZXR1cm4gc3R5bGVzOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBzdHlsZXMgZm9yIHRoZSBnaXZlbiB0ZXh0IHJhbmdlLgotICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiBhIExpbmVTdHlsZUxpc3RlbmVyIGhhcyBiZWVuIHNldC4gCi0gKiBTaG91bGQgbm90IGJlIGNhbGxlZCBpZiBhIExpbmVTdHlsZUxpc3RlbmVyIGhhcyBiZWVuIHNldCBzaW5jZSB0aGUgCi0gKiBsaXN0ZW5lciBtYWludGFpbnMgdGhlIHN0eWxlcy4KLSAqIAotICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHN0eWxlIHJhbmdlcyB0byByZXR1cm4KLSAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBzdHlsZSByYW5nZXMgdG8gcmV0dXJuCi0gKgotICogQHJldHVybiB0aGUgc3R5bGVzIG9yIGFuIGVtcHR5IGFycmF5IGlmIGEgTGluZVN0eWxlTGlzdGVuZXIgaGFzIAotICogIGJlZW4gc2V0LiAgVGhlIHJldHVybmVkIHN0eWxlcyB3aWxsIHJlZmxlY3QgdGhlIGdpdmVuIHJhbmdlLiAgVGhlIGZpcnN0IAotICogIHJldHVybmVkIDxjb2RlPlN0eWxlUmFuZ2U8L2NvZGU+IHdpbGwgaGF2ZSBhIHN0YXJ0aW5nIG9mZnNldCA+PSBzdGFydCAKLSAqICBhbmQgdGhlIGxhc3QgcmV0dXJuZWQgPGNvZGU+U3R5bGVSYW5nZTwvY29kZT4gd2lsbCBoYXZlIGFuIGVuZGluZyAKLSAqICBvZmZzZXQgPD0gc3RhcnQgKyBsZW5ndGggLSAxCi0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICA8bGk+RVJST1JfSU5WQUxJRF9SQU5HRSB3aGVuIHN0YXJ0IGFuZC9vciBlbmQgYXJlIG91dHNpZGUgdGhlIHdpZGdldCBjb250ZW50PC9saT4gCi0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBTdHlsZVJhbmdlIFtdIGdldFN0eWxlUmFuZ2VzKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaW50IGNvbnRlbnRMZW5ndGggPSBnZXRDaGFyQ291bnQoKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBsZW5ndGg7Ci0JaWYgKHN0YXJ0ID4gZW5kIHx8IHN0YXJ0IDwgMCB8fCBlbmQgPiBjb250ZW50TGVuZ3RoKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9SQU5HRSk7Ci0JfQkKLQlTdHlsZVJhbmdlIHN0eWxlc1tdOwotCQotCWlmICghdXNlckxpbmVTdHlsZSkgewotCQlzdHlsZXMgPSBkZWZhdWx0TGluZVN0eWxlci5nZXRTdHlsZVJhbmdlc0ZvcihzdGFydCwgbGVuZ3RoKTsKLQkJaWYgKHN0eWxlcyA9PSBudWxsKSByZXR1cm4gbmV3IFN0eWxlUmFuZ2VbMF07Ci0JCS8vIGFkanVzdCB0aGUgZmlyc3QgYW5kIGxhc3Qgc3R5bGUgdG8gcmVmbGVjdCB0aGUgc3BlY2lmaWVkIAotCQkvLyByYW5nZSwgY2xvbmUgdGhlc2Ugc3R5bGVzIHNpbmNlIHRoZSByZXR1cm5lZCBzdHlsZXMgYXJlIHRoZQotCQkvLyBzdHlsZXMgY2FjaGVkIGJ5IHRoZSB3aWRnZXQKLQkJaWYgKHN0eWxlcy5sZW5ndGggPT0gMSkgewotCQkJU3R5bGVSYW5nZSBzdHlsZSA9IHN0eWxlc1swXTsKLQkJCWlmIChzdHlsZS5zdGFydCA8IHN0YXJ0KSB7Ci0JCQkJU3R5bGVSYW5nZSBuZXdTdHlsZSA9IChTdHlsZVJhbmdlKXN0eWxlc1swXS5jbG9uZSgpOwotCQkJCW5ld1N0eWxlLmxlbmd0aCA9IG5ld1N0eWxlLmxlbmd0aCAtIChzdGFydCAtIG5ld1N0eWxlLnN0YXJ0KTsKLQkJCQluZXdTdHlsZS5zdGFydCA9IHN0YXJ0OwotCQkJCXN0eWxlc1swXSA9IG5ld1N0eWxlOwotCQkJfQotCQkJaWYgKHN0eWxlLnN0YXJ0ICsgc3R5bGUubGVuZ3RoID4gKHN0YXJ0ICsgbGVuZ3RoKSkgewotCQkJCVN0eWxlUmFuZ2UgbmV3U3R5bGUgPSAoU3R5bGVSYW5nZSlzdHlsZXNbMF0uY2xvbmUoKTsKLQkJCQluZXdTdHlsZS5sZW5ndGggPSBzdGFydCArIGxlbmd0aCAtIG5ld1N0eWxlLnN0YXJ0OwotCQkJCXN0eWxlc1swXSA9IG5ld1N0eWxlOwotCQkJfQotCQl9IGVsc2UgaWYgKHN0eWxlcy5sZW5ndGggPiAxKSB7Ci0JCQlTdHlsZVJhbmdlIHN0eWxlID0gc3R5bGVzWzBdOwotCQkJaWYgKHN0eWxlLnN0YXJ0IDwgc3RhcnQpIHsKLQkJCQlTdHlsZVJhbmdlIG5ld1N0eWxlID0gKFN0eWxlUmFuZ2Upc3R5bGVzWzBdLmNsb25lKCk7Ci0JCQkJbmV3U3R5bGUubGVuZ3RoID0gbmV3U3R5bGUubGVuZ3RoIC0gKHN0YXJ0IC0gbmV3U3R5bGUuc3RhcnQpOwotCQkJCW5ld1N0eWxlLnN0YXJ0ID0gc3RhcnQ7Ci0JCQkJc3R5bGVzWzBdID0gbmV3U3R5bGU7Ci0JCQl9Ci0JCQlzdHlsZSA9IHN0eWxlc1tzdHlsZXMubGVuZ3RoIC0gMV07Ci0JCQlpZiAoc3R5bGUuc3RhcnQgKyBzdHlsZS5sZW5ndGggPiAoc3RhcnQgKyBsZW5ndGgpKSB7Ci0JCQkJU3R5bGVSYW5nZSBuZXdTdHlsZSA9IChTdHlsZVJhbmdlKXN0eWxlc1tzdHlsZXMubGVuZ3RoIC0gMV0uY2xvbmUoKTsKLQkJCQluZXdTdHlsZS5sZW5ndGggPSBzdGFydCArIGxlbmd0aCAtIG5ld1N0eWxlLnN0YXJ0OwotCQkJCXN0eWxlc1tzdHlsZXMubGVuZ3RoIC0gMV0gPSBuZXdTdHlsZTsKLQkJCX0KLQkJfQotCX0KLQllbHNlIHsKLQkJc3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbMF07Ci0JfQotCXJldHVybiBzdHlsZXM7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHRhYiB3aWR0aCBtZWFzdXJlZCBpbiBjaGFyYWN0ZXJzLgotICoKLSAqIEByZXR1cm4gdGFiIHdpZHRoIG1lYXN1cmVkIGluIGNoYXJhY3RlcnMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBnZXRUYWJzKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIHRhYkxlbmd0aDsKLX0KLS8qKgotICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIHdpZGdldCBjb250ZW50LgotICogPHA+Ci0gKgotICogQHJldHVybiBjb3B5IG9mIHRoZSB3aWRnZXQgY29udGVudAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgZ2V0Q2hhckNvdW50KCkpOwotfQkKLS8qKgotICogUmV0dXJucyB0aGUgd2lkZ2V0IGNvbnRlbnQgYmV0d2VlbiB0aGUgdHdvIG9mZnNldHMuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gc3RhcnQgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHJldHVybmVkIFN0cmluZwotICogQHBhcmFtIGVuZCBvZmZzZXQgb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSByZXR1cm5lZCBTdHJpbmcgCi0gKiBAcmV0dXJuIHdpZGdldCBjb250ZW50IHN0YXJ0aW5nIGF0IHN0YXJ0IGFuZCBlbmRpbmcgYXQgZW5kCi0gKiBAc2VlICNnZXRUZXh0UmFuZ2UoaW50LGludCkKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0Ugd2hlbiBzdGFydCBhbmQvb3IgZW5kIGFyZSBvdXRzaWRlIHRoZSB3aWRnZXQgY29udGVudDwvbGk+IAotICogPC91bD4KLSAqLwotcHVibGljIFN0cmluZyBnZXRUZXh0KGludCBzdGFydCwgaW50IGVuZCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaW50IGNvbnRlbnRMZW5ndGggPSBnZXRDaGFyQ291bnQoKTsKLQkKLQlpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IGNvbnRlbnRMZW5ndGggfHwgZW5kIDwgMCB8fCBlbmQgPj0gY29udGVudExlbmd0aCB8fCBzdGFydCA+IGVuZCkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfUkFOR0UpOwotCX0JCi0JcmV0dXJuIGNvbnRlbnQuZ2V0VGV4dFJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCBib3VuZGluZyByZWN0YW5nbGUgdGhhdCBpbmNsdWRlcyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIHR3byBvZmZzZXRzLgotICogPHA+Ci0gKgotICogQHBhcmFtIHN0YXJ0IG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluY2x1ZGVkIGluIHRoZSBib3VuZGluZyBib3gKLSAqIEBwYXJhbSBlbmQgb2Zmc2V0IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbmNsdWRlZCBpbiB0aGUgYm91bmRpbmcgYm94IAotICogQHJldHVybiBib3VuZGluZyBib3ggb2YgdGhlIHRleHQgYmV0d2VlbiBzdGFydCBhbmQgZW5kCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIHdoZW4gc3RhcnQgYW5kL29yIGVuZCBhcmUgb3V0c2lkZSB0aGUgd2lkZ2V0IGNvbnRlbnQ8L2xpPiAKLSAqIDwvdWw+Ci0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBSZWN0YW5nbGUgZ2V0VGV4dEJvdW5kcyhpbnQgc3RhcnQsIGludCBlbmQpIHsKLQljaGVja1dpZGdldCgpOwkKLQlpbnQgY29udGVudExlbmd0aCA9IGdldENoYXJDb3VudCgpOwkKLQlpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IGNvbnRlbnRMZW5ndGggfHwgZW5kIDwgMCB8fCBlbmQgPj0gY29udGVudExlbmd0aCB8fCBzdGFydCA+IGVuZCkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfUkFOR0UpOwotCX0KLQlpbnQgbGluZVN0YXJ0ID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoc3RhcnQpOwotCWludCBsaW5lRW5kID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoZW5kKTsKLQlSZWN0YW5nbGUgcmVjdDsKLQlpbnQgeSA9IGxpbmVTdGFydCAqIGxpbmVIZWlnaHQ7Ci0JaW50IGhlaWdodCA9IChsaW5lRW5kICsgMSkgKiBsaW5lSGVpZ2h0IC0geTsKLQlpbnQgbGVmdCA9IDB4N2ZmZmZmZmYsIHJpZ2h0ID0gMDsKLQlmb3IgKGludCBpID0gbGluZVN0YXJ0OyBpIDw9IGxpbmVFbmQ7IGkrKykgewotCQlpbnQgbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGkpOwotCQlTdHJpbmcgbGluZSA9IGNvbnRlbnQuZ2V0TGluZShpKTsKLQkJVGV4dExheW91dCBsYXlvdXQgPSByZW5kZXJlci5nZXRUZXh0TGF5b3V0KGxpbmUsIGxpbmVPZmZzZXQpOwotCQlpZiAoaSA9PSBsaW5lU3RhcnQgJiYgaSA9PSBsaW5lRW5kKSB7Ci0JCQlyZWN0ID0gbGF5b3V0LmdldEJvdW5kcyhzdGFydCAtIGxpbmVPZmZzZXQsIGVuZCAtIGxpbmVPZmZzZXQpOwotCQl9IGVsc2UgaWYgKGkgPT0gbGluZVN0YXJ0KSB7Ci0JCQlyZWN0ID0gbGF5b3V0LmdldEJvdW5kcyhzdGFydCAtIGxpbmVPZmZzZXQsIGxpbmUubGVuZ3RoKCkpOwotCQl9CWVsc2UJaWYgKGkgPT0gbGluZUVuZCkgewotCQkJcmVjdCA9IGxheW91dC5nZXRCb3VuZHMoMCwgZW5kIC0gbGluZU9mZnNldCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZWN0ID0gbGF5b3V0LmdldExpbmVCb3VuZHMoMCk7Ci0JCX0KLQkJbGVmdCA9IE1hdGgubWluIChsZWZ0LCByZWN0LngpOwotCQlyaWdodCA9IE1hdGgubWF4IChyaWdodCwgcmVjdC54ICsgcmVjdC53aWR0aCk7Ci0JCXJlbmRlcmVyLmRpc3Bvc2VUZXh0TGF5b3V0KGxheW91dCk7Ci0JfQotCXJlY3QgPSBuZXcgUmVjdGFuZ2xlIChsZWZ0LCB5LCByaWdodC1sZWZ0LCBoZWlnaHQpOwotCXJlY3QueCArPSBsZWZ0TWFyZ2luIC0gaG9yaXpvbnRhbFNjcm9sbE9mZnNldDsKLQlyZWN0LnkgLT0gdmVydGljYWxTY3JvbGxPZmZzZXQ7Ci0JcmV0dXJuIHJlY3Q7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHdpZGdldCBjb250ZW50IHN0YXJ0aW5nIGF0IHN0YXJ0IGZvciBsZW5ndGggY2hhcmFjdGVycy4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBzdGFydCBvZmZzZXQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgcmV0dXJuZWQgU3RyaW5nCi0gKiBAcGFyYW0gbGVuZ3RoIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybiAKLSAqIEByZXR1cm4gd2lkZ2V0IGNvbnRlbnQgc3RhcnRpbmcgYXQgc3RhcnQgYW5kIGV4dGVuZGluZyBsZW5ndGggY2hhcmFjdGVycy4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0Ugd2hlbiBzdGFydCBhbmQvb3IgbGVuZ3RoIGFyZSBvdXRzaWRlIHRoZSB3aWRnZXQgY29udGVudDwvbGk+IAotICogPC91bD4KLSAqLwotcHVibGljIFN0cmluZyBnZXRUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpbnQgY29udGVudExlbmd0aCA9IGdldENoYXJDb3VudCgpOwotCWludCBlbmQgPSBzdGFydCArIGxlbmd0aDsKLQkKLQlpZiAoc3RhcnQgPiBlbmQgfHwgc3RhcnQgPCAwIHx8IGVuZCA+IGNvbnRlbnRMZW5ndGgpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX1JBTkdFKTsKLQl9CQotCXJldHVybiBjb250ZW50LmdldFRleHRSYW5nZShzdGFydCwgbGVuZ3RoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHRoZSByZWNlaXZlciBpcyBjYXBhYmxlIG9mIGhvbGRpbmcuCi0gKiAKLSAqIEByZXR1cm4gdGhlIHRleHQgbGltaXQKLSAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0VGV4dExpbWl0KCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JCi0JcmV0dXJuIHRleHRMaW1pdDsKLX0KLS8qKgotICogR2V0cyB0aGUgdG9wIGluZGV4LiAgVGhlIHRvcCBpbmRleCBpcyB0aGUgaW5kZXggb2YgdGhlIGZ1bGx5IHZpc2libGUgbGluZSB0aGF0Ci0gKiBpcyBjdXJyZW50bHkgYXQgdGhlIHRvcCBvZiB0aGUgd2lkZ2V0IG9yIHRoZSB0b3Btb3N0IHBhcnRpYWxseSB2aXNpYmxlIGxpbmUgaWYgCi0gKiBubyBsaW5lIGlzIGZ1bGx5IHZpc2libGUuIAotICogVGhlIHRvcCBpbmRleCBjaGFuZ2VzIHdoZW4gdGhlIHdpZGdldCBpcyBzY3JvbGxlZC4gSW5kZXhpbmcgaXMgemVybyBiYXNlZC4KLSAqIDxwPgotICoKLSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSB0b3AgbGluZQotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldFRvcEluZGV4KCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaW50IGxvZ2ljYWxUb3BJbmRleCA9IHRvcEluZGV4OwotCQotCWlmICh3b3JkV3JhcCkgewotCQlpbnQgdmlzdWFsTGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKHRvcEluZGV4KTsKLQkJbG9naWNhbFRvcEluZGV4ID0gbG9naWNhbENvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KHZpc3VhbExpbmVPZmZzZXQpOwotCX0KLQlyZXR1cm4gbG9naWNhbFRvcEluZGV4OwotfQotLyoqCi0gKiBHZXRzIHRoZSB0b3AgcGl4ZWwuICBUaGUgdG9wIHBpeGVsIGlzIHRoZSBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgbGluZSB0aGF0IGlzIAotICogY3VycmVudGx5IGF0IHRoZSB0b3Agb2YgdGhlIHdpZGdldC5UaGUgdGV4dCB3aWRnZXQgY2FuIGJlIHNjcm9sbGVkIGJ5IHBpeGVscyAKLSAqIGJ5IGRyYWdnaW5nIHRoZSBzY3JvbGwgdGh1bWIgc28gdGhhdCBhIHBhcnRpYWwgbGluZSBtYXkgYmUgZGlzcGxheWVkIGF0IHRoZSB0b3AgCi0gKiB0aGUgd2lkZ2V0LiAgVGhlIHRvcCBwaXhlbCBjaGFuZ2VzIHdoZW4gdGhlIHdpZGdldCBpcyBzY3JvbGxlZC4gIFRoZSB0b3AgcGl4ZWwgCi0gKiBkb2VzIG5vdCBpbmNsdWRlIHRoZSB3aWRnZXQgdHJpbW1pbmcuCi0gKiA8cD4KLSAqCi0gKiBAcmV0dXJuIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSB0b3AgbGluZQotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldFRvcFBpeGVsKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0OwotfQotLyoqIAotICogUmV0dXJucyB0aGUgdmVydGljYWwgc2Nyb2xsIGluY3JlbWVudC4KLSAqIDxwPgotICoKLSAqIEByZXR1cm4gdmVydGljYWwgc2Nyb2xsIGluY3JlbWVudC4KLSAqLwotaW50IGdldFZlcnRpY2FsSW5jcmVtZW50KCkgewotCXJldHVybiBsaW5lSGVpZ2h0OwotfQotaW50IGdldENhcmV0RGlyZWN0aW9uKCkgewotCWlmICghaXNCaWRpQ2FyZXQoKSkgcmV0dXJuIFNXVC5ERUZBVUxUOwotCWlmICghdXBkYXRlQ2FyZXREaXJlY3Rpb24gJiYgY2FyZXREaXJlY3Rpb24gIT0gU1dULk5VTEwpIHJldHVybiBjYXJldERpcmVjdGlvbjsKLQl1cGRhdGVDYXJldERpcmVjdGlvbiA9IGZhbHNlOwotCWludCBjYXJldExpbmUgPSBnZXRDYXJldExpbmUoKTsKLQlpbnQgbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGNhcmV0TGluZSk7Ci0JU3RyaW5nIGxpbmUgPSBjb250ZW50LmdldExpbmUoY2FyZXRMaW5lKTsKLQlpbnQgb2Zmc2V0ID0gY2FyZXRPZmZzZXQgLSBsaW5lT2Zmc2V0OwotCWludCBsaW5lTGVuZ3RoID0gbGluZS5sZW5ndGgoKTsKLQlpZiAobGluZUxlbmd0aCA9PSAwKSByZXR1cm4gaXNNaXJyb3JlZCgpID8gU1dULlJJR0hUIDogU1dULkxFRlQ7Ci0JaWYgKGFkdmFuY2luZyAmJiBvZmZzZXQgPiAwKSBvZmZzZXQtLTsKLQlpZiAob2Zmc2V0ID09IGxpbmVMZW5ndGggJiYgb2Zmc2V0ID4gMCkgb2Zmc2V0LS07Ci0Jd2hpbGUgKG9mZnNldCA+IDAgJiYgQ2hhcmFjdGVyLmlzRGlnaXQobGluZS5jaGFyQXQob2Zmc2V0KSkpIG9mZnNldC0tOwotCWlmIChvZmZzZXQgPT0gMCAmJiBDaGFyYWN0ZXIuaXNEaWdpdChsaW5lLmNoYXJBdChvZmZzZXQpKSkgewotCQlyZXR1cm4gaXNNaXJyb3JlZCgpID8gU1dULlJJR0hUIDogU1dULkxFRlQ7Ci0JfQotCVRleHRMYXlvdXQgbGF5b3V0ID0gcmVuZGVyZXIuZ2V0VGV4dExheW91dChsaW5lLCBsaW5lT2Zmc2V0KTsKLQlpbnQgbGV2ZWwgPSBsYXlvdXQuZ2V0TGV2ZWwob2Zmc2V0KTsKLQlyZW5kZXJlci5kaXNwb3NlVGV4dExheW91dChsYXlvdXQpOwotCXJldHVybiAoKGxldmVsICYgMSkgIT0gMCkgPyBTV1QuUklHSFQgOiBTV1QuTEVGVDsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxpbmUgdGhlIGNhcmV0IGlzIG9uLgotICogV2hlbiBpbiB3b3JkIHdyYXAgbW9kZSBhbmQgYXQgdGhlIGVuZCBvZiBvbmUgd3JhcHBlZCBsaW5lLyAKLSAqIGJlZ2lubmluZyBvZiB0aGUgY29udGludWluZyB3cmFwcGVkIGxpbmUgdGhlIGNhcmV0IG9mZnNldAotICogaXMgbm90IHN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHRoZSBjYXJldCBsaW5lLgotICogCi0gKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGluZSB0aGUgY2FyZXQgaXMgb24uCi0gKi8KLWludCBnZXRDYXJldExpbmUoKSB7Ci0JaW50IGNhcmV0TGluZSA9IGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KGNhcmV0T2Zmc2V0KTsKLQlpbnQgbGVmdENvbHVtblggPSBsZWZ0TWFyZ2luOwotCWlmICh3b3JkV3JhcCAmJiBjb2x1bW5YIDw9IGxlZnRDb2x1bW5YICYmCi0JCWNhcmV0TGluZSA8IGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgLSAxICYmCi0JCWNhcmV0T2Zmc2V0ID09IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGNhcmV0TGluZSArIDEpKSB7Ci0JCWNhcmV0TGluZSsrOwotCX0KLQlyZXR1cm4gY2FyZXRMaW5lOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgd29yZCBhdCB0aGUgc3BlY2lmaWVkCi0gKiBvZmZzZXQuCi0gKiA8cD4KLSAqIFRoZXJlIGFyZSB0d28gY2xhc3NlcyBvZiB3b3JkcyBmb3JtZWQgYnkgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzOgotICogPHVsPgotICogPGxpPmZyb20gMC05IGFuZCBBLXogKEFTQ0lJIDQ4LTU3IGFuZCA2NS0xMjIpCi0gKiA8bGk+ZXZlcnkgb3RoZXIgY2hhcmFjdGVyIGV4Y2VwdCBsaW5lIGJyZWFrcwotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogU3BhY2UgY2hhcmFjdGVycyAnICcgKEFTQ0lJIDIwKSBhcmUgc3BlY2lhbCBhcyB0aGV5IGFyZSB0cmVhdGVkIGFzCi0gKiBwYXJ0IG9mIHRoZSB3b3JkIGxlYWRpbmcgdXAgdG8gdGhlIHNwYWNlIGNoYXJhY3Rlci4gIExpbmUgYnJlYWtzIGFyZSAKLSAqIHRyZWF0ZWQgYXMgb25lIHdvcmQuCi0gKiA8L3A+Ci0gKi8KLWludCBnZXRXb3JkRW5kKGludCBvZmZzZXQpIHsKLQlpbnQgbGluZSA9IGxvZ2ljYWxDb250ZW50LmdldExpbmVBdE9mZnNldChvZmZzZXQpOwotCWludCBsaW5lT2Zmc2V0ID0gbG9naWNhbENvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxpbmUpOwotCVN0cmluZyBsaW5lVGV4dCA9IGxvZ2ljYWxDb250ZW50LmdldExpbmUobGluZSk7Ci0JaW50IGxpbmVMZW5ndGggPSBsaW5lVGV4dC5sZW5ndGgoKTsKLQkKLQlpZiAob2Zmc2V0ID49IGdldENoYXJDb3VudCgpKSB7Ci0JCXJldHVybiBvZmZzZXQ7Ci0JfQotCWlmIChvZmZzZXQgPT0gbGluZU9mZnNldCArIGxpbmVMZW5ndGgpIHsKLQkJbGluZSsrOwotCQlvZmZzZXQgPSBsb2dpY2FsQ29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZSk7Ci0JfQotCWVsc2UgewotCQlUZXh0TGF5b3V0IGxheW91dCA9IHJlbmRlcmVyLmdldFRleHRMYXlvdXQobGluZVRleHQsIGxpbmVPZmZzZXQpOwotCQlvZmZzZXQgLT0gbGluZU9mZnNldDsKLQkJb2Zmc2V0ID0gbGF5b3V0LmdldE5leHRPZmZzZXQob2Zmc2V0LCBTV1QuTU9WRU1FTlRfV09SRCk7Ci0JCW9mZnNldCArPSBsaW5lT2Zmc2V0OwotCQlyZW5kZXJlci5kaXNwb3NlVGV4dExheW91dChsYXlvdXQpOwotCX0KLQlyZXR1cm4gb2Zmc2V0OwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgd29yZCBhdCB0aGUgc3BlY2lmaWVkCi0gKiBvZmZzZXQuCi0gKiA8cD4KLSAqIFRoZXJlIGFyZSB0d28gY2xhc3NlcyBvZiB3b3JkcyBmb3JtZWQgYnkgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzOgotICogPHVsPgotICogPGxpPmZyb20gMC05IGFuZCBBLXogKEFTQ0lJIDQ4LTU3IGFuZCA2NS0xMjIpCi0gKiA8bGk+ZXZlcnkgb3RoZXIgY2hhcmFjdGVyIGV4Y2VwdCBsaW5lIGJyZWFrcwotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogU3BhY2VzIGFyZSBpZ25vcmVkIGFuZCBkbyBub3QgcmVwcmVzZW50IGEgd29yZC4gIExpbmUgYnJlYWtzIGFyZSB0cmVhdGVkIAotICogYXMgb25lIHdvcmQuCi0gKiA8L3A+Ci0gKi8KLWludCBnZXRXb3JkRW5kTm9TcGFjZXMoaW50IG9mZnNldCkgewotCWludCBsaW5lID0gbG9naWNhbENvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KG9mZnNldCk7Ci0JaW50IGxpbmVPZmZzZXQgPSBsb2dpY2FsQ29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZSk7Ci0JU3RyaW5nIGxpbmVUZXh0ID0gbG9naWNhbENvbnRlbnQuZ2V0TGluZShsaW5lKTsKLQlpbnQgbGluZUxlbmd0aCA9IGxpbmVUZXh0Lmxlbmd0aCgpOwotCQotCWlmIChvZmZzZXQgPj0gZ2V0Q2hhckNvdW50KCkpIHsKLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0JaWYgKG9mZnNldCA9PSBsaW5lT2Zmc2V0ICsgbGluZUxlbmd0aCkgewotCQlsaW5lKys7Ci0JCW9mZnNldCA9IGxvZ2ljYWxDb250ZW50LmdldE9mZnNldEF0TGluZShsaW5lKTsKLQl9Ci0JZWxzZSB7Ci0JCW9mZnNldCAtPSBsaW5lT2Zmc2V0OwotCQljaGFyIGNoID0gbGluZVRleHQuY2hhckF0KG9mZnNldCk7Ci0JCWJvb2xlYW4gbGV0dGVyT3JEaWdpdCA9IENvbXBhdGliaWxpdHkuaXNMZXR0ZXJPckRpZ2l0KGNoKTsKLQkJCi0JCXdoaWxlIChvZmZzZXQgPCBsaW5lTGVuZ3RoIC0gMSAmJiBDb21wYXRpYmlsaXR5LmlzTGV0dGVyT3JEaWdpdChjaCkgPT0gbGV0dGVyT3JEaWdpdCAmJiAhQ29tcGF0aWJpbGl0eS5pc1NwYWNlQ2hhcihjaCkpIHsKLQkJCW9mZnNldCsrOwotCQkJY2ggPSBsaW5lVGV4dC5jaGFyQXQob2Zmc2V0KTsKLQkJfQotCQlpZiAob2Zmc2V0ID09IGxpbmVMZW5ndGggLSAxICYmIENvbXBhdGliaWxpdHkuaXNMZXR0ZXJPckRpZ2l0KGNoKSA9PSBsZXR0ZXJPckRpZ2l0ICYmICFDb21wYXRpYmlsaXR5LmlzU3BhY2VDaGFyKGNoKSkgewotCQkJb2Zmc2V0Kys7Ci0JCX0KLQkJb2Zmc2V0ICs9IGxpbmVPZmZzZXQ7Ci0JfQotCXJldHVybiBvZmZzZXQ7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgd29yZCBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAqIFRoZXJlIGFyZSB0d28gY2xhc3NlcyBvZiB3b3JkcyBmb3JtZWQgYnkgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzOgotICogPHA+Ci0gKiA8dWw+Ci0gKiA8bGk+ZnJvbSAwLTkgYW5kIEEteiAoQVNDSUkgNDgtNTcgYW5kIDY1LTEyMikKLSAqIDxsaT5ldmVyeSBvdGhlciBjaGFyYWN0ZXIgZXhjZXB0IGxpbmUgYnJlYWtzCi0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBTcGFjZSBjaGFyYWN0ZXJzICcgJyAoQVNDSUkgMjApIGFyZSBzcGVjaWFsIGFzIHRoZXkgYXJlIHRyZWF0ZWQgYXMKLSAqIHBhcnQgb2YgdGhlIHdvcmQgbGVhZGluZyB1cCB0byB0aGUgc3BhY2UgY2hhcmFjdGVyLiAgTGluZSBicmVha3MgYXJlIHRyZWF0ZWQgCi0gKiBhcyBvbmUgd29yZC4KLSAqIDwvcD4KLSAqLwotaW50IGdldFdvcmRTdGFydChpbnQgb2Zmc2V0KSB7Ci0JaW50IGxpbmUgPSBsb2dpY2FsQ29udGVudC5nZXRMaW5lQXRPZmZzZXQob2Zmc2V0KTsKLQlpbnQgbGluZU9mZnNldCA9IGxvZ2ljYWxDb250ZW50LmdldE9mZnNldEF0TGluZShsaW5lKTsKLQlTdHJpbmcgbGluZVRleHQgPSBsb2dpY2FsQ29udGVudC5nZXRMaW5lKGxpbmUpOwotCi0JaWYgKG9mZnNldCA8PSAwKSB7Ci0JCXJldHVybiBvZmZzZXQ7Ci0JfQotCWlmIChvZmZzZXQgPT0gbGluZU9mZnNldCkgewotCQlsaW5lLS07Ci0JCWxpbmVUZXh0ID0gbG9naWNhbENvbnRlbnQuZ2V0TGluZShsaW5lKTsKLQkJb2Zmc2V0ID0gbG9naWNhbENvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxpbmUpICsgbGluZVRleHQubGVuZ3RoKCk7Ci0JfQotCWVsc2UgewotCQlUZXh0TGF5b3V0IGxheW91dCA9IHJlbmRlcmVyLmdldFRleHRMYXlvdXQobGluZVRleHQsIGxpbmVPZmZzZXQpOwotCQlvZmZzZXQgLT0gbGluZU9mZnNldDsKLQkJb2Zmc2V0ID0gbGF5b3V0LmdldFByZXZpb3VzT2Zmc2V0KG9mZnNldCwgU1dULk1PVkVNRU5UX1dPUkQpOwotCQlvZmZzZXQgKz0gbGluZU9mZnNldDsKLQkJcmVuZGVyZXIuZGlzcG9zZVRleHRMYXlvdXQobGF5b3V0KTsgCi0JfQotCXJldHVybiBvZmZzZXQ7Ci19Ci0vKioKLSAqIFJldHVybnMgd2hldGhlciB0aGUgd2lkZ2V0IHdyYXBzIGxpbmVzLgotICogPHA+Ci0gKgotICogQHJldHVybiB0cnVlIGlmIHdpZGdldCB3cmFwcyBsaW5lcywgZmFsc2Ugb3RoZXJ3aXNlCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBib29sZWFuIGdldFdvcmRXcmFwKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIHdvcmRXcmFwOwotfQotLyoqIAotICogUmV0dXJucyB0aGUgeCBsb2NhdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBnaXZlIG9mZnNldCBpbiB0aGUgbGluZS4KLSAqIDxiPk5PVEU6PC9iPiBEb2VzIG5vdCByZXR1cm4gY29ycmVjdCB2YWx1ZXMgZm9yIHRydWUgaXRhbGljIGZvbnRzICh2cy4gc2xhbnRlZCBmb250cykuCi0gKiA8cD4KLSAqCi0gKiBAcmV0dXJuIHggbG9jYXRpb24gb2YgdGhlIGNoYXJhY3RlciBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGluIHRoZSBsaW5lLgotICovCi1pbnQgZ2V0WEF0T2Zmc2V0KFN0cmluZyBsaW5lLCBpbnQgbGluZUluZGV4LCBpbnQgb2Zmc2V0SW5MaW5lKSB7Ci0JaW50IHggPSAwOwotCWludCBsaW5lTGVuZ3RoID0gbGluZS5sZW5ndGgoKTsKLQlpZiAobGluZUluZGV4IDwgY29udGVudC5nZXRMaW5lQ291bnQoKSAtIDEpIHsKLQkJaW50IGVuZExpbmVPZmZzZXQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZShsaW5lSW5kZXggKyAxKSAtIDE7Ci0JCWlmIChsaW5lTGVuZ3RoIDwgb2Zmc2V0SW5MaW5lICYmIG9mZnNldEluTGluZSA8PSBlbmRMaW5lT2Zmc2V0KSB7Ci0JCQlvZmZzZXRJbkxpbmUgPSBsaW5lTGVuZ3RoOwotCQl9Ci0JfQotCWlmIChsaW5lTGVuZ3RoICE9IDAgICYmIG9mZnNldEluTGluZSA8PSBsaW5lTGVuZ3RoKSB7Ci0JCWludCBsaW5lT2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZUluZGV4KTsKLQkJVGV4dExheW91dCBsYXlvdXQgPSByZW5kZXJlci5nZXRUZXh0TGF5b3V0KGxpbmUsIGxpbmVPZmZzZXQpOwotCQlpZiAoIWFkdmFuY2luZyB8fCBvZmZzZXRJbkxpbmUgPT0gMCkgewotCQkJeCA9IGxheW91dC5nZXRMb2NhdGlvbihvZmZzZXRJbkxpbmUsIGZhbHNlKS54OwotCQl9IGVsc2UgewotCQkJeCA9IGxheW91dC5nZXRMb2NhdGlvbihvZmZzZXRJbkxpbmUgLSAxLCB0cnVlKS54OwotCQl9Ci0JCXJlbmRlcmVyLmRpc3Bvc2VUZXh0TGF5b3V0KGxheW91dCk7Ci0JfQotCXJldHVybiB4ICsgbGVmdE1hcmdpbiAtIGhvcml6b250YWxTY3JvbGxPZmZzZXQ7Ci19Ci0vKiogCi0gKiBJbnNlcnRzIGEgc3RyaW5nLiAgVGhlIG9sZCBzZWxlY3Rpb24gaXMgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IHRleHQuICAKLSAqIDxwPgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIHN0cmluZwotICogQHNlZSAjcmVwbGFjZVRleHRSYW5nZShpbnQsaW50LFN0cmluZykKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gc3RyaW5nIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgaW5zZXJ0KFN0cmluZyBzdHJpbmcpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCX0KLQlQb2ludCBzZWwgPSBnZXRTZWxlY3Rpb25SYW5nZSgpOwotCXJlcGxhY2VUZXh0UmFuZ2Uoc2VsLngsIHNlbC55LCBzdHJpbmcpOwotfQotLyoqCi0gKiBDcmVhdGVzIGNvbnRlbnQgY2hhbmdlIGxpc3RlbmVycyBhbmQgc2V0IHRoZSBkZWZhdWx0IGNvbnRlbnQgbW9kZWwuCi0gKi8KLXZvaWQgaW5zdGFsbERlZmF1bHRDb250ZW50KCkgewotCXRleHRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBUZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2luZyhUZXh0Q2hhbmdpbmdFdmVudCBldmVudCkgewotCQkJaGFuZGxlVGV4dENoYW5naW5nKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQloYW5kbGVUZXh0Q2hhbmdlZChldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dFNldChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQloYW5kbGVUZXh0U2V0KGV2ZW50KTsKLQkJfQotCX07Ci0JbG9naWNhbENvbnRlbnQgPSBjb250ZW50ID0gbmV3IERlZmF1bHRDb250ZW50KCk7Ci0JY29udGVudC5hZGRUZXh0Q2hhbmdlTGlzdGVuZXIodGV4dENoYW5nZUxpc3RlbmVyKTsKLX0KLS8qKgotICogQ3JlYXRlcyBhIGRlZmF1bHQgbGluZSBzdHlsZSBsaXN0ZW5lci4KLSAqIFVzZWQgdG8gc3RvcmUgbGluZSBiYWNrZ3JvdW5kIGNvbG9ycyBhbmQgc3R5bGVzLgotICogUmVtb3ZlZCB3aGVuIHRoZSB1c2VyIHNldHMgYSBMaW5lU3R5bGVMaXN0ZW5lci4KLSAqIDxwPgotICoKLSAqIEBzZWUgI2FkZExpbmVTdHlsZUxpc3RlbmVyCi0gKi8KLXZvaWQgaW5zdGFsbERlZmF1bHRMaW5lU3R5bGVyKCkgewotCWRlZmF1bHRMaW5lU3R5bGVyID0gbmV3IERlZmF1bHRMaW5lU3R5bGVyKGxvZ2ljYWxDb250ZW50KTsKLQlTdHlsZWRUZXh0TGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBTdHlsZWRUZXh0TGlzdGVuZXIoZGVmYXVsdExpbmVTdHlsZXIpOwotCWlmICghdXNlckxpbmVTdHlsZSkgewotCQlhZGRMaXN0ZW5lcihMaW5lR2V0U3R5bGUsIHR5cGVkTGlzdGVuZXIpOwotCX0KLQlpZiAoIXVzZXJMaW5lQmFja2dyb3VuZCkgewotCQlhZGRMaXN0ZW5lcihMaW5lR2V0QmFja2dyb3VuZCwgdHlwZWRMaXN0ZW5lcik7Ci0JfQotfQotLyoqIAotICogQWRkcyBldmVudCBsaXN0ZW5lcnMKLSAqLwotdm9pZCBpbnN0YWxsTGlzdGVuZXJzKCkgewotCVNjcm9sbEJhciB2ZXJ0aWNhbEJhciA9IGdldFZlcnRpY2FsQmFyKCk7Ci0JU2Nyb2xsQmFyIGhvcml6b250YWxCYXIgPSBnZXRIb3Jpem9udGFsQmFyKCk7Ci0JCi0JbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5EaXNwb3NlOiBoYW5kbGVEaXNwb3NlKGV2ZW50KTsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuS2V5RG93bjogaGFuZGxlS2V5RG93bihldmVudCk7IGJyZWFrOwotCQkJCWNhc2UgU1dULktleVVwOiBoYW5kbGVLZXlVcChldmVudCk7IGJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlRG93bjogaGFuZGxlTW91c2VEb3duKGV2ZW50KTsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VVcDogaGFuZGxlTW91c2VVcChldmVudCk7IGJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlRG91YmxlQ2xpY2s6IGhhbmRsZU1vdXNlRG91YmxlQ2xpY2soZXZlbnQpOyBicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6IGhhbmRsZU1vdXNlTW92ZShldmVudCk7IGJyZWFrOwotCQkJCWNhc2UgU1dULlBhaW50OiBoYW5kbGVQYWludChldmVudCk7IGJyZWFrOwotCQkJCWNhc2UgU1dULlJlc2l6ZTogaGFuZGxlUmVzaXplKGV2ZW50KTsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuVHJhdmVyc2U6IGhhbmRsZVRyYXZlcnNlKGV2ZW50KTsgYnJlYWs7Ci0JCQl9Ci0JCX0JCQotCX07Ci0JYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLQlhZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgbGlzdGVuZXIpOwotCWFkZExpc3RlbmVyKFNXVC5LZXlVcCwgbGlzdGVuZXIpOwotCWFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlhZGRMaXN0ZW5lcihTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCWFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBsaXN0ZW5lcik7Ci0JYWRkTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotCWFkZExpc3RlbmVyKFNXVC5QYWludCwgbGlzdGVuZXIpOwotCWFkZExpc3RlbmVyKFNXVC5SZXNpemUsIGxpc3RlbmVyKTsKLQlhZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIGxpc3RlbmVyKTsKLQlpZiAodmVydGljYWxCYXIgIT0gbnVsbCkgewotCQl2ZXJ0aWNhbEJhci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVZlcnRpY2FsU2Nyb2xsKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JfQotCWlmIChob3Jpem9udGFsQmFyICE9IG51bGwpIHsKLQkJaG9yaXpvbnRhbEJhci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWhhbmRsZUhvcml6b250YWxTY3JvbGwoZXZlbnQpOwotCQkJfQotCQl9KTsKLQl9Ci19Ci1TdHlsZWRUZXh0Q29udGVudCBpbnRlcm5hbEdldENvbnRlbnQoKSB7Ci0JcmV0dXJuIGNvbnRlbnQ7Ci19Ci1pbnQgaW50ZXJuYWxHZXRIb3Jpem9udGFsUGl4ZWwoKSB7Ci0JcmV0dXJuIGhvcml6b250YWxTY3JvbGxPZmZzZXQ7Ci19Ci1Qb2ludCBpbnRlcm5hbEdldFNlbGVjdGlvbigpIHsKLQlyZXR1cm4gc2VsZWN0aW9uOwotfQotYm9vbGVhbiBpbnRlcm5hbEdldFdvcmRXcmFwKCkgewotCXJldHVybiB3b3JkV3JhcDsKLX0KLS8qKgotICogVXNlZCBieSBXb3JkV3JhcENhY2hlIHRvIGJ5cGFzcyBTdHlsZWRUZXh0LnJlZHJhdyB3aGljaCBkb2VzCi0gKiBhbiB1bndhbnRlZCBjYWNoZSByZXNldC4KLSAqLwotdm9pZCBpbnRlcm5hbFJlZHJhdygpIHsKLQlzdXBlci5yZWRyYXcoKTsKLX0KLS8qKiAKLSAqIFJlZHJhd3MgdGhlIHNwZWNpZmllZCB0ZXh0IHJhbmdlLgotICogPHA+Ci0gKgotICogQHBhcmFtIHN0YXJ0IG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHJlZHJhdwotICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWRyYXcKLSAqIEBwYXJhbSBjbGVhckJhY2tncm91bmQgdHJ1ZSBpZiB0aGUgYmFja2dyb3VuZCBzaG91bGQgYmUgY2xlYXJlZCBhcyAKLSAqIAlwYXJ0IG9mIHRoZSByZWRyYXcgb3BlcmF0aW9uLiAgSWYgdHJ1ZSwgdGhlIGVudGlyZSByZWRyYXcgcmFuZ2Ugd2lsbAotICogIGJlIGNsZWFyZWQgYmVmb3JlIGFueXRoaW5nIGlzIHJlZHJhd24uICBJZiB0aGUgcmVkcmF3IHJhbmdlIGluY2x1ZGVzCi0gKgl0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgYSBsaW5lIChpLmUuLCB0aGUgZW50aXJlIGxpbmUgaXMgcmVkcmF3bikgdGhlIAotICogCWxpbmUgaXMgY2xlYXJlZCBhbGwgdGhlIHdheSB0byB0aGUgcmlnaHQgYm9yZGVyIG9mIHRoZSB3aWRnZXQuCi0gKiAgVGhlIHJlZHJhdyBvcGVyYXRpb24gd2lsbCBiZSBmYXN0ZXIgYW5kIHNtb290aGVyIGlmIGNsZWFyQmFja2dyb3VuZCBpcyAKLSAqIAlzZXQgdG8gZmFsc2UuICBXaGV0aGVyIG9yIG5vdCB0aGUgZmxhZyBjYW4gYmUgc2V0IHRvIGZhbHNlIGRlcGVuZHMgb24gCi0gKiAJdGhlIHR5cGUgb2YgY2hhbmdlIHRoYXQgaGFzIHRha2VuIHBsYWNlLiAgSWYgZm9udCBzdHlsZXMgb3IgYmFja2dyb3VuZCAKLSAqIAljb2xvcnMgZm9yIHRoZSByZWRyYXcgcmFuZ2UgaGF2ZSBjaGFuZ2VkLCBjbGVhckJhY2tncm91bmQgc2hvdWxkIGJlIAotICogCXNldCB0byB0cnVlLiAgSWYgb25seSBmb3JlZ3JvdW5kIGNvbG9ycyBoYXZlIGNoYW5nZWQgZm9yIHRoZSByZWRyYXcgCi0gKiAJcmFuZ2UsIGNsZWFyQmFja2dyb3VuZCBjYW4gYmUgc2V0IHRvIGZhbHNlLiAKLSAqLwotdm9pZCBpbnRlcm5hbFJlZHJhd1JhbmdlKGludCBzdGFydCwgaW50IGxlbmd0aCwgYm9vbGVhbiBjbGVhckJhY2tncm91bmQpIHsKLQlpbnQgZW5kID0gc3RhcnQgKyBsZW5ndGg7Ci0JaW50IGZpcnN0TGluZSA9IGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KHN0YXJ0KTsKLQlpbnQgbGFzdExpbmUgPSBjb250ZW50LmdldExpbmVBdE9mZnNldChlbmQpOwotCWludCBvZmZzZXRJbkZpcnN0TGluZTsKLQlpbnQgcGFydGlhbEJvdHRvbUluZGV4ID0gZ2V0UGFydGlhbEJvdHRvbUluZGV4KCk7Ci0JaW50IHBhcnRpYWxUb3BJbmRleCA9IHZlcnRpY2FsU2Nyb2xsT2Zmc2V0IC8gbGluZUhlaWdodDsKLQkvLyBkbyBub3RoaW5nIGlmIHJlZHJhdyByYW5nZSBpcyBjb21wbGV0ZWx5IGludmlzaWJsZQkKLQlpZiAoZmlyc3RMaW5lID4gcGFydGlhbEJvdHRvbUluZGV4IHx8IGxhc3RMaW5lIDwgcGFydGlhbFRvcEluZGV4KSB7Ci0JCXJldHVybjsKLQl9Ci0JLy8gb25seSByZWRyYXcgdmlzaWJsZSBsaW5lcwotCWlmIChwYXJ0aWFsVG9wSW5kZXggPiBmaXJzdExpbmUpIHsKLQkJZmlyc3RMaW5lID0gcGFydGlhbFRvcEluZGV4OwotCQlvZmZzZXRJbkZpcnN0TGluZSA9IDA7Ci0JfQotCWVsc2UgewotCQlvZmZzZXRJbkZpcnN0TGluZSA9IHN0YXJ0IC0gY29udGVudC5nZXRPZmZzZXRBdExpbmUoZmlyc3RMaW5lKTsKLQl9Ci0JaWYgKHBhcnRpYWxCb3R0b21JbmRleCArIDEgPCBsYXN0TGluZSkgewotCQlsYXN0TGluZSA9IHBhcnRpYWxCb3R0b21JbmRleCArIDE7CS8vICsgMSB0byByZWRyYXcgd2hvbGUgYm90dG9tIGxpbmUsIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JCWVuZCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxhc3RMaW5lKTsKLQl9Ci0JcmVkcmF3TGluZXMoZmlyc3RMaW5lLCBvZmZzZXRJbkZpcnN0TGluZSwgbGFzdExpbmUsIGVuZCwgY2xlYXJCYWNrZ3JvdW5kKTsKLQkKLQkvLyByZWRyYXcgZW50aXJlIGNlbnRlciBsaW5lcyBpZiByZWRyYXcgcmFuZ2UgaW5jbHVkZXMgbW9yZSB0aGFuIHR3byBsaW5lcwotCWlmIChsYXN0TGluZSAtIGZpcnN0TGluZSA+IDEpIHsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCWludCByZWRyYXdTdG9wWSA9IGxhc3RMaW5lICogbGluZUhlaWdodCAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0OwkJCi0JCWludCByZWRyYXdZID0gKGZpcnN0TGluZSArIDEpICogbGluZUhlaWdodCAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0OwkJCi0JCWRyYXcoMCwgcmVkcmF3WSwgY2xpZW50QXJlYS53aWR0aCwgcmVkcmF3U3RvcFkgLSByZWRyYXdZLCBjbGVhckJhY2tncm91bmQpOwotCX0KLX0KLS8qKgotICogUmV0dXJucyB0aGUgd2lkZ2V0IHRleHQgd2l0aCBzdHlsZSBpbmZvcm1hdGlvbiBlbmNvZGVkIHVzaW5nIFJURiBmb3JtYXQKLSAqIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjUuCi0gKgotICogQHJldHVybiB0aGUgd2lkZ2V0IHRleHQgd2l0aCBzdHlsZSBpbmZvcm1hdGlvbiBlbmNvZGVkIHVzaW5nIFJURiBmb3JtYXQKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotU3RyaW5nIGdldFJ0ZigpewotCWNoZWNrV2lkZ2V0KCk7Ci0JUlRGV3JpdGVyIHJ0ZldyaXRlciA9IG5ldyBSVEZXcml0ZXIoMCwgZ2V0Q2hhckNvdW50KCkpOwotCXJldHVybiBnZXRQbGF0Zm9ybURlbGltaXRlZFRleHQocnRmV3JpdGVyKTsKLX0KLS8qKiAKLSAqIEZyZWVzIHJlc291cmNlcy4KLSAqLwotdm9pZCBoYW5kbGVEaXNwb3NlKEV2ZW50IGV2ZW50KSB7Ci0JcmVtb3ZlTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLQlub3RpZnlMaXN0ZW5lcnMoU1dULkRpc3Bvc2UsIGV2ZW50KTsKLQlldmVudC50eXBlID0gU1dULk5vbmU7Ci0KLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCWliZWFtQ3Vyc29yLmRpc3Bvc2UoKTsKLQlpZiAocmVuZGVyZXIgIT0gbnVsbCkgewotCQlyZW5kZXJlci5kaXNwb3NlKCk7Ci0JCXJlbmRlcmVyID0gbnVsbDsKLQl9Ci0JaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQljb250ZW50LnJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcih0ZXh0Q2hhbmdlTGlzdGVuZXIpOwotCQljb250ZW50ID0gbnVsbDsKLQl9Ci0JaWYgKGRlZmF1bHRDYXJldCAhPSBudWxsKSB7Ci0JCWRlZmF1bHRDYXJldC5kaXNwb3NlKCk7Ci0JCWRlZmF1bHRDYXJldCA9IG51bGw7Ci0JfQotCWlmIChsZWZ0Q2FyZXRCaXRtYXAgIT0gbnVsbCkgewotCQlsZWZ0Q2FyZXRCaXRtYXAuZGlzcG9zZSgpOwotCQlsZWZ0Q2FyZXRCaXRtYXAgPSBudWxsOwotCX0KLQlpZiAocmlnaHRDYXJldEJpdG1hcCAhPSBudWxsKSB7Ci0JCXJpZ2h0Q2FyZXRCaXRtYXAuZGlzcG9zZSgpOwotCQlyaWdodENhcmV0Qml0bWFwID0gbnVsbDsKLQl9Ci0JaWYgKGRlZmF1bHRMaW5lU3R5bGVyICE9IG51bGwpIHsKLQkJZGVmYXVsdExpbmVTdHlsZXIucmVsZWFzZSgpOwotCQlkZWZhdWx0TGluZVN0eWxlciA9IG51bGw7Ci0JfQotCWlmIChpc0JpZGlDYXJldCgpKSB7Ci0JCUJpZGlVdGlsLnJlbW92ZUxhbmd1YWdlTGlzdGVuZXIoaGFuZGxlKTsKLQl9Ci0Jc2VsZWN0aW9uQmFja2dyb3VuZCA9IG51bGw7Ci0Jc2VsZWN0aW9uRm9yZWdyb3VuZCA9IG51bGw7Ci0JbG9naWNhbENvbnRlbnQgPSBudWxsOwotCXRleHRDaGFuZ2VMaXN0ZW5lciA9IG51bGw7Ci0JbGluZUNhY2hlID0gbnVsbDsKLQlpYmVhbUN1cnNvciA9IG51bGw7Ci0Jc2VsZWN0aW9uID0gbnVsbDsKLQlkb3VibGVDbGlja1NlbGVjdGlvbiA9IG51bGw7Ci0Ja2V5QWN0aW9uTWFwID0gbnVsbDsKLQliYWNrZ3JvdW5kID0gbnVsbDsKLQlmb3JlZ3JvdW5kID0gbnVsbDsKLQljbGlwYm9hcmQgPSBudWxsOwotfQotLyoqIAotICogU2Nyb2xscyB0aGUgd2lkZ2V0IGhvcml6b250YWxseS4KLSAqLwotdm9pZCBoYW5kbGVIb3Jpem9udGFsU2Nyb2xsKEV2ZW50IGV2ZW50KSB7Ci0JaW50IHNjcm9sbFBpeGVsID0gZ2V0SG9yaXpvbnRhbEJhcigpLmdldFNlbGVjdGlvbigpIC0gaG9yaXpvbnRhbFNjcm9sbE9mZnNldDsKLQlzY3JvbGxIb3Jpem9udGFsKHNjcm9sbFBpeGVsKTsKLX0KLS8qKgotICogSWYgYW4gYWN0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoZSBrZXkgc3Ryb2tlIGV4ZWN1dGUgdGhlIGFjdGlvbi4KLSAqIE90aGVyd2lzZSwgaWYgYSBjaGFyYWN0ZXIgaGFzIGJlZW4gZW50ZXJlZCB0cmVhdCBpdCBhcyBuZXcgY29udGVudC4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBldmVudCBrZXlib2FyZCBldmVudAotICovCi12b2lkIGhhbmRsZUtleShFdmVudCBldmVudCkgewotCWludCBhY3Rpb247Ci0JYWR2YW5jaW5nID0gdHJ1ZTsKLQlpZiAoZXZlbnQua2V5Q29kZSAhPSAwKSB7Ci0JCS8vIHNwZWNpYWwga2V5IHByZXNzZWQgKGUuZy4sIEYxKQotCQlhY3Rpb24gPSBnZXRLZXlCaW5kaW5nKGV2ZW50LmtleUNvZGUgfCBldmVudC5zdGF0ZU1hc2spOwotCX0KLQllbHNlIHsKLQkJLy8gY2hhcmFjdGVyIGtleSBwcmVzc2VkCi0JCWFjdGlvbiA9IGdldEtleUJpbmRpbmcoZXZlbnQuY2hhcmFjdGVyIHwgZXZlbnQuc3RhdGVNYXNrKTsKLQkJaWYgKGFjdGlvbiA9PSBTV1QuTlVMTCkgeyAKLQkJCS8vIHNlZSBpZiB3ZSBoYXZlIGEgY29udHJvbCBjaGFyYWN0ZXIKLQkJCWlmICgoZXZlbnQuc3RhdGVNYXNrICYgU1dULkNUUkwpICE9IDAgJiYgKGV2ZW50LmNoYXJhY3RlciA+PSAwKSAmJiBldmVudC5jaGFyYWN0ZXIgPD0gMzEpIHsKLQkJCQkvLyBnZXQgdGhlIGNoYXJhY3RlciBmcm9tIHRoZSBDVFJMK2NoYXIgc2VxdWVuY2UsIHRoZSBjb250cm9sCi0JCQkJLy8ga2V5IHN1YnRyYWN0cyA2NCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUga2V5IHRoYXQgaXQgbW9kaWZpZXMKLQkJCQlpbnQgYyA9IGV2ZW50LmNoYXJhY3RlciArIDY0OwotCQkJCWFjdGlvbiA9IGdldEtleUJpbmRpbmcoYyB8IGV2ZW50LnN0YXRlTWFzayk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGFjdGlvbiA9PSBTV1QuTlVMTCkgewotCQlib29sZWFuIGlnbm9yZSA9IGZhbHNlOwotCQkKLQkJaWYgKElTX0NBUkJPTikgewotCQkJLy8gSWdub3JlIGFjY2VsZXJhdG9yIGtleSBjb21iaW5hdGlvbnMgKHdlIGRvIG5vdCB3YW50IHRvIAotCQkJLy8gaW5zZXJ0IGEgY2hhcmFjdGVyIGluIHRoZSB0ZXh0IGluIHRoaXMgaW5zdGFuY2UpLiBEbyBub3QgIAotCQkJLy8gaWdub3JlIENPTU1BTkQrQUxUIGNvbWJpbmF0aW9ucyBzaW5jZSB0aGF0IGtleSBzZXF1ZW5jZQotCQkJLy8gcHJvZHVjZXMgY2hhcmFjdGVycyBvbiB0aGUgbWFjLgotCQkJaWdub3JlID0gKGV2ZW50LnN0YXRlTWFzayBeIFNXVC5DT01NQU5EKSA9PSAwIHx8Ci0JCQkJCShldmVudC5zdGF0ZU1hc2sgXiAoU1dULkNPTU1BTkQgfCBTV1QuU0hJRlQpKSA9PSAwOwotCQl9IGVsc2UgaWYgKElTX01PVElGKSB7Ci0JCQkvLyBJZ25vcmUgYWNjZWxlcmF0b3Iga2V5IGNvbWJpbmF0aW9ucyAod2UgZG8gbm90IHdhbnQgdG8gCi0JCQkvLyBpbnNlcnQgYSBjaGFyYWN0ZXIgaW4gdGhlIHRleHQgaW4gdGhpcyBpbnN0YW5jZSkuIERvIG5vdCAgCi0JCQkvLyBpZ25vcmUgQUxUIGNvbWJpbmF0aW9ucyBzaW5jZSB0aGlzIGtleSBzZXF1ZW5jZQotCQkJLy8gcHJvZHVjZXMgY2hhcmFjdGVycyBvbiBtb3RpZi4KLQkJCWlnbm9yZSA9IChldmVudC5zdGF0ZU1hc2sgXiBTV1QuQ1RSTCkgPT0gMCB8fAotCQkJCQkoZXZlbnQuc3RhdGVNYXNrIF4gKFNXVC5DVFJMIHwgU1dULlNISUZUKSkgPT0gMDsKLQkJfSBlbHNlIHsKLQkJCS8vIElnbm9yZSBhY2NlbGVyYXRvciBrZXkgY29tYmluYXRpb25zICh3ZSBkbyBub3Qgd2FudCB0byAKLQkJCS8vIGluc2VydCBhIGNoYXJhY3RlciBpbiB0aGUgdGV4dCBpbiB0aGlzIGluc3RhbmNlKS4gRG9uJ3QgIAotCQkJLy8gaWdub3JlIENUUkwrQUxUIGNvbWJpbmF0aW9ucyBzaW5jZSB0aGF0IGlzIHRoZSBBbHQgR3IgCi0JCQkvLyBrZXkgb24gc29tZSBrZXlib2FyZHMuICBTZWUgYnVnIDIwOTUzLiAKLQkJCWlnbm9yZSA9IChldmVudC5zdGF0ZU1hc2sgXiBTV1QuQUxUKSA9PSAwIHx8IAotCQkJCQkoZXZlbnQuc3RhdGVNYXNrIF4gU1dULkNUUkwpID09IDAgfHwKLQkJCQkJKGV2ZW50LnN0YXRlTWFzayBeIChTV1QuQUxUIHwgU1dULlNISUZUKSkgPT0gMCB8fAotCQkJCQkoZXZlbnQuc3RhdGVNYXNrIF4gKFNXVC5DVFJMIHwgU1dULlNISUZUKSkgPT0gMDsKLQkJfQotCQkvLyAtaWdub3JlIGFueXRoaW5nIGJlbG93IFNQQUNFIGV4Y2VwdCBmb3IgbGluZSBkZWxpbWl0ZXIga2V5cyBhbmQgdGFiLgotCQkvLyAtaWdub3JlIERFTCAKLQkJaWYgKCFpZ25vcmUgJiYgZXZlbnQuY2hhcmFjdGVyID4gMzEgJiYgZXZlbnQuY2hhcmFjdGVyICE9IFNXVC5ERUwgfHwgCi0JCSAgICBldmVudC5jaGFyYWN0ZXIgPT0gU1dULkNSIHx8IGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuTEYgfHwgCi0JCSAgICBldmVudC5jaGFyYWN0ZXIgPT0gVEFCKSB7Ci0JCQlkb0NvbnRlbnQoZXZlbnQuY2hhcmFjdGVyKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJaW52b2tlQWN0aW9uKGFjdGlvbik7CQkKLQl9Ci19Ci0vKioKLSAqIElmIGEgVmVyaWZ5S2V5IGxpc3RlbmVyIGV4aXN0cywgdmVyaWZ5IHRoYXQgdGhlIGtleSB0aGF0IHdhcyBlbnRlcmVkCi0gKiBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICogPHA+Ci0gKgotICogQHBhcmFtIGV2ZW50IGtleWJvYXJkIGV2ZW50Ci0gKi8KLXZvaWQgaGFuZGxlS2V5RG93bihFdmVudCBldmVudCkgewotCWlmIChjbGlwYm9hcmRTZWxlY3Rpb24gPT0gbnVsbCkgewotCQljbGlwYm9hcmRTZWxlY3Rpb24gPSBuZXcgUG9pbnQoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi55KTsKLQl9Ci0JCi0JRXZlbnQgdmVyaWZ5RXZlbnQgPSBuZXcgRXZlbnQoKTsKLQl2ZXJpZnlFdmVudC5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0JdmVyaWZ5RXZlbnQua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0JdmVyaWZ5RXZlbnQuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotCXZlcmlmeUV2ZW50LmRvaXQgPSB0cnVlOwotCW5vdGlmeUxpc3RlbmVycyhWZXJpZnlLZXksIHZlcmlmeUV2ZW50KTsKLQlpZiAodmVyaWZ5RXZlbnQuZG9pdCkgewotCQloYW5kbGVLZXkoZXZlbnQpOwotCX0KLX0KLS8qKgotICogVXBkYXRlIHRoZSBTZWxlY3Rpb24gQ2xpcGJvYXJkLgotICogPHA+Ci0gKgotICogQHBhcmFtIGV2ZW50IGtleWJvYXJkIGV2ZW50Ci0gKi8KLXZvaWQgaGFuZGxlS2V5VXAoRXZlbnQgZXZlbnQpIHsKLQlpZiAoY2xpcGJvYXJkU2VsZWN0aW9uICE9IG51bGwpIHsKLQkJaWYgKGNsaXBib2FyZFNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbi54IHx8IGNsaXBib2FyZFNlbGVjdGlvbi55ICE9IHNlbGVjdGlvbi55KSB7Ci0JCQl0cnkgewotCQkJCWlmIChzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54ID4gMCkgewotCQkJCQlzZXRDbGlwYm9hcmRDb250ZW50KHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54LCBETkQuU0VMRUNUSU9OX0NMSVBCT0FSRCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFNXVEVycm9yIGVycm9yKSB7Ci0JCQkJLy8gQ29weSB0byBjbGlwYm9hcmQgZmFpbGVkLiBUaGlzIGhhcHBlbnMgd2hlbiBhbm90aGVyIGFwcGxpY2F0aW9uIAotCQkJCS8vIGlzIGFjY2Vzc2luZyB0aGUgY2xpcGJvYXJkIHdoaWxlIHdlIGNvcHkuIElnbm9yZSB0aGUgZXJyb3IuCi0JCQkJLy8gRml4ZXMgMUdEUUFWTgotCQkJCS8vIFJldGhyb3cgYWxsIG90aGVyIGVycm9ycy4gRml4ZXMgYnVnIDE3NTc4LgotCQkJCWlmIChlcnJvci5jb2RlICE9IERORC5FUlJPUl9DQU5OT1RfU0VUX0NMSVBCT0FSRCkgewotCQkJCQl0aHJvdyBlcnJvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JY2xpcGJvYXJkU2VsZWN0aW9uID0gbnVsbDsKLX0KLS8qKgotICogVXBkYXRlcyB0aGUgY2FyZXQgbG9jYXRpb24gYW5kIHNlbGVjdGlvbiBpZiBtb3VzZSBidXR0b24gMSBoYXMgYmVlbiAKLSAqIHByZXNzZWQuCi0gKi8KLXZvaWQgaGFuZGxlTW91c2VEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCWlmIChldmVudC5idXR0b24gIT0gMSB8fCAhZG91YmxlQ2xpY2tFbmFibGVkKSB7Ci0JCXJldHVybjsKLQl9Ci0JZXZlbnQueSAtPSB0b3BNYXJnaW47Ci0JbW91c2VEb3VibGVDbGljayA9IHRydWU7Ci0JY2FyZXRPZmZzZXQgPSBnZXRXb3JkU3RhcnQoY2FyZXRPZmZzZXQpOwotCXJlc2V0U2VsZWN0aW9uKCk7Ci0JY2FyZXRPZmZzZXQgPSBnZXRXb3JkRW5kTm9TcGFjZXMoY2FyZXRPZmZzZXQpOwotCXNob3dDYXJldCgpOwotCWRvTW91c2VTZWxlY3Rpb24oKTsKLQlkb3VibGVDbGlja1NlbGVjdGlvbiA9IG5ldyBQb2ludChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkpOwotfQotLyoqIAotICogVXBkYXRlcyB0aGUgY2FyZXQgbG9jYXRpb24gYW5kIHNlbGVjdGlvbiBpZiBtb3VzZSBidXR0b24gMSBoYXMgYmVlbiAKLSAqIHByZXNzZWQuCi0gKi8KLXZvaWQgaGFuZGxlTW91c2VEb3duKEV2ZW50IGV2ZW50KSB7Ci0JbW91c2VEb3duID0gdHJ1ZTsKLQltb3VzZURvdWJsZUNsaWNrID0gZmFsc2U7Ci0JaWYgKGV2ZW50LmJ1dHRvbiA9PSAyKSB7Ci0JCVN0cmluZyB0ZXh0ID0gKFN0cmluZylnZXRDbGlwYm9hcmRDb250ZW50KERORC5TRUxFQ1RJT05fQ0xJUEJPQVJEKTsKLQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJLy8gcG9zaXRpb24gY3Vyc29yCi0JCQlpbnQgeCA9IGV2ZW50Lng7Ci0JCQlpbnQgeSA9IGV2ZW50LnkgLSB0b3BNYXJnaW47Ci0JCQlkb01vdXNlTG9jYXRpb25DaGFuZ2UoeCwgeSwgZmFsc2UpOwotCQkJLy8gaW5zZXJ0IHRleHQKLQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQkJCWUuc3RhcnQgPSBzZWxlY3Rpb24ueDsKLQkJCWUuZW5kID0gc2VsZWN0aW9uLnk7Ci0JCQllLnRleHQgPSBnZXRNb2RlbERlbGltaXRlZFRleHQodGV4dCk7Ci0JCQlzZW5kS2V5RXZlbnQoZSk7Ci0JCX0KLQl9Ci0JaWYgKChldmVudC5idXR0b24gIT0gMSkgfHwgKElTX0NBUkJPTiAmJiAoZXZlbnQuc3RhdGVNYXNrICYgU1dULk1PRDQpICE9IDApKSB7Ci0JCXJldHVybjsJCi0JfQotCWJvb2xlYW4gc2VsZWN0ID0gKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5NT0QyKSAhPSAwOwkKLQlldmVudC55IC09IHRvcE1hcmdpbjsKLQlkb01vdXNlTG9jYXRpb25DaGFuZ2UoZXZlbnQueCwgZXZlbnQueSwgc2VsZWN0KTsKLX0KLS8qKiAKLSAqIFVwZGF0ZXMgdGhlIGNhcmV0IGxvY2F0aW9uIGFuZCBzZWxlY3Rpb24gaWYgbW91c2UgYnV0dG9uIDEgaXMgcHJlc3NlZCAKLSAqIGR1cmluZyB0aGUgbW91c2UgbW92ZS4KLSAqLwotdm9pZCBoYW5kbGVNb3VzZU1vdmUoRXZlbnQgZXZlbnQpIHsKLQlpZiAoIW1vdXNlRG93bikgcmV0dXJuOwotCWlmICgoZXZlbnQuc3RhdGVNYXNrICYgU1dULkJVVFRPTjEpID09IDApIHsKLQkJcmV0dXJuOwotCX0KLQlldmVudC55IC09IHRvcE1hcmdpbjsKLQlkb01vdXNlTG9jYXRpb25DaGFuZ2UoZXZlbnQueCwgZXZlbnQueSwgdHJ1ZSk7Ci0JdXBkYXRlKCk7Ci0JZG9BdXRvU2Nyb2xsKGV2ZW50KTsKLX0KLS8qKiAKLSAqIEF1dG9zY3JvbGxpbmcgZW5kcyB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQuCi0gKi8KLXZvaWQgaGFuZGxlTW91c2VVcChFdmVudCBldmVudCkgewotCW1vdXNlRG93biA9IGZhbHNlOwotCW1vdXNlRG91YmxlQ2xpY2sgPSBmYWxzZTsKLQlldmVudC55IC09IHRvcE1hcmdpbjsKLQllbmRBdXRvU2Nyb2xsKCk7Ci0JaWYgKGV2ZW50LmJ1dHRvbiA9PSAxKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueCA+IDApIHsKLQkJCQlzZXRDbGlwYm9hcmRDb250ZW50KHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54LCBETkQuU0VMRUNUSU9OX0NMSVBCT0FSRCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFNXVEVycm9yIGVycm9yKSB7Ci0JCQkvLyBDb3B5IHRvIGNsaXBib2FyZCBmYWlsZWQuIFRoaXMgaGFwcGVucyB3aGVuIGFub3RoZXIgYXBwbGljYXRpb24gCi0JCQkvLyBpcyBhY2Nlc3NpbmcgdGhlIGNsaXBib2FyZCB3aGlsZSB3ZSBjb3B5LiBJZ25vcmUgdGhlIGVycm9yLgotCQkJLy8gRml4ZXMgMUdEUUFWTgotCQkJLy8gUmV0aHJvdyBhbGwgb3RoZXIgZXJyb3JzLiBGaXhlcyBidWcgMTc1NzguCi0JCQlpZiAoZXJyb3IuY29kZSAhPSBETkQuRVJST1JfQ0FOTk9UX1NFVF9DTElQQk9BUkQpIHsKLQkJCQl0aHJvdyBlcnJvcjsKLQkJCX0KLQkJfQotCX0KLX0KLS8qKgotICogUmVuZGVycyB0aGUgaW52YWxpZGF0ZWQgYXJlYSBzcGVjaWZpZWQgaW4gdGhlIHBhaW50IGV2ZW50LgotICogPHA+Ci0gKgotICogQHBhcmFtIGV2ZW50IHBhaW50IGV2ZW50Ci0gKi8KLXZvaWQgaGFuZGxlUGFpbnQoRXZlbnQgZXZlbnQpIHsKLQkvLyBDaGVjayBpZiB0aGVyZSBpcyB3b3JrIHRvIGRvCi0JaWYgKGV2ZW50LmhlaWdodCA9PSAwKSByZXR1cm47Ci0JaW50IHN0YXJ0TGluZSA9IE1hdGgubWF4KDAsIChldmVudC55IC0gdG9wTWFyZ2luICsgdmVydGljYWxTY3JvbGxPZmZzZXQpIC8gbGluZUhlaWdodCk7Ci0JaW50IHBhaW50WUZyb21Ub3BMaW5lID0gKHN0YXJ0TGluZSAtIHRvcEluZGV4KSAqIGxpbmVIZWlnaHQ7Ci0JaW50IHRvcExpbmVPZmZzZXQgPSB0b3BJbmRleCAqIGxpbmVIZWlnaHQgLSB2ZXJ0aWNhbFNjcm9sbE9mZnNldDsKLQlpbnQgc3RhcnRZID0gcGFpbnRZRnJvbVRvcExpbmUgKyB0b3BMaW5lT2Zmc2V0ICsgdG9wTWFyZ2luOwkvLyBhZGp1c3QgeSBwb3NpdGlvbiBmb3IgcGl4ZWwgYmFzZWQgc2Nyb2xsaW5nIGFuZCB0b3AgbWFyZ2luCi0JaW50IHJlbmRlckhlaWdodCA9IGV2ZW50LnkgKyBldmVudC5oZWlnaHQgLSBzdGFydFk7Ci0JcGVyZm9ybVBhaW50KGV2ZW50LmdjLCBzdGFydExpbmUsIHN0YXJ0WSwgcmVuZGVySGVpZ2h0KTsKLX0JCi0vKioKLSAqIFJlY2FsY3VsYXRlcyB0aGUgc2Nyb2xsIGJhcnMuIFJld3JhcHMgYWxsIGxpbmVzIHdoZW4gaW4gd29yZCAKLSAqIHdyYXAgbW9kZS4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBldmVudCByZXNpemUgZXZlbnQKLSAqLwotdm9pZCBoYW5kbGVSZXNpemUoRXZlbnQgZXZlbnQpIHsKLQlpbnQgb2xkSGVpZ2h0ID0gY2xpZW50QXJlYUhlaWdodDsKLQlpbnQgb2xkV2lkdGggPSBjbGllbnRBcmVhV2lkdGg7Ci0JCi0JUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0JY2xpZW50QXJlYUhlaWdodCA9IGNsaWVudEFyZWEuaGVpZ2h0OwotCWNsaWVudEFyZWFXaWR0aCA9IGNsaWVudEFyZWEud2lkdGg7Ci0JLyogUmVkcmF3IHRoZSBvbGQgb3IgbmV3IHJpZ2h0L2JvdHRvbSBtYXJnaW4gaWYgbmVlZGVkICovCi0JaWYgKG9sZFdpZHRoICE9IGNsaWVudEFyZWFXaWR0aCkgewotCQlpZiAocmlnaHRNYXJnaW4gPiAwKSB7Ci0JCQlpbnQgeCA9IChvbGRXaWR0aCA8IGNsaWVudEFyZWFXaWR0aCA/IG9sZFdpZHRoIDogY2xpZW50QXJlYVdpZHRoKS0gcmlnaHRNYXJnaW47IAotCQkJcmVkcmF3KHgsIDAsIHJpZ2h0TWFyZ2luLCBvbGRIZWlnaHQsIGZhbHNlKTsKLQkJfQotCX0KLQlpZiAob2xkSGVpZ2h0ICE9IGNsaWVudEFyZWFIZWlnaHQpIHsKLQkJaWYgKGJvdHRvbU1hcmdpbiA+IDApIHsKLQkJCWludCB5ID0gKG9sZEhlaWdodCA8IGNsaWVudEFyZWFIZWlnaHQgPyBvbGRIZWlnaHQgOiBjbGllbnRBcmVhSGVpZ2h0KS0gYm90dG9tTWFyZ2luOyAKLQkJCXJlZHJhdygwLCB5LCBvbGRXaWR0aCwgYm90dG9tTWFyZ2luLCBmYWxzZSk7Ci0JCX0KLQl9Ci0JaWYgKHdvcmRXcmFwKSB7Ci0JCWlmIChvbGRXaWR0aCAhPSBjbGllbnRBcmVhV2lkdGgpIHsJCi0JCQl3b3JkV3JhcFJlc2l6ZShvbGRXaWR0aCk7Ci0JCX0KLQl9Ci0JZWxzZQotCWlmIChjbGllbnRBcmVhSGVpZ2h0ID4gb2xkSGVpZ2h0KSB7Ci0JCWludCBsaW5lQ291bnQgPSBjb250ZW50LmdldExpbmVDb3VudCgpOwotCQlpbnQgb2xkQm90dG9tSW5kZXggPSB0b3BJbmRleCArIG9sZEhlaWdodCAvIGxpbmVIZWlnaHQ7Ci0JCWludCBuZXdJdGVtQ291bnQgPSBDb21wYXRpYmlsaXR5LmNlaWwoY2xpZW50QXJlYUhlaWdodCAtIG9sZEhlaWdodCwgbGluZUhlaWdodCk7Ci0JCQotCQlvbGRCb3R0b21JbmRleCA9IE1hdGgubWluKG9sZEJvdHRvbUluZGV4LCBsaW5lQ291bnQpOwotCQluZXdJdGVtQ291bnQgPSBNYXRoLm1pbihuZXdJdGVtQ291bnQsIGxpbmVDb3VudCAtIG9sZEJvdHRvbUluZGV4KTsKLQkJbGluZUNhY2hlLmNhbGN1bGF0ZShvbGRCb3R0b21JbmRleCwgbmV3SXRlbUNvdW50KTsKLQl9Ci0Jc2V0U2Nyb2xsQmFycygpOwotCWNsYWltQm90dG9tRnJlZVNwYWNlKCk7Ci0JY2xhaW1SaWdodEZyZWVTcGFjZSgpOwkKLQlpZiAob2xkSGVpZ2h0ICE9IGNsaWVudEFyZWFIZWlnaHQpIHsKLQkJY2FsY3VsYXRlVG9wSW5kZXgoKTsKLQl9Ci19Ci0vKioKLSAqIFVwZGF0ZXMgdGhlIGNhcmV0IHBvc2l0aW9uIGFuZCBzZWxlY3Rpb24gYW5kIHRoZSBzY3JvbGwgYmFycyB0byByZWZsZWN0IAotICogdGhlIGNvbnRlbnQgY2hhbmdlLgotICogPHA+Ci0gKi8KLXZvaWQgaGFuZGxlVGV4dENoYW5nZWQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCWxpbmVDYWNoZS50ZXh0Q2hhbmdlZChsYXN0VGV4dENoYW5nZVN0YXJ0LCAKLQkJbGFzdFRleHRDaGFuZ2VOZXdMaW5lQ291bnQsIAotCQlsYXN0VGV4dENoYW5nZVJlcGxhY2VMaW5lQ291bnQsCi0JCWxhc3RUZXh0Q2hhbmdlTmV3Q2hhckNvdW50LAotCQlsYXN0VGV4dENoYW5nZVJlcGxhY2VDaGFyQ291bnQpOwotCXNldFNjcm9sbEJhcnMoKTsKLQkvLyB1cGRhdGUgc2VsZWN0aW9uL2NhcmV0IGxvY2F0aW9uIGFmdGVyIHN0eWxlcyBoYXZlIGJlZW4gY2hhbmdlZC4KLQkvLyBvdGhlcndpc2UgYW55IHRleHQgbWVhc3VyaW5nIGNvdWxkIGJlIGluY29ycmVjdAotCS8vIAotCS8vIGFsc28sIHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciBhbGwgc2Nyb2xsaW5nLiBPdGhlcndpc2UsIAotCS8vIHNlbGVjdGlvbiByZWRyYXcgd291bGQgYmUgZmx1c2hlZCBkdXJpbmcgc2Nyb2xsIHdoaWNoIGlzIHdyb25nLgotCS8vIGluIHNvbWUgY2FzZXMgbmV3IHRleHQgd291bGQgYmUgZHJhd24gaW4gc2Nyb2xsIHNvdXJjZSBhcmVhIGV2ZW4gCi0JLy8gdGhvdWdoIHRoZSBpbnRlbnQgaXMgdG8gc2Nyb2xsIGl0LgotCS8vIGZpeGVzIDFHQjkzUVQKLQl1cGRhdGVTZWxlY3Rpb24oCi0JCWxhc3RUZXh0Q2hhbmdlU3RhcnQsIAotCQlsYXN0VGV4dENoYW5nZVJlcGxhY2VDaGFyQ291bnQsIAotCQlsYXN0VGV4dENoYW5nZU5ld0NoYXJDb3VudCk7Ci0JCQotCWlmIChsYXN0VGV4dENoYW5nZVJlcGxhY2VMaW5lQ291bnQgPiAwKSB7Ci0JCS8vIE9ubHkgY2hlY2sgZm9yIHVudXNlZCBzcGFjZSB3aGVuIGxpbmVzIGFyZSBkZWxldGVkLgotCQkvLyBGaXhlcyAxR0ZMNExZCi0JCS8vIFNjcm9sbCB1cCBzbyB0aGF0IGVtcHR5IGxpbmVzIGJlbG93IGxhc3QgdGV4dCBsaW5lIGFyZSB1c2VkLgotCQkvLyBGaXhlcyAxR0VZSk0wCi0JCWNsYWltQm90dG9tRnJlZVNwYWNlKCk7Ci0JfQotCWlmIChsYXN0VGV4dENoYW5nZVJlcGxhY2VDaGFyQ291bnQgPiAwKSB7Ci0JCS8vIGZpeGVzIGJ1ZyA4MjczCi0JCWNsYWltUmlnaHRGcmVlU3BhY2UoKTsKLQl9Ci0JLy8gZG8gZGlyZWN0IGRyYXdpbmcgaWYgdGhlIHRleHQgY2hhbmdlIGlzIGNvbmZpbmVkIHRvIGEgc2luZ2xlIGxpbmUuCi0JLy8gb3B0aW1pemF0aW9uIGFuZCBmaXhlcyBidWcgMTM5OTkuIHNlZSBhbHNvIGhhbmRsZVRleHRDaGFuZ2luZy4KLQlpZiAobGFzdFRleHRDaGFuZ2VOZXdMaW5lQ291bnQgPT0gMCAmJiBsYXN0VGV4dENoYW5nZVJlcGxhY2VMaW5lQ291bnQgPT0gMCkgewotCQlpbnQgc3RhcnRMaW5lID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQobGFzdFRleHRDaGFuZ2VTdGFydCk7Ci0JCWludCBzdGFydFkgPSBzdGFydExpbmUgKiBsaW5lSGVpZ2h0IC0gdmVydGljYWxTY3JvbGxPZmZzZXQgKyB0b3BNYXJnaW47Ci0KLQkJaWYgKERPVUJMRV9CVUZGRVIpIHsKLQkJCUdDIGdjID0gZ2V0R0MoKTsKLQkJCUNhcmV0IGNhcmV0ID0gZ2V0Q2FyZXQoKTsKLQkJCWJvb2xlYW4gY2FyZXRWaXNpYmxlID0gZmFsc2U7Ci0JCQkKLQkJCWlmIChjYXJldCAhPSBudWxsKSB7Ci0JCQkJY2FyZXRWaXNpYmxlID0gY2FyZXQuZ2V0VmlzaWJsZSgpOwotCQkJCWNhcmV0LnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCQkJcGVyZm9ybVBhaW50KGdjLCBzdGFydExpbmUsIHN0YXJ0WSwgbGluZUhlaWdodCk7Ci0JCQlpZiAoY2FyZXQgIT0gbnVsbCkgewotCQkJCWNhcmV0LnNldFZpc2libGUoY2FyZXRWaXNpYmxlKTsKLQkJCX0KLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfSBlbHNlIHsKLQkJCXJlZHJhdygwLCBzdGFydFksIGdldENsaWVudEFyZWEoKS53aWR0aCwgbGluZUhlaWdodCwgZmFsc2UpOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFVwZGF0ZXMgdGhlIHNjcmVlbiB0byByZWZsZWN0IGEgcGVuZGluZyBjb250ZW50IGNoYW5nZS4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBldmVudC5zdGFydCB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBjaGFuZ2UKLSAqIEBwYXJhbSBldmVudC5uZXdUZXh0IHRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBpbnNlcnRlZCBvciBlbXB0eSBTdHJpbmcgCi0gKglpZiBubyB0ZXh0IHdpbGwgYmUgaW5zZXJ0ZWQKLSAqIEBwYXJhbSBldmVudC5yZXBsYWNlQ2hhckNvdW50IGxlbmd0aCBvZiB0ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVwbGFjZWQKLSAqIEBwYXJhbSBldmVudC5uZXdDaGFyQ291bnQgbGVuZ3RoIG9mIHRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBpbnNlcnRlZAotICogQHBhcmFtIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgbnVtYmVyIG9mIGxpbmVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHJlcGxhY2VkCi0gKiBAcGFyYW0gZXZlbnQubmV3TGluZUNvdW50IG51bWJlciBvZiBuZXcgbGluZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgaW5zZXJ0ZWQKLSAqLwotdm9pZCBoYW5kbGVUZXh0Q2hhbmdpbmcoVGV4dENoYW5naW5nRXZlbnQgZXZlbnQpIHsKLQlpbnQgZmlyc3RMaW5lOwkKLQlpbnQgdGV4dENoYW5nZVk7Ci0JYm9vbGVhbiBpc011bHRpTGluZUNoYW5nZSA9IGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPiAwIHx8IGV2ZW50Lm5ld0xpbmVDb3VudCA+IDA7Ci0JCQkKLQlpZiAoZXZlbnQucmVwbGFjZUNoYXJDb3VudCA8IDApIHsKLQkJZXZlbnQuc3RhcnQgKz0gZXZlbnQucmVwbGFjZUNoYXJDb3VudDsKLQkJZXZlbnQucmVwbGFjZUNoYXJDb3VudCAqPSAtMTsKLQl9Ci0JbGFzdFRleHRDaGFuZ2VTdGFydCA9IGV2ZW50LnN0YXJ0OwotCWxhc3RUZXh0Q2hhbmdlTmV3TGluZUNvdW50ID0gZXZlbnQubmV3TGluZUNvdW50OwotCWxhc3RUZXh0Q2hhbmdlTmV3Q2hhckNvdW50ID0gZXZlbnQubmV3Q2hhckNvdW50OwotCWxhc3RUZXh0Q2hhbmdlUmVwbGFjZUxpbmVDb3VudCA9IGV2ZW50LnJlcGxhY2VMaW5lQ291bnQ7Ci0JbGFzdFRleHRDaGFuZ2VSZXBsYWNlQ2hhckNvdW50ID0gZXZlbnQucmVwbGFjZUNoYXJDb3VudDsKLQlmaXJzdExpbmUgPSBjb250ZW50LmdldExpbmVBdE9mZnNldChldmVudC5zdGFydCk7Ci0JdGV4dENoYW5nZVkgPSBmaXJzdExpbmUgKiBsaW5lSGVpZ2h0IC0gdmVydGljYWxTY3JvbGxPZmZzZXQgKyB0b3BNYXJnaW47Ci0JaWYgKGlzTXVsdGlMaW5lQ2hhbmdlKSB7Ci0JCXJlZHJhd011bHRpTGluZUNoYW5nZSh0ZXh0Q2hhbmdlWSwgZXZlbnQubmV3TGluZUNvdW50LCBldmVudC5yZXBsYWNlTGluZUNvdW50KTsKLQl9Ci0JLy8gbm90aWZ5IGRlZmF1bHQgbGluZSBzdHlsZXIgYWJvdXQgdGV4dCBjaGFuZ2UKLQlpZiAoZGVmYXVsdExpbmVTdHlsZXIgIT0gbnVsbCkgewotCQlkZWZhdWx0TGluZVN0eWxlci50ZXh0Q2hhbmdpbmcoZXZlbnQpOwotCX0KLQkKLQkvLyBVcGRhdGUgdGhlIGNhcmV0IG9mZnNldCBpZiBpdCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgY29udGVudC4KLQkvLyBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSBzdHlsZSByYW5nZSBBUEkgbWF5IGJlIGNhbGxlZCBiZXR3ZWVuIHRoZQotCS8vIGhhbmRsZVRleHRDaGFuZ2luZyBhbmQgaGFuZGxlVGV4dENoYW5nZWQgZXZlbnRzIGFuZCB0aGlzIEFQSSBzZXRzIHRoZQotCS8vIGNhcmV0T2Zmc2V0LgotCWludCBuZXdFbmRPZlRleHQgPSBjb250ZW50LmdldENoYXJDb3VudCgpIC0gZXZlbnQucmVwbGFjZUNoYXJDb3VudCArIGV2ZW50Lm5ld0NoYXJDb3VudDsKLQlpZiAoY2FyZXRPZmZzZXQgPiBuZXdFbmRPZlRleHQpIGNhcmV0T2Zmc2V0ID0gbmV3RW5kT2ZUZXh0OwotfQotLyoqCi0gKiBDYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGNvbnRlbnQgaXMgc2V0IHByb2dyYW1hdGljYWxseSwgb3ZlcndyaXRpbmcgCi0gKiB0aGUgb2xkIGNvbnRlbnQuIFJlc2V0cyB0aGUgY2FyZXQgcG9zaXRpb24sIHNlbGVjdGlvbiBhbmQgc2Nyb2xsIG9mZnNldHMuIAotICogUmVjYWxjdWxhdGVzIHRoZSBjb250ZW50IHdpZHRoIGFuZCBzY3JvbGwgYmFycy4gUmVkcmF3cyB0aGUgd2lkZ2V0LgotICogPHA+Ci0gKgotICogQHBhcmFtIGV2ZW50IHRleHQgY2hhbmdlIGV2ZW50LiAKLSAqLwotdm9pZCBoYW5kbGVUZXh0U2V0KFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQlyZXNldCgpOwotfQotLyoqCi0gKiBDYWxsZWQgd2hlbiBhIHRyYXZlcnNhbCBrZXkgaXMgcHJlc3NlZC4KLSAqIEFsbG93IHRhYiBuZXh0IHRyYXZlcnNhbCB0byBvY2N1ciB3aGVuIHRoZSB3aWRnZXQgaXMgaW4gc2luZ2xlIAotICogbGluZSBtb2RlIG9yIGluIG11bHRpIGxpbmUgYW5kIG5vbi1lZGl0YWJsZSBtb2RlIC4gCi0gKiBXaGVuIGluIGVkaXRhYmxlIG11bHRpIGxpbmUgbW9kZSB3ZSB3YW50IHRvIHByZXZlbnQgdGhlIHRhYiAKLSAqIHRyYXZlcnNhbCBhbmQgcmVjZWl2ZSB0aGUgdGFiIGtleSBldmVudCBpbnN0ZWFkLgotICogPHA+Ci0gKgotICogQHBhcmFtIGV2ZW50IHRoZSBldmVudAotICovCi12b2lkIGhhbmRsZVRyYXZlcnNlKEV2ZW50IGV2ZW50KSB7Ci0Jc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX05FWFQ6Ci0JCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfUFJFVklPVVM6Ci0JCQlldmVudC5kb2l0ID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9ORVhUOgotCQljYXNlIFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVM6Ci0JCQlpZiAoKGdldFN0eWxlKCkgJiBTV1QuU0lOR0xFKSAhPSAwKSB7Ci0JCQkJZXZlbnQuZG9pdCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghZWRpdGFibGUgfHwgKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5NT0RJRklFUl9NQVNLKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRvaXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCX0KLX0KLS8qKiAKLSAqIFNjcm9sbHMgdGhlIHdpZGdldCB2ZXJ0aWNhbGx5LgotICovCi12b2lkIGhhbmRsZVZlcnRpY2FsU2Nyb2xsKEV2ZW50IGV2ZW50KSB7Ci0Jc2V0VmVydGljYWxTY3JvbGxPZmZzZXQoZ2V0VmVydGljYWxCYXIoKS5nZXRTZWxlY3Rpb24oKSwgZmFsc2UpOwotfQotLyoqCi0gKiBBZGQgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IGZvciB0aGUgd2lkZ2V0LgotICovCi12b2lkIGluaXRpYWxpemVBY2Nlc3NpYmxlKCkgewotCWZpbmFsIEFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IGdldEFjY2Vzc2libGUoKTsKLQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCWUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQoKTsKLQkJfQotCX0pOwotCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZVRleHRMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZVRleHRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBnZXRDYXJldE9mZnNldChBY2Nlc3NpYmxlVGV4dEV2ZW50IGUpIHsKLQkJCWUub2Zmc2V0ID0gU3R5bGVkVGV4dC50aGlzLmdldENhcmV0T2Zmc2V0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0U2VsZWN0aW9uUmFuZ2UoQWNjZXNzaWJsZVRleHRFdmVudCBlKSB7Ci0JCQlQb2ludCBzZWxlY3Rpb24gPSBTdHlsZWRUZXh0LnRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQkJCWUub2Zmc2V0ID0gc2VsZWN0aW9uLng7Ci0JCQllLmxlbmd0aCA9IHNlbGVjdGlvbi55OwotCQl9Ci0JfSk7Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldFJvbGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQllLmRldGFpbCA9IEFDQy5ST0xFX1RFWFQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQlpbnQgc3RhdGUgPSAwOwotCQkJaWYgKGlzRW5hYmxlZCgpKSBzdGF0ZSB8PSBBQ0MuU1RBVEVfRk9DVVNBQkxFOwotCQkJaWYgKGlzRm9jdXNDb250cm9sKCkpIHN0YXRlIHw9IEFDQy5TVEFURV9GT0NVU0VEOwotCQkJaWYgKCFpc1Zpc2libGUoKSkgc3RhdGUgfD0gQUNDLlNUQVRFX0lOVklTSUJMRTsKLQkJCWlmICghZ2V0RWRpdGFibGUoKSkgc3RhdGUgfD0gQUNDLlNUQVRFX1JFQURPTkxZOwotCQkJZS5kZXRhaWwgPSBzdGF0ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRWYWx1ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCWUucmVzdWx0ID0gU3R5bGVkVGV4dC50aGlzLmdldFRleHQoKTsKLQkJfQotCX0pOwkJCi0JYWRkTGlzdGVuZXIoU1dULkZvY3VzSW4sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWFjY2Vzc2libGUuc2V0Rm9jdXMoQUNDLkNISUxESURfU0VMRik7Ci0JCX0KLQl9KTsKLX0KLS8qKiAKLSAqIEluaXRpYWxpemVzIHRoZSBmb250cyB1c2VkIHRvIHJlbmRlciBmb250IHN0eWxlcy4KLSAqIFByZXNlbnRseSBvbmx5IHJlZ3VsYXIgYW5kIGJvbGQgZm9udHMgYXJlIHN1cHBvcnRlZC4KLSAqLwotdm9pZCBpbml0aWFsaXplUmVuZGVyZXIoKSB7Ci0JaWYgKHJlbmRlcmVyICE9IG51bGwpIHsKLQkJcmVuZGVyZXIuZGlzcG9zZSgpOwotCX0KLQlyZW5kZXJlciA9IG5ldyBEaXNwbGF5UmVuZGVyZXIoZ2V0RGlzcGxheSgpLCBnZXRGb250KCksIHRoaXMsIHRhYkxlbmd0aCk7Ci0JbGluZUhlaWdodCA9IHJlbmRlcmVyLmdldExpbmVIZWlnaHQoKTsKLQlpZiAod29yZFdyYXApIHsKLQkJY29udGVudCA9IG5ldyBXcmFwcGVkQ29udGVudChyZW5kZXJlciwgbG9naWNhbENvbnRlbnQpOwotCX0KLX0KLS8qKgotICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBhY3Rpb24gb25lIG9mIHRoZSBhY3Rpb25zIGRlZmluZWQgaW4gU1QuamF2YQotICovCi1wdWJsaWMgdm9pZCBpbnZva2VBY3Rpb24oaW50IGFjdGlvbikgewotCWludCBvbGRDb2x1bW5YLCBvbGRIU2Nyb2xsT2Zmc2V0LCBoU2Nyb2xsQ2hhbmdlOwotCWludCBjYXJldExpbmU7Ci0JCi0JY2hlY2tXaWRnZXQoKTsKLQl1cGRhdGVDYXJldERpcmVjdGlvbiA9IHRydWU7Ci0Jc3dpdGNoIChhY3Rpb24pIHsKLQkJLy8gTmF2aWdhdGlvbgotCQljYXNlIFNULkxJTkVfVVA6Ci0JCQljYXJldExpbmUgPSBkb0xpbmVVcCgpOwotCQkJb2xkQ29sdW1uWCA9IGNvbHVtblg7Ci0JCQlvbGRIU2Nyb2xsT2Zmc2V0ID0gaG9yaXpvbnRhbFNjcm9sbE9mZnNldDsKLQkJCS8vIGV4cGxpY2l0bHkgZ28gdG8gdGhlIGNhbGN1bGF0ZWQgY2FyZXQgbGluZS4gbWF5IGJlIGRpZmZlcmVudCAKLQkJCS8vIGZyb20gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoY2FyZXRPZmZzZXQpIHdoZW4gaW4gd29yZCB3cmFwIG1vZGUKLQkJCXNob3dDYXJldChjYXJldExpbmUpOwotCQkJLy8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgaG9yaXpvbnRhbCBjYXJldCBwb3NpdGlvbgotCQkJaFNjcm9sbENoYW5nZSA9IG9sZEhTY3JvbGxPZmZzZXQgLSBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0OwotCQkJY29sdW1uWCA9IG9sZENvbHVtblggKyBoU2Nyb2xsQ2hhbmdlOwotCQkJY2xlYXJTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5MSU5FX0RPV046Ci0JCQljYXJldExpbmUgPSBkb0xpbmVEb3duKCk7Ci0JCQlvbGRDb2x1bW5YID0gY29sdW1uWDsKLQkJCW9sZEhTY3JvbGxPZmZzZXQgPSBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0OwotCQkJLy8gZXhwbGljaXRseSBnbyB0byB0aGUgY2FsY3VsYXRlZCBjYXJldCBsaW5lLiBtYXkgYmUgZGlmZmVyZW50IAotCQkJLy8gZnJvbSBjb250ZW50LmdldExpbmVBdE9mZnNldChjYXJldE9mZnNldCkgd2hlbiBpbiB3b3JkIHdyYXAgbW9kZQotCQkJc2hvd0NhcmV0KGNhcmV0TGluZSk7Ci0JCQkvLyByZXN0b3JlIHRoZSBvcmlnaW5hbCBob3Jpem9udGFsIGNhcmV0IHBvc2l0aW9uCi0JCQloU2Nyb2xsQ2hhbmdlID0gb2xkSFNjcm9sbE9mZnNldCAtIGhvcml6b250YWxTY3JvbGxPZmZzZXQ7Ci0JCQljb2x1bW5YID0gb2xkQ29sdW1uWCArIGhTY3JvbGxDaGFuZ2U7Ci0JCQljbGVhclNlbGVjdGlvbih0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULkxJTkVfU1RBUlQ6Ci0JCQlkb0xpbmVTdGFydCgpOwotCQkJY2xlYXJTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5MSU5FX0VORDoKLQkJCWRvTGluZUVuZCgpOwotCQkJY2xlYXJTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5DT0xVTU5fUFJFVklPVVM6Ci0JCQlkb0N1cnNvclByZXZpb3VzKCk7Ci0JCQljbGVhclNlbGVjdGlvbih0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULkNPTFVNTl9ORVhUOgotCQkJZG9DdXJzb3JOZXh0KCk7Ci0JCQljbGVhclNlbGVjdGlvbih0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlBBR0VfVVA6Ci0JCQlkb1BhZ2VVcChmYWxzZSwgZ2V0TGluZUNvdW50V2hvbGUoKSk7Ci0JCQljbGVhclNlbGVjdGlvbih0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlBBR0VfRE9XTjoKLQkJCWRvUGFnZURvd24oZmFsc2UsIGdldExpbmVDb3VudFdob2xlKCkpOwotCQkJY2xlYXJTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5XT1JEX1BSRVZJT1VTOgotCQkJZG9Xb3JkUHJldmlvdXMoKTsKLQkJCWNsZWFyU2VsZWN0aW9uKHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuV09SRF9ORVhUOgotCQkJZG9Xb3JkTmV4dCgpOwotCQkJY2xlYXJTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5URVhUX1NUQVJUOgotCQkJZG9Db250ZW50U3RhcnQoKTsKLQkJCWNsZWFyU2VsZWN0aW9uKHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuVEVYVF9FTkQ6Ci0JCQlkb0NvbnRlbnRFbmQoKTsKLQkJCWNsZWFyU2VsZWN0aW9uKHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuV0lORE9XX1NUQVJUOgotCQkJZG9QYWdlU3RhcnQoKTsKLQkJCWNsZWFyU2VsZWN0aW9uKHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuV0lORE9XX0VORDoKLQkJCWRvUGFnZUVuZCgpOwotCQkJY2xlYXJTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJLy8gU2VsZWN0aW9uCQotCQljYXNlIFNULlNFTEVDVF9MSU5FX1VQOgotCQkJZG9TZWxlY3Rpb25MaW5lVXAoKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlNFTEVDVF9BTEw6Ci0JCQlzZWxlY3RBbGwoKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlNFTEVDVF9MSU5FX0RPV046Ci0JCQlkb1NlbGVjdGlvbkxpbmVEb3duKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5TRUxFQ1RfTElORV9TVEFSVDoKLQkJCWRvTGluZVN0YXJ0KCk7Ci0JCQlkb1NlbGVjdGlvbihTVC5DT0xVTU5fUFJFVklPVVMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuU0VMRUNUX0xJTkVfRU5EOgotCQkJZG9MaW5lRW5kKCk7Ci0JCQlkb1NlbGVjdGlvbihTVC5DT0xVTU5fTkVYVCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5TRUxFQ1RfQ09MVU1OX1BSRVZJT1VTOgotCQkJZG9TZWxlY3Rpb25DdXJzb3JQcmV2aW91cygpOwotCQkJZG9TZWxlY3Rpb24oU1QuQ09MVU1OX1BSRVZJT1VTKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlNFTEVDVF9DT0xVTU5fTkVYVDoKLQkJCWRvU2VsZWN0aW9uQ3Vyc29yTmV4dCgpOwotCQkJZG9TZWxlY3Rpb24oU1QuQ09MVU1OX05FWFQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuU0VMRUNUX1BBR0VfVVA6Ci0JCQlkb1NlbGVjdGlvblBhZ2VVcChnZXRMaW5lQ291bnRXaG9sZSgpKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlNFTEVDVF9QQUdFX0RPV046Ci0JCQlkb1NlbGVjdGlvblBhZ2VEb3duKGdldExpbmVDb3VudFdob2xlKCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuU0VMRUNUX1dPUkRfUFJFVklPVVM6Ci0JCQlkb1NlbGVjdGlvbldvcmRQcmV2aW91cygpOwotCQkJZG9TZWxlY3Rpb24oU1QuQ09MVU1OX1BSRVZJT1VTKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlNFTEVDVF9XT1JEX05FWFQ6Ci0JCQlkb1NlbGVjdGlvbldvcmROZXh0KCk7Ci0JCQlkb1NlbGVjdGlvbihTVC5DT0xVTU5fTkVYVCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5TRUxFQ1RfVEVYVF9TVEFSVDoKLQkJCWRvQ29udGVudFN0YXJ0KCk7Ci0JCQlkb1NlbGVjdGlvbihTVC5DT0xVTU5fUFJFVklPVVMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuU0VMRUNUX1RFWFRfRU5EOgotCQkJZG9Db250ZW50RW5kKCk7Ci0JCQlkb1NlbGVjdGlvbihTVC5DT0xVTU5fTkVYVCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5TRUxFQ1RfV0lORE9XX1NUQVJUOgotCQkJZG9QYWdlU3RhcnQoKTsKLQkJCWRvU2VsZWN0aW9uKFNULkNPTFVNTl9QUkVWSU9VUyk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5TRUxFQ1RfV0lORE9XX0VORDoKLQkJCWRvUGFnZUVuZCgpOwotCQkJZG9TZWxlY3Rpb24oU1QuQ09MVU1OX05FWFQpOwotCQkJYnJlYWs7Ci0JCS8vIE1vZGlmaWNhdGlvbgkJCQotCQljYXNlIFNULkNVVDoKLQkJCWN1dCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1QuQ09QWToKLQkJCWNvcHkoKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULlBBU1RFOgotCQkJcGFzdGUoKTsKLQkJCWJyZWFrOwotCQljYXNlIFNULkRFTEVURV9QUkVWSU9VUzoKLQkJCWRvQmFja3NwYWNlKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5ERUxFVEVfTkVYVDoKLQkJCWRvRGVsZXRlKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5ERUxFVEVfV09SRF9QUkVWSU9VUzoKLQkJCWRvRGVsZXRlV29yZFByZXZpb3VzKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVC5ERUxFVEVfV09SRF9ORVhUOgotCQkJZG9EZWxldGVXb3JkTmV4dCgpOwotCQkJYnJlYWs7Ci0JCS8vIE1pc2NlbGxhbmVvdXMKLQkJY2FzZSBTVC5UT0dHTEVfT1ZFUldSSVRFOgotCQkJb3ZlcndyaXRlID0gIW92ZXJ3cml0ZTsJCS8vIHRvZ2dsZSBpbnNlcnQvb3ZlcndyaXRlIG1vZGUKLQkJCWJyZWFrOwotCX0KLX0KLS8qKgotICogVGVtcG9yYXJ5IHVudGlsIFNXVCBwcm92aWRlcyB0aGlzCi0gKi8KLWJvb2xlYW4gaXNCaWRpKCkgewotCXJldHVybiBJU19HVEsgfHwgQmlkaVV0aWwuaXNCaWRpUGxhdGZvcm0oKSB8fCBpc01pcnJvcmVkOwotfQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9mZnNldCBpcyBpbnNpZGUgYSBtdWx0aSBieXRlIGxpbmUgZGVsaW1pdGVyLgotICogRXhhbXBsZTogCi0gKiAiTGluZTFcclxuIiBpc0xpbmVEZWxpbWl0ZXIoNSkgPT0gZmFsc2UgYnV0IGlzTGluZURlbGltaXRlcig2KSA9PSB0cnVlCi0gKiAKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGluc2lkZSBhIG11bHRpIGJ5dGUgbGluZSBkZWxpbWl0ZXIuCi0gKiBmYWxzZSBpZiB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGJlZm9yZSBvciBhZnRlciBhIGxpbmUgZGVsaW1pdGVyLgotICovCi1ib29sZWFuIGlzTGluZURlbGltaXRlcihpbnQgb2Zmc2V0KSB7Ci0JaW50IGxpbmUgPSBjb250ZW50LmdldExpbmVBdE9mZnNldChvZmZzZXQpOwotCWludCBsaW5lT2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZSk7CQotCWludCBvZmZzZXRJbkxpbmUgPSBvZmZzZXQgLSBsaW5lT2Zmc2V0OwotCS8vIG9mZnNldEluTGluZSB3aWxsIGJlIGdyZWF0ZXIgdGhhbiBsaW5lIGxlbmd0aCBpZiB0aGUgbGluZSAKLQkvLyBkZWxpbWl0ZXIgaXMgbG9uZ2VyIHRoYW4gb25lIGNoYXJhY3RlciBhbmQgdGhlIG9mZnNldCBpcyBzZXQKLQkvLyBpbiBiZXR3ZWVuIHBhcnRzIG9mIHRoZSBsaW5lIGRlbGltaXRlci4KLQlyZXR1cm4gb2Zmc2V0SW5MaW5lID4gY29udGVudC5nZXRMaW5lKGxpbmUpLmxlbmd0aCgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHdpZGdldCBpcyBtaXJyb3JlZCAocmlnaHQgb3JpZW50ZWQvcmlnaHQgdG8gbGVmdCAKLSAqIHdyaXRpbmcgb3JkZXIpLiAKLSAqIAotICogQHJldHVybiBpc01pcnJvcmVkIHRydWU9dGhlIHdpZGdldCBpcyByaWdodCBvcmllbnRlZCwgZmFsc2U9dGhlIHdpZGdldCAKLSAqIAlpcyBsZWZ0IG9yaWVudGVkCi0gKi8KLWJvb2xlYW4gaXNNaXJyb3JlZCgpIHsKLQlyZXR1cm4gaXNNaXJyb3JlZDsKLX0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gbGluZXMgYXJlIHZpc2libGUuCi0gKiA8cD4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBsaW5lcyBpcyB2aXNpYmxlCi0gKiBmYWxzZSBpZiBub25lIG9mIHRoZSBsaW5lcyBpcyB2aXNpYmxlCi0gKi8KLWJvb2xlYW4gaXNBcmVhVmlzaWJsZShpbnQgZmlyc3RMaW5lLCBpbnQgbGFzdExpbmUpIHsKLQlpbnQgcGFydGlhbEJvdHRvbUluZGV4ID0gZ2V0UGFydGlhbEJvdHRvbUluZGV4KCk7Ci0JaW50IHBhcnRpYWxUb3BJbmRleCA9IHZlcnRpY2FsU2Nyb2xsT2Zmc2V0IC8gbGluZUhlaWdodDsKLQlib29sZWFuIG5vdFZpc2libGUgPSBmaXJzdExpbmUgPiBwYXJ0aWFsQm90dG9tSW5kZXggfHwgbGFzdExpbmUgPCBwYXJ0aWFsVG9wSW5kZXg7Ci0JcmV0dXJuICFub3RWaXNpYmxlOwotfQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHdpZGdldCBjYW4gaGF2ZSBvbmx5IG9uZSBsaW5lLgotICogPHA+Ci0gKgotICogQHJldHVybiB0cnVlIGlmIHdpZGdldCBjYW4gaGF2ZSBvbmx5IG9uZSBsaW5lLCBmYWxzZSBpZiB3aWRnZXQgY2FuIGhhdmUgCi0gKiAJbXVsdGlwbGUgbGluZXMKLSAqLwotYm9vbGVhbiBpc1NpbmdsZUxpbmUoKSB7Ci0JcmV0dXJuIChnZXRTdHlsZSgpICYgU1dULlNJTkdMRSkgIT0gMDsKLX0KLS8qKgotICogU2VuZHMgdGhlIHNwZWNpZmllZCB2ZXJpZnkgZXZlbnQsIHJlcGxhY2UvaW5zZXJ0IHRleHQgYXMgZGVmaW5lZCBieSAKLSAqIHRoZSBldmVudCBhbmQgc2VuZCBhIG1vZGlmeSBldmVudC4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBldmVudAl0aGUgdGV4dCBjaGFuZ2UgZXZlbnQuIAotICoJPHVsPgotICoJPGxpPmV2ZW50LnN0YXJ0IC0gdGhlIHJlcGxhY2Ugc3RhcnQgb2Zmc2V0PC9saT4KLSAqIAk8bGk+ZXZlbnQuZW5kIC0gdGhlIHJlcGxhY2UgZW5kIG9mZnNldDwvbGk+Ci0gKiAJPGxpPmV2ZW50LnRleHQgLSB0aGUgbmV3IHRleHQ8L2xpPgotICoJPC91bD4KLSAqIEBwYXJhbSB1cGRhdGVDYXJldCB3aGV0aGVyIG9yIG5vdCBoZSBjYXJldCBzaG91bGQgYmUgc2V0IGJlaGluZAotICoJdGhlIG5ldyB0ZXh0Ci0gKi8KLXZvaWQgbW9kaWZ5Q29udGVudChFdmVudCBldmVudCwgYm9vbGVhbiB1cGRhdGVDYXJldCkgewotCWV2ZW50LmRvaXQgPSB0cnVlOwotCW5vdGlmeUxpc3RlbmVycyhTV1QuVmVyaWZ5LCBldmVudCk7Ci0JaWYgKGV2ZW50LmRvaXQpIHsKLQkJU3R5bGVkVGV4dEV2ZW50IHN0eWxlZFRleHRFdmVudCA9IG51bGw7Ci0JCWludCByZXBsYWNlZExlbmd0aCA9IGV2ZW50LmVuZCAtIGV2ZW50LnN0YXJ0OwotCQlpZiAoaXNMaXN0ZW5pbmcoRXh0ZW5kZWRNb2RpZnkpKSB7Ci0JCQlzdHlsZWRUZXh0RXZlbnQgPSBuZXcgU3R5bGVkVGV4dEV2ZW50KGxvZ2ljYWxDb250ZW50KTsKLQkJCXN0eWxlZFRleHRFdmVudC5zdGFydCA9IGV2ZW50LnN0YXJ0OwotCQkJc3R5bGVkVGV4dEV2ZW50LmVuZCA9IGV2ZW50LnN0YXJ0ICsgZXZlbnQudGV4dC5sZW5ndGgoKTsKLQkJCXN0eWxlZFRleHRFdmVudC50ZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoZXZlbnQuc3RhcnQsIHJlcGxhY2VkTGVuZ3RoKTsKLQkJfQotCQlpZiAodXBkYXRlQ2FyZXQpIHsKLQkJCS8vRml4IGFkdmFuY2luZyBmbGFnIGZvciBkZWxldGUvYmFja3NwYWNlIGtleSBvbiBkaXJlY3Rpb24gYm91bmRhcnkKLQkJCWlmIChldmVudC50ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCQlpbnQgbGluZUluZGV4ID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoZXZlbnQuc3RhcnQpOwotCQkJCWludCBsaW5lT2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUobGluZUluZGV4KTsKLQkJCQlTdHJpbmcgbGluZVRleHQgPSBjb250ZW50LmdldExpbmUobGluZUluZGV4KTsKLQkJCQlUZXh0TGF5b3V0IGxheW91dCA9IHJlbmRlcmVyLmdldFRleHRMYXlvdXQobGluZVRleHQsIGxpbmVPZmZzZXQpOwotCQkJCWludCBsZXZlbFN0YXJ0ID0gbGF5b3V0LmdldExldmVsKGV2ZW50LnN0YXJ0IC0gbGluZU9mZnNldCk7Ci0JCQkJaW50IGxpbmVJbmRleEVuZCA9IGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KGV2ZW50LmVuZCk7Ci0JCQkJaWYgKGxpbmVJbmRleCAhPSBsaW5lSW5kZXhFbmQpIHsKLQkJCQkJcmVuZGVyZXIuZGlzcG9zZVRleHRMYXlvdXQobGF5b3V0KTsKLQkJCQkJbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxpbmVJbmRleEVuZCk7Ci0JCQkJCWxpbmVUZXh0ID0gY29udGVudC5nZXRMaW5lKGxpbmVJbmRleEVuZCk7Ci0JCQkJCWxheW91dCA9IHJlbmRlcmVyLmdldFRleHRMYXlvdXQobGluZVRleHQsIGxpbmVPZmZzZXQpOwotCQkJCX0KLQkJCQlpbnQgbGV2ZWxFbmQgPSBsYXlvdXQuZ2V0TGV2ZWwoZXZlbnQuZW5kIC0gbGluZU9mZnNldCk7Ci0JCQkJcmVuZGVyZXIuZGlzcG9zZVRleHRMYXlvdXQobGF5b3V0KTsKLQkJCQlhZHZhbmNpbmcgPSBsZXZlbFN0YXJ0ICE9IGxldmVsRW5kOwotCQkJfQotCQl9Ci0JCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZShldmVudC5zdGFydCwgcmVwbGFjZWRMZW5ndGgsIGV2ZW50LnRleHQpOwotCQkvLyBzZXQgdGhlIGNhcmV0IHBvc2l0aW9uIHByaW9yIHRvIHNlbmRpbmcgdGhlIG1vZGlmeSBldmVudC4KLQkJLy8gZml4ZXMgMUdCQjhOSgotCQlpZiAodXBkYXRlQ2FyZXQpIHsKLQkJCS8vIGFsd2F5cyB1cGRhdGUgdGhlIGNhcmV0IGxvY2F0aW9uLiBmaXhlcyAxRzhGT0RQCi0JCQlpbnRlcm5hbFNldFNlbGVjdGlvbihldmVudC5zdGFydCArIGV2ZW50LnRleHQubGVuZ3RoKCksIDAsIHRydWUpOwotCQkJc2hvd0NhcmV0KCk7Ci0JCX0KLQkJc2VuZE1vZGlmeUV2ZW50KGV2ZW50KTsKLQkJaWYgKGlzTGlzdGVuaW5nKEV4dGVuZGVkTW9kaWZ5KSkgewotCQkJbm90aWZ5TGlzdGVuZXJzKEV4dGVuZGVkTW9kaWZ5LCBzdHlsZWRUZXh0RXZlbnQpOwotCQl9Ci0JfQotfQotLyoqIAotICogUmVwbGFjZXMgdGhlIHNlbGVjdGlvbiB3aXRoIHRoZSB0ZXh0IG9uIHRoZSA8Y29kZT5ETkQuQ0xJUEJPQVJEPC9jb2RlPiAgCi0gKiBjbGlwYm9hcmQgIG9yLCBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24sICBpbnNlcnRzIHRoZSB0ZXh0IGF0IHRoZSBjdXJyZW50IAotICogY2FyZXQgb2Zmc2V0LiAgIElmIHRoZSB3aWRnZXQgaGFzIHRoZSBTV1QuU0lOR0xFIHN0eWxlIGFuZCB0aGUgCi0gKiBjbGlwYm9hcmQgdGV4dCBjb250YWlucyBtb3JlIHRoYW4gb25lIGxpbmUsIG9ubHkgdGhlIGZpcnN0IGxpbmUgd2l0aG91dAotICogbGluZSBkZWxpbWl0ZXJzIGlzICBpbnNlcnRlZCBpbiB0aGUgd2lkZ2V0LgotICogPHA+Ci0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBwYXN0ZSgpewotCWNoZWNrV2lkZ2V0KCk7CQotCVN0cmluZyB0ZXh0OwotCXRleHQgPSAoU3RyaW5nKSBnZXRDbGlwYm9hcmRDb250ZW50KERORC5DTElQQk9BUkQpOwotCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQuc3RhcnQgPSBzZWxlY3Rpb24ueDsKLQkJZXZlbnQuZW5kID0gc2VsZWN0aW9uLnk7Ci0JCWV2ZW50LnRleHQgPSBnZXRNb2RlbERlbGltaXRlZFRleHQodGV4dCk7Ci0JCXNlbmRLZXlFdmVudChldmVudCk7Ci0JfQotfQotLyoqCi0gKiBSZW5kZXIgdGhlIHNwZWNpZmllZCBhcmVhLiAgQnJva2VuIG91dCBhcyBpdHMgb3duIG1ldGhvZCB0byBzdXBwb3J0Ci0gKiBkaXJlY3QgZHJhd2luZy4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBnYyBHQyB0byByZW5kZXIgb24gCi0gKiBAcGFyYW0gc3RhcnRMaW5lIGZpcnN0IGxpbmUgdG8gcmVuZGVyCi0gKiBAcGFyYW0gc3RhcnRZIHkgcGl4ZWwgbG9jYXRpb24gdG8gc3RhcnQgcmVuZGVyaW5nIGF0Ci0gKiBAcGFyYW0gcmVuZGVySGVpZ2h0IHJlbmRlckhlaWdodCB3aWRnZXQgYXJlYSB0aGF0IG5lZWRzIHRvIGJlIGZpbGxlZCB3aXRoIGxpbmVzCi0gKi8KLXZvaWQgcGVyZm9ybVBhaW50KEdDIGdjLGludCBzdGFydExpbmUsaW50IHN0YXJ0WSwgaW50IHJlbmRlckhlaWdodCkJewotCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCUNvbG9yIGJhY2tncm91bmQgPSBnZXRCYWNrZ3JvdW5kKCk7Ci0JCi0JLy8gQ2hlY2sgaWYgdGhlcmUgaXMgd29yayB0byBkby4gV2UgbmV2ZXIgd2FudCB0byB0cnkgYW5kIGNyZWF0ZSAKLQkvLyBhbiBJbWFnZSB3aXRoIDAgd2lkdGggb3IgMCBoZWlnaHQuCi0JaWYgKGNsaWVudEFyZWEud2lkdGggPT0gMCkgewotCQlyZXR1cm47Ci0JfQotCWlmIChyZW5kZXJIZWlnaHQgPiAwKSB7Ci0JCS8vIHJlbmRlckhlaWdodCB3aWxsIGJlIG5lZ2F0aXZlIHdoZW4gb25seSB0b3AgbWFyZ2luIG5lZWRzIHJlZHJhd2luZwotCQlDb2xvciBmb3JlZ3JvdW5kID0gZ2V0Rm9yZWdyb3VuZCgpOwotCQlpbnQgbGluZUNvdW50ID0gY29udGVudC5nZXRMaW5lQ291bnQoKTsKLQkJaW50IGdjU3R5bGUgPSBpc01pcnJvcmVkKCkgPyBTV1QuUklHSFRfVE9fTEVGVCA6IFNXVC5MRUZUX1RPX1JJR0hUOwotCQlpZiAoaXNTaW5nbGVMaW5lKCkpIHsKLQkJCWxpbmVDb3VudCA9IDE7Ci0JCX0KLQkJaW50IHBhaW50WSwgcGFpbnRIZWlnaHQ7Ci0JCUltYWdlIGxpbmVCdWZmZXI7Ci0JCUdDIGxpbmVHQzsKLQkJYm9vbGVhbiBkb3VibGVCdWZmZXIgPSBET1VCTEVfQlVGRkVSICYmIGxhc3RQYWludFRvcEluZGV4ID09IHRvcEluZGV4OwotCQlsYXN0UGFpbnRUb3BJbmRleCA9IHRvcEluZGV4OwotCQlpZiAoZG91YmxlQnVmZmVyKSB7Ci0JCQlwYWludFkgPSAwOwotCQkJcGFpbnRIZWlnaHQgPSByZW5kZXJIZWlnaHQ7Ci0JCQlsaW5lQnVmZmVyID0gbmV3IEltYWdlKGdldERpc3BsYXkoKSwgY2xpZW50QXJlYS53aWR0aCwgcmVuZGVySGVpZ2h0KTsKLQkJCWxpbmVHQyA9IG5ldyBHQyhsaW5lQnVmZmVyLCBnY1N0eWxlKTsKLQkJCWxpbmVHQy5zZXRGb250KGdldEZvbnQoKSk7Ci0JCQlsaW5lR0Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCWxpbmVHQy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCQl9IGVsc2UgewotCQkJcGFpbnRZID0gc3RhcnRZOwotCQkJcGFpbnRIZWlnaHQgPSBzdGFydFkgKyByZW5kZXJIZWlnaHQ7Ci0JCQlsaW5lQnVmZmVyID0gbnVsbDsKLQkJCWxpbmVHQyA9IGdjOwotCQl9CQkKLQkJZm9yIChpbnQgaSA9IHN0YXJ0TGluZTsgcGFpbnRZIDwgcGFpbnRIZWlnaHQgJiYgaSA8IGxpbmVDb3VudDsgaSsrLCBwYWludFkgKz0gbGluZUhlaWdodCkgewotCQkJU3RyaW5nIGxpbmUgPSBjb250ZW50LmdldExpbmUoaSk7Ci0JCQlyZW5kZXJlci5kcmF3TGluZShsaW5lLCBpLCBwYWludFksIGxpbmVHQywgYmFja2dyb3VuZCwgZm9yZWdyb3VuZCwgdHJ1ZSk7Ci0JCX0KLQkJaWYgKHBhaW50WSA8IHBhaW50SGVpZ2h0KSB7Ci0JCQlsaW5lR0Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCWxpbmVHQy5maWxsUmVjdGFuZ2xlKDAsIHBhaW50WSwgY2xpZW50QXJlYS53aWR0aCwgcGFpbnRIZWlnaHQgLSBwYWludFkpOwotCQl9Ci0JCWlmIChkb3VibGVCdWZmZXIpIHsKLQkJCWNsZWFyTWFyZ2luKGxpbmVHQywgYmFja2dyb3VuZCwgY2xpZW50QXJlYSwgc3RhcnRZKTsKLQkJCWdjLmRyYXdJbWFnZShsaW5lQnVmZmVyLCAwLCBzdGFydFkpOwotCQkJbGluZUdDLmRpc3Bvc2UoKTsKLQkJCWxpbmVCdWZmZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCWNsZWFyTWFyZ2luKGdjLCBiYWNrZ3JvdW5kLCBjbGllbnRBcmVhLCAwKTsKLX0KLS8qKiAKLSAqIFByaW50cyB0aGUgd2lkZ2V0J3MgdGV4dCB0byB0aGUgZGVmYXVsdCBwcmludGVyLgotICoKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcHJpbnQoKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcigpOwotCVN0eWxlZFRleHRQcmludE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBTdHlsZWRUZXh0UHJpbnRPcHRpb25zKCk7Ci0JCi0Jb3B0aW9ucy5wcmludFRleHRGb3JlZ3JvdW5kID0gdHJ1ZTsKLQlvcHRpb25zLnByaW50VGV4dEJhY2tncm91bmQgPSB0cnVlOwotCW9wdGlvbnMucHJpbnRUZXh0Rm9udFN0eWxlID0gdHJ1ZTsKLQlvcHRpb25zLnByaW50TGluZUJhY2tncm91bmQgPSB0cnVlOwkKLQluZXcgUHJpbnRpbmcodGhpcywgcHJpbnRlciwgb3B0aW9ucykucnVuKCk7Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci19Ci0vKiogCi0gKiBSZXR1cm5zIGEgcnVubmFibGUgdGhhdCB3aWxsIHByaW50IHRoZSB3aWRnZXQncyB0ZXh0Ci0gKiB0byB0aGUgc3BlY2lmaWVkIHByaW50ZXIuCi0gKiA8cD4KLSAqIFRoZSBydW5uYWJsZSBtYXkgYmUgcnVuIGluIGEgbm9uLVVJIHRocmVhZC4KLSAqIDwvcD4KLSAqIAotICogQHBhcmFtIHByaW50ZXIgdGhlIHByaW50ZXIgdG8gcHJpbnQgdG8KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gcHJpbnRlciBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBSdW5uYWJsZSBwcmludChQcmludGVyIHByaW50ZXIpIHsKLQljaGVja1dpZGdldCgpOwkKLQlTdHlsZWRUZXh0UHJpbnRPcHRpb25zIG9wdGlvbnMgPSBuZXcgU3R5bGVkVGV4dFByaW50T3B0aW9ucygpOwotCW9wdGlvbnMucHJpbnRUZXh0Rm9yZWdyb3VuZCA9IHRydWU7Ci0Jb3B0aW9ucy5wcmludFRleHRCYWNrZ3JvdW5kID0gdHJ1ZTsKLQlvcHRpb25zLnByaW50VGV4dEZvbnRTdHlsZSA9IHRydWU7Ci0Jb3B0aW9ucy5wcmludExpbmVCYWNrZ3JvdW5kID0gdHJ1ZTsKLQlpZiAocHJpbnRlciA9PSBudWxsKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JfQotCXJldHVybiBwcmludChwcmludGVyLCBvcHRpb25zKTsKLX0KLS8qKiAKLSAqIFJldHVybnMgYSBydW5uYWJsZSB0aGF0IHdpbGwgcHJpbnQgdGhlIHdpZGdldCdzIHRleHQKLSAqIHRvIHRoZSBzcGVjaWZpZWQgcHJpbnRlci4KLSAqIDxwPgotICogVGhlIHJ1bm5hYmxlIG1heSBiZSBydW4gaW4gYSBub24tVUkgdGhyZWFkLgotICogPC9wPgotICogCi0gKiBAcGFyYW0gcHJpbnRlciB0aGUgcHJpbnRlciB0byBwcmludCB0bwotICogQHBhcmFtIG9wdGlvbnMgcHJpbnQgb3B0aW9ucyB0byB1c2UgZHVyaW5nIHByaW50aW5nCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIHByaW50ZXIgb3Igb3B0aW9ucyBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBSdW5uYWJsZSBwcmludChQcmludGVyIHByaW50ZXIsIFN0eWxlZFRleHRQcmludE9wdGlvbnMgb3B0aW9ucykgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKHByaW50ZXIgPT0gbnVsbCB8fCBvcHRpb25zID09IG51bGwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9Ci0JcmV0dXJuIG5ldyBQcmludGluZyh0aGlzLCBwcmludGVyLCBvcHRpb25zKTsKLX0KLS8qKgotICogQ2F1c2VzIHRoZSBlbnRpcmUgYm91bmRzIG9mIHRoZSByZWNlaXZlciB0byBiZSBtYXJrZWQKLSAqIGFzIG5lZWRpbmcgdG8gYmUgcmVkcmF3bi4gVGhlIG5leHQgdGltZSBhIHBhaW50IHJlcXVlc3QKLSAqIGlzIHByb2Nlc3NlZCwgdGhlIGNvbnRyb2wgd2lsbCBiZSBjb21wbGV0ZWx5IHBhaW50ZWQuCi0gKiA8cD4KLSAqIFJlY2FsY3VsYXRlcyB0aGUgY29udGVudCB3aWR0aCBmb3IgYWxsIGxpbmVzIGluIHRoZSBib3VuZHMuCi0gKiBXaGVuIGEgPGNvZGU+TGluZVN0eWxlTGlzdGVuZXI8L2NvZGU+IGlzIHVzZWQgYSByZWRyYXcgY2FsbCAKLSAqIGlzIHRoZSBvbmx5IG5vdGlmaWNhdGlvbiB0byB0aGUgd2lkZ2V0IHRoYXQgc3R5bGVzIGhhdmUgY2hhbmdlZCAKLSAqIGFuZCB0aGF0IHRoZSBjb250ZW50IHdpZHRoIG1heSBoYXZlIGNoYW5nZWQuCi0gKiA8L3A+Ci0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgQ29udHJvbCN1cGRhdGUKLSAqLwotcHVibGljIHZvaWQgcmVkcmF3KCkgewotCWludCBpdGVtQ291bnQ7Ci0JCi0Jc3VwZXIucmVkcmF3KCk7Ci0JaXRlbUNvdW50ID0gZ2V0UGFydGlhbEJvdHRvbUluZGV4KCkgLSB0b3BJbmRleCArIDE7Ci0JbGluZUNhY2hlLnJlZHJhd1Jlc2V0KHRvcEluZGV4LCBpdGVtQ291bnQsIHRydWUpOwotCWxpbmVDYWNoZS5jYWxjdWxhdGUodG9wSW5kZXgsIGl0ZW1Db3VudCk7Ci0Jc2V0SG9yaXpvbnRhbFNjcm9sbEJhcigpOwotfQotLyoqCi0gKiBDYXVzZXMgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgdGhlIHJlY2VpdmVyIHNwZWNpZmllZCBieQotICogdGhlIGFyZ3VtZW50cyB0byBiZSBtYXJrZWQgYXMgbmVlZGluZyB0byBiZSByZWRyYXduLiAKLSAqIFRoZSBuZXh0IHRpbWUgYSBwYWludCByZXF1ZXN0IGlzIHByb2Nlc3NlZCwgdGhhdCBhcmVhIG9mCi0gKiB0aGUgcmVjZWl2ZXIgd2lsbCBiZSBwYWludGVkLiBJZiB0aGUgPGNvZGU+YWxsPC9jb2RlPiBmbGFnCi0gKiBpcyA8Y29kZT50cnVlPC9jb2RlPiwgYW55IGNoaWxkcmVuIG9mIHRoZSByZWNlaXZlciB3aGljaAotICogaW50ZXJzZWN0IHdpdGggdGhlIHNwZWNpZmllZCBhcmVhIHdpbGwgYWxzbyBwYWludCB0aGVpcgotICogaW50ZXJzZWN0aW5nIGFyZWFzLiBJZiB0aGUgPGNvZGU+YWxsPC9jb2RlPiBmbGFnIGlzIAotICogPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgY2hpbGRyZW4gd2lsbCBub3QgYmUgcGFpbnRlZC4KLSAqIDxwPgotICogTWFya3MgdGhlIGNvbnRlbnQgd2lkdGggb2YgYWxsIGxpbmVzIGluIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlCi0gKiBhcyB1bmtub3duLiBSZWNhbGN1bGF0ZXMgdGhlIGNvbnRlbnQgd2lkdGggb2YgYWxsIHZpc2libGUgbGluZXMuCi0gKiBXaGVuIGEgPGNvZGU+TGluZVN0eWxlTGlzdGVuZXI8L2NvZGU+IGlzIHVzZWQgYSByZWRyYXcgY2FsbCAKLSAqIGlzIHRoZSBvbmx5IG5vdGlmaWNhdGlvbiB0byB0aGUgd2lkZ2V0IHRoYXQgc3R5bGVzIGhhdmUgY2hhbmdlZCAKLSAqIGFuZCB0aGF0IHRoZSBjb250ZW50IHdpZHRoIG1heSBoYXZlIGNoYW5nZWQuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBkcmF3Ci0gKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGRyYXcKLSAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGFyZWEgdG8gZHJhdwotICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIHRvIGRyYXcKLSAqIEBwYXJhbSBhbGwgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY2hpbGRyZW4gc2hvdWxkIHJlZHJhdywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSBDb250cm9sI3VwZGF0ZQotICovCi1wdWJsaWMgdm9pZCByZWRyYXcoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gYWxsKSB7Ci0Jc3VwZXIucmVkcmF3KHgsIHksIHdpZHRoLCBoZWlnaHQsIGFsbCk7Ci0JaWYgKGhlaWdodCA+IDApIHsKLQkJaW50IGxpbmVDb3VudCA9IGNvbnRlbnQuZ2V0TGluZUNvdW50KCk7Ci0JCWludCBzdGFydExpbmUgPSAoZ2V0VG9wUGl4ZWwoKSArIHkpIC8gbGluZUhlaWdodDsKLQkJaW50IGVuZExpbmUgPSBzdGFydExpbmUgKyBDb21wYXRpYmlsaXR5LmNlaWwoaGVpZ2h0LCBsaW5lSGVpZ2h0KTsKLQkJaW50IGl0ZW1Db3VudDsKLQkJCi0JCS8vIHJlc2V0IGFsbCBsaW5lcyBpbiB0aGUgcmVkcmF3IHJlY3RhbmdsZQotCQlzdGFydExpbmUgPSBNYXRoLm1pbihzdGFydExpbmUsIGxpbmVDb3VudCk7Ci0JCWl0ZW1Db3VudCA9IE1hdGgubWluKGVuZExpbmUsIGxpbmVDb3VudCkgLSBzdGFydExpbmU7Ci0JCWxpbmVDYWNoZS5yZXNldChzdGFydExpbmUsIGl0ZW1Db3VudCwgdHJ1ZSk7Ci0JCS8vIG9ubHkgY2FsY3VsYXRlIHRoZSB2aXNpYmxlIGxpbmVzCi0JCWl0ZW1Db3VudCA9IGdldFBhcnRpYWxCb3R0b21JbmRleCgpIC0gdG9wSW5kZXggKyAxOwotCQlsaW5lQ2FjaGUuY2FsY3VsYXRlKHRvcEluZGV4LCBpdGVtQ291bnQpOwotCQlzZXRIb3Jpem9udGFsU2Nyb2xsQmFyKCk7Ci0JfQotfQotLyoqIAotICogUmVkcmF3cyBhIHRleHQgcmFuZ2UgaW4gdGhlIHNwZWNpZmllZCBsaW5lcwotICogPHA+Ci0gKgotICogQHBhcmFtIGZpcnN0TGluZSBmaXJzdCBsaW5lIHRvIHJlZHJhdyBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldAotICogQHBhcmFtIG9mZnNldEluRmlyc3RMaW5lIG9mZnNldCBpbiBmaXJzdExpbmUgdG8gc3RhcnQgcmVkcmF3aW5nCi0gKiBAcGFyYW0gbGFzdExpbmUgbGFzdCBsaW5lIHRvIHJlZHJhdwotICogQHBhcmFtIGVuZE9mZnNldCBvZmZzZXQgaW4gdGhlIGxhc3Qgd2hlcmUgcmVkcmF3aW5nIHNob3VsZCBzdG9wCi0gKiBAcGFyYW0gY2xlYXJCYWNrZ3JvdW5kIHRydWU9Y2xlYXIgdGhlIGJhY2tncm91bmQgYnkgaW52YWxpZGF0aW5nCi0gKiAgdGhlIHJlcXVlc3RlZCByZWRyYXcgcmFuZ2UuIElmIHRoZSByZWRyYXcgcmFuZ2UgaW5jbHVkZXMgdGhlIAotICogCWxhc3QgY2hhcmFjdGVyIG9mIGEgbGluZSAoaS5lLiwgdGhlIGVudGlyZSBsaW5lIGlzIHJlZHJhd24pIHRoZSAKLSAqIAlsaW5lIGlzIGNsZWFyZWQgYWxsIHRoZSB3YXkgdG8gdGhlIHJpZ2h0IGJvcmRlciBvZiB0aGUgd2lkZ2V0LgotICogIGZhbHNlPWRyYXcgdGhlIGZvcmVncm91bmQgZGlyZWN0bHkgd2l0aG91dCBpbnZhbGlkYXRpbmcgdGhlIAotICogCXJlZHJhdyByYW5nZS4KLSAqLwotdm9pZCByZWRyYXdMaW5lcyhpbnQgZmlyc3RMaW5lLCBpbnQgb2Zmc2V0SW5GaXJzdExpbmUsIGludCBsYXN0TGluZSwgaW50IGVuZE9mZnNldCwgYm9vbGVhbiBjbGVhckJhY2tncm91bmQpIHsKLQlTdHJpbmcgbGluZSA9IGNvbnRlbnQuZ2V0TGluZShmaXJzdExpbmUpOwotCWludCBsaW5lQ291bnQgPSBsYXN0TGluZSAtIGZpcnN0TGluZSArIDE7Ci0JaW50IHJlZHJhd1ksIHJlZHJhd1dpZHRoOwotCWludCBsaW5lT2Zmc2V0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUoZmlyc3RMaW5lKTsKLQlib29sZWFuIGZ1bGxMaW5lUmVkcmF3OwotCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQotCWZ1bGxMaW5lUmVkcmF3ID0gKChnZXRTdHlsZSgpICYgU1dULkZVTExfU0VMRUNUSU9OKSAhPSAwICYmIGxhc3RMaW5lID4gZmlyc3RMaW5lKTsKLQkvLyBpZiByZWRyYXcgcmFuZ2UgaW5jbHVkZXMgbGFzdCBjaGFyYWN0ZXIgb24gdGhlIGZpcnN0IGxpbmUsIAotCS8vIGNsZWFyIGJhY2tncm91bmQgdG8gcmlnaHQgd2lkZ2V0IGJvcmRlci4gZml4ZXMgYnVnIDE5NTk1LgotCWlmIChjbGVhckJhY2tncm91bmQgJiYgZW5kT2Zmc2V0IC0gbGluZU9mZnNldCA+PSBsaW5lLmxlbmd0aCgpKSB7Ci0JCWZ1bGxMaW5lUmVkcmF3ID0gdHJ1ZTsKLQl9CQotCVRleHRMYXlvdXQgbGF5b3V0ID0gcmVuZGVyZXIuZ2V0VGV4dExheW91dChsaW5lLCBsaW5lT2Zmc2V0KTsKLQlSZWN0YW5nbGUgcmVjdCA9IGxheW91dC5nZXRCb3VuZHMob2Zmc2V0SW5GaXJzdExpbmUsIE1hdGgubWluKGVuZE9mZnNldCwgbGluZS5sZW5ndGgoKSkgLSAxKTsKLQlyZW5kZXJlci5kaXNwb3NlVGV4dExheW91dChsYXlvdXQpOwotCXJlY3QueCAtPSBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0OwotCXJlY3QuaW50ZXJzZWN0KGNsaWVudEFyZWEpOwotCXJlZHJhd1kgPSBmaXJzdExpbmUgKiBsaW5lSGVpZ2h0IC0gdmVydGljYWxTY3JvbGxPZmZzZXQ7Ci0JcmVkcmF3V2lkdGggPSBmdWxsTGluZVJlZHJhdyA/IGNsaWVudEFyZWEud2lkdGggLSBsZWZ0TWFyZ2luIC0gcmlnaHRNYXJnaW4gOiByZWN0LndpZHRoOwotCWRyYXcocmVjdC54LCByZWRyYXdZLCByZWRyYXdXaWR0aCwgbGluZUhlaWdodCwgY2xlYXJCYWNrZ3JvdW5kKTsKLQkKLQkvLyByZWRyYXcgbGFzdCBsaW5lIGlmIG1vcmUgdGhhbiBvbmUgbGluZSBuZWVkcyByZWRyYXdpbmcgCi0JaWYgKGxpbmVDb3VudCA+IDEpIHsKLQkJbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxhc3RMaW5lKTsKLQkJaW50IG9mZnNldEluTGFzdExpbmUgPSBlbmRPZmZzZXQgLSBsaW5lT2Zmc2V0OwkKLQkJLy8gbm8gcmVkcmF3IG5lY2Vzc2FyeSBpZiByZWRyYXcgb2Zmc2V0IGlzIDAKLQkJaWYgKG9mZnNldEluTGFzdExpbmUgPiAwKSB7Ci0JCQlsaW5lID0gY29udGVudC5nZXRMaW5lKGxhc3RMaW5lKTsKLQkJCS8vIGlmIHJlZHJhdyByYW5nZSBpbmNsdWRlcyBsYXN0IGNoYXJhY3RlciBvbiB0aGUgbGFzdCBsaW5lLCAKLQkJCS8vIGNsZWFyIGJhY2tncm91bmQgdG8gcmlnaHQgd2lkZ2V0IGJvcmRlci4gZml4ZXMgYnVnIDE5NTk1LgotCQkJaWYgKGNsZWFyQmFja2dyb3VuZCAmJiBvZmZzZXRJbkxhc3RMaW5lID49IGxpbmUubGVuZ3RoKCkpIHsKLQkJCQlmdWxsTGluZVJlZHJhdyA9IHRydWU7Ci0JCQl9Ci0JCQlsaW5lID0gY29udGVudC5nZXRMaW5lKGxhc3RMaW5lKTsKLQkJCWxheW91dCA9IHJlbmRlcmVyLmdldFRleHRMYXlvdXQobGluZSwgbGluZU9mZnNldCk7Ci0JCQlyZWN0ID0gbGF5b3V0LmdldEJvdW5kcygwLCBvZmZzZXRJbkxhc3RMaW5lIC0gMSk7Ci0JCQlyZW5kZXJlci5kaXNwb3NlVGV4dExheW91dChsYXlvdXQpOwotCQkJcmVjdC54IC09IGhvcml6b250YWxTY3JvbGxPZmZzZXQ7Ci0JCQlyZWN0LmludGVyc2VjdChjbGllbnRBcmVhKTsKLQkJCXJlZHJhd1kgPSBsYXN0TGluZSAqIGxpbmVIZWlnaHQgLSB2ZXJ0aWNhbFNjcm9sbE9mZnNldDsKLQkJCXJlZHJhd1dpZHRoID0gZnVsbExpbmVSZWRyYXcgPyBjbGllbnRBcmVhLndpZHRoIC0gbGVmdE1hcmdpbiAtIHJpZ2h0TWFyZ2luIDogcmVjdC53aWR0aDsKLQkJCWRyYXcocmVjdC54LCByZWRyYXdZLCByZWRyYXdXaWR0aCwgbGluZUhlaWdodCwgY2xlYXJCYWNrZ3JvdW5kKTsKLQkJfQotCX0KLX0KLS8qKgotICogRml4ZXMgdGhlIHdpZGdldCB0byBkaXNwbGF5IGEgdGV4dCBjaGFuZ2UuCi0gKiBCaXQgYmxpdHRpbmcgYW5kIHJlZHJhd2luZyBpcyBkb25lIGFzIG5lY2Vzc2FyeS4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSB5IHkgbG9jYXRpb24gb2YgdGhlIHRleHQgY2hhbmdlCi0gKiBAcGFyYW0gbmV3TGluZUNvdW50IG51bWJlciBvZiBuZXcgbGluZXMuCi0gKiBAcGFyYW0gcmVwbGFjZWRMaW5lQ291bnQgbnVtYmVyIG9mIHJlcGxhY2VkIGxpbmVzLgotICovCi12b2lkIHJlZHJhd011bHRpTGluZUNoYW5nZShpbnQgeSwgaW50IG5ld0xpbmVDb3VudCwgaW50IHJlcGxhY2VkTGluZUNvdW50KSB7Ci0JUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0JaW50IGxpbmVDb3VudCA9IG5ld0xpbmVDb3VudCAtIHJlcGxhY2VkTGluZUNvdW50OwotCWludCBzb3VyY2VZOwotCWludCBkZXN0aW5hdGlvblk7Ci0JCQotCWlmIChsaW5lQ291bnQgPiAwKSB7Ci0JCXNvdXJjZVkgPSBNYXRoLm1heCgwLCB5ICsgbGluZUhlaWdodCk7Ci0JCWRlc3RpbmF0aW9uWSA9IHNvdXJjZVkgKyBsaW5lQ291bnQgKiBsaW5lSGVpZ2h0OwotCX0gCi0JZWxzZSB7Ci0JCWRlc3RpbmF0aW9uWSA9IE1hdGgubWF4KDAsIHkgKyBsaW5lSGVpZ2h0KTsKLQkJc291cmNlWSA9IGRlc3RpbmF0aW9uWSAtIGxpbmVDb3VudCAqIGxpbmVIZWlnaHQ7Ci0JfQkKLQlzY3JvbGwoCi0JCTAsIGRlc3RpbmF0aW9uWSwJCQkvLyBkZXN0aW5hdGlvbiB4LCB5Ci0JCTAsIHNvdXJjZVksCQkJCQkvLyBzb3VyY2UgeCwgeQotCQljbGllbnRBcmVhLndpZHRoLCBjbGllbnRBcmVhLmhlaWdodCwgdHJ1ZSk7Ci0JLy8gQWx3YXlzIHJlZHJhd2luZyBjYXVzZXMgdGhlIGJvdHRvbSBsaW5lIHRvIGZsYXNoIHdoZW4gYSBsaW5lIGlzCi0JLy8gZGVsZXRlZC4gVGhpcyBpcyBiZWNhdXNlIFNXVCBtZXJnZXMgdGhlIHBhaW50IGFyZWEgb2YgdGhlIHNjcm9sbAotCS8vIHdpdGggdGhlIHBhaW50IGFyZWEgb2YgdGhlIHJlZHJhdyBjYWxsIGJlbG93LgotCS8vIFRvIHByZXZlbnQgdGhpcyB3ZSBjb3VsZCBjYWxsIHVwZGF0ZSBhZnRlciB0aGUgc2Nyb2xsLiBIb3dldmVyLAotCS8vIGFkZGluZyB1cGRhdGUgY2FuIGNhdXNlIGV2ZW4gbW9yZSBmbGFzaCBpZiB0aGUgY2xpZW50IGRvZXMgb3RoZXIgCi0JLy8gcmVkcmF3L3VwZGF0ZSBjYWxscyAoaWUuIGZvciBzeW50YXggaGlnaGxpZ2h0aW5nKS4KLQkvLyBXZSBjb3VsZCBhbHNvIHJlZHJhdyBvbmx5IHdoZW4gYSBsaW5lIGhhcyBiZWVuIGFkZGVkIG9yIHdoZW4gCi0JLy8gY29udGVudHMgaGFzIGJlZW4gYWRkZWQgdG8gYSBsaW5lLiBUaGlzIHdvdWxkIHJlcXVpcmUgZ2V0dGluZyAKLQkvLyBsaW5lIGluZGV4IGluZm8gZnJvbSB0aGUgY29udGVudCBhbmQgaXMgbm90IHdvcnRoIHRoZSB0cm91YmxlCi0JLy8gKHRoZSBmbGFzaCBpcyBvbmx5IG9uIHRoZSBib3R0b20gbGluZSBhbmQgbWlub3IpLgotCS8vIFNwZWNpZnlpbmcgdGhlIE5PX01FUkdFX1BBSU5UUyBzdHlsZSBiaXQgcHJldmVudHMgdGhlIG1lcmdlZCAKLQkvLyByZWRyYXcgYnV0IGNvdWxkIGNhdXNlIGZsYXNoL3Nsb3duZXNzIGVsc2V3aGVyZS4KLQlpZiAoeSArIGxpbmVIZWlnaHQgPiAwICYmIHkgPD0gY2xpZW50QXJlYS5oZWlnaHQpIHsKLQkJLy8gcmVkcmF3IGZpcnN0IGNoYW5nZWQgbGluZSBpbiBjYXNlIGEgbGluZSB3YXMgc3BsaXQvam9pbmVkCi0JCXN1cGVyLnJlZHJhdygwLCB5LCBjbGllbnRBcmVhLndpZHRoLCBsaW5lSGVpZ2h0LCB0cnVlKTsKLQl9Ci0JaWYgKG5ld0xpbmVDb3VudCA+IDApIHsKLQkJaW50IHJlZHJhd1N0YXJ0WSA9IHkgKyBsaW5lSGVpZ2h0OwotCQlpbnQgcmVkcmF3SGVpZ2h0ID0gbmV3TGluZUNvdW50ICogbGluZUhlaWdodDsKLQkJCi0JCWlmIChyZWRyYXdTdGFydFkgKyByZWRyYXdIZWlnaHQgPiAwICYmIHJlZHJhd1N0YXJ0WSA8PSBjbGllbnRBcmVhLmhlaWdodCkgewotCQkJLy8gZGlzcGxheSBuZXcgdGV4dAotCQkJc3VwZXIucmVkcmF3KDAsIHJlZHJhd1N0YXJ0WSwgY2xpZW50QXJlYS53aWR0aCwgcmVkcmF3SGVpZ2h0LCB0cnVlKTsKLQkJfQotCX0KLX0KLS8qKiAKLSAqIFJlZHJhd3MgdGhlIHNwZWNpZmllZCB0ZXh0IHJhbmdlLgotICogPHA+Ci0gKgotICogQHBhcmFtIHN0YXJ0IG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHJlZHJhdwotICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWRyYXcKLSAqIEBwYXJhbSBjbGVhckJhY2tncm91bmQgdHJ1ZSBpZiB0aGUgYmFja2dyb3VuZCBzaG91bGQgYmUgY2xlYXJlZCBhcwotICogIHBhcnQgb2YgdGhlIHJlZHJhdyBvcGVyYXRpb24uICBJZiB0cnVlLCB0aGUgZW50aXJlIHJlZHJhdyByYW5nZSB3aWxsCi0gKiAgYmUgY2xlYXJlZCBiZWZvcmUgYW55dGhpbmcgaXMgcmVkcmF3bi4gIElmIHRoZSByZWRyYXcgcmFuZ2UgaW5jbHVkZXMKLSAqCXRoZSBsYXN0IGNoYXJhY3RlciBvZiBhIGxpbmUgKGkuZS4sIHRoZSBlbnRpcmUgbGluZSBpcyByZWRyYXduKSB0aGUgCi0gKiAJbGluZSBpcyBjbGVhcmVkIGFsbCB0aGUgd2F5IHRvIHRoZSByaWdodCBib3JkZXIgb2YgdGhlIHdpZGdldC4KLSAqIAlUaGUgcmVkcmF3IG9wZXJhdGlvbiB3aWxsIGJlIGZhc3RlciBhbmQgc21vb3RoZXIgaWYgY2xlYXJCYWNrZ3JvdW5kIAotICogCWlzIHNldCB0byBmYWxzZS4gIFdoZXRoZXIgb3Igbm90IHRoZSBmbGFnIGNhbiBiZSBzZXQgdG8gZmFsc2UgZGVwZW5kcyAKLSAqIAlvbiB0aGUgdHlwZSBvZiBjaGFuZ2UgdGhhdCBoYXMgdGFrZW4gcGxhY2UuICBJZiBmb250IHN0eWxlcyBvciAKLSAqIAliYWNrZ3JvdW5kIGNvbG9ycyBmb3IgdGhlIHJlZHJhdyByYW5nZSBoYXZlIGNoYW5nZWQsIGNsZWFyQmFja2dyb3VuZCAKLSAqIAlzaG91bGQgYmUgc2V0IHRvIHRydWUuICBJZiBvbmx5IGZvcmVncm91bmQgY29sb3JzIGhhdmUgY2hhbmdlZCBmb3IgCi0gKiAJdGhlIHJlZHJhdyByYW5nZSwgY2xlYXJCYWNrZ3JvdW5kIGNhbiBiZSBzZXQgdG8gZmFsc2UuIAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICA8bGk+RVJST1JfSU5WQUxJRF9SQU5HRSB3aGVuIHN0YXJ0IGFuZC9vciBlbmQgYXJlIG91dHNpZGUgdGhlIHdpZGdldCBjb250ZW50PC9saT4gCi0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCByZWRyYXdSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgsIGJvb2xlYW4gY2xlYXJCYWNrZ3JvdW5kKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBsZW5ndGg7Ci0JaW50IGNvbnRlbnRMZW5ndGggPSBjb250ZW50LmdldENoYXJDb3VudCgpOwotCWludCBmaXJzdExpbmU7Ci0JaW50IGxhc3RMaW5lOwotCQotCWlmIChzdGFydCA+IGVuZCB8fCBzdGFydCA8IDAgfHwgZW5kID4gY29udGVudExlbmd0aCkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfUkFOR0UpOwotCX0JCi0JZmlyc3RMaW5lID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoc3RhcnQpOwotCWxhc3RMaW5lID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoZW5kKTsKLQkvLyByZXNldCBhbGwgYWZmZWN0ZWQgbGluZXMgYnV0IGxldCB0aGUgcmVkcmF3IHJlY2FsY3VsYXRlIG9ubHkgCi0JLy8gdGhvc2UgdGhhdCBhcmUgdmlzaWJsZS4KLQlsaW5lQ2FjaGUucmVzZXQoZmlyc3RMaW5lLCBsYXN0TGluZSAtIGZpcnN0TGluZSArIDEsIHRydWUpOwotCWludGVybmFsUmVkcmF3UmFuZ2Uoc3RhcnQsIGxlbmd0aCwgY2xlYXJCYWNrZ3JvdW5kKTsKLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGJpZGlyZWN0aW9uYWwgc2VnbWVudCBsaXN0ZW5lci4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgdm9pZCByZW1vdmVCaWRpU2VnbWVudExpc3RlbmVyKEJpZGlTZWdtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChsaXN0ZW5lciA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXJlbW92ZUxpc3RlbmVyKExpbmVHZXRTZWdtZW50cywgbGlzdGVuZXIpOwkKLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGV4dGVuZGVkIG1vZGlmeSBsaXN0ZW5lci4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBleHRlbmRlZE1vZGlmeUxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiBsaXN0ZW5lciBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciBleHRlbmRlZE1vZGlmeUxpc3RlbmVyKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoZXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXJlbW92ZUxpc3RlbmVyKEV4dGVuZGVkTW9kaWZ5LCBleHRlbmRlZE1vZGlmeUxpc3RlbmVyKTsJCi19Ci0vKioKLSAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBsaW5lIGJhY2tncm91bmQgbGlzdGVuZXIuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lcihMaW5lQmFja2dyb3VuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlyZW1vdmVMaXN0ZW5lcihMaW5lR2V0QmFja2dyb3VuZCwgbGlzdGVuZXIpOwkKLQkvLyB1c2UgZGVmYXVsdCBsaW5lIHN0eWxlciBpZiBsYXN0IHVzZXIgbGluZSBzdHlsZXIgd2FzIHJlbW92ZWQuCi0JaWYgKCFpc0xpc3RlbmluZyhMaW5lR2V0QmFja2dyb3VuZCkgJiYgdXNlckxpbmVCYWNrZ3JvdW5kKSB7Ci0JCVN0eWxlZFRleHRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFN0eWxlZFRleHRMaXN0ZW5lcihkZWZhdWx0TGluZVN0eWxlcik7Ci0JCWFkZExpc3RlbmVyKExpbmVHZXRCYWNrZ3JvdW5kLCB0eXBlZExpc3RlbmVyKTsJCi0JCXVzZXJMaW5lQmFja2dyb3VuZCA9IGZhbHNlOwotCX0KLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGxpbmUgc3R5bGUgbGlzdGVuZXIuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlTGluZVN0eWxlTGlzdGVuZXIoTGluZVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JfQotCXJlbW92ZUxpc3RlbmVyKExpbmVHZXRTdHlsZSwgbGlzdGVuZXIpOwkKLQkvLyB1c2UgZGVmYXVsdCBsaW5lIHN0eWxlciBpZiBsYXN0IHVzZXIgbGluZSBzdHlsZXIgd2FzIHJlbW92ZWQuIEZpeGVzIDFHN0IxWDIKLQlpZiAoIWlzTGlzdGVuaW5nKExpbmVHZXRTdHlsZSkgJiYgdXNlckxpbmVTdHlsZSkgewotCQlTdHlsZWRUZXh0TGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBTdHlsZWRUZXh0TGlzdGVuZXIoZGVmYXVsdExpbmVTdHlsZXIpOwotCQlhZGRMaXN0ZW5lcihMaW5lR2V0U3R5bGUsIHR5cGVkTGlzdGVuZXIpOwkKLQkJdXNlckxpbmVTdHlsZSA9IGZhbHNlOwotCX0KLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG1vZGlmeSBsaXN0ZW5lci4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBtb2RpZnlMaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcikgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKG1vZGlmeUxpc3RlbmVyID09IG51bGwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9Ci0JcmVtb3ZlTGlzdGVuZXIoU1dULk1vZGlmeSwgbW9kaWZ5TGlzdGVuZXIpOwkKLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHNlbGVjdGlvbiBsaXN0ZW5lci4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9Ci0JcmVtb3ZlTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwkKLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHZlcmlmeSBsaXN0ZW5lci4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSB2ZXJpZnlMaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCByZW1vdmVWZXJpZnlMaXN0ZW5lcihWZXJpZnlMaXN0ZW5lciB2ZXJpZnlMaXN0ZW5lcikgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKHZlcmlmeUxpc3RlbmVyID09IG51bGwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9Ci0JcmVtb3ZlTGlzdGVuZXIoU1dULlZlcmlmeSwgdmVyaWZ5TGlzdGVuZXIpOwkKLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGtleSB2ZXJpZnkgbGlzdGVuZXIuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXIoVmVyaWZ5S2V5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlyZW1vdmVMaXN0ZW5lcihWZXJpZnlLZXksIGxpc3RlbmVyKTsJCi19Ci0vKiogCi0gKiBSZXBsYWNlcyB0aGUgc3R5bGVzIGluIHRoZSBnaXZlbiByYW5nZSB3aXRoIG5ldyBzdHlsZXMuICBUaGlzIG1ldGhvZAotICogZWZmZWN0aXZlbHkgZGVsZXRlcyB0aGUgc3R5bGVzIGluIHRoZSBnaXZlbiByYW5nZSBhbmQgdGhlbiBhZGRzIHRoZQotICogdGhlIG5ldyBzdHlsZXMuIAotICogPHA+Ci0gKiBTaG91bGQgbm90IGJlIGNhbGxlZCBpZiBhIExpbmVTdHlsZUxpc3RlbmVyIGhhcyBiZWVuIHNldCBzaW5jZSB0aGUgCi0gKiBsaXN0ZW5lciBtYWludGFpbnMgdGhlIHN0eWxlcy4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gc3RhcnQgb2Zmc2V0IG9mIGZpcnN0IGNoYXJhY3RlciB3aGVyZSBzdHlsZXMgd2lsbCBiZSBkZWxldGVkCi0gKiBAcGFyYW0gbGVuZ3RoIGxlbmd0aCBvZiB0aGUgcmFuZ2UgdG8gZGVsZXRlIHN0eWxlcyBpbgotICogQHBhcmFtIHJhbmdlcyBTdHlsZVJhbmdlIG9iamVjdHMgY29udGFpbmluZyB0aGUgbmV3IHN0eWxlIGluZm9ybWF0aW9uLgotICogVGhlIHJhbmdlcyBzaG91bGQgbm90IG92ZXJsYXAgYW5kIHNob3VsZCBiZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBzdGFydCAKLSAqIGFuZCBsZW5ndGguIFRoZSBzdHlsZSByZW5kZXJpbmcgaXMgdW5kZWZpbmVkIGlmIHRoZSByYW5nZXMgZG8gb3ZlcmxhcAotICogb3IgYXJlIGlsbC1kZWZpbmVkLiBNdXN0IG5vdCBiZSBudWxsLgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICA8bGk+RVJST1JfSU5WQUxJRF9SQU5HRSB3aGVuIGVpdGhlciBzdGFydCBvciBlbmQgaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UgKDAgPD0gb2Zmc2V0IDw9IGdldENoYXJDb3VudCgpKTwvbGk+IAotICogICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIHN0cmluZyBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyB2b2lkIHJlcGxhY2VTdHlsZVJhbmdlcyhpbnQgc3RhcnQsIGludCBsZW5ndGgsIFN0eWxlUmFuZ2VbXSByYW5nZXMpIHsKLQljaGVja1dpZGdldCgpOwotCWlmICh1c2VyTGluZVN0eWxlKSB7Ci0JCXJldHVybjsKLQl9Ci0gCWlmIChyYW5nZXMgPT0gbnVsbCkgewotIAkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAJfQotIAlpZiAocmFuZ2VzLmxlbmd0aCA9PSAwKSB7Ci0gCQlzZXRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBsZW5ndGgsIG51bGwsIG51bGwpKTsKLSAJCXJldHVybjsKLSAJfQotCWludCBlbmQgPSBzdGFydCArIGxlbmd0aDsKLQlpZiAoc3RhcnQgPiBlbmQgfHwgc3RhcnQgPCAwIHx8IGVuZCA+IGdldENoYXJDb3VudCgpKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9SQU5HRSk7Ci0JfQkKLQlpbnQgZmlyc3RMaW5lID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoc3RhcnQpOwotCWludCBsYXN0TGluZSA9IGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KGVuZCk7Ci0KLQlkZWZhdWx0TGluZVN0eWxlci5yZXBsYWNlU3R5bGVSYW5nZXMoc3RhcnQsIGxlbmd0aCwgcmFuZ2VzKTsKLQlsaW5lQ2FjaGUucmVzZXQoZmlyc3RMaW5lLCBsYXN0TGluZSAtIGZpcnN0TGluZSArIDEsIHRydWUpOwotCi0JLy8gaWYgdGhlIGFyZWEgaXMgbm90IHZpc2libGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVkcmF3Ci0JaWYgKGlzQXJlYVZpc2libGUoZmlyc3RMaW5lLCBsYXN0TGluZSkpIHsKLQkJaW50IHJlZHJhd1kgPSBmaXJzdExpbmUgKiBsaW5lSGVpZ2h0IC0gdmVydGljYWxTY3JvbGxPZmZzZXQ7Ci0JCWludCByZWRyYXdTdG9wWSA9IChsYXN0TGluZSArIDEpICogbGluZUhlaWdodCAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0OwkJCi0JCWRyYXcoMCwgcmVkcmF3WSwgZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCByZWRyYXdTdG9wWSAtIHJlZHJhd1ksIHRydWUpOwotCX0KLQotCS8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBjYXJldCBpcyBwb3NpdGlvbmVkIGNvcnJlY3RseS4KLQkvLyBjYXJldCBsb2NhdGlvbiBtYXkgY2hhbmdlIGlmIGZvbnQgc3R5bGUgY2hhbmdlcy4KLQkvLyBmaXhlcyAxRzhGT0RQCi0Jc2V0Q2FyZXRMb2NhdGlvbigpOwotfQotLyoqCi0gKiBSZXBsYWNlcyB0aGUgZ2l2ZW4gdGV4dCByYW5nZSB3aXRoIG5ldyB0ZXh0LgotICogSWYgdGhlIHdpZGdldCBoYXMgdGhlIFNXVC5TSU5HTEUgc3R5bGUgYW5kICJ0ZXh0IiBjb250YWlucyBtb3JlIHRoYW4gCi0gKiBvbmUgbGluZSwgb25seSB0aGUgZmlyc3QgbGluZSBpcyByZW5kZXJlZCBidXQgdGhlIHRleHQgaXMgc3RvcmVkIAotICogdW5jaGFuZ2VkLiBBIHN1YnNlcXVlbnQgY2FsbCB0byBnZXRUZXh0IHdpbGwgcmV0dXJuIHRoZSBzYW1lIHRleHQgCi0gKiB0aGF0IHdhcyBzZXQuIE5vdGUgdGhhdCBvbmx5IGEgc2luZ2xlIGxpbmUgb2YgdGV4dCBzaG91bGQgYmUgc2V0IHdoZW4gCi0gKiB0aGUgU1dULlNJTkdMRSBzdHlsZSBpcyB1c2VkLgotICogPHA+Ci0gKiA8Yj5OT1RFOjwvYj4gRHVyaW5nIHRoZSByZXBsYWNlIG9wZXJhdGlvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMKLSAqIGNoYW5nZWQgYXMgZm9sbG93czoKLSAqIDx1bD4JCi0gKiA8bGk+c2VsZWN0aW9uIGJlZm9yZSByZXBsYWNlZCB0ZXh0OiBzZWxlY3Rpb24gdW5jaGFuZ2VkCi0gKiA8bGk+c2VsZWN0aW9uIGFmdGVyIHJlcGxhY2VkIHRleHQ6IGFkanVzdCB0aGUgc2VsZWN0aW9uIHNvIHRoYXQgc2FtZSB0ZXh0IAotICogcmVtYWlucyBzZWxlY3RlZAotICogPGxpPnNlbGVjdGlvbiBpbnRlcnNlY3RzIHJlcGxhY2VkIHRleHQ6IHNlbGVjdGlvbiBpcyBjbGVhcmVkIGFuZCBjYXJldAotICogaXMgcGxhY2VkIGFmdGVyIGluc2VydGVkIHRleHQKLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHN0YXJ0IG9mZnNldCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVwbGFjZQotICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZXBsYWNlLiBVc2UgMCB0byBpbnNlcnQgdGV4dAotICogQHBhcmFtIHRleHQgbmV3IHRleHQuIE1heSBiZSBlbXB0eSB0byBkZWxldGUgdGV4dC4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0Ugd2hlbiBlaXRoZXIgc3RhcnQgb3IgZW5kIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlICgwIDw9IG9mZnNldCA8PSBnZXRDaGFyQ291bnQoKSk8L2xpPiAKLSAqICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgd2hlbiBlaXRoZXIgc3RhcnQgb3IgZW5kIGlzIGluc2lkZSBhIG11bHRpIGJ5dGUgbGluZSBkZWxpbWl0ZXIuIAotICogCQlTcGxpdHRpbmcgYSBsaW5lIGRlbGltaXRlciBmb3IgZXhhbXBsZSBieSBpbnNlcnRpbmcgdGV4dCBpbiBiZXR3ZWVuIHRoZSBDUiBhbmQgTEYgYW5kIGRlbGV0aW5nIHBhcnQgb2YgYSBsaW5lIGRlbGltaXRlciBpcyBub3Qgc3VwcG9ydGVkPC9saT4gIAotICogICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIHN0cmluZyBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaW50IGNvbnRlbnRMZW5ndGggPSBnZXRDaGFyQ291bnQoKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBsZW5ndGg7Ci0JRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkKLQlpZiAoc3RhcnQgPiBlbmQgfHwgc3RhcnQgPCAwIHx8IGVuZCA+IGNvbnRlbnRMZW5ndGgpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX1JBTkdFKTsKLQl9CQotCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9Ci0JZXZlbnQuc3RhcnQgPSBzdGFydDsKLQlldmVudC5lbmQgPSBlbmQ7Ci0JZXZlbnQudGV4dCA9IHRleHQ7Ci0JbW9kaWZ5Q29udGVudChldmVudCwgZmFsc2UpOwotfQotLyoqCi0gKiBSZXNldHMgdGhlIGNhcmV0IHBvc2l0aW9uLCBzZWxlY3Rpb24gYW5kIHNjcm9sbCBvZmZzZXRzLiBSZWNhbGN1bGF0ZQotICogdGhlIGNvbnRlbnQgd2lkdGggYW5kIHNjcm9sbCBiYXJzLiBSZWRyYXcgdGhlIHdpZGdldC4KLSAqLwotdm9pZCByZXNldCgpIHsKLQlTY3JvbGxCYXIgdmVydGljYWxCYXIgPSBnZXRWZXJ0aWNhbEJhcigpOwotCVNjcm9sbEJhciBob3Jpem9udGFsQmFyID0gZ2V0SG9yaXpvbnRhbEJhcigpOwotCWNhcmV0T2Zmc2V0ID0gMDsKLQl0b3BJbmRleCA9IDA7Ci0JdG9wT2Zmc2V0ID0gMDsKLQl2ZXJ0aWNhbFNjcm9sbE9mZnNldCA9IDA7Ci0JaG9yaXpvbnRhbFNjcm9sbE9mZnNldCA9IDA7CQotCXJlc2V0U2VsZWN0aW9uKCk7Ci0JLy8gZGlzY2FyZCBhbnkgc3R5bGVzIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgY3JlYXRpbmcgYSAKLQkvLyBuZXcgZGVmYXVsdCBsaW5lIHN0eWxlcgotCWlmIChkZWZhdWx0TGluZVN0eWxlciAhPSBudWxsKSB7Ci0JCXJlbW92ZUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoZGVmYXVsdExpbmVTdHlsZXIpOwotCQlyZW1vdmVMaW5lU3R5bGVMaXN0ZW5lcihkZWZhdWx0TGluZVN0eWxlcik7Ci0JCWluc3RhbGxEZWZhdWx0TGluZVN0eWxlcigpOwotCX0JCi0JY2FsY3VsYXRlQ29udGVudFdpZHRoKCk7Ci0JaWYgKHZlcnRpY2FsQmFyICE9IG51bGwpIHsKLQkJdmVydGljYWxCYXIuc2V0U2VsZWN0aW9uKDApOwotCX0KLQlpZiAoaG9yaXpvbnRhbEJhciAhPSBudWxsKSB7Ci0JCWhvcml6b250YWxCYXIuc2V0U2VsZWN0aW9uKDApOwkKLQl9Ci0Jc2V0U2Nyb2xsQmFycygpOwotCXNldENhcmV0TG9jYXRpb24oKTsKLQlzdXBlci5yZWRyYXcoKTsKLX0KLS8qKgotICogUmVzZXRzIHRoZSBzZWxlY3Rpb24uCi0gKi8KLXZvaWQgcmVzZXRTZWxlY3Rpb24oKSB7Ci0Jc2VsZWN0aW9uLnggPSBzZWxlY3Rpb24ueSA9IGNhcmV0T2Zmc2V0OwotCXNlbGVjdGlvbkFuY2hvciA9IC0xOwotfQotLyoqCi0gKiBTY3JvbGxzIHRoZSB3aWRnZXQgaG9yaXpvbnRhbGx5LgotICogPHA+Ci0gKgotICogQHBhcmFtIHBpeGVscyBudW1iZXIgb2YgcGl4ZWxzIHRvIHNjcm9sbCwgPiAwID0gc2Nyb2xsIGxlZnQsCi0gKiAJPCAwIHNjcm9sbCByaWdodAotICovCi12b2lkIHNjcm9sbEhvcml6b250YWwoaW50IHBpeGVscykgewotCVJlY3RhbmdsZSBjbGllbnRBcmVhOwotCQotCWlmIChwaXhlbHMgPT0gMCkgewotCQlyZXR1cm47Ci0JfQotCWNsaWVudEFyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0JaWYgKHBpeGVscyA+IDApIHsKLQkJaW50IHNvdXJjZVggPSBsZWZ0TWFyZ2luICsgcGl4ZWxzOwotCQlpbnQgc2Nyb2xsV2lkdGggPSBjbGllbnRBcmVhLndpZHRoIC0gc291cmNlWCAtIHJpZ2h0TWFyZ2luOwotCQlpbnQgc2Nyb2xsSGVpZ2h0ID0gY2xpZW50QXJlYS5oZWlnaHQgLSB0b3BNYXJnaW4gLSBib3R0b21NYXJnaW47Ci0JCXNjcm9sbCgKLQkJCWxlZnRNYXJnaW4sIHRvcE1hcmdpbiwgCQkJCQkJLy8gZGVzdGluYXRpb24geCwgeQotCQkJc291cmNlWCwgdG9wTWFyZ2luLAkJCQkJCQkvLyBzb3VyY2UgeCwgeQotCQkJc2Nyb2xsV2lkdGgsIHNjcm9sbEhlaWdodCwgdHJ1ZSk7Ci0JCWlmIChzb3VyY2VYID4gc2Nyb2xsV2lkdGgpIHsKLQkJCS8vIHJlZHJhdyBmcm9tIGVuZCBvZiBzY3JvbGxlZCBhcmVhIHRvIGJlZ2lubmluZyBvZiBzY3JvbGwgCi0JCQkvLyBpbnZhbGlkYXRlZCBhcmVhCi0JCQlzdXBlci5yZWRyYXcoCi0JCQkJbGVmdE1hcmdpbiArIHNjcm9sbFdpZHRoLCB0b3BNYXJnaW4sIAotCQkJCXBpeGVscyAtIHNjcm9sbFdpZHRoLCBzY3JvbGxIZWlnaHQsIHRydWUpOwotCQl9Ci0JfQotCWVsc2UgewotCQlpbnQgZGVzdGluYXRpb25YID0gbGVmdE1hcmdpbiAtIHBpeGVsczsKLQkJaW50IHNjcm9sbFdpZHRoID0gY2xpZW50QXJlYS53aWR0aCAtIGRlc3RpbmF0aW9uWCAtIHJpZ2h0TWFyZ2luOwotCQlpbnQgc2Nyb2xsSGVpZ2h0ID0gY2xpZW50QXJlYS5oZWlnaHQgLSB0b3BNYXJnaW4gLSBib3R0b21NYXJnaW47Ci0JCXNjcm9sbCgKLQkJCWRlc3RpbmF0aW9uWCwgdG9wTWFyZ2luLAkJCQkJLy8gZGVzdGluYXRpb24geCwgeQotCQkJbGVmdE1hcmdpbiwgdG9wTWFyZ2luLAkJCQkJCS8vIHNvdXJjZSB4LCB5Ci0JCQlzY3JvbGxXaWR0aCwgc2Nyb2xsSGVpZ2h0LCB0cnVlKTsKLQkJaWYgKGRlc3RpbmF0aW9uWCA+IHNjcm9sbFdpZHRoKSB7Ci0JCQkvLyByZWRyYXcgZnJvbSBlbmQgb2Ygc2Nyb2xsIGludmFsaWRhdGVkIGFyZWEgdG8gc2Nyb2xsIAotCQkJLy8gZGVzdGluYXRpb24KLQkJCXN1cGVyLnJlZHJhdygKLQkJCQlsZWZ0TWFyZ2luICsgc2Nyb2xsV2lkdGgsIHRvcE1hcmdpbiwgCi0JCQkJLXBpeGVscyAtIHNjcm9sbFdpZHRoLCBzY3JvbGxIZWlnaHQsIHRydWUpOwkKLQkJfQotCX0KLQlob3Jpem9udGFsU2Nyb2xsT2Zmc2V0ICs9IHBpeGVsczsKLQlpbnQgb2xkQ29sdW1uWCA9IGNvbHVtblggLSBwaXhlbHM7Ci0Jc2V0Q2FyZXRMb2NhdGlvbigpOwotCS8vIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGhvcml6b250YWwgY2FyZXQgaW5kZXgKLQljb2x1bW5YID0gb2xkQ29sdW1uWDsKLX0KLS8qKgotICogU2Nyb2xscyB0aGUgd2lkZ2V0IGhvcml6b250YWxseSBhbmQgYWRqdXN0IHRoZSBob3Jpem9udGFsIHNjcm9sbAotICogYmFyIHRvIHJlZmxlY3QgdGhlIG5ldyBob3Jpem9udGFsIG9mZnNldC4uCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gcGl4ZWxzIG51bWJlciBvZiBwaXhlbHMgdG8gc2Nyb2xsLCA+IDAgPSBzY3JvbGwgbGVmdCwKLSAqIAk8IDAgc2Nyb2xsIHJpZ2h0Ci0gKiBAcmV0dXJuCi0gKgl0cnVlPXRoZSB3aWRnZXQgd2FzIHNjcm9sbGVkIAotICoJZmFsc2U9dGhlIHdpZGdldCB3YXMgbm90IHNjcm9sbGVkLCB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIG5vdCB2YWxpZC4KLSAqLwotYm9vbGVhbiBzY3JvbGxIb3Jpem9udGFsQmFyKGludCBwaXhlbHMpIHsKLQlpZiAocGl4ZWxzID09IDApIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlTY3JvbGxCYXIgaG9yaXpvbnRhbEJhciA9IGdldEhvcml6b250YWxCYXIoKTsKLQlpZiAoaG9yaXpvbnRhbEJhciAhPSBudWxsKSB7Ci0JCWhvcml6b250YWxCYXIuc2V0U2VsZWN0aW9uKGhvcml6b250YWxTY3JvbGxPZmZzZXQgKyBwaXhlbHMpOwotCX0KLQlzY3JvbGxIb3Jpem9udGFsKHBpeGVscyk7Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKiogCi0gKiBTZWxlY3RzIGFsbCB0aGUgdGV4dC4KLSAqIDxwPgotICoKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2VsZWN0QWxsKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0Jc2V0U2VsZWN0aW9uKDAsIE1hdGgubWF4KGdldENoYXJDb3VudCgpLDApKTsKLX0KLS8qKgotICogUmVwbGFjZXMvaW5zZXJ0cyB0ZXh0IGFzIGRlZmluZWQgYnkgdGhlIGV2ZW50LgotICogPHA+Ci0gKgotICogQHBhcmFtIGV2ZW50IHRoZSB0ZXh0IGNoYW5nZSBldmVudC4gCi0gKgk8dWw+Ci0gKgk8bGk+ZXZlbnQuc3RhcnQgLSB0aGUgcmVwbGFjZSBzdGFydCBvZmZzZXQ8L2xpPgotICogCTxsaT5ldmVudC5lbmQgLSB0aGUgcmVwbGFjZSBlbmQgb2Zmc2V0PC9saT4KLSAqIAk8bGk+ZXZlbnQudGV4dCAtIHRoZSBuZXcgdGV4dDwvbGk+Ci0gKgk8L3VsPgotICovCi12b2lkIHNlbmRLZXlFdmVudChFdmVudCBldmVudCkgewotCWlmIChlZGl0YWJsZSkgewotCQltb2RpZnlDb250ZW50KGV2ZW50LCB0cnVlKTsKLQl9Ci19Ci12b2lkIHNlbmRNb2RpZnlFdmVudChFdmVudCBldmVudCkgewotCUFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IGdldEFjY2Vzc2libGUoKTsKLQlpZiAoZXZlbnQudGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCWFjY2Vzc2libGUudGV4dENoYW5nZWQoQUNDLlRFWFRfREVMRVRFLCBldmVudC5zdGFydCwgZXZlbnQuZW5kIC0gZXZlbnQuc3RhcnQpOwotCX0gZWxzZSB7Ci0JCWlmIChldmVudC5zdGFydCA9PSBldmVudC5lbmQpIHsKLQkJCWFjY2Vzc2libGUudGV4dENoYW5nZWQoQUNDLlRFWFRfSU5TRVJULCBldmVudC5zdGFydCwgZXZlbnQudGV4dC5sZW5ndGgoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlhY2Nlc3NpYmxlLnRleHRDaGFuZ2VkKEFDQy5URVhUX0RFTEVURSwgZXZlbnQuc3RhcnQsIGV2ZW50LmVuZCAtIGV2ZW50LnN0YXJ0KTsKLQkJCWFjY2Vzc2libGUudGV4dENoYW5nZWQoQUNDLlRFWFRfSU5TRVJULCBldmVudC5zdGFydCwgZXZlbnQudGV4dC5sZW5ndGgoKSk7CQotCQl9Ci0JfQotCW5vdGlmeUxpc3RlbmVycyhTV1QuTW9kaWZ5LCBldmVudCk7Ci19Ci0vKioKLSAqIFNlbmRzIHRoZSBzcGVjaWZpZWQgc2VsZWN0aW9uIGV2ZW50LgotICovCi12b2lkIHNlbmRTZWxlY3Rpb25FdmVudCgpIHsKLQlnZXRBY2Nlc3NpYmxlKCkudGV4dFNlbGVjdGlvbkNoYW5nZWQoKTsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCWV2ZW50LnggPSBzZWxlY3Rpb24ueDsKLQlldmVudC55ID0gc2VsZWN0aW9uLnk7Ci0Jbm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIGV2ZW50KTsKLX0KLS8qKgotICogU2V0cyB3aGV0aGVyIHRoZSB3aWRnZXQgd3JhcHMgbGluZXMuCi0gKiBUaGlzIG92ZXJyaWRlcyB0aGUgY3JlYXRpb24gc3R5bGUgYml0IFNXVC5XUkFQLgotICogPHA+Ci0gKgotICogQHBhcmFtIHdyYXAgdHJ1ZT13aWRnZXQgd3JhcHMgbGluZXMsIGZhbHNlPXdpZGdldCBkb2VzIG5vdCB3cmFwIGxpbmVzCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyB2b2lkIHNldFdvcmRXcmFwKGJvb2xlYW4gd3JhcCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKChnZXRTdHlsZSgpICYgU1dULlNJTkdMRSkgIT0gMCkgcmV0dXJuOwotCQotCWlmICh3cmFwICE9IHdvcmRXcmFwKSB7Ci0JCVNjcm9sbEJhciBob3Jpem9udGFsQmFyID0gZ2V0SG9yaXpvbnRhbEJhcigpOwotCQkKLQkJd29yZFdyYXAgPSB3cmFwOwotCQlpZiAod29yZFdyYXApIHsKLQkJCWxvZ2ljYWxDb250ZW50ID0gY29udGVudDsKLQkJCWNvbnRlbnQgPSBuZXcgV3JhcHBlZENvbnRlbnQocmVuZGVyZXIsIGxvZ2ljYWxDb250ZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbnRlbnQgPSBsb2dpY2FsQ29udGVudDsKLQkJfQotCQljYWxjdWxhdGVDb250ZW50V2lkdGgoKTsKLQkJaG9yaXpvbnRhbFNjcm9sbE9mZnNldCA9IDA7Ci0JCWlmIChob3Jpem9udGFsQmFyICE9IG51bGwpIHsKLQkJCWhvcml6b250YWxCYXIuc2V0VmlzaWJsZSghd29yZFdyYXApOwotCQl9Ci0JCXNldFNjcm9sbEJhcnMoKTsKLQkJc2V0Q2FyZXRMb2NhdGlvbigpOwotCQlzdXBlci5yZWRyYXcoKTsJCQotCX0KLX0KLS8qKgotICogU2V0cyB0aGUgcmVjZWl2ZXIncyBjYXJldC4gIFNldCB0aGUgY2FyZXQncyBoZWlnaHQgYW5kIGxvY2F0aW9uLgotICogCi0gKiA8L3A+Ci0gKiBAcGFyYW0gY2FyZXQgdGhlIG5ldyBjYXJldCBmb3IgdGhlIHJlY2VpdmVyCi0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRDYXJldChDYXJldCBjYXJldCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCXN1cGVyLnNldENhcmV0KGNhcmV0KTsKLQljYXJldERpcmVjdGlvbiA9IFNXVC5OVUxMOyAKLQlpZiAoY2FyZXQgIT0gbnVsbCkgewotCQlzZXRDYXJldExvY2F0aW9uKCk7Ci0JfQotfQotLyoqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wjc2V0QmFja2dyb3VuZAotICovCi1wdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKENvbG9yIGNvbG9yKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQliYWNrZ3JvdW5kID0gY29sb3I7Ci0Jc3VwZXIuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotCXJlZHJhdygpOwotfQotLyoqCi0gKiBTZXRzIHRoZSBCSURJIGNvbG9yaW5nIG1vZGUuICBXaGVuIHRydWUgdGhlIEJJREkgdGV4dCBkaXNwbGF5Ci0gKiBhbGdvcml0aG0gaXMgYXBwbGllZCB0byBzZWdtZW50cyBvZiB0ZXh0IHRoYXQgYXJlIHRoZSBzYW1lCi0gKiBjb2xvci4KLSAqCi0gKiBAcGFyYW0gbW9kZSB0aGUgbmV3IGNvbG9yaW5nIG1vZGUKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIDxwPgotICogQGRlcHJlY2F0ZWQgdXNlIEJpZGlTZWdtZW50TGlzdGVuZXIgaW5zdGVhZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIHZvaWQgc2V0QmlkaUNvbG9yaW5nKGJvb2xlYW4gbW9kZSkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JYmlkaUNvbG9yaW5nID0gbW9kZTsKLX0KLXZvaWQgc2V0Q2FyZXRMb2NhdGlvbihpbnQgbmV3Q2FyZXRYLCBpbnQgbGluZSwgaW50IGRpcmVjdGlvbikgewotCUNhcmV0IGNhcmV0ID0gZ2V0Q2FyZXQoKTsKLQlpZiAoY2FyZXQgIT0gbnVsbCkgewotCQlib29sZWFuIHVwZGF0ZUltYWdlID0gY2FyZXQgPT0gZGVmYXVsdENhcmV0OwotCQlpbnQgaW1hZ2VEaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0JCWlmIChpc01pcnJvcmVkKCkpIHsKLQkJCWlmIChpbWFnZURpcmVjdGlvbiA9PSBTV1QuTEVGVCkgewotCQkJCWltYWdlRGlyZWN0aW9uID0gU1dULlJJR0hUOwotCQkJfSBlbHNlIGlmIChpbWFnZURpcmVjdGlvbiA9PSBTV1QuUklHSFQpIHsKLQkJCQlpbWFnZURpcmVjdGlvbiA9IFNXVC5MRUZUOwotCQkJfQotCQl9Ci0JCWlmICh1cGRhdGVJbWFnZSAmJiBpbWFnZURpcmVjdGlvbiA9PSBTV1QuUklHSFQpIHsKLQkJCW5ld0NhcmV0WCAtPSAoY2FyZXQuZ2V0U2l6ZSgpLnggLSAxKTsKLQkJfQotCQlpbnQgbmV3Q2FyZXRZID0gbGluZSAqIGxpbmVIZWlnaHQgLSB2ZXJ0aWNhbFNjcm9sbE9mZnNldCArIHRvcE1hcmdpbjsKLQkJY2FyZXQuc2V0TG9jYXRpb24obmV3Q2FyZXRYLCBuZXdDYXJldFkpOwotCQlnZXRBY2Nlc3NpYmxlKCkudGV4dENhcmV0TW92ZWQoZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCWlmIChkaXJlY3Rpb24gIT0gY2FyZXREaXJlY3Rpb24pIHsKLQkJCWNhcmV0RGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCQkJaWYgKHVwZGF0ZUltYWdlKSB7Ci0JCQkJaWYgKGltYWdlRGlyZWN0aW9uID09IFNXVC5ERUZBVUxUKSB7Ci0JCQkJCWRlZmF1bHRDYXJldC5zZXRJbWFnZShudWxsKTsKLQkJCQl9IGVsc2UgaWYgKGltYWdlRGlyZWN0aW9uID09IFNXVC5MRUZUKSB7Ci0JCQkJCWRlZmF1bHRDYXJldC5zZXRJbWFnZShsZWZ0Q2FyZXRCaXRtYXApOwotCQkJCX0gZWxzZSBpZiAoaW1hZ2VEaXJlY3Rpb24gPT0gU1dULlJJR0hUKSB7Ci0JCQkJCWRlZmF1bHRDYXJldC5zZXRJbWFnZShyaWdodENhcmV0Qml0bWFwKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXJldC5zZXRTaXplKGNhcmV0LmdldFNpemUoKS54LCBsaW5lSGVpZ2h0KTsKLQkJCWlmIChjYXJldERpcmVjdGlvbiA9PSBTV1QuTEVGVCkgewotCQkJCUJpZGlVdGlsLnNldEtleWJvYXJkTGFuZ3VhZ2UoQmlkaVV0aWwuS0VZQk9BUkRfTk9OX0JJREkpOwotCQkJfSBlbHNlIGlmIChjYXJldERpcmVjdGlvbiA9PSBTV1QuUklHSFQpIHsKLQkJCQlCaWRpVXRpbC5zZXRLZXlib2FyZExhbmd1YWdlKEJpZGlVdGlsLktFWUJPQVJEX0JJREkpOwotCQkJfQotCQl9Ci0JfQotCWNvbHVtblggPSBuZXdDYXJldFg7Ci19Ci0vKioKLSAqIE1vdmVzIHRoZSBDYXJldCB0byB0aGUgY3VycmVudCBjYXJldCBvZmZzZXQuCi0gKi8KLXZvaWQgc2V0Q2FyZXRMb2NhdGlvbigpIHsKLQlpbnQgbGluZUluZGV4ID0gZ2V0Q2FyZXRMaW5lKCk7Ci0JU3RyaW5nIGxpbmUgPSBjb250ZW50LmdldExpbmUobGluZUluZGV4KTsKLQlpbnQgbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxpbmVJbmRleCk7Ci0JaW50IG9mZnNldEluTGluZSA9IGNhcmV0T2Zmc2V0IC0gbGluZU9mZnNldDsKLQlpbnQgbmV3Q2FyZXRYID0gZ2V0WEF0T2Zmc2V0KGxpbmUsIGxpbmVJbmRleCwgb2Zmc2V0SW5MaW5lKTsKLQlzZXRDYXJldExvY2F0aW9uKG5ld0NhcmV0WCwgbGluZUluZGV4LCBnZXRDYXJldERpcmVjdGlvbigpKTsKLX0KLS8qKgotICogU2V0cyB0aGUgY2FyZXQgb2Zmc2V0LgotICoKLSAqIEBwYXJhbSBvZmZzZXQgY2FyZXQgb2Zmc2V0LCByZWxhdGl2ZSB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSB0ZXh0LgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCB3aGVuIGVpdGhlciB0aGUgc3RhcnQgb3IgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uIHJhbmdlIGlzIGluc2lkZSBhIAotICogbXVsdGkgYnl0ZSBsaW5lIGRlbGltaXRlciAoYW5kIHRodXMgbmVpdGhlciBjbGVhcmx5IGluIGZyb250IG9mIG9yIGFmdGVyIHRoZSBsaW5lIGRlbGltaXRlcikKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldENhcmV0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQljaGVja1dpZGdldCgpOwotCWludCBsZW5ndGggPSBnZXRDaGFyQ291bnQoKTsKLQkJCQkKLQlpZiAobGVuZ3RoID4gMCAmJiBvZmZzZXQgIT0gY2FyZXRPZmZzZXQpIHsKLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCWNhcmV0T2Zmc2V0ID0gMDsKLQkJfQotCQllbHNlCi0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCWNhcmV0T2Zmc2V0ID0gbGVuZ3RoOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGlzTGluZURlbGltaXRlcihvZmZzZXQpKSB7Ci0JCQkJLy8gb2Zmc2V0IGlzIGluc2lkZSBhIG11bHRpIGJ5dGUgbGluZSBkZWxpbWl0ZXIuIFRoaXMgaXMgYW4gCi0JCQkJLy8gaWxsZWdhbCBvcGVyYXRpb24gYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uIEZpeGVzIDFHREtLM1IKLQkJCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCQkJfQotCQkJY2FyZXRPZmZzZXQgPSBvZmZzZXQ7Ci0JCX0KLQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbiBpZiB0aGUgY2FyZXQgaXMgbW92ZWQuCi0JCS8vIGRvbid0IG5vdGlmeSBsaXN0ZW5lcnMgYWJvdXQgdGhlIHNlbGVjdGlvbiBjaGFuZ2UuCi0JCWNsZWFyU2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0JLy8gYWx3YXlzIHVwZGF0ZSB0aGUgY2FyZXQgbG9jYXRpb24uIGZpeGVzIDFHOEZPRFAKLQlzZXRDYXJldExvY2F0aW9uKCk7Ci19CQotLyoqCi0gKiBDb3BpZXMgdGhlIHNwZWNpZmllZCB0ZXh0IHJhbmdlIHRvIHRoZSBjbGlwYm9hcmQuICBUaGUgdGV4dCB3aWxsIGJlIHBsYWNlZAotICogaW4gdGhlIGNsaXBib2FyZCBpbiBwbGFpbiB0ZXh0IGZvcm1hdCBhbmQgUlRGIGZvcm1hdC4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBzdGFydCBzdGFydCBpbmRleCBvZiB0aGUgdGV4dAotICogQHBhcmFtIGxlbmd0aCBsZW5ndGggb2YgdGV4dCB0byBwbGFjZSBpbiBjbGlwYm9hcmQKLSAqIAotICogQGV4Y2VwdGlvbiBTV1RFcnJvciwgc2VlIENsaXBib2FyZC5zZXRDb250ZW50cwotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZCNzZXRDb250ZW50cwotICovCi12b2lkIHNldENsaXBib2FyZENvbnRlbnQoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBpbnQgY2xpcGJvYXJkVHlwZSkgdGhyb3dzIFNXVEVycm9yIHsKLQlpZiAoY2xpcGJvYXJkVHlwZSA9PSBETkQuU0VMRUNUSU9OX0NMSVBCT0FSRCAmJiAhKElTX01PVElGIHx8IElTX0dUSykpIHJldHVybjsKLQlUZXh0VHJhbnNmZXIgcGxhaW5UZXh0VHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQlUZXh0V3JpdGVyIHBsYWluVGV4dFdyaXRlciA9IG5ldyBUZXh0V3JpdGVyKHN0YXJ0LCBsZW5ndGgpOwotCVN0cmluZyBwbGFpblRleHQgPSBnZXRQbGF0Zm9ybURlbGltaXRlZFRleHQocGxhaW5UZXh0V3JpdGVyKTsKLQlPYmplY3RbXSBkYXRhOwotCVRyYW5zZmVyW10gdHlwZXM7Ci0JaWYgKGNsaXBib2FyZFR5cGUgPT0gRE5ELlNFTEVDVElPTl9DTElQQk9BUkQpIHsKLQkJZGF0YSA9IG5ldyBPYmplY3RbXXtwbGFpblRleHR9OwotCQl0eXBlcyA9IG5ldyBUcmFuc2Zlcltde3BsYWluVGV4dFRyYW5zZmVyfTsKLQl9IGVsc2UgewotCQlSVEZUcmFuc2ZlciBydGZUcmFuc2ZlciA9IFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCVJURldyaXRlciBydGZXcml0ZXIgPSBuZXcgUlRGV3JpdGVyKHN0YXJ0LCBsZW5ndGgpOwotCQlTdHJpbmcgcnRmVGV4dCA9IGdldFBsYXRmb3JtRGVsaW1pdGVkVGV4dChydGZXcml0ZXIpOwotCQlkYXRhID0gbmV3IE9iamVjdFtde3J0ZlRleHQsIHBsYWluVGV4dH07Ci0JCXR5cGVzID0gbmV3IFRyYW5zZmVyW117cnRmVHJhbnNmZXIsIHBsYWluVGV4dFRyYW5zZmVyfTsKLQl9Ci0JY2xpcGJvYXJkLnNldENvbnRlbnRzKGRhdGEsIHR5cGVzLCBjbGlwYm9hcmRUeXBlKTsKLX0KLS8qKgotICogU2V0cyB0aGUgY29udGVudCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgZm9yIHRleHQgc3RvcmFnZS4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBuZXdDb250ZW50IFN0eWxlZFRleHRDb250ZW50IGltcGxlbWVudGF0aW9uIHRvIHVzZSBmb3IgdGV4dCBzdG9yYWdlLgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiBsaXN0ZW5lciBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldENvbnRlbnQoU3R5bGVkVGV4dENvbnRlbnQgbmV3Q29udGVudCkgewotCWNoZWNrV2lkZ2V0KCk7CQotCWlmIChuZXdDb250ZW50ID09IG51bGwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9Ci0JaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQljb250ZW50LnJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcih0ZXh0Q2hhbmdlTGlzdGVuZXIpOwotCX0JCi0JbG9naWNhbENvbnRlbnQgPSBuZXdDb250ZW50OwotCWlmICh3b3JkV3JhcCkgewotCQljb250ZW50ID0gbmV3IFdyYXBwZWRDb250ZW50KHJlbmRlcmVyLCBsb2dpY2FsQ29udGVudCk7Ci0JfQotCWVsc2UgewotCQljb250ZW50ID0gbG9naWNhbENvbnRlbnQ7Ci0JfQotCWNvbnRlbnQuYWRkVGV4dENoYW5nZUxpc3RlbmVyKHRleHRDaGFuZ2VMaXN0ZW5lcik7Ci0JcmVzZXQoKTsKLX0KLS8qKgotICogU2V0cyB0aGUgcmVjZWl2ZXIncyBjdXJzb3IgdG8gdGhlIGN1cnNvciBzcGVjaWZpZWQgYnkgdGhlCi0gKiBhcmd1bWVudC4gIE92ZXJyaWRkZW4gdG8gaGFuZGxlIHRoZSBudWxsIGNhc2Ugc2luY2UgdGhlIAotICogU3R5bGVkVGV4dCB3aWRnZXQgdXNlcyBhbiBpYmVhbSBhcyBpdHMgZGVmYXVsdCBjdXJzb3IuCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sI3NldEN1cnNvcgotICovCi1wdWJsaWMgdm9pZCBzZXRDdXJzb3IgKEN1cnNvciBjdXJzb3IpIHsKLQlpZiAoY3Vyc29yID09IG51bGwpIHsKLQkJc3VwZXIuc2V0Q3Vyc29yKGliZWFtQ3Vyc29yKTsKLQl9IGVsc2UgewotCQlzdXBlci5zZXRDdXJzb3IoY3Vyc29yKTsKLQl9Ci19Ci0vKiogCi0gKiBTZXRzIHdoZXRoZXIgdGhlIHdpZGdldCBpbXBsZW1lbnRzIGRvdWJsZSBjbGljayBtb3VzZSBiZWhhdmlvci4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gZW5hYmxlIGlmIHRydWUgZG91YmxlIGNsaWNraW5nIGEgd29yZCBzZWxlY3RzIHRoZSB3b3JkLCBpZiBmYWxzZQotICogCWRvdWJsZSBjbGlja3MgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgYXMgcmVndWxhciBtb3VzZSBjbGlja3MuCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldERvdWJsZUNsaWNrRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JZG91YmxlQ2xpY2tFbmFibGVkID0gZW5hYmxlOwotfQotLyoqCi0gKiBTZXRzIHdoZXRoZXIgdGhlIHdpZGdldCBjb250ZW50IGNhbiBiZSBlZGl0ZWQuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIGVkaXRhYmxlIGlmIHRydWUgY29udGVudCBjYW4gYmUgZWRpdGVkLCBpZiBmYWxzZSBjb250ZW50IGNhbiBub3QgYmUgCi0gKiAJZWRpdGVkCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQljaGVja1dpZGdldCgpOwotCXRoaXMuZWRpdGFibGUgPSBlZGl0YWJsZTsKLX0KLS8qKgotICogU2V0cyBhIG5ldyBmb250IHRvIHJlbmRlciB0ZXh0IHdpdGguCi0gKiA8cD4KLSAqIDxiPk5PVEU6PC9iPiBJdGFsaWMgZm9udHMgYXJlIG5vdCBzdXBwb3J0ZWQgdW5sZXNzIHRoZXkgaGF2ZSBubyBvdmVyaGFuZwotICogYW5kIHRoZSBzYW1lIGJhc2VsaW5lIGFzIHJlZ3VsYXIgZm9udHMuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIGZvbnQgbmV3IGZvbnQKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0Rm9udChGb250IGZvbnQpIHsKLQljaGVja1dpZGdldCgpOwotCWludCBvbGRMaW5lSGVpZ2h0ID0gbGluZUhlaWdodDsKLQkKLQlzdXBlci5zZXRGb250KGZvbnQpOwkKLQlpbml0aWFsaXplUmVuZGVyZXIoKTsKLQkvLyBrZWVwIHRoZSBzYW1lIHRvcCBsaW5lIHZpc2libGUuIGZpeGVzIDU4MTUKLQlpZiAobGluZUhlaWdodCAhPSBvbGRMaW5lSGVpZ2h0KSB7Ci0JCXNldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KHZlcnRpY2FsU2Nyb2xsT2Zmc2V0ICogbGluZUhlaWdodCAvIG9sZExpbmVIZWlnaHQsIHRydWUpOwotCQljbGFpbUJvdHRvbUZyZWVTcGFjZSgpOwotCX0KLQljYWxjdWxhdGVDb250ZW50V2lkdGgoKTsKLQljYWxjdWxhdGVTY3JvbGxCYXJzKCk7Ci0JaWYgKGlzQmlkaUNhcmV0KCkpIGNyZWF0ZUNhcmV0Qml0bWFwcygpOwotCWNhcmV0RGlyZWN0aW9uID0gU1dULk5VTEw7Ci0JLy8gYWx3YXlzIHNldCB0aGUgY2FyZXQgbG9jYXRpb24uIEZpeGVzIDY2ODUKLQlzZXRDYXJldExvY2F0aW9uKCk7Ci0Jc3VwZXIucmVkcmF3KCk7Ci19Ci0vKioKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCNzZXRGb3JlZ3JvdW5kCi0gKi8KLXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmQoQ29sb3IgY29sb3IpIHsKLQljaGVja1dpZGdldCgpOwotCWZvcmVncm91bmQgPSBjb2xvcjsKLQlzdXBlci5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0JcmVkcmF3KCk7Ci19Ci0vKiogCi0gKiBTZXRzIHRoZSBob3Jpem9udGFsIHNjcm9sbCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgotICogRG8gbm90aGluZyBpZiB0aGVyZSBpcyBubyB0ZXh0IHNldC4KLSAqIDxwPgotICogPGI+Tk9URTo8L2I+IFRoZSBob3Jpem9udGFsIGluZGV4IGlzIHJlc2V0IHRvIDAgd2hlbiBuZXcgdGV4dCBpcyBzZXQgaW4gdGhlIAotICogd2lkZ2V0LgotICogPC9wPgotICoKLSAqIEBwYXJhbSBvZmZzZXQgaG9yaXpvbnRhbCBzY3JvbGwgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCAKLSAqIAlvZiB0aGUgbGluZSwgbWVhc3VyZWQgaW4gY2hhcmFjdGVyIGluY3JlbWVudHMgc3RhcnRpbmcgYXQgMCwgaWYgCi0gKiAJZXF1YWwgdG8gMCB0aGUgY29udGVudCBpcyBub3Qgc2Nyb2xsZWQsIGlmID4gMCA9IHRoZSBjb250ZW50IGlzIHNjcm9sbGVkLgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsSW5kZXgoaW50IG9mZnNldCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaW50IGNsaWVudEFyZWFXaWR0aCA9IGdldENsaWVudEFyZWEoKS53aWR0aDsKLQlpZiAoZ2V0Q2hhckNvdW50KCkgPT0gMCkgewotCQlyZXR1cm47Ci0JfQkKLQlpZiAob2Zmc2V0IDwgMCkgewotCQlvZmZzZXQgPSAwOwotCX0KLQlvZmZzZXQgKj0gZ2V0SG9yaXpvbnRhbEluY3JlbWVudCgpOwotCS8vIGFsbG93IGFueSB2YWx1ZSBpZiBjbGllbnQgYXJlYSB3aWR0aCBpcyB1bmtub3duIG9yIDAuIAotCS8vIG9mZnNldCB3aWxsIGJlIGNoZWNrZWQgaW4gcmVzaXplIGhhbmRsZXIuCi0JLy8gZG9uJ3QgdXNlIGlzVmlzaWJsZSBzaW5jZSB3aWR0aCBpcyBrbm93biBldmVuIGlmIHdpZGdldCAKLQkvLyBpcyB0ZW1wb3JhcmlseSBpbnZpc2libGUKLQlpZiAoY2xpZW50QXJlYVdpZHRoID4gMCkgewotCQlpbnQgd2lkdGggPSBsaW5lQ2FjaGUuZ2V0V2lkdGgoKTsKLQkJLy8gcHJldmVudCBzY3JvbGxpbmcgaWYgdGhlIGNvbnRlbnQgZml0cyBpbiB0aGUgY2xpZW50IGFyZWEuCi0JCS8vIGFsaWduIGVuZCBvZiBsb25nZXN0IGxpbmUgd2l0aCByaWdodCBib3JkZXIgb2YgY2xpZW50IGFyZWEKLQkJLy8gaWYgb2Zmc2V0IGlzIG91dCBvZiByYW5nZS4KLQkJaWYgKG9mZnNldCA+IHdpZHRoIC0gY2xpZW50QXJlYVdpZHRoKSB7Ci0JCQlvZmZzZXQgPSBNYXRoLm1heCgwLCB3aWR0aCAtIGNsaWVudEFyZWFXaWR0aCk7Ci0JCX0KLQl9Ci0Jc2Nyb2xsSG9yaXpvbnRhbEJhcihvZmZzZXQgLSBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0KTsKLX0KLS8qKiAKLSAqIFNldHMgdGhlIGhvcml6b250YWwgcGl4ZWwgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZS4KLSAqIERvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gdGV4dCBzZXQuCi0gKiA8cD4KLSAqIDxiPk5PVEU6PC9iPiBUaGUgaG9yaXpvbnRhbCBwaXhlbCBvZmZzZXQgaXMgcmVzZXQgdG8gMCB3aGVuIG5ldyB0ZXh0IAotICogaXMgc2V0IGluIHRoZSB3aWRnZXQuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBpeGVsIGhvcml6b250YWwgcGl4ZWwgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCAKLSAqIAlvZiB0aGUgbGluZS4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbFBpeGVsKGludCBwaXhlbCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaW50IGNsaWVudEFyZWFXaWR0aCA9IGdldENsaWVudEFyZWEoKS53aWR0aDsKLQlpZiAoZ2V0Q2hhckNvdW50KCkgPT0gMCkgewotCQlyZXR1cm47Ci0JfQkKLQlpZiAocGl4ZWwgPCAwKSB7Ci0JCXBpeGVsID0gMDsKLQl9Ci0JLy8gYWxsb3cgYW55IHZhbHVlIGlmIGNsaWVudCBhcmVhIHdpZHRoIGlzIHVua25vd24gb3IgMC4gCi0JLy8gb2Zmc2V0IHdpbGwgYmUgY2hlY2tlZCBpbiByZXNpemUgaGFuZGxlci4KLQkvLyBkb24ndCB1c2UgaXNWaXNpYmxlIHNpbmNlIHdpZHRoIGlzIGtub3duIGV2ZW4gaWYgd2lkZ2V0IAotCS8vIGlzIHRlbXBvcmFyaWx5IGludmlzaWJsZQotCWlmIChjbGllbnRBcmVhV2lkdGggPiAwKSB7Ci0JCWludCB3aWR0aCA9IGxpbmVDYWNoZS5nZXRXaWR0aCgpOwotCQkvLyBwcmV2ZW50IHNjcm9sbGluZyBpZiB0aGUgY29udGVudCBmaXRzIGluIHRoZSBjbGllbnQgYXJlYS4KLQkJLy8gYWxpZ24gZW5kIG9mIGxvbmdlc3QgbGluZSB3aXRoIHJpZ2h0IGJvcmRlciBvZiBjbGllbnQgYXJlYQotCQkvLyBpZiBvZmZzZXQgaXMgb3V0IG9mIHJhbmdlLgotCQlpZiAocGl4ZWwgPiB3aWR0aCAtIGNsaWVudEFyZWFXaWR0aCkgewotCQkJcGl4ZWwgPSBNYXRoLm1heCgwLCB3aWR0aCAtIGNsaWVudEFyZWFXaWR0aCk7Ci0JCX0KLQl9Ci0Jc2Nyb2xsSG9yaXpvbnRhbEJhcihwaXhlbCAtIGhvcml6b250YWxTY3JvbGxPZmZzZXQpOwotfQotLyoqCi0gKiBBZGp1c3RzIHRoZSBtYXhpbXVtIGFuZCB0aGUgcGFnZSBzaXplIG9mIHRoZSBob3Jpem9udGFsIHNjcm9sbCBiYXIgCi0gKiB0byByZWZsZWN0IGNvbnRlbnQgd2lkdGggY2hhbmdlcy4KLSAqLwotdm9pZCBzZXRIb3Jpem9udGFsU2Nyb2xsQmFyKCkgewotCVNjcm9sbEJhciBob3Jpem9udGFsQmFyID0gZ2V0SG9yaXpvbnRhbEJhcigpOwotCQotCWlmIChob3Jpem9udGFsQmFyICE9IG51bGwgJiYgaG9yaXpvbnRhbEJhci5nZXRWaXNpYmxlKCkpIHsKLQkJZmluYWwgaW50IElOQUNUSVZFID0gMTsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCS8vIG9ubHkgc2V0IHRoZSByZWFsIHZhbHVlcyBpZiB0aGUgc2Nyb2xsIGJhciBjYW4gYmUgdXNlZCAKLQkJLy8gKGllLiBiZWNhdXNlIHRoZSB0aHVtYiBzaXplIGlzIGxlc3MgdGhhbiB0aGUgc2Nyb2xsIG1heGltdW0pCi0JCS8vIGF2b2lkcyBmbGFzaGluZyBvbiBNb3RpZiwgZml4ZXMgMUc3UkUxSiBhbmQgMUc1U0U5MgotCQlpZiAoY2xpZW50QXJlYS53aWR0aCA8IGxpbmVDYWNoZS5nZXRXaWR0aCgpKSB7Ci0JCQlob3Jpem9udGFsQmFyLnNldFZhbHVlcygKLQkJCQlob3Jpem9udGFsQmFyLmdldFNlbGVjdGlvbigpLAotCQkJCWhvcml6b250YWxCYXIuZ2V0TWluaW11bSgpLAotCQkJCWxpbmVDYWNoZS5nZXRXaWR0aCgpLAkJCQkJCQkvLyBtYXhpbXVtCi0JCQkJY2xpZW50QXJlYS53aWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbiwJLy8gdGh1bWIgc2l6ZQotCQkJCWhvcml6b250YWxCYXIuZ2V0SW5jcmVtZW50KCksCi0JCQkJY2xpZW50QXJlYS53aWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbik7CS8vIHBhZ2Ugc2l6ZQotCQl9Ci0JCWVsc2UgCi0JCWlmIChob3Jpem9udGFsQmFyLmdldFRodW1iKCkgIT0gSU5BQ1RJVkUgfHwgaG9yaXpvbnRhbEJhci5nZXRNYXhpbXVtKCkgIT0gSU5BQ1RJVkUpIHsKLQkJCWhvcml6b250YWxCYXIuc2V0VmFsdWVzKAotCQkJCWhvcml6b250YWxCYXIuZ2V0U2VsZWN0aW9uKCksCi0JCQkJaG9yaXpvbnRhbEJhci5nZXRNaW5pbXVtKCksCi0JCQkJSU5BQ1RJVkUsCi0JCQkJSU5BQ1RJVkUsCi0JCQkJaG9yaXpvbnRhbEJhci5nZXRJbmNyZW1lbnQoKSwKLQkJCQlJTkFDVElWRSk7Ci0JCX0KLQl9Ci19Ci0vKiogCi0gKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzcGVjaWZpZWQgbGluZXMuCi0gKiBUaGUgYmFja2dyb3VuZCBjb2xvciBpcyBkcmF3biBmb3IgdGhlIHdpZHRoIG9mIHRoZSB3aWRnZXQuIEFsbAotICogbGluZSBiYWNrZ3JvdW5kIGNvbG9ycyBhcmUgZGlzY2FyZGVkIHdoZW4gc2V0VGV4dCBpcyBjYWxsZWQuCi0gKiBUaGUgdGV4dCBiYWNrZ3JvdW5kIGNvbG9yIGlmIGRlZmluZWQgaW4gYSBTdHlsZVJhbmdlIG92ZXJsYXlzIHRoZSAKLSAqIGxpbmUgYmFja2dyb3VuZCBjb2xvci4gU2hvdWxkIG5vdCBiZSBjYWxsZWQgaWYgYSBMaW5lQmFja2dyb3VuZExpc3RlbmVyIAotICogaGFzIGJlZW4gc2V0IHNpbmNlIHRoZSBsaXN0ZW5lciBtYWludGFpbnMgdGhlIGxpbmUgYmFja2dyb3VuZHMuCi0gKiA8cD4KLSAqIExpbmUgYmFja2dyb3VuZCBjb2xvcnMgYXJlIG1haW50YWluZWQgcmVsYXRpdmUgdG8gdGhlIGxpbmUgdGV4dCwgbm90IHRoZSAKLSAqIGxpbmUgaW5kZXggdGhhdCBpcyBzcGVjaWZpZWQgaW4gdGhpcyBtZXRob2QgY2FsbC4KLSAqIER1cmluZyB0ZXh0IGNoYW5nZXMsIHdoZW4gZW50aXJlIGxpbmVzIGFyZSBpbnNlcnRlZCBvciByZW1vdmVkLCB0aGUgbGluZSAKLSAqIGJhY2tncm91bmQgY29sb3JzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZXMgYWZ0ZXIgdGhlIGNoYW5nZSAKLSAqIHdpbGwgIm1vdmUiIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSB0ZXh0LiBBbiBlbnRpcmUgbGluZSBpcyBkZWZpbmVkIGFzIAotICogZXh0ZW5kaW5nIGZyb20gdGhlIGZpcnN0IGNoYXJhY3RlciBvbiBhIGxpbmUgdG8gdGhlIGxhc3QgYW5kIGluY2x1ZGluZyB0aGUgCi0gKiBsaW5lIGRlbGltaXRlci4gCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFdoZW4gdHdvIGxpbmVzIGFyZSBqb2luZWQgYnkgZGVsZXRpbmcgYSBsaW5lIGRlbGltaXRlciwgdGhlIHRvcCBsaW5lIAotICogYmFja2dyb3VuZCB0YWtlcyBwcmVjZWRlbmNlIGFuZCB0aGUgY29sb3Igb2YgdGhlIGJvdHRvbSBsaW5lIGlzIGRlbGV0ZWQuIAotICogRm9yIGFsbCBvdGhlciB0ZXh0IGNoYW5nZXMgbGluZSBiYWNrZ3JvdW5kIGNvbG9ycyB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuIAotICogPC9wPgotICogCi0gKiBAcGFyYW0gc3RhcnRMaW5lIGZpcnN0IGxpbmUgdGhlIGNvbG9yIGlzIGFwcGxpZWQgdG8sIDAgYmFzZWQKLSAqIEBwYXJhbSBsaW5lQ291bnQgbnVtYmVyIG9mIGxpbmVzIHRoZSBjb2xvciBhcHBsaWVzIHRvLgotICogQHBhcmFtIGJhY2tncm91bmQgbGluZSBiYWNrZ3JvdW5kIGNvbG9yCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIHdoZW4gdGhlIHNwZWNpZmllZCBsaW5lIHJhbmdlIGlzIGludmFsaWQ8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0TGluZUJhY2tncm91bmQoaW50IHN0YXJ0TGluZSwgaW50IGxpbmVDb3VudCwgQ29sb3IgYmFja2dyb3VuZCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaW50IHBhcnRpYWxCb3R0b21JbmRleCA9IGdldFBhcnRpYWxCb3R0b21JbmRleCgpOwotCQotCS8vIHRoaXMgQVBJIGNhbiBub3QgYmUgdXNlZCBpZiB0aGUgY2xpZW50IGlzIHByb3ZpZGluZyB0aGUgbGluZSBiYWNrZ3JvdW5kCi0JaWYgKHVzZXJMaW5lQmFja2dyb3VuZCkgewotCQlyZXR1cm47Ci0JfQotCWlmIChzdGFydExpbmUgPCAwIHx8IHN0YXJ0TGluZSArIGxpbmVDb3VudCA+IGxvZ2ljYWxDb250ZW50LmdldExpbmVDb3VudCgpKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfSAKLQlkZWZhdWx0TGluZVN0eWxlci5zZXRMaW5lQmFja2dyb3VuZChzdGFydExpbmUsIGxpbmVDb3VudCwgYmFja2dyb3VuZCk7Ci0JLy8gZG8gbm90aGluZyBpZiByZWRyYXcgcmFuZ2UgaXMgY29tcGxldGVseSBpbnZpc2libGUJCi0JaWYgKHN0YXJ0TGluZSA+IHBhcnRpYWxCb3R0b21JbmRleCB8fCBzdGFydExpbmUgKyBsaW5lQ291bnQgLSAxIDwgdG9wSW5kZXgpIHsKLQkJcmV0dXJuOwotCX0KLQkvLyBvbmx5IHJlZHJhdyB2aXNpYmxlIGxpbmVzCi0JaWYgKHN0YXJ0TGluZSA8IHRvcEluZGV4KSB7Ci0JCWxpbmVDb3VudCAtPSB0b3BJbmRleCAtIHN0YXJ0TGluZTsKLQkJc3RhcnRMaW5lID0gdG9wSW5kZXg7Ci0JfQotCWlmIChzdGFydExpbmUgKyBsaW5lQ291bnQgLSAxID4gcGFydGlhbEJvdHRvbUluZGV4KSB7Ci0JCWxpbmVDb3VudCA9IHBhcnRpYWxCb3R0b21JbmRleCAtIHN0YXJ0TGluZSArIDE7Ci0JfQotCXN0YXJ0TGluZSAtPSB0b3BJbmRleDsKLQlzdXBlci5yZWRyYXcoCi0JCWxlZnRNYXJnaW4sIHN0YXJ0TGluZSAqIGxpbmVIZWlnaHQgKyB0b3BNYXJnaW4sIAotCQlnZXRDbGllbnRBcmVhKCkud2lkdGggLSBsZWZ0TWFyZ2luIC0gcmlnaHRNYXJnaW4sIGxpbmVDb3VudCAqIGxpbmVIZWlnaHQsIHRydWUpOwotfQotLyoqCi0gKiBGbGlwcyBzZWxlY3Rpb24gYW5jaG9yIGJhc2VkIG9uIHdvcmQgc2VsZWN0aW9uIGRpcmVjdGlvbi4KLSAqLwotdm9pZCBzZXRNb3VzZVdvcmRTZWxlY3Rpb25BbmNob3IoKSB7Ci0JaWYgKG1vdXNlRG91YmxlQ2xpY2spIHsKLQkJaWYgKGNhcmV0T2Zmc2V0IDwgZG91YmxlQ2xpY2tTZWxlY3Rpb24ueCkgewotCQkJc2VsZWN0aW9uQW5jaG9yID0gZG91YmxlQ2xpY2tTZWxlY3Rpb24ueTsKLQkJfQotCQllbHNlIGlmIChjYXJldE9mZnNldCA+IGRvdWJsZUNsaWNrU2VsZWN0aW9uLnkpIHsKLQkJCXNlbGVjdGlvbkFuY2hvciA9IGRvdWJsZUNsaWNrU2VsZWN0aW9uLng7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFNldHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSByZWNlaXZlciwgd2hpY2ggbXVzdCBiZSBvbmUKLSAqIG9mIHRoZSBjb25zdGFudHMgPGNvZGU+U1dULkxFRlRfVE9fUklHSFQ8L2NvZGU+IG9yIDxjb2RlPlNXVC5SSUdIVF9UT19MRUZUPC9jb2RlPi4KLSAqIDxwPgotICoKLSAqIEBwYXJhbSBvcmllbnRhdGlvbiBuZXcgb3JpZW50YXRpb24gc3R5bGUKLSAqIAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMi4xLjIKLSAqLwotcHVibGljIHZvaWQgc2V0T3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKSB7Ci0JaWYgKChvcmllbnRhdGlvbiAmIChTV1QuUklHSFRfVE9fTEVGVCB8IFNXVC5MRUZUX1RPX1JJR0hUKSkgPT0gMCkgeyAKLQkJcmV0dXJuOwotCX0KLQlpZiAoKG9yaWVudGF0aW9uICYgU1dULlJJR0hUX1RPX0xFRlQpICE9IDAgJiYgKG9yaWVudGF0aW9uICYgU1dULkxFRlRfVE9fUklHSFQpICE9IDApIHsKLQkJcmV0dXJuOwkKLQl9Ci0JaWYgKChvcmllbnRhdGlvbiAmIFNXVC5SSUdIVF9UT19MRUZUKSAhPSAwICYmIGlzTWlycm9yZWQoKSkgewotCQlyZXR1cm47CQotCX0gCi0JaWYgKChvcmllbnRhdGlvbiAmIFNXVC5MRUZUX1RPX1JJR0hUKSAhPSAwICYmICFpc01pcnJvcmVkKCkpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIUJpZGlVdGlsLnNldE9yaWVudGF0aW9uKGhhbmRsZSwgb3JpZW50YXRpb24pKSB7Ci0JCXJldHVybjsKLQl9Ci0JaXNNaXJyb3JlZCA9IChvcmllbnRhdGlvbiAmIFNXVC5SSUdIVF9UT19MRUZUKSAhPSAwOwotCWluaXRpYWxpemVSZW5kZXJlcigpOwotCWNhcmV0RGlyZWN0aW9uID0gU1dULk5VTEw7Ci0Jc2V0Q2FyZXRMb2NhdGlvbigpOwotCWtleUFjdGlvbk1hcC5jbGVhcigpOwotCWNyZWF0ZUtleUJpbmRpbmdzKCk7Ci0Jc3VwZXIucmVkcmF3KCk7Ci19Ci0vKioKLSAqIEFkanVzdHMgdGhlIG1heGltdW0gYW5kIHRoZSBwYWdlIHNpemUgb2YgdGhlIHNjcm9sbCBiYXJzIHRvIAotICogcmVmbGVjdCBjb250ZW50IHdpZHRoL2xlbmd0aCBjaGFuZ2VzLgotICovCi12b2lkIHNldFNjcm9sbEJhcnMoKSB7Ci0JU2Nyb2xsQmFyIHZlcnRpY2FsQmFyID0gZ2V0VmVydGljYWxCYXIoKTsKLQkKLQlpZiAodmVydGljYWxCYXIgIT0gbnVsbCkgewotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGdldENsaWVudEFyZWEoKTsKLQkJZmluYWwgaW50IElOQUNUSVZFID0gMTsKLQkJaW50IG1heGltdW0gPSBjb250ZW50LmdldExpbmVDb3VudCgpICogZ2V0VmVydGljYWxJbmNyZW1lbnQoKTsKLQkJCi0JCS8vIG9ubHkgc2V0IHRoZSByZWFsIHZhbHVlcyBpZiB0aGUgc2Nyb2xsIGJhciBjYW4gYmUgdXNlZCAKLQkJLy8gKGllLiBiZWNhdXNlIHRoZSB0aHVtYiBzaXplIGlzIGxlc3MgdGhhbiB0aGUgc2Nyb2xsIG1heGltdW0pCi0JCS8vIGF2b2lkcyBmbGFzaGluZyBvbiBNb3RpZiwgZml4ZXMgMUc3UkUxSiBhbmQgMUc1U0U5MgotCQlpZiAoY2xpZW50QXJlYS5oZWlnaHQgPCBtYXhpbXVtKSB7Ci0JCQl2ZXJ0aWNhbEJhci5zZXRWYWx1ZXMoCi0JCQkJdmVydGljYWxCYXIuZ2V0U2VsZWN0aW9uKCksCi0JCQkJdmVydGljYWxCYXIuZ2V0TWluaW11bSgpLAotCQkJCW1heGltdW0sCi0JCQkJY2xpZW50QXJlYS5oZWlnaHQsCQkJCS8vIHRodW1iIHNpemUKLQkJCQl2ZXJ0aWNhbEJhci5nZXRJbmNyZW1lbnQoKSwKLQkJCQljbGllbnRBcmVhLmhlaWdodCk7CQkJCS8vIHBhZ2Ugc2l6ZQotCQl9Ci0JCWVsc2UKLQkJaWYgKHZlcnRpY2FsQmFyLmdldFRodW1iKCkgIT0gSU5BQ1RJVkUgfHwgdmVydGljYWxCYXIuZ2V0TWF4aW11bSgpICE9IElOQUNUSVZFKSB7Ci0JCQl2ZXJ0aWNhbEJhci5zZXRWYWx1ZXMoCi0JCQkJdmVydGljYWxCYXIuZ2V0U2VsZWN0aW9uKCksCi0JCQkJdmVydGljYWxCYXIuZ2V0TWluaW11bSgpLAotCQkJCUlOQUNUSVZFLAotCQkJCUlOQUNUSVZFLAotCQkJCXZlcnRpY2FsQmFyLmdldEluY3JlbWVudCgpLAotCQkJCUlOQUNUSVZFKTsKLQkJfQkJCi0JfQotCXNldEhvcml6b250YWxTY3JvbGxCYXIoKTsKLX0KLS8qKiAKLSAqIFNldHMgdGhlIHNlbGVjdGlvbiB0byB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHNjcm9sbHMgaXQgaW50byB2aWV3LiAgRXF1aXZhbGVudCB0byBzZXRTZWxlY3Rpb24oc3RhcnQsc3RhcnQpLgotICogPHA+Ci0gKgotICogQHBhcmFtIHN0YXJ0IG5ldyBjYXJldCBwb3NpdGlvbgotICogQHNlZSAjc2V0U2VsZWN0aW9uKGludCxpbnQpCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIHdoZW4gZWl0aGVyIHRoZSBzdGFydCBvciB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gcmFuZ2UgaXMgaW5zaWRlIGEgCi0gKiBtdWx0aSBieXRlIGxpbmUgZGVsaW1pdGVyIChhbmQgdGh1cyBuZWl0aGVyIGNsZWFybHkgaW4gZnJvbnQgb2Ygb3IgYWZ0ZXIgdGhlIGxpbmUgZGVsaW1pdGVyKQotICogPC91bD4gCi0gKi8KLXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgc3RhcnQpIHsKLQkvLyBjaGVja1dpZGdldCB0ZXN0IGRvbmUgaW4gc2V0U2VsZWN0aW9uUmFuZ2UJCi0Jc2V0U2VsZWN0aW9uKHN0YXJ0LCBzdGFydCk7Ci19Ci0vKiogCi0gKiBTZXRzIHRoZSBzZWxlY3Rpb24gYW5kIHNjcm9sbHMgaXQgaW50byB2aWV3LgotICogPHA+Ci0gKiBJbmRleGluZyBpcyB6ZXJvIGJhc2VkLiAgVGV4dCBzZWxlY3Rpb25zIGFyZSBzcGVjaWZpZWQgaW4gdGVybXMgb2YKLSAqIGNhcmV0IHBvc2l0aW9ucy4gIEluIGEgdGV4dCB3aWRnZXQgdGhhdCBjb250YWlucyBOIGNoYXJhY3RlcnMsIHRoZXJlIGFyZSAKLSAqIE4rMSBjYXJldCBwb3NpdGlvbnMsIHJhbmdpbmcgZnJvbSAwLi5OCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBvaW50IHg9c2VsZWN0aW9uIHN0YXJ0IG9mZnNldCwgeT1zZWxlY3Rpb24gZW5kIG9mZnNldAotICogCVRoZSBjYXJldCB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgc2VsZWN0aW9uIHN0YXJ0IHdoZW4geCA+IHkuCi0gKiBAc2VlICNzZXRTZWxlY3Rpb24oaW50LGludCkKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiBwb2ludCBpcyBudWxsPC9saT4KLSAqICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgd2hlbiBlaXRoZXIgdGhlIHN0YXJ0IG9yIHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbiByYW5nZSBpcyBpbnNpZGUgYSAKLSAqIG11bHRpIGJ5dGUgbGluZSBkZWxpbWl0ZXIgKGFuZCB0aHVzIG5laXRoZXIgY2xlYXJseSBpbiBmcm9udCBvZiBvciBhZnRlciB0aGUgbGluZSBkZWxpbWl0ZXIpCi0gKiA8L3VsPiAKLSAqLwotcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKFBvaW50IHBvaW50KSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAocG9pbnQgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7CQotCXNldFNlbGVjdGlvbihwb2ludC54LCBwb2ludC55KTsKLX0KLS8qKgotICogU2V0cyB0aGUgcmVjZWl2ZXIncyBzZWxlY3Rpb24gYmFja2dyb3VuZCBjb2xvciB0byB0aGUgY29sb3Igc3BlY2lmaWVkCi0gKiBieSB0aGUgYXJndW1lbnQsIG9yIHRvIHRoZSBkZWZhdWx0IHN5c3RlbSBjb2xvciBmb3IgdGhlIGNvbnRyb2wKLSAqIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsLgotICoKLSAqIEBwYXJhbSBjb2xvciB0aGUgbmV3IGNvbG9yIChvciBudWxsKQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIGFyZ3VtZW50IGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4gCi0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25CYWNrZ3JvdW5kIChDb2xvciBjb2xvcikgewotCWNoZWNrV2lkZ2V0ICgpOwotCWlmIChjb2xvciAhPSBudWxsKSB7Ci0JCWlmIChjb2xvci5pc0Rpc3Bvc2VkKCkpIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfQotCXNlbGVjdGlvbkJhY2tncm91bmQgPSBjb2xvcjsKLQlyZWRyYXcoKTsKLX0JCi0vKioKLSAqIFNldHMgdGhlIHJlY2VpdmVyJ3Mgc2VsZWN0aW9uIGZvcmVncm91bmQgY29sb3IgdG8gdGhlIGNvbG9yIHNwZWNpZmllZAotICogYnkgdGhlIGFyZ3VtZW50LCBvciB0byB0aGUgZGVmYXVsdCBzeXN0ZW0gY29sb3IgZm9yIHRoZSBjb250cm9sCi0gKiBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbC4KLSAqCi0gKiBAcGFyYW0gY29sb3IgdGhlIG5ldyBjb2xvciAob3IgbnVsbCkKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSBhcmd1bWVudCBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+IAotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uRm9yZWdyb3VuZCAoQ29sb3IgY29sb3IpIHsKLQljaGVja1dpZGdldCAoKTsKLQlpZiAoY29sb3IgIT0gbnVsbCkgewotCQlpZiAoY29sb3IuaXNEaXNwb3NlZCgpKSBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCX0KLQlzZWxlY3Rpb25Gb3JlZ3JvdW5kID0gY29sb3I7Ci0JcmVkcmF3KCk7Ci19CQotLyoqIAotICogU2V0cyB0aGUgc2VsZWN0aW9uIGFuZCBzY3JvbGxzIGl0IGludG8gdmlldy4KLSAqIDxwPgotICogSW5kZXhpbmcgaXMgemVybyBiYXNlZC4gIFRleHQgc2VsZWN0aW9ucyBhcmUgc3BlY2lmaWVkIGluIHRlcm1zIG9mCi0gKiBjYXJldCBwb3NpdGlvbnMuICBJbiBhIHRleHQgd2lkZ2V0IHRoYXQgY29udGFpbnMgTiBjaGFyYWN0ZXJzLCB0aGVyZSBhcmUgCi0gKiBOKzEgY2FyZXQgcG9zaXRpb25zLCByYW5naW5nIGZyb20gMC4uTgotICogPC9wPgotICoKLSAqIEBwYXJhbSBzdGFydCBzZWxlY3Rpb24gc3RhcnQgb2Zmc2V0LiBUaGUgY2FyZXQgd2lsbCBiZSBwbGFjZWQgYXQgdGhlIAotICogCXNlbGVjdGlvbiBzdGFydCB3aGVuIHN0YXJ0ID4gZW5kLgotICogQHBhcmFtIGVuZCBzZWxlY3Rpb24gZW5kIG9mZnNldAotICogQHNlZSAjc2V0U2VsZWN0aW9uUmFuZ2UoaW50LGludCkKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgd2hlbiBlaXRoZXIgdGhlIHN0YXJ0IG9yIHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbiByYW5nZSBpcyBpbnNpZGUgYSAKLSAqIG11bHRpIGJ5dGUgbGluZSBkZWxpbWl0ZXIgKGFuZCB0aHVzIG5laXRoZXIgY2xlYXJseSBpbiBmcm9udCBvZiBvciBhZnRlciB0aGUgbGluZSBkZWxpbWl0ZXIpCi0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JLy8gY2hlY2tXaWRnZXQgdGVzdCBkb25lIGluIHNldFNlbGVjdGlvblJhbmdlCi0Jc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQlzaG93U2VsZWN0aW9uKCk7Ci19Ci0vKiogCi0gKiBTZXRzIHRoZSBzZWxlY3Rpb24uIFRoZSBuZXcgc2VsZWN0aW9uIG1heSBub3QgYmUgdmlzaWJsZS4gQ2FsbCBzaG93U2VsZWN0aW9uIHRvIHNjcm9sbCAKLSAqIHRoZSBzZWxlY3Rpb24gaW50byB2aWV3LiBBIG5lZ2F0aXZlIGxlbmd0aCBwbGFjZXMgdGhlIGNhcmV0IGF0IHRoZSB2aXN1YWwgc3RhcnQgb2YgdGhlIAotICogc2VsZWN0aW9uLiA8cD4KLSAqCi0gKiBAcGFyYW0gc3RhcnQgb2Zmc2V0IG9mIHRoZSBmaXJzdCBzZWxlY3RlZCBjaGFyYWN0ZXIKLSAqIEBwYXJhbSBsZW5ndGggbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2VsZWN0Ci0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgd2hlbiBlaXRoZXIgdGhlIHN0YXJ0IG9yIHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbiByYW5nZSBpcyBpbnNpZGUgYSAKLSAqIG11bHRpIGJ5dGUgbGluZSBkZWxpbWl0ZXIgKGFuZCB0aHVzIG5laXRoZXIgY2xlYXJseSBpbiBmcm9udCBvZiBvciBhZnRlciB0aGUgbGluZSBkZWxpbWl0ZXIpCi0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQljaGVja1dpZGdldCgpOwotCWludCBjb250ZW50TGVuZ3RoID0gZ2V0Q2hhckNvdW50KCk7Ci0Jc3RhcnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbiAoc3RhcnQsIGNvbnRlbnRMZW5ndGgpKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBsZW5ndGg7Ci0JaWYgKGVuZCA8IDApIHsKLQkJbGVuZ3RoID0gLXN0YXJ0OwotCX0gZWxzZSB7Ci0JCWlmIChlbmQgPiBjb250ZW50TGVuZ3RoKSBsZW5ndGggPSBjb250ZW50TGVuZ3RoIC0gc3RhcnQ7Ci0JfQotCWlmIChpc0xpbmVEZWxpbWl0ZXIoc3RhcnQpIHx8IGlzTGluZURlbGltaXRlcihzdGFydCArIGxlbmd0aCkpIHsKLQkJLy8gdGhlIHN0YXJ0IG9mZnNldCBvciBlbmQgb2Zmc2V0IG9mIHRoZSBzZWxlY3Rpb24gcmFuZ2UgaXMgaW5zaWRlIGEgCi0JCS8vIG11bHRpIGJ5dGUgbGluZSBkZWxpbWl0ZXIuIFRoaXMgaXMgYW4gaWxsZWdhbCBvcGVyYXRpb24gYW5kIGFuIGV4Y2VwdGlvbiAKLQkJLy8gaXMgdGhyb3duLiBGaXhlcyAxR0RLSzNSCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfQkJCQkJCi0JaW50ZXJuYWxTZXRTZWxlY3Rpb24oc3RhcnQsIGxlbmd0aCwgZmFsc2UpOwotCS8vIGFsd2F5cyB1cGRhdGUgdGhlIGNhcmV0IGxvY2F0aW9uLiBmaXhlcyAxRzhGT0RQCi0Jc2V0Q2FyZXRMb2NhdGlvbigpOwotfQotLyoqIAotICogU2V0cyB0aGUgc2VsZWN0aW9uLiAKLSAqIFRoZSBuZXcgc2VsZWN0aW9uIG1heSBub3QgYmUgdmlzaWJsZS4gQ2FsbCBzaG93U2VsZWN0aW9uIHRvIHNjcm9sbCAKLSAqIHRoZSBzZWxlY3Rpb24gaW50byB2aWV3LgotICogPHA+Ci0gKgotICogQHBhcmFtIHN0YXJ0IG9mZnNldCBvZiB0aGUgZmlyc3Qgc2VsZWN0ZWQgY2hhcmFjdGVyLCBzdGFydCA+PSAwIG11c3QgYmUgdHJ1ZS4KLSAqIEBwYXJhbSBsZW5ndGggbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2VsZWN0LCAwIDw9IHN0YXJ0ICsgbGVuZ3RoIAotICogCTw9IGdldENoYXJDb3VudCgpIG11c3QgYmUgdHJ1ZS4gCi0gKiAJQSBuZWdhdGl2ZSBsZW5ndGggcGxhY2VzIHRoZSBjYXJldCBhdCB0aGUgc2VsZWN0aW9uIHN0YXJ0LgotICogQHBhcmFtIHNlbmRFdmVudCBhIFNlbGVjdGlvbiBldmVudCBpcyBzZW50IHdoZW4gc2V0IHRvIHRydWUgYW5kIHdoZW4gCi0gKiAJdGhlIHNlbGVjdGlvbiBpcyByZXNldC4KLSAqLwotdm9pZCBpbnRlcm5hbFNldFNlbGVjdGlvbihpbnQgc3RhcnQsIGludCBsZW5ndGgsIGJvb2xlYW4gc2VuZEV2ZW50KSB7Ci0JaW50IGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOwotCQotCWlmIChzdGFydCA+IGVuZCkgewotCQlpbnQgdGVtcCA9IGVuZDsKLQkJZW5kID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gdGVtcDsKLQl9Ci0JLy8gaXMgdGhlIHNlbGVjdGlvbiByYW5nZSBkaWZmZXJlbnQgb3IgaXMgdGhlIHNlbGVjdGlvbiBkaXJlY3Rpb24gCi0JLy8gZGlmZmVyZW50PwotCWlmIChzZWxlY3Rpb24ueCAhPSBzdGFydCB8fCBzZWxlY3Rpb24ueSAhPSBlbmQgfHwgCi0JCShsZW5ndGggPiAwICYmIHNlbGVjdGlvbkFuY2hvciAhPSBzZWxlY3Rpb24ueCkgfHwgCi0JCShsZW5ndGggPCAwICYmIHNlbGVjdGlvbkFuY2hvciAhPSBzZWxlY3Rpb24ueSkpIHsKLQkJY2xlYXJTZWxlY3Rpb24oc2VuZEV2ZW50KTsKLQkJaWYgKGxlbmd0aCA8IDApIHsKLQkJCXNlbGVjdGlvbkFuY2hvciA9IHNlbGVjdGlvbi55ID0gZW5kOwotCQkJY2FyZXRPZmZzZXQgPSBzZWxlY3Rpb24ueCA9IHN0YXJ0OwotCQl9Ci0JCWVsc2UgewotCQkJc2VsZWN0aW9uQW5jaG9yID0gc2VsZWN0aW9uLnggPSBzdGFydDsKLQkJCWNhcmV0T2Zmc2V0ID0gc2VsZWN0aW9uLnkgPSBlbmQ7Ci0JCX0KLQkJaW50ZXJuYWxSZWRyYXdSYW5nZShzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueCwgdHJ1ZSk7Ci0JfQotfQotLyoqIAotICogQWRkcyB0aGUgc3BlY2lmaWVkIHN0eWxlLiBUaGUgbmV3IHN0eWxlIG92ZXJ3cml0ZXMgZXhpc3Rpbmcgc3R5bGVzIGZvciB0aGUKLSAqIHNwZWNpZmllZCByYW5nZS4gIEV4aXN0aW5nIHN0eWxlIHJhbmdlcyBhcmUgYWRqdXN0ZWQgaWYgdGhleSBwYXJ0aWFsbHkgCi0gKiBvdmVybGFwIHdpdGggdGhlIG5ldyBzdHlsZSwgVG8gY2xlYXIgYW4gaW5kaXZpZHVhbCBzdHlsZSwgY2FsbCBzZXRTdHlsZVJhbmdlIAotICogd2l0aCBhIFN0eWxlUmFuZ2UgdGhhdCBoYXMgbnVsbCBhdHRyaWJ1dGVzLiAKLSAqIDxwPgotICogU2hvdWxkIG5vdCBiZSBjYWxsZWQgaWYgYSBMaW5lU3R5bGVMaXN0ZW5lciBoYXMgYmVlbiBzZXQgc2luY2UgdGhlIAotICogbGlzdGVuZXIgbWFpbnRhaW5zIHRoZSBzdHlsZXMuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHJhbmdlIFN0eWxlUmFuZ2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0eWxlIGluZm9ybWF0aW9uLgotICogT3ZlcndyaXRlcyB0aGUgb2xkIHN0eWxlIGluIHRoZSBnaXZlbiByYW5nZS4gTWF5IGJlIG51bGwgdG8gZGVsZXRlCi0gKiBhbGwgc3R5bGVzLgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICA8bGk+RVJST1JfSU5WQUxJRF9SQU5HRSB3aGVuIHRoZSBzdHlsZSByYW5nZSBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSAoPiBnZXRDaGFyQ291bnQoKSk8L2xpPiAKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFN0eWxlUmFuZ2UoU3R5bGVSYW5nZSByYW5nZSkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JCi0JLy8gdGhpcyBBUEkgY2FuIG5vdCBiZSB1c2VkIGlmIHRoZSBjbGllbnQgaXMgcHJvdmlkaW5nIHRoZSBsaW5lIHN0eWxlcwotCWlmICh1c2VyTGluZVN0eWxlKSB7Ci0JCXJldHVybjsKLQl9Ci0gCS8vIGNoZWNrIHRoZSByYW5nZSwgbWFrZSBzdXJlIGl0IGZhbGxzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdGhlIHRleHQgCi0JaWYgKHJhbmdlICE9IG51bGwgJiYgcmFuZ2Uuc3RhcnQgKyByYW5nZS5sZW5ndGggPiBjb250ZW50LmdldENoYXJDb3VudCgpKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9SQU5HRSk7Ci0JfSAJCi0JZGVmYXVsdExpbmVTdHlsZXIuc2V0U3R5bGVSYW5nZShyYW5nZSk7Ci0JaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJaW50IGZpcnN0TGluZSA9IGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KHJhbmdlLnN0YXJ0KTsKLQkJaW50IGxhc3RMaW5lID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQocmFuZ2Uuc3RhcnQgKyByYW5nZS5sZW5ndGgpOwotCQlsaW5lQ2FjaGUucmVzZXQoZmlyc3RMaW5lLCBsYXN0TGluZSAtIGZpcnN0TGluZSArIDEsIHRydWUpOwotCi0JCS8vIGlmIHRoZSBzdHlsZSBpcyBub3QgdmlzaWJsZSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZWRyYXcKLQkJaWYgKGlzQXJlYVZpc2libGUoZmlyc3RMaW5lLCBsYXN0TGluZSkpIHsKLQkJCWludCByZWRyYXdZID0gZmlyc3RMaW5lICogbGluZUhlaWdodCAtIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0OwotCQkJaW50IHJlZHJhd1N0b3BZID0gKGxhc3RMaW5lICsgMSkgKiBsaW5lSGVpZ2h0IC0gdmVydGljYWxTY3JvbGxPZmZzZXQ7CQkKLQkJCWRyYXcoMCwgcmVkcmF3WSwgZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCByZWRyYXdTdG9wWSAtIHJlZHJhd1ksIHRydWUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLy8gY2xlYXJpbmcgYWxsIHN0eWxlcwotCQlsaW5lQ2FjaGUucmVzZXQoMCwgY29udGVudC5nZXRMaW5lQ291bnQoKSwgZmFsc2UpOwotCQlyZWRyYXcoKTsKLQl9Ci0JCi0JLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGNhcmV0IGlzIHBvc2l0aW9uZWQgY29ycmVjdGx5LgotCS8vIGNhcmV0IGxvY2F0aW9uIG1heSBjaGFuZ2UgaWYgZm9udCBzdHlsZSBjaGFuZ2VzLgotCS8vIGZpeGVzIDFHOEZPRFAKLQlzZXRDYXJldExvY2F0aW9uKCk7Ci19Ci0vKiogCi0gKiBTZXRzIHN0eWxlcyB0byBiZSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHdpZGdldCBjb250ZW50LiBBbGwgc3R5bGVzIAotICogaW4gdGhlIHdpZGdldCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGdpdmVuIHNldCBvZiBzdHlsZXMuCi0gKiA8cD4KLSAqIFNob3VsZCBub3QgYmUgY2FsbGVkIGlmIGEgTGluZVN0eWxlTGlzdGVuZXIgaGFzIGJlZW4gc2V0IHNpbmNlIHRoZSAKLSAqIGxpc3RlbmVyIG1haW50YWlucyB0aGUgc3R5bGVzLgotICogPC9wPgotICoKLSAqIEBwYXJhbSByYW5nZXMgU3R5bGVSYW5nZSBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIHN0eWxlIGluZm9ybWF0aW9uLgotICogVGhlIHJhbmdlcyBzaG91bGQgbm90IG92ZXJsYXAuIFRoZSBzdHlsZSByZW5kZXJpbmcgaXMgdW5kZWZpbmVkIGlmIAotICogdGhlIHJhbmdlcyBkbyBvdmVybGFwLiBNdXN0IG5vdCBiZSBudWxsLiBUaGUgc3R5bGVzIG5lZWQgdG8gYmUgaW4gb3JkZXIuCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCB3aGVuIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0Ugd2hlbiB0aGUgbGFzdCBvZiB0aGUgc3R5bGUgcmFuZ2VzIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlICg+IGdldENoYXJDb3VudCgpKTwvbGk+IAotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0U3R5bGVSYW5nZXMoU3R5bGVSYW5nZVtdIHJhbmdlcykgewotCWNoZWNrV2lkZ2V0KCk7Ci0JLy8gdGhpcyBBUEkgY2FuIG5vdCBiZSB1c2VkIGlmIHRoZSBjbGllbnQgaXMgcHJvdmlkaW5nIHRoZSBsaW5lIHN0eWxlcwotCWlmICh1c2VyTGluZVN0eWxlKSB7Ci0JCXJldHVybjsKLQl9Ci0gCWlmIChyYW5nZXMgPT0gbnVsbCkgewotIAkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLSAJfQotIAkvLyBjaGVjayB0aGUgbGFzdCByYW5nZSwgbWFrZSBzdXJlIGl0IGZhbGxzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdGhlCi0gCS8vIGN1cnJlbnQgdGV4dCAKLSAJaWYgKHJhbmdlcy5sZW5ndGggIT0gMCkgewotIAkJU3R5bGVSYW5nZSBsYXN0ID0gcmFuZ2VzW3Jhbmdlcy5sZW5ndGgtMV07Ci0gCQlpbnQgbGFzdEVuZCA9IGxhc3Quc3RhcnQgKyBsYXN0Lmxlbmd0aDsKLQkJaW50IGZpcnN0TGluZSA9IGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KHJhbmdlc1swXS5zdGFydCk7Ci0JCWludCBsYXN0TGluZTsKLQkJaWYgKGxhc3RFbmQgPiBjb250ZW50LmdldENoYXJDb3VudCgpKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfUkFOR0UpOwotCQl9IAkKLQkJbGFzdExpbmUgPSBjb250ZW50LmdldExpbmVBdE9mZnNldChsYXN0RW5kKTsKLQkJLy8gcmVzZXQgYWxsIGxpbmVzIGFmZmVjdGVkIGJ5IHRoZSBzdHlsZSBjaGFuZ2UKLQkJbGluZUNhY2hlLnJlc2V0KGZpcnN0TGluZSwgbGFzdExpbmUgLSBmaXJzdExpbmUgKyAxLCB0cnVlKTsKLSAJfQotIAllbHNlIHsKLQkJLy8gcmVzZXQgYWxsIGxpbmVzCi0JCWxpbmVDYWNoZS5yZXNldCgwLCBjb250ZW50LmdldExpbmVDb3VudCgpLCBmYWxzZSk7Ci0gCX0KLQlkZWZhdWx0TGluZVN0eWxlci5zZXRTdHlsZVJhbmdlcyhyYW5nZXMpOwotCXJlZHJhdygpOyAvLyBzaG91bGQgb25seSByZWRyYXcgYWZmZWN0ZWQgYXJlYSB0byBhdm9pZCBmbGFzaGluZwotCS8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBjYXJldCBpcyBwb3NpdGlvbmVkIGNvcnJlY3RseS4KLQkvLyBjYXJldCBsb2NhdGlvbiBtYXkgY2hhbmdlIGlmIGZvbnQgc3R5bGUgY2hhbmdlcy4KLQkvLyBmaXhlcyAxRzhGT0RQCi0Jc2V0Q2FyZXRMb2NhdGlvbigpOwotfQotLyoqIAotICogU2V0cyB0aGUgdGFiIHdpZHRoLiAKLSAqIDxwPgotICoKLSAqIEBwYXJhbSB0YWJzIHRhYiB3aWR0aCBtZWFzdXJlZCBpbiBjaGFyYWN0ZXJzLgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRUYWJzKGludCB0YWJzKSB7Ci0JY2hlY2tXaWRnZXQoKTsJCi0JdGFiTGVuZ3RoID0gdGFiczsKLQlyZW5kZXJlci5zZXRUYWJMZW5ndGgodGFiTGVuZ3RoKTsKLQlpZiAoY2FyZXRPZmZzZXQgPiAwKSB7Ci0JCWNhcmV0T2Zmc2V0ID0gMDsKLQkJc2hvd0NhcmV0KCk7Ci0JCWNsZWFyU2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0JLy8gcmVzZXQgYWxsIGxpbmUgd2lkdGhzIHdoZW4gdGhlIHRhYiB3aWR0aCBjaGFuZ2VzCi0JbGluZUNhY2hlLnJlc2V0KDAsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCksIGZhbHNlKTsKLQlyZWRyYXcoKTsKLX0KLS8qKiAKLSAqIFNldHMgdGhlIHdpZGdldCBjb250ZW50LiAKLSAqIElmIHRoZSB3aWRnZXQgaGFzIHRoZSBTV1QuU0lOR0xFIHN0eWxlIGFuZCAidGV4dCIgY29udGFpbnMgbW9yZSB0aGFuIAotICogb25lIGxpbmUsIG9ubHkgdGhlIGZpcnN0IGxpbmUgaXMgcmVuZGVyZWQgYnV0IHRoZSB0ZXh0IGlzIHN0b3JlZCAKLSAqIHVuY2hhbmdlZC4gQSBzdWJzZXF1ZW50IGNhbGwgdG8gZ2V0VGV4dCB3aWxsIHJldHVybiB0aGUgc2FtZSB0ZXh0IAotICogdGhhdCB3YXMgc2V0LgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gT25seSBhIHNpbmdsZSBsaW5lIG9mIHRleHQgc2hvdWxkIGJlIHNldCB3aGVuIHRoZSBTV1QuU0lOR0xFIAotICogc3R5bGUgaXMgdXNlZC4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gdGV4dCBuZXcgd2lkZ2V0IGNvbnRlbnQuIFJlcGxhY2VzIGV4aXN0aW5nIGNvbnRlbnQuIExpbmUgc3R5bGVzIAotICogCXRoYXQgd2VyZSBzZXQgdXNpbmcgU3R5bGVkVGV4dCBBUEkgYXJlIGRpc2NhcmRlZC4gIFRoZQotICogCWN1cnJlbnQgc2VsZWN0aW9uIGlzIGFsc28gZGlzY2FyZGVkLgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCQotCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9Ci0JZXZlbnQuc3RhcnQgPSAwOwotCWV2ZW50LmVuZCA9IGdldENoYXJDb3VudCgpOwotCWV2ZW50LnRleHQgPSB0ZXh0OwotCWV2ZW50LmRvaXQgPSB0cnVlOwkKLQlub3RpZnlMaXN0ZW5lcnMoU1dULlZlcmlmeSwgZXZlbnQpOwotCWlmIChldmVudC5kb2l0KSB7Ci0JCVN0eWxlZFRleHRFdmVudCBzdHlsZWRUZXh0RXZlbnQgPSBudWxsOwotCQkKLQkJaWYgKGlzTGlzdGVuaW5nKEV4dGVuZGVkTW9kaWZ5KSkgewkJCi0JCQlzdHlsZWRUZXh0RXZlbnQgPSBuZXcgU3R5bGVkVGV4dEV2ZW50KGxvZ2ljYWxDb250ZW50KTsKLQkJCXN0eWxlZFRleHRFdmVudC5zdGFydCA9IGV2ZW50LnN0YXJ0OwotCQkJc3R5bGVkVGV4dEV2ZW50LmVuZCA9IGV2ZW50LnN0YXJ0ICsgZXZlbnQudGV4dC5sZW5ndGgoKTsKLQkJCXN0eWxlZFRleHRFdmVudC50ZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoZXZlbnQuc3RhcnQsIGV2ZW50LmVuZCAtIGV2ZW50LnN0YXJ0KTsKLQkJfQotCQljb250ZW50LnNldFRleHQoZXZlbnQudGV4dCk7Ci0JCXNlbmRNb2RpZnlFdmVudChldmVudCk7CQotCQlpZiAoc3R5bGVkVGV4dEV2ZW50ICE9IG51bGwpIHsKLQkJCW5vdGlmeUxpc3RlbmVycyhFeHRlbmRlZE1vZGlmeSwgc3R5bGVkVGV4dEV2ZW50KTsKLQkJfQotCX0KLX0KLS8qKgotICogU2V0cyB0aGUgdGV4dCBsaW1pdCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzLgotICogPHA+Ci0gKiBUaGUgdGV4dCBsaW1pdCBzcGVjaWZpZXMgdGhlIGFtb3VudCBvZiB0ZXh0IHRoYXQKLSAqIHRoZSB1c2VyIGNhbiB0eXBlIGludG8gdGhlIHdpZGdldC4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gbGltaXQgdGhlIG5ldyB0ZXh0IGxpbWl0LgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICA8bGk+RVJST1JfQ0FOTk9UX0JFX1pFUk8gd2hlbiBsaW1pdCBpcyAwPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFRleHRMaW1pdChpbnQgbGltaXQpIHsKLQljaGVja1dpZGdldCgpOwotCWlmIChsaW1pdCA9PSAwKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pOwotCX0KLQl0ZXh0TGltaXQgPSBsaW1pdDsKLX0KLS8qKgotICogU2V0cyB0aGUgdG9wIGluZGV4LiBEbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHRleHQgc2V0LgotICogPHA+Ci0gKiBUaGUgdG9wIGluZGV4IGlzIHRoZSBpbmRleCBvZiB0aGUgbGluZSB0aGF0IGlzIGN1cnJlbnRseSBhdCB0aGUgdG9wIAotICogb2YgdGhlIHdpZGdldC4gVGhlIHRvcCBpbmRleCBjaGFuZ2VzIHdoZW4gdGhlIHdpZGdldCBpcyBzY3JvbGxlZC4KLSAqIEluZGV4aW5nIHN0YXJ0cyBmcm9tIHplcm8uCi0gKiBOb3RlOiBUaGUgdG9wIGluZGV4IGlzIHJlc2V0IHRvIDAgd2hlbiBuZXcgdGV4dCBpcyBzZXQgaW4gdGhlIHdpZGdldC4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gdG9wSW5kZXggbmV3IHRvcCBpbmRleC4gTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIAotICogCWdldExpbmVDb3VudCgpIC0gZnVsbHkgdmlzaWJsZSBsaW5lcyBwZXIgcGFnZS4gSWYgbm8gbGluZXMgYXJlIGZ1bGx5IAotICogCXZpc2libGUgdGhlIG1heGltdW0gdmFsdWUgaXMgZ2V0TGluZUNvdW50KCkgLSAxLiBBbiBvdXQgb2YgcmFuZ2UgCi0gKiAJaW5kZXggd2lsbCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseS4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0VG9wSW5kZXgoaW50IHRvcEluZGV4KSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpbnQgbGluZUNvdW50ID0gbG9naWNhbENvbnRlbnQuZ2V0TGluZUNvdW50KCk7Ci0JaW50IHBhZ2VTaXplID0gTWF0aC5tYXgoMSwgTWF0aC5taW4obGluZUNvdW50LCBnZXRMaW5lQ291bnRXaG9sZSgpKSk7Ci0JCi0JaWYgKGdldENoYXJDb3VudCgpID09IDApIHsKLQkJcmV0dXJuOwotCX0JCi0JaWYgKHRvcEluZGV4IDwgMCkgewotCQl0b3BJbmRleCA9IDA7Ci0JfQotCWVsc2UgCi0JaWYgKHRvcEluZGV4ID4gbGluZUNvdW50IC0gcGFnZVNpemUpIHsKLQkJdG9wSW5kZXggPSBsaW5lQ291bnQgLSBwYWdlU2l6ZTsKLQl9Ci0JaWYgKHdvcmRXcmFwKSB7Ci0JCWludCBsb2dpY2FsTGluZU9mZnNldCA9IGxvZ2ljYWxDb250ZW50LmdldE9mZnNldEF0TGluZSh0b3BJbmRleCk7Ci0JCXRvcEluZGV4ID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQobG9naWNhbExpbmVPZmZzZXQpOwotCX0KLQlzZXRWZXJ0aWNhbFNjcm9sbE9mZnNldCh0b3BJbmRleCAqIGdldFZlcnRpY2FsSW5jcmVtZW50KCksIHRydWUpOwotfQotLyoqCi0gKiBTZXRzIHRoZSB0b3AgcGl4ZWwgb2Zmc2V0LiBEbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHRleHQgc2V0LgotICogPHA+Ci0gKiBUaGUgdG9wIHBpeGVsIG9mZnNldCBpcyB0aGUgdmVydGljYWwgcGl4ZWwgb2Zmc2V0IG9mIHRoZSB3aWRnZXQuIFRoZQotICogd2lkZ2V0IGlzIHNjcm9sbGVkIHNvIHRoYXQgdGhlIGdpdmVuIHBpeGVsIHBvc2l0aW9uIGlzIGF0IHRoZSB0b3AuCi0gKiBUaGUgdG9wIGluZGV4IGlzIGFkanVzdGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIHRvcCBsaW5lLgotICogTm90ZTogVGhlIHRvcCBwaXhlbCBpcyByZXNldCB0byAwIHdoZW4gbmV3IHRleHQgaXMgc2V0IGluIHRoZSB3aWRnZXQuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBpeGVsIG5ldyB0b3AgcGl4ZWwgb2Zmc2V0LiBNdXN0IGJlIGJldHdlZW4gMCBhbmQgCi0gKiAJKGdldExpbmVDb3VudCgpIC0gdmlzaWJsZSBsaW5lcyBwZXIgcGFnZSkgLyBnZXRMaW5lSGVpZ2h0KCkpLiBBbiBvdXQKLSAqIAlvZiByYW5nZSBvZmZzZXQgd2lsbCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseS4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIHZvaWQgc2V0VG9wUGl4ZWwoaW50IHBpeGVsKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpbnQgbGluZUNvdW50ID1jb250ZW50LmdldExpbmVDb3VudCgpOwotCWludCBoZWlnaHQgPSBnZXRDbGllbnRBcmVhKCkuaGVpZ2h0OwotCWludCBtYXhUb3BQaXhlbCA9IE1hdGgubWF4KDAsIGxpbmVDb3VudCAqIGdldFZlcnRpY2FsSW5jcmVtZW50KCkgLSBoZWlnaHQpOwotCQotCWlmIChnZXRDaGFyQ291bnQoKSA9PSAwKSB7Ci0JCXJldHVybjsKLQl9CQotCWlmIChwaXhlbCA8IDApIHsKLQkJcGl4ZWwgPSAwOwotCX0KLQllbHNlIAotCWlmIChwaXhlbCA+IG1heFRvcFBpeGVsKSB7Ci0JCXBpeGVsID0gbWF4VG9wUGl4ZWw7Ci0JfQotCXNldFZlcnRpY2FsU2Nyb2xsT2Zmc2V0KHBpeGVsLCB0cnVlKTsKLX0KLS8qKgotICogU2Nyb2xscyB0aGUgd2lkZ2V0IHZlcnRpY2FsbHkuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gcGl4ZWxPZmZzZXQgdGhlIG5ldyB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0Ci0gKiBAcGFyYW0gYWRqdXN0U2Nyb2xsQmFyIAotICogCXRydWU9IHRoZSBzY3JvbGwgdGh1bWIgd2lsbCBiZSBtb3ZlZCB0byByZWZsZWN0IHRoZSBuZXcgc2Nyb2xsIG9mZnNldC4KLSAqIAlmYWxzZSA9IHRoZSBzY3JvbGwgdGh1bWIgd2lsbCBub3QgYmUgbW92ZWQKLSAqIEByZXR1cm4gCi0gKgl0cnVlPXRoZSB3aWRnZXQgd2FzIHNjcm9sbGVkIAotICoJZmFsc2U9dGhlIHdpZGdldCB3YXMgbm90IHNjcm9sbGVkLCB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIG5vdCB2YWxpZC4KLSAqLwotYm9vbGVhbiBzZXRWZXJ0aWNhbFNjcm9sbE9mZnNldChpbnQgcGl4ZWxPZmZzZXQsIGJvb2xlYW4gYWRqdXN0U2Nyb2xsQmFyKSB7Ci0JUmVjdGFuZ2xlIGNsaWVudEFyZWE7Ci0JU2Nyb2xsQmFyIHZlcnRpY2FsQmFyID0gZ2V0VmVydGljYWxCYXIoKTsKLQkKLQlpZiAocGl4ZWxPZmZzZXQgPT0gdmVydGljYWxTY3JvbGxPZmZzZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlpZiAodmVydGljYWxCYXIgIT0gbnVsbCAmJiBhZGp1c3RTY3JvbGxCYXIpIHsKLQkJdmVydGljYWxCYXIuc2V0U2VsZWN0aW9uKHBpeGVsT2Zmc2V0KTsKLQl9Ci0JY2xpZW50QXJlYSA9IGdldENsaWVudEFyZWEoKTsKLQlzY3JvbGwoCi0JCTAsIDAsIAkJCQkJCQkJCS8vIGRlc3RpbmF0aW9uIHgsIHkKLQkJMCwgcGl4ZWxPZmZzZXQgLSB2ZXJ0aWNhbFNjcm9sbE9mZnNldCwJLy8gc291cmNlIHgsIHkKLQkJY2xpZW50QXJlYS53aWR0aCwgY2xpZW50QXJlYS5oZWlnaHQsIHRydWUpOwotCi0JdmVydGljYWxTY3JvbGxPZmZzZXQgPSBwaXhlbE9mZnNldDsKLQljYWxjdWxhdGVUb3BJbmRleCgpOwotCWludCBvbGRDb2x1bW5YID0gY29sdW1uWDsKLQlzZXRDYXJldExvY2F0aW9uKCk7Ci0JLy8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgaG9yaXpvbnRhbCBjYXJldCBpbmRleAotCWNvbHVtblggPSBvbGRDb2x1bW5YOwotCXJldHVybiB0cnVlOwotfQotLyoqCi0gKiBTY3JvbGxzIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW50byB2aWV3LgotICogPHA+Ci0gKiAKLSAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgdGhhdCBzaG91bGQgYmUgbWFkZSB2aXNpYmxlLgotICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdGhhdCBzaG91bGQgYmUgbWFkZSB2aXNpYmxlLiBSZWxhdGl2ZSB0byB0aGUKLSAqCWZpcnN0IGxpbmUgaW4gdGhlIGRvY3VtZW50LgotICogQHJldHVybiAKLSAqCXRydWU9dGhlIHdpZGdldCB3YXMgc2Nyb2xsZWQgdG8gbWFrZSB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHZpc2libGUuIAotICoJZmFsc2U9dGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpcyBhbHJlYWR5IHZpc2libGUsIHRoZSB3aWRnZXQgd2FzIAotICoJbm90IHNjcm9sbGVkLiAJCi0gKi8KLWJvb2xlYW4gc2hvd0xvY2F0aW9uKGludCB4LCBpbnQgbGluZSkgewotCWludCBjbGllbnRBcmVhV2lkdGggPSBnZXRDbGllbnRBcmVhKCkud2lkdGggLSBsZWZ0TWFyZ2luOwotCWludCB2ZXJ0aWNhbEluY3JlbWVudCA9IGdldFZlcnRpY2FsSW5jcmVtZW50KCk7Ci0JaW50IGhvcml6b250YWxJbmNyZW1lbnQgPSBjbGllbnRBcmVhV2lkdGggLyA0OwotCWJvb2xlYW4gc2Nyb2xsZWQgPSBmYWxzZTsJCQotCQotCWlmICh4IDwgbGVmdE1hcmdpbikgewotCQkvLyBhbHdheXMgbWFrZSAxLzQgb2YgYSBwYWdlIHZpc2libGUKLQkJeCA9IE1hdGgubWF4KGhvcml6b250YWxTY3JvbGxPZmZzZXQgKiAtMSwgeCAtIGhvcml6b250YWxJbmNyZW1lbnQpOwkKLQkJc2Nyb2xsZWQgPSBzY3JvbGxIb3Jpem9udGFsQmFyKHgpOwotCX0KLQllbHNlIAotCWlmICh4ID49IGNsaWVudEFyZWFXaWR0aCkgewotCQkvLyBhbHdheXMgbWFrZSAxLzQgb2YgYSBwYWdlIHZpc2libGUKLQkJeCA9IE1hdGgubWluKGxpbmVDYWNoZS5nZXRXaWR0aCgpIC0gaG9yaXpvbnRhbFNjcm9sbE9mZnNldCwgeCArIGhvcml6b250YWxJbmNyZW1lbnQpOwotCQlzY3JvbGxlZCA9IHNjcm9sbEhvcml6b250YWxCYXIoeCAtIGNsaWVudEFyZWFXaWR0aCk7Ci0JfQotCWlmIChsaW5lIDwgdG9wSW5kZXgpIHsKLQkJc2Nyb2xsZWQgPSBzZXRWZXJ0aWNhbFNjcm9sbE9mZnNldChsaW5lICogdmVydGljYWxJbmNyZW1lbnQsIHRydWUpOwotCX0KLQllbHNlCi0JaWYgKGxpbmUgPiBnZXRCb3R0b21JbmRleCgpKSB7Ci0JCXNjcm9sbGVkID0gc2V0VmVydGljYWxTY3JvbGxPZmZzZXQoKGxpbmUgKyAxKSAqIHZlcnRpY2FsSW5jcmVtZW50IC0gZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCwgdHJ1ZSk7Ci0JfQotCXJldHVybiBzY3JvbGxlZDsKLX0KLS8qKgotICogU2V0cyB0aGUgY2FyZXQgbG9jYXRpb24gYW5kIHNjcm9sbHMgdGhlIGNhcmV0IG9mZnNldCBpbnRvIHZpZXcuCi0gKi8KLXZvaWQgc2hvd0NhcmV0KCkgewotCWludCBjYXJldExpbmUgPSBjb250ZW50LmdldExpbmVBdE9mZnNldChjYXJldE9mZnNldCk7Ci0JCi0Jc2hvd0NhcmV0KGNhcmV0TGluZSk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGNhcmV0IGxvY2F0aW9uIGFuZCBzY3JvbGxzIHRoZSBjYXJldCBvZmZzZXQgaW50byB2aWV3LgotICovCi12b2lkIHNob3dDYXJldChpbnQgY2FyZXRMaW5lKSB7Ci0JaW50IGxpbmVPZmZzZXQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZShjYXJldExpbmUpOwotCVN0cmluZyBsaW5lID0gY29udGVudC5nZXRMaW5lKGNhcmV0TGluZSk7Ci0JaW50IG9mZnNldEluTGluZSA9IGNhcmV0T2Zmc2V0IC0gbGluZU9mZnNldDsKLQlpbnQgbmV3Q2FyZXRYID0gZ2V0WEF0T2Zmc2V0KGxpbmUsIGNhcmV0TGluZSwgb2Zmc2V0SW5MaW5lKTsJCi0JYm9vbGVhbiBzY3JvbGxlZCA9IHNob3dMb2NhdGlvbihuZXdDYXJldFgsIGNhcmV0TGluZSk7Ci0JYm9vbGVhbiBzZXRXcmFwQ2FyZXRMb2NhdGlvbiA9IGZhbHNlOwotCUNhcmV0IGNhcmV0ID0gZ2V0Q2FyZXQoKTsKLQotCWlmICh3b3JkV3JhcCAmJiBjYXJldCAhPSBudWxsKSB7Ci0JCWludCBjYXJldFkgPSBjYXJldC5nZXRMb2NhdGlvbigpLnk7Ci0JCWlmICgoY2FyZXRZICsgdmVydGljYWxTY3JvbGxPZmZzZXQpIC8gZ2V0VmVydGljYWxJbmNyZW1lbnQoKSAtIDEgIT0gY2FyZXRMaW5lKSB7Ci0JCQlzZXRXcmFwQ2FyZXRMb2NhdGlvbiA9IHRydWU7Ci0JCX0KLQl9Ci0JaWYgKCFzY3JvbGxlZCB8fCBzZXRXcmFwQ2FyZXRMb2NhdGlvbikgewotCQkvLyBzZXQgdGhlIGNhcmV0IGxvY2F0aW9uIGlmIGEgc2Nyb2xsIG9wZXJhdGlvbiBkaWQgbm90IHNldCBpdCAoYXMgYSAKLQkJLy8gc2lkZWVmZmVjdCBvZiBzY3JvbGxpbmcpIG9yIHdoZW4gaW4gd29yZCB3cmFwIG1vZGUgYW5kIHRoZSBjYXJldCAKLQkJLy8gbGluZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgKGkuZS4sIGJlY2F1c2UgZ2V0V3JhcENhcmV0TGluZSBkb2VzIAotCQkvLyBub3QgcmV0dXJuIHRoZSBkZXNpcmVkIGxpbmUgY2F1c2luZyBzY3JvbGxpbmcgdG8gbm90IHNldCBpdCBjb3JyZWN0bHkpCi0JCXNldENhcmV0TG9jYXRpb24obmV3Q2FyZXRYLCBjYXJldExpbmUsIGdldENhcmV0RGlyZWN0aW9uKCkpOwotCX0KLX0KLS8qKgotICogU2Nyb2xscyB0aGUgc3BlY2lmaWVkIG9mZnNldCBpbnRvIHZpZXcuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IG9mZnNldCB0aGF0IHNob3VsZCBiZSBzY29sbGVkIGludG8gdmlldwotICovCi12b2lkIHNob3dPZmZzZXQoaW50IG9mZnNldCkgewotCWludCBsaW5lID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQob2Zmc2V0KTsKLQlpbnQgbGluZU9mZnNldCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGxpbmUpOwotCWludCBvZmZzZXRJbkxpbmUgPSBvZmZzZXQgLSBsaW5lT2Zmc2V0OwotCVN0cmluZyBsaW5lVGV4dCA9IGNvbnRlbnQuZ2V0TGluZShsaW5lKTsKLQlpbnQgeEF0T2Zmc2V0ID0gZ2V0WEF0T2Zmc2V0KGxpbmVUZXh0LCBsaW5lLCBvZmZzZXRJbkxpbmUpOwotCQotCXNob3dMb2NhdGlvbih4QXRPZmZzZXQsIGxpbmUpOwkKLX0KLS8qKgotLyoqCi0gKiBTY3JvbGxzIHRoZSBzZWxlY3Rpb24gaW50byB2aWV3LiAgVGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uIHdpbGwgYmUgc2Nyb2xsZWQgaW50bwotICogdmlldy4gIE5vdGUgdGhhdCBpZiBhIHJpZ2h0LXRvLWxlZnQgc2VsZWN0aW9uIGV4aXN0cywgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uIGlzIHRoZQotICogdmlzdWFsIGJlZ2lubmluZyBvZiB0aGUgc2VsZWN0aW9uIChpLmUuLCB3aGVyZSB0aGUgY2FyZXQgaXMgbG9jYXRlZCkuCi0gKiA8cD4KLSAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlib29sZWFuIHNlbGVjdGlvbkZpdHM7Ci0JaW50IHN0YXJ0T2Zmc2V0LCBzdGFydExpbmUsIHN0YXJ0WCwgZW5kT2Zmc2V0LCBlbmRMaW5lLCBlbmRYLCBvZmZzZXRJbkxpbmU7Ci0KLQkvLyBpcyBzZWxlY3Rpb24gZnJvbSByaWdodC10by1sZWZ0PwotCWJvb2xlYW4gcmlnaHRUb0xlZnQgPSBjYXJldE9mZnNldCA9PSBzZWxlY3Rpb24ueDsKLQotCWlmIChyaWdodFRvTGVmdCkgewotCQlzdGFydE9mZnNldCA9IHNlbGVjdGlvbi55OwotCQllbmRPZmZzZXQgPSBzZWxlY3Rpb24ueDsKLQl9IGVsc2UgewotCQlzdGFydE9mZnNldCA9IHNlbGVjdGlvbi54OwotCQllbmRPZmZzZXQgPSBzZWxlY3Rpb24ueTsKLQl9Ci0JCi0JLy8gY2FsY3VsYXRlIHRoZSBsb2dpY2FsIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGZvciB0aGUgc2VsZWN0aW9uCi0Jc3RhcnRMaW5lID0gY29udGVudC5nZXRMaW5lQXRPZmZzZXQoc3RhcnRPZmZzZXQpOwotCW9mZnNldEluTGluZSA9IHN0YXJ0T2Zmc2V0IC0gY29udGVudC5nZXRPZmZzZXRBdExpbmUoc3RhcnRMaW5lKTsKLQlzdGFydFggPSBnZXRYQXRPZmZzZXQoY29udGVudC5nZXRMaW5lKHN0YXJ0TGluZSksIHN0YXJ0TGluZSwgb2Zmc2V0SW5MaW5lKTsJCi0JZW5kTGluZSAgPSBjb250ZW50LmdldExpbmVBdE9mZnNldChlbmRPZmZzZXQpOwotCW9mZnNldEluTGluZSA9IGVuZE9mZnNldCAtIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKGVuZExpbmUpOwotCWVuZFggPSBnZXRYQXRPZmZzZXQoY29udGVudC5nZXRMaW5lKGVuZExpbmUpLCBlbmRMaW5lLCBvZmZzZXRJbkxpbmUpOwkKLQotCS8vIGNhbiB0aGUgc2VsZWN0aW9uIGJlIGZ1bGx5IGRpc3BsYXllZCB3aXRoaW4gdGhlIHdpZGdldCdzIHZpc2libGUgd2lkdGg/Ci0JaW50IHcgPSBnZXRDbGllbnRBcmVhKCkud2lkdGg7Ci0JaWYgKHJpZ2h0VG9MZWZ0KSB7Ci0JCXNlbGVjdGlvbkZpdHMgPSBzdGFydFggLSBlbmRYIDw9IHc7Ci0JfSBlbHNlIHsKLQkJc2VsZWN0aW9uRml0cyA9IGVuZFggLSBzdGFydFggPD0gdzsKLQl9Ci0JCi0JaWYgKHNlbGVjdGlvbkZpdHMpIHsKLQkJLy8gc2hvdyBhcyBtdWNoIG9mIHRoZSBzZWxlY3Rpb24gYXMgcG9zc2libGUgYnkgZmlyc3Qgc2hvd2luZwotCQkvLyB0aGUgc3RhcnQgb2YgdGhlIHNlbGVjdGlvbgotCQlzaG93TG9jYXRpb24oc3RhcnRYLCBzdGFydExpbmUpOwotCQkvLyBlbmRYIHZhbHVlIGNvdWxkIGNoYW5nZSBpZiBzaG93aW5nIHN0YXJ0WCBjYXVzZWQgYSBzY3JvbGwgdG8gb2NjdXIKLQkJZW5kWCA9IGdldFhBdE9mZnNldChjb250ZW50LmdldExpbmUoZW5kTGluZSksIGVuZExpbmUsIG9mZnNldEluTGluZSk7CQotCQlzaG93TG9jYXRpb24oZW5kWCwgZW5kTGluZSk7Ci0JfSBlbHNlIHsKLQkJLy8ganVzdCBzaG93IHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbiBzaW5jZSB0aGUgc2VsZWN0aW9uIHN0YXJ0IAotCQkvLyB3aWxsIG5vdCBiZSB2aXNpYmxlCi0JCXNob3dMb2NhdGlvbihlbmRYLCBlbmRMaW5lKTsKLQl9CSAKLX0KLWJvb2xlYW4gaXNCaWRpQ2FyZXQoKSB7Ci0JcmV0dXJuIEJpZGlVdGlsLmlzQmlkaVBsYXRmb3JtKCk7Ci19Ci0vKioKLSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBhbmQgY2FyZXQgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHRoZSB0ZXh0IGNoYW5nZS4KLSAqIElmIHRoZSBzZWxlY3Rpb24gaW50ZXJzZWN0cyB3aXRoIHRoZSByZXBsYWNlZCB0ZXh0LCB0aGUgc2VsZWN0aW9uIGlzIAotICogcmVzZXQgYW5kIHRoZSBjYXJldCBtb3ZlZCB0byB0aGUgZW5kIG9mIHRoZSBuZXcgdGV4dC4KLSAqIElmIHRoZSBzZWxlY3Rpb24gaXMgYmVoaW5kIHRoZSByZXBsYWNlZCB0ZXh0IGl0IGlzIG1vdmVkIHNvIHRoYXQgdGhlCi0gKiBzYW1lIHRleHQgcmVtYWlucyBzZWxlY3RlZC4gIElmIHRoZSBzZWxlY3Rpb24gaXMgYmVmb3JlIHRoZSByZXBsYWNlZCB0ZXh0IAotICogaXQgaXMgbGVmdCB1bmNoYW5nZWQuCi0gKiA8cD4KLSAqCi0gKiBAcGFyYW0gc3RhcnRPZmZzZXQgb2Zmc2V0IG9mIHRoZSB0ZXh0IGNoYW5nZQotICogQHBhcmFtIHJlcGxhY2VkTGVuZ3RoIGxlbmd0aCBvZiB0ZXh0IGJlaW5nIHJlcGxhY2VkCi0gKiBAcGFyYW0gbmV3TGVuZ3RoIGxlbmd0aCBvZiBuZXcgdGV4dAotICovCi12b2lkIHVwZGF0ZVNlbGVjdGlvbihpbnQgc3RhcnRPZmZzZXQsIGludCByZXBsYWNlZExlbmd0aCwgaW50IG5ld0xlbmd0aCkgewotCWlmIChzZWxlY3Rpb24ueSA8PSBzdGFydE9mZnNldCkgewotCQkvLyBzZWxlY3Rpb24gZW5kcyBiZWZvcmUgdGV4dCBjaGFuZ2UKLQkJcmV0dXJuOwotCX0KLQlpZiAoc2VsZWN0aW9uLnggPCBzdGFydE9mZnNldCkgewotCQkvLyBjbGVhciBzZWxlY3Rpb24gZnJhZ21lbnQgYmVmb3JlIHRleHQgY2hhbmdlCi0JCWludGVybmFsUmVkcmF3UmFuZ2Uoc2VsZWN0aW9uLngsIHN0YXJ0T2Zmc2V0IC0gc2VsZWN0aW9uLngsIHRydWUpOwotCX0KLQlpZiAoc2VsZWN0aW9uLnkgPiBzdGFydE9mZnNldCArIHJlcGxhY2VkTGVuZ3RoICYmIHNlbGVjdGlvbi54IDwgc3RhcnRPZmZzZXQgKyByZXBsYWNlZExlbmd0aCkgewotCQkvLyBjbGVhciBzZWxlY3Rpb24gZnJhZ21lbnQgYWZ0ZXIgdGV4dCBjaGFuZ2UuCi0JCS8vIGRvIHRoaXMgb25seSB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgYWN0dWFsbHkgYWZmZWN0ZWQgYnkgdGhlIAotCQkvLyBjaGFuZ2UuIFNlbGVjdGlvbiBpcyBvbmx5IGFmZmVjdGVkIGlmIGl0IGludGVyc2VjdHMgdGhlIGNoYW5nZSAoMUdEWTIxNykuCi0JCWludCBuZXROZXdMZW5ndGggPSBuZXdMZW5ndGggLSByZXBsYWNlZExlbmd0aDsKLQkJaW50IHJlZHJhd1N0YXJ0ID0gc3RhcnRPZmZzZXQgKyBuZXdMZW5ndGg7Ci0JCWludGVybmFsUmVkcmF3UmFuZ2UocmVkcmF3U3RhcnQsIHNlbGVjdGlvbi55ICsgbmV0TmV3TGVuZ3RoIC0gcmVkcmF3U3RhcnQsIHRydWUpOwotCX0KLQlpZiAoc2VsZWN0aW9uLnkgPiBzdGFydE9mZnNldCAmJiBzZWxlY3Rpb24ueCA8IHN0YXJ0T2Zmc2V0ICsgcmVwbGFjZWRMZW5ndGgpIHsKLQkJLy8gc2VsZWN0aW9uIGludGVyc2VjdHMgcmVwbGFjZWQgdGV4dC4gc2V0IGNhcmV0IGJlaGluZCB0ZXh0IGNoYW5nZQotCQlpbnRlcm5hbFNldFNlbGVjdGlvbihzdGFydE9mZnNldCArIG5ld0xlbmd0aCwgMCwgdHJ1ZSk7Ci0JCS8vIGFsd2F5cyB1cGRhdGUgdGhlIGNhcmV0IGxvY2F0aW9uLiBmaXhlcyAxRzhGT0RQCi0JCXNldENhcmV0TG9jYXRpb24oKTsKLQl9Ci0JZWxzZSB7Ci0JCS8vIG1vdmUgc2VsZWN0aW9uIHRvIGtlZXAgc2FtZSB0ZXh0IHNlbGVjdGVkCi0JCWludGVybmFsU2V0U2VsZWN0aW9uKHNlbGVjdGlvbi54ICsgbmV3TGVuZ3RoIC0gcmVwbGFjZWRMZW5ndGgsIHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLngsIHRydWUpOwotCQkvLyBhbHdheXMgdXBkYXRlIHRoZSBjYXJldCBsb2NhdGlvbi4gZml4ZXMgMUc4Rk9EUAotCQlzZXRDYXJldExvY2F0aW9uKCk7Ci0JfQkKLX0KLS8qKgotICogUmV3cmFwcyBhbGwgbGluZXMKLSAqIDxwPgotICogCi0gKiBAcGFyYW0gb2xkQ2xpZW50QXJlYVdpZHRoIGNsaWVudCBhcmVhIHdpZHRoIGJlZm9yZSByZXNpemUgCi0gKiAJb2NjdXJyZWQKLSAqLwotdm9pZCB3b3JkV3JhcFJlc2l6ZShpbnQgb2xkQ2xpZW50QXJlYVdpZHRoKSB7Ci0JV3JhcHBlZENvbnRlbnQgd3JhcHBlZENvbnRlbnQgPSAoV3JhcHBlZENvbnRlbnQpIGNvbnRlbnQ7Ci0JaW50IG5ld1RvcEluZGV4OwotCi0JLy8gYWxsIGxpbmVzIGFyZSB3cmFwcGVkIGFuZCBubyByZXdyYXAgcmVxdWlyZWQgaWYgd2lkZ2V0IGhhcyBhbHJlYWR5IAotCS8vIGJlZW4gdmlzaWJsZSwgY2xpZW50IGFyZWEgaXMgbm93IHdpZGVyIGFuZCB2aXN1YWwgKHdyYXBwZWQpIGxpbmUgCi0JLy8gY291bnQgZXF1YWxzIGxvZ2ljYWwgbGluZSBjb3VudC4KLQlpZiAob2xkQ2xpZW50QXJlYVdpZHRoICE9IDAgJiYgY2xpZW50QXJlYVdpZHRoID4gb2xkQ2xpZW50QXJlYVdpZHRoICYmCi0JCXdyYXBwZWRDb250ZW50LmdldExpbmVDb3VudCgpID09IGxvZ2ljYWxDb250ZW50LmdldExpbmVDb3VudCgpKSB7Ci0JCXJldHVybjsKLQl9Ci0Jd3JhcHBlZENvbnRlbnQud3JhcExpbmVzKCk7Ci0gICAgCi0JLy8gYWRqdXN0IHRoZSB0b3AgaW5kZXggc28gdGhhdCB0b3AgbGluZSByZW1haW5zIHRoZSBzYW1lCi0JbmV3VG9wSW5kZXggPSBjb250ZW50LmdldExpbmVBdE9mZnNldCh0b3BPZmZzZXQpOwotCS8vIHRvcE9mZnNldCBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0b3AgbGluZS4gdGhlcmVmb3JlIGl0IAotCS8vIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJlY2F1c2UgaW4gYSB3cmFwcGVkIGxpbmUgdGhpcyBpcyBhbHNvIAotCS8vIHRoZSBlbmQgb2YgdGhlIHByZWNlZWRpbmcgbGluZS4gIAotCWlmIChuZXdUb3BJbmRleCA8IGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgLSAxICYmCi0JCXRvcE9mZnNldCA9PSBjb250ZW50LmdldE9mZnNldEF0TGluZShuZXdUb3BJbmRleCArIDEpKSB7Ci0JCW5ld1RvcEluZGV4Kys7Ci0JfQotCWlmIChuZXdUb3BJbmRleCAhPSB0b3BJbmRleCkgewotCQlTY3JvbGxCYXIgdmVydGljYWxCYXIgPSBnZXRWZXJ0aWNhbEJhcigpOwotCQkvLyBhZGp1c3QgaW5kZXggYW5kIHBpeGVsIG9mZnNldCBtYW51YWxseSBpbnN0ZWFkIG9mIGNhbGxpbmcKLQkJLy8gc2V0VmVydGljYWxTY3JvbGxPZmZzZXQgYmVjYXVzZSB0aGUgd2lkZ2V0IGRvZXMgbm90IGFjdHVhbGx5IG5lZWQKLQkJLy8gdG8gYmUgc2Nyb2xsZWQuIGNhdXNlcyBmbGFzaCBvdGhlcndpc2UuCi0JCXZlcnRpY2FsU2Nyb2xsT2Zmc2V0ICs9IChuZXdUb3BJbmRleCAtIHRvcEluZGV4KSAqIGdldFZlcnRpY2FsSW5jcmVtZW50KCk7Ci0JCS8vIHZlcnRpY2FsU2Nyb2xsT2Zmc2V0IG1heSBiZWNvbWUgbmVnYXRpdmUgaWYgZmlyc3QgbGluZSB3YXMgCi0JCS8vIHBhcnRpYWxseSB2aXNpYmxlIGFuZCBzZWNvbmQgbGluZSB3YXMgdG9wIGxpbmUuIHByZXZlbnQgdGhpcyBmcm9tIAotCQkvLyBoYXBwZW5pbmcgdG8gZml4IDg1MDMuCi0JCWlmICh2ZXJ0aWNhbFNjcm9sbE9mZnNldCA8IDApIHsKLQkJCXZlcnRpY2FsU2Nyb2xsT2Zmc2V0ID0gMDsKLQkJfQotCQl0b3BJbmRleCA9IG5ld1RvcEluZGV4OwotCQl0b3BPZmZzZXQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZSh0b3BJbmRleCk7Ci0JCWlmICh2ZXJ0aWNhbEJhciAhPSBudWxsKSB7Ci0JCQl2ZXJ0aWNhbEJhci5zZXRTZWxlY3Rpb24odmVydGljYWxTY3JvbGxPZmZzZXQpOwotCQl9Ci0JfQotCS8vIGNhcmV0IG1heSBiZSBvbiBhIGRpZmZlcmVudCBsaW5lIGFmdGVyIGEgcmV3cmFwLgotCS8vIGNhbGwgc2V0Q2FyZXRMb2NhdGlvbiBhZnRlciBmaXhpbmcgdmVydGljYWwgc2Nyb2xsIG9mZnNldC4KLQlzZXRDYXJldExvY2F0aW9uKCk7ICAgIAotCS8vIHdvcmQgd3JhcCBtYXkgaGF2ZSBjaGFuZ2VkIG9uIG9uZSBvZiB0aGUgdmlzaWJsZSBsaW5lcwotCXN1cGVyLnJlZHJhdygpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci90ZXh0NC50eHQgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3RleHQ0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyMzcwMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3RleHQ0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLVBlc3F1aXNhIGZlaXRhIG5hIEFsZW1hbmhhLCB1bWEgZGFzIGVzY2FsYXMgZGUgQnVzaCBuYSBFdXJvcGEsIGNvbnN0YXRvdSBxdWUgbyBwcmVzaWRlbnRlIGFtZXJpY2FubyDpIGJhdGlkbyBlbSBwb3B1bGFyaWRhZGUgYXTpIHBvciBQdXRpbiwgbyBwcmVzaWRlbnRlIHJ1c3NvLCBjdWphIGltYWdlbSBleHRlcm5hIG7jbyDpIGRhcyBtZWxob3Jlcy4gIkJ1c2ggc/Mgbm9zIHRyYXogZ3VlcnJhcyIsIGRpc3NlIHVtIGRvcyBwb3B1bGFyZXMgZW50cmV2aXN0YWRvcyBwZWxhIHRlbGV2aXPjby4KLQotSG91dmUgZXNmb3LnbywgcG9yIHBhcnRlIGRlIGFtYm9zIG9zIGxhZG9zLCBlbSBtb3N0cmFyIGZlcmlkYXMgY2ljYXRyaXphZGFzLiBGb2kgcHJldmlhbWVudGUgYWNlcnRhZG8sIGVudHJlIGV1cm9wZXVzLCBxdWUgQnVzaCBu428gc2VyaWEgcHJlc3Npb25hZG8gZW0gdGVtYXMgcG9s6m1pY29zIGNvbW8gYSBhdXPqbmNpYSBkb3MgRXN0YWRvcyBVbmlkb3MgZG8gdHJhdGFkbyBkZSBLeW90byAoZGUgcmVkdefjbyBkYXMgZW1pc3P1ZXMgZGUgZ2FzZXMgdmVuZW5vc29zKSBlIGRvIFRyaWJ1bmFsIFBlbmFsIEludGVybmFjaW9uYWwsIGEgY2FyZ28gZGUgY3JpbWVzIGNvbnRyYSBhIGh1bWFuaWRhZGUuCi0KLU8gcXVlIHRlbSBhY2VudHVhZG8gZGl2aXP1ZXMgZW50cmUgRXVyb3BhIGUgRXN0YWRvcyBVbmlkb3MgdmFpIG11aXRvIGFs6W0sIGVtIHByb2Z1bmRpZGFkZSwgZGUgcXVlc3T1ZXMgZGUgc2VndXJhbudhIGNvbW8gSXJhcXVlIGUgSXLjLiBPcyBu+m1lcm9zIGRhIGNvbnN1bHRhIGFvcyBhbGVt42VzIHBvZGVtIGRhciBvIHRvbS4gQnVzaCBjb25zZWd1aXUgdW0gYm9tIG7tdmVsIGRlIGRp4WxvZ28gY29tIGFzIHByaW5jaXBhaXMgbGlkZXJhbudhcyBldXJvcOlpYXMuIENvbnRpbnVvdSBkZSBmb3JhLCBubyBlbnRhbnRvLCBkYXMgbWVudGVzIGUgY29yYef1ZXMgZG8gdmVsaG8gZSBjYWxlamFkbyBjb250aW5lbnRlLiBVbSBjb2x1bmlzdGEgZG8gIk5ldyBZb3JrIFRpbWVzIiwgVGhvbWFzIEZyaWVkbWFuLCB1bSBkb3MgcG91Y29zIGxpYmVyYWlzIGFtZXJpY2Fub3MgYSBhcG9pYXIgYSBpbnZhc+NvIGRvIElyYXF1ZSwgY29tIG8gYXJndW1lbnRvIGRlIHF1ZSBuZW0gdHVkbyBxdWUgQnVzaCBmYXog6SBydWltLCBjaGFtb3UgYSBFdXJvcGEgZGUgZW5vcm1lICJibHVlIHN0YXRlIgotCi1T428gImF6dWlzIiBvcyBFc3RhZG9zIHF1ZSB2b3RhbSBjb250cmEgb3MgcmVwdWJsaWNhbm9zLCBjb21vIE5vdmEgWW9yaywgcXVlIGRldmVyaWEgZGVjbGFyYXItc2UgaW5kZXBlbmRlbnRlIGRpYW50ZSBkYSBvbmRhIGNvbnNlcnZhZG9yYSBlIHJlcHJlc3NpdmEsIHNlZ3VuZG8gbyBlc2NyaXRvciBQYXVsIEF1c3Rlci4gRXN0YWRvcyBVbmlkb3MgZSBFdXJvcGEgc2UgZGViYXRlbSBjb20gY2hvcXVlcyBjdWx0dXJhaXMgcXVlIHNlIHRvcm5hbSBhZ3Vkb3MgZSBpc3NvIHByb2R1eiBtYWlzIGhvc3RpbGlkYWRlcyBkbyBxdWUgbyB1bmlsYXRlcmFsaXNtbyBkZSBCdXNoLiBGcmllZG1hbiBvYnNlcnZhIHF1ZSBwZXJkZXUgdmln6m5jaWEgYSByZXNzYWx2YSBldXJvcOlpYSBkZSBxdWUgc2VyIGNvbnRyYSBCdXNoIG7jbyDpIHNlciBhbnRpLWFtZXJpY2Fuby4gVGFsdmV6IGlzc28gc2UgYXBsaWNhc3NlIGFvIHByaW1laXJvIG1hbmRhdG8sIGNvbnNlZ3VpZG8gZGUgZm9ybWEgZHV2aWRvc2EsIHNlbSBtYWlvcmlhIGRlIHZvdG9zIHBvcHVsYXJlcy4gTuNvIOkgbyBjYXNvIGRvIHNlZ3VuZG8gbWFuZGF0by4KLQotQnVzaCByZWVsZWdldS1zZSBkZSBmb3JtYSBjYXRlZ/NyaWNhIGUgYSBkaXN0aW7n428gc2UgdG9ybmEgdW0gcHJvYmxlbWEuIERvaXMgZmF0b3MgcmVjZW50ZXMgZONvIHVtYSBpZOlpYSBkbyBjaG9xdWUgY3VsdHVyYWwgZW50cmUgRXVyb3BhIGUgRXN0YWRvcyBVbmlkb3MuIE51bSBwYWNvdGUgZGUgcmVmb3JtYXMgc29jaWFpcyBvIGdvdmVybm8gZXNwYW5ob2wgcGFzc291IGEgcmVjb25oZWNlciBvcyBjYXNhbWVudG9zIGdheXMuIE5vIEVzdGFkbyBhbWVyaWNhbm8gZGEgVmlyZ2luaWEgYSBhc3NlbWJs6WlhIGVzdGFkdWFsIGRlY2lkaXUgcXVlIHNlcmlhIG11bHRhZG8gZW0gNTAgZPNsYXJlcywgcG9yICJjb21wb3J0YW1lbnRvIGluZGVjZW50ZSIsIHF1ZW0gdXNhc3NlICJqZWFucyIgY2HtZG9zIG5hIGNpbnR1cmEgZW0gbu12ZWlzIHF1ZSBwZXJtaXRpc3NlbSB2ZXIgcm91cGFzIGRlIGJhaXhvLiBPIHZvdG8gY29udHLhcmlvIGRvIFNlbmFkbyBlc3RhZHVhbCBu428gZWxpbWlub3UgbyBmYXRvIGRlIHF1ZSBmb2kgcG9zc+12ZWwgY29uc3RydWlyIGZvcnRlIGNvbGlnYefjbyBmYXZvcuF2ZWwg4CBwdW5p5+NvLiBPIGdvdmVybm8gQnVzaCBpbmNlbnRpdmEsIGVudHJlIG91dHJvcyAibW9yYWwgdmFsdWVzIiwgYSB2aXJnaW5kYWRlIHBy6S1udXBjaWFsLgotCi1NZXNtbyBvcyBldXJvcGV1cyBtYWlzIGNvbnNlcnZhZG9yZXMgbuNvIHNlIGFsaW5oYW0gYW8gbW9kbyBjb21vIEJ1c2gsIGUgc2V1cyBlbGVpdG9yZXMgZG9taW5hbnRlcyBuYXMgdXJuYXMsIGVuY2FyYW0gYSByZWxpZ2njbywgYXJtYXMgZGUgZm9nbywgaG9tb3NzZXh1YWxpc21vLCBwZW5hIGRlIG1vcnRlLCBzZWd1cmlkYWRlIHNvY2lhbCwgYW1iaWVudGUgZSBhYm9ydG8uIEJ1c2ggdGVybWluYSBzZXVzIGRpc2N1cnNvcyBjb20gIkdvZCBibGVzcyB5b3UiLCBvIERldXMgdGUgYWJlbudvZSwgY29pc2EgaW5pbWFnaW7hdmVsIG51bSBkaXJpZ2VudGUgZXVyb3BldS4gRW0gcGVsbyBtZW5vcyAxNyBFc3RhZG9zIGFtZXJpY2Fub3MsIHJldmVsYSBhc3N1c3RhZG8gbyAiTmF0aW9uYWwgQ2VudGVyIGZvciBTY2llbmNlIEVkdWNhdGlvbiIsIGNp6m5jaWEgZSByZWxpZ2njbyBzZSBjb25mcm9udGFtIG5hIG1vbnRhZ2VtIGRlIGN1cnLtY3Vsb3MgZXNjb2xhcmVzLiBFbnRyYSBlbSBjZW5hLCBjb20gZm9ydGUgY29iZXJ0dXJhIHBvbO10aWNhLCBvICJpbnRlbGxpZ2VudCBkZXNpZ24iLCB2ZXJz428gbW9kZXJuYSBkbyBjcmlhY2lvbmlzbW8sIGRvIERldXMgY3Jpb3UgbyBtdW5kbyBlbSBzZXRlIGRpYXMsIG5vIG9yaWdpbmFsLgotCi1BIHRlb3JpYSBkYSBldm9sdefjbywgZGUgRGFyd2luLCBwZedhIGNpZW507WZpY2EsIGlyaWEgcGVyZGVuZG8gbyBjZXJ0aWZpY2FkbyBkZSB2YWxpZGFkZSBlc2NvbGFyLiBSZWZlcmVuZG8gbm8gS2Fuc2FzLCBubyBjb3Jh5+NvIGRvcyBFc3RhZG9zIFVuaWRvcywgYmFpeGEgYSBndWlsaG90aW5hLiBQb3IgaW5pY2lhdGl2YSBkYSBGcmFu52EgZSBkZSBvdXRyb3MgdmludGUgcGHtc2VzIHRyYW1pdGEgbmEgVW5lc2NvIHVtYSBjb252ZW7n428gaW50ZXJuYWNpb25hbCBkZSBwcm90ZefjbyBkYSBkaXZlcnNpZGFkZSBjdWx0dXJhbC4gT3MgRXN0YWRvcyBVbmlkb3MsIGNvbSByZWN1cnNvcyBzdWZpY2llbnRlcyBwYXJhIG1vZGVsYXIgYSBwb3AtY3VsdHVyYSB1bml2ZXJzYWwsIHPjbyBhZ3Jlc3NpdmFtZW50ZSBjb250cmEuIE7jbyBzZSBmYWxvdSBuaXNzbyBuYSB2aXNpdGEgZGUgQnVzaCDgIEV1cm9wYS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3RleHRCYWNrZ3JvdW5kLmljbyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdGV4dEJhY2tncm91bmQuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTU5YmVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdGV4dEJhY2tncm91bmQuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci90ZXh0Rm9yZWdyb3VuZC5pY28gYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3RleHRGb3JlZ3JvdW5kLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxNDNmMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3RleHRGb3JlZ3JvdW5kLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lLmljbyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5YWY5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3VuZGVybGluZS5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYTBiMWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBIZWxsbyBXb3JsZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjc0ZWI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBEcmF3IHVzaW5nIHRyYW5zZm9ybWF0aW9ucywgcGF0aHMgYW5kIGFscGhhIGJsZW5kaW5nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiQWR2YW5jZWQgR3JhcGhpY3MiKTsKLQkJRm9udERhdGEgZmQgPSBzaGVsbC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJZmluYWwgRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCA2MCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgNjQwLCA0ODApOwotCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxPdmFsKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7CQkJCQotCQkJCVRyYW5zZm9ybSB0ciA9IG5ldyBUcmFuc2Zvcm0oZGlzcGxheSk7Ci0JCQkJdHIudHJhbnNsYXRlKDUwLCAxMjApOwotCQkJCXRyLnJvdGF0ZSgtMzApOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIDAsIDAsIHJlY3Qud2lkdGggLyAyLCByZWN0LmhlaWdodCAvIDIpOwotCQkJCWdjLnNldEFscGhhKDEwMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyKTsKLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJCQlwYXRoLmFkZFN0cmluZygiU1dUIiwgMCwgMCwgZm9udCk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQkJCWdjLmZpbGxQYXRoKHBhdGgpOwotCQkJCWdjLmRyYXdQYXRoKHBhdGgpOwotCQkJCXRyLmRpc3Bvc2UoKTsKLQkJCQlwYXRoLmRpc3Bvc2UoKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUocmVjdC53aWR0aCAvIDIsIHJlY3QuaGVpZ2h0IC8gMikpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmZjgwYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRm9udCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGxhcmdlIGZvbnQgZm9yIHVzZSBieSBhIHRleHQgd2lkZ2V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkpOwotCXRleHQuc2V0Qm91bmRzKDEwLCAxMCwgMTUwLCAxNTApOwotCUZvbnQgaW5pdGlhbEZvbnQgPSB0ZXh0LmdldEZvbnQoKTsKLQlGb250RGF0YVtdIGZvbnREYXRhID0gaW5pdGlhbEZvbnQuZ2V0Rm9udERhdGEoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWZvbnREYXRhW2ldLnNldEhlaWdodCgyNCk7Ci0JfQotCUZvbnQgbmV3Rm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZvbnREYXRhKTsKLQl0ZXh0LnNldEZvbnQobmV3Rm9udCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JbmV3Rm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MGU5NzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IGEgdGFibGUgaXRlbSAoYXQgYW4gaW5kZXgpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FLCAxKTsKLQlpdGVtLnNldFRleHQgKCIqKiogTmV3IEl0ZW0gIiArIHRhYmxlLmluZGV4T2YgKGl0ZW0pICsgIiAqKioiKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMDU2YjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBpbnNlcnQgYSB0cmVlIGl0ZW0gKGF0IGFuIGluZGV4KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRyZWUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FLCAxKTsKLQlUcmVlSXRlbSBbXSBpdGVtcyA9IHRyZWUuZ2V0SXRlbXMgKCk7Ci0JaW50IGluZGV4ID0gMDsKLQl3aGlsZSAoaW5kZXggPCBpdGVtcy5sZW5ndGggJiYgaXRlbXMgW2luZGV4XSAhPSBpdGVtKSBpbmRleCsrOwotCWl0ZW0uc2V0VGV4dCAoIioqKiBOZXcgSXRlbSAiICsgaW5kZXggKyAiICoqKiIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjczZmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIHRhYmxlIGl0ZW0gdGV4dAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwMyB7Ci0KLXN0YXRpYyBjaGFyIGNvbnRlbnQgPSAnYSc7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDI0MCk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQl0YWJsZS5zZXRCb3VuZHMoMTAsIDEwLCAxNjAsIDE2MCk7Ci0KLQlmaW5hbCBUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bNF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSkuc2V0V2lkdGgoNDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJcG9wdWxhdGVJdGVtKGl0ZW1zW2ldKTsKLQl9Ci0KLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJDaGFuZ2UiKTsKLQlidXR0b24ucGFjaygpOwotCWJ1dHRvbi5zZXRMb2NhdGlvbigxMCwgMTgwKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCQlwb3B1bGF0ZUl0ZW0oaXRlbXNbaV0pOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBwb3B1bGF0ZUl0ZW0oVGFibGVJdGVtIGl0ZW0pIHsKLQlTdHJpbmcgc3RyaW5nQ29udGVudCA9IFN0cmluZy52YWx1ZU9mKGNvbnRlbnQpOwotCWl0ZW0uc2V0VGV4dCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCXN0cmluZ0NvbnRlbnQsCi0JCQlzdHJpbmdDb250ZW50LAotCQkJc3RyaW5nQ29udGVudCwKLQkJCXN0cmluZ0NvbnRlbnQgfSk7Ci0JY29udGVudCsrOwotCWlmIChjb250ZW50ID4gJ3onKSBjb250ZW50ID0gJ2EnOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDM4ZDIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNwbGFzaCBzY3JlZW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgaW50IFtdIGNvdW50ID0gbmV3IGludCBbXSB7NH07Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMzAwLCAzMDApOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0NZQU4pKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlLmdldEJvdW5kcygpKTsKLQlnYy5kcmF3VGV4dCgiU3BsYXNoIFNjcmVlbiIsIDEwLCAxMCk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIFNoZWxsIHNwbGFzaCA9IG5ldyBTaGVsbChTV1QuT05fVE9QKTsKLQlmaW5hbCBQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc3BsYXNoLCBTV1QuTk9ORSk7Ci0JYmFyLnNldE1heGltdW0oY291bnRbMF0pOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNwbGFzaCwgU1dULk5PTkUpOwotCWxhYmVsLnNldEltYWdlKGltYWdlKTsKLQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0Jc3BsYXNoLnNldExheW91dChsYXlvdXQpOwotCUZvcm1EYXRhIGxhYmVsRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlsYWJlbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JbGFiZWxEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsRGF0YSk7Ci0JRm9ybURhdGEgcHJvZ3Jlc3NEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCXByb2dyZXNzRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCA1KTsKLQlwcm9ncmVzc0RhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTUpOwotCXByb2dyZXNzRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTUpOwotCWJhci5zZXRMYXlvdXREYXRhKHByb2dyZXNzRGF0YSk7Ci0Jc3BsYXNoLnBhY2soKTsKLQlSZWN0YW5nbGUgc3BsYXNoUmVjdCA9IHNwbGFzaC5nZXRCb3VuZHMoKTsKLQlSZWN0YW5nbGUgZGlzcGxheVJlY3QgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCWludCB4ID0gKGRpc3BsYXlSZWN0LndpZHRoIC0gc3BsYXNoUmVjdC53aWR0aCkgLyAyOwotCWludCB5ID0gKGRpc3BsYXlSZWN0LmhlaWdodCAtIHNwbGFzaFJlY3QuaGVpZ2h0KSAvIDI7Ci0Jc3BsYXNoLnNldExvY2F0aW9uKHgsIHkpOwotCXNwbGFzaC5vcGVuKCk7Ci0JZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTaGVsbCBbXSBzaGVsbHMgPSBuZXcgU2hlbGxbY291bnRbMF1dOwotCQkJZm9yIChpbnQgaT0wOyBpPGNvdW50WzBdOyBpKyspIHsKLQkJCQlzaGVsbHMgW2ldID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCXNoZWxscyBbaV0uc2V0U2l6ZSAoMzAwLCAzMDApOwotCQkJCXNoZWxscyBbaV0uYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJCQktLWNvdW50WzBdOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYmFyLnNldFNlbGVjdGlvbihpKzEpOwotCQkJCXRyeSB7VGhyZWFkLnNsZWVwKDEwMDApO30gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQotCQkJfQotCQkJc3BsYXNoLmNsb3NlKCk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y291bnRbMF07IGkrKykgewotCQkJCXNoZWxscyBbaV0ub3BlbigpOwotCQkJfQotCQl9Ci0JfSk7Ci0Jd2hpbGUgKGNvdW50IFswXSAhPSAwKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyM2QzMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyYW0gZXhhbXBsZSBzbmlwcGV0OiBpbnZva2UgYW4gZXh0ZXJuYWwgYmF0Y2ggZmlsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVByb2dyYW0ubGF1bmNoKCJjOlxcY3lnd2luXFxjeWd3aW4uYmF0Iik7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzNhY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IGEgdGFibGUgY29sdW1uIChhdCBhbiBpbmRleCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQgKCJDb2x1bW4gIiArIGkpOwotCX0KLQlmaW5hbCBUYWJsZUNvbHVtbiBbXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucyAoKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGo9MDsgajxjb2x1bW5zLmxlbmd0aDsgaisrKSB7Ci0JCQlpdGVtLnNldFRleHQgKGosICJJdGVtICIgKyBpKTsKLQkJfQotCX0KLQlmb3IgKGludCBpPTA7IGk8Y29sdW1ucy5sZW5ndGg7IGkrKykgY29sdW1ucyBbaV0ucGFjayAoKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlmaW5hbCBpbnQgaW5kZXggPSAxOwotCWJ1dHRvbi5zZXRUZXh0ICgiSW5zZXJ0IENvbHVtbiAiICsgaW5kZXggKyAiYSIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQljb2x1bW4uc2V0VGV4dCAoIkNvbHVtbiAiICsgaW5kZXggKyAiYSIpOwotCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMgKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoaW5kZXgsICJJdGVtICIgKyBpICsgImEiKTsKLQkJCX0KLQkJCWNvbHVtbi5wYWNrICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxMzY5OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyoKLSAqIFNhc2ggZXhhbXBsZSBzbmlwcGV0OiBpbXBsZW1lbnQgYSBzaW1wbGUgc3BsaXR0ZXIgKHdpdGggYSAyMCBwaXhlbCBsaW1pdCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCJCdXR0b24gMSIpOwotCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoIChzaGVsbCwgU1dULlZFUlRJQ0FMKTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRUZXh0ICgiQnV0dG9uIDIiKTsKLQkKLQlmaW5hbCBGb3JtTGF5b3V0IGZvcm0gPSBuZXcgRm9ybUxheW91dCAoKTsKLQlzaGVsbC5zZXRMYXlvdXQgKGZvcm0pOwotCQotCUZvcm1EYXRhIGJ1dHRvbjFEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWJ1dHRvbjFEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjFEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50IChzYXNoLCAwKTsKLQlidXR0b24xRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjFEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24xLnNldExheW91dERhdGEgKGJ1dHRvbjFEYXRhKTsKLQotCWZpbmFsIGludCBsaW1pdCA9IDIwLCBwZXJjZW50ID0gNTA7Ci0JZmluYWwgRm9ybURhdGEgc2FzaERhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0Jc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAocGVyY2VudCwgMCk7Ci0Jc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlzYXNoRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0Jc2FzaC5zZXRMYXlvdXREYXRhIChzYXNoRGF0YSk7Ci0Jc2FzaC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSBzYXNoUmVjdCA9IHNhc2guZ2V0Qm91bmRzICgpOwotCQkJUmVjdGFuZ2xlIHNoZWxsUmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQlpbnQgcmlnaHQgPSBzaGVsbFJlY3Qud2lkdGggLSBzYXNoUmVjdC53aWR0aCAtIGxpbWl0OwotCQkJZS54ID0gTWF0aC5tYXggKE1hdGgubWluIChlLngsIHJpZ2h0KSwgbGltaXQpOwotCQkJaWYgKGUueCAhPSBzYXNoUmVjdC54KSAgewotCQkJCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIGUueCk7Ci0JCQkJc2hlbGwubGF5b3V0ICgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JRm9ybURhdGEgYnV0dG9uMkRhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMkRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoc2FzaCwgMCk7Ci0JYnV0dG9uMkRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMkRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlidXR0b24yRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMi5zZXRMYXlvdXREYXRhIChidXR0b24yRGF0YSk7Ci0JCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODdmYTNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCdXR0b24gZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCAoIkVudGVyIHlvdXIgbmFtZToiKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKDEwMCwgU1dULkRFRkFVTFQpKTsKLQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCW9rLnNldFRleHQgKCJPSyIpOwotCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9LIik7Ci0JCX0KLQl9KTsKLQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQljYW5jZWwuc2V0VGV4dCAoIkNhbmNlbCIpOwotCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5jZWwiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24gKGNhbmNlbCk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiMjViYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNhc2hGb3JtIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2FzaCBmb3JtIHdpdGggdGhyZWUgY2hpbGRyZW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwOSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlTYXNoRm9ybSBmb3JtID0gbmV3IFNhc2hGb3JtKHNoZWxsLFNXVC5IT1JJWk9OVEFMKTsKLQlmb3JtLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlDb21wb3NpdGUgY2hpbGQxID0gbmV3IENvbXBvc2l0ZShmb3JtLFNXVC5OT05FKTsKLQljaGlsZDEuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCW5ldyBMYWJlbChjaGlsZDEsU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGluIHBhbmUgMSIpOwotCQotCUNvbXBvc2l0ZSBjaGlsZDIgPSBuZXcgQ29tcG9zaXRlKGZvcm0sU1dULk5PTkUpOwotCWNoaWxkMi5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbmV3IEJ1dHRvbihjaGlsZDIsU1dULlBVU0gpLnNldFRleHQoIkJ1dHRvbiBpbiBwYW5lMiIpOwotCi0JQ29tcG9zaXRlIGNoaWxkMyA9IG5ldyBDb21wb3NpdGUoZm9ybSxTV1QuTk9ORSk7Ci0JY2hpbGQzLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQluZXcgTGFiZWwoY2hpbGQzLFNXVC5QVVNIKS5zZXRUZXh0KCJMYWJlbCBpbiBwYW5lMyIpOwotCQotCWZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10gezMwLDQwLDMwfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3NDgwNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgc2VsZWN0aW9uIChpLWJlYW0pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0ZXh0LnNldEJvdW5kcyAoMTAsIDEwLCAxMDAsIDEwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJdGV4dC5hcHBlbmQgKCJMaW5lICIgKyBpICsgIlxuIik7Ci0JfQotCXNoZWxsLm9wZW4gKCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24gKDMwKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJzZWxlY3Rpb249IiArIHRleHQuZ2V0U2VsZWN0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBwb3NpdGlvbj0iICsgdGV4dC5nZXRDYXJldFBvc2l0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBsb2NhdGlvbj0iICsgdGV4dC5nZXRDYXJldExvY2F0aW9uICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmRhMGMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGZpbmQgYSB0YWJsZSBjZWxsIGZyb20gbW91c2UgZG93biAod29ya3MgZm9yIGFueSB0YWJsZSBzdHlsZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCWZpbmFsIGludCByb3dDb3VudCA9IDY0LCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0ICgiQ29sdW1uICIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaT0wOyBpIDwgcm93Q291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGo9MDsgaiA8IGNvbHVtbkNvdW50OyBqKyspIHsKLQkJCWl0ZW0uc2V0VGV4dCAoaiwgIkl0ZW0gIiArIGkgKyAiLSIgKyBqKTsKLQkJfQotCX0KLQlmb3IgKGludCBpPTA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbiAoaSkucGFjayAoKTsKLQl9Ci0JUG9pbnQgc2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgMjAwKTsKLQl0YWJsZS5zZXRTaXplIChzaXplKTsKLQlzaGVsbC5wYWNrICgpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gdGFibGUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmdldFRvcEluZGV4ICgpOwotCQkJd2hpbGUgKGluZGV4IDwgdGFibGUuZ2V0SXRlbUNvdW50ICgpKSB7Ci0JCQkJYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChpbmRleCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzIChpKTsKLQkJCQkJaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiSXRlbSAiICsgaW5kZXggKyAiLSIgKyBpKTsKLQkJCQkJfQotCQkJCQlpZiAoIXZpc2libGUgJiYgcmVjdC5pbnRlcnNlY3RzIChjbGllbnRBcmVhKSkgewotCQkJCQkJdmlzaWJsZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCF2aXNpYmxlKSByZXR1cm47Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmVkMWU3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZUVkaXRvciBleGFtcGxlIHNuaXBwZXQ6IGVkaXQgdGhlIHRleHQgb2YgYSB0cmVlIGl0ZW0gKGluIHBsYWNlLCBmYW5jeSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIENvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtSSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQlpdGVtSS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCWZvciAoaW50IGo9MDsgajwxNjsgaisrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtSiA9IG5ldyBUcmVlSXRlbSAoaXRlbUksIFNXVC5OT05FKTsKLQkJCWl0ZW1KLnNldFRleHQgKCJJdGVtICIgKyBqKTsKLQkJfQotCX0KLQlmaW5hbCBUcmVlSXRlbSBbXSBsYXN0SXRlbSA9IG5ldyBUcmVlSXRlbSBbMV07Ci0JZmluYWwgVHJlZUVkaXRvciBlZGl0b3IgPSBuZXcgVHJlZUVkaXRvciAodHJlZSk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtID09IGxhc3RJdGVtIFswXSkgewotCQkJCWJvb2xlYW4gc2hvd0JvcmRlciA9IHRydWU7Ci0JCQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHRyZWUsIFNXVC5OT05FKTsKLQkJCQlpZiAoc2hvd0JvcmRlcikgY29tcG9zaXRlLnNldEJhY2tncm91bmQgKGJsYWNrKTsKLQkJCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJZmluYWwgaW50IGluc2V0ID0gc2hvd0JvcmRlciA/IDEgOiAwOwotCQkJCWNvbXBvc2l0ZS5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQkJCVJlY3RhbmdsZSByZWN0ID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEgKCk7Ci0JCQkJCQl0ZXh0LnNldEJvdW5kcyAocmVjdC54ICsgaW5zZXQsIHJlY3QueSArIGluc2V0LCByZWN0LndpZHRoIC0gaW5zZXQgKiAyLCByZWN0LmhlaWdodCAtIGluc2V0ICogMik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlMaXN0ZW5lciB0ZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoZmluYWwgRXZlbnQgZSkgewotCQkJCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQkJCQljYXNlIFNXVC5Gb2N1c091dDoKLQkJCQkJCQkJaXRlbS5zZXRUZXh0ICh0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQljb21wb3NpdGUuZGlzcG9zZSAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBTV1QuVmVyaWZ5OgotCQkJCQkJCQlTdHJpbmcgbmV3VGV4dCA9IHRleHQuZ2V0VGV4dCAoKTsKLQkJCQkJCQkJU3RyaW5nIGxlZnRUZXh0ID0gbmV3VGV4dC5zdWJzdHJpbmcgKDAsIGUuc3RhcnQpOwotCQkJCQkJCQlTdHJpbmcgcmlnaHRUZXh0ID0gbmV3VGV4dC5zdWJzdHJpbmcgKGUuZW5kLCBuZXdUZXh0Lmxlbmd0aCAoKSk7Ci0JCQkJCQkJCUdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLQkJCQkJCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQgKGxlZnRUZXh0ICsgZS50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQkJCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCQkJCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUgKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCQkJCQllZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCQkJCQlSZWN0YW5nbGUgaXRlbVJlY3QgPSBpdGVtLmdldEJvdW5kcyAoKSwgcmVjdCA9IHRyZWUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQkJCQkJZWRpdG9yLm1pbmltdW1XaWR0aCA9IE1hdGgubWF4IChzaXplLngsIGl0ZW1SZWN0LndpZHRoKSArIGluc2V0ICogMjsKLQkJCQkJCQkJaW50IGxlZnQgPSBpdGVtUmVjdC54LCByaWdodCA9IHJlY3QueCArIHJlY3Qud2lkdGg7Ci0JCQkJCQkJCWVkaXRvci5taW5pbXVtV2lkdGggPSBNYXRoLm1pbiAoZWRpdG9yLm1pbmltdW1XaWR0aCwgcmlnaHQgLSBsZWZ0KTsKLQkJCQkJCQkJZWRpdG9yLm1pbmltdW1IZWlnaHQgPSBzaXplLnkgKyBpbnNldCAqIDI7Ci0JCQkJCQkJCWVkaXRvci5sYXlvdXQgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgU1dULlRyYXZlcnNlOgotCQkJCQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQkJCQkJaXRlbS5zZXRUZXh0ICh0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQkJCQkJY29tcG9zaXRlLmRpc3Bvc2UgKCk7Ci0JCQkJCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Gb2N1c091dCwgdGV4dExpc3RlbmVyKTsKLQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIHRleHRMaXN0ZW5lcik7Ci0JCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULlZlcmlmeSwgdGV4dExpc3RlbmVyKTsKLQkJCQllZGl0b3Iuc2V0RWRpdG9yIChjb21wb3NpdGUsIGl0ZW0pOwotCQkJCXRleHQuc2V0VGV4dCAoaXRlbS5nZXRUZXh0ICgpKTsKLQkJCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJCQl0ZXh0LnNldEZvY3VzICgpOwotCQkJfQotCQkJbGFzdEl0ZW0gWzBdID0gaXRlbTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTMyYTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEltYWdlIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBhbiBpbWFnZSBpbiBhIGdyb3VwCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlHcm91cCBncm91cCA9IG5ldyBHcm91cCAoc2hlbGwsIFNXVC5OT05FKTsKLQlncm91cC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlncm91cC5zZXRUZXh0ICgiYSBzcXVhcmUiKTsKLQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyAoZ3JvdXAsIFNXVC5OT05FKTsKLQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lciAobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2wgKFBhaW50RXZlbnQgZSkgewotCQkJZS5nYy5kcmF3SW1hZ2UgKGltYWdlLCAwLCAwKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotCQkJZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmEzNGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBhIHNlbGVjdGlvbiBvciBjaGVjayBldmVudCBpbiBhIHRhYmxlIChTV1QuQ0hFQ0spCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLID8gIkNoZWNrZWQiIDogIlNlbGVjdGVkIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoZXZlbnQuaXRlbSArICIgIiArIHN0cmluZyk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzZmYzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IGEgc2VsZWN0aW9uIG9yIGNoZWNrIGV2ZW50IGluIGEgdHJlZSAoU1dULkNIRUNLKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRyZWUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGV2ZW50LmRldGFpbCA9PSBTV1QuQ0hFQ0sgPyAiQ2hlY2tlZCIgOiAiU2VsZWN0ZWQiOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChldmVudC5pdGVtICsgIiAiICsgc3RyaW5nKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkMjI0NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogZm9yY2UgcmFkaW8gYmVoYXZpb3Igb24gdHdvIGRpZmZlcmVudCBjb21wb3NpdGVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKFNXVC5WRVJUSUNBTCkpOwotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1JBRElPX0dST1VQKTsKLQljMS5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1JBRElPX0dST1VQKTsKLQljMi5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCWZpbmFsIENvbXBvc2l0ZSBbXSBjb21wb3NpdGVzID0gbmV3IENvbXBvc2l0ZSBbXSB7YzEsIGMyfTsKLQlMaXN0ZW5lciByYWRpb0dyb3VwID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y29tcG9zaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjb21wb3NpdGVzIFtpXTsKLQkJCQlDb250cm9sIFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQkJCWZvciAoaW50IGo9MDsgajxjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW4gW2pdOwotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBjaGlsZDsKLQkJCQkJCWlmICgoYnV0dG9uLmdldFN0eWxlICgpICYgU1dULlJBRElPKSAhPSAwKSBidXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJYnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCX0KLQl9OwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgaSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgcmFkaW9Hcm91cCk7Ci0JfQotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgKGkgKyA0KSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgcmFkaW9Hcm91cCk7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTVlZjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzdG9wIENSIGZyb20gZ29pbmcgdG8gdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTYgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JdGV4dC5zZXRUZXh0KCJIZXJlIGlzIHNvbWUgdGV4dCIpOwotCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRleHQgZGVmYXVsdCBzZWxlY3RlZCAob3ZlcnJpZGVzIGRlZmF1bHQgYnV0dG9uKSIpOwotCQl9Ci0JfSk7Ci0JdGV4dC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJPayIpOwotCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdXR0b24gc2VsZWN0ZWQiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGIyOTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBhZGQgYSBzZWxlY3QgYWxsIG1lbnUgaXRlbSB0byB0aGUgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTcgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdC5zZXRUZXh0ICgiaGVyZSBpcyBzb21lIHRleHQgdG8gYmUgc2VsZWN0ZWQiKTsKLQlNZW51IGJhciA9IG5ldyBNZW51IChzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhciAoYmFyKTsKLQlNZW51SXRlbSBlZGl0SXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZWRpdEl0ZW0uc2V0VGV4dCAoIkVkaXQiKTsKLQlNZW51IHN1Ym1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWVkaXRJdGVtLnNldE1lbnUgKHN1Ym1lbnUpOwotCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAoc3VibWVudSwgU1dULlBVU0gpOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQl0LnNlbGVjdEFsbCgpOwotCQl9Ci0JfSk7Ci0JaXRlbS5zZXRUZXh0ICgiU2VsZWN0ICZBbGxcdEN0cmwrQSIpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IgKFNXVC5NT0QxICsgJ0EnKTsKLQkKLQkvLyBOb3RlIHRoYXQgYXMgbG9uZyBhcyB5b3VyIGFwcGxpY2F0aW9uIGhhcyBub3Qgb3ZlcnJpZGRlbiAKLQkvLyB0aGUgZ2xvYmFsIGFjY2VsZXJhdG9ycyBmb3IgY29weSwgcGFzdGUsIGFuZCBjdXQgCi0JLy8oQ1RSTCtDIG9yIENUUkwrSU5TRVJULCBDVFJMK1Ygb3IgU0hJRlQrSU5TRVJULCBhbmQgQ1RSTCtYIG9yIFNISUZUK0RFTEVURSkKLQkvLyB0aGVzZSBiZWhhdmlvdXJzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSBieSBkZWZhdWx0LgotCS8vIElmIHlvdXIgYXBwbGljYXRpb24gb3ZlcnJpZGVzIHRoZXNlIGFjY2VsZXJhdG9ycywKLQkvLyB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgVGV4dC5jb3B5KCksIFRleHQucGFzdGUoKSBhbmQgVGV4dC5jdXQoKQotCS8vIGZyb20gdGhlIFNlbGVjdGlvbiBjYWxsYmFjayBmb3IgdGhlIGFjY2VsZXJhdG9yIHdoZW4gdGhlIAotCS8vIHRleHQgd2lkZ2V0IGhhcyBmb2N1cy4KLQotCXNoZWxsLnNldFNpemUoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTY1MGM4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29sb3IgY3Vyc29yIGZyb20gYW4gaW1hZ2UgZmlsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTE4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplKDE1MCwgMTUwKTsKLQlmaW5hbCBDdXJzb3JbXSBjdXJzb3IgPSBuZXcgQ3Vyc29yWzFdOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkNoYW5nZSBjdXJzb3IiKTsKLQlQb2ludCBzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JYnV0dG9uLnNldFNpemUoc2l6ZSk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmljbyIsICIqLmdpZiIsICIqLioifSk7Ci0JCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAobmFtZSA9PSBudWxsKSByZXR1cm47Ci0JCQlJbWFnZURhdGEgaW1hZ2UgPSBuZXcgSW1hZ2VEYXRhKG5hbWUpOwotCQkJQ3Vyc29yIG9sZEN1cnNvciA9IGN1cnNvclswXTsKLQkJCWN1cnNvclswXSA9IG5ldyBDdXJzb3IoZGlzcGxheSwgaW1hZ2UsIDAsIDApOwotCQkJc2hlbGwuc2V0Q3Vyc29yKGN1cnNvclswXSk7Ci0JCQlpZiAob2xkQ3Vyc29yICE9IG51bGwpIG9sZEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlpZiAoY3Vyc29yWzBdICE9IG51bGwpIGN1cnNvclswXS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjc5MzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29sb3IgY3Vyc29yIGZyb20gYSBzb3VyY2UgYW5kIGEgbWFzawotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExOSB7Ci0KLXN0YXRpYyBieXRlW10gc3JjRGF0YSA9IHsKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLAotCShieXRlKTB4MTEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTEsIAotCShieXRlKTB4MTEsIChieXRlKTB4MDAsIChieXRlKTB4MjIsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MzMsIChieXRlKTB4MDAsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMiwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgzMywgKGJ5dGUpMHgzMCwgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTAsIChieXRlKTB4MjIsIChieXRlKTB4MjIsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MzMsIChieXRlKTB4MzMsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwKLQkoYnl0ZSkweDAxLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDEwLAotCShieXRlKTB4MDEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTAsCi0JKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDU1LCAoYnl0ZSkweDU1LCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTAsIChieXRlKTB4NDQsIChieXRlKTB4NDQsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4NTUsIChieXRlKTB4NTUsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHg1MCwgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDU1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLAotCShieXRlKTB4MTEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwKLX07Ci0KLXN0YXRpYyBieXRlW10gbXNrRGF0YSA9IHsKLQkoYnl0ZSkweDAzLCAoYnl0ZSkweGMwLCAKLQkoYnl0ZSkweDFmLCAoYnl0ZSkweGY4LAotCShieXRlKTB4M2YsIChieXRlKTB4ZmMsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHhmZiwgKGJ5dGUpMHhmZiwKLQkoYnl0ZSkweGZlLCAoYnl0ZSkweDdmLAotCShieXRlKTB4ZmUsIChieXRlKTB4N2YsCi0JKGJ5dGUpMHhmZiwgKGJ5dGUpMHhmZiwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDNmLCAoYnl0ZSkweGZjLAotCShieXRlKTB4MWYsIChieXRlKTB4ZjgsCi0JKGJ5dGUpMHgwMywgKGJ5dGUpMHhjMAotfTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCUNvbG9yIHllbGxvdyA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUNvbG9yIGdyZWVuID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0dSRUVOKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vQ3JlYXRlIGEgc291cmNlIEltYWdlRGF0YSBvZiBkZXB0aCA0Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAobmV3IFJHQltdIHsKLQkJYmxhY2suZ2V0UkdCKCksIHdoaXRlLmdldFJHQigpLCB5ZWxsb3cuZ2V0UkdCKCksIAotCQlyZWQuZ2V0UkdCKCksIGJsdWUuZ2V0UkdCKCksIGdyZWVuLmdldFJHQigpfSk7Ci0JSW1hZ2VEYXRhIHNvdXJjZURhdGEgPSBuZXcgSW1hZ2VEYXRhICgxNiwgMTYsIDQsIHBhbGV0dGUsIDEsIHNyY0RhdGEpOwotCQotCS8vQ3JlYXRlIGEgbWFzayBJbWFnZURhdGEgb2YgZGVwdGggMSAobW9ub2Nocm9tZSkKLQlwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCIFtdIHtibGFjay5nZXRSR0IoKSwgd2hpdGUuZ2V0UkdCKCksfSk7Ci0JSW1hZ2VEYXRhIG1hc2tEYXRhID0gbmV3IEltYWdlRGF0YSAoMTYsIDE2LCAxLCBwYWxldHRlLCAxLCBtc2tEYXRhKTsKLQotCS8vU2V0IG1hc2sKLQlzb3VyY2VEYXRhLm1hc2tEYXRhID0gbWFza0RhdGEuZGF0YTsKLQlzb3VyY2VEYXRhLm1hc2tQYWQgPSBtYXNrRGF0YS5zY2FubGluZVBhZDsKLQotCS8vQ3JlYXRlIGN1cnNvcgotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZURhdGEsIDEwLCAxMCk7Ci0KLQkvL1JlbW92ZSBtYXNrIHRvIGRyYXcgdGhlbSBzZXBhcmF0ZWx5IGp1c3QgdG8gc2hvdyB3aGF0IHRoZXkgbG9vayBsaWtlCi0Jc291cmNlRGF0YS5tYXNrRGF0YSA9IG51bGw7Ci0Jc291cmNlRGF0YS5tYXNrUGFkID0gLTE7Ci0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBJbWFnZSBzb3VyY2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksc291cmNlRGF0YSk7Ci0JZmluYWwgSW1hZ2UgbWFzayA9IG5ldyBJbWFnZSAoZGlzcGxheSwgbWFza0RhdGEpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWludCB4ID0gMTAsIHkgPSAxMDsKLQkJCVN0cmluZyBzdHJpbmdTb3VyY2UgPSAic291cmNlOiAiOwotCQkJU3RyaW5nIHN0cmluZ01hc2sgPSAibWFzazogIjsKLQkJCWdjLmRyYXdTdHJpbmcoc3RyaW5nU291cmNlLCB4LCB5KTsKLQkJCWdjLmRyYXdTdHJpbmcoc3RyaW5nTWFzaywgeCwgeSArIDMwKTsKLQkJCXggKz0gTWF0aC5tYXgoZ2Muc3RyaW5nRXh0ZW50KHN0cmluZ1NvdXJjZSkueCwgZ2Muc3RyaW5nRXh0ZW50KHN0cmluZ01hc2spLngpOwotCQkJZ2MuZHJhd0ltYWdlKHNvdXJjZSwgeCwgeSk7Ci0JCQlnYy5kcmF3SW1hZ2UobWFzaywgeCwgeSArIDMwKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMTUwLCAxNTApOwotCXNoZWxsLm9wZW4oKTsKLQlzaGVsbC5zZXRDdXJzb3IoY3Vyc29yKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlKCk7Ci0Jc291cmNlLmRpc3Bvc2UoKTsKLQltYXNrLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2E5OTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIHNlbGVjdGlvbiAoc3RhcnQsIGVuZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCXRleHQuc2V0Qm91bmRzICgxMCwgMTAsIDEwMCwgMTAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQl0ZXh0LmFwcGVuZCAoIkxpbmUgIiArIGkgKyAiXG4iKTsKLQl9Ci0Jc2hlbGwub3BlbiAoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbiAoMzAsIDM4KTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJzZWxlY3Rpb249IiArIHRleHQuZ2V0U2VsZWN0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBwb3NpdGlvbj0iICsgdGV4dC5nZXRDYXJldFBvc2l0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBsb2NhdGlvbj0iICsgdGV4dC5nZXRDYXJldExvY2F0aW9uICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfSAKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwNzBjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1vbml0b3IgZXhhbXBsZSBzbmlwcGV0OiBjZW50ZXIgYSBzaGVsbCBvbiB0aGUgcHJpbWFyeSBtb25pdG9yCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCU1vbml0b3IgcHJpbWFyeSA9IGRpc3BsYXkuZ2V0UHJpbWFyeU1vbml0b3IgKCk7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHByaW1hcnkuZ2V0Qm91bmRzICgpOwotCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Qm91bmRzICgpOwotCWludCB4ID0gYm91bmRzLnggKyAoYm91bmRzLndpZHRoIC0gcmVjdC53aWR0aCkgLyAyOwotCWludCB5ID0gYm91bmRzLnkgKyAoYm91bmRzLmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDI7Ci0Jc2hlbGwuc2V0TG9jYXRpb24gKHgsIHkpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwMTZhMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBwcm9tcHQgZm9yIGEgcGFzc3dvcmQgKHNldCB0aGUgZWNobyBjaGFyYWN0ZXIpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldEVjaG9DaGFyICgnKicpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmYmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDbGlwYm9hcmQgZXhhbXBsZSBzbmlwcGV0OiBlbmFibGUvZGlzYWJsZSBtZW51IGRlcGVuZGluZyBvbiBjbGlwYm9hcmQgY29udGVudCBhdmFpbGFiaWxpdHkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBDbGlwYm9hcmQgY2IgPSBuZXcgQ2xpcGJvYXJkKGRpc3BsYXkpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULlBPUF9VUCk7Ci0JZmluYWwgTWVudUl0ZW0gY29weUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCWNvcHlJdGVtLnNldFRleHQoIkNvcHkiKTsKLQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCgpID09IDApIHJldHVybjsKLQkJCU9iamVjdFtdIGRhdGEgPSBuZXcgT2JqZWN0W117c2VsZWN0aW9ufTsKLQkJCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9OwotCQkJY2Iuc2V0Q29udGVudHMoZGF0YSwgdHlwZXMpOwotCQl9Ci0JfSk7Ci0JZmluYWwgTWVudUl0ZW0gcGFzdGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQlwYXN0ZUl0ZW0uc2V0VGV4dCAoIlBhc3RlIik7Ci0JcGFzdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKShjYi5nZXRDb250ZW50cyhUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSkpOwotCQkJaWYgKHN0cmluZyAhPSBudWxsKSB0ZXh0Lmluc2VydChzdHJpbmcpOwotCQl9Ci0JfSk7Ci0JbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCS8vIGlzIGNvcHkgdmFsaWQ/Ci0JCQlTdHJpbmcgc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQljb3B5SXRlbS5zZXRFbmFibGVkKHNlbGVjdGlvbi5sZW5ndGgoKSA+IDApOwotCQkJLy8gaXMgcGFzdGUgdmFsaWQ/Ci0JCQlUcmFuc2ZlckRhdGFbXSBhdmFpbGFibGUgPSBjYi5nZXRBdmFpbGFibGVUeXBlcygpOwotCQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoYXZhaWxhYmxlW2ldKSkgewotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcGFzdGVJdGVtLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9KTsKLQl0ZXh0LnNldE1lbnUgKG1lbnUpOwotCi0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY2IuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjI2NTE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE9MRSBhbmQgQWN0aXZlWCBleGFtcGxlIHNuaXBwZXQ6IGdldCBldmVudHMgZnJvbSBJRSBjb250cm9sICh3aW4zMiBvbmx5KQotICogCi0gKiBUaGlzIHNuaXBwZXQgb25seSBydW5zIGFzLWlzIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzIGJlY2F1c2UgaXQgdXNlcwotICogamF2YSBpbnRlZ2VycyB0byByZXByZXNlbnQgbmF0aXZlIHBvaW50ZXJzLiAgImxvbmciIGNvbW1lbnRzIGFyZSBpbmNsdWRlZAotICogdGhyb3VnaG91dCB0aGUgc25pcHBldCB0byBzaG93IHdoZXJlIGludCBzaG91bGQgYmUgY2hhbmdlZCB0byBsb25nIGluCi0gKiBvcmRlciB0byBydW4gb24gYSA2NC1iaXQgYXJjaGl0ZWN0dXJlLgotICogCi0gKiBOT1RFOiBUaGlzIHNuaXBwZXQgdXNlcyBpbnRlcm5hbCBTV1QgcGFja2FnZXMgdGhhdCBhcmUKLSAqIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JdHJ5IHsKLQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybjsKLQl9Ci0Jc2hlbGwub3BlbigpOwotCQotCS8vIElXZWJCcm93c2VyCi0JZmluYWwgT2xlQXV0b21hdGlvbiB3ZWJCcm93c2VyID0gbmV3IE9sZUF1dG9tYXRpb24oY29udHJvbFNpdGUpOwotCi0JLy8gV2hlbiBhIG5ldyBkb2N1bWVudCBpcyBsb2FkZWQsIGFjY2VzcyB0aGUgZG9jdW1lbnQgb2JqZWN0IGZvciB0aGUgbmV3IHBhZ2UuCi0JaW50IERvd25sb2FkQ29tcGxldGUgPSAxMDQ7Ci0JY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihEb3dubG9hZENvbXBsZXRlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQlpbnRbXSBodG1sRG9jdW1lbnRJRCA9IHdlYkJyb3dzZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkRvY3VtZW50In0pOyAKLQkJCWlmIChodG1sRG9jdW1lbnRJRCA9PSBudWxsKSByZXR1cm47Ci0JCQlWYXJpYW50IHBWYXJSZXN1bHQgPSB3ZWJCcm93c2VyLmdldFByb3BlcnR5KGh0bWxEb2N1bWVudElEWzBdKTsKLQkJCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gMCkgcmV0dXJuOwotCQkJLy9JSFRNTERvY3VtZW50MgotCQkJT2xlQXV0b21hdGlvbiBodG1sRG9jdW1lbnQgPSBwVmFyUmVzdWx0LmdldEF1dG9tYXRpb24oKTsKLQotCQkJLy8gUmVxdWVzdCB0byBiZSBub3RpZmllZCBvZiBjbGljaywgZG91YmxlIGNsaWNrIGFuZCBrZXkgZG93biBldmVudHMKLQkJCUV2ZW50RGlzcGF0Y2ggbXlEaXNwYXRjaCA9IG5ldyBFdmVudERpc3BhdGNoKEV2ZW50RGlzcGF0Y2gub25jbGljayk7Ci0JCQlJRGlzcGF0Y2ggaWRpc3BhdGNoID0gbmV3IElEaXNwYXRjaChteURpc3BhdGNoLmdldEFkZHJlc3MoKSk7Ci0JCQlWYXJpYW50IGRpc3BhdGNoID0gbmV3IFZhcmlhbnQoaWRpc3BhdGNoKTsKLQkJCWh0bWxEb2N1bWVudC5zZXRQcm9wZXJ0eShFdmVudERpc3BhdGNoLm9uY2xpY2ssIGRpc3BhdGNoKTsKLQotCQkJbXlEaXNwYXRjaCA9IG5ldyBFdmVudERpc3BhdGNoKEV2ZW50RGlzcGF0Y2gub25kYmxjbGljayk7Ci0JCQlpZGlzcGF0Y2ggPSBuZXcgSURpc3BhdGNoKG15RGlzcGF0Y2guZ2V0QWRkcmVzcygpKTsKLQkJCWRpc3BhdGNoID0gbmV3IFZhcmlhbnQoaWRpc3BhdGNoKTsKLQkJCWh0bWxEb2N1bWVudC5zZXRQcm9wZXJ0eShFdmVudERpc3BhdGNoLm9uZGJsY2xpY2ssIGRpc3BhdGNoKTsKLQotCQkJbXlEaXNwYXRjaCA9IG5ldyBFdmVudERpc3BhdGNoKEV2ZW50RGlzcGF0Y2gub25rZXlkb3duKTsKLQkJCWlkaXNwYXRjaCA9IG5ldyBJRGlzcGF0Y2gobXlEaXNwYXRjaC5nZXRBZGRyZXNzKCkpOwotCQkJZGlzcGF0Y2ggPSBuZXcgVmFyaWFudChpZGlzcGF0Y2gpOwotCQkJaHRtbERvY3VtZW50LnNldFByb3BlcnR5KEV2ZW50RGlzcGF0Y2gub25rZXlkb3duLCBkaXNwYXRjaCk7Ci0JCQkKLQkJCS8vUmVtZW1iZXIgdG8gcmVsZWFzZSBPbGVBdXRvbWF0aW9uIE9iamVjdAotCQkJaHRtbERvY3VtZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotCQotCS8vIE5hdmlnYXRlIHRvIGEgd2ViIHNpdGUKLQlpbnRbXSBpZHMgPSB3ZWJCcm93c2VyLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSIsICJVUkwifSk7IAotCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFtdIHtuZXcgVmFyaWFudCgiaHR0cDovL3d3dy5nb29nbGUuY29tIil9OwotCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFtde2lkc1sxXX07Ci0Jd2ViQnJvd3Nlci5pbnZva2UoaWRzWzBdLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQkJCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQkvL1JlbWVtYmVyIHRvIHJlbGVhc2UgT2xlQXV0b21hdGlvbiBPYmplY3QKLQl3ZWJCcm93c2VyLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkKLX0KLX0KLS8vIEV2ZW50RGlzcGF0Y2ggaW1wbGVtZW50cyBhIHNpbXBsZSBJRGlzcGF0Y2ggaW50ZXJmYWNlIHdoaWNoIHdpbGwgYmUgY2FsbGVkIAotLy8gd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuCi1jbGFzcyBFdmVudERpc3BhdGNoIHsKLQlwcml2YXRlIENPTU9iamVjdCBpRGlzcGF0Y2g7Ci0JcHJpdmF0ZSBpbnQgcmVmQ291bnQgPSAwOwotCXByaXZhdGUgaW50IGV2ZW50SUQ7Ci0JCi0JZmluYWwgc3RhdGljIGludCBvbmhlbHAgPSAweDgwMDExNzdkOwotCWZpbmFsIHN0YXRpYyBpbnQgb25jbGljayA9IDB4ODAwMTE3Nzg7Ci0JZmluYWwgc3RhdGljIGludCBvbmRibGNsaWNrID0gMHg4MDAxMTc3OTsKLQlmaW5hbCBzdGF0aWMgaW50IG9ua2V5dXAgPSAweDgwMDExNzc2OwotCWZpbmFsIHN0YXRpYyBpbnQgb25rZXlkb3duID0gMHg4MDAxMTc3NTsKLQlmaW5hbCBzdGF0aWMgaW50IG9ua2V5cHJlc3MgPSAweDgwMDExNzc3OwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZXVwID0gMHg4MDAxMTc3MzsKLQlmaW5hbCBzdGF0aWMgaW50IG9ubW91c2Vkb3duID0gMHg4MDAxMTc3MjsKLQlmaW5hbCBzdGF0aWMgaW50IG9ubW91c2Vtb3ZlID0gMHg4MDAxMTc3NDsKLQlmaW5hbCBzdGF0aWMgaW50IG9ubW91c2VvdXQgPSAweDgwMDExNzcxOwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZW92ZXIgPSAweDgwMDExNzcwOwotCWZpbmFsIHN0YXRpYyBpbnQgb25yZWFkeXN0YXRlY2hhbmdlID0gMHg4MDAxMTc4OTsKLQlmaW5hbCBzdGF0aWMgaW50IG9uYWZ0ZXJ1cGRhdGUgPSAweDgwMDExNzg2OwotCWZpbmFsIHN0YXRpYyBpbnQgb25yb3dleGl0PSAweDgwMDExNzgyOwotCWZpbmFsIHN0YXRpYyBpbnQgb25yb3dlbnRlciA9IDB4ODAwMTE3ODM7Ci0JZmluYWwgc3RhdGljIGludCBvbmRyYWdzdGFydCA9IDB4ODAwMTE3OTM7Ci0JZmluYWwgc3RhdGljIGludCBvbnNlbGVjdHN0YXJ0ID0gMHg4MDAxMTc5NTsKLQotCUV2ZW50RGlzcGF0Y2goaW50IGV2ZW50SUQpIHsKLQkJdGhpcy5ldmVudElEID0gZXZlbnRJRDsKLQkJY3JlYXRlQ09NSW50ZXJmYWNlcygpOwotCX0KLQlpbnQgLypsb25nKi8gZ2V0QWRkcmVzcygpIHsKLQkJcmV0dXJuIGlEaXNwYXRjaC5nZXRBZGRyZXNzKCk7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVDT01JbnRlcmZhY2VzKCkgewotCQlpRGlzcGF0Y2ggPSBuZXcgQ09NT2JqZWN0KG5ldyBpbnRbXXsyLCAwLCAwLCAxLCAzLCA0LCA4fSl7Ci0JCQlwdWJsaWMgaW50IC8qbG9uZyovIG1ldGhvZDAoaW50IC8qbG9uZyovW10gYXJncykge3JldHVybiBRdWVyeUludGVyZmFjZShhcmdzWzBdLCBhcmdzWzFdKTt9Ci0JCQlwdWJsaWMgaW50IC8qbG9uZyovIG1ldGhvZDEoaW50IC8qbG9uZyovW10gYXJncykge3JldHVybiBBZGRSZWYoKTt9Ci0JCQlwdWJsaWMgaW50IC8qbG9uZyovIG1ldGhvZDIoaW50IC8qbG9uZyovW10gYXJncykge3JldHVybiBSZWxlYXNlKCk7fQotCQkJLy8gbWV0aG9kMyBHZXRUeXBlSW5mb0NvdW50IC0gbm90IGltcGxlbWVudGVkCi0JCQkvLyBtZXRob2Q0IEdldFR5cGVJbmZvIC0gbm90IGltcGxlbWVudGVkCi0JCQkvLyBtZXRob2Q1IEdldElEc09mTmFtZXMgLSBub3QgaW1wbGVtZW50ZWQKLQkJCXB1YmxpYyBpbnQgLypsb25nKi8gbWV0aG9kNihpbnQgLypsb25nKi9bXSBhcmdzKSB7cmV0dXJuIEludm9rZSgoaW50KS8qNjQqL2FyZ3NbMF0sIGFyZ3NbMV0sIChpbnQpLyo2NCovYXJnc1syXSwgKGludCkvKjY0Ki9hcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdLCBhcmdzWzddKTt9Ci0JCX07Ci0JfQotCXByaXZhdGUgdm9pZCBkaXNwb3NlQ09NSW50ZXJmYWNlcygpIHsKLQkJaWYgKGlEaXNwYXRjaCAhPSBudWxsKQotCQkJaURpc3BhdGNoLmRpc3Bvc2UoKTsKLQkJaURpc3BhdGNoID0gbnVsbDsKLQkJCi0JfQotCXByaXZhdGUgaW50IEFkZFJlZigpIHsKLQkJcmVmQ291bnQrKzsKLQkJcmV0dXJuIHJlZkNvdW50OwotCX0KLQlwcml2YXRlIGludCBJbnZva2UoaW50IGRpc3BJZE1lbWJlciwgaW50IC8qbG9uZyovIHJpaWQsIGludCBsY2lkLCBpbnQgZHdGbGFncywgaW50IC8qbG9uZyovIHBEaXNwUGFyYW1zLCBpbnQgLypsb25nKi8gcFZhclJlc3VsdCwgaW50IC8qbG9uZyovIHBFeGNlcEluZm8sIGludCAvKmxvbmcqLyBwQXJnRXJyKQl7Ci0JCXN3aXRjaCAoZXZlbnRJRCkgewotCQkJY2FzZSBvbmhlbHA6IFN5c3RlbS5vdXQucHJpbnRsbigib25oZWxwIik7IGJyZWFrOwotCQkJY2FzZSBvbmNsaWNrOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uY2xpY2siKTsgYnJlYWs7Ci0JCQljYXNlIG9uZGJsY2xpY2s6IFN5c3RlbS5vdXQucHJpbnRsbigib25kYmxjbGljayIpOyBicmVhazsKLQkJCWNhc2Ugb25rZXl1cDogU3lzdGVtLm91dC5wcmludGxuKCJvbmtleXVwIik7IGJyZWFrOwotCQkJY2FzZSBvbmtleWRvd246IFN5c3RlbS5vdXQucHJpbnRsbigib25rZXlkb3duIik7IGJyZWFrOwotCQkJY2FzZSBvbmtleXByZXNzOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ua2V5cHJlc3MiKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2V1cDogU3lzdGVtLm91dC5wcmludGxuKCJvbm1vdXNldXAiKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2Vkb3duOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2Vkb3duIik7IGJyZWFrOwotCQkJY2FzZSBvbm1vdXNlbW92ZTogU3lzdGVtLm91dC5wcmludGxuKCJvbm1vdXNlbW92ZSIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZW91dDogU3lzdGVtLm91dC5wcmludGxuKCJvbm1vdXNlb3V0Iik7IGJyZWFrOwotCQkJY2FzZSBvbm1vdXNlb3ZlcjogU3lzdGVtLm91dC5wcmludGxuKCJvbm1vdXNlb3ZlciIpOyBicmVhazsKLQkJCWNhc2Ugb25yZWFkeXN0YXRlY2hhbmdlOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ucmVhZHlzdGF0ZWNoYW5nZSIpOyBicmVhazsKLQkJCWNhc2Ugb25hZnRlcnVwZGF0ZTogU3lzdGVtLm91dC5wcmludGxuKCJvbmFmdGVydXBkYXRlIik7IGJyZWFrOwotCQkJY2FzZSBvbnJvd2V4aXQ6IFN5c3RlbS5vdXQucHJpbnRsbigib25yb3dleGl0Iik7IGJyZWFrOwotCQkJY2FzZSBvbnJvd2VudGVyOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ucm93ZW50ZXIiKTsgYnJlYWs7Ci0JCQljYXNlIG9uZHJhZ3N0YXJ0OiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uZHJhZ3N0YXJ0Iik7IGJyZWFrOwotCQkJY2FzZSBvbnNlbGVjdHN0YXJ0OiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uc2VsZWN0c3RhcnQiKTsgYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIENPTS5TX09LOwotCX0KLQlwcml2YXRlIGludCBRdWVyeUludGVyZmFjZShpbnQgLypsb25nKi8gcmlpZCwgaW50IC8qbG9uZyovIHBwdk9iamVjdCkgewotCQlpZiAocmlpZCA9PSAwIHx8IHBwdk9iamVjdCA9PSAwKSByZXR1cm4gQ09NLkVfSU5WQUxJREFSRzsKLQkJR1VJRCBndWlkID0gbmV3IEdVSUQoKTsKLQkJQ09NLk1vdmVNZW1vcnkoZ3VpZCwgcmlpZCwgR1VJRC5zaXplb2YpOwotCQotCQlpZiAoQ09NLklzRXF1YWxHVUlEKGd1aWQsIENPTS5JSURJVW5rbm93bikgfHwgQ09NLklzRXF1YWxHVUlEKGd1aWQsIENPTS5JSURJRGlzcGF0Y2gpKSB7Ci0JCQlDT00uTW92ZU1lbW9yeShwcHZPYmplY3QsIG5ldyBpbnQgLypsb25nKi9bXSB7aURpc3BhdGNoLmdldEFkZHJlc3MoKX0sIE9TLlBUUl9TSVpFT0YpOwotCQkJQWRkUmVmKCk7Ci0JCQlyZXR1cm4gQ09NLlNfT0s7Ci0JCX0KLQkJQ09NLk1vdmVNZW1vcnkocHB2T2JqZWN0LCBuZXcgaW50IC8qbG9uZyovW10gezB9LCBPUy5QVFJfU0laRU9GKTsKLQkJcmV0dXJuIENPTS5FX05PSU5URVJGQUNFOwotCX0KLQlpbnQgUmVsZWFzZSgpIHsKLQkJcmVmQ291bnQtLTsKLQkJaWYgKHJlZkNvdW50ID09IDApIHsKLQkJCWRpc3Bvc2VDT01JbnRlcmZhY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHJlZkNvdW50OwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjAxZmJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlRWRpdG9yIGV4YW1wbGUgc25pcHBldDogZWRpdCBhIGNlbGwgaW4gYSB0YWJsZSAoaW4gcGxhY2UsIGZhbmN5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI0IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCWZvciAoaW50IGk9MDsgaTwzOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0V2lkdGgoMTAwKTsKLQl9Ci0JZm9yIChpbnQgaT0wOyBpPDM7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiIiArIGksICIiICsgaSAsICIiICsgaX0pOwotCX0KLQlmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQllZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSB0YWJsZS5nZXRDbGllbnRBcmVhICgpOwotCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJaW50IGluZGV4ID0gdGFibGUuZ2V0VG9wSW5kZXggKCk7Ci0JCQl3aGlsZSAoaW5kZXggPCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpIHsKLQkJCQlib29sZWFuIHZpc2libGUgPSBmYWxzZTsKLQkJCQlmaW5hbCBUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGluZGV4KTsKLQkJCQlmb3IgKGludCBpPTA7IGk8dGFibGUuZ2V0Q29sdW1uQ291bnQgKCk7IGkrKykgewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzIChpKTsKLQkJCQkJaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotCQkJCQkJZmluYWwgaW50IGNvbHVtbiA9IGk7Ci0JCQkJCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5OT05FKTsKLQkJCQkJCUxpc3RlbmVyIHRleHRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKGZpbmFsIEV2ZW50IGUpIHsKLQkJCQkJCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQkJCQkJCWNhc2UgU1dULkZvY3VzT3V0OgotCQkJCQkJCQkJCWl0ZW0uc2V0VGV4dCAoY29sdW1uLCB0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQkJCXRleHQuZGlzcG9zZSAoKTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgU1dULlRyYXZlcnNlOgotCQkJCQkJCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkJCQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCQkJCQkJCQkJaXRlbS5zZXRUZXh0IChjb2x1bW4sIHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCQkJCQkJCQkvL0ZBTEwgVEhST1VHSAotCQkJCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQkJCQkJCQl0ZXh0LmRpc3Bvc2UgKCk7Ci0JCQkJCQkJCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULkZvY3VzT3V0LCB0ZXh0TGlzdGVuZXIpOwotCQkJCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULlRyYXZlcnNlLCB0ZXh0TGlzdGVuZXIpOwotCQkJCQkJZWRpdG9yLnNldEVkaXRvciAodGV4dCwgaXRlbSwgaSk7Ci0JCQkJCQl0ZXh0LnNldFRleHQgKGl0ZW0uZ2V0VGV4dCAoaSkpOwotCQkJCQkJdGV4dC5zZWxlY3RBbGwgKCk7Ci0JCQkJCQl0ZXh0LnNldEZvY3VzICgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmICghdmlzaWJsZSAmJiByZWN0LmludGVyc2VjdHMgKGNsaWVudEFyZWEpKSB7Ci0JCQkJCQl2aXNpYmxlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXZpc2libGUpIHJldHVybjsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYWI3NTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sIFRpcHMgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgZmFrZSB0b29sIHRpcHMgZm9yIGl0ZW1zIGluIGEgdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJpdGVtICIgKyBpKTsKLQl9Ci0JLy8gRGlzYWJsZSBuYXRpdmUgdG9vbHRpcAotCXRhYmxlLnNldFRvb2xUaXBUZXh0ICgiIik7Ci0JCi0JLy8gSW1wbGVtZW50IGEgImZha2UiIHRvb2x0aXAKLQlmaW5hbCBMaXN0ZW5lciBsYWJlbExpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlMYWJlbCBsYWJlbCA9IChMYWJlbClldmVudC53aWRnZXQ7Ci0JCQlTaGVsbCBzaGVsbCA9IGxhYmVsLmdldFNoZWxsICgpOwotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotCQkJCQllLml0ZW0gPSAoVGFibGVJdGVtKSBsYWJlbC5nZXREYXRhICgiX1RBQkxFSVRFTSIpOwotCQkJCQkvLyBBc3N1bWluZyB0YWJsZSBpcyBzaW5nbGUgc2VsZWN0LCBzZXQgdGhlIHNlbGVjdGlvbiBhcyBpZgotCQkJCQkvLyB0aGUgbW91c2UgZG93biBldmVudCB3ZW50IHRocm91Z2ggdG8gdGhlIHRhYmxlCi0JCQkJCXRhYmxlLnNldFNlbGVjdGlvbiAobmV3IFRhYmxlSXRlbSBbXSB7KFRhYmxlSXRlbSkgZS5pdGVtfSk7Ci0JCQkJCXRhYmxlLm5vdGlmeUxpc3RlbmVycyAoU1dULlNlbGVjdGlvbiwgZSk7Ci0JCQkJCXNoZWxsLmRpc3Bvc2UgKCk7Ci0JCQkJCXRhYmxlLnNldEZvY3VzKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlRXhpdDoKLQkJCQkJc2hlbGwuZGlzcG9zZSAoKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCUxpc3RlbmVyIHRhYmxlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlTaGVsbCB0aXAgPSBudWxsOwotCQlMYWJlbCBsYWJlbCA9IG51bGw7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuRGlzcG9zZToKLQkJCQljYXNlIFNXVC5LZXlEb3duOgotCQkJCWNhc2UgU1dULk1vdXNlTW92ZTogewotCQkJCQlpZiAodGlwID09IG51bGwpIGJyZWFrOwotCQkJCQl0aXAuZGlzcG9zZSAoKTsKLQkJCQkJdGlwID0gbnVsbDsKLQkJCQkJbGFiZWwgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuTW91c2VIb3ZlcjogewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodGlwICE9IG51bGwgICYmICF0aXAuaXNEaXNwb3NlZCAoKSkgdGlwLmRpc3Bvc2UgKCk7Ci0JCQkJCQl0aXAgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuT05fVE9QIHwgU1dULk5PX0ZPQ1VTIHwgU1dULlRPT0wpOwotCQkJCQkJdGlwLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCQkJCUZpbGxMYXlvdXQgbGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQgKCk7Ci0JCQkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQkJCQkJdGlwLnNldExheW91dCAobGF5b3V0KTsKLQkJCQkJCWxhYmVsID0gbmV3IExhYmVsICh0aXAsIFNXVC5OT05FKTsKLQkJCQkJCWxhYmVsLnNldEZvcmVncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLQkJCQkJCWxhYmVsLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCQkJCWxhYmVsLnNldERhdGEgKCJfVEFCTEVJVEVNIiwgaXRlbSk7Ci0JCQkJCQlsYWJlbC5zZXRUZXh0IChpdGVtLmdldFRleHQgKCkpOwotCQkJCQkJbGFiZWwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZUV4aXQsIGxhYmVsTGlzdGVuZXIpOwotCQkJCQkJbGFiZWwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxhYmVsTGlzdGVuZXIpOwotCQkJCQkJUG9pbnQgc2l6ZSA9IHRpcC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQkJCVJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMgKDApOwotCQkJCQkJUG9pbnQgcHQgPSB0YWJsZS50b0Rpc3BsYXkgKHJlY3QueCwgcmVjdC55KTsKLQkJCQkJCXRpcC5zZXRCb3VuZHMgKHB0LngsIHB0LnksIHNpemUueCwgc2l6ZS55KTsKLQkJCQkJCXRpcC5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCB0YWJsZUxpc3RlbmVyKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULktleURvd24sIHRhYmxlTGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCB0YWJsZUxpc3RlbmVyKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULk1vdXNlSG92ZXIsIHRhYmxlTGlzdGVuZXIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjM2JhYzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGFyYml0cmFyeSBjb250cm9scyBpbiBhIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjYgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JZm9yIChpbnQgaT0wOyBpPDM7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFdpZHRoICgxMDApOwotCX0KLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQluZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCX0KLQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVFZGl0b3IgZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCUNDb21ibyBjb21ibyA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbWJvLnNldFRleHQoIkNDb21ibyIpOwotCQljb21iby5hZGQoIml0ZW0gMSIpOwotCQljb21iby5hZGQoIml0ZW0gMiIpOwotCQllZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQllZGl0b3Iuc2V0RWRpdG9yKGNvbWJvLCBpdGVtc1tpXSwgMCk7Ci0JCWVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlUZXh0IHRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5OT05FKTsKLQkJdGV4dC5zZXRUZXh0KCJUZXh0Iik7Ci0JCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWVkaXRvci5zZXRFZGl0b3IodGV4dCwgaXRlbXNbaV0sIDEpOwotCQllZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHRhYmxlLCBTV1QuQ0hFQ0spOwotCQlidXR0b24ucGFjayAoKTsKLQkJZWRpdG9yLm1pbmltdW1XaWR0aCA9IGJ1dHRvbi5nZXRTaXplICgpLng7Ci0JCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCWVkaXRvci5zZXRFZGl0b3IgKGJ1dHRvbiwgaXRlbXNbaV0sIDIpOwotCX0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlZmViZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IHByZXZlbnQgVGFiIGZyb20gdHJhdmVyc2luZyBvdXQgb2YgYSBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjcgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0ICgpKTsKLQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQoIkNhbid0IFRyYXZlcnNlIik7Ci0JYnV0dG9uMS5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9ORVhUOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUzogewotCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRUZXh0KCJDYW4gVHJhdmVyc2UiKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQwMjNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IGJyaW5nIHVwIGEgYnJvd3NlcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI4IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJc2hlbGwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlUb29sQmFyIHRvb2xiYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgU1dULk5PTkUpOwotCQlUb29sSXRlbSBpdGVtQmFjayA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW1CYWNrLnNldFRleHQoIkJhY2siKTsKLQkJVG9vbEl0ZW0gaXRlbUZvcndhcmQgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQlpdGVtRm9yd2FyZC5zZXRUZXh0KCJGb3J3YXJkIik7Ci0JCVRvb2xJdGVtIGl0ZW1TdG9wID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbVN0b3Auc2V0VGV4dCgiU3RvcCIpOwotCQlUb29sSXRlbSBpdGVtUmVmcmVzaCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW1SZWZyZXNoLnNldFRleHQoIlJlZnJlc2giKTsKLQkJVG9vbEl0ZW0gaXRlbUdvID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbUdvLnNldFRleHQoIkdvIik7Ci0JCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl0b29sYmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJTGFiZWwgbGFiZWxBZGRyZXNzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWxhYmVsQWRkcmVzcy5zZXRUZXh0KCJBZGRyZXNzIik7Ci0JCQotCQlmaW5hbCBUZXh0IGxvY2F0aW9uID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlsb2NhdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlicm93c2VyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZmluYWwgTGFiZWwgc3RhdHVzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXN0YXR1cy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZpbmFsIFByb2dyZXNzQmFyIHByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQlwcm9ncmVzc0Jhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8qIGV2ZW50IGhhbmRsaW5nICovCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlUb29sSXRlbSBpdGVtID0gKFRvb2xJdGVtKWV2ZW50LndpZGdldDsKLQkJCQlTdHJpbmcgc3RyaW5nID0gaXRlbS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHN0cmluZy5lcXVhbHMoIkJhY2siKSkgYnJvd3Nlci5iYWNrKCk7IAotCQkJCWVsc2UgaWYgKHN0cmluZy5lcXVhbHMoIkZvcndhcmQiKSkgYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCQkJZWxzZSBpZiAoc3RyaW5nLmVxdWFscygiU3RvcCIpKSBicm93c2VyLnN0b3AoKTsKLQkJCQllbHNlIGlmIChzdHJpbmcuZXF1YWxzKCJSZWZyZXNoIikpIGJyb3dzZXIucmVmcmVzaCgpOwotCQkJCWVsc2UgaWYgKHN0cmluZy5lcXVhbHMoIkdvIikpIGJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCSAgIH0KLQkJfTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC50b3RhbCA9PSAwKSByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQlpbnQgcmF0aW8gPSBldmVudC5jdXJyZW50ICogMTAwIC8gZXZlbnQudG90YWw7Ci0JCQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbihyYXRpbyk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbigwKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KGV2ZW50LnRleHQpOwkKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC50b3ApIGxvY2F0aW9uLnNldFRleHQoZXZlbnQubG9jYXRpb24pOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJaXRlbUJhY2suYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpdGVtRm9yd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCWl0ZW1TdG9wLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaXRlbVJlZnJlc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpdGVtR28uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlsb2NhdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCgiaHR0cDovL2VjbGlwc2Uub3JnIik7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTAwMWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNvbG9yIGNlbGxzIGFuZCByb3dzIGluIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI5IHsKLSAKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGdyYXkgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEJhY2tncm91bmQoZ3JheSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4zID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsInJlZCBmb3JlZ3JvdW5kIn0pOwotCWl0ZW0uc2V0Rm9yZWdyb3VuZChyZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsInJlZCBiYWNrZ3JvdW5kIn0pOwotCWl0ZW0uc2V0QmFja2dyb3VuZChyZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsIndoaXRlIGZvcmUvcmVkIGJhY2sifSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKHdoaXRlKTsKLQlpdGVtLnNldEJhY2tncm91bmQocmVkKTsKLQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJub3JtYWwiLCJibHVlIGZvcmVncm91bmQiLCJyZWQgZm9yZWdyb3VuZCJ9KTsKLQlpdGVtLnNldEZvcmVncm91bmQoMSwgYmx1ZSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKDIsIHJlZCk7Ci0JaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsibm9ybWFsIiwiYmx1ZSBiYWNrZ3JvdW5kIiwicmVkIGJhY2tncm91bmQifSk7Ci0JaXRlbS5zZXRCYWNrZ3JvdW5kKDEsIGJsdWUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgyLCByZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IndoaXRlIGZvcmUvYmx1ZSBiYWNrIiwibm9ybWFsIiwid2hpdGUgZm9yZS9yZWQgYmFjayJ9KTsKLQlpdGVtLnNldEZvcmVncm91bmQoMCwgd2hpdGUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgwLCBibHVlKTsKLQlpdGVtLnNldEZvcmVncm91bmQoMiwgd2hpdGUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgyLCByZWQpOwotCQotCWNvbHVtbjEucGFjaygpOwotCWNvbHVtbjIucGFjaygpOwotCWNvbHVtbjMucGFjaygpOwotCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YThkMDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogZHJhdyBhIHRoaWNrIGxpbmUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCUdDIGdjID0gbmV3IEdDIChzaGVsbCk7Ci0JZ2Muc2V0TGluZVdpZHRoICg0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlICgyMCwgMjAsIDEwMCwgMTAwKTsKLQlnYy5kaXNwb3NlICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzgwY2I4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCdXN5SW5kaWNhdG9yIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBidXN5IGN1cnNvciBkdXJpbmcgbG9uZyBydW5uaW5nIHRhc2sKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzAgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWZpbmFsIGludFtdIG5leHRJZCA9IG5ldyBpbnRbMV07Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQliLnNldFRleHQoImludm9rZSBsb25nIHJ1bm5pbmcgam9iIik7Ci0JCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUnVubmFibGUgbG9uZ0pvYiA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQkJCWludCBpZDsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJaWQgPSBuZXh0SWRbMF0rKzsKLQkJCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYgKHRleHQuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQkJCQkJdGV4dC5hcHBlbmQoIlxuU3RhcnQgbG9uZyBydW5uaW5nIHRhc2sgIitpZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZG8gdGFzayB0aGF0IHRha2VzIGEgbG9uZyB0aW1lIGluIGEgc2VwYXJhdGUgdGhyZWFkICIraWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlpZiAodGV4dC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCQkJCQl0ZXh0LmFwcGVuZCgiXG5Db21wbGV0ZWQgbG9uZyBydW5uaW5nIHRhc2sgIitpZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCQkJZGlzcGxheS53YWtlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCQl0aHJlYWQuc3RhcnQoKTsKLQkJCQkJCXdoaWxlICghZG9uZSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGRpc3BsYXksIGxvbmdKb2IpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZSgyNTAsIDE1MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQwYzA1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IHNob3cgYSBwb3B1cCBtZW51ICh3YWl0IGZvciBpdCB0byBjbG9zZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzMSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQgKCJNZW51IEl0ZW0iKTsKLQkJCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiSXRlbSBTZWxlY3RlZCIpOwotCQkJCX0KLQkJCX0pOwotCQkJbWVudS5zZXRMb2NhdGlvbiAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJd2hpbGUgKCFtZW51LmlzRGlzcG9zZWQgKCkgJiYgbWVudS5pc1Zpc2libGUgKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQkJfQotCQkJbWVudS5kaXNwb3NlICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmN2UwY2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogUHJpbnRpbmcgZXhhbXBsZSBzbmlwcGV0OiBwcmludCAiSGVsbG8gV29ybGQhIiBpbiBibGFjaywgb3V0bGluZWQgaW4gcmVkLCB0byBkZWZhdWx0IHByaW50ZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JaWYgKGRhdGEgPT0gbnVsbCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IE5vIGRlZmF1bHQgcHJpbnRlci4iKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybjsKLQl9Ci0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JaWYgKHByaW50ZXIuc3RhcnRKb2IoIlNXVCBQcmludGluZyBTbmlwcGV0IikpIHsKLQkJQ29sb3IgYmxhY2sgPSBwcmludGVyLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0JCUNvbG9yIHdoaXRlID0gcHJpbnRlci5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCQlDb2xvciByZWQgPSBwcmludGVyLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCQlSZWN0YW5nbGUgdHJpbSA9IHByaW50ZXIuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCVBvaW50IGRwaSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JCWludCBsZWZ0TWFyZ2luID0gZHBpLnggKyB0cmltLng7IC8vIG9uZSBpbmNoIGZyb20gbGVmdCBzaWRlIG9mIHBhcGVyCi0JCWludCB0b3BNYXJnaW4gPSBkcGkueSAvIDIgKyB0cmltLnk7IC8vIG9uZS1oYWxmIGluY2ggZnJvbSB0b3AgZWRnZSBvZiBwYXBlcgotCQlHQyBnYyA9IG5ldyBHQyhwcmludGVyKTsKLQkJaWYgKHByaW50ZXIuc3RhcnRQYWdlKCkpIHsKLQkJCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChibGFjayk7Ci0JCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJIZWxsbyBXb3JsZCEiOwotCQkJUG9pbnQgZXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHRlc3RTdHJpbmcpOwotCQkJZ2MuZHJhd1N0cmluZyh0ZXN0U3RyaW5nLCBsZWZ0TWFyZ2luLCB0b3BNYXJnaW4pOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChyZWQpOwotCQkJZ2MuZHJhd1JlY3RhbmdsZShsZWZ0TWFyZ2luLCB0b3BNYXJnaW4sIGV4dGVudC54LCBleHRlbnQueSk7Ci0JCQlwcmludGVyLmVuZFBhZ2UoKTsKLQkJfQotCQlnYy5kaXNwb3NlKCk7Ci0JCXByaW50ZXIuZW5kSm9iKCk7Ci0JfQotCXByaW50ZXIuZGlzcG9zZSgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5YzYyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogUHJpbnRpbmcgZXhhbXBsZSBzbmlwcGV0OiBwcmludCB0ZXh0IHRvIHByaW50ZXIsIHdpdGggd29yZCB3cmFwIGFuZCBwYWdpbmF0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTMzIHsKLQlEaXNwbGF5IGRpc3BsYXk7Ci0JU2hlbGwgc2hlbGw7Ci0JVGV4dCB0ZXh0OwotCUZvbnQgZm9udDsKLQlDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQkKLQlQcmludGVyIHByaW50ZXI7Ci0JR0MgZ2M7Ci0JRm9udERhdGFbXSBwcmludGVyRm9udERhdGE7Ci0JUkdCIHByaW50ZXJGb3JlZ3JvdW5kLCBwcmludGVyQmFja2dyb3VuZDsKLQotCWludCBsaW5lSGVpZ2h0ID0gMDsKLQlpbnQgdGFiV2lkdGggPSAwOwotCWludCBsZWZ0TWFyZ2luLCByaWdodE1hcmdpbiwgdG9wTWFyZ2luLCBib3R0b21NYXJnaW47Ci0JaW50IHgsIHk7Ci0JaW50IGluZGV4LCBlbmQ7Ci0JU3RyaW5nIHRleHRUb1ByaW50OwotCVN0cmluZyB0YWJzOwotCVN0cmluZ0J1ZmZlciB3b3JkQnVmZmVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgU25pcHBldDEzMygpLm9wZW4oKTsKLQl9Ci0JCi0Jdm9pZCBvcGVuKCkgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJc2hlbGwuc2V0VGV4dCgiUHJpbnQgVGV4dCIpOwotCQl0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkKLQkJTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJaXRlbS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IGZpbGVNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldE1lbnUoZmlsZU1lbnUpOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiJk9wZW4uLi4iKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuQ1RSTCArICdPJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVPcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiRm9udC4uLiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51Rm9udCgpOwotCQkJfQotCQl9KTsKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIkZvcmVncm91bmQgQ29sb3IuLi4iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUZvcmVncm91bmRDb2xvcigpOwotCQkJfQotCQl9KTsKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIkJhY2tncm91bmQgQ29sb3IuLi4iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUJhY2tncm91bmRDb2xvcigpOwotCQkJfQotCQl9KTsKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIiZQcmludC4uLiIpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DVFJMICsgJ1AnKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVByaW50KCk7Ci0JCQl9Ci0JCX0pOwotCQluZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiRSZ4aXQiKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWlmIChmb250ICE9IG51bGwpIGZvbnQuZGlzcG9zZSgpOwotCQlpZiAoZm9yZWdyb3VuZENvbG9yICE9IG51bGwpIGZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCWlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQkKLQl2b2lkIG1lbnVPcGVuKCkgewotCQlmaW5hbCBTdHJpbmcgdGV4dFN0cmluZzsKLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmphdmEiLCAiKi4qIn0pOwotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5sZW5ndGgoKSA9PSAwKSkgcmV0dXJuOwotCQotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobmFtZSk7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gc3RyZWFtPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUuZ2V0UGF0aCgpKTsKLQkJCXRyeSB7Ci0JCQkJUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pKTsKLQkJCQljaGFyW10gcmVhZEJ1ZmZlcj0gbmV3IGNoYXJbMjA0OF07Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigoaW50KSBmaWxlLmxlbmd0aCgpKTsKLQkJCQlpbnQgbjsKLQkJCQl3aGlsZSAoKG4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpKSA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQl9Ci0JCQkJdGV4dFN0cmluZyA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQkJCQlib3guc2V0TWVzc2FnZSgiRXJyb3IgcmVhZGluZyBmaWxlOlxuIiArIG5hbWUpOwotCQkJCWJveC5vcGVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQkJYm94LnNldE1lc3NhZ2UoIkZpbGUgbm90IGZvdW5kOlxuIiArIG5hbWUpOwotCQkJYm94Lm9wZW4oKTsKLQkJCXJldHVybjsKLQkJfQkKLQkJdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCX0KLQotCXZvaWQgbWVudUZvbnQoKSB7Ci0JCUZvbnREaWFsb2cgZm9udERpYWxvZyA9IG5ldyBGb250RGlhbG9nKHNoZWxsKTsKLQkJZm9udERpYWxvZy5zZXRGb250TGlzdCh0ZXh0LmdldEZvbnQoKS5nZXRGb250RGF0YSgpKTsKLQkJRm9udERhdGEgZm9udERhdGEgPSBmb250RGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZvbnREYXRhICE9IG51bGwpIHsKLQkJCWlmIChmb250ICE9IG51bGwpIGZvbnQuZGlzcG9zZSgpOwotCQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZvbnREYXRhKTsKLQkJCXRleHQuc2V0Rm9udChmb250KTsKLQkJfQotCX0KLQotCXZvaWQgbWVudUZvcmVncm91bmRDb2xvcigpIHsKLQkJQ29sb3JEaWFsb2cgY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQljb2xvckRpYWxvZy5zZXRSR0IodGV4dC5nZXRGb3JlZ3JvdW5kKCkuZ2V0UkdCKCkpOwotCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQlpZiAocmdiICE9IG51bGwpIHsKLQkJCWlmIChmb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgZm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCWZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IpOwotCQkJdGV4dC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0JCUNvbG9yRGlhbG9nIGNvbG9yRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKHNoZWxsKTsKLQkJY29sb3JEaWFsb2cuc2V0UkdCKHRleHQuZ2V0QmFja2dyb3VuZCgpLmdldFJHQigpKTsKLQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJnYiAhPSBudWxsKSB7Ci0JCQlpZiAoYmFja2dyb3VuZENvbG9yICE9IG51bGwpIGJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQliYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdiKTsKLQkJCXRleHQuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51UHJpbnQoKSB7Ci0JCVByaW50RGlhbG9nIGRpYWxvZyA9IG5ldyBQcmludERpYWxvZyhzaGVsbCwgU1dULk5PTkUpOwotCQlQcmludGVyRGF0YSBkYXRhID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoZGF0YS5wcmludFRvRmlsZSkgewotCQkJZGF0YS5maWxlTmFtZSA9ICJwcmludC5vdXQiOyAvLyB5b3UgcHJvYmFibHkgd2FudCB0byBhc2sgdGhlIHVzZXIgZm9yIGEgZmlsZW5hbWUKLQkJfQotCQkKLQkJLyogR2V0IHRoZSB0ZXh0IHRvIHByaW50IGZyb20gdGhlIFRleHQgd2lkZ2V0ICh5b3UgY291bGQgZ2V0IGl0IGZyb20gYW55d2hlcmUsIGkuZS4geW91ciBqYXZhIG1vZGVsKSAqLwotCQl0ZXh0VG9QcmludCA9IHRleHQuZ2V0VGV4dCgpOwotCi0JCS8qIEdldCB0aGUgZm9udCAmIGZvcmVncm91bmQgJiBiYWNrZ3JvdW5kIGRhdGEuICovCi0JCXByaW50ZXJGb250RGF0YSA9IHRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0JCXByaW50ZXJGb3JlZ3JvdW5kID0gdGV4dC5nZXRGb3JlZ3JvdW5kKCkuZ2V0UkdCKCk7Ci0JCXByaW50ZXJCYWNrZ3JvdW5kID0gdGV4dC5nZXRCYWNrZ3JvdW5kKCkuZ2V0UkdCKCk7Ci0JCQotCQkvKiBEbyB0aGUgcHJpbnRpbmcgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZCBzbyB0aGF0IHNwb29saW5nIGRvZXMgbm90IGZyZWV6ZSB0aGUgVUkuICovCi0JCXByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQkJVGhyZWFkIHByaW50aW5nVGhyZWFkID0gbmV3IFRocmVhZCgiUHJpbnRpbmciKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJpbnQocHJpbnRlcik7Ci0JCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX07Ci0JCXByaW50aW5nVGhyZWFkLnN0YXJ0KCk7Ci0JfQotCQotCXZvaWQgcHJpbnQoUHJpbnRlciBwcmludGVyKSB7Ci0JCWlmIChwcmludGVyLnN0YXJ0Sm9iKCJUZXh0IikpIHsgICAvLyB0aGUgc3RyaW5nIGlzIHRoZSBqb2IgbmFtZSAtIHNob3dzIHVwIGluIHRoZSBwcmludGVyJ3Mgam9iIGxpc3QKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcHJpbnRlci5nZXRDbGllbnRBcmVhKCk7Ci0JCQlSZWN0YW5nbGUgdHJpbSA9IHByaW50ZXIuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCQlQb2ludCBkcGkgPSBwcmludGVyLmdldERQSSgpOwotCQkJbGVmdE1hcmdpbiA9IGRwaS54ICsgdHJpbS54OyAvLyBvbmUgaW5jaCBmcm9tIGxlZnQgc2lkZSBvZiBwYXBlcgotCQkJcmlnaHRNYXJnaW4gPSBjbGllbnRBcmVhLndpZHRoIC0gZHBpLnggKyB0cmltLnggKyB0cmltLndpZHRoOyAvLyBvbmUgaW5jaCBmcm9tIHJpZ2h0IHNpZGUgb2YgcGFwZXIKLQkJCXRvcE1hcmdpbiA9IGRwaS55ICsgdHJpbS55OyAvLyBvbmUgaW5jaCBmcm9tIHRvcCBlZGdlIG9mIHBhcGVyCi0JCQlib3R0b21NYXJnaW4gPSBjbGllbnRBcmVhLmhlaWdodCAtIGRwaS55ICsgdHJpbS55ICsgdHJpbS5oZWlnaHQ7IC8vIG9uZSBpbmNoIGZyb20gYm90dG9tIGVkZ2Ugb2YgcGFwZXIKLQkJCQotCQkJLyogQ3JlYXRlIGEgYnVmZmVyIGZvciBjb21wdXRpbmcgdGFiIHdpZHRoLiAqLwotCQkJaW50IHRhYlNpemUgPSA0OyAvLyBpcyB0YWIgd2lkdGggYSB1c2VyIHNldHRpbmcgaW4geW91ciBVST8KLQkJCVN0cmluZ0J1ZmZlciB0YWJCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRhYlNpemUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJTaXplOyBpKyspIHRhYkJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCXRhYnMgPSB0YWJCdWZmZXIudG9TdHJpbmcoKTsKLQotCQkJLyogQ3JlYXRlIHByaW50ZXIgR0MsIGFuZCBjcmVhdGUgYW5kIHNldCB0aGUgcHJpbnRlciBmb250ICYgZm9yZWdyb3VuZCBjb2xvci4gKi8KLQkJCWdjID0gbmV3IEdDKHByaW50ZXIpOwotCQkJRm9udCBwcmludGVyRm9udCA9IG5ldyBGb250KHByaW50ZXIsIHByaW50ZXJGb250RGF0YSk7Ci0JCQlDb2xvciBwcmludGVyRm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKHByaW50ZXIsIHByaW50ZXJGb3JlZ3JvdW5kKTsKLQkJCUNvbG9yIHByaW50ZXJCYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IocHJpbnRlciwgcHJpbnRlckJhY2tncm91bmQpOyAKLQkJCQotCQkJZ2Muc2V0Rm9udChwcmludGVyRm9udCk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKHByaW50ZXJGb3JlZ3JvdW5kQ29sb3IpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChwcmludGVyQmFja2dyb3VuZENvbG9yKTsKLQkJCXRhYldpZHRoID0gZ2Muc3RyaW5nRXh0ZW50KHRhYnMpLng7Ci0JCQlsaW5lSGVpZ2h0ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsKLQkJCi0JCQkvKiBQcmludCB0ZXh0IHRvIGN1cnJlbnQgZ2MgdXNpbmcgd29yZCB3cmFwICovCi0JCQlwcmludFRleHQoKTsKLQkJCXByaW50ZXIuZW5kSm9iKCk7Ci0KLQkJCS8qIENsZWFudXAgZ3JhcGhpY3MgcmVzb3VyY2VzIHVzZWQgaW4gcHJpbnRpbmcgKi8KLQkJCXByaW50ZXJGb250LmRpc3Bvc2UoKTsKLQkJCXByaW50ZXJGb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJcHJpbnRlckJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBwcmludFRleHQoKSB7Ci0JCXByaW50ZXIuc3RhcnRQYWdlKCk7Ci0JCXdvcmRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXggPSBsZWZ0TWFyZ2luOwotCQl5ID0gdG9wTWFyZ2luOwotCQlpbmRleCA9IDA7Ci0JCWVuZCA9IHRleHRUb1ByaW50Lmxlbmd0aCgpOwotCQl3aGlsZSAoaW5kZXggPCBlbmQpIHsKLQkJCWNoYXIgYyA9IHRleHRUb1ByaW50LmNoYXJBdChpbmRleCk7Ci0JCQlpbmRleCsrOwotCQkJaWYgKGMgIT0gMCkgewotCQkJCWlmIChjID09IDB4MGEgfHwgYyA9PSAweDBkKSB7Ci0JCQkJCWlmIChjID09IDB4MGQgJiYgaW5kZXggPCBlbmQgJiYgdGV4dFRvUHJpbnQuY2hhckF0KGluZGV4KSA9PSAweDBhKSB7Ci0JCQkJCQlpbmRleCsrOyAvLyBpZiB0aGlzIGlzIGNyLWxmLCBza2lwIHRoZSBsZgotCQkJCQl9Ci0JCQkJCXByaW50V29yZEJ1ZmZlcigpOwotCQkJCQluZXdsaW5lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGMgIT0gJ1x0JykgewotCQkJCQkJd29yZEJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJCX0KLQkJCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQkJCXByaW50V29yZEJ1ZmZlcigpOwotCQkJCQkJaWYgKGMgPT0gJ1x0JykgewotCQkJCQkJCXggKz0gdGFiV2lkdGg7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHkgKyBsaW5lSGVpZ2h0IDw9IGJvdHRvbU1hcmdpbikgewotCQkJcHJpbnRlci5lbmRQYWdlKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHByaW50V29yZEJ1ZmZlcigpIHsKLQkJaWYgKHdvcmRCdWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgd29yZCA9IHdvcmRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCWludCB3b3JkV2lkdGggPSBnYy5zdHJpbmdFeHRlbnQod29yZCkueDsKLQkJCWlmICh4ICsgd29yZFdpZHRoID4gcmlnaHRNYXJnaW4pIHsKLQkJCQkvKiB3b3JkIGRvZXNuJ3QgZml0IG9uIGN1cnJlbnQgbGluZSwgc28gd3JhcCAqLwotCQkJCW5ld2xpbmUoKTsKLQkJCX0KLQkJCWdjLmRyYXdTdHJpbmcod29yZCwgeCwgeSwgZmFsc2UpOwotCQkJeCArPSB3b3JkV2lkdGg7Ci0JCQl3b3JkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JfQotCi0Jdm9pZCBuZXdsaW5lKCkgewotCQl4ID0gbGVmdE1hcmdpbjsKLQkJeSArPSBsaW5lSGVpZ2h0OwotCQlpZiAoeSArIGxpbmVIZWlnaHQgPiBib3R0b21NYXJnaW4pIHsKLQkJCXByaW50ZXIuZW5kUGFnZSgpOwotCQkJaWYgKGluZGV4ICsgMSA8IGVuZCkgewotCQkJCXkgPSB0b3BNYXJnaW47Ci0JCQkJcHJpbnRlci5zdGFydFBhZ2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkODE5YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbm9uLXJlY3Rhbmd1bGFyIHdpbmRvdwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM0IHsKLQotc3RhdGljIGludFtdIGNpcmNsZShpbnQgciwgaW50IG9mZnNldFgsIGludCBvZmZzZXRZKSB7Ci0JaW50W10gcG9seWdvbiA9IG5ldyBpbnRbOCAqIHIgKyA0XTsKLQkvL3heMiArIHleMiA9IHJeMgotCWZvciAoaW50IGkgPSAwOyBpIDwgMiAqIHIgKyAxOyBpKyspIHsKLQkJaW50IHggPSBpIC0gcjsKLQkJaW50IHkgPSAoaW50KU1hdGguc3FydChyKnIgLSB4KngpOwotCQlwb2x5Z29uWzIqaV0gPSBvZmZzZXRYICsgeDsKLQkJcG9seWdvblsyKmkrMV0gPSBvZmZzZXRZICsgeTsKLQkJcG9seWdvbls4KnIgLSAyKmkgLSAyXSA9IG9mZnNldFggKyB4OwotCQlwb2x5Z29uWzgqciAtIDIqaSAtIDFdID0gb2Zmc2V0WSAtIHk7Ci0JfQotCXJldHVybiBwb2x5Z29uOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkvL1NoZWxsIG11c3QgYmUgY3JlYXRlZCB3aXRoIHN0eWxlIFNXVC5OT19UUklNCi0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULk5PX1RSSU0gfCBTV1QuT05fVE9QKTsKLQlzaGVsbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCS8vZGVmaW5lIGEgcmVnaW9uIHRoYXQgbG9va3MgbGlrZSBhIGtleSBob2xlCi0JUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQlyZWdpb24uYWRkKGNpcmNsZSg2NywgNjcsIDY3KSk7Ci0JcmVnaW9uLnN1YnRyYWN0KGNpcmNsZSgyMCwgNjcsIDUwKSk7Ci0JcmVnaW9uLnN1YnRyYWN0KG5ldyBpbnRbXXs2NywgNTAsIDU1LCAxMDUsIDc5LCAxMDV9KTsKLQkvL2RlZmluZSB0aGUgc2hhcGUgb2YgdGhlIHNoZWxsIHVzaW5nIHNldFJlZ2lvbgotCXNoZWxsLnNldFJlZ2lvbihyZWdpb24pOwotCVJlY3RhbmdsZSBzaXplID0gcmVnaW9uLmdldEJvdW5kcygpOwotCXNoZWxsLnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOwotCS8vYWRkIGFiaWxpdHkgdG8gbW92ZSBzaGVsbCBhcm91bmQKLQlMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCkgewotCQlQb2ludCBvcmlnaW47Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCXN3aXRjaCAoZS50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlvcmlnaW4gPSBuZXcgUG9pbnQoZS54LCBlLnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZVVwOgotCQkJCQlvcmlnaW4gPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQkJCWlmIChvcmlnaW4gIT0gbnVsbCkgewotCQkJCQkJUG9pbnQgcCA9IGRpc3BsYXkubWFwKHNoZWxsLCBudWxsLCBlLngsIGUueSk7Ci0JCQkJCQlzaGVsbC5zZXRMb2NhdGlvbihwLnggLSBvcmlnaW4ueCwgcC55IC0gb3JpZ2luLnkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBsKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VVcCwgbCk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgbCk7Ci0JLy9hZGQgYWJpbGl0eSB0byBjbG9zZSBzaGVsbAotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0QmFja2dyb3VuZChzaGVsbC5nZXRCYWNrZ3JvdW5kKCkpOwotCWIuc2V0VGV4dCgiY2xvc2UiKTsKLQliLnBhY2soKTsKLQliLnNldExvY2F0aW9uKDEwLCA2OCk7Ci0JYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlyZWdpb24uZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjhmNzE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogZW1iZWQgU3dpbmcvQVdUIGluIFNXVAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVDsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzUgewotCi0Jc3RhdGljIGNsYXNzIEZpbGVUYWJsZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsIHsJCQotCQlGaWxlW10gZmlsZXM7ICAgICAgICAKLQkJU3RyaW5nW10gY29sdW1uc05hbWUgPSB7Ik5hbWUiLCAiU2l6ZSIsICJEYXRlIE1vZGlmaWVkIn07Ci0JCQotCQlwdWJsaWMgRmlsZVRhYmxlTW9kZWwgKEZpbGVbXSBmaWxlcykgewotCQkJdGhpcy5maWxlcyA9IGZpbGVzOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQgKCkgewotCQkJcmV0dXJuIGNvbHVtbnNOYW1lLmxlbmd0aDsKLQkJfQotCQlwdWJsaWMgQ2xhc3MgZ2V0Q29sdW1uQ2xhc3MgKGludCBjb2wpIHsKLQkJCWlmIChjb2wgPT0gMSkgcmV0dXJuIExvbmcuY2xhc3M7Ci0JCQlpZiAoY29sID09IDIpIHJldHVybiBEYXRlLmNsYXNzOwotCQkJcmV0dXJuIFN0cmluZy5jbGFzczsKLQkJfQotCQlwdWJsaWMgaW50IGdldFJvd0NvdW50ICgpIHsKLQkJCXJldHVybiBmaWxlcyA9PSBudWxsID8gMCA6IGZpbGVzLmxlbmd0aDsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQgKGludCByb3csIGludCBjb2wpIHsKLQkJCWlmIChjb2wgPT0gMCkgcmV0dXJuIGZpbGVzW3Jvd10uZ2V0TmFtZSgpOwotCQkJaWYgKGNvbCA9PSAxKSByZXR1cm4gbmV3IExvbmcoZmlsZXNbcm93XS5sZW5ndGgoKSk7Ci0JCQlpZiAoY29sID09IDIpIHJldHVybiBuZXcgRGF0ZShmaWxlc1tyb3ddLmxhc3RNb2RpZmllZCgpKTsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUgKGludCBjb2wpIHsKLQkJCXJldHVybiBjb2x1bW5zTmFtZVtjb2xdOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiU1dUIGFuZCBTd2luZy9BV1QgRXhhbXBsZSIpOwotCi0JCUxpc3RlbmVyIGV4aXRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuT0sgfCBTV1QuQ0FOQ0VMIHwgU1dULklDT05fUVVFU1RJT04pOwotCQkJCWRpYWxvZy5zZXRUZXh0KCJRdWVzdGlvbiIpOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKCJFeGl0PyIpOwotCQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKSBlLmRvaXQgPSBmYWxzZTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBTV1QuT0spIHJldHVybjsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX07CQotCQlMaXN0ZW5lciBhYm91dExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWZpbmFsIFNoZWxsIHMgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCQkJcy5zZXRUZXh0KCJBYm91dCIpOwotCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCQkJcy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzLCBTV1QuTk9ORSk7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiU1dUIGFuZCBBV1QgRXhhbXBsZS4iKTsKLQkJCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzLCBTV1QuUFVTSCk7Ci0JCQkJYnV0dG9uLnNldFRleHQoIk9LIik7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLQkJCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQkJcy5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlzLnBhY2soKTsKLQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHMuZ2V0Qm91bmRzKCk7Ci0JCQkJaW50IHggPSBwYXJlbnRCb3VuZHMueCArIChwYXJlbnRCb3VuZHMud2lkdGggLSBib3VuZHMud2lkdGgpIC8gMjsKLQkJCQlpbnQgeSA9IHBhcmVudEJvdW5kcy55ICsgKHBhcmVudEJvdW5kcy5oZWlnaHQgLSBib3VuZHMuaGVpZ2h0KSAvIDI7Ci0JCQkJcy5zZXRMb2NhdGlvbih4LCB5KTsKLQkJCQlzLm9wZW4oKTsKLQkJCQl3aGlsZSAoIXMuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBleGl0TGlzdGVuZXIpOwotCQlNZW51IG1iID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbShtYiwgU1dULkNBU0NBREUpOwotCQlmaWxlSXRlbS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IGZpbGVNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCQlmaWxlSXRlbS5zZXRNZW51KGZpbGVNZW51KTsKLQkJTWVudUl0ZW0gZXhpdEl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJZXhpdEl0ZW0uc2V0VGV4dCgiJkV4aXRcdEN0cmwrWCIpOwotCQlleGl0SXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuQ09OVFJPTCArICdYJyk7Ci0JCWV4aXRJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGV4aXRMaXN0ZW5lcik7Ci0JCU1lbnVJdGVtIGFib3V0SXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlhYm91dEl0ZW0uc2V0VGV4dCgiJkFib3V0XHRDdHJsK0EiKTsKLQkJYWJvdXRJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DT05UUk9MICsgJ0EnKTsKLQkJYWJvdXRJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGFib3V0TGlzdGVuZXIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1iKTsKLQotCQlSR0IgY29sb3IgPSBzaGVsbC5nZXRCYWNrZ3JvdW5kKCkuZ2V0UkdCKCk7Ci0JCUxhYmVsIHNlcGFyYXRvcjEgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUxhYmVsIGxvY2F0aW9uTGIgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJbG9jYXRpb25MYi5zZXRUZXh0KCJMb2NhdGlvbjoiKTsKLQkJQ29tcG9zaXRlIGxvY2F0aW9uQ29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5FTUJFRERFRCk7Ci0JCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuRkxBVCk7Ci0JCVRvb2xJdGVtIGV4aXRUb29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWV4aXRUb29sSXRlbS5zZXRUZXh0KCImRXhpdCIpOwotCQlleGl0VG9vbEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZXhpdExpc3RlbmVyKTsKLQkJVG9vbEl0ZW0gYWJvdXRUb29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWFib3V0VG9vbEl0ZW0uc2V0VGV4dCgiJkFib3V0Iik7Ci0JCWFib3V0VG9vbEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgYWJvdXRMaXN0ZW5lcik7Ci0JCUxhYmVsIHNlcGFyYXRvcjIgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQlmaW5hbCBUcmVlIGZpbGVUcmVlID0gbmV3IFRyZWUoY29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlTYXNoIHNhc2ggPSBuZXcgU2FzaChjb21wLCBTV1QuVkVSVElDQUwpOwotCQlDb21wb3NpdGUgdGFibGVDb21wID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuRU1CRURERUQpOwotCQlMYWJlbCBzZXBhcmF0b3IzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3RhdHVzQ29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5FTUJFRERFRCk7Ci0KLQkJamF2YS5hd3QuRnJhbWUgbG9jYXRpb25GcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKGxvY2F0aW9uQ29tcCk7Ci0JCWZpbmFsIGphdmEuYXd0LlRleHRGaWVsZCBsb2NhdGlvblRleHQgPSBuZXcgamF2YS5hd3QuVGV4dEZpZWxkKCk7Ci0JCWxvY2F0aW9uRnJhbWUuYWRkKGxvY2F0aW9uVGV4dCk7Ci0KLQkJamF2YS5hd3QuRnJhbWUgZmlsZVRhYmxlRnJhbWUgPSBTV1RfQVdULm5ld19GcmFtZSh0YWJsZUNvbXApOwotCQlqYXZhLmF3dC5QYW5lbCBwYW5lbCA9IG5ldyBqYXZhLmF3dC5QYW5lbChuZXcgamF2YS5hd3QuQm9yZGVyTGF5b3V0KCkpOwotCQlmaWxlVGFibGVGcmFtZS5hZGQocGFuZWwpOwotCQlmaW5hbCBKVGFibGUgZmlsZVRhYmxlID0gbmV3IEpUYWJsZShuZXcgRmlsZVRhYmxlTW9kZWwobnVsbCkpOwotCQlmaWxlVGFibGUuc2V0RG91YmxlQnVmZmVyZWQodHJ1ZSk7Ci0JCWZpbGVUYWJsZS5zZXRTaG93R3JpZChmYWxzZSk7Ci0JCWZpbGVUYWJsZS5jcmVhdGVEZWZhdWx0Q29sdW1uc0Zyb21Nb2RlbCgpOwotCQlKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKGZpbGVUYWJsZSk7Ci0JCXBhbmVsLmFkZChzY3JvbGxQYW5lKTsKLQotCQlqYXZhLmF3dC5GcmFtZSBzdGF0dXNGcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKHN0YXR1c0NvbXApOwotCQlzdGF0dXNGcmFtZS5zZXRCYWNrZ3JvdW5kKG5ldyBqYXZhLmF3dC5Db2xvcihjb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlKSk7Ci0JCWZpbmFsIGphdmEuYXd0LkxhYmVsIHN0YXR1c0xhYmVsID0gbmV3IGphdmEuYXd0LkxhYmVsKCk7Ci0JCXN0YXR1c0ZyYW1lLmFkZChzdGF0dXNMYWJlbCk7Ci0JCXN0YXR1c0xhYmVsLnNldFRleHQoIlNlbGVjdCBhIGZpbGUiKTsKLQotCQlzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULkRSQUcpIHJldHVybjsKLQkJCQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKWZpbGVUcmVlLmdldExheW91dERhdGEoKTsKLQkJCQlSZWN0YW5nbGUgdHJpbSA9IGZpbGVUcmVlLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotCQkJCWRhdGEud2lkdGhIaW50ID0gZS54IC0gdHJpbS53aWR0aDsKLQkJCQljb21wLmxheW91dCgpOwotCQkJfQotCQl9KTsKLQotCQlGaWxlW10gcm9vdHMgPSBGaWxlLmxpc3RSb290cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSByb290c1tpXTsKLQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtKGZpbGVUcmVlLCBTV1QuTk9ORSk7Ci0JCQl0cmVlSXRlbS5zZXRUZXh0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJdHJlZUl0ZW0uc2V0RGF0YShmaWxlKTsKLQkJCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCQl9Ci0JCWZpbGVUcmVlLmFkZExpc3RlbmVyKFNXVC5FeHBhbmQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWUuaXRlbTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJaWYgKGl0ZW0uZ2V0SXRlbUNvdW50KCkgPT0gMSkgewotCQkJCQlUcmVlSXRlbSBmaXJzdEl0ZW0gPSBpdGVtLmdldEl0ZW1zKClbMF07Ci0JCQkJCWlmIChmaXJzdEl0ZW0uZ2V0RGF0YSgpICE9IG51bGwpIHJldHVybjsKLQkJCQkJZmlyc3RJdGVtLmRpc3Bvc2UoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUZpbGUgcm9vdCA9IChGaWxlKWl0ZW0uZ2V0RGF0YSgpOwotCQkJCUZpbGVbXSBmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0JCQkJaWYgKGZpbGVzID09IG51bGwpIHJldHVybjsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQlUcmVlSXRlbSB0cmVlSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCQl0cmVlSXRlbS5zZXRUZXh0KGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQkJCXRyZWVJdGVtLnNldERhdGEoZmlsZSk7Ci0JCQkJCQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZpbGVUcmVlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWUuaXRlbTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJZmluYWwgRmlsZSByb290ID0gKEZpbGUpaXRlbS5nZXREYXRhKCk7Ci0JCQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXN0YXR1c0xhYmVsLnNldFRleHQocm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlsb2NhdGlvblRleHQuc2V0VGV4dChyb290LmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWZpbGVUYWJsZS5zZXRNb2RlbChuZXcgRmlsZVRhYmxlTW9kZWwocm9vdC5saXN0RmlsZXMoKSkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCg0LCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGE7CQkKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJc2VwYXJhdG9yMS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJbG9jYXRpb25MYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBsb2NhdGlvblRleHQuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJbG9jYXRpb25Db21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCXRvb2xCYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJc2VwYXJhdG9yMi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQljb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCXNlcGFyYXRvcjMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gc3RhdHVzTGFiZWwuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJc3RhdHVzQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7CQkJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjAwOwotCQlmaWxlVHJlZS5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCXNhc2guc2V0TGF5b3V0RGF0YShkYXRhKTsJCQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXRhYmxlQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQ1M2IxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogcmVuZGVyIEhUTUwgZnJvbSBtZW1vcnkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNiB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJU3RyaW5nIGh0bWwgPSAiPEhUTUw+PEhFQUQ+PFRJVExFPkhUTUwgVGVzdDwvVElUTEU+PC9IRUFEPjxCT0RZPiI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGh0bWwgKz0gIjxQPlRoaXMgaXMgbGluZSAiK2krIjwvUD4iOwotCQlodG1sICs9ICI8L0JPRFk+PC9IVE1MPiI7Ci0KLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkOWY1OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IHJlbmRlciBIVE1MIHRoYXQgaW5jbHVkZXMgcmVsYXRpdmUgbGlua3MgZnJvbSBtZW1vcnkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JLyogUmVsYXRpdmUgbGlua3M6IHVzZSB0aGUgSFRNTCBiYXNlIHRhZyAqLwotCVN0cmluZyBodG1sID0gIjxodG1sPjxoZWFkPiIrCi0JCSI8YmFzZSBocmVmPVwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvXCIgPiIrCi0JCSI8dGl0bGU+SFRNTCBUZXN0PC90aXRsZT48L2hlYWQ+IisKLQkJIjxib2R5PjxhIGhyZWY9XCJmYXEucGhwXCI+bG9jYWwgbGluazwvYT48L2JvZHk+PC9odG1sPiI7Ci0KLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlCcm93c2VyIGJyb3dzZXI7Ci0JdHJ5IHsKLQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuOwotCX0KLQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzg0MjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IHNldCBpY29ucyB3aXRoIGRpZmZlcmVudCByZXNvbHV0aW9ucwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM4IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCQotCQlJbWFnZSBzbWFsbCA9IG5ldyBJbWFnZShkaXNwbGF5LCAxNiwgMTYpOwotCQlHQyBnYyA9IG5ldyBHQyhzbWFsbCk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxBcmMoMCwgMCwgMTYsIDE2LCA0NSwgMjcwKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQkKLQkJSW1hZ2UgbGFyZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMzIsIDMyKTsKLQkJZ2MgPSBuZXcgR0MobGFyZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQlnYy5maWxsQXJjKDAsIDAsIDMyLCAzMiwgNDUsIDI3MCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJCi0JCS8qIFByb3ZpZGUgZGlmZmVyZW50IHJlc29sdXRpb25zIGZvciBpY29ucyB0byBnZXQKLQkJICogaGlnaCBxdWFsaXR5IHJlbmRlcmluZyB3aGVyZXZlciB0aGUgT1MgbmVlZHMgCi0JCSAqIGxhcmdlIGljb25zLiBGb3IgZXhhbXBsZSwgdGhlIEFMVCtUQUIgd2luZG93IAotCQkgKiBvbiBjZXJ0YWluIHN5c3RlbXMgdXNlcyBhIGxhcmdlciBpY29uLgotCQkgKi8KLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIlNtYWxsIGFuZCBMYXJnZSBpY29ucyIpOwotCQlzaGVsbC5zZXRJbWFnZXMobmV3IEltYWdlW10ge3NtYWxsLCBsYXJnZX0pOwotCi0JCS8qIE5vIGxhcmdlIGljb246IHRoZSBPUyB3aWxsIHNjYWxlIHVwIHRoZQotCQkgKiBzbWFsbCBpY29uIHdoZW4gaXQgbmVlZHMgYSBsYXJnZSBvbmUuCi0JCSAqLwotCQlTaGVsbCBzaGVsbDIgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsMi5zZXRUZXh0KCJTbWFsbCBpY29uIik7Ci0JCXNoZWxsMi5zZXRJbWFnZShzbWFsbCk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCXNoZWxsMi5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCXNtYWxsLmRpc3Bvc2UoKTsKLQkJbGFyZ2UuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDlmYWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGhpcyBzbmlwcGV0IHdhcyBhZGFwdGVkIGZyb20gb3JnLmVjbGlwc2UuZHJhdzJkLkltYWdlVXRpbGl0aWVzIGluIAotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5kcmF3MmQvP2N2c3Jvb3Q9VG9vbHNfUHJvamVjdAotICogYnkgUHJhdGlrIFNoYWguCi0gKgotICogZXhhbXBsZSBzbmlwcGV0OiByb3RhdGUgYW5kIGZsaXAgYW4gaW1hZ2UKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM5IHsJCi0KLXN0YXRpYyBJbWFnZURhdGEgcm90YXRlKEltYWdlRGF0YSBzcmNEYXRhLCBpbnQgZGlyZWN0aW9uKSB7Ci0JaW50IGJ5dGVzUGVyUGl4ZWwgPSBzcmNEYXRhLmJ5dGVzUGVyTGluZSAvIHNyY0RhdGEud2lkdGg7Ci0JaW50IGRlc3RCeXRlc1BlckxpbmUgPSAoZGlyZWN0aW9uID09IFNXVC5ET1dOKT8gc3JjRGF0YS53aWR0aCAqIGJ5dGVzUGVyUGl4ZWwgOiBzcmNEYXRhLmhlaWdodCAqIGJ5dGVzUGVyUGl4ZWw7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVsoZGlyZWN0aW9uID09IFNXVC5ET1dOKT8gc3JjRGF0YS5oZWlnaHQgKiBkZXN0Qnl0ZXNQZXJMaW5lIDogc3JjRGF0YS53aWR0aCAqIGRlc3RCeXRlc1BlckxpbmVdOwotCWludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0JZm9yIChpbnQgc3JjWSA9IDA7IHNyY1kgPCBzcmNEYXRhLmhlaWdodDsgc3JjWSsrKSB7Ci0JCWZvciAoaW50IHNyY1ggPSAwOyBzcmNYIDwgc3JjRGF0YS53aWR0aDsgc3JjWCsrKSB7Ci0JCQlpbnQgZGVzdFggPSAwLCBkZXN0WSA9IDAsIGRlc3RJbmRleCA9IDAsIHNyY0luZGV4ID0gMDsKLQkJCXN3aXRjaCAoZGlyZWN0aW9uKXsKLQkJCQljYXNlIFNXVC5MRUZUOiAvLyBsZWZ0IDkwIGRlZ3JlZXMKLQkJCQkJZGVzdFggPSBzcmNZOwotCQkJCQlkZXN0WSA9IHNyY0RhdGEud2lkdGggLSBzcmNYIC0gMTsKLQkJCQkJd2lkdGggPSBzcmNEYXRhLmhlaWdodDsKLQkJCQkJaGVpZ2h0ID0gc3JjRGF0YS53aWR0aDsgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULlJJR0hUOiAvLyByaWdodCA5MCBkZWdyZWVzCi0JCQkJCWRlc3RYID0gc3JjRGF0YS5oZWlnaHQgLSBzcmNZIC0gMTsKLQkJCQkJZGVzdFkgPSBzcmNYOwotCQkJCQl3aWR0aCA9IHNyY0RhdGEuaGVpZ2h0OwotCQkJCQloZWlnaHQgPSBzcmNEYXRhLndpZHRoOyAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuRE9XTjogLy8gMTgwIGRlZ3JlZXMKLQkJCQkJZGVzdFggPSBzcmNEYXRhLndpZHRoIC0gc3JjWCAtIDE7Ci0JCQkJCWRlc3RZID0gc3JjRGF0YS5oZWlnaHQgLSBzcmNZIC0gMTsKLQkJCQkJd2lkdGggPSBzcmNEYXRhLndpZHRoOwotCQkJCQloZWlnaHQgPSBzcmNEYXRhLmhlaWdodDsgCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZGVzdEluZGV4ID0gKGRlc3RZICogZGVzdEJ5dGVzUGVyTGluZSkgKyAoZGVzdFggKiBieXRlc1BlclBpeGVsKTsKLQkJCXNyY0luZGV4ID0gKHNyY1kgKiBzcmNEYXRhLmJ5dGVzUGVyTGluZSkgKyAoc3JjWCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJU3lzdGVtLmFycmF5Y29weShzcmNEYXRhLmRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIGJ5dGVzUGVyUGl4ZWwpOwotCQl9Ci0JfQotCS8vIGRlc3RCeXRlc1BlckxpbmUgaXMgdXNlZCBhcyBzY2FubGluZVBhZCB0byBlbnN1cmUgdGhhdCBubyBwYWRkaW5nIGlzIHJlcXVpcmVkCi0JcmV0dXJuIG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgc3JjRGF0YS5kZXB0aCwgc3JjRGF0YS5wYWxldHRlLCBzcmNEYXRhLnNjYW5saW5lUGFkLCBuZXdEYXRhKTsKLX0KLXN0YXRpYyBJbWFnZURhdGEgZmxpcChJbWFnZURhdGEgc3JjRGF0YSwgYm9vbGVhbiB2ZXJ0aWNhbCkgewotCWludCBieXRlc1BlclBpeGVsID0gc3JjRGF0YS5ieXRlc1BlckxpbmUgLyBzcmNEYXRhLndpZHRoOwotCWludCBkZXN0Qnl0ZXNQZXJMaW5lID0gc3JjRGF0YS53aWR0aCAqIGJ5dGVzUGVyUGl4ZWw7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtzcmNEYXRhLmRhdGEubGVuZ3RoXTsKLQlmb3IgKGludCBzcmNZID0gMDsgc3JjWSA8IHNyY0RhdGEuaGVpZ2h0OyBzcmNZKyspIHsKLQkJZm9yIChpbnQgc3JjWCA9IDA7IHNyY1ggPCBzcmNEYXRhLndpZHRoOyBzcmNYKyspIHsKLQkJCWludCBkZXN0WCA9IDAsIGRlc3RZID0gMCwgZGVzdEluZGV4ID0gMCwgc3JjSW5kZXggPSAwOwotCQkJaWYgKHZlcnRpY2FsKXsKLQkJCQlkZXN0WCA9IHNyY1g7Ci0JCQkJZGVzdFkgPSBzcmNEYXRhLmhlaWdodCAtIHNyY1kgLSAxOwotCQkJfSBlbHNlIHsKLQkJCQlkZXN0WCA9IHNyY0RhdGEud2lkdGggLSBzcmNYIC0gMTsKLQkJCQlkZXN0WSA9IHNyY1k7IAotCQkJfQotCQkJZGVzdEluZGV4ID0gKGRlc3RZICogZGVzdEJ5dGVzUGVyTGluZSkgKyAoZGVzdFggKiBieXRlc1BlclBpeGVsKTsKLQkJCXNyY0luZGV4ID0gKHNyY1kgKiBzcmNEYXRhLmJ5dGVzUGVyTGluZSkgKyAoc3JjWCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJU3lzdGVtLmFycmF5Y29weShzcmNEYXRhLmRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIGJ5dGVzUGVyUGl4ZWwpOwotCQl9Ci0JfQotCS8vIGRlc3RCeXRlc1BlckxpbmUgaXMgdXNlZCBhcyBzY2FubGluZVBhZCB0byBlbnN1cmUgdGhhdCBubyBwYWRkaW5nIGlzIHJlcXVpcmVkCi0JcmV0dXJuIG5ldyBJbWFnZURhdGEoc3JjRGF0YS53aWR0aCwgc3JjRGF0YS5oZWlnaHQsIHNyY0RhdGEuZGVwdGgsIHNyY0RhdGEucGFsZXR0ZSwgc3JjRGF0YS5zY2FubGluZVBhZCwgbmV3RGF0YSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQotCS8vIGNyZWF0ZSBhbiBpbWFnZSB3aXRoIHRoZSB3b3JkICJoZWxsbyIgb24gaXQKLQlmaW5hbCBJbWFnZSBpbWFnZTAgPSBuZXcgSW1hZ2UoZGlzcGxheSwgNTAsIDMwKTsKLQlHQyBnYyA9IG5ldyBHQyhpbWFnZTApOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShpbWFnZTAuZ2V0Qm91bmRzKCkpOwotCWdjLmRyYXdTdHJpbmcoImhlbGxvIiwJNSwgNSwgdHJ1ZSk7Ci0JZ2MuZGlzcG9zZSgpOwotCQotCUltYWdlRGF0YSBkYXRhID0gaW1hZ2UwLmdldEltYWdlRGF0YSgpOwotCS8vIHJvdGF0ZSBhbmQgZmxpcCB0aGlzIGltYWdlCi0JZmluYWwgSW1hZ2UgaW1hZ2UxID0gbmV3IEltYWdlKGRpc3BsYXksIHJvdGF0ZShkYXRhLCBTV1QuTEVGVCkpOwotCWZpbmFsIEltYWdlIGltYWdlMiA9IG5ldyBJbWFnZShkaXNwbGF5LCByb3RhdGUoZGF0YSwgU1dULlJJR0hUKSk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UzID0gbmV3IEltYWdlKGRpc3BsYXksIHJvdGF0ZShkYXRhLCBTV1QuRE9XTikpOwotCWZpbmFsIEltYWdlIGltYWdlNCA9IG5ldyBJbWFnZShkaXNwbGF5LCBmbGlwKGRhdGEsIHRydWUpKTsKLQlmaW5hbCBJbWFnZSBpbWFnZTUgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZmxpcChkYXRhLCBmYWxzZSkpOwotCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JLy8gZHJhdyB0aGUgcmVzdWx0cyBvbiB0aGUgc2hlbGwKLQlzaGVsbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCl7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCWUuZ2MuZHJhd1RleHQoIk9yaWdpbmFsIEltYWdlOiIsIDEwLCAxMCwgdHJ1ZSk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTAsIDEwLCA0MCk7Ci0JCQllLmdjLmRyYXdUZXh0KCJMZWZ0LCBSaWdodCwgMTgwOiIsIDEwLCA4MCwgdHJ1ZSk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTEsIDEwLCAxMTApOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UyLCA1MCwgMTEwKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlMywgOTAsIDExMCk7Ci0JCQllLmdjLmRyYXdUZXh0KCJGbGlwcGVkIFZlcnRpY2FsLCBIb3Jpem9udGFsOiIsIDEwLCAxNzAsIHRydWUpOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2U0LCAxMCwgMjAwKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlNSwgNzAsIDIwMCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlpbWFnZTAuZGlzcG9zZSgpOwotCWltYWdlMS5kaXNwb3NlKCk7Ci0JaW1hZ2UyLmRpc3Bvc2UoKTsKLQlpbWFnZTMuZGlzcG9zZSgpOwotCWltYWdlNC5kaXNwb3NlKCk7Ci0JaW1hZ2U1LmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmM2YmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgbW91c2UgZW50ZXIsIGV4aXQgYW5kIGhvdmVyIGV2ZW50cwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFNpemUgKDEwMCwgMTAwKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRW50ZXIsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJFTlRFUiIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZUV4aXQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJFWElUIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlSG92ZXIsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJIT1ZFUiIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTNlOGNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBDb29sQmFyIGV4YW1wbGUgc25pcHBldDogZHJvcC1kb3duIGEgY2hldnJvbiBtZW51IGNvbnRhaW5pbmcgaGlkZGVuIHRvb2wgaXRlbXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0MCB7Ci0Jc3RhdGljIERpc3BsYXkgZGlzcGxheTsKLQlzdGF0aWMgU2hlbGwgc2hlbGw7Ci0Jc3RhdGljIENvb2xCYXIgY29vbEJhcjsKLQlzdGF0aWMgTWVudSBjaGV2cm9uTWVudSA9IG51bGw7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQljb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIFNXVC5GTEFUIHwgU1dULkJPUkRFUik7Ci0JY29vbEJhci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhcihjb29sQmFyLCBTV1QuRkxBVCB8IFNXVC5XUkFQKTsKLQlpbnQgbWluV2lkdGggPSAwOwotCWZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKSB7Ci0JCWludCB3aWR0aCA9IDA7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIkIiICsgaik7Ci0JCXdpZHRoID0gaXRlbS5nZXRXaWR0aCgpOwotCQkvKiBmaW5kIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHRvb2wgKi8KLQkJaWYgKHdpZHRoID4gbWluV2lkdGgpIG1pbldpZHRoID0gd2lkdGg7Ci0JfQotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCWNvb2xJdGVtLnNldENvbnRyb2wodG9vbEJhcik7Ci0JUG9pbnQgc2l6ZSA9IHRvb2xCYXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlQb2ludCBjb29sU2l6ZSA9IGNvb2xJdGVtLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSk7Ci0JY29vbEl0ZW0uc2V0TWluaW11bVNpemUobWluV2lkdGgsIGNvb2xTaXplLnkpOwotCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoY29vbFNpemUpOwotCWNvb2xJdGVtLnNldFNpemUoY29vbFNpemUpOwotCWNvb2xJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCQlDb29sSXRlbSBpdGVtID0gKENvb2xJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBpdGVtLmdldEJvdW5kcyAoKTsKLQkJCQlQb2ludCBwdCA9IGNvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludChpdGVtQm91bmRzLngsIGl0ZW1Cb3VuZHMueSkpOwotCQkJCWl0ZW1Cb3VuZHMueCA9IHB0Lng7Ci0JCQkJaXRlbUJvdW5kcy55ID0gcHQueTsKLQkJCQlUb29sQmFyIGJhciA9IChUb29sQmFyKSBpdGVtLmdldENvbnRyb2wgKCk7Ci0JCQkJVG9vbEl0ZW1bXSB0b29scyA9IGJhci5nZXRJdGVtcyAoKTsKLQkJCQkKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJd2hpbGUgKGkgPCB0b29scy5sZW5ndGgpIHsKLQkJCQkJUmVjdGFuZ2xlIHRvb2xCb3VuZHMgPSB0b29sc1tpXS5nZXRCb3VuZHMgKCk7Ci0JCQkJCXB0ID0gYmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEJvdW5kcy54LCB0b29sQm91bmRzLnkpKTsKLQkJCQkJdG9vbEJvdW5kcy54ID0gcHQueDsKLQkJCQkJdG9vbEJvdW5kcy55ID0gcHQueTsKLQkJCQkJCi0JCQkJCS8qIEZpZ3VyZSBvdXQgdGhlIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgdG9vbCBieSBsb29raW5nIGF0IHRoZQotCQkJCQkgKiBpbnRlcnNlY3Rpb24gb2YgdGhlIHRvb2wgYm91bmRzIHdpdGggdGhlIGNvb2wgaXRlbSBib3VuZHMuICovCi0JCQkgIAkJUmVjdGFuZ2xlIGludGVyc2VjdGlvbiA9IGl0ZW1Cb3VuZHMuaW50ZXJzZWN0aW9uICh0b29sQm91bmRzKTsKLQkJCSAgCQkKLQkJCQkJLyogSWYgdGhlIHRvb2wgaXMgbm90IGNvbXBsZXRlbHkgd2l0aGluIHRoZSBjb29sIGl0ZW0gYm91bmRzLCB0aGVuIGl0Ci0JCQkJCSAqIGlzIHBhcnRpYWxseSBoaWRkZW4sIGFuZCBhbGwgcmVtYWluaW5nIHRvb2xzIGFyZSBjb21wbGV0ZWx5IGhpZGRlbi4gKi8KLQkJCSAgCQlpZiAoIWludGVyc2VjdGlvbi5lcXVhbHMgKHRvb2xCb3VuZHMpKSBicmVhazsKLQkJCSAgCQlpKys7Ci0JCQkJfQotCQkJCQotCQkJCS8qIENyZWF0ZSBhIG1lbnUgd2l0aCBpdGVtcyBmb3IgZWFjaCBvZiB0aGUgY29tcGxldGVseSBoaWRkZW4gYnV0dG9ucy4gKi8KLQkJCQlpZiAoY2hldnJvbk1lbnUgIT0gbnVsbCkgY2hldnJvbk1lbnUuZGlzcG9zZSgpOwotCQkJCWNoZXZyb25NZW51ID0gbmV3IE1lbnUgKGNvb2xCYXIpOwotCQkJCWZvciAoaW50IGogPSBpOyBqIDwgdG9vbHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKGNoZXZyb25NZW51LCBTV1QuUFVTSCk7Ci0JCQkJCW1lbnVJdGVtLnNldFRleHQgKHRvb2xzW2pdLmdldFRleHQoKSk7Ci0JCQkJfQotCQkJCQotCQkJCS8qIERyb3AgZG93biB0aGUgbWVudSBiZWxvdyB0aGUgY2hldnJvbiwgd2l0aCB0aGUgbGVmdCBlZGdlcyBhbGlnbmVkLiAqLwotCQkJCXB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQljaGV2cm9uTWVudS5zZXRMb2NhdGlvbiAocHQueCwgcHQueSk7Ci0JCQkJY2hldnJvbk1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYTFlNmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBJbWFnZSBleGFtcGxlIHNuaXBwZXQ6IGRpc3BsYXkgYW4gYW5pbWF0ZWQgR0lGCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQxIHsKLQlzdGF0aWMgRGlzcGxheSBkaXNwbGF5OwotCXN0YXRpYyBTaGVsbCBzaGVsbDsKLQlzdGF0aWMgR0Mgc2hlbGxHQzsKLQlzdGF0aWMgQ29sb3Igc2hlbGxCYWNrZ3JvdW5kOwotCXN0YXRpYyBJbWFnZUxvYWRlciBsb2FkZXI7Ci0Jc3RhdGljIEltYWdlRGF0YVtdIGltYWdlRGF0YUFycmF5OwotCXN0YXRpYyBUaHJlYWQgYW5pbWF0ZVRocmVhZDsKLQlzdGF0aWMgSW1hZ2UgaW1hZ2U7Ci0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlR0lGQmFja2dyb3VuZCA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQkJc2hlbGwub3BlbigpOwotCQlzaGVsbEdDID0gbmV3IEdDKHNoZWxsKTsKLQkJc2hlbGxCYWNrZ3JvdW5kID0gc2hlbGwuZ2V0QmFja2dyb3VuZCgpOwotCi0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwpOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmdpZiJ9KTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJdHJ5IHsKLQkJCQlpbWFnZURhdGFBcnJheSA9IGxvYWRlci5sb2FkKGZpbGVOYW1lKTsKLQkJCQlpZiAoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSkgewotCQkJCQlhbmltYXRlVGhyZWFkID0gbmV3IFRocmVhZCgiQW5pbWF0aW9uIikgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCS8qIENyZWF0ZSBhbiBvZmYtc2NyZWVuIGltYWdlIHRvIGRyYXcgb24sIGFuZCBmaWxsIGl0IHdpdGggdGhlIHNoZWxsIGJhY2tncm91bmQuICovCi0JCQkJCQkJSW1hZ2Ugb2ZmU2NyZWVuSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCwgbG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQpOwotCQkJCQkJCUdDIG9mZlNjcmVlbkltYWdlR0MgPSBuZXcgR0Mob2ZmU2NyZWVuSW1hZ2UpOwotCQkJCQkJCW9mZlNjcmVlbkltYWdlR0Muc2V0QmFja2dyb3VuZChzaGVsbEJhY2tncm91bmQpOwotCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZmlsbFJlY3RhbmdsZSgwLCAwLCBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoLCBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCk7Ci0JCQkJCQkJCQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCS8qIENyZWF0ZSB0aGUgZmlyc3QgaW1hZ2UgYW5kIGRyYXcgaXQgb24gdGhlIG9mZi1zY3JlZW4gaW1hZ2UuICovCi0JCQkJCQkJCWludCBpbWFnZURhdGFJbmRleCA9IDA7CQotCQkJCQkJCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gaW1hZ2VEYXRhQXJyYXlbaW1hZ2VEYXRhSW5kZXhdOwotCQkJCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNEaXNwb3NlZCgpKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZHJhd0ltYWdlKAotCQkJCQkJCQkJaW1hZ2UsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCQkJCWltYWdlRGF0YS55LAotCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0KLQkJCQkJCQkJLyogTm93IGxvb3AgdGhyb3VnaCB0aGUgaW1hZ2VzLCBjcmVhdGluZyBhbmQgZHJhd2luZyBlYWNoIG9uZQotCQkJCQkJCQkgKiBvbiB0aGUgb2ZmLXNjcmVlbiBpbWFnZSBiZWZvcmUgZHJhd2luZyBpdCBvbiB0aGUgc2hlbGwuICovCi0JCQkJCQkJCWludCByZXBlYXRDb3VudCA9IGxvYWRlci5yZXBlYXRDb3VudDsKLQkJCQkJCQkJd2hpbGUgKGxvYWRlci5yZXBlYXRDb3VudCA9PSAwIHx8IHJlcGVhdENvdW50ID4gMCkgewotCQkJCQkJCQkJc3dpdGNoIChpbWFnZURhdGEuZGlzcG9zYWxNZXRob2QpIHsKLQkJCQkJCQkJCWNhc2UgU1dULkRNX0ZJTExfQkFDS0dST1VORDoKLQkJCQkJCQkJCQkvKiBGaWxsIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgYmVmb3JlIGRyYXdpbmcuICovCi0JCQkJCQkJCQkJQ29sb3IgYmdDb2xvciA9IG51bGw7Ci0JCQkJCQkJCQkJaWYgKHVzZUdJRkJhY2tncm91bmQgJiYgbG9hZGVyLmJhY2tncm91bmRQaXhlbCAhPSAtMSkgewotCQkJCQkJCQkJCQliZ0NvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIGltYWdlRGF0YS5wYWxldHRlLmdldFJHQihsb2FkZXIuYmFja2dyb3VuZFBpeGVsKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCW9mZlNjcmVlbkltYWdlR0Muc2V0QmFja2dyb3VuZChiZ0NvbG9yICE9IG51bGwgPyBiZ0NvbG9yIDogc2hlbGxCYWNrZ3JvdW5kKTsKLQkJCQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmZpbGxSZWN0YW5nbGUoaW1hZ2VEYXRhLngsIGltYWdlRGF0YS55LCBpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQkJCQkJCWlmIChiZ0NvbG9yICE9IG51bGwpIGJnQ29sb3IuZGlzcG9zZSgpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBTV1QuRE1fRklMTF9QUkVWSU9VUzoKLQkJCQkJCQkJCQkvKiBSZXN0b3JlIHRoZSBwcmV2aW91cyBpbWFnZSBiZWZvcmUgZHJhd2luZy4gKi8KLQkJCQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQkJCQkJCQkJaW1hZ2UsCi0JCQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJCQkJCWltYWdlRGF0YS55LAotCQkJCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCQkKLQkJCQkJCQkJCWltYWdlRGF0YUluZGV4ID0gKGltYWdlRGF0YUluZGV4ICsgMSkgJSBpbWFnZURhdGFBcnJheS5sZW5ndGg7Ci0JCQkJCQkJCQlpbWFnZURhdGEgPSBpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF07Ci0JCQkJCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJCQkJCQkJaW1hZ2UsCi0JCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkwLAotCQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJCQkJCWltYWdlRGF0YS55LAotCQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJLyogRHJhdyB0aGUgb2ZmLXNjcmVlbiBpbWFnZSB0byB0aGUgc2hlbGwuICovCi0JCQkJCQkJCQlzaGVsbEdDLmRyYXdJbWFnZShvZmZTY3JlZW5JbWFnZSwgMCwgMCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCS8qIFNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIGRlbGF5IHRpbWUgKGFkZGluZyBjb21tb25seS11c2VkIHNsb3ctZG93biBmdWRnZSBmYWN0b3JzKS4gKi8KLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJaW50IG1zID0gaW1hZ2VEYXRhLmRlbGF5VGltZSAqIDEwOwotCQkJCQkJCQkJCWlmIChtcyA8IDIwKSBtcyArPSAzMDsKLQkJCQkJCQkJCQlpZiAobXMgPCAzMCkgbXMgKz0gMTA7Ci0JCQkJCQkJCQkJVGhyZWFkLnNsZWVwKG1zKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQkJLyogSWYgd2UgaGF2ZSBqdXN0IGRyYXduIHRoZSBsYXN0IGltYWdlLCBkZWNyZW1lbnQgdGhlIHJlcGVhdCBjb3VudCBhbmQgc3RhcnQgYWdhaW4uICovCi0JCQkJCQkJCQlpZiAoaW1hZ2VEYXRhSW5kZXggPT0gaW1hZ2VEYXRhQXJyYXkubGVuZ3RoIC0gMSkgcmVwZWF0Q291bnQtLTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZXJlIHdhcyBhbiBlcnJvciBhbmltYXRpbmcgdGhlIEdJRiIpOwotCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCWlmIChvZmZTY3JlZW5JbWFnZSAhPSBudWxsICYmICFvZmZTY3JlZW5JbWFnZS5pc0Rpc3Bvc2VkKCkpIG9mZlNjcmVlbkltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQkJaWYgKG9mZlNjcmVlbkltYWdlR0MgIT0gbnVsbCAmJiAhb2ZmU2NyZWVuSW1hZ2VHQy5pc0Rpc3Bvc2VkKCkpIG9mZlNjcmVlbkltYWdlR0MuZGlzcG9zZSgpOwotCQkJCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNEaXNwb3NlZCgpKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9OwotCQkJCQlhbmltYXRlVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJCQkJYW5pbWF0ZVRocmVhZC5zdGFydCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgd2FzIGFuIGVycm9yIGxvYWRpbmcgdGhlIEdJRiIpOwotCQkJfQotCQl9Ci0KLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhZjE0Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBVSSBBdXRvbWF0aW9uIChmb3IgdGVzdGluZyB0b29scykgc25pcHBldDogcG9zdCBtb3VzZSBldmVudHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLFNXVC5OT05FKTsKLQlidXR0b24uc2V0U2l6ZSgxMDAsMTAwKTsKLQlidXR0b24uc2V0VGV4dCgiQ2xpY2siKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZSBEb3duIChidXR0b246ICIgKyBlLmJ1dHRvbiArICIgeDogIiArIGUueCArICIgeTogIiArIGUueSArICIpIik7Ci0JCX0KLQl9KTsKLQlmaW5hbCBQb2ludCBwdCA9IGRpc3BsYXkubWFwKHNoZWxsLCBudWxsLCA1MCwgNTApOwotCW5ldyBUaHJlYWQoKXsKLQkJRXZlbnQgZXZlbnQ7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMzAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZU1vdmU7Ci0JCQlldmVudC54ID0gcHQueDsKLQkJCWV2ZW50LnkgPSBwdC55OwotCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDMwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotCQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZURvd247Ci0JCQlldmVudC5idXR0b24gPSAxOwotCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDMwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotCQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZVVwOwotCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJfQkKLQl9LnN0YXJ0KCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRhOTI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFRyYXkgZXhhbXBsZSBzbmlwcGV0OiBwbGFjZSBhbiBpY29uIHdpdGggYSBwb3B1cCBtZW51IG9uIHRoZSBzeXN0ZW0gdHJheQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlmaW5hbCBUcmF5IHRyYXkgPSBkaXNwbGF5LmdldFN5c3RlbVRyYXkgKCk7Ci0JaWYgKHRyYXkgPT0gbnVsbCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJUaGUgc3lzdGVtIHRyYXkgaXMgbm90IGF2YWlsYWJsZSIpOwotCX0gZWxzZSB7Ci0JCWZpbmFsIFRyYXlJdGVtIGl0ZW0gPSBuZXcgVHJheUl0ZW0gKHRyYXksIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dUIFRyYXlJdGVtIik7Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TaG93LCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzaG93Iik7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuSGlkZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaGlkZSIpOwotCQkJfQotCQl9KTsKLQkJaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2VsZWN0aW9uIik7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVmYXVsdCBzZWxlY3Rpb24iKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlNZW51SXRlbSBtaSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQkJbWkuc2V0VGV4dCAoIkl0ZW0iICsgaSk7Ci0JCQltaS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gIiArIGV2ZW50LndpZGdldCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlpZiAoaSA9PSAwKSBtZW51LnNldERlZmF1bHRJdGVtKG1pKTsKLQkJfQotCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuTWVudURldGVjdCwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCW1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtLnNldEltYWdlIChpbWFnZSk7Ci0JfQotCXNoZWxsLnNldEJvdW5kcyg1MCwgNTAsIDMwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2OTYyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVmlydHVhbCBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIHdpdGggMSwwMDAsMDAwIGl0ZW1zIChsYXp5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0NCB7Ci0KLXN0YXRpYyBmaW5hbCBpbnQgQ09VTlQgPSAxMDAwMDAwOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuVklSVFVBTCB8IFNXVC5CT1JERVIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mIChpdGVtKTsKLQkJCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGluZGV4KTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoaXRlbS5nZXRUZXh0ICgpKTsKLQkJfQotCX0pOwotCXRhYmxlLnNldExheW91dERhdGEgKG5ldyBSb3dEYXRhICgyMDAsIDIwMCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiQWRkIEl0ZW1zIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcyAoKTsKLQkJCXRhYmxlLnNldEl0ZW1Db3VudCAoQ09VTlQpOwotCQkJbG9uZyB0MiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcyAoKTsKLQkJCWxhYmVsLnNldFRleHQgKCJJdGVtczogIiArIENPVU5UICsgIiwgVGltZTogIiArICh0MiAtIHQxKSArICIgKG1zKSIpOwotCQkJc2hlbGwubGF5b3V0ICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YzY1MGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBkcmF3IGludGVybmF0aW9uYWxpemVkIHN0eWxlZCB0ZXh0IG9uIGEgc2hlbGwKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0NSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJCi0JCUZvbnQgZm9udDEgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMTQsIFNXVC5CT0xEKTsKLQkJRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksICJNUyBNaW5jaG8iLCAyMCwgU1dULklUQUxJQyk7Ci0JCUZvbnQgZm9udDMgPSBuZXcgRm9udChkaXNwbGF5LCAiQXJhYmljIFRyYW5zcGFyZW50IiwgMTgsIFNXVC5OT1JNQUwpOwotCQkKLQkJQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQlDb2xvciBncmVlbiA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKTsKLQkJQ29sb3IgeWVsbG93ID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKTsKLQkJQ29sb3IgZ3JheSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpOwotCQkKLQkJZmluYWwgVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQkJVGV4dFN0eWxlIHN0eWxlMSA9IG5ldyBUZXh0U3R5bGUoZm9udDEsIHllbGxvdywgYmx1ZSk7Ci0JCVRleHRTdHlsZSBzdHlsZTIgPSBuZXcgVGV4dFN0eWxlKGZvbnQyLCBncmVlbiwgbnVsbCk7Ci0JCVRleHRTdHlsZSBzdHlsZTMgPSBuZXcgVGV4dFN0eWxlKGZvbnQzLCBibHVlLCBncmF5KTsKLQkJCi0JCWxheW91dC5zZXRUZXh0KCJFbmdsaXNoIFx1NjVFNVx1NjcyQ1x1OEE5RSAgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRBXHUwNjUxXHUwNjI5Iik7Ci0JCWxheW91dC5zZXRTdHlsZShzdHlsZTEsIDAsIDYpOwotCQlsYXlvdXQuc2V0U3R5bGUoc3R5bGUyLCA4LCAxMCk7Ci0JCWxheW91dC5zZXRTdHlsZShzdHlsZTMsIDEzLCAyMSk7Ci0JCQkJCQotCQlzaGVsbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIDEwLCAxMCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7CQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZm9udDEuZGlzcG9zZSgpOwotCQlmb250Mi5kaXNwb3NlKCk7Ci0JCWZvbnQzLmRpc3Bvc2UoKTsKLQkJbGF5b3V0LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjIyOWFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFVJIEF1dG9tYXRpb24gKGZvciB0ZXN0aW5nIHRvb2xzKSBzbmlwcGV0OiBwb3N0IGtleSBldmVudHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFNpemUodGV4dC5jb21wdXRlU2l6ZSgxNTAsIFNXVC5ERUZBVUxUKSk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQluZXcgVGhyZWFkKCl7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJU3RyaW5nIHN0cmluZyA9ICJMb3ZlIHRoZSBtZXRob2QuIjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCQljaGFyIGNoID0gc3RyaW5nLmNoYXJBdChpKTsKLQkJCQlib29sZWFuIHNoaWZ0ID0gQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGNoKTsKLQkJCQljaCA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaCk7Ci0JCQkJaWYgKHNoaWZ0KSB7Ci0JCQkJCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQkJCWV2ZW50LnR5cGUgPSBTV1QuS2V5RG93bjsKLQkJCQkJZXZlbnQua2V5Q29kZSA9IFNXVC5TSElGVDsKLQkJCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsJCi0JCQkJfQotCQkJCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQkJZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotCQkJCWV2ZW50LmNoYXJhY3RlciA9IGNoOwotCQkJCWRpc3BsYXkucG9zdChldmVudCk7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDEwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotCQkJCWV2ZW50LnR5cGUgPSBTV1QuS2V5VXA7Ci0JCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotCQkJCWlmIChzaGlmdCkgewotCQkJCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQkJCQlldmVudC50eXBlID0gU1dULktleVVwOwotCQkJCQlldmVudC5rZXlDb2RlID0gU1dULlNISUZUOwotCQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwkKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JfS5zdGFydCgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyYmUwYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29tYm8gZXhhbXBsZSBzbmlwcGV0OiBzdG9wIENSIGZyb20gZ29pbmcgdG8gdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDcgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhzaGVsbCwgU1dULk5PTkUpOwotCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCWNvbWJvLnNldFRleHQoIkhlcmUgaXMgc29tZSB0ZXh0Iik7Ci0JY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbWJvIGRlZmF1bHQgc2VsZWN0ZWQgKG92ZXJyaWRlcyBkZWZhdWx0IGJ1dHRvbikiKTsKLQkJfQotCX0pOwotCWNvbWJvLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfUkVUVVJOKSB7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJZS5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLQkJCX0KLQkJfQotCX0pOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIk9rIik7Ci0JYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1dHRvbiBzZWxlY3RlZCIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0RGVmYXVsdEJ1dHRvbihidXR0b24pOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5NWMyOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBjaGVjayBpZiB0aGUgYnJvd3NlciBpcyBhdmFpbGFibGUgb3Igbm90Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDggewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBudWxsOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCS8qIFRoZSBCcm93c2VyIHdpZGdldCB0aHJvd3MgYW4gU1dURXJyb3IgaWYgaXQgZmFpbHMgdG8KLQkJCSAqIGluc3RhbnRpYXRlIHByb3Blcmx5LiBBcHBsaWNhdGlvbiBjb2RlIHNob3VsZCBjYXRjaAotCQkJICogdGhpcyBTV1RFcnJvciBhbmQgZGlzYWJsZSBhbnkgZmVhdHVyZSByZXF1aXJpbmcgdGhlCi0JCQkgKiBCcm93c2VyIHdpZGdldC4KLQkJCSAqIFBsYXRmb3JtIHJlcXVpcmVtZW50cyBmb3IgdGhlIFNXVCBCcm93c2VyIHdpZGdldCBhcmUgYXZhaWxhYmxlCi0JCQkgKiBmcm9tIHRoZSBTV1QgRkFRIHdlYnNpdGUuIAotCQkJICovCi0JCX0KLQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJLyogVGhlIEJyb3dzZXIgd2lkZ2V0IGNhbiBiZSB1c2VkICovCi0JCQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCQl9Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzNjMxNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGVFZGl0b3IgZXhhbXBsZSBzbmlwcGV0OiBwbGFjZSBhIHByb2dyZXNzIGJhciBpbiBhIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlmb3IgKGludCBpPTA7IGk8MjsgaSsrKSB7Ci0JCQluZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCX0KLQkJdGFibGUuZ2V0Q29sdW1uICgwKS5zZXRUZXh0ICgiVGFzayIpOwotCQl0YWJsZS5nZXRDb2x1bW4gKDEpLnNldFRleHQgKCJQcm9ncmVzcyIpOwotCQlmb3IgKGludCBpPTA7IGk8NDA7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0ICgiVGFzayAiICsgaSk7Ci0JCQlpZiAoIGkgJSA1ID09IDApIHsKLQkJCQlQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIgKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJYmFyLnNldFNlbGVjdGlvbiAoaSk7Ci0JCQkJVGFibGVFZGl0b3IgZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCQkJZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gZWRpdG9yLmdyYWJWZXJ0aWNhbCA9IHRydWU7Ci0JCQkJZWRpdG9yLnNldEVkaXRvciAoYmFyLCBpdGVtLCAxKTsKLQkJCX0KLQkJfQotCQl0YWJsZS5nZXRDb2x1bW4gKDApLnBhY2sgKCk7Ci0JCXRhYmxlLmdldENvbHVtbiAoMSkuc2V0V2lkdGggKDEyOCk7Ci0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWZlZGM3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdHJlZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGlJdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCAwKTsKLQkJaUl0ZW0uc2V0VGV4dCAoIlRyZWVJdGVtICgwKSAtIiArIGkpOwotCQlmb3IgKGludCBqPTA7IGo8NDsgaisrKSB7Ci0JCQlUcmVlSXRlbSBqSXRlbSA9IG5ldyBUcmVlSXRlbSAoaUl0ZW0sIDApOwotCQkJakl0ZW0uc2V0VGV4dCAoIlRyZWVJdGVtICgxKSAtIiArIGopOwotCQkJZm9yIChpbnQgaz0wOyBrPDQ7IGsrKykgewotCQkJCVRyZWVJdGVtIGtJdGVtID0gbmV3IFRyZWVJdGVtIChqSXRlbSwgMCk7Ci0JCQkJa0l0ZW0uc2V0VGV4dCAoIlRyZWVJdGVtICgyKSAtIiArIGspOwotCQkJCWZvciAoaW50IGw9MDsgbDw0OyBsKyspIHsKLQkJCQkJVHJlZUl0ZW0gbEl0ZW0gPSBuZXcgVHJlZUl0ZW0gKGtJdGVtLCAwKTsKLQkJCQkJbEl0ZW0uc2V0VGV4dCAoIlRyZWVJdGVtICgzKSAtIiArIGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2YxMmYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb29sQmFyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29vbGJhciAocmVsYXlvdXQgd2hlbiByZXNpemVkKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1MCB7Ci0KLXN0YXRpYyBpbnQgaXRlbUNvdW50Owotc3RhdGljIENvb2xJdGVtIGNyZWF0ZUl0ZW0oQ29vbEJhciBjb29sQmFyLCBpbnQgY291bnQpIHsKLSAgICBUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhcihjb29sQmFyLCBTV1QuRkxBVCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIFRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotICAgICAgICBpdGVtLnNldFRleHQoaXRlbUNvdW50KysgKyIiKTsKLSAgICB9Ci0gICAgdG9vbEJhci5wYWNrKCk7Ci0gICAgUG9pbnQgc2l6ZSA9IHRvb2xCYXIuZ2V0U2l6ZSgpOwotICAgIENvb2xJdGVtIGl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULk5PTkUpOwotICAgIGl0ZW0uc2V0Q29udHJvbCh0b29sQmFyKTsKLSAgICBQb2ludCBwcmVmZXJyZWQgPSBpdGVtLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KTsKLSAgICBpdGVtLnNldFByZWZlcnJlZFNpemUocHJlZmVycmVkKTsKLSAgICByZXR1cm4gaXRlbTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIFNXVC5OT05FKTsKLSAgICBjcmVhdGVJdGVtKGNvb2xCYXIsIDMpOwotICAgIGNyZWF0ZUl0ZW0oY29vbEJhciwgMik7Ci0gICAgY3JlYXRlSXRlbShjb29sQmFyLCAzKTsKLSAgICBjcmVhdGVJdGVtKGNvb2xCYXIsIDQpOwotICAgIGludCBzdHlsZSA9IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEw7Ci0gICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIHN0eWxlKTsKLSAgICBGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgRm9ybURhdGEgY29vbERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBjb29sRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotICAgIGNvb2xEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgY29vbERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotICAgIGNvb2xCYXIuc2V0TGF5b3V0RGF0YShjb29sRGF0YSk7Ci0gICAgY29vbEJhci5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBzaGVsbC5sYXlvdXQoKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIEZvcm1EYXRhIHRleHREYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgdGV4dERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICB0ZXh0RGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotICAgIHRleHREYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb29sQmFyKTsKLSAgICB0ZXh0RGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICB0ZXh0LnNldExheW91dERhdGEodGV4dERhdGEpOwotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YjJmNzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIHZpcnR1YWwgdGFibGUgYW5kIGFkZCAxMDAwIGVudHJpZXMgdG8gaXQgZXZlcnkgNTAwIG1zLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1MSB7Ci0KLXN0YXRpYyBpbnRbXSBkYXRhID0gbmV3IGludFswXTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WSVJUVUFMKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZS5pdGVtOwotCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCWl0ZW0uc2V0VGV4dCgiSXRlbSAiK2RhdGFbaW5kZXhdKTsKLQkJfQotCX0pOwotCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKLQkJCXdoaWxlIChjb3VudCsrIDwgNTAwKSB7Ci0JCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCS8vIGFkZCAxMCByYW5kb20gbnVtYmVycyB0byBhcnJheSBhbmQgc29ydAotCQkJCWludCBncm93ID0gMTA7Ci0JCQkJaW50W10gbmV3RGF0YSA9IG5ldyBpbnRbZGF0YS5sZW5ndGggKyBncm93XTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5ld0RhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLQkJCQlpbnQgaW5kZXggPSBkYXRhLmxlbmd0aDsKLQkJCQlkYXRhID0gbmV3RGF0YTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGdyb3c7IGorKykgewotCQkJCQlkYXRhW2luZGV4KytdID0gcmFuZG9tLm5leHRJbnQoKTsKLQkJCQl9Ci0JCQkJQXJyYXlzLnNvcnQoZGF0YSk7Ci0JCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh0YWJsZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCXRhYmxlLnNldEl0ZW1Db3VudChkYXRhLmxlbmd0aCk7Ci0JCQkJCQl0YWJsZS5jbGVhckFsbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJdHJ5IHtUaHJlYWQuc2xlZXAoNTAwKTt9IGNhdGNoIChUaHJvd2FibGUgdCkge30KLQkJCX0KLQkJfQotCX07Ci0JdGhyZWFkLnN0YXJ0KCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTJkNTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgYSBzdGF0dXMgbGluZSB3aGVuIGFuIGl0ZW0gaXMgYXJtZWQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgIEZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgTGlzdGVuZXIgYXJtTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKSBldmVudC53aWRnZXQ7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KGl0ZW0uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBMaXN0ZW5lciBzaG93TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBNZW51IG1lbnUgPSAoTWVudSkgZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgTWVudUl0ZW0gaXRlbSA9IG1lbnUuZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxhYmVsLnNldFRleHQoaXRlbS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLSAgICBMaXN0ZW5lciBoaWRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBGb3JtRGF0YSBsYWJlbERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBsYWJlbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICBsYWJlbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICBsYWJlbERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbERhdGEpOwotICAgIE1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLSAgICBzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotICAgIE1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICBmaWxlSXRlbS5zZXRUZXh0KCJGaWxlIik7Ci0gICAgZmlsZUl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIE1lbnVJdGVtIGVkaXRJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICBlZGl0SXRlbS5zZXRUZXh0KCJFZGl0Iik7Ci0gICAgZWRpdEl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIE1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0gICAgZmlsZU1lbnUuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGhpZGVMaXN0ZW5lcik7Ci0gICAgZmlsZU1lbnUuYWRkTGlzdGVuZXIoU1dULlNob3csIHNob3dMaXN0ZW5lcik7Ci0gICAgZmlsZUl0ZW0uc2V0TWVudShmaWxlTWVudSk7Ci0gICAgU3RyaW5nW10gZmlsZVN0cmluZ3MgPSB7ICJOZXciLCAiQ2xvc2UiLCAiRXhpdCIgfTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGZpbGVTdHJpbmdzW2ldKTsKLSAgICAgICAgaXRlbS5hZGRMaXN0ZW5lcihTV1QuQXJtLCBhcm1MaXN0ZW5lcik7Ci0gICAgfQotICAgIE1lbnUgZWRpdE1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0gICAgZWRpdE1lbnUuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGhpZGVMaXN0ZW5lcik7Ci0gICAgZWRpdE1lbnUuYWRkTGlzdGVuZXIoU1dULlNob3csIHNob3dMaXN0ZW5lcik7Ci0gICAgU3RyaW5nW10gZWRpdFN0cmluZ3MgPSB7ICJDdXQiLCAiQ29weSIsICJQYXN0ZSIgfTsKLSAgICBlZGl0SXRlbS5zZXRNZW51KGVkaXRNZW51KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVkaXRTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0oZWRpdE1lbnUsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGVkaXRTdHJpbmdzW2ldKTsKLSAgICAgICAgaXRlbS5hZGRMaXN0ZW5lcihTV1QuQXJtLCBhcm1MaXN0ZW5lcik7Ci0gICAgfQotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3OWZkZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IHVwZGF0ZSBhIHN0YXR1cyBsaW5lIHdoZW4gdGhlIG1vdXNlIGVudGVycyBhIHRvb2wgaXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTMgewotCQotc3RhdGljIFN0cmluZyBzdGF0dXNUZXh0ID0gIiI7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDIwMCk7Ci0gICAgZmluYWwgVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgYmFyLnNldEJvdW5kcygxMCwgMTAsIDE1MCwgNTApOwotICAgIGZpbmFsIExhYmVsIHN0YXR1c0xpbmUgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgIHN0YXR1c0xpbmUuc2V0Qm91bmRzKDEwLCA5MCwgMTUwLCAzMCk7Ci0gICAgbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0gMSIpOwotICAgIG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKS5zZXRUZXh0KCJpdGVtIDIiKTsKLSAgICBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSkuc2V0VGV4dCgiaXRlbSAzIik7Ci0gICAgYmFyLmFkZE1vdXNlTW92ZUxpc3RlbmVyKG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgVG9vbEl0ZW0gaXRlbSA9IGJhci5nZXRJdGVtKG5ldyBQb2ludChlLngsIGUueSkpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gaXRlbS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXN0YXR1c1RleHQuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGluZS5zZXRUZXh0KG5hbWUpOwotICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgPSBuYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgc2hlbGwub3BlbigpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTk3Y2EwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBlbWJlZCBhIEpUYWJsZSBpbiBTV1QgKG5vIGZsaWNrZXIpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVDsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTQgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9fQkFDS0dST1VORCB8IFNXVC5FTUJFRERFRCk7Ci0JCQotCQkvKgotCQkqIFNldCBhIFdpbmRvd3Mgc3BlY2lmaWMgQVdUIHByb3BlcnR5IHRoYXQgcHJldmVudHMgaGVhdnl3ZWlnaHQKLQkJKiBjb21wb25lbnRzIGZyb20gZXJhc2luZyB0aGVpciBiYWNrZ3JvdW5kLiBOb3RlIHRoYXQgdGhpcwotCQkqIGlzIGEgZ2xvYmFsIHByb3BlcnR5IGFuZCBjYW5ub3QgYmUgc2NvcGVkLiBJdCBtaWdodCBub3QgYmUKLQkJKiBzdWl0YWJsZSBmb3IgeW91ciBhcHBsaWNhdGlvbi4KLQkJKi8KLQkJdHJ5IHsKLQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgic3VuLmF3dC5ub2VyYXNlYmFja2dyb3VuZCIsInRydWUiKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZXJyb3IpIHt9Ci0KLQkJLyogQ3JlYXRlIGFuZCBzZXR0aW5nIHVwIGZyYW1lICovCi0JCUZyYW1lIGZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUoY29tcG9zaXRlKTsKLQkJUGFuZWwgcGFuZWwgPSBuZXcgUGFuZWwobmV3IEJvcmRlckxheW91dCgpKSB7Ci0JCQlwdWJsaWMgdm9pZCB1cGRhdGUoamF2YS5hd3QuR3JhcGhpY3MgZykgewotCQkJCS8qIERvIG5vdCBlcmFzZSB0aGUgYmFja2dyb3VuZCAqLyAKLQkJCQlwYWludChnKTsKLQkJCX0KLQkJfTsKLQkJZnJhbWUuYWRkKHBhbmVsKTsKLQkJSlJvb3RQYW5lIHJvb3QgPSBuZXcgSlJvb3RQYW5lKCk7Ci0JCXBhbmVsLmFkZChyb290KTsKLQkJamF2YS5hd3QuQ29udGFpbmVyIGNvbnRlbnRQYW5lID0gcm9vdC5nZXRDb250ZW50UGFuZSgpOwotCi0JCS8qIENyZWF0aW5nIGNvbXBvbmVudHMgKi8KLQkJaW50IG5yb3dzID0gMTAwMCwgbmNvbHVtbnMgPSAxMDsKLQkJVmVjdG9yIHJvd3MgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnJvd3M7IGkrKykgewotCQkJVmVjdG9yIHJvdyA9IG5ldyBWZWN0b3IoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmNvbHVtbnM7IGorKykgewotCQkJCXJvdy5hZGRFbGVtZW50KCJJdGVtICIgKyBpICsgIi0iICsgaik7Ci0JCQl9Ci0JCQlyb3dzLmFkZEVsZW1lbnQocm93KTsKLQkJfQotCQlWZWN0b3IgY29sdW1ucyA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuY29sdW1uczsgaSsrKSB7Ci0JCQljb2x1bW5zLmFkZEVsZW1lbnQoIkNvbHVtbiAiICsgaSk7Ci0JCX0KLQkJSlRhYmxlIHRhYmxlID0gbmV3IEpUYWJsZShyb3dzLCBjb2x1bW5zKTsKLQkJdGFibGUuc2V0QXV0b1Jlc2l6ZU1vZGUoSlRhYmxlLkFVVE9fUkVTSVpFX09GRik7Ci0JCXRhYmxlLmNyZWF0ZURlZmF1bHRDb2x1bW5zRnJvbU1vZGVsKCk7Ci0JCUpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUodGFibGUpOwotCQljb250ZW50UGFuZS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLQkJY29udGVudFBhbmUuYWRkKHNjcm9sbFBhbmUpOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiM2Q4ZWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogZHJhdyBhbiBYIHVzaW5nIEFXVCBHcmFwaGljcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LkNhbnZhczsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYXd0LlNXVF9BV1Q7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTU1IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5FTUJFRERFRCk7Ci0JCQotCQkvKiBEcmF3IGFuIFggdXNpbmcgQVdUICovCi0JCUZyYW1lIGZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUoY29tcG9zaXRlKTsKLQkJQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludCAoR3JhcGhpY3MgZykgewotCQkJCURpbWVuc2lvbiBkID0gZ2V0U2l6ZSgpOwotCQkJCWcuZHJhd0xpbmUoMCwgMCwgZC53aWR0aCwgZC5oZWlnaHQpOwotCQkJCWcuZHJhd0xpbmUoZC53aWR0aCwgMCwgMCwgZC5oZWlnaHQpOwotCQkJfQotCQl9OwotCQlmcmFtZS5hZGQoY2FudmFzKTsKLQotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyNjgwZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogY29udmVydCBiZXR3ZWVuIFNXVCBJbWFnZSBhbmQgQVdUIEJ1ZmZlcmVkSW1hZ2UKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS5hd3QuRnJhbWU7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuSW5zZXRzOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQ29sb3JNb2RlbDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5EaXJlY3RDb2xvck1vZGVsOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkluZGV4Q29sb3JNb2RlbDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5Xcml0YWJsZVJhc3RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTU2IHsKLQkKLXN0YXRpYyBCdWZmZXJlZEltYWdlIGNvbnZlcnRUb0FXVChJbWFnZURhdGEgZGF0YSkgewotCUNvbG9yTW9kZWwgY29sb3JNb2RlbCA9IG51bGw7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGRhdGEucGFsZXR0ZTsKLQlpZiAocGFsZXR0ZS5pc0RpcmVjdCkgewotCQljb2xvck1vZGVsID0gbmV3IERpcmVjdENvbG9yTW9kZWwoZGF0YS5kZXB0aCwgcGFsZXR0ZS5yZWRNYXNrLCBwYWxldHRlLmdyZWVuTWFzaywgcGFsZXR0ZS5ibHVlTWFzayk7Ci0JCUJ1ZmZlcmVkSW1hZ2UgYnVmZmVyZWRJbWFnZSA9IG5ldyBCdWZmZXJlZEltYWdlKGNvbG9yTW9kZWwsIGNvbG9yTW9kZWwuY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0KSwgZmFsc2UsIG51bGwpOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJaW50IHBpeGVsID0gZGF0YS5nZXRQaXhlbCh4LCB5KTsKLQkJCQlSR0IgcmdiID0gcGFsZXR0ZS5nZXRSR0IocGl4ZWwpOwotCQkJCWJ1ZmZlcmVkSW1hZ2Uuc2V0UkdCKHgsIHksICByZ2IucmVkIDw8IDE2IHwgcmdiLmdyZWVuIDw8IDggfCByZ2IuYmx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcmVkSW1hZ2U7Ci0JfSBlbHNlIHsKLQkJUkdCW10gcmdicyA9IHBhbGV0dGUuZ2V0UkdCcygpOwotCQlieXRlW10gcmVkID0gbmV3IGJ5dGVbcmdicy5sZW5ndGhdOwotCQlieXRlW10gZ3JlZW4gPSBuZXcgYnl0ZVtyZ2JzLmxlbmd0aF07Ci0JCWJ5dGVbXSBibHVlID0gbmV3IGJ5dGVbcmdicy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJnYnMubGVuZ3RoOyBpKyspIHsKLQkJCVJHQiByZ2IgPSByZ2JzW2ldOwotCQkJcmVkW2ldID0gKGJ5dGUpcmdiLnJlZDsKLQkJCWdyZWVuW2ldID0gKGJ5dGUpcmdiLmdyZWVuOwotCQkJYmx1ZVtpXSA9IChieXRlKXJnYi5ibHVlOwotCQl9Ci0JCWlmIChkYXRhLnRyYW5zcGFyZW50UGl4ZWwgIT0gLTEpIHsKLQkJCWNvbG9yTW9kZWwgPSBuZXcgSW5kZXhDb2xvck1vZGVsKGRhdGEuZGVwdGgsIHJnYnMubGVuZ3RoLCByZWQsIGdyZWVuLCBibHVlLCBkYXRhLnRyYW5zcGFyZW50UGl4ZWwpOwotCQl9IGVsc2UgewotCQkJY29sb3JNb2RlbCA9IG5ldyBJbmRleENvbG9yTW9kZWwoZGF0YS5kZXB0aCwgcmdicy5sZW5ndGgsIHJlZCwgZ3JlZW4sIGJsdWUpOwotCQl9CQkKLQkJQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoY29sb3JNb2RlbCwgY29sb3JNb2RlbC5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQpLCBmYWxzZSwgbnVsbCk7Ci0JCVdyaXRhYmxlUmFzdGVyIHJhc3RlciA9IGJ1ZmZlcmVkSW1hZ2UuZ2V0UmFzdGVyKCk7Ci0JCWludFtdIHBpeGVsQXJyYXkgPSBuZXcgaW50WzFdOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJaW50IHBpeGVsID0gZGF0YS5nZXRQaXhlbCh4LCB5KTsKLQkJCQlwaXhlbEFycmF5WzBdID0gcGl4ZWw7Ci0JCQkJcmFzdGVyLnNldFBpeGVsKHgsIHksIHBpeGVsQXJyYXkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXJlZEltYWdlOwotCX0KLX0KLQotc3RhdGljIEltYWdlRGF0YSBjb252ZXJ0VG9TV1QoQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlKSB7Ci0JaWYgKGJ1ZmZlcmVkSW1hZ2UuZ2V0Q29sb3JNb2RlbCgpIGluc3RhbmNlb2YgRGlyZWN0Q29sb3JNb2RlbCkgewotCQlEaXJlY3RDb2xvck1vZGVsIGNvbG9yTW9kZWwgPSAoRGlyZWN0Q29sb3JNb2RlbClidWZmZXJlZEltYWdlLmdldENvbG9yTW9kZWwoKTsKLQkJUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YShjb2xvck1vZGVsLmdldFJlZE1hc2soKSwgY29sb3JNb2RlbC5nZXRHcmVlbk1hc2soKSwgY29sb3JNb2RlbC5nZXRCbHVlTWFzaygpKTsKLQkJSW1hZ2VEYXRhIGRhdGEgPSBuZXcgSW1hZ2VEYXRhKGJ1ZmZlcmVkSW1hZ2UuZ2V0V2lkdGgoKSwgYnVmZmVyZWRJbWFnZS5nZXRIZWlnaHQoKSwgY29sb3JNb2RlbC5nZXRQaXhlbFNpemUoKSwgcGFsZXR0ZSk7Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlpbnQgcmdiID0gYnVmZmVyZWRJbWFnZS5nZXRSR0IoeCwgeSk7Ci0JCQkJaW50IHBpeGVsID0gcGFsZXR0ZS5nZXRQaXhlbChuZXcgUkdCKChyZ2IgPj4gMTYpICYgMHhGRiwgKHJnYiA+PiA4KSAmIDB4RkYsIHJnYiAmIDB4RkYpKTsgCi0JCQkJZGF0YS5zZXRQaXhlbCh4LCB5LCBwaXhlbCk7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gZGF0YTsJCQotCX0gZWxzZSBpZiAoYnVmZmVyZWRJbWFnZS5nZXRDb2xvck1vZGVsKCkgaW5zdGFuY2VvZiBJbmRleENvbG9yTW9kZWwpIHsKLQkJSW5kZXhDb2xvck1vZGVsIGNvbG9yTW9kZWwgPSAoSW5kZXhDb2xvck1vZGVsKWJ1ZmZlcmVkSW1hZ2UuZ2V0Q29sb3JNb2RlbCgpOwotCQlpbnQgc2l6ZSA9IGNvbG9yTW9kZWwuZ2V0TWFwU2l6ZSgpOwotCQlieXRlW10gcmVkcyA9IG5ldyBieXRlW3NpemVdOwotCQlieXRlW10gZ3JlZW5zID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCWJ5dGVbXSBibHVlcyA9IG5ldyBieXRlW3NpemVdOwotCQljb2xvck1vZGVsLmdldFJlZHMocmVkcyk7Ci0JCWNvbG9yTW9kZWwuZ2V0R3JlZW5zKGdyZWVucyk7Ci0JCWNvbG9yTW9kZWwuZ2V0Qmx1ZXMoYmx1ZXMpOwotCQlSR0JbXSByZ2JzID0gbmV3IFJHQltzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZ2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZ2JzW2ldID0gbmV3IFJHQihyZWRzW2ldICYgMHhGRiwgZ3JlZW5zW2ldICYgMHhGRiwgYmx1ZXNbaV0gJiAweEZGKTsKLQkJfQotCQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKHJnYnMpOwotCQlJbWFnZURhdGEgZGF0YSA9IG5ldyBJbWFnZURhdGEoYnVmZmVyZWRJbWFnZS5nZXRXaWR0aCgpLCBidWZmZXJlZEltYWdlLmdldEhlaWdodCgpLCBjb2xvck1vZGVsLmdldFBpeGVsU2l6ZSgpLCBwYWxldHRlKTsKLQkJZGF0YS50cmFuc3BhcmVudFBpeGVsID0gY29sb3JNb2RlbC5nZXRUcmFuc3BhcmVudFBpeGVsKCk7Ci0JCVdyaXRhYmxlUmFzdGVyIHJhc3RlciA9IGJ1ZmZlcmVkSW1hZ2UuZ2V0UmFzdGVyKCk7Ci0JCWludFtdIHBpeGVsQXJyYXkgPSBuZXcgaW50WzFdOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJcmFzdGVyLmdldFBpeGVsKHgsIHksIHBpeGVsQXJyYXkpOwotCQkJCWRhdGEuc2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheVswXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCXJldHVybiBudWxsOwotfQotCi1zdGF0aWMgSW1hZ2VEYXRhIGNyZWF0ZVNhbXBsZUltYWdlKERpc3BsYXkgZGlzcGxheSkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwMCwgMTAwKTsKLQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCWdjLmZpbGxSZWN0YW5nbGUoYm91bmRzKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JZ2MuZmlsbE92YWwoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCWdjLmRyYXdMaW5lKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JZ2MuZHJhd0xpbmUoYm91bmRzLndpZHRoLCAwLCAwLCBib3VuZHMuaGVpZ2h0KTsKLQlnYy5kaXNwb3NlKCk7Ci0JSW1hZ2VEYXRhIGRhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlNXVCBJbWFnZSIpOwotCUltYWdlRGF0YSBkYXRhOwotCWlmIChhcmdzLmxlbmd0aCA+IDApIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gYXJnc1swXTsKLQkJZGF0YSA9IG5ldyBJbWFnZURhdGEoZmlsZU5hbWUpOwotCX0gZWxzZSB7Ci0JCWRhdGEgPSBjcmVhdGVTYW1wbGVJbWFnZShkaXNwbGF5KTsKLQl9Ci0JZmluYWwgSW1hZ2Ugc3d0SW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JZmluYWwgQnVmZmVyZWRJbWFnZSBhd3RJbWFnZSA9IGNvbnZlcnRUb0FXVChkYXRhKTsKLQlmaW5hbCBJbWFnZSBzd3RJbWFnZTIgPSBuZXcgSW1hZ2UoZGlzcGxheSwgY29udmVydFRvU1dUKGF3dEltYWdlKSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWludCB5ID0gMTA7Ci0JCQlpZiAoc3d0SW1hZ2UgIT0gbnVsbCkgewotCQkJCWUuZ2MuZHJhd0ltYWdlKHN3dEltYWdlLCAxMCwgeSk7Ci0JCQkJeSArPSBzd3RJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQgKyAxMDsKLQkJCX0KLQkJCWlmIChzd3RJbWFnZTIgIT0gbnVsbCkgewotCQkJCWUuZ2MuZHJhd0ltYWdlKHN3dEltYWdlMiwgMTAsIHkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKLQkJCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQkJCWlmIChhd3RJbWFnZSAhPSBudWxsKSB7Ci0JCQkJZy5kcmF3SW1hZ2UoYXd0SW1hZ2UsIDEwICsgaW5zZXRzLmxlZnQsIDEwICsgaW5zZXRzLnRvcCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9OwotCWZyYW1lLnNldFRpdGxlKCJBV1QgSW1hZ2UiKTsKLQlzaGVsbC5zZXRMb2NhdGlvbig1MCwgNTApOwotCVJlY3RhbmdsZSBib3VuZHMgPSBzd3RJbWFnZS5nZXRCb3VuZHMoKTsKLQlzaGVsbC5zZXRTaXplKGJvdW5kcy53aWR0aCArIDUwLCBib3VuZHMuaGVpZ2h0ICogMiArIDEwMCk7Ci0JUG9pbnQgc2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLQlQb2ludCBsb2NhdGlvbiA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0JSW5zZXRzIGluc2V0cyA9IGZyYW1lLmdldEluc2V0cygpOwotCWZyYW1lLnNldExvY2F0aW9uKGxvY2F0aW9uLnggKyBzaXplLnggKyAxMCwgbG9jYXRpb24ueSk7Ci0JZnJhbWUuc2V0U2l6ZShzaXplLnggLSAoaW5zZXRzLmxlZnQgKyBpbnNldHMucmlnaHQpLCBzaXplLnkgLSAoaW5zZXRzLnRvcCArIGluc2V0cy5ib3R0b20pKTsKLQlmcmFtZS5zZXRWaXNpYmxlKHRydWUpOwkKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmIChzd3RJbWFnZSAhPSBudWxsKSBzd3RJbWFnZS5kaXNwb3NlKCk7Ci0JaWYgKHN3dEltYWdlMiAhPSBudWxsKSBzd3RJbWFnZS5kaXNwb3NlKCk7Ci0JZnJhbWUuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCS8qIE5vdGU6IElmIHlvdSBhcmUgdXNpbmcgSkRLIDEuMy54LCB5b3UgbmVlZCB0byB1c2UgU3lzdGVtLmV4aXQoMCkgYXQgdGhlIGVuZCBvZiB5b3VyIHByb2dyYW0gdG8gZXhpdCBBV1QuCi0JICogVGhpcyBpcyBiZWNhdXNlIGluIDEuMy54LCBBV1QgZG9lcyBub3QgZXhpdCB3aGVuIHRoZSBmcmFtZSBpcyBkaXNwb3NlZCwgYmVjYXVzZSB0aGUgQVdUIHRocmVhZCBpcyBub3QgYSBkYWVtb24uCi0JICogVGhpcyB3YXMgZml4ZWQgaW4gSkRLIDEuNC54IHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSBBV1QgU2h1dGRvd24gdGhyZWFkLgotCSAqLwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTFjZGY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IEVtYmVkIFdvcmQgaW4gYW4gYXBwbGV0ICh3aW4zMiBvbmx5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotCQotaW1wb3J0IGphdmEuYXBwbGV0Lio7Ci0JIAotcHVibGljIGNsYXNzIFNuaXBwZXQxNTcgZXh0ZW5kcyBBcHBsZXQgewotCQotCW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkgZGlzcGxheTsKLQlvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCBzd3RQYXJlbnQ7Ci0JamF2YS5hd3QuQ2FudmFzIGF3dFBhcmVudDsKLQotcHVibGljIHZvaWQgaW5pdCAoKSB7Ci0JVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQgKG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlzZXRMYXlvdXQobmV3IGphdmEuYXd0LkdyaWRMYXlvdXQgKDEsIDEpKTsKLQkJCWF3dFBhcmVudCA9IG5ldyBqYXZhLmF3dC5DYW52YXMgKCk7Ci0JCQlhZGQgKGF3dFBhcmVudCk7Ci0JCQlkaXNwbGF5ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkgKCk7Ci0JCQlzd3RQYXJlbnQgPSBvcmcuZWNsaXBzZS5zd3QuYXd0LlNXVF9BV1QubmV3X1NoZWxsIChkaXNwbGF5LCBhd3RQYXJlbnQpOwotCQkJc3d0UGFyZW50LnNldExheW91dCAobmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dCAoKSk7Ci0JCQlvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZyYW1lIGZyYW1lID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnJhbWUgKHN3dFBhcmVudCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT05FKTsKLQkJCW9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZSBzaXRlOwotCQkJdHJ5IHsKLQkJCQlzaXRlID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZSAoZnJhbWUsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9ORSwgIldvcmQuRG9jdW1lbnQiKTsKLQkJCX0gY2F0Y2ggKG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBzdHIgPSAiQ3JlYXRlIE9sZUNsaWVudFNpdGUgRXJyb3IiICsgZS50b1N0cmluZyAoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKHN0cik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJc2V0U2l6ZSAoNTAwLCA1MDApOwotCQkJdmFsaWRhdGUgKCk7Ci0JCQlzaXRlLmRvVmVyYiAob3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PTEUuT0xFSVZFUkJfU0hPVyk7Ci0JCQkKLQkJCXdoaWxlIChzd3RQYXJlbnQgIT0gbnVsbCAmJiAhc3d0UGFyZW50LmlzRGlzcG9zZWQgKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwkJCi0JCQl9CQotCQl9Ci0JfSk7Ci0JdGhyZWFkLnN0YXJ0ICgpOwotfQotIHB1YmxpYyB2b2lkIHN0b3AgKCl7Ci0gCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCAoKSl7Ci0gCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSAoKSB7Ci0gCQkJcHVibGljIHZvaWQgcnVuICgpIHsKLSAJCQkJaWYgKHN3dFBhcmVudCAhPSBudWxsICYmICFzd3RQYXJlbnQuaXNEaXNwb3NlZCAoKSkgc3d0UGFyZW50LmRpc3Bvc2UgKCk7Ci0gCQkJCXN3dFBhcmVudCA9IG51bGw7Ci0gCQkJCWRpc3BsYXkuZGlzcG9zZSAoKTsKLSAJCQkJZGlzcGxheSA9IG51bGw7Ci0gCQkJfQotIAkJfSk7Ci0gCQlyZW1vdmUgKGF3dFBhcmVudCk7Ci0gCQlhd3RQYXJlbnQgPSBudWxsOwotIAl9Ci0gfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3OWZkZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGV0ZXJtaW5lIG5hdGl2ZSBkYXRhIHR5cGVzIGF2YWlsYWJsZSAobW90aWYgb25seSkKLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTggZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLXByaXZhdGUgc3RhdGljIFNuaXBwZXQxNTggX2luc3RhbmNlID0gbmV3IFNuaXBwZXQxNTgoKTsKLXByaXZhdGUgaW50W10gaWRzOwotcHJpdmF0ZSBTdHJpbmdbXSBuYW1lczsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSBjb250cm9sID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQoIkRyYWcgZGF0YSBvdmVyIHRoaXMgc2l0ZSB0byBzZWUgdGhlIG5hdGl2ZSB0cmFuc2ZlciB0eXBlLiIpOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoY29udHJvbCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LIHwgRE5ELkRST1BfTU9WRSk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtTbmlwcGV0MTU4LmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewkJCQotCQkJU3RyaW5nIG9wcyA9ICIiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgb3BzICs9ICJDb3B5OyI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9NT1ZFKSAhPSAwKSBvcHMgKz0gIk1vdmU7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIG9wcyArPSAiTGluazsiOwotCQkJY29udHJvbC5yZW1vdmVBbGwoKTsKLQkJCVRhYmxlSXRlbSBpdGVtMSA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQlpdGVtMS5zZXRUZXh0KCJBbGxvd2VkIE9wZXJhdGlvbnMgYXJlICIrb3BzKTsKLQkJCQotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCX0gZWxzZSBpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9MSU5LKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0xJTks7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVRyYW5zZmVyRGF0YVtdIGRhdGEgPSBldmVudC5kYXRhVHlwZXM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgaWQgPSBkYXRhW2ldLnR5cGU7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lRnJvbUlkKGlkKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbTIgPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsU1dULk5PTkUpOwotCQkJCWl0ZW0yLnNldFRleHQoIkRhdGEgdHlwZSBpcyAiK2lkKyIgIituYW1lKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFNuaXBwZXQxNTggZ2V0SW5zdGFuY2UgKCkgewotCXJldHVybiBfaW5zdGFuY2U7Ci19Ci1TbmlwcGV0MTU4KCkgewotfQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci19Ci1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKXsKLQlyZXR1cm4gIkhlbGxvIFdvcmxkIjsKLX0KLXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKXsKLQlyZXR1cm4gbmFtZXM7Ci19Ci1zdGF0aWMgaW50IHNoZWxsSGFuZGxlOwotcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKXsKLQlpZiAoaWRzID09IG51bGwpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWludCB3aWRnZXRDbGFzcyA9IE9TLnRvcExldmVsU2hlbGxXaWRnZXRDbGFzcyAoKTsKLQkJc2hlbGxIYW5kbGUgPSBPUy5YdEFwcENyZWF0ZVNoZWxsIChudWxsLCBudWxsLCB3aWRnZXRDbGFzcywgZGlzcGxheS54RGlzcGxheSwgbnVsbCwgMCk7Ci0JCU9TLlh0U2V0TWFwcGVkV2hlbk1hbmFnZWQgKHNoZWxsSGFuZGxlLCBmYWxzZSk7Ci0JCU9TLlh0UmVhbGl6ZVdpZGdldCAoc2hlbGxIYW5kbGUpOwotCQkKLQkJaWRzID0gbmV3IGludFs4NDBdOwotCQluYW1lcyA9IG5ldyBTdHJpbmdbODQwXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJCWlkc1tpXSA9IGkraTsKLQkJCW5hbWVzW2ldID0gZ2V0TmFtZUZyb21JZChpKzEpOwotCQl9Ci0JfQotCXJldHVybiBpZHM7Ci19Ci1zdGF0aWMgU3RyaW5nIGdldE5hbWVGcm9tSWQoaW50IGlkKSB7Ci0JaW50IHhEaXNwbGF5ID0gT1MuWHREaXNwbGF5IChzaGVsbEhhbmRsZSk7Ci0JaW50IHB0ciA9IDA7Ci0JdHJ5IHsKLQkJcHRyID0gT1MuWG1HZXRBdG9tTmFtZSh4RGlzcGxheSwgaWQpOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JfQotCWlmIChwdHIgPT0gMCkgcmV0dXJuICJpbnZhbGlkICIraWQ7Ci0JaW50IGxlbmd0aCA9IE9TLnN0cmxlbihwdHIpOwotCWJ5dGVbXSBuYW1lQnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLQlPUy5tZW1tb3ZlKG5hbWVCdWYsIHB0ciwgbGVuZ3RoKTsKLQlPUy5YRnJlZShwdHIpOwotCXJldHVybiBuZXcgU3RyaW5nKENvbnZlcnRlci5tYmNzVG9XY3MobnVsbCwgbmFtZUJ1ZikpLnRvTG93ZXJDYXNlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDYwM2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBtb2RpZnkgSFRNTCB0aXRsZSB0YWcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1OSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgU3RyaW5nIG5ld1RpdGxlID0gIk5ldyBWYWx1ZSBmb3IgVGl0bGUiOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCWRpc3BsYXkuZGlzcG9zZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihuZXcgVGl0bGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGl0bGVFdmVudDogIitldmVudC50aXRsZSk7Ci0JCQkJc2hlbGwuc2V0VGV4dChldmVudC50aXRsZSk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJLyogU2V0IEhUTUwgdGl0bGUgdGFnIHVzaW5nIEphdmFTY3JpcHQgYW5kIERPTSB3aGVuIHBhZ2UgaGFzIGJlZW4gbG9hZGVkICovCi0JCQkJYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmV4ZWN1dGUoImRvY3VtZW50LnRpdGxlPSciK25ld1RpdGxlKyInIik7Ci0JCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJLyogU2NyaXB0IG1heSBmYWlsIG9yIG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIGNlcnRhaW4gcGxhdGZvcm1zLiAqLwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjcmlwdCB3YXMgbm90IGV4ZWN1dGVkLiIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCS8qIExvYWQgYW4gSFRNTCBkb2N1bWVudCAqLwotCQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzZjYTMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEaXNwbGF5IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIG9uZSByZXBlYXRpbmcgdGltZXIgKGV2ZXJ5IDUwMCBtcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBpbnQgdGltZSA9IDUwMDsKLQlSdW5uYWJsZSB0aW1lciA9IG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlQb2ludCBwb2ludCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldEJvdW5kcyAoKTsKLQkJCWlmIChyZWN0LmNvbnRhaW5zIChwb2ludCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJJbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJPdXQiKTsKLQkJCX0KLQkJCWRpc3BsYXkudGltZXJFeGVjICh0aW1lLCB0aGlzKTsKLQkJfQotCX07Ci0JZGlzcGxheS50aW1lckV4ZWMgKHRpbWUsIHRpbWVyKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7CQotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2NjBkMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IHF1ZXJ5IERPTSBub2RlIHZhbHVlIChwcmUtZWNsaXBzZS9zd3QgMy41IGltcGxlbWVudGF0aW9uKQotICogQW4gaW1wcm92ZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBzbmlwcGV0IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBlY2xpcHNlL3N3dCAzLjUKLSAqIGFuZCBuZXdlciBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwOC5qYXZhP3ZpZXc9Y28KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2MCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgU3RyaW5nIGh0bWwgPSAiPGh0bWw+PHRpdGxlPlNuaXBwZXQ8L3RpdGxlPjxib2R5PjxwIGlkPSdteWlkJz5CZXN0IEZyaWVuZHM8L3A+PHAgaWQ9J215aWQyJz5DYXQgYW5kIERvZzwvcD48L2JvZHk+PC9odG1sPiI7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkgewotCQkJCWJyb3dzZXIuc2V0RGF0YSgicXVlcnkiLCBldmVudC50ZXh0KTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQkvKiAKLQkJCQkgKiBVc2UgSmF2YVNjcmlwdCB0byBxdWVyeSB0aGUgZGVzaXJlZCBub2RlIGNvbnRlbnQgdGhyb3VnaCB0aGUgRG9jdW1lbnQgT2JqZWN0IE1vZGVsCi0JCQkJICogCi0JCQkJICogQXNzaWduIHJlc3VsdCB0byB0aGUgd2luZG93IHByb3BlcnR5IHN0YXR1cyB0byBwYXNzIHRoZSByZXN1bHQgdG8gdGhlIFN0YXR1c1RleHRMaXN0ZW5lcgotCQkJCSAqIFRoaXMgdHJpY2sgaXMgcmVxdWlyZWQgc2luY2UgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gZG9lcyBub3QgcmV0dXJuIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0JCQkJICogZGlyZWN0bHkuCi0JCQkJICovCi0JCQkJYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmV4ZWN1dGUoIndpbmRvdy5zdGF0dXM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215aWQnKS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTsiKTsKLQkJCQlpZiAoIXJlc3VsdCkgewotCQkJCQkvKiBTY3JpcHQgbWF5IGZhaWwgb3IgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgb24gY2VydGFpbiBwbGF0Zm9ybXMuICovCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2NyaXB0IHdhcyBub3QgZXhlY3V0ZWQuIik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZylicm93c2VyLmdldERhdGEoInF1ZXJ5Iik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb2RlIHZhbHVlOiAiK3ZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JCS8qIExvYWQgYW4gSFRNTCBkb2N1bWVudCAqLwotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRhN2JiMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IG1vZGlmeSBET00gKGV4ZWN1dGluZyBqYXZhc2NyaXB0KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTYxIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBTdHJpbmcgaHRtbCA9ICI8aHRtbD48dGl0bGU+U25pcHBldDwvdGl0bGU+PGJvZHk+PHAgaWQ9J215aWQnPkJlc3QgRnJpZW5kczwvcD48cCBpZD0nbXlpZDInPkNhdCBhbmQgRG9nPC9wPjwvYm9keT48L2h0bWw+IjsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCWRpc3BsYXkuZGlzcG9zZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULk1VTFRJKTsKLQkJdGV4dC5zZXRUZXh0KCJ2YXIgbmV3Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1AnKTsgXHJcbiIrCi0JCQkJInZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0F0IGxlYXN0IHdoZW4gSSBhbSBhcm91bmQnKTtcclxuIisKLQkJCQkibmV3Tm9kZS5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuIisKLQkJCQkiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215aWQnKS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuIisKLQkJCQkiXHJcbiIrCi0JCQkJImRvY3VtZW50LmJnQ29sb3I9J3llbGxvdyc7Iik7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIkV4ZWN1dGUgU2NyaXB0Iik7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5leGVjdXRlKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIXJlc3VsdCkgewotCQkJCQkvKiBTY3JpcHQgbWF5IGZhaWwgb3IgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgb24gY2VydGFpbiBwbGF0Zm9ybXMuICovCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2NyaXB0IHdhcyBub3QgZXhlY3V0ZWQuIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNTVjMjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBBZGRpbmcgYW4gYWNjZXNzaWJsZSBsaXN0ZW5lciB0byBwcm92aWRlIGVtdWxhdGVkIHN0YXRlIGluZm9ybWF0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTYyIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmdbXSBJVEVNX05BTUVTID0geyJmaXJzdCBpdGVtIiwgInNlY29uZCIsICJ0aGlyZCIsICJmb3VydGgiLCAiZmlmdGgifTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgSW1hZ2UgY2hlY2tlZEltYWdlID0gZ2V0U3RhdGVJbWFnZSAoZGlzcGxheSwgdHJ1ZSk7Ci0JZmluYWwgSW1hZ2UgdW5jaGVja2VkSW1hZ2UgPSBnZXRTdGF0ZUltYWdlIChkaXNwbGF5LCBmYWxzZSk7Ci0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JCi0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IElURU1fTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKElURU1fTkFNRVNbaV0pOwotCQlpdGVtLnNldEltYWdlIChpICUgMiA9PSAwID8gY2hlY2tlZEltYWdlIDogdW5jaGVja2VkSW1hZ2UpOwotCX0KLQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWUuaXRlbTsKLQkJCWl0ZW0uc2V0SW1hZ2UoaXRlbS5nZXRJbWFnZSgpID09IGNoZWNrZWRJbWFnZSA/IHVuY2hlY2tlZEltYWdlIDogY2hlY2tlZEltYWdlKTsKLQkJfQotCX0pOwotCi0JdGFibGUuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCWUuZGV0YWlsID0gQUNDLlJPTEVfQ0hFQ0tCVVRUT047Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0U3RhdGUgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJaWYgKGUuY2hpbGRJRCA+PSAwICYmIGUuY2hpbGRJRCA8IHRhYmxlLmdldEl0ZW1Db3VudCAoKSkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoZS5jaGlsZElEKTsKLQkJCQlpZiAoaXRlbS5nZXRJbWFnZSgpID09IGNoZWNrZWRJbWFnZSkgewotCQkJCQllLmRldGFpbCB8PSBBQ0MuU1RBVEVfQ0hFQ0tFRDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljaGVja2VkSW1hZ2UuZGlzcG9zZSAoKTsKLQl1bmNoZWNrZWRJbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotc3RhdGljIEltYWdlIGdldFN0YXRlSW1hZ2UgKERpc3BsYXkgZGlzcGxheSwgYm9vbGVhbiBjaGVja2VkKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JZ2MuZmlsbE92YWwgKDAsIDAsIDE2LCAxNik7Ci0JaWYgKGNoZWNrZWQpIHsKLQkJZ2Muc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0RBUktfR1JFRU4pKTsKLQkJZ2MuZHJhd0xpbmUgKDAsIDAsIDE2LCAxNik7Ci0JCWdjLmRyYXdMaW5lICgxNiwgMCwgMCwgMTYpOwotCX0KLQlnYy5kaXNwb3NlICgpOwotCXJldHVybiBpbWFnZTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5N2ZkNGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNldHRpbmcgdGhlIGZvbnQgc3R5bGUsIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzIG9mIFN0eWxlZFRleHQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSBBQkNERUZHSElKS0xNIE5PUFFSU1RVVldYWVoiKTsKLQkvLyBtYWtlIDAxMjM0NTY3ODkgYXBwZWFyIGJvbGQKLQlTdHlsZVJhbmdlIHN0eWxlMSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUxLnN0YXJ0ID0gMDsKLQlzdHlsZTEubGVuZ3RoID0gMTA7Ci0Jc3R5bGUxLmZvbnRTdHlsZSA9IFNXVC5CT0xEOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZTEpOwotCS8vIG1ha2UgQUJDREVGR0hJSktMTSBoYXZlIGEgcmVkIGZvbnQKLQlTdHlsZVJhbmdlIHN0eWxlMiA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUyLnN0YXJ0ID0gMTE7Ci0Jc3R5bGUyLmxlbmd0aCA9IDEzOwotCXN0eWxlMi5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUyKTsKLQkvLyBtYWtlIE5PUFFSU1RVVldYWVogaGF2ZSBhIGJsdWUgYmFja2dyb3VuZAotCVN0eWxlUmFuZ2Ugc3R5bGUzID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTMuc3RhcnQgPSAyNTsKLQlzdHlsZTMubGVuZ3RoID0gMTM7Ci0Jc3R5bGUzLmJhY2tncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUzKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M0NDA1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQcm92aWRlIHRleHQgdGhhdCB3aWxsIGJlIHNwb2tlbiBmb3IgYW4gaW1hZ2UgQnV0dG9uLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoICk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBTbmlwcGV0MTY0LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0gKCJlY2xpcHNlLnBuZyIpKTsKLQotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCImVHlwaWNhbCBidXR0b24iKTsKLQkKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRJbWFnZSAoaW1hZ2UpOwotCWJ1dHRvbjIuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCWUucmVzdWx0ID0gIkVjbGlwc2UgbG9nbyI7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNiMThiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBDVGFiRm9sZGVyIHdpdGggbWluIGFuZCBtYXggYnV0dG9ucywgYXMgd2VsbCBhcyBjbG9zZSBidXR0b24gYW5kIAotICogaW1hZ2Ugb25seSBvbiBzZWxlY3RlZCB0YWIuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMTYsIDE2KTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCWdjLmZpbGxSZWN0YW5nbGUoMywgMywgMTAsIDEwKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlmaW5hbCBDVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCWZvbGRlci5zZXRTaW1wbGUoZmFsc2UpOwotCWZvbGRlci5zZXRVbnNlbGVjdGVkSW1hZ2VWaXNpYmxlKGZhbHNlKTsKLQlmb2xkZXIuc2V0VW5zZWxlY3RlZENsb3NlVmlzaWJsZShmYWxzZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5DTE9TRSk7Ci0JCWl0ZW0uc2V0VGV4dCgiSXRlbSAiK2kpOwotCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoZm9sZGVyLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQl0ZXh0LnNldFRleHQoIlRleHQgZm9yIGl0ZW0gIitpKyJcblxub25lLCB0d28sIHRocmVlXG5cbmFiY2RlZmdoaWprbG1ub3AiKTsKLQkJaXRlbS5zZXRDb250cm9sKHRleHQpOwotCX0KLQlmb2xkZXIuc2V0TWluaW1pemVWaXNpYmxlKHRydWUpOwotCWZvbGRlci5zZXRNYXhpbWl6ZVZpc2libGUodHJ1ZSk7Ci0JZm9sZGVyLmFkZENUYWJGb2xkZXIyTGlzdGVuZXIobmV3IENUYWJGb2xkZXIyQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgbWluaW1pemUoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0JCQlmb2xkZXIuc2V0TWluaW1pemVkKHRydWUpOwotCQkJc2hlbGwubGF5b3V0KHRydWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1heGltaXplKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJZm9sZGVyLnNldE1heGltaXplZCh0cnVlKTsKLQkJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJCXNoZWxsLmxheW91dCh0cnVlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXN0b3JlKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJZm9sZGVyLnNldE1pbmltaXplZChmYWxzZSk7Ci0JCQlmb2xkZXIuc2V0TWF4aW1pemVkKGZhbHNlKTsKLQkJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCQlzaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDcyN2YwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBTY3JvbGxlZENvbXBvc2l0ZSB3aXRoIHdyYXBwaW5nIGNvbnRlbnQuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBpbWFnZTEgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dPUktJTkcpOwotCUltYWdlIGltYWdlMiA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fUVVFU1RJT04pOwotCUltYWdlIGltYWdlMyA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotCQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxDb21wb3NpdGUgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCi0JZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2Nyb2xsQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JZm9yKGludCBpID0gMDsgaSA8PSA1MDsgaSsrKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlpZiAoaSAlIDMgPT0gMCkgbGFiZWwuc2V0SW1hZ2UoaW1hZ2UxKTsKLQkJaWYgKGkgJSAzID09IDEpIGxhYmVsLnNldEltYWdlKGltYWdlMik7Ci0JCWlmIChpICUgMyA9PSAyKSBsYWJlbC5zZXRJbWFnZShpbWFnZTMpOwotCX0KLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCk7Ci0JbGF5b3V0LndyYXAgPSB0cnVlOwotCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlzY3JvbGxDb21wb3NpdGUuc2V0Q29udGVudChwYXJlbnQpOwotCXNjcm9sbENvbXBvc2l0ZS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQlzY3JvbGxDb21wb3NpdGUuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQlzY3JvbGxDb21wb3NpdGUuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSByID0gc2Nyb2xsQ29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJCXNjcm9sbENvbXBvc2l0ZS5zZXRNaW5TaXplKHBhcmVudC5jb21wdXRlU2l6ZShyLndpZHRoLCBTV1QuREVGQVVMVCkpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjIxMWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSB0d28gU2Nyb2xsZWRDb21wb3NpdGVzIHRoYXQgc2Nyb2xsIGluIHRhbmRlbS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24gKHNjMSwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCAoIkJ1dHRvbiAxIik7Ci0JYnV0dG9uMS5zZXRTaXplICg0MDAsIDMwMCk7Ci0Jc2MxLnNldENvbnRlbnQgKGJ1dHRvbjEpOwotCi0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MyID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNjMiwgU1dULlBVU0gpOwotCWJ1dHRvbjIuc2V0VGV4dCAoIkJ1dHRvbiAyIik7Ci0JYnV0dG9uMi5zZXRTaXplICgzMDAsIDQwMCk7Ci0Jc2MyLnNldENvbnRlbnQgKGJ1dHRvbjIpOwotCi0JZmluYWwgU2Nyb2xsQmFyIHZCYXIxID0gc2MxLmdldFZlcnRpY2FsQmFyICgpOwotCWZpbmFsIFNjcm9sbEJhciB2QmFyMiA9IHNjMi5nZXRWZXJ0aWNhbEJhciAoKTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhcjEgPSBzYzEuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhcjIgPSBzYzIuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgeCA9ICBoQmFyMS5nZXRTZWxlY3Rpb24oKSAqIChoQmFyMi5nZXRNYXhpbXVtKCkgLSBoQmFyMi5nZXRUaHVtYigpKSAvIE1hdGgubWF4KDEsIGhCYXIxLmdldE1heGltdW0oKSAtIGhCYXIxLmdldFRodW1iKCkpOwotCQkJaW50IHkgPSAgdkJhcjEuZ2V0U2VsZWN0aW9uKCkgKiAodkJhcjIuZ2V0TWF4aW11bSgpIC0gdkJhcjIuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCB2QmFyMS5nZXRNYXhpbXVtKCkgLSB2QmFyMS5nZXRUaHVtYigpKTsKLQkJCXNjMi5zZXRPcmlnaW4gKHgsIHkpOwotCQl9Ci0JfTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgeCA9ICBoQmFyMi5nZXRTZWxlY3Rpb24oKSAqIChoQmFyMS5nZXRNYXhpbXVtKCkgLSBoQmFyMS5nZXRUaHVtYigpKSAvIE1hdGgubWF4KDEsIGhCYXIyLmdldE1heGltdW0oKSAtIGhCYXIyLmdldFRodW1iKCkpOwotCQkJaW50IHkgPSAgdkJhcjIuZ2V0U2VsZWN0aW9uKCkgKiAodkJhcjEuZ2V0TWF4aW11bSgpIC0gdkJhcjEuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCB2QmFyMi5nZXRNYXhpbXVtKCkgLSB2QmFyMi5nZXRUaHVtYigpKTsKLQkJCXNjMS5zZXRPcmlnaW4gKHgsIHkpOwotCQl9Ci0JfTsKLQl2QmFyMS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIxKTsKLQloQmFyMS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIxKTsKLQl2QmFyMi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIyKTsKLQloQmFyMi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIyKTsKLQotCXNoZWxsLnNldFNpemUgKDQwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDI0NWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYXcgbGluZXMgYW5kIHBvbHlnb25zIHdpdGggZGlmZmVyZW50IGNhcCBhbmQgam9pbiBzdHlsZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTY4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgeCA9IDIwLCB5ID0gMjAsIHcgPSAxMjAsIGggPSA2MDsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQkJCWdjLnNldExpbmVXaWR0aCgxMCk7Ci0JCQlpbnRbXSBjYXBzID0ge1NXVC5DQVBfRkxBVCwgU1dULkNBUF9ST1VORCwgU1dULkNBUF9TUVVBUkV9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZ2Muc2V0TGluZUNhcChjYXBzW2ldKTsKLQkJCQlnYy5kcmF3TGluZSh4LCB5LCB4ICsgdywgeSk7Ci0JCQkJeSArPSAyMDsKLQkJCX0KLQkJCWludFtdIGpvaW5zID0ge1NXVC5KT0lOX0JFVkVMLCBTV1QuSk9JTl9NSVRFUiwgU1dULkpPSU5fUk9VTkR9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2lucy5sZW5ndGg7IGkrKykgewotCQkJCWdjLnNldExpbmVKb2luKGpvaW5zW2ldKTsKLQkJCQlnYy5kcmF3UG9seWdvbihuZXcgaW50W10ge3gsIHksIHggKyB3LzIsIHkgKyBoLCB4ICsgdywgeX0pOwotCQkJCXkgKz0gaCArIDIwOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkYTMyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWFrZSBhIHRvZ2dsZSBidXR0b24gaGF2ZSByYWRpbyBiZWhhdmlvcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2OSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJQ29udHJvbCBbXSBjaGlsZHJlbiA9IHNoZWxsLmdldENoaWxkcmVuICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuIFtpXTsKLQkJCQlpZiAoZS53aWRnZXQgIT0gY2hpbGQgJiYgY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24gJiYgKGNoaWxkLmdldFN0eWxlICgpICYgU1dULlRPR0dMRSkgIT0gMCkgewotCQkJCQkoKEJ1dHRvbikgY2hpbGQpLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJCSgoQnV0dG9uKSBlLndpZGdldCkuc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJfQotCX07Ci0JZm9yIChpbnQgaT0wOyBpPDIwOyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuVE9HR0xFKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCIiArIGkpOwotCQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaWYgKGkgPT0gMCkgYnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZmY4M2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2xpZGVyIGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2Nyb2xsIGV2ZW50IGRldGFpbHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlTbGlkZXIgc2xpZGVyID0gbmV3IFNsaWRlciAoc2hlbGwsIFNXVC5IT1JJWk9OVEFMKTsKLQlzbGlkZXIuc2V0Qm91bmRzICgxMCwgMTAsIDIwMCwgMzIpOwotCXNsaWRlci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIlNXVC5OT05FIjsKLQkJCXN3aXRjaCAoZXZlbnQuZGV0YWlsKSB7Ci0JCQkJY2FzZSBTV1QuRFJBRzogc3RyaW5nID0gIlNXVC5EUkFHIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuSE9NRTogc3RyaW5nID0gIlNXVC5IT01FIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuRU5EOiBzdHJpbmcgPSAiU1dULkVORCI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkFSUk9XX0RPV046IHN0cmluZyA9ICJTV1QuQVJST1dfRE9XTiI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkFSUk9XX1VQOiBzdHJpbmcgPSAiU1dULkFSUk9XX1VQIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUEFHRV9ET1dOOiBzdHJpbmcgPSAiU1dULlBBR0VfRE9XTiI7IGJyZWFrOwotCQkJCWNhc2UgU1dULlBBR0VfVVA6IHN0cmluZyA9ICJTV1QuUEFHRV9VUCI7IGJyZWFrOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2Nyb2xsIGRldGFpbCAtPiAiICsgc3RyaW5nKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkYzNiOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IENyZWF0ZSBhIFRyZWUgd2l0aCBjb2x1bW5zCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTcwIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCVRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCWNvbHVtbjEuc2V0VGV4dCgiQ29sdW1uIDEiKTsKLQkJY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQlUcmVlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uMi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCQljb2x1bW4yLnNldFdpZHRoKDIwMCk7Ci0JCVRyZWVDb2x1bW4gY29sdW1uMyA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5SSUdIVCk7Ci0JCWNvbHVtbjMuc2V0VGV4dCgiQ29sdW1uIDMiKTsKLQkJY29sdW1uMy5zZXRXaWR0aCgyMDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsgIml0ZW0gIiArIGksICJhYmMiLCAiZGVmZ2hpIiB9KTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc3ViSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ICJzdWJpdGVtICIgKyBqLCAiamtsbW5vcCIsICJxcnMiIH0pOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKSB7Ci0JCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCQlzdWJzdWJJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsgInN1YnN1Yml0ZW0gIiArIGssICJ0dXYiLCAid3h5eiIgfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZGNhM2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGVmaW5lIGRhdGEgdHJhbnNmZXIgdHlwZXMgdGhhdCBzdWJjbGFzcyBlYWNoCi0gKiBvdGhlcgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTcxIHsKLQotLyoKLSAqIFRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkIGlzIGFuIDxib2xkPmFycmF5IG9mIHR5cGUgTXlUeXBlPC9ib2xkPiB3aGVyZQotICogTXlUeXBlIGlzIGRlZmluZSBhczoKLSAqLwotc3RhdGljIGNsYXNzIE15VHlwZSB7Ci0JU3RyaW5nIGZpbGVOYW1lOwotCWxvbmcgZmlsZUxlbmd0aDsKLQlsb25nIGxhc3RNb2RpZmllZDsKLX0KLQotc3RhdGljIGNsYXNzIE15VHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlUWVBFTkFNRSA9ICJNeXR5cGVUcmFuc2ZlciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1ZVFlQRUlEID0gcmVnaXN0ZXJUeXBlKE1ZVFlQRU5BTUUpOwotCXByaXZhdGUgc3RhdGljIE15VHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHJhbnNmZXIoKTsKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNmZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JYnl0ZVtdIGphdmFUb0J5dGVBcnJheShPYmplY3Qgb2JqZWN0KSB7Ci0JCU15VHlwZSBkYXRhID0gKE15VHlwZSkgb2JqZWN0OwotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCURhdGFPdXRwdXRTdHJlYW0gd3JpdGVPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXQpOwotCQkJYnl0ZVtdIGJ1ZmZlciA9IGRhdGEuZmlsZU5hbWUuZ2V0Qnl0ZXMoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50KGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUoYnVmZmVyKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyhkYXRhLmZpbGVMZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nKGRhdGEubGFzdE1vZGlmaWVkKTsKLQkJCWJ1ZmZlciA9IG91dC50b0J5dGVBcnJheSgpOwotCQkJd3JpdGVPdXQuY2xvc2UoKTsKLQkJCXJldHVybiBidWZmZXI7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlPYmplY3QgYnl0ZUFycmF5VG9KYXZhKGJ5dGVbXSBieXRlcykgewotCQlNeVR5cGUgZGF0YSA9IG5ldyBNeVR5cGUoKTsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLQkJCURhdGFJbnB1dFN0cmVhbSByZWFkSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKLQkJCWludCBzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXJlYWRJbi5yZWFkKGJ1ZmZlcik7Ci0JCQlkYXRhLmZpbGVOYW1lID0gbmV3IFN0cmluZyhidWZmZXIpOwotCQkJZGF0YS5maWxlTGVuZ3RoID0gcmVhZEluLnJlYWRMb25nKCk7Ci0JCQlkYXRhLmxhc3RNb2RpZmllZCA9IHJlYWRJbi5yZWFkTG9uZygpOwotCQkJcmVhZEluLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlpZiAoIWNoZWNrTXlUeXBlKG9iamVjdCkgfHwgIWlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSB7Ci0JCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JCX0KLQkJYnl0ZVtdIGJ1ZmZlciA9IGphdmFUb0J5dGVBcnJheShvYmplY3QpOwotCQlzdXBlci5qYXZhVG9OYXRpdmUoYnVmZmVyLCB0cmFuc2ZlckRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKGlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSB7Ci0JCQlieXRlW10gYnVmZmVyID0gKGJ5dGVbXSkgc3VwZXIubmF0aXZlVG9KYXZhKHRyYW5zZmVyRGF0YSk7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gYnl0ZUFycmF5VG9KYXZhKGJ1ZmZlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IE1ZVFlQRU5BTUUgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7IE1ZVFlQRUlEIH07Ci0JfQotCi0JYm9vbGVhbiBjaGVja015VHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBNeVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY2hlY2tNeVR5cGUob2JqZWN0KTsKLQl9Ci19Ci0KLS8qCi0gKiBUaGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZCBpcyBhbiA8Ym9sZD5hcnJheSBvZiB0eXBlIE15VHlwZTI8L2JvbGQ+Ci0gKiB3aGVyZSBNeVR5cGUyIGlzIGRlZmluZSBhczoKLSAqLwotc3RhdGljIGNsYXNzIE15VHlwZTIgZXh0ZW5kcyBNeVR5cGUgewotCVN0cmluZyB2ZXJzaW9uOwotfQotCi1zdGF0aWMgY2xhc3MgTXlUcmFuc2ZlcjIgZXh0ZW5kcyBNeVRyYW5zZmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWVRZUEUyTkFNRSA9ICJNeXR5cGUyVHJhbnNmZXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNWVRZUEUySUQgPSByZWdpc3RlclR5cGUoTVlUWVBFMk5BTUUpOwotCXByaXZhdGUgc3RhdGljIE15VHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHJhbnNmZXIyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zZmVyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBNWVRZUEUyTkFNRSB9OwotCX0KLQotCXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgewotCQlyZXR1cm4gbmV3IGludFtdIHsgTVlUWVBFMklEIH07Ci0JfQotCi0JYnl0ZVtdIGphdmFUb0J5dGVBcnJheShPYmplY3Qgb2JqZWN0KSB7Ci0JCU15VHlwZTIgZGF0YSA9IChNeVR5cGUyKSBvYmplY3Q7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJRGF0YU91dHB1dFN0cmVhbSB3cml0ZU91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dCk7Ci0JCQlieXRlW10gYnVmZmVyID0gZGF0YS5maWxlTmFtZS5nZXRCeXRlcygpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZShidWZmZXIpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nKGRhdGEuZmlsZUxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcoZGF0YS5sYXN0TW9kaWZpZWQpOwotCQkJYnVmZmVyID0gZGF0YS52ZXJzaW9uLmdldEJ5dGVzKCk7Ci0JCQl3cml0ZU91dC53cml0ZUludChidWZmZXIubGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlKGJ1ZmZlcik7Ci0JCQlidWZmZXIgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQkJCXdyaXRlT3V0LmNsb3NlKCk7Ci0JCQlyZXR1cm4gYnVmZmVyOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JT2JqZWN0IGJ5dGVBcnJheVRvSmF2YShieXRlW10gYnl0ZXMpIHsKLQkJTXlUeXBlMiBkYXRhID0gbmV3IE15VHlwZTIoKTsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLQkJCURhdGFJbnB1dFN0cmVhbSByZWFkSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKLQkJCWludCBzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXJlYWRJbi5yZWFkKGJ1ZmZlcik7Ci0JCQlkYXRhLmZpbGVOYW1lID0gbmV3IFN0cmluZyhidWZmZXIpOwotCQkJZGF0YS5maWxlTGVuZ3RoID0gcmVhZEluLnJlYWRMb25nKCk7Ci0JCQlkYXRhLmxhc3RNb2RpZmllZCA9IHJlYWRJbi5yZWFkTG9uZygpOwotCQkJc2l6ZSA9IHJlYWRJbi5yZWFkSW50KCk7Ci0JCQlidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXJlYWRJbi5yZWFkKGJ1ZmZlcik7Ci0JCQlkYXRhLnZlcnNpb24gPSBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0JCQlyZWFkSW4uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZShPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JCWlmICghY2hlY2tNeVR5cGUyKG9iamVjdCkpIHsKLQkJCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQkJfQotCQlzdXBlci5qYXZhVG9OYXRpdmUob2JqZWN0LCB0cmFuc2ZlckRhdGEpOwotCX0KLQotCWJvb2xlYW4gY2hlY2tNeVR5cGUyKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCFjaGVja015VHlwZShvYmplY3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgTXlUeXBlMjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBjaGVja015VHlwZTIob2JqZWN0KTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwxLnNldFRleHQoIkRyYWcgU291cmNlIGZvciBNeURhdGEgYW5kIE15RGF0YTIiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwyLnNldFRleHQoIkRyb3AgVGFyZ2V0IGZvciBNeURhdGEiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDMgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwzLnNldFRleHQoIkRyb3AgVGFyZ2V0IGZvciBNeURhdGEyIik7Ci0KLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKGxhYmVsMSwgRE5ELkRST1BfQ09QWSk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgTXlUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJTXlUcmFuc2ZlcjIuZ2V0SW5zdGFuY2UoKSB9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlNeVR5cGUyIG15VHlwZSA9IG5ldyBNeVR5cGUyKCk7Ci0JCQlteVR5cGUuZmlsZU5hbWUgPSAiYWJjLnR4dCI7Ci0JCQlteVR5cGUuZmlsZUxlbmd0aCA9IDEwMDA7Ci0JCQlteVR5cGUubGFzdE1vZGlmaWVkID0gMTIzMTIzMTM7Ci0JCQlteVR5cGUudmVyc2lvbiA9ICJ2ZXJzaW9uIDIiOwotCQkJZXZlbnQuZGF0YSA9IG15VHlwZTsKLQkJfQotCX0pOwotCURyb3BUYXJnZXQgdGFyZ2V0TXlUeXBlID0gbmV3IERyb3BUYXJnZXQobGFiZWwyLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfREVGQVVMVCk7Ci0JdGFyZ2V0TXlUeXBlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgTXlUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCXRhcmdldE15VHlwZS5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgIT0gbnVsbCkgewotCQkJCU15VHlwZSBteVR5cGUgPSAoTXlUeXBlKSBldmVudC5kYXRhOwotCQkJCWlmIChteVR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3RyaW5nID0gIk15VHlwZTogIiArIG15VHlwZS5maWxlTmFtZTsKLQkJCQkJbGFiZWwyLnNldFRleHQoc3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0pOwotCURyb3BUYXJnZXQgdGFyZ2V0TXlUeXBlMiA9IG5ldyBEcm9wVGFyZ2V0KGxhYmVsMywgRE5ELkRST1BfQ09QWQl8IERORC5EUk9QX0RFRkFVTFQpOwotCXRhcmdldE15VHlwZTIuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBNeVRyYW5zZmVyMi5nZXRJbnN0YW5jZSgpIH0pOwotCXRhcmdldE15VHlwZTIuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhICE9IG51bGwpIHsKLQkJCQlNeVR5cGUyIG15VHlwZSA9IChNeVR5cGUyKSBldmVudC5kYXRhOwotCQkJCWlmIChteVR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3RyaW5nID0gIk15VHlwZTI6ICIgKyBteVR5cGUuZmlsZU5hbWUgKyAiOiIKLQkJCQkJCQkrIG15VHlwZS52ZXJzaW9uOwotCQkJCQlsYWJlbDMuc2V0VGV4dChzdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzFlZmY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHcmlkTGF5b3V0IHNuaXBwZXQ6IGFsaWduIHdpZGdldHMgaW4gYSBHcmlkTGF5b3V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkxFRlQsIFRPUCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5UT1AsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTEVGVCwgQ0VOVEVSIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJMRUZULCBCT1RUT00iKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkxFRlQsIEZJTEwiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIFRPUCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULlRPUCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIENFTlRFUiIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIEJPVFRPTSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkJPVFRPTSwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIEZJTEwiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlJJR0hULCBUT1AiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULlRPUCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJSSUdIVCwgQ0VOVEVSIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUklHSFQsIEJPVFRPTSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlJJR0hULCBGSUxMIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkZJTEwsIFRPUCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiRklMTCwgQ0VOVEVSIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJGSUxMLCBCT1RUT00iKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkZJTEwsIEZJTEwiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTczLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTczLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOGM1OTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIHNuaXBwZXQ6IGJyaW5nIHVwIGEgYnJvd3NlciB3aXRoIHBvcC11cCBibG9ja2VyCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTczIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiBXaW5kb3ciKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgQnJvd3NlciBicm93c2VyOwotCXRyeSB7Ci0JCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybjsKLQl9Ci0JaW5pdGlhbGl6ZShkaXNwbGF5LCBicm93c2VyKTsKLQlzaGVsbC5vcGVuKCk7Ci0JLyogYW55IHdlYnNpdGUgd2l0aCBwb3B1cHMgKi8KLQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5jbm4uY29tIik7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotLyogcmVnaXN0ZXIgV2luZG93RXZlbnQgbGlzdGVuZXJzICovCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgQnJvd3NlciBicm93c2VyKSB7Ci0JYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQlzaGVsbC5zZXRUZXh0KCJOZXcgV2luZG93Iik7Ci0JCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQkJaW5pdGlhbGl6ZShkaXNwbGF5LCBicm93c2VyKTsKLQkJCWV2ZW50LmJyb3dzZXIgPSBicm93c2VyOwotCQl9Ci0JfSk7Ci0JYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCS8qIHBvcHVwIGJsb2NrZXIgLSBpZ25vcmUgd2luZG93cyB3aXRoIG5vIHN0eWxlICovCi0JCQlpZiAoIWV2ZW50LmFkZHJlc3NCYXIgJiYgIWV2ZW50Lm1lbnVCYXIgJiYgIWV2ZW50LnN0YXR1c0JhciAmJiAhZXZlbnQudG9vbEJhcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUG9wdXAgYmxvY2tlZC4iKTsKLQkJCQlldmVudC5kaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoZXZlbnQubG9jYXRpb24gIT0gbnVsbCkgc2hlbGwuc2V0TG9jYXRpb24oZXZlbnQubG9jYXRpb24pOwotCQkJaWYgKGV2ZW50LnNpemUgIT0gbnVsbCkgewotCQkJCVBvaW50IHNpemUgPSBldmVudC5zaXplOwotCQkJCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpKTsKLQkJCX0KLQkJCXNoZWxsLm9wZW4oKTsKLQkJfQotCX0pOwotCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlZDJmNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNlYmFzdGlhbiBEYXZpZHMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIE9wZW5HTCBzbmlwcGV0OiBkcmF3IGEgc3F1YXJlCi0gKiAKLSAqIFRoaXMgc25pcHBldCByZXF1aXJlcyB0aGUgZXhwZXJpbWVudGFsIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wgcGx1Z2luLCB3aGljaAotICogaXMgbm90IGluY2x1ZGVkIGluIFNXVCBieSBkZWZhdWx0IGFuZCBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggdmVyc2lvbnMgb2YKLSAqIFNXVCBwcmlvciB0byAzLjIuICBGb3IgaW5mb3JtYXRpb24gb24gdXNpbmcgT3BlbkdMIGluIFNXVCBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L29wZW5nbC8gLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgc2hlbGwuc2V0VGV4dCgiT3BlbkdMIGluIFNXVCIpOwotICAgIHNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICBHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEoKTsKLSAgICBkYXRhLmRvdWJsZUJ1ZmZlciA9IHRydWU7Ci0gICAgZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKHNoZWxsLCBTV1QuTk9fQkFDS0dST1VORCwgZGF0YSk7Ci0gICAgY2FudmFzLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICByZXNpemUoY2FudmFzKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIGluaXQoY2FudmFzKTsKLSAgICBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChjYW52YXMuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0gICAgICAgICAgICByZW5kZXIoKTsKLSAgICAgICAgICAgIGNhbnZhcy5zd2FwQnVmZmVycygpOwotICAgICAgICAgICAgY2FudmFzLmdldERpc3BsYXkoKS50aW1lckV4ZWMoNTAsIHRoaXMpOwotICAgICAgICB9Ci0gICAgfS5ydW4oKTsKLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBpbml0KEdMQ2FudmFzIGNhbnZhcykgewotICAgIGNhbnZhcy5zZXRDdXJyZW50KCk7Ci0gICAgcmVzaXplKGNhbnZhcyk7Ci0gICAgR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotICAgIEdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAwLjBmKTsKLSAgICBHTC5nbENsZWFyRGVwdGgoMS4wZik7Ci0gICAgR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0gICAgR0wuZ2xIaW50KEdMLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0wuR0xfTklDRVNUKTsKLX0KLQotc3RhdGljIHZvaWQgcmVuZGVyKCkgewotICAgIEdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotICAgIEdMLmdsTG9hZElkZW50aXR5KCk7Ci0gICAgR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC02LjBmKTsKLSAgICBHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLSAgICBHTC5nbFZlcnRleDNmKC0xLjBmLCAxLjBmLCAwLjBmKTsKLSAgICBHTC5nbFZlcnRleDNmKDEuMGYsIDEuMGYsIDAuMGYpOwotICAgIEdMLmdsVmVydGV4M2YoMS4wZiwgLTEuMGYsIDAuMGYpOwotICAgIEdMLmdsVmVydGV4M2YoLTEuMGYsIC0xLjBmLCAwLjBmKTsKLSAgICBHTC5nbEVuZCgpOwotfQotCi1zdGF0aWMgdm9pZCByZXNpemUoR0xDYW52YXMgY2FudmFzKSB7Ci0gICAgY2FudmFzLnNldEN1cnJlbnQoKTsKLSAgICBSZWN0YW5nbGUgcmVjdCA9IGNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0gICAgaW50IHdpZHRoID0gcmVjdC53aWR0aDsKLSAgICBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgocmVjdC5oZWlnaHQsIDEpOwotICAgIEdMLmdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX1BST0pFQ1RJT04pOwotICAgIEdMLmdsTG9hZElkZW50aXR5KCk7Ci0gICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KSB3aWR0aCAvIChmbG9hdCkgaGVpZ2h0OwotICAgIEdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgYXNwZWN0LCAwLjVmLCA0MDAuMGYpOwotICAgIEdMLmdsTWF0cml4TW9kZShHTC5HTF9NT0RFTFZJRVcpOwotICAgIEdMLmdsTG9hZElkZW50aXR5KCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZmM5NzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogRXhjbHVkZSBhIHdpZGdldCBmcm9tIGEgR3JpZExheW91dAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0KLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMCIpOwotCi0JZmluYWwgQnV0dG9uIGJIaWRkZW4gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYkhpZGRlbi5zZXRUZXh0KCJCdXR0b24gMSIpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlkYXRhLmV4Y2x1ZGUgPSB0cnVlOwotCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCWJIaWRkZW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMiIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMyIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gNCIpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJoaWRlIik7Ci0JYi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0JCQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKSBiSGlkZGVuLmdldExheW91dERhdGEoKTsKLQkJCWRhdGEuZXhjbHVkZSA9IGIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQliSGlkZGVuLnNldFZpc2libGUoIWRhdGEuZXhjbHVkZSk7Ci0JCQlzaGVsbC5sYXlvdXQoZmFsc2UpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYWY3NTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFJvd0xheW91dCBzbmlwcGV0OiBhbGlnbiB3aWRnZXRzIGluIGEgcm93Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3NiB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCk7Ci0JbGF5b3V0LndyYXAgPSB0cnVlOwotCWxheW91dC5maWxsID0gZmFsc2U7Ci0JbGF5b3V0Lmp1c3RpZnkgPSB0cnVlOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMSIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0KLQliLnNldFRleHQoIkJ1dHRvbiAyIik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDMiKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJOb3Qgc2hvd24iKTsKLQliLnNldFZpc2libGUoZmFsc2UpOwotCVJvd0RhdGEgZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5leGNsdWRlID0gdHJ1ZTsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDIwMCBoaWdoIik7Ci0JZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5oZWlnaHQgPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyMDAgd2lkZSIpOwotCWRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEud2lkdGggPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmE4ZWNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBSb3dMYXlvdXQgc25pcHBldDogYWxpZ24gd2lkZ2V0cyBpbiBhIGNvbHVtbgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpOwotCWxheW91dC53cmFwID0gdHJ1ZTsKLQlsYXlvdXQuZmlsbCA9IHRydWU7Ci0JbGF5b3V0Lmp1c3RpZnkgPSBmYWxzZTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDEiKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCi0JYi5zZXRUZXh0KCJCdXR0b24gMiIpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAzIik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTm90IHNob3duIik7Ci0JYi5zZXRWaXNpYmxlKGZhbHNlKTsKLQlSb3dEYXRhIGRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEuZXhjbHVkZSA9IHRydWU7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyMDAgaGlnaCIpOwotCWRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEuaGVpZ2h0ID0gMjAwOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMjAwIHdpZGUiKTsKLQlkYXRhID0gbmV3IFJvd0RhdGEoKTsKLQlkYXRhLndpZHRoID0gMjAwOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NTRiYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEhvdyB0byBhY2Nlc3MgQWJvdXQsIFByZWZlcmVuY2VzIGFuZCBRdWl0IG1lbnVzIG9uIGNhcmJvbi4KLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc4IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrSElDb21tYW5kUHJlZmVyZW5jZXMgPSAoJ3AnIDw8IDI0KSArICgncicgPDwgMTYpCi0JCQkrICgnZScgPDwgOCkgKyAnZic7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0hJQ29tbWFuZEFib3V0ID0gKCdhJyA8PCAyNCkgKyAoJ2InIDw8IDE2KQotCQkJKyAoJ28nIDw8IDgpICsgJ3UnOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtISUNvbW1hbmRTZXJ2aWNlcyA9ICgncycgPDwgMjQpICsgKCdlJyA8PCAxNikKLQkJCSsgKCdyJyA8PCA4KSArICd2JzsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJnKSB7Ci0JRGlzcGxheS5zZXRBcHBOYW1lKCJBcHBNZW51Iik7IC8vIHNldHMgbmFtZSBpbiBEb2NrCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlob29rQXBwbGljYXRpb25NZW51KGRpc3BsYXksICJBYm91dCBBcHBNZW51Iik7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiBXaW5kb3ciKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBob29rQXBwbGljYXRpb25NZW51KERpc3BsYXkgZGlzcGxheSwgZmluYWwgU3RyaW5nIGFib3V0TmFtZSkgewotCS8vIENhbGxiYWNrIHRhcmdldAotCU9iamVjdCB0YXJnZXQgPSBuZXcgT2JqZWN0KCkgewotCQlpbnQgY29tbWFuZFByb2MoaW50IG5leHRIYW5kbGVyLCBpbnQgdGhlRXZlbnQsIGludCB1c2VyRGF0YSkgewotCQkJaWYgKE9TLkdldEV2ZW50S2luZCh0aGVFdmVudCkgPT0gT1Mua0V2ZW50UHJvY2Vzc0NvbW1hbmQpIHsKLQkJCQlISUNvbW1hbmQgY29tbWFuZCA9IG5ldyBISUNvbW1hbmQoKTsKLQkJCQlPUy5HZXRFdmVudFBhcmFtZXRlcih0aGVFdmVudCwgT1Mua0V2ZW50UGFyYW1EaXJlY3RPYmplY3QsCi0JCQkJCQlPUy50eXBlSElDb21tYW5kLCBudWxsLCBISUNvbW1hbmQuc2l6ZW9mLCBudWxsLAotCQkJCQkJY29tbWFuZCk7Ci0JCQkJc3dpdGNoIChjb21tYW5kLmNvbW1hbmRJRCkgewotCQkJCWNhc2Uga0hJQ29tbWFuZFByZWZlcmVuY2VzOgotCQkJCQlyZXR1cm4gaGFuZGxlQ29tbWFuZCgiUHJlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2Uga0hJQ29tbWFuZEFib3V0OgotCQkJCQlyZXR1cm4gaGFuZGxlQ29tbWFuZChhYm91dE5hbWUpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBPUy5ldmVudE5vdEhhbmRsZWRFcnI7Ci0JCX0KLQotCQlpbnQgaGFuZGxlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCU1lc3NhZ2VCb3ggcHJlZmVyZW5jZXMgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fV0FSTklORyk7Ci0JCQlwcmVmZXJlbmNlcy5zZXRUZXh0KGNvbW1hbmQpOwotCQkJcHJlZmVyZW5jZXMub3BlbigpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJcmV0dXJuIE9TLm5vRXJyOwotCQl9Ci0JfTsKLQotCWZpbmFsIENhbGxiYWNrIGNvbW1hbmRDYWxsYmFjayA9IG5ldyBDYWxsYmFjayh0YXJnZXQsICJjb21tYW5kUHJvYyIsIDMpOyAvLyROT04tTkxTLTEkCi0JaW50IGNvbW1hbmRQcm9jID0gY29tbWFuZENhbGxiYWNrLmdldEFkZHJlc3MoKTsKLQlpZiAoY29tbWFuZFByb2MgPT0gMCkgewotCQljb21tYW5kQ2FsbGJhY2suZGlzcG9zZSgpOwotCQlyZXR1cm47IC8vIGdpdmUgdXAKLQl9Ci0KLQkvLyBJbnN0YWxsIGV2ZW50IGhhbmRsZXIgZm9yIGNvbW1hbmRzCi0JaW50W10gbWFzayA9IG5ldyBpbnRbXSB7IE9TLmtFdmVudENsYXNzQ29tbWFuZCwgT1Mua0V2ZW50UHJvY2Vzc0NvbW1hbmQgfTsKLQlPUy5JbnN0YWxsRXZlbnRIYW5kbGVyKE9TLkdldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQoKSwgY29tbWFuZFByb2MsCi0JCQltYXNrLmxlbmd0aCAvIDIsIG1hc2ssIDAsIG51bGwpOwotCi0JLy8gY3JlYXRlIEFib3V0IC4uLiBtZW51IGNvbW1hbmQKLQlpbnRbXSBvdXRNZW51ID0gbmV3IGludFsxXTsKLQlzaG9ydFtdIG91dEluZGV4ID0gbmV3IHNob3J0WzFdOwotCWlmIChPUy5HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoMCwga0hJQ29tbWFuZFByZWZlcmVuY2VzLCAxLAotCQkJb3V0TWVudSwgb3V0SW5kZXgpID09IE9TLm5vRXJyCi0JCQkmJiBvdXRNZW51WzBdICE9IDApIHsKLQkJaW50IG1lbnUgPSBvdXRNZW51WzBdOwotCi0JCWludCBsID0gYWJvdXROYW1lLmxlbmd0aCgpOwotCQljaGFyIGJ1ZmZlcltdID0gbmV3IGNoYXJbbF07Ci0JCWFib3V0TmFtZS5nZXRDaGFycygwLCBsLCBidWZmZXIsIDApOwotCQlpbnQgc3RyID0gT1MuQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyhPUy5rQ0ZBbGxvY2F0b3JEZWZhdWx0LAotCQkJCWJ1ZmZlciwgbCk7Ci0JCU9TLkluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhtZW51LCBzdHIsIChzaG9ydCkgMCwgMCwKLQkJCQlrSElDb21tYW5kQWJvdXQpOwotCQlPUy5DRlJlbGVhc2Uoc3RyKTsKLQotCQkvLyBhZGQgc2VwYXJhdG9yIGJldHdlZW4gQWJvdXQgJiBQcmVmZXJlbmNlcwotCQlPUy5JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcobWVudSwgMCwgKHNob3J0KSAxLAotCQkJCU9TLmtNZW51SXRlbUF0dHJTZXBhcmF0b3IsIDApOwotCi0JCS8vIGVuYWJsZSBwcmVmIG1lbnUKLQkJT1MuRW5hYmxlTWVudUNvbW1hbmQobWVudSwga0hJQ29tbWFuZFByZWZlcmVuY2VzKTsKLQotCQkvLyBkaXNhYmxlIHNlcnZpY2VzIG1lbnUKLQkJT1MuRGlzYWJsZU1lbnVDb21tYW5kKG1lbnUsIGtISUNvbW1hbmRTZXJ2aWNlcyk7Ci0JfQotCi0JLy8gc2NoZWR1bGUgZGlzcG9zYWwgb2YgY2FsbGJhY2sgb2JqZWN0Ci0JZGlzcGxheS5kaXNwb3NlRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWNvbW1hbmRDYWxsYmFjay5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4MDVmOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiB2ZXJpZnkgaW5wdXQgKGZvcm1hdCBmb3IgZGF0ZSkKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQoIllZWVkvTU0vREQiKTs7CQotCWZpbmFsIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5WZXJpZnksIG5ldyBMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBpZ25vcmU7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChpZ25vcmUpIHJldHVybjsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZS50ZXh0KTsKLQkJCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2J1ZmZlci5sZW5ndGgoKV07Ci0JCQlidWZmZXIuZ2V0Q2hhcnMoMCwgY2hhcnMubGVuZ3RoLCBjaGFycywgMCk7Ci0JCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xiJykgewotCQkJCWZvciAoaW50IGkgPSBlLnN0YXJ0OyBpIDwgZS5lbmQ7IGkrKykgewotCQkJCQlzd2l0Y2ggKGkpIHsKLQkJCQkJCWNhc2UgMDogLyogW1ldWVlZICovCi0JCQkJCQljYXNlIDE6IC8qIFlbWV1ZWSAqLwotCQkJCQkJY2FzZSAyOiAvKiBZWVtZXVkgKi8KLQkJCQkJCWNhc2UgMzogLyogWVlZW1ldICovIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCdZJyk7IAlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgNTogLyogW01dTSovCi0JCQkJCQljYXNlIDY6IC8qIE1bTV0gKi97Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnTScpOyBicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgODogLyogW0RdRCAqLwotCQkJCQkJY2FzZSA5OiAvKiBEW0RdICovIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCdEJyk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSA0OiAvKiBZWVlZWy9dTU0gKi8KLQkJCQkJCWNhc2UgNzogLyogTU1bL11ERCAqLyB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnLycpOyBicmVhazsKLQkJCQkJCX0KLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQgKyBidWZmZXIubGVuZ3RoKCkpOwotCQkJCWlnbm9yZSA9IHRydWU7Ci0JCQkJdGV4dC5pbnNlcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCi0JCQlpbnQgc3RhcnQgPSBlLnN0YXJ0OwotCQkJaWYgKHN0YXJ0ID4gOSkgcmV0dXJuOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc3RhcnQgKyBpbmRleCA9PSA0IHx8IHN0YXJ0ICsgaW5kZXggPT0gNykgewotCQkJCQlpZiAoY2hhcnNbaV0gPT0gJy8nKSB7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmZmVyLmluc2VydChpbmRleCsrLCAnLycpOwotCQkJCX0KLQkJCQlpZiAoY2hhcnNbaV0gPCAnMCcgfHwgJzknIDwgY2hhcnNbaV0pIHJldHVybjsKLQkJCQlpZiAoc3RhcnQgKyBpbmRleCA9PSA1ICYmICAnMScgPCBjaGFyc1tpXSkgcmV0dXJuOyAvKiBbTV1NICovCi0JCQkJaWYgKHN0YXJ0ICsgaW5kZXggPT0gOCAmJiAgJzMnIDwgY2hhcnNbaV0pIHJldHVybjsgLyogW0RdRCAqLwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3VGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJaW50IGxlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgZGF0ZSA9IG5ldyBTdHJpbmdCdWZmZXIodGV4dC5nZXRUZXh0KCkpOwotCQkJZGF0ZS5yZXBsYWNlKGUuc3RhcnQsIGUuc3RhcnQgKyBsZW5ndGgsIG5ld1RleHQpOwotCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIDE5MDEpOwotCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLk1PTlRILCBDYWxlbmRhci5KQU5VQVJZKTsKLQkJCWNhbGVuZGFyLnNldChDYWxlbmRhci5EQVRFLCAxKTsKLQkJCVN0cmluZyB5eXl5ID0gZGF0ZS5zdWJzdHJpbmcoMCwgNCk7Ci0JCQlpZiAoeXl5eS5pbmRleE9mKCdZJykgPT0gLTEpIHsKLQkJCQlpbnQgeWVhciA9IEludGVnZXIucGFyc2VJbnQoeXl5eSk7Ci0JCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIHllYXIpOwotCQkJfQotCQkJU3RyaW5nIG1tID0gZGF0ZS5zdWJzdHJpbmcoNSwgNyk7Ci0JCQlpZiAobW0uaW5kZXhPZignTScpID09IC0xKSB7Ci0JCQkJaW50IG1vbnRoID0gIEludGVnZXIucGFyc2VJbnQobW0pIC0gMTsKLQkJCQlpbnQgbWF4TW9udGggPSBjYWxlbmRhci5nZXRBY3R1YWxNYXhpbXVtKENhbGVuZGFyLk1PTlRIKTsKLQkJCQlpZiAoMCA+IG1vbnRoIHx8IG1vbnRoID4gbWF4TW9udGgpIHJldHVybjsKLQkJCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuTU9OVEgsIG1vbnRoKTsKLQkJCX0KLQkJCVN0cmluZyBkZCA9IGRhdGUuc3Vic3RyaW5nKDgsMTApOwotCQkJaWYgKGRkLmluZGV4T2YoJ0QnKSA9PSAtMSkgewotCQkJCWludCBkYXkgPSBJbnRlZ2VyLnBhcnNlSW50KGRkKTsKLQkJCQlpbnQgbWF4RGF5ID0gY2FsZW5kYXIuZ2V0QWN0dWFsTWF4aW11bShDYWxlbmRhci5EQVRFKTsKLQkJCQlpZiAoMSA+IGRheSB8fCBkYXkgPiBtYXhEYXkpIHJldHVybjsKLQkJCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuREFURSwgZGF5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCkgID09IENhbGVuZGFyLkZFQlJVQVJZKSB7Ci0JCQkJCWNoYXIgZmlyc3RDaGFyID0gZGF0ZS5jaGFyQXQoOCk7Ci0JCQkJCWlmIChmaXJzdENoYXIgIT0gJ0QnICYmICcyJyA8IGZpcnN0Q2hhcikgcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQgKyBsZW5ndGgpOwotCQkJaWdub3JlID0gdHJ1ZTsKLQkJCXRleHQuaW5zZXJ0KG5ld1RleHQpOwotCQkJaWdub3JlID0gZmFsc2U7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhiZmI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0b29sIGJhciAodGV4dCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsICgpOwotCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JYmFyLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5ICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0gCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTRhMzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIG5vbi1yZWN0YW5ndWxhciBzaGVsbCB0byBzaW11bGF0ZSB0cmFuc3BhcmVuY3kKLSAqIChFU0MgdG8gY2xvc2Ugc2hlbGwpCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIEltYWdlIGltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLQkvL1NoZWxsIG11c3QgYmUgY3JlYXRlZCB3aXRoIHN0eWxlIFNXVC5OT19UUklNCi0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULk5PX1RSSU0gfCBTV1QuT05fVE9QKTsKLQlzaGVsbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCS8vZGVmaW5lIGEgcmVnaW9uIAotCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0JUmVjdGFuZ2xlIHBpeGVsID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxLCAxKTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IDIwMDsgeSs9MikgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCAyMDA7IHgrPTIpIHsKLQkJCQlwaXhlbC54ID0geDsKLQkJCQlwaXhlbC55ID0geTsKLQkJCQlyZWdpb24uYWRkKHBpeGVsKTsKLQkJCX0KLQkJfQotCS8vZGVmaW5lIHRoZSBzaGFwZSBvZiB0aGUgc2hlbGwgdXNpbmcgc2V0UmVnaW9uCi0Jc2hlbGwuc2V0UmVnaW9uKHJlZ2lvbik7Ci0JUmVjdGFuZ2xlIHNpemUgPSByZWdpb24uZ2V0Qm91bmRzKCk7Ci0Jc2hlbGwuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCk7Ci0Jc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJUG9pbnQgc2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQsIDEwLCAxMCwgc2l6ZS54LTIwLCBzaXplLnktMjApOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULktleURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgIHsKLQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JcmVnaW9uLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjYTc5Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQWxsb3cgdXNlciB0byByZW9yZGVyIGNvbHVtbnMgYnkgZHJhZ2dpbmcgb3IgcHJvZ3JhbW1hdGljYWxseS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgxIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0JCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgUm93RGF0YSgtMSwgMzAwKSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDAiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAxIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDMiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiA0Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJU3RyaW5nW10gdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyIgMCIsIGkrIiAxIiwgaSsiIDIiLCBpKyIgMyIsIGkrIiA0In07Ci0JCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCX0KLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3ZlICIrZS53aWRnZXQpOwotCQkJfQotCQl9OwotCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uc1tpXS5wYWNrKCk7Ci0JCQljb2x1bW5zW2ldLnNldE1vdmVhYmxlKHRydWUpOwotCQkJY29sdW1uc1tpXS5hZGRMaXN0ZW5lcihTV1QuTW92ZSwgbGlzdGVuZXIpOwotCQl9Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQliLnNldFRleHQoImludmVydCBjb2x1bW4gb3JkZXIiKTsKLQkJYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaW50W10gb3JkZXIgPSB0YWJsZS5nZXRDb2x1bW5PcmRlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoIC8gMjsgaSsrKSB7Ci0JCQkJCWludCB0ZW1wID0gb3JkZXJbaV07Ci0JCQkJCW9yZGVyW2ldID0gb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdOwotCQkJCQlvcmRlcltvcmRlci5sZW5ndGggLSBpIC0gMV0gPSB0ZW1wOwotCQkJCX0KLQkJCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihvcmRlcik7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzEwZjIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaW5rIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbGluayB3aWRnZXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODIgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJTGluayBsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlsaW5rLnNldFRleHQoIlRoaXMgYSB2ZXJ5IHNpbXBsZSA8QT5saW5rPC9BPiB3aWRnZXQuIik7Ci0JCWxpbmsuc2V0U2l6ZSgxNDAsIDQwKTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGM1YTFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaW5rIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IHNlbGVjdGlvbiBldmVudHMgaW4gYSBsaW5rIHdpZGdldAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgzIHsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULk5PTkUpOwotCQlTdHJpbmcgdGV4dCA9ICJUaGUgU1dUIGNvbXBvbmVudCBpcyBkZXNpZ25lZCB0byBwcm92aWRlIDxhPmVmZmljaWVudDwvYT4sIDxhPnBvcnRhYmxlPC9hPiA8YSBocmVmPVwibmF0aXZlXCI+YWNjZXNzIHRvIHRoZSB1c2VyLWludGVyZmFjZSBmYWNpbGl0aWVzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtczwvYT4gb24gd2hpY2ggaXQgaXMgaW1wbGVtZW50ZWQuIjsKLQkJbGluay5zZXRUZXh0KHRleHQpOwotCQlsaW5rLnNldFNpemUoNDAwLCA0MDApOwotCQlsaW5rLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlbGVjdGlvbjogIiArIGV2ZW50LnRleHQpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzE4OTVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTcGlubmVyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGFuZCBpbml0aWFsaXplIGEgc3Bpbm5lciB3aWRnZXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODQgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJc3Bpbm5lci5zZXRNaW5pbXVtKDApOwotCQlzcGlubmVyLnNldE1heGltdW0oMTAwMCk7Ci0JCXNwaW5uZXIuc2V0U2VsZWN0aW9uKDUwMCk7Ci0JCXNwaW5uZXIuc2V0SW5jcmVtZW50KDEpOwotCQlzcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQoMTAwKTsKLQkJc3Bpbm5lci5wYWNrKCk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRkN2M3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWFrZSBhIGRyb3BwZWQgZGF0YSB0eXBlIGRlcGVuZCBvbiBhIHRhcmdldCBpdGVtIGluIHRhYmxlCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsMS5zZXRUZXh0KCJEcmFnIFNvdXJjZSIpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaWYgKGkgJSAyID09IDApIGl0ZW0uc2V0VGV4dCgiRHJvcCBhIGZpbGUiKTsKLQkJaWYgKGkgJSAyID09IDEpIGl0ZW0uc2V0VGV4dCgiRHJvcCB0ZXh0Iik7Ci0JfQotCURyYWdTb3VyY2UgZHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKGxhYmVsMSwgRE5ELkRST1BfQ09QWSk7Ci0JZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCksIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JZHJhZ1NvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoInRlbXAiKTsKLQkJCQlldmVudC5kYXRhID0gbmV3IFN0cmluZ1tdIHtmaWxlLmdldEFic29sdXRlUGF0aCgpfTsKLQkJCX0KLQkJCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9ICJvbmNlIHVwb24gYSB0aW1lIjsKLQkJCX0KLQkJfSAKLQl9KTsKLQlEcm9wVGFyZ2V0IGRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0YWJsZSwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQpOwotCWRyb3BUYXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJRmlsZVRyYW5zZmVyIGZpbGVUcmFuc2ZlciA9IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQlUZXh0VHJhbnNmZXIgdGV4dFRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCWludCBpdGVtSW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJaWYgKGl0ZW1JbmRleCAlIDIgPT0gMCkgewotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJd2hpbGUgKGluZGV4IDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aCkgewotCQkJCQlpZiAoZmlsZVRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZXNbaW5kZXhdKSkgYnJlYWs7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJCWlmIChpbmRleCA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGgpIHsKLQkJCQkJZXZlbnQuY3VycmVudERhdGFUeXBlID0gZXZlbnQuZGF0YVR5cGVzW2luZGV4XTsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQl3aGlsZSAoaW5kZXggPCBldmVudC5kYXRhVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0ZXh0VHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlc1tpbmRleF0pKSBicmVhazsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQkJaWYgKGluZGV4IDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aCkgewotCQkJCQlldmVudC5jdXJyZW50RGF0YVR5cGUgPSBldmVudC5kYXRhVHlwZXNbaW5kZXhdOwotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGZpbGVUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotCQkJCVN0cmluZ1tdIGZpbGVzID0gKFN0cmluZ1tdKWV2ZW50LmRhdGE7Ci0JCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQlpdGVtLnNldFRleHQoZmlsZXNbMF0pOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0ZXh0VHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpZXZlbnQuZGF0YTsKLQkJCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDE1MCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmODgwMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08SFRNTD4KLSAgPEhFQUQ+Ci0gICAgPFRJVExFPlBvc3Q8L1RJVExFPgotCTxwPlRlc3QgZm9yIFBvc3RpbmcgRGF0YSBpbiBJRTwvcD4KLQotICA8L0hFQUQ+Ci0KLSAgPEJPRFk+Ci0gICAgPEZPUk0gTUVUSE9EPSJwb3N0IgotICAgICAgIEFDVElPTj0iaHR0cDovL2hvc3QvY2dpLWJpbi9tYXNfZm9ybSI+Ci0gICAgPElOUFVUIFRZUEU9InRleHQiIE5BTUU9Im5hbWUiCi0gICAgICAgU0laRT0yMCBWQUxVRT0iVHJ5IGl0IChwb3N0KSI+Ci0gPC9GT1JNPgotIAotICA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMmYyM2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBSZWFkaW5nIGFuZCB3cml0aW5nIHRvIGEgU0FGRUFSUkFZCi0gKiAKLSAqIFRoaXMgZXhhbXBsZSByZWFkcyBmcm9tIGEgUG9zdERhdGEgb2JqZWN0IGluIGEgQmVmb3JlTmF2aWdhdGUyIGV2ZW50IGFuZAotICogY3JlYXRlcyBhIFBvc3REYXRhIG9iamVjdCBpbiBhIGNhbGwgdG8gTmF2aWdhdGUgKDMyLWJpdCB3aW4zMiBvbmx5KS4KLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg2IHsKLQotc3RhdGljIGludCBDb2RlUGFnZSA9IE9TLkdldEFDUCgpOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAxLCAxKSk7Ci0JQnV0dG9uIGdvID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWdvLnNldFRleHQoIkdvIik7Ci0JT2xlRnJhbWUgb2xlRnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQlvbGVGcmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQlPbGVDb250cm9sU2l0ZSBjb250cm9sU2l0ZTsKLQlPbGVBdXRvbWF0aW9uIGF1dG9tYXRpb247Ci0JdHJ5IHsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJYXV0b21hdGlvbiA9IG5ldyBPbGVBdXRvbWF0aW9uKGNvbnRyb2xTaXRlKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlmaW5hbCBPbGVBdXRvbWF0aW9uIGF1dG8gPSBhdXRvbWF0aW9uOwotCWdvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJU3RyaW5nIHVybCA9IHRleHQuZ2V0VGV4dCgpOwotCQkJaW50W10gcmdkaXNwaWQgPSBhdXRvLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSIsICJVUkwifSk7IAotCQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQkJVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50WzFdOwotCQkJcmd2YXJnWzBdID0gbmV3IFZhcmlhbnQodXJsKTsKLQkJCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFsxXTsKLQkJCXJnZGlzcGlkTmFtZWRBcmdzWzBdID0gcmdkaXNwaWRbMV07Ci0JCQlhdXRvLmludm9rZShkaXNwSWRNZW1iZXIsIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCQl9Ci0JfSk7Ci0JCi0JCi0JLy8gUmVhZCBQb3N0RGF0YSB3aGVuZXZlciB3ZSBuYXZpZ2F0ZSB0byBhIHNpdGUgdGhhdCB1c2VzIGl0Ci0JaW50IEJlZm9yZU5hdmlnYXRlMiA9IDB4ZmE7Ci0JY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihCZWZvcmVOYXZpZ2F0ZTIsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCVZhcmlhbnQgdXJsID0gZXZlbnQuYXJndW1lbnRzWzFdOwotCQkJVmFyaWFudCBwb3N0RGF0YSA9IGV2ZW50LmFyZ3VtZW50c1s0XTsKLQkJCWlmIChwb3N0RGF0YSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQb3N0RGF0YSA9ICIrcmVhZFNhZmVBcnJheShwb3N0RGF0YSkrIiwgVVJMID0gIit1cmwuZ2V0U3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy8gTmF2aWdhdGUgdG8gdGhpcyB3ZWIgc2l0ZSB3aGljaCB1c2VzIHBvc3QgZGF0YSB0byBmaWxsIGluIHRoZSB0ZXh0IGZpZWxkCi0JLy8gYW5kIHB1dCB0aGUgc3RyaW5nICJoZWxsbyB3b3JsZCIgaW50byB0aGUgdGV4dCBib3gKLQl0ZXh0LnNldFRleHQoImZpbGU6Ly8iK1NuaXBwZXQxODYuY2xhc3MuZ2V0UmVzb3VyY2UoIlNuaXBwZXQxODYuaHRtbCIpLmdldEZpbGUoKSk7Ci0JaW50W10gcmdkaXNwaWQgPSBhdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSIsICJVUkwiLCAiUG9zdERhdGEifSk7IAotCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsJCi0JVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50WzJdOwotCXJndmFyZ1swXSA9IG5ldyBWYXJpYW50KHRleHQuZ2V0VGV4dCgpKTsKLQlyZ3ZhcmdbMV0gPSB3cml0ZVNhZmVBcnJheSgiaGVsbG8gd29ybGQiKTsKLQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbMl07Ci0JcmdkaXNwaWROYW1lZEFyZ3NbMF0gPSByZ2Rpc3BpZFsxXTsKLQlyZ2Rpc3BpZE5hbWVkQXJnc1sxXSA9IHJnZGlzcGlkWzJdOwotCWF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlciwgcmd2YXJnLCByZ2Rpc3BpZE5hbWVkQXJncyk7Ci0JCQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyBzdHJ1Y3RzIGFyZSBhY2Nlc3NlZCBpbiB0aGUgcmVhZFNhZmVBcnJheSBhbmQgd3JpdGVTYWZlQXJyYXkKLS8vIGZ1bmN0aW9uczoKLS8vCi0vLyBWQVJJQU5UOgotLy8gCQlzaG9ydCB2dAotLy8gCQlzaG9ydCB3UmVzZXJ2ZWQxCi0vLyAJCXNob3J0IHdSZXNlcnZlZDIKLS8vIAkJc2hvcnQgd1Jlc2VydmVkMwotLy8gCQlpbnQgcGFycmF5Ci0vLwotLy8gU0FGRUFSUkFZOgotLy8gICAgICBzaG9ydCBjRGltcyAgICAgIC8vIENvdW50IG9mIGRpbWVuc2lvbnMgaW4gdGhpcyBhcnJheQotLy8gICAgICBzaG9ydCBmRmVhdHVyZXMgIC8vIEZsYWdzIHVzZWQgYnkgdGhlIFNhZmVBcnJheQotLy8gICAgICBpbnQgY2JFbGVtZW50cyAgIC8vIFNpemUgb2YgYW4gZWxlbWVudCBvZiB0aGUgYXJyYXkKLS8vICAgICAgaW50IGNMb2NrcyAgICAgICAvLyBOdW1iZXIgb2YgdGltZXMgdGhlIGFycmF5IGhhcyBiZWVuIGxvY2tlZCB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdW5sb2NrCi0vLyAgICAgIGludCBwdkRhdGEgICAgICAgLy8gUG9pbnRlciB0byB0aGUgZGF0YQotLy8gICAgICBTQUZFQVJSQVlCT1VORFtdIHJnc2Fib3VuZCAvLyBPbmUgYm91bmQgZm9yIGVhY2ggZGltZW5zaW9uCi0vLwotLy8gU0FGRUFSUkFZQk9VTkQ6Ci0vLyAgICAgIGludCBjRWxlbWVudHMgICAgLy8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZGltZW5zaW9uCi0vLyAgICAgIGludCBsTGJvdW5kICAgICAgLy8gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBkaW1lbnNpb24gCi0KLXN0YXRpYyBTdHJpbmcgcmVhZFNhZmVBcnJheShWYXJpYW50IHZhcmlhbnRCeVJlZikgewotCS8vIFJlYWQgYSBzYWZlYXJyYXkgdGhhdCBjb250YWlucyBkYXRhIG9mIAotCS8vIHR5cGUgVlRfVUkxICh1bnNpZ25lZCBzaG9ydHMpIHdoaWNoIGNvbnRhaW5zCi0JLy8gYSB0ZXh0IHN0cmVhbS4KLSAgICBpbnQgcFBvc3REYXRhID0gdmFyaWFudEJ5UmVmLmdldEJ5UmVmKCk7Ci0gICAgc2hvcnRbXSB2dF90eXBlID0gbmV3IHNob3J0WzFdOwotICAgIE9TLk1vdmVNZW1vcnkodnRfdHlwZSwgcFBvc3REYXRhLCAyKTsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAodnRfdHlwZVswXSA9PSAoc2hvcnQpKE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9WQVJJQU5UKSkgewotICAgICAgICBpbnRbXSBwVmFyaWFudCA9IG5ldyBpbnRbMV07Ci0gICAgICAgIE9TLk1vdmVNZW1vcnkocFZhcmlhbnQsIHBQb3N0RGF0YSArIDgsIDQpOwotICAgICAgICB2dF90eXBlID0gbmV3IHNob3J0WzFdOwotICAgICAgICBPUy5Nb3ZlTWVtb3J5KHZ0X3R5cGUsIHBWYXJpYW50WzBdLCAyKTsKLSAgICAgICAgaWYgKHZ0X3R5cGVbMF0gPT0gKHNob3J0KShPTEUuVlRfQVJSQVkgfCBPTEUuVlRfVUkxKSkgewotICAgICAgICAgICAgaW50W10gcFNhZmVhcnJheSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBTYWZlYXJyYXksIHBWYXJpYW50WzBdICsgOCwgNCk7Ci0gICAgICAgICAgICBzaG9ydFtdIGNEaW1zID0gbmV3IHNob3J0WzFdOwotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShjRGltcywgcFNhZmVhcnJheVswXSwgMik7Ci0gICAgICAgICAgICBpbnRbXSBwdkRhdGEgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwdkRhdGEsIHBTYWZlYXJyYXlbMF0gKyAxMiwgNCk7Ci0gICAgICAgICAgICBpbnQgc2FmZWFycmF5Ym91bmRPZmZzZXQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjRGltc1swXTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50W10gY0VsZW1lbnRzID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KGNFbGVtZW50cywgcFNhZmVhcnJheVswXSArIDE2ICsgc2FmZWFycmF5Ym91bmRPZmZzZXQsIDQpOwotICAgICAgICAgICAgICAgIHNhZmVhcnJheWJvdW5kT2Zmc2V0ICs9IDg7Ci0gICAgICAgICAgICAgICAgaW50IGNjaFdpZGVDaGFyID0gT1MuTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ29kZVBhZ2UsIE9TLk1CX1BSRUNPTVBPU0VELCAgcHZEYXRhWzBdLCAtMSwgbnVsbCwgMCk7Ci0JCQkJaWYgKGNjaFdpZGVDaGFyID09IDApIHJldHVybiBudWxsOwotCQkJCWNoYXJbXSBscFdpZGVDaGFyU3RyID0gbmV3IGNoYXIgW2NjaFdpZGVDaGFyIC0gMV07Ci0JCQkJT1MuTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ29kZVBhZ2UsIE9TLk1CX1BSRUNPTVBPU0VELCAgcHZEYXRhWzBdLCAtMSwgbHBXaWRlQ2hhclN0ciwgbHBXaWRlQ2hhclN0ci5sZW5ndGgpOwotCQkJCXJlc3VsdCA9IG5ldyBTdHJpbmcobHBXaWRlQ2hhclN0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIFZhcmlhbnQgd3JpdGVTYWZlQXJyYXkgKFN0cmluZyBzdHJpbmcpIHsKLQkvLyBDcmVhdGUgYSBvbmUgZGltZW5zaW9uYWwgc2FmZWFycmF5IGNvbnRhaW5pbmcgdHdvIFZUX1VJMSB2YWx1ZXMKLQkvLyB3aGVyZSBWVF9VSTEgaXMgYW4gdW5zaWduZWQgY2hhcgotCQotCS8vIERlZmluZSBjRGltcywgZkZlYXR1cmVzIGFuZCBjYkVsZW1lbnRzCi0Jc2hvcnQgY0RpbXMgPSAxOwotCXNob3J0IEZBREZfRklYRURTSVpFID0gMHgxMDsKLQlzaG9ydCBGQURGX0hBVkVWQVJUWVBFID0gMHg4MDsKLQlzaG9ydCBmRmVhdHVyZXMgPSAoc2hvcnQpKEZBREZfRklYRURTSVpFIHwgRkFERl9IQVZFVkFSVFlQRSk7Ci0JaW50IGNiRWxlbWVudHMgPSAxOwotCS8vIENyZWF0ZSBhIHBvaW50ZXIgYW5kIGNvcHkgdGhlIGRhdGEgaW50byBpdAotCWludCBjb3VudCA9IHN0cmluZy5sZW5ndGgoKTsKLQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltjb3VudCArIDFdOwotCXN0cmluZy5nZXRDaGFycygwLCBjb3VudCwgY2hhcnMsIDApOwotCWludCBjY2hNdWx0aUJ5dGUgPSBPUy5XaWRlQ2hhclRvTXVsdGlCeXRlKENvZGVQYWdlLCAwLCBjaGFycywgLTEsIG51bGwsIDAsIG51bGwsIG51bGwpOwotCWlmIChjY2hNdWx0aUJ5dGUgPT0gMCkgcmV0dXJuIG51bGw7Ci0JaW50IHB2RGF0YSA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBjY2hNdWx0aUJ5dGUpOwotCU9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoQ29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgcHZEYXRhLCBjY2hNdWx0aUJ5dGUsIG51bGwsIG51bGwpOwotCWludCBjRWxlbWVudHMxID0gY2NoTXVsdGlCeXRlOwotCWludCBsTGJvdW5kMSA9IDA7Ci0JLy8gQ3JlYXRlIGEgc2FmZWFycmF5IGluIG1lbW9yeQotCS8vIDEyIGJ5dGVzIGZvciBjRGltcywgZkZlYXR1cmVzIGFuZCBjYkVsZW1lbnRzICsgNCBieXRlcyBmb3IgcHZEYXRhICsgbnVtYmVyIG9mIGRpbWVuc2lvbnMgKiAoc2l6ZSBvZiBzYWZlYXJyYXlib3VuZCkKLQlpbnQgc2l6ZW9mU2FmZUFycmF5ID0gMTIgKyA0ICsgMSo4OwotCWludCBwU2FmZUFycmF5ID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIHNpemVvZlNhZmVBcnJheSk7Ci0JLy8gQ29weSB0aGUgZGF0YSBpbnRvIHRoZSBzYWZlIGFycmF5Ci0JaW50IG9mZnNldCA9IDA7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgc2hvcnRbXSB7Y0RpbXN9LCAyKTsgb2Zmc2V0ICs9IDI7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgc2hvcnRbXSB7ZkZlYXR1cmVzfSwgMik7IG9mZnNldCArPSAyOwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHtjYkVsZW1lbnRzfSwgNCk7IG9mZnNldCArPSA0OwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHswfSwgNCk7IG9mZnNldCArPSA0OwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHtwdkRhdGF9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10ge2NFbGVtZW50czF9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10ge2xMYm91bmQxfSwgNCk7IG9mZnNldCArPSA0OwotCS8vIENyZWF0ZSBhIHZhcmlhbnQgaW4gbWVtb3J5IHRvIGhvbGQgdGhlIHNhZmVhcnJheQotCWludCBwVmFyaWFudCA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBWYXJpYW50LnNpemVvZik7Ci0Jc2hvcnQgdnQgPSAoc2hvcnQpKE9MRS5WVF9BUlJBWSB8IE9MRS5WVF9VSTEpOwotCU9TLk1vdmVNZW1vcnkocFZhcmlhbnQsIG5ldyBzaG9ydFtdIHt2dH0sIDIpOwotCU9TLk1vdmVNZW1vcnkocFZhcmlhbnQgKyA4LCBuZXcgaW50W117cFNhZmVBcnJheX0sIDQpOwotCS8vIENyZWF0ZSBhIGJ5IHJlZiB2YXJpYW50Ci0JVmFyaWFudCB2YXJpYW50QnlSZWYgPSBuZXcgVmFyaWFudChwVmFyaWFudCwgKHNob3J0KShPTEUuVlRfQllSRUYgfCBPTEUuVlRfVkFSSUFOVCkpOwotCXJldHVybiB2YXJpYW50QnlSZWY7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YjI3NjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPEhUTUw+Ci0gIDxIRUFEPgotICAgIDxUSVRMRT5FdmFsdWF0ZTwvVElUTEU+Ci0JPHA+VGVzdCBmb3IgSUUgU2NyaXB0PC9wPgotICAgIDxTQ1JJUFQ+Ci0gICAgICBmdW5jdGlvbiBldmFsdWF0ZSh4KQotICAgICAgewotICAgICAgICAgYWxlcnQoImhlbGxvIikKLSAgICAgICAgIHJldHVybiBldmFsKHgpCi0gICAgICB9Ci0gICA8L1NDUklQVD4KLSAgPC9IRUFEPgotCi0gIDxCT0RZPgotICA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGU4ZjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBSdW5uaW5nIGEgc2NyaXB0IHdpdGhpbiBJRS4gKHdpbjMyIG9ubHkpCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODcgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCU9sZUNvbnRyb2xTaXRlIGNvbnRyb2xTaXRlOwotCXRyeSB7Ci0JCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIlNoZWxsLkV4cGxvcmVyIik7Ci0JCWNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIG9wZW4gYWN0aXZlWCBjb250cm9sIik7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm47Ci0JfQotCQotCS8vIElXZWJCcm93c2VyCi0JZmluYWwgT2xlQXV0b21hdGlvbiB3ZWJCcm93c2VyID0gbmV3IE9sZUF1dG9tYXRpb24oY29udHJvbFNpdGUpOwotCi0JLy8gV2hlbiB0aGUgZG9jdW1lbnQgaXMgbG9hZGVkLCBhY2Nlc3MgdGhlIGRvY3VtZW50IG9iamVjdCBmb3IgdGhlIG5ldyBwYWdlCi0JLy8gYW5kIGV2YWx1dGUgZXhwcmVzc2lvbiB1c2luZyBTY3JpcHQuCi0JaW50IERvd25sb2FkQ29tcGxldGUgPSAxMDQ7Ci0JY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihEb3dubG9hZENvbXBsZXRlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQlpbnRbXSBodG1sRG9jdW1lbnRJRCA9IHdlYkJyb3dzZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkRvY3VtZW50In0pOyAKLQkJCWlmIChodG1sRG9jdW1lbnRJRCA9PSBudWxsKSByZXR1cm47Ci0JCQlWYXJpYW50IHBWYXJSZXN1bHQgPSB3ZWJCcm93c2VyLmdldFByb3BlcnR5KGh0bWxEb2N1bWVudElEWzBdKTsKLQkJCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gMCkgcmV0dXJuOwotCQkJLy9JSFRNTERvY3VtZW50MgotCQkJT2xlQXV0b21hdGlvbiBodG1sRG9jdW1lbnQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlodG1sRG9jdW1lbnQgPSBwVmFyUmVzdWx0LmdldEF1dG9tYXRpb24oKTsKLQkJCQlwVmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQkKLQkJCQlpbnRbXSBzY3JpcHRJRCA9IGh0bWxEb2N1bWVudC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiU2NyaXB0In0pOyAKLQkJCQlpZiAoc2NyaXB0SUQgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXBWYXJSZXN1bHQgPSBodG1sRG9jdW1lbnQuZ2V0UHJvcGVydHkoc2NyaXB0SURbMF0pOwotCQkJCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gMCkgcmV0dXJuOwotCQkJCU9sZUF1dG9tYXRpb24gaHRtbFdpbmRvdyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJLy9JSFRNTFdpbmRvdzIKLQkJCQkJaHRtbFdpbmRvdyA9IHBWYXJSZXN1bHQuZ2V0QXV0b21hdGlvbigpOwotCQkJCQlwVmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQkJCQkJaW50W10gZXZhbHVhdGVJRCA9IGh0bWxXaW5kb3cuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyJldmFsdWF0ZSJ9KTsKLQkJCQkJaWYgKGV2YWx1YXRlSUQgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlTdHJpbmcgZXhwcmVzc2lvbiA9ICI1K01hdGguc2luKDkpIjsKLQkJCQkJVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50W10ge25ldyBWYXJpYW50KGV4cHJlc3Npb24pfTsKLQkJCQkJcFZhclJlc3VsdCA9IGh0bWxXaW5kb3cuaW52b2tlKGV2YWx1YXRlSURbMF0sIHJndmFyZywgbnVsbCk7Ci0JCQkJCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gMCkgcmV0dXJuOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZXhwcmVzc2lvbisiID0iK3BWYXJSZXN1bHQuZ2V0U3RyaW5nKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWh0bWxXaW5kb3cuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaHRtbERvY3VtZW50LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vIE5hdmlnYXRlIHRvIGEgd2ViIHNpdGUKLQlpbnRbXSBpZHMgPSB3ZWJCcm93c2VyLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSIsICJVUkwifSk7IAotCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFtdIHtuZXcgVmFyaWFudCgiaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3Lmh0bWwiKX07Ci0JaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50W117aWRzWzFdfTsKLQl3ZWJCcm93c2VyLmludm9rZShpZHNbMF0sIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JLy9SZW1lbWJlciB0byByZWxlYXNlIE9sZUF1dG9tYXRpb24gT2JqZWN0Ci0Jd2ViQnJvd3Nlci5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci0JCi19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzZhZTUwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBTY3JvbGwgYSB3aWRnZXQgaW50byB2aWV3IG9uIGZvY3VzIGluCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4OCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlzYy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2MsIFNXVC5OT05FKTsKLQljLnNldExheW91dChuZXcgR3JpZExheW91dCgxMCwgdHJ1ZSkpOwotCWZvciAoaW50IGkgPSAwIDsgaSA8IDMwMDsgaSsrKSB7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dCgiQnV0dG9uICIraSk7Ci0JfQotCXNjLnNldENvbnRlbnQoYyk7Ci0Jc2Muc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQlzYy5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQlzYy5zZXRNaW5TaXplKGMuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0Jc2Muc2V0U2hvd0ZvY3VzZWRDb250cm9sKHRydWUpOwotCQotCXNoZWxsLnNldFNpemUoMzAwLCA1MDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjMwYjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIFRleHQgd2l0aCB1bmRlcmxpbmUgYW5kIHN0cmlrZSB0aHJvdWdoCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4OSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU3R5bGVkVGV4dCB3aXRoIHVuZGVybGluZSBhbmQgc3RyaWtlIHRocm91Z2giKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkgQUJDREVGR0hJSktMTSBOT1BRUlNUVVZXWFlaIik7Ci0JLy8gbWFrZSAwMTIzNDU2Nzg5IGFwcGVhciB1bmRlcmxpbmVkCi0JU3R5bGVSYW5nZSBzdHlsZTEgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMS5zdGFydCA9IDA7Ci0Jc3R5bGUxLmxlbmd0aCA9IDEwOwotCXN0eWxlMS51bmRlcmxpbmUgPSB0cnVlOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZTEpOwotCS8vIG1ha2UgQUJDREVGR0hJSktMTSBoYXZlIGEgc3RyaWtlIHRocm91Z2gKLQlTdHlsZVJhbmdlIHN0eWxlMiA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUyLnN0YXJ0ID0gMTE7Ci0Jc3R5bGUyLmxlbmd0aCA9IDEzOwotCXN0eWxlMi5zdHJpa2VvdXQgPSB0cnVlOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZTIpOwotCS8vIG1ha2UgTk9QUVJTVFVWV1hZWiBhcHBlYXIgdW5kZXJsaW5lZCBhbmQgaGF2ZSBhIHN0cmlrZSB0aHJvdWdoCi0JU3R5bGVSYW5nZSBzdHlsZTMgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMy5zdGFydCA9IDI1OwotCXN0eWxlMy5sZW5ndGggPSAxMzsKLQlzdHlsZTMudW5kZXJsaW5lID0gdHJ1ZTsKLQlzdHlsZTMuc3RyaWtlb3V0ID0gdHJ1ZTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUzKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2OTE2OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogdmVyaWZ5IGlucHV0IChvbmx5IGFsbG93IGRpZ2l0cykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCXRleHQuc2V0Qm91bmRzICgxMCwgMTAsIDIwMCwgMjAwKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuVmVyaWZ5LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9IGUudGV4dDsKLQkJCWNoYXIgW10gY2hhcnMgPSBuZXcgY2hhciBbc3RyaW5nLmxlbmd0aCAoKV07Ci0JCQlzdHJpbmcuZ2V0Q2hhcnMgKDAsIGNoYXJzLmxlbmd0aCwgY2hhcnMsIDApOwotCQkJZm9yIChpbnQgaT0wOyBpPGNoYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCEoJzAnIDw9IGNoYXJzIFtpXSAmJiBjaGFycyBbaV0gPD0gJzknKSkgewotCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkNzFjNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogRmxvYXRpbmcgcG9pbnQgdmFsdWVzIGluIFNwaW5uZXIKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTkwIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTcGlubmVyIHdpdGggZmxvYXQgdmFsdWVzIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWZpbmFsIFNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JLy8gYWxsb3cgMyBkZWNpbWFsIHBsYWNlcwotCXNwaW5uZXIuc2V0RGlnaXRzKDMpOwotCS8vIHNldCB0aGUgbWluaW11bSB2YWx1ZSB0byAwLjAwMQotCXNwaW5uZXIuc2V0TWluaW11bSgxKTsKLQkvLyBzZXQgdGhlIG1heGltdW0gdmFsdWUgdG8gMjAKLQlzcGlubmVyLnNldE1heGltdW0oMjAwMDApOwotCS8vIHNldCB0aGUgaW5jcmVtZW50IHZhbHVlIHRvIDAuMDEwCi0Jc3Bpbm5lci5zZXRJbmNyZW1lbnQoMTApOwotCS8vIHNldCB0aGUgc2VsZXRpb24gdG8gMy40NTYKLQlzcGlubmVyLnNldFNlbGVjdGlvbigzNDU2KTsKLQlzcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgc2VsZWN0aW9uID0gc3Bpbm5lci5nZXRTZWxlY3Rpb24oKTsKLQkJCWludCBkaWdpdHMgPSBzcGlubmVyLmdldERpZ2l0cygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZWxlY3Rpb24gaXMgIisoc2VsZWN0aW9uIC8gTWF0aC5wb3coMTAsIGRpZ2l0cykpKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhYzFhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBEZXRlY3Qgd2hlbiB0aGUgdXNlciBzY3JvbGxzIGEgdGV4dCBjb250cm9sCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTEgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwzMjsgaSsrKSB7Ci0JCXRleHQuYXBwZW5kIChpICsgIi1UaGlzIGlzIGEgbGluZSBvZiB0ZXh0IGluIGEgd2lkZ2V0LSIgKyBpICsgIlxuIik7Ci0JfQotCXRleHQuc2V0U2VsZWN0aW9uICgwKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCWludCBsYXN0SW5kZXggPSB0ZXh0LmdldFRvcEluZGV4ICgpOwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJaW50IGluZGV4ID0gdGV4dC5nZXRUb3BJbmRleCAoKTsKLQkJCWlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHsKLQkJCQlsYXN0SW5kZXggPSBpbmRleDsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTY3JvbGxlZCwgdG9wSW5kZXg9IiArIGluZGV4KTsKLQkJCX0KLQkJfQotCX07Ci0JLyogTk9URTogT25seSBkZXRlY3RzIHNjcm9sbGluZyBieSB0aGUgdXNlciAqLwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlVXAsIGxpc3RlbmVyKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuS2V5RG93biwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5LZXlVcCwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIGxpc3RlbmVyKTsKLQlTY3JvbGxCYXIgaEJhciA9IHRleHQuZ2V0SG9yaXpvbnRhbEJhcigpOwotCWlmIChoQmFyICE9IG51bGwpIHsKLQkJaEJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCX0KLQlTY3JvbGxCYXIgdkJhciA9IHRleHQuZ2V0VmVydGljYWxCYXIoKTsKLQlpZiAodkJhciAhPSBudWxsKSB7Ci0JCXZCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQl9Ci0Jc2hlbGwucGFjayAoKTsKLQlQb2ludCBzaXplID0gc2hlbGwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoc2l6ZS4geCAtIDMyLCBzaXplLnkgLyAyKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhkNmQwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIFNob3cgYSBzb3J0IGluZGljYXRvciBpbiB0aGUgY29sdW1uIGhlYWRlcgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTIgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCS8vIGluaXRpYWxpemUgZGF0YSB3aXRoIGtleXMgYW5kIHJhbmRvbSB2YWx1ZXMKLQlpbnQgc2l6ZSA9IDEwMDsKLQlSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwotCWZpbmFsIGludFtdW10gZGF0YSA9IG5ldyBpbnRbc2l6ZV1bXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJZGF0YVtpXSA9IG5ldyBpbnRbXSB7aSwgcmFuZG9tLm5leHRJbnQoKX07Ci0JfQotCS8vIGNyZWF0ZSBhIHZpcnR1YWwgdGFibGUgdG8gZGlzcGxheSBkYXRhCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WSVJUVUFMKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRJdGVtQ291bnQoc2l6ZSk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0VGV4dCgiS2V5Iik7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4yLnNldFRleHQoIlZhbHVlIik7Ci0JY29sdW1uMi5zZXRXaWR0aCgyMDApOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZS5pdGVtOwotCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCWludFtdIGRhdHVtID0gZGF0YVtpbmRleF07Ci0JCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHtJbnRlZ2VyLnRvU3RyaW5nKGRhdHVtWzBdKSwKLQkJCQkJSW50ZWdlci50b1N0cmluZyhkYXR1bVsxXSkgfSk7Ci0JCX0KLQl9KTsKLQkvLyBBZGQgc29ydCBpbmRpY2F0b3IgYW5kIHNvcnQgZGF0YSB3aGVuIGNvbHVtbiBzZWxlY3RlZAotCUxpc3RlbmVyIHNvcnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJLy8gZGV0ZXJtaW5lIG5ldyBzb3J0IGNvbHVtbiBhbmQgZGlyZWN0aW9uCi0JCQlUYWJsZUNvbHVtbiBzb3J0Q29sdW1uID0gdGFibGUuZ2V0U29ydENvbHVtbigpOwotCQkJVGFibGVDb2x1bW4gY3VycmVudENvbHVtbiA9IChUYWJsZUNvbHVtbikgZS53aWRnZXQ7Ci0JCQlpbnQgZGlyID0gdGFibGUuZ2V0U29ydERpcmVjdGlvbigpOwotCQkJaWYgKHNvcnRDb2x1bW4gPT0gY3VycmVudENvbHVtbikgewotCQkJCWRpciA9IGRpciA9PSBTV1QuVVAgPyBTV1QuRE9XTiA6IFNXVC5VUDsKLQkJCX0gZWxzZSB7Ci0JCQkJdGFibGUuc2V0U29ydENvbHVtbihjdXJyZW50Q29sdW1uKTsKLQkJCQlkaXIgPSBTV1QuVVA7Ci0JCQl9Ci0JCQkvLyBzb3J0IHRoZSBkYXRhIGJhc2VkIG9uIGNvbHVtbiBhbmQgZGlyZWN0aW9uCi0JCQlmaW5hbCBpbnQgaW5kZXggPSBjdXJyZW50Q29sdW1uID09IGNvbHVtbjEgPyAwIDogMTsKLQkJCWZpbmFsIGludCBkaXJlY3Rpb24gPSBkaXI7Ci0JCQlBcnJheXMuc29ydChkYXRhLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQkJCWludFtdIGEgPSAoaW50W10pIGFyZzA7Ci0JCQkJCWludFtdIGIgPSAoaW50W10pIGFyZzE7Ci0JCQkJCWlmIChhW2luZGV4XSA9PSBiW2luZGV4XSkgcmV0dXJuIDA7Ci0JCQkJCWlmIChkaXJlY3Rpb24gPT0gU1dULlVQKSB7Ci0JCQkJCQlyZXR1cm4gYVtpbmRleF0gPCBiW2luZGV4XSA/IC0xIDogMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gYVtpbmRleF0gPCBiW2luZGV4XSA/IDEgOiAtMTsKLQkJCQl9Ci0JCQl9KTsKLQkJCS8vIHVwZGF0ZSBkYXRhIGRpc3BsYXllZCBpbiB0YWJsZQotCQkJdGFibGUuc2V0U29ydERpcmVjdGlvbihkaXIpOwotCQkJdGFibGUuY2xlYXJBbGwoKTsKLQkJfQotCX07Ci0JY29sdW1uMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzb3J0TGlzdGVuZXIpOwotCWNvbHVtbjIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc29ydExpc3RlbmVyKTsKLQl0YWJsZS5zZXRTb3J0Q29sdW1uKGNvbHVtbjEpOwotCXRhYmxlLnNldFNvcnREaXJlY3Rpb24oU1dULlVQKTsKLQlzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMGI2NWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBhbGxvdyB1c2VyIHRvIHJlb3JkZXIgY29sdW1ucyBieSBkcmFnZ2luZyBhbmQgcHJvZ3JhbW1hdGljYWxseS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTkzIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0JCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBSb3dEYXRhKC0xLCAzMDApKTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAwIik7Ci0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDEiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULlJJR0hUKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAzIik7Ci0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDQiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJU3RyaW5nW10gdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyI6MCIsIGkrIjoxIiwgaSsiOjIiLCBpKyI6MyIsIGkrIjo0In07Ci0JCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDU7IGorKykgewotCQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCXRleHQgPSBuZXcgU3RyaW5nW117aSsiLCIraisiOjAiLCBpKyIsIitqKyI6MSIsIGkrIiwiK2orIjoyIiwgaSsiLCIraisiOjMiLCBpKyIsIitqKyI6NCJ9OwotCQkJCXN1Ykl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IDU7IGsrKykgewotCQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyIsIitqKyIsIitrKyI6MCIsIGkrIiwiK2orIiwiK2srIjoxIiwgaSsiLCIraisiLCIraysiOjIiLCBpKyIsIitqKyIsIitrKyI6MyIsIGkrIiwiK2orIiwiK2srIjo0In07Ci0JCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3ZlICIrZS53aWRnZXQpOwotCQkJfQotCQl9OwotCQlUcmVlQ29sdW1uW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnNbaV0uc2V0V2lkdGgoMTAwKTsKLQkJCWNvbHVtbnNbaV0uc2V0TW92ZWFibGUodHJ1ZSk7Ci0JCQljb2x1bW5zW2ldLmFkZExpc3RlbmVyKFNXVC5Nb3ZlLCBsaXN0ZW5lcik7Ci0JCX0KLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dCgiaW52ZXJ0IGNvbHVtbiBvcmRlciIpOwotCQliLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpbnRbXSBvcmRlciA9IHRyZWUuZ2V0Q29sdW1uT3JkZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aCAvIDI7IGkrKykgewotCQkJCQlpbnQgdGVtcCA9IG9yZGVyW2ldOwotCQkJCQlvcmRlcltpXSA9IG9yZGVyW29yZGVyLmxlbmd0aCAtIGkgLSAxXTsKLQkJCQkJb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdID0gdGVtcDsKLQkJCQl9Ci0JCQkJdHJlZS5zZXRDb2x1bW5PcmRlcihvcmRlcik7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzk3ZWQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBXcml0ZSBhbiBhbmltYXRlZCBHSUYgdG8gYSBmaWxlLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTQgewotCURpc3BsYXkgZGlzcGxheTsKLQlDb2xvciB3aGl0ZSwgcmVkLCBncmVlbiwgYmx1ZTsKLQlQYWxldHRlRGF0YSBwYWxldHRlOwotCUZvbnQgZm9udDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IFNuaXBwZXQxOTQoKS5ydW4oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJUkdCIHdoaXRlUkdCID0gbmV3IFJHQigweGZmLCAweGZmLCAweGZmKTsKLQkJUkdCIHJlZFJHQiA9IG5ldyBSR0IoMHhmZiwgMCwgMCk7Ci0JCVJHQiBncmVlblJHQiA9IG5ldyBSR0IoMCwgMHhmZiwgMCk7Ci0JCVJHQiBibHVlUkdCID0gbmV3IFJHQigwLCAwLCAweGZmKTsKLQkJcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10gewotCQkJCXdoaXRlUkdCLAkvLyAwCi0JCQkJcmVkUkdCLAkJLy8gMQotCQkJCWdyZWVuUkdCLAkvLyAyCi0JCQkJYmx1ZVJHQiB9KTsJLy8gMwotCQl3aGl0ZSA9IG5ldyBDb2xvcihkaXNwbGF5LCB3aGl0ZVJHQik7Ci0JCXJlZCA9IG5ldyBDb2xvcihkaXNwbGF5LCByZWRSR0IpOwotCQlncmVlbiA9IG5ldyBDb2xvcihkaXNwbGF5LCBncmVlblJHQik7Ci0JCWJsdWUgPSBuZXcgQ29sb3IoZGlzcGxheSwgYmx1ZVJHQik7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiQ29taWMgU2FucyBNUyIsIDI0LCBTV1QuQk9MRCk7Ci0JCQotCQlJbWFnZURhdGFbXSBkYXRhID0gbmV3IEltYWdlRGF0YVs0XTsKLQkJZGF0YVswXSA9IG5ld0ZyYW1lKCIiLCAgd2hpdGUsIGZhbHNlLCAwLCAwLCAxMDEsIDU1LCBTV1QuRE1fRklMTF9OT05FLCA0MCk7Ci0JCWRhdGFbMV0gPSBuZXdGcmFtZSgiUyIsIHJlZCwgICB0cnVlLCAgMCwgMCwgIDMwLCA1NSwgU1dULkRNX0ZJTExfTk9ORSwgNDApOwotCQlkYXRhWzJdID0gbmV3RnJhbWUoIlciLCBncmVlbiwgdHJ1ZSwgMjgsIDAsICAzOSwgNTUsIFNXVC5ETV9GSUxMX05PTkUsIDQwKTsKLQkJZGF0YVszXSA9IG5ld0ZyYW1lKCJUIiwgYmx1ZSwgIHRydWUsIDY5LCAwLCAgMzIsIDU1LCBTV1QuRE1fRklMTF9CQUNLR1JPVU5ELCAyMDApOwotCQkKLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCWxvYWRlci5kYXRhID0gZGF0YTsKLQkJbG9hZGVyLmJhY2tncm91bmRQaXhlbCA9IDA7Ci0JCWxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0ID0gZGF0YVswXS5oZWlnaHQ7Ci0JCWxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGggPSBkYXRhWzBdLndpZHRoOwotCQlsb2FkZXIucmVwZWF0Q291bnQgPSAwOyAvLyBydW4gZm9yZXZlcgotCQl0cnkgewotCQkJbG9hZGVyLnNhdmUoInN3dC5naWYiLCBTV1QuSU1BR0VfR0lGKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHNhdmluZyBHSUY6ICIgKyBleCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl3aGl0ZS5kaXNwb3NlKCk7Ci0JCQlyZWQuZGlzcG9zZSgpOwotCQkJZ3JlZW4uZGlzcG9zZSgpOwotCQkJYmx1ZS5kaXNwb3NlKCk7Ci0JCQlmb250LmRpc3Bvc2UoKTsKLQkJCWRpc3BsYXkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JSW1hZ2VEYXRhIG5ld0ZyYW1lKFN0cmluZyBsZXR0ZXIsIENvbG9yIGNvbG9yLCBib29sZWFuIHRyYW5zcGFyZW50LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRpc3Bvc2FsTWV0aG9kLCBpbnQgZGVsYXlUaW1lKSB7Ci0JCUltYWdlRGF0YSB0ZW1wID0gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCAyLCBwYWxldHRlKTsgLy8gNC1jb2xvciBwYWxldHRlIGhhcyBkZXB0aCAyCi0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHRlbXApOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJZ2MuZHJhd1N0cmluZyhsZXR0ZXIsIDUsIDUpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCUltYWdlRGF0YSBmcmFtZSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCQlpZiAodHJhbnNwYXJlbnQpIGZyYW1lLnRyYW5zcGFyZW50UGl4ZWwgPSAwOyAvLyB3aGl0ZQotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZyYW1lLnggPSB4OwotCQlmcmFtZS55ID0geTsKLQkJZnJhbWUuZGlzcG9zYWxNZXRob2QgPSBkaXNwb3NhbE1ldGhvZDsKLQkJZnJhbWUuZGVsYXlUaW1lID0gZGVsYXlUaW1lOwotCQlyZXR1cm4gZnJhbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjBkOWMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIE9wZW5HTCBzbmlwcGV0OiB1c2UgTFdKR0wgdG8gZHJhdyB0byBhbiBTV1QgR0xDYW52YXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xEYXRhOwotaW1wb3J0IG9yZy5sd2pnbC5vcGVuZ2wuR0wxMTsKLWltcG9ydCBvcmcubHdqZ2wub3BlbmdsLkdMQ29udGV4dDsKLWltcG9ydCBvcmcubHdqZ2wudXRpbC5nbHUuR0xVOwotaW1wb3J0IG9yZy5sd2pnbC5MV0pHTEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTUgewotCXN0YXRpYyB2b2lkIGRyYXdUb3J1cyhmbG9hdCByLCBmbG9hdCBSLCBpbnQgbnNpZGVzLCBpbnQgcmluZ3MpIHsKLQkJZmxvYXQgcmluZ0RlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIHJpbmdzOwotCQlmbG9hdCBzaWRlRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gbnNpZGVzOwotCQlmbG9hdCB0aGV0YSA9IDAuMGYsIGNvc1RoZXRhID0gMS4wZiwgc2luVGhldGEgPSAwLjBmOwotCQlmb3IgKGludCBpID0gcmluZ3MgLSAxOyBpID49IDA7IGktLSkgewotCQkJZmxvYXQgdGhldGExID0gdGhldGEgKyByaW5nRGVsdGE7Ci0JCQlmbG9hdCBjb3NUaGV0YTEgPSAoZmxvYXQpIE1hdGguY29zKHRoZXRhMSk7Ci0JCQlmbG9hdCBzaW5UaGV0YTEgPSAoZmxvYXQpIE1hdGguc2luKHRoZXRhMSk7Ci0JCQlHTDExLmdsQmVnaW4oR0wxMS5HTF9RVUFEX1NUUklQKTsKLQkJCWZsb2F0IHBoaSA9IDAuMGY7Ci0JCQlmb3IgKGludCBqID0gbnNpZGVzOyBqID49IDA7IGotLSkgewotCQkJCXBoaSArPSBzaWRlRGVsdGE7Ci0JCQkJZmxvYXQgY29zUGhpID0gKGZsb2F0KSBNYXRoLmNvcyhwaGkpOwotCQkJCWZsb2F0IHNpblBoaSA9IChmbG9hdCkgTWF0aC5zaW4ocGhpKTsKLQkJCQlmbG9hdCBkaXN0ID0gUiArIHIgKiBjb3NQaGk7Ci0JCQkJR0wxMS5nbE5vcm1hbDNmKGNvc1RoZXRhMSAqIGNvc1BoaSwgLXNpblRoZXRhMSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlHTDExLmdsVmVydGV4M2YoY29zVGhldGExICogZGlzdCwgLXNpblRoZXRhMSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJCUdMMTEuZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMMTEuZ2xWZXJ0ZXgzZihjb3NUaGV0YSAqIGRpc3QsIC1zaW5UaGV0YSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJfQotCQkJR0wxMS5nbEVuZCgpOwotCQkJdGhldGEgPSB0aGV0YTE7Ci0JCQljb3NUaGV0YSA9IGNvc1RoZXRhMTsKLQkJCXNpblRoZXRhID0gc2luVGhldGExOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEgKCk7Ci0JCWRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLQkJZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKGNvbXAsIFNXVC5OT05FLCBkYXRhKTsKLQotCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQl0cnkgewotCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLQotCQljYW52YXMuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gY2FudmFzLmdldEJvdW5kcygpOwotCQkJCWZsb2F0IGZBc3BlY3QgPSAoZmxvYXQpIGJvdW5kcy53aWR0aCAvIChmbG9hdCkgYm91bmRzLmhlaWdodDsKLQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCXRyeSB7Ci0JCQkJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0JCQkJfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLQkJCQlHTDExLmdsVmlld3BvcnQoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJCQlHTDExLmdsTWF0cml4TW9kZShHTDExLkdMX1BST0pFQ1RJT04pOwotCQkJCUdMMTEuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJCQlHTFUuZ2x1UGVyc3BlY3RpdmUoNDUuMGYsIGZBc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0JCQkJR0wxMS5nbE1hdHJpeE1vZGUoR0wxMS5HTF9NT0RFTFZJRVcpOwotCQkJCUdMMTEuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJR0wxMS5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMMTEuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTDExLmdsSGludChHTDExLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0wxMS5HTF9OSUNFU1QpOwotCQlHTDExLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlHTDExLmdsTGluZVdpZHRoKDIpOwotCQlHTDExLmdsRW5hYmxlKEdMMTEuR0xfREVQVEhfVEVTVCk7Ci0KLQkJc2hlbGwuc2V0VGV4dCgiU1dUL0xXSkdMIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0U2l6ZSg2NDAsIDQ4MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlpbnQgcm90ID0gMDsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0JCQkJCX0gY2F0Y2goTFdKR0xFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0JCQkJCUdMMTEuZ2xDbGVhcihHTDExLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTDExLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQkJCQlHTDExLmdsQ2xlYXJDb2xvciguM2YsIC41ZiwgLjhmLCAxLjBmKTsKLQkJCQkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotCQkJCQlHTDExLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTAuMGYpOwotCQkJCQlmbG9hdCBmcm90ID0gcm90OwotCQkJCQlHTDExLmdsUm90YXRlZigwLjE1ZiAqIHJvdCwgMi4wZiAqIGZyb3QsIDEwLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCUdMMTEuZ2xSb3RhdGVmKDAuM2YgKiByb3QsIDMuMGYgKiBmcm90LCAxLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCXJvdCsrOwotCQkJCQlHTDExLmdsUG9seWdvbk1vZGUoR0wxMS5HTF9GUk9OVF9BTkRfQkFDSywgR0wxMS5HTF9MSU5FKTsKLQkJCQkJR0wxMS5nbENvbG9yM2YoMC45ZiwgMC45ZiwgMC45Zik7Ci0JCQkJCWRyYXdUb3J1cygxLCAxLjlmICsgKChmbG9hdCkgTWF0aC5zaW4oKDAuMDA0ZiAqIGZyb3QpKSksIDE1LCAxNSk7Ci0JCQkJCWNhbnZhcy5zd2FwQnVmZmVycygpOwotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwODFkNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiB1c2UgYSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdmVyaWZ5IGlucHV0Ci0gKiBJbiB0aGlzIGNhc2UgYSBwaG9uZSBudW1iZXIgaXMgdXNlZC4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEudXRpbC5yZWdleC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk2IHsKLQkvKgotCSAqIFBob25lIG51bWJlcnMgZm9sbG93IHRoZSBydWxlIFsoXVsxLTldWzEtOV1bMS05XVspXVsxLTldWzEtOV1bMS05XVstXVsxLTldWzEtOV1bMS05XVsxLTldCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYID0gIlsoXVxcZHszfVspXVxcZHszfVstXVxcZHs0fSI7ICAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRlbXBsYXRlID0gIigjIyMpIyMjLSMjIyMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRUZXh0ID0gIigwMDApMDAwLTAwMDAiOyAvLyROT04tTkxTLTEkCi0JCi0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJDb3VyaWVyIE5ldyIsIDEwLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQl0ZXh0LnNldEZvbnQoZm9udCk7Ci0JdGV4dC5zZXRUZXh0KHRlbXBsYXRlKTsJCi0JdGV4dC5hZGRMaXN0ZW5lcihTV1QuVmVyaWZ5LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCS8vY3JlYXRlIHRoZSBwYXR0ZXJuIGZvciB2ZXJpZmljYXRpb24KLQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKFJFR0VYKTsJCi0JCS8vaWdub3JlIGV2ZW50IHdoZW4gY2F1c2VkIGJ5IGluc2VydGluZyB0ZXh0IGluc2lkZSBldmVudCBoYW5kbGVyCi0JCWJvb2xlYW4gaWdub3JlOwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoaWdub3JlKSByZXR1cm47Ci0JCQllLmRvaXQgPSBmYWxzZTsKLQkJCWlmIChlLnN0YXJ0ID4gMTMgfHwgZS5lbmQgPiAxNCkgcmV0dXJuOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZS50ZXh0KTsKLQkJCQotCQkJLy9oYW5kbGUgYmFja3NwYWNlCi0JCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xiJykgewotCQkJCWZvciAoaW50IGkgPSBlLnN0YXJ0OyBpIDwgZS5lbmQ7IGkrKykgewotCQkJCQkvLyBza2lwIG92ZXIgc2VwYXJhdG9ycwotCQkJCQlzd2l0Y2ggKGkpIHsKLQkJCQkJCWNhc2UgMDogCi0JCQkJCQkJaWYgKGUuc3RhcnQgKyAxID09IGUuZW5kKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCWlmIChlLnN0YXJ0ICsgMSA9PSBlLmVuZCkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKG5ldyBjaGFyIFtdIHsnIycsJyknfSk7Ci0JCQkJCQkJCWUuc3RhcnQtLTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA4OgotCQkJCQkJCWlmIChlLnN0YXJ0ICsgMSA9PSBlLmVuZCkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKG5ldyBjaGFyIFtdIHsnIycsJy0nfSk7Ci0JCQkJCQkJCWUuc3RhcnQtLTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCctJyk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDogYnVmZmVyLmFwcGVuZCgnIycpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQgKyBidWZmZXIubGVuZ3RoKCkpOwotCQkJCWlnbm9yZSA9IHRydWU7Ci0JCQkJdGV4dC5pbnNlcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCQkJCS8vIG1vdmUgY3Vyc29yIGJhY2t3YXJkcyBvdmVyIHNlcGFyYXRvcnMKLQkJCQlpZiAoZS5zdGFydCA9PSA1IHx8IGUuc3RhcnQgPT0gOSkgZS5zdGFydC0tOwotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKGRlZmF1bHRUZXh0KTsKLQkJCWNoYXJbXSBjaGFycyA9IGUudGV4dC50b0NoYXJBcnJheSgpOwotCQkJaW50IGluZGV4ID0gZS5zdGFydCAtIDE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGUudGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaW5kZXgrKzsKLQkJCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCWlmIChjaGFyc1tpXSA9PSAnKCcpIGNvbnRpbnVlOwotCQkJCQkJaW5kZXgrKzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDQ6Ci0JCQkJCQlpZiAoY2hhcnNbaV0gPT0gJyknKSBjb250aW51ZTsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA4OgotCQkJCQkJaWYgKGNoYXJzW2ldID09ICctJykgY29udGludWU7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChpbmRleCA+PSBuZXdUZXh0Lmxlbmd0aCgpKSByZXR1cm47Ci0JCQkJbmV3VGV4dC5zZXRDaGFyQXQoaW5kZXgsIGNoYXJzW2ldKTsKLQkJCX0KLQkJCS8vIGlmIHRleHQgaXMgc2VsZWN0ZWQsIGRvIG5vdCBwYXN0ZSBiZXlvbmQgcmFuZ2Ugb2Ygc2VsZWN0aW9uCi0JCQlpZiAoZS5zdGFydCA8IGUuZW5kICYmIGluZGV4ICsgMSAhPSBlLmVuZCkgcmV0dXJuOwotCQkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKG5ld1RleHQpOwotCQkJaWYgKG1hdGNoZXIubG9va2luZ0F0KCkpIHsKLQkJCQl0ZXh0LnNldFNlbGVjdGlvbihlLnN0YXJ0LCBpbmRleCArIDEpOwotCQkJCWlnbm9yZSA9IHRydWU7Ci0JCQkJdGV4dC5pbnNlcnQobmV3VGV4dC5zdWJzdHJpbmcoZS5zdGFydCwgaW5kZXggKyAxKSk7Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQl9CQkJCi0JCX0KLQl9KTsKLQkJCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWZvbnQuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTYwOWJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmF3IHdyYXBwZWQgdGV4dCB1c2luZyBUZXh0TGF5b3V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk3IHsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIGxvbmdTdHJpbmcgPSAiVGhlIHByZWZlcnJlZCBzaXplIG9mIGEgd2lkZ2V0IGlzIHRoZSBtaW5pbXVtIHNpemUgbmVlZGVkIHRvIHNob3cgaXRzIGNvbnRlbnQuIEluIHRoZSBjYXNlIG9mIGEgQ29tcG9zaXRlLCB0aGUgcHJlZmVycmVkIHNpemUgaXMgdGhlIHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIGFsbCBvZiBpdHMgY2hpbGRyZW4uIElmIGNoaWxkcmVuIGhhdmUgYmVlbiBwb3NpdGlvbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgdGhlIENvbXBvc2l0ZSBjb21wdXRlcyBpdHMgb3duIHByZWZlcnJlZCBzaXplIGJhc2VkIG9uIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiB0aGUgY2hpbGRyZW4uIElmIGEgQ29tcG9zaXRlIGlzIHVzaW5nIGEgbGF5b3V0IGNsYXNzIHRvIHBvc2l0aW9uIGl0cyBjaGlsZHJlbiwgaXQgYXNrcyB0aGUgTGF5b3V0IHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgaXRzIGNsaWVudEFyZWEsIGFuZCB0aGVuIGl0IGFkZHMgaW4gdGhlIHRyaW0gdG8gZGV0ZXJtaW5lIGl0cyBwcmVmZXJyZWQgc2l6ZS4iOwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQlsYXlvdXQuc2V0VGV4dChsb25nU3RyaW5nKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCWNhc2UgU1dULlBhaW50OgotCQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCAxMCwgMTApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuUmVzaXplOgotCQkJCWxheW91dC5zZXRXaWR0aChzaGVsbC5nZXRTaXplKCkueCAtIDIwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbGlzdGVuZXIpOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWVmM2Q0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBwYXRoIGZyb20gc29tZSB0ZXh0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk4IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUZvbnREYXRhIGRhdGEgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEuZ2V0TmFtZSgpLCA5NiwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQlmaW5hbCBDb2xvciBncmVlbiA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKTsKLQlmaW5hbCBDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JZmluYWwgUGF0aCBwYXRoOwotCXRyeSB7Ci0JCXBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJcGF0aC5hZGRTdHJpbmcoIlNXVCIsIDAsIDAsIGZvbnQpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCS8vQWR2YW5jZWQgR3JhcGhpY3Mgbm90IHN1cHBvcnRlZC4gIAotCQkvL1RoaXMgbmV3IEFQSSByZXF1aXJlcyB0aGUgQ2Fpcm8gVmVjdG9yIGVuZ2luZSBvbiBHVEsgYW5kIE1vdGlmIGFuZCBHREkrIG9uIFdpbmRvd3MuCi0JCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm47Ci0JfQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7CQkJCi0JCQlHQyBnYyA9IGUuZ2M7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGdyZWVuKTsKLQkJCWdjLnNldEZvcmVncm91bmQoYmx1ZSk7Ci0JCQlnYy5maWxsUGF0aChwYXRoKTsKLQkJCWdjLmRyYXdQYXRoKHBhdGgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZDJjMTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIExpc3RlbiBmb3IgZXZlbnRzIGluIEV4Y2VsICh3aW4zMiBvbmx5KQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5OSB7Ci0Jc3RhdGljIFN0cmluZyBJSURfQXBwRXZlbnRzID0gInswMDAyNDQxMy0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDZ9IjsKLQkvLyBFdmVudCBJRAotCXN0YXRpYyBpbnQgTmV3V29ya2Jvb2sgICAgICAgICAgICA9IDB4MDAwMDA2MWQ7Ci0Jc3RhdGljIGludCBTaGVldFNlbGVjdGlvbkNoYW5nZSAgID0gMHgwMDAwMDYxNjsKLQlzdGF0aWMgaW50IFNoZWV0QmVmb3JlRG91YmxlQ2xpY2sgPSAweDAwMDAwNjE3OwotCXN0YXRpYyBpbnQgU2hlZXRCZWZvcmVSaWdodENsaWNrICA9IDB4MDAwMDA2MTg7Ci0Jc3RhdGljIGludCBTaGVldEFjdGl2YXRlICAgICAgICAgID0gMHgwMDAwMDYxOTsKLQlzdGF0aWMgaW50IFNoZWV0RGVhY3RpdmF0ZSAgICAgICAgPSAweDAwMDAwNjFhOwotCXN0YXRpYyBpbnQgU2hlZXRDYWxjdWxhdGUgICAgICAgICA9IDB4MDAwMDA2MWI7Ci0Jc3RhdGljIGludCBTaGVldENoYW5nZSAgICAgICAgICAgID0gMHgwMDAwMDYxYzsKLQlzdGF0aWMgaW50IFdvcmtib29rT3BlbiAgICAgICAgICAgPSAweDAwMDAwNjFmOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tBY3RpdmF0ZSAgICAgICA9IDB4MDAwMDA2MjA7Ci0Jc3RhdGljIGludCBXb3JrYm9va0RlYWN0aXZhdGUgICAgID0gMHgwMDAwMDYyMTsKLQlzdGF0aWMgaW50IFdvcmtib29rQmVmb3JlQ2xvc2UgICAgPSAweDAwMDAwNjIyOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tCZWZvcmVTYXZlICAgICA9IDB4MDAwMDA2MjM7Ci0Jc3RhdGljIGludCBXb3JrYm9va0JlZm9yZVByaW50ICAgID0gMHgwMDAwMDYyNDsKLQlzdGF0aWMgaW50IFdvcmtib29rTmV3U2hlZXQgICAgICAgPSAweDAwMDAwNjI1OwotCXN0YXRpYyBpbnQgV29ya2Jvb2tBZGRpbkluc3RhbGwgICA9IDB4MDAwMDA2MjY7Ci0Jc3RhdGljIGludCBXb3JrYm9va0FkZGluVW5pbnN0YWxsID0gMHgwMDAwMDYyNzsKLQlzdGF0aWMgaW50IFdpbmRvd1Jlc2l6ZSAgICAgICAgICAgPSAweDAwMDAwNjEyOwotCXN0YXRpYyBpbnQgV2luZG93QWN0aXZhdGUgICAgICAgICA9IDB4MDAwMDA2MTQ7Ci0Jc3RhdGljIGludCBXaW5kb3dEZWFjdGl2YXRlICAgICAgID0gMHgwMDAwMDYxNTsKLQlzdGF0aWMgaW50IFNoZWV0Rm9sbG93SHlwZXJsaW5rICAgPSAweDAwMDAwNzNlOwotCi0gcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlPbGVDb250cm9sU2l0ZSBjb250cm9sU2l0ZTsKLQl0cnkgewotCQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQljb250cm9sU2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZShmcmFtZSwgU1dULk5PTkUsICJFeGNlbC5TaGVldCIpOwotCQljb250cm9sU2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuOwotCX0KLQlzaGVsbC5vcGVuKCk7Ci0KLQlPbGVBdXRvbWF0aW9uIGV4Y2VsU2hlZXQgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0JaW50W10gZGlzcElEcyA9IGV4Y2VsU2hlZXQuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyJBcHBsaWNhdGlvbiJ9KTsKLQlWYXJpYW50IHBWYXJSZXN1bHQgPSBleGNlbFNoZWV0LmdldFByb3BlcnR5KGRpc3BJRHNbMF0pOwotCU9sZUF1dG9tYXRpb24gYXBwbGljYXRpb24gPSBwVmFyUmVzdWx0LmdldEF1dG9tYXRpb24oKTsKLQlwVmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQlleGNlbFNoZWV0LmRpc3Bvc2UoKTsKLQkKLQlpbnQgZXZlbnRJRCA9IFNoZWV0U2VsZWN0aW9uQ2hhbmdlOwotCU9sZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE9sZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoT2xlRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gaGFzIGNoYW5nZWQiKTsKLQkJCS8vIHR3byBhcmd1bWVudHMgd2hpY2ggbXVzdCBiZSByZWxlYXNlZCAocm93IGFuZCBjb2x1bW4pCi0JCQlWYXJpYW50W10gYXJncyA9IGUuYXJndW1lbnRzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGFyZ3NbaV0pOwotCQkJCWFyZ3MgW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX07Ci0JY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihhcHBsaWNhdGlvbiwgSUlEX0FwcEV2ZW50cywgZXZlbnRJRCwgbGlzdGVuZXIpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlhcHBsaWNhdGlvbi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU1YmQ2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBzb3J0IGEgdGFibGUgYnkgY29sdW1uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotICAgIGNvbHVtbjEuc2V0VGV4dCgiQ29sdW1uIDEiKTsKLSAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgY29sdW1uMi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgIGl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJhIiwgIjMifSk7Ci0gICAgaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICBpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiYiIsICIyIn0pOwotICAgIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImMiLCAiMSJ9KTsKLSAgICBjb2x1bW4xLnNldFdpZHRoKDEwMCk7Ci0gICAgY29sdW1uMi5zZXRXaWR0aCgxMDApOwotICAgIExpc3RlbmVyIHNvcnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IChUYWJsZUNvbHVtbillLndpZGdldDsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGNvbHVtbiA9PSBjb2x1bW4xID8gMCA6IDE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlMSA9IGl0ZW1zW2ldLmdldFRleHQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKXsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlMiA9IGl0ZW1zW2pdLmdldFRleHQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGF0b3IuY29tcGFyZSh2YWx1ZTEsIHZhbHVlMikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSB7aXRlbXNbaV0uZ2V0VGV4dCgwKSwgaXRlbXNbaV0uZ2V0VGV4dCgxKX07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCh2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YWJsZS5zZXRTb3J0Q29sdW1uKGNvbHVtbik7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIGNvbHVtbjEuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc29ydExpc3RlbmVyKTsKLSAgICBjb2x1bW4yLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNvcnRMaXN0ZW5lcik7Ci0gICAgdGFibGUuc2V0U29ydENvbHVtbihjb2x1bW4xKTsKLSAgICB0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5VUCk7Ci0gICAgc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLngsIDMwMCk7Ci0gICAgc2hlbGwub3BlbigpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZjBiZDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNvb2wgYmFyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29vbEJhciBiYXIgPSBuZXcgQ29vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTwyOyBpKyspIHsKLQkJQ29vbEl0ZW0gaXRlbSA9IG5ldyBDb29sSXRlbSAoYmFyLCBTV1QuTk9ORSk7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChiYXIsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCdXR0b24gIiArIGkpOwotCQlQb2ludCBzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlpdGVtLnNldFByZWZlcnJlZFNpemUgKGl0ZW0uY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KSk7Ci0JCWl0ZW0uc2V0Q29udHJvbCAoYnV0dG9uKTsKLQl9Ci0JYmFyLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmODNhYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRmlsbCBhIHNoYXBlIHdpdGggYSBwcmVkZWZpbmVkIHBhdHRlcm4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAwIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCS8vZGVmaW5lIGEgcGF0dGVybiBvbiBhbiBpbWFnZQotCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwMDAsIDEwMDApOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlDb2xvciB5ZWxsb3cgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKHllbGxvdyk7Ci0JZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDAsIDAsIDEwMDAsIDEwMDAsIHRydWUpOwotCWZvciAoaW50IGk9LTUwMDsgaTwxMDAwOyBpKz0xMCkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKGJsdWUpOwotCQlnYy5kcmF3TGluZShpLCAwLCA1MDAgKyBpLCAxMDAwKTsKLQkJZ2MuZHJhd0xpbmUoNTAwICsgaSwgMCwgaSwgMTAwMCk7Ci0JfQkKLQlnYy5kaXNwb3NlKCk7Ci0JZmluYWwgUGF0dGVybiBwYXR0ZXJuOwotCXRyeSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkaXNwbGF5LCBpbWFnZSk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJLy9BZHZhbmNlZCBHcmFwaGljcyBub3Qgc3VwcG9ydGVkLiAgCi0JCS8vVGhpcyBuZXcgQVBJIHJlcXVpcmVzIHRoZSBDYWlybyBWZWN0b3IgZW5naW5lIG9uIEdUSyBhbmQgTW90aWYgYW5kIEdESSsgb24gV2luZG93cy4KLQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkRPVUJMRV9CVUZGRVJFRCk7Ci0JYy5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVJlY3RhbmdsZSByID0gKChDb21wb3NpdGUpZXZlbnQud2lkZ2V0KS5nZXRDbGllbnRBcmVhKCk7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JCQlnYy5maWxsT3ZhbCg1LCA1LCByLndpZHRoIC0gMTAsIHIuaGVpZ2h0IC0gMTApOwkKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UoKTsKLQlwYXR0ZXJuLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhMWNiNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVmlydHVhbCBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIHdpdGggMSwwMDAsMDAwIGl0ZW1zIChsYXp5LCBwYWdlIHNpemUgNjQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwMSB7Ci0KLXN0YXRpYyBmaW5hbCBpbnQgUEFHRV9TSVpFID0gNjQ7Ci1zdGF0aWMgZmluYWwgaW50IENPVU5UID0gMTAwMDAwOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuVklSVFVBTCB8IFNXVC5CT1JERVIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mIChpdGVtKTsKLQkJCWludCBzdGFydCA9IGluZGV4IC8gUEFHRV9TSVpFICogUEFHRV9TSVpFOwotCQkJaW50IGVuZCA9IE1hdGgubWluIChzdGFydCArIFBBR0VfU0laRSwgdGFibGUuZ2V0SXRlbUNvdW50ICgpKTsKLQkJCWZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7Ci0JCQkJaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JdGFibGUuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKDIwMCwgMjAwKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJBZGQgSXRlbXMiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJdGFibGUuc2V0SXRlbUNvdW50IChDT1VOVCk7Ci0JCQlsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJbGFiZWwuc2V0VGV4dCAoIkl0ZW1zOiAiICsgQ09VTlQgKyAiLCBUaW1lOiAiICsgKHQyIC0gdDEpICsgIiAobXMpIFtwYWdlPSIgKyBQQUdFX1NJWkUgKyAiXSIpOwotCQkJc2hlbGwubGF5b3V0ICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTk0YTA0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBWaXJ0dWFsIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB2aXJ0dWFsIHRyZWUgKGxhenkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5WSVJUVUFMIHwgU1dULkJPUkRFUik7Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJVHJlZUl0ZW0gcGFyZW50SXRlbSA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJaWYgKHBhcmVudEl0ZW0gPT0gbnVsbCkgewotCQkJCXRleHQgPSAibm9kZSAiK3RyZWUuaW5kZXhPZihpdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGV4dCA9IHBhcmVudEl0ZW0uZ2V0VGV4dCgpKyIgLSAiK3BhcmVudEl0ZW0uaW5kZXhPZihpdGVtKTsKLQkJCX0KLQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCWl0ZW0uc2V0SXRlbUNvdW50KDEwKTsKLQkJfQotCX0pOwotCXRyZWUuc2V0SXRlbUNvdW50KDIwKTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjZkZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB1c2luZyBUZXh0TGF5b3V0IGp1c3RpZnksIGFsaWdubWVudCBhbmQgaW5kZW50IAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwMyB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5ET1VCTEVfQlVGRkVSRUQpOwkKLQlzaGVsbC5zZXRUZXh0KCJJbmRlbnQsIEp1c3RpZnksIEFsaWduIik7Ci0JU3RyaW5nW10gdGV4dHMgPSB7Ci0JCSJQbGFucyBkbyBub3QgbWF0ZXJpYWxpemUgb3V0IG9mIG5vd2hlcmUsIG5vciBhcmUgdGhleSBlbnRpcmVseSBzdGF0aWMuIFRvIGVuc3VyZSB0aGUgcGxhbm5pbmcgcHJvY2VzcyBpcyB0cmFuc3BhcmVudCBhbmQgb3BlbiB0byB0aGUgZW50aXJlIEVjbGlwc2UgY29tbXVuaXR5LCB3ZSAodGhlIEVjbGlwc2UgUE1DKSBwb3N0IHBsYW5zIGluIGFuIGVtYnJ5b25pYyBmb3JtIGFuZCByZXZpc2UgdGhlbSB0aHJvdWdob3V0IHRoZSByZWxlYXNlIGN5Y2xlLiIsCi0JCSJUaGUgZmlyc3QgcGFydCBvZiB0aGUgcGxhbiBkZWFscyB3aXRoIHRoZSBpbXBvcnRhbnQgbWF0dGVycyBvZiByZWxlYXNlIGRlbGl2ZXJhYmxlcywgcmVsZWFzZSBtaWxlc3RvbmVzLCB0YXJnZXQgb3BlcmF0aW5nIGVudmlyb25tZW50cywgYW5kIHJlbGVhc2UtdG8tcmVsZWFzZSBjb21wYXRpYmlsaXR5LiBUaGVzZSBhcmUgYWxsIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgY2xlYXIgZm9yIGFueSByZWxlYXNlLCBldmVuIGlmIG5vIGZlYXR1cmVzIHdlcmUgdG8gY2hhbmdlLiIsCi0JCSJUaGUgcmVtYWluZGVyIG9mIHRoZSBwbGFuIGNvbnNpc3RzIG9mIHBsYW4gaXRlbXMgZm9yIHRoZSB2YXJpb3VzIEVjbGlwc2Ugc3VicHJvamVjdHMuIEVhY2ggcGxhbiBpdGVtIGNvdmVycyBhIGZlYXR1cmUgb3IgQVBJIHRoYXQgaXMgdG8gYmUgYWRkZWQgdG8gRWNsaXBzZSwgb3Igc29tZSBhc3BlY3Qgb2YgRWNsaXBzZSB0aGF0IGlzIHRvIGJlIGltcHJvdmVkLiBFYWNoIHBsYW4gaXRlbSBoYXMgaXRzIG93biBlbnRyeSBpbiB0aGUgRWNsaXBzZSBidWd6aWxsYSBkYXRhYmFzZSwgd2l0aCBhIHRpdGxlIGFuZCBhIGNvbmNpc2Ugc3VtbWFyeSAodXN1YWxseSBhIHNpbmdsZSBwYXJhZ3JhcGgpIHRoYXQgZXhwbGFpbnMgdGhlIHdvcmsgaXRlbSBhdCBhIHN1aXRhYmx5IGhpZ2ggZW5vdWdoIGxldmVsIHNvIHRoYXQgZXZlcnlvbmUgY2FuIHJlYWRpbHkgdW5kZXJzdGFuZCB3aGF0IHRoZSB3b3JrIGl0ZW0gaXMgd2l0aG91dCBoYXZpbmcgdG8gdW5kZXJzdGFuZCB0aGUgbml0dHktZ3JpdHR5IGRldGFpbC4iLAotCX07Ci0JaW50W10gYWxpZ25tZW50cyA9IHtTV1QuTEVGVCwgU1dULkNFTlRFUiwgU1dULlJJR0hUfTsKLQlmaW5hbCBUZXh0TGF5b3V0W10gbGF5b3V0cyA9IG5ldyBUZXh0TGF5b3V0W3RleHRzLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXRzLmxlbmd0aDsgaSsrKSB7Ci0JCVRleHRMYXlvdXQgbGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JCWxheW91dC5zZXRUZXh0KHRleHRzW2ldKTsKLQkJbGF5b3V0LnNldEluZGVudCgzMCk7Ci0JCWxheW91dC5zZXRKdXN0aWZ5KHRydWUpOwotCQlsYXlvdXQuc2V0QWxpZ25tZW50KGFsaWdubWVudHNbaV0pOwkJCi0JCWxheW91dHNbaV0gPSBsYXlvdXQ7Ci0JfQotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoMTAsIDEwKTsKLQkJCWludCB3aWR0aCA9IHNoZWxsLmdldENsaWVudEFyZWEoKS53aWR0aCAtIDIgKiBwb2ludC54OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGV4dExheW91dCBsYXlvdXQgPSBsYXlvdXRzW2ldOwotCQkJCWxheW91dC5zZXRXaWR0aCh3aWR0aCk7Ci0JCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIHBvaW50LngsIHBvaW50LnkpOwotCQkJCXBvaW50LnkgKz0gbGF5b3V0LmdldEJvdW5kcygpLmhlaWdodCArIDEwOwotCQkJfQkJCQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGxheW91dHMubGVuZ3RoOyBpKyspIHsKLQkJbGF5b3V0c1tpXS5kaXNwb3NlKCk7CQkKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjYwOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0TGF5b3V0IGV4YW1wbGUgc25pcHBldDogdXNpbmcgdGhlIHJpc2UgZmllbGQgb2YgYSBUZXh0U3R5bGUuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjA0IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULkRPVUJMRV9CVUZGRVJFRCk7Ci0Jc2hlbGwuc2V0VGV4dCgiTW9kaWZ5IFJpc2UiKTsKLQlGb250RGF0YSBkYXRhID0gZGlzcGxheS5nZXRTeXN0ZW1Gb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBkYXRhLmdldE5hbWUoKSwgMjQsIFNXVC5OT1JNQUwpOwotCUZvbnQgc21hbGxGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIDgsIFNXVC5OT1JNQUwpOwotCUdDIGdjID0gbmV3IEdDKHNoZWxsKTsKLQlnYy5zZXRGb250KHNtYWxsRm9udCk7Ci0JRm9udE1ldHJpY3Mgc21hbGxNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmaW5hbCBpbnQgc21hbGxCYXNlbGluZSA9IHNtYWxsTWV0cmljcy5nZXRBc2NlbnQoKSArIHNtYWxsTWV0cmljcy5nZXRMZWFkaW5nKCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlGb250TWV0cmljcyBtZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmaW5hbCBpbnQgYmFzZWxpbmUgPSBtZXRyaWNzLmdldEFzY2VudCgpICsgbWV0cmljcy5nZXRMZWFkaW5nKCk7Ci0JZ2MuZGlzcG9zZSgpOwotCQotCWZpbmFsIFRleHRMYXlvdXQgbGF5b3V0MCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dDAuc2V0VGV4dCgiU3Vic2NyaXB0U2NyaXB0U3VwZXJzY3JpcHQiKTsKLQlsYXlvdXQwLnNldEZvbnQoZm9udCk7Ci0JVGV4dFN0eWxlIHN1YnNjcmlwdDAgPSBuZXcgVGV4dFN0eWxlKHNtYWxsRm9udCwgbnVsbCwgbnVsbCk7Ci0JVGV4dFN0eWxlIHN1cGVyc2NyaXB0MCA9IG5ldyBUZXh0U3R5bGUoc21hbGxGb250LCBudWxsLCBudWxsKTsKLQlzdXBlcnNjcmlwdDAucmlzZSA9IGJhc2VsaW5lIC0gc21hbGxCYXNlbGluZTsKLQlsYXlvdXQwLnNldFN0eWxlKHN1YnNjcmlwdDAsIDAsIDgpOwotCWxheW91dDAuc2V0U3R5bGUoc3VwZXJzY3JpcHQwLCAxNSwgMjUpOwotCQkKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dDEgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQlsYXlvdXQxLnNldFRleHQoIlN1YnNjcmlwdFNjcmlwdFN1cGVyc2NyaXB0Iik7Ci0JbGF5b3V0MS5zZXRGb250KGZvbnQpOwotCVRleHRTdHlsZSBzdWJzY3JpcHQxID0gbmV3IFRleHRTdHlsZShzbWFsbEZvbnQsIG51bGwsIG51bGwpOwotCXN1YnNjcmlwdDEucmlzZSA9IC1zbWFsbEJhc2VsaW5lOwotCVRleHRTdHlsZSBzdXBlcnNjcmlwdDEgPSBuZXcgVGV4dFN0eWxlKHNtYWxsRm9udCwgbnVsbCwgbnVsbCk7Ci0Jc3VwZXJzY3JpcHQxLnJpc2UgPSBiYXNlbGluZTsKLQlsYXlvdXQxLnNldFN0eWxlKHN1YnNjcmlwdDEsIDAsIDgpOwotCWxheW91dDEuc2V0U3R5bGUoc3VwZXJzY3JpcHQxLCAxNSwgMjUpOwotCQotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gZXZlbnQuZGlzcGxheTsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkKLQkJCVJlY3RhbmdsZSByZWN0MCA9IGxheW91dDAuZ2V0Qm91bmRzKCk7Ci0JCQlyZWN0MC54ICs9IDEwOwotCQkJcmVjdDAueSArPSAxMDsKLQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdDApOwotCQkJbGF5b3V0MC5kcmF3KGdjLCByZWN0MC54LCByZWN0MC55KTsKLQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTUFHRU5UQSkpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDAueCwgcmVjdDAueSwgcmVjdDAueCArIHJlY3QwLndpZHRoLCByZWN0MC55KTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QwLngsIHJlY3QwLnkgKyBiYXNlbGluZSwgcmVjdDAueCArIHJlY3QwLndpZHRoLCByZWN0MC55ICsgYmFzZWxpbmUpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDAueCArIHJlY3QwLndpZHRoIC8gMiwgcmVjdDAueSwgcmVjdDAueCArIHJlY3QwLndpZHRoIC8gMiwgcmVjdDAueSArIHJlY3QwLmhlaWdodCk7Ci0JCQkKLQkJCVJlY3RhbmdsZSByZWN0MSA9IGxheW91dDEuZ2V0Qm91bmRzKCk7Ci0JCQlyZWN0MS54ICs9IDEwOwotCQkJcmVjdDEueSArPSAyMCArIHJlY3QwLmhlaWdodDsKLQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdDEpOwkJCQotCQkJbGF5b3V0MS5kcmF3KGdjLCByZWN0MS54LCByZWN0MS55KTsKLQkJCQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9NQUdFTlRBKSk7Ci0JCQlnYy5kcmF3TGluZShyZWN0MS54LCByZWN0MS55ICsgc21hbGxCYXNlbGluZSwgcmVjdDEueCArIHJlY3QxLndpZHRoLCByZWN0MS55ICsgc21hbGxCYXNlbGluZSk7Ci0JCQlnYy5kcmF3TGluZShyZWN0MS54LCByZWN0MS55ICsgYmFzZWxpbmUgKyBzbWFsbEJhc2VsaW5lLCByZWN0MS54ICsgcmVjdDEud2lkdGgsIHJlY3QxLnkgKyBiYXNlbGluZSArIHNtYWxsQmFzZWxpbmUpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDEueCArIHJlY3QxLndpZHRoIC8gMiwgcmVjdDEueSwgcmVjdDEueCArIHJlY3QxLndpZHRoIC8gMiwgcmVjdDEueSArIHJlY3QxLmhlaWdodCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWxheW91dDAuZGlzcG9zZSgpOwotCWxheW91dDEuZGlzcG9zZSgpOwotCXNtYWxsRm9udC5kaXNwb3NlKCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGYxMzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB1c2luZyB0aGUgR2x5cGhNZXRyaWNzIHRvIGVtYmVkZGVkIGltYWdlcyBpbiAKLSAqIGEgVGV4dExheW91dC4gCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDUgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsKLQlzaGVsbC5zZXRUZXh0KCJFbWJlZGRpbmcgb2JqZWN0cyBpbiB0ZXh0Iik7Ci0JZmluYWwgSW1hZ2VbXSBpbWFnZXMgPSB7bmV3IEltYWdlKGRpc3BsYXksIDMyLCAzMiksIG5ldyBJbWFnZShkaXNwbGF5LCAyMCwgNDApLCBuZXcgSW1hZ2UoZGlzcGxheSwgNDAsIDIwKX07Ci0JaW50W10gY29sb3JzICA9IHtTV1QuQ09MT1JfQkxVRSwgU1dULkNPTE9SX01BR0VOVEEsIFNXVC5DT0xPUl9HUkVFTn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2VzW2ldKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKGNvbG9yc1tpXSkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlc1tpXS5nZXRCb3VuZHMoKSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiQnV0dG9uIik7Ci0JYnV0dG9uLnBhY2soKTsKLQlTdHJpbmcgdGV4dCA9ICJIZXJlIGlzIHNvbWUgdGV4dCB3aXRoIGEgYmx1ZSBpbWFnZSBcdUZGRkMsIGEgbWFnZW50YSBpbWFnZSBcdUZGRkMsIGEgZ3JlZW4gaW1hZ2UgXHVGRkZDLCBhbmQgYSBidXR0b246IFx1RkZGQy4iOwotCWZpbmFsIGludFtdIGltYWdlT2Zmc2V0cyA9IHszNiwgNTUsIDcyfTsKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dC5zZXRUZXh0KHRleHQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZXNbaV0uZ2V0Qm91bmRzKCk7Ci0JCVRleHRTdHlsZSBpbWFnZVN0eWxlID0gbmV3IFRleHRTdHlsZShudWxsLCBudWxsLCBudWxsKTsKLQkJaW1hZ2VTdHlsZS5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcyhib3VuZHMuaGVpZ2h0LCAwLCBib3VuZHMud2lkdGgpOyAKLQkJbGF5b3V0LnNldFN0eWxlKGltYWdlU3R5bGUsIGltYWdlT2Zmc2V0c1tpXSwgaW1hZ2VPZmZzZXRzW2ldKTsKLQl9Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQlUZXh0U3R5bGUgYnV0dG9uU3R5bGUgPSBuZXcgVGV4dFN0eWxlKG51bGwsIG51bGwsIG51bGwpOwotCWJ1dHRvblN0eWxlLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKGJvdW5kcy5oZWlnaHQsIDAsIGJvdW5kcy53aWR0aCk7IAotCWZpbmFsIGludCBidXR0b25PZmZzZXQgPSB0ZXh0Lmxlbmd0aCgpIC0gMjsKLQlsYXlvdXQuc2V0U3R5bGUoYnV0dG9uU3R5bGUsIGJ1dHRvbk9mZnNldCwgYnV0dG9uT2Zmc2V0KTsKLQkKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlQb2ludCBtYXJnaW4gPSBuZXcgUG9pbnQoMTAsIDEwKTsKLQkJCWxheW91dC5zZXRXaWR0aChzaGVsbC5nZXRDbGllbnRBcmVhKCkud2lkdGggLSAyICogbWFyZ2luLngpOwotCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIG1hcmdpbi54LCBtYXJnaW4ueSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCWludCBvZmZzZXQgPSBpbWFnZU9mZnNldHNbaV07Ci0JCQkJaW50IGxpbmVJbmRleCA9IGxheW91dC5nZXRMaW5lSW5kZXgob2Zmc2V0KTsKLQkJCQlGb250TWV0cmljcyBsaW5lTWV0cmljcyA9IGxheW91dC5nZXRMaW5lTWV0cmljcyhsaW5lSW5kZXgpOwotCQkJCVBvaW50IHBvaW50ID0gbGF5b3V0LmdldExvY2F0aW9uKG9mZnNldCwgZmFsc2UpOwotCQkJCUdseXBoTWV0cmljcyBnbHlwaE1ldHJpY3MgPSBsYXlvdXQuZ2V0U3R5bGUob2Zmc2V0KS5tZXRyaWNzOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZXNbaV0sIHBvaW50LnggKyBtYXJnaW4ueCwgcG9pbnQueSArIG1hcmdpbi55ICsgbGluZU1ldHJpY3MuZ2V0QXNjZW50KCkgLSBnbHlwaE1ldHJpY3MuYXNjZW50KTsKLQkJCX0KLQkJCWludCBsaW5lSW5kZXggPSBsYXlvdXQuZ2V0TGluZUluZGV4KGJ1dHRvbk9mZnNldCk7Ci0JCQlGb250TWV0cmljcyBsaW5lTWV0cmljcyA9IGxheW91dC5nZXRMaW5lTWV0cmljcyhsaW5lSW5kZXgpOwotCQkJUG9pbnQgcG9pbnQgPSBsYXlvdXQuZ2V0TG9jYXRpb24oYnV0dG9uT2Zmc2V0LCBmYWxzZSk7Ci0JCQlHbHlwaE1ldHJpY3MgZ2x5cGhNZXRyaWNzID0gbGF5b3V0LmdldFN0eWxlKGJ1dHRvbk9mZnNldCkubWV0cmljczsKLQkJCWJ1dHRvbi5zZXRMb2NhdGlvbihwb2ludC54ICsgbWFyZ2luLngsIHBvaW50LnkgKyBtYXJnaW4ueSArIGxpbmVNZXRyaWNzLmdldEFzY2VudCgpIC0gZ2x5cGhNZXRyaWNzLmFzY2VudCk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JbGF5b3V0LmRpc3Bvc2UoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlpbWFnZXNbaV0uZGlzcG9zZSgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhYjUwMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnV0dG9uIGV4YW1wbGUgc25pcHBldDogYSBCdXR0b24gd2l0aCB0ZXh0IGFuZCBpbWFnZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBpbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fUVVFU1RJT04pOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCWJ1dHRvbi5zZXRUZXh0KCJCdXR0b24iKTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZGVmOTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBVc2UgdHJhbnNmb3JtYXRpb24gbWF0cmljZXMgdG8gcmVmbGVjdCwgcm90YXRlIGFuZCBzaGVhciBpbWFnZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwNyB7CQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCi0JCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDExMCwgNjApOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJUaW1lcyIsIDMwLCBTV1QuQk9MRCk7Ci0JCWdjLnNldEZvbnQoZm9udCk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMTEwLCA2MCk7Ci0JCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJZ2MuZHJhd1RleHQoIlNXVCIsIDEwLCAxMCwgdHJ1ZSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCQotCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiTWF0cml4IFRyYW5mb3JtYXRpb25zIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5ET1VCTEVfQlVGRkVSRUQpOwotCQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7CQotCQkJCUdDIGdjID0gZS5nYzsKLQkJCQlnYy5zZXRBZHZhbmNlZCh0cnVlKTsKLQkJCQlpZiAoIWdjLmdldEFkdmFuY2VkKCkpewotCQkJCQlnYy5kcmF3VGV4dCgiQWR2YW5jZWQgZ3JhcGhpY3Mgbm90IHN1cHBvcnRlZCIsIDMwLCAzMCwgdHJ1ZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gT3JpZ2luYWwgaW1hZ2UKLQkJCQlpbnQgeCA9IDMwLCB5ID0gMzA7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCB4LCB5KTsgCi0JCQkJeCArPSByZWN0LndpZHRoICsgMzA7Ci0JCQkJCi0JCQkJVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGlzcGxheSk7Ci0JCQkJCi0JCQkJLy8gTm90ZSB0aGF0IHRoZSB0cmFuZm9ybSBpcyBhcHBsaWVkIHRvIHRoZSB3aG9sZSBHQyB0aGVyZWZvcmUKLQkJCQkvLyB0aGUgY29vcmRpbmF0ZXMgbmVlZCB0byBiZSBhZGp1c3RlZCB0b28uCi0JCQkJCi0JCQkJLy8gUmVmbGVjdCBhcm91bmQgdGhlIHkgYXhpcy4KLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoLTEsIDAsIDAsIDEsIDAgLDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgLTEqeC1yZWN0LndpZHRoLCB5KTsKLQkJCQkKLQkJCQl4ID0gMzA7IHkgKz0gcmVjdC5oZWlnaHQgKyAzMDsKLQkJCQkKLQkJCQkvLyBSZWZsZWN0IGFyb3VuZCB0aGUgeCBheGlzLiAKLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoMSwgMCwgMCwgLTEsIDAsIDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgeCwgLTEqeS1yZWN0LmhlaWdodCk7Ci0JCQkJCi0JCQkJeCArPSByZWN0LndpZHRoICsgMzA7Ci0JCQkJCi0JCQkJLy8gUmVmbGVjdCBhcm91bmQgdGhlIHggYW5kIHkgYXhlcwkKLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoLTEsIDAsIDAsIC0xLCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIC0xKngtcmVjdC53aWR0aCwgLTEqeS1yZWN0LmhlaWdodCk7Ci0JCQkJCi0JCQkJeCA9IDMwOyB5ICs9IHJlY3QuaGVpZ2h0ICsgMzA7Ci0JCQkJCi0JCQkJLy8gU2hlYXIgaW4gdGhlIHgtZGlyZWN0aW9uCi0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKDEsIDAsIC0xLCAxLCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDMwMCwgeSk7Ci0JCQkJCi0JCQkJLy8gU2hlYXIgaW4geS1kaXJlY3Rpb24KLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoMSwgLTEsIDAsIDEsIDAsIDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgMTUwLCA0NzUpOwotCQkJCQotCQkJCS8vIFJvdGF0ZSBieSA0NSBkZWdyZWVzCQotCQkJCWZsb2F0IGNvczQ1ID0gKGZsb2F0KU1hdGguY29zKE1hdGguUEkvNCk7Ci0JCQkJZmxvYXQgc2luNDUgPSAoZmxvYXQpTWF0aC5zaW4oTWF0aC5QSS80KTsKLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoY29zNDUsIHNpbjQ1LCAtc2luNDUsIGNvczQ1LCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDQwMCwgNjApOwotCQkJCQotCQkJCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwuc2V0U2l6ZSgzNTAsIDU1MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0JCi0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhODg2NWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDaGFuZ2UgaHVlLCBzYXR1cmF0aW9uIGFuZCBicmlnaHRuZXNzIG9mIGEgY29sb3IKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDggewkgCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEoMHhmZiwgMHhmZjAwLCAweGZmMDAwMCk7CQotCQotCS8vIEltYWdlRGF0YSBzaG93aW5nIHZhcmlhdGlvbnMgb2YgaHVlCQotCUltYWdlRGF0YSBodWVEYXRhID0gbmV3IEltYWdlRGF0YSgzNjAsIDEwMCwgMjQsIHBhbGV0dGUpOwkKLQlmbG9hdCBodWUgPSAwOwotCWZvciAoaW50IHggPSAwOyB4IDwgaHVlRGF0YS53aWR0aDsgeCsrKSB7Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgaHVlRGF0YS5oZWlnaHQ7IHkrKykgewotCQkJaW50IHBpeGVsID0gcGFsZXR0ZS5nZXRQaXhlbChuZXcgUkdCKGh1ZSwgMWYsIDFmKSk7Ci0JCQlodWVEYXRhLnNldFBpeGVsKHgsIHksIHBpeGVsKTsKLQkJfQotCQlodWUgKz0gMzYwZiAvIGh1ZURhdGEud2lkdGg7Ci0JfQotCi0JLy8gSW1hZ2VEYXRhIHNob3dpbmcgc2F0dXJhdGlvbiBvbiB4IGF4aXMgYW5kIGJyaWdodG5lc3Mgb24geSBheGlzCi0JSW1hZ2VEYXRhIHNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YSA9IG5ldyBJbWFnZURhdGEoMzYwLCAzNjAsIDI0LCBwYWxldHRlKTsKLQlmbG9hdCBzYXR1cmF0aW9uID0gMGY7Ci0JZmxvYXQgYnJpZ2h0bmVzcyA9IDFmOwotCWZvciAoaW50IHggPSAwOyB4IDwgc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLndpZHRoOyB4KyspIHsKLQkJYnJpZ2h0bmVzcyA9IDFmOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IHNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YS5oZWlnaHQ7IHkrKykgewotCQkJaW50IHBpeGVsID0gcGFsZXR0ZS5nZXRQaXhlbChuZXcgUkdCKDM2MGYsIHNhdHVyYXRpb24sIGJyaWdodG5lc3MpKTsJCi0JCQlzYXR1cmF0aW9uQnJpZ2h0bmVzc0RhdGEuc2V0UGl4ZWwoeCwgeSwgcGl4ZWwpOwotCQkJYnJpZ2h0bmVzcyAtPSAxZiAvIHNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YS5oZWlnaHQ7Ci0JCX0KLQkJc2F0dXJhdGlvbiArPSAxZiAvIHNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YS53aWR0aDsKLQl9Ci0JCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSW1hZ2UgaHVlSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaHVlRGF0YSk7Ci0JSW1hZ2Ugc2F0dXJhdGlvbkltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiSHVlLCBTYXR1cmF0aW9uLCBCcmlnaHRuZXNzIik7Ci0JR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCWdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTY7Ci0Jc2hlbGwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwkJCi0JCi0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOwotCWxhYmVsLnNldEltYWdlKGh1ZUltYWdlKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAyLCAxKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwkKLQkKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7IC8vc3BhY2VyCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOwotCWxhYmVsLnNldFRleHQoIkh1ZSIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsgLy9zcGFjZXIKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMiwgMSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkxFRlQpOwotCWxhYmVsLnNldFRleHQoIkJyaWdodG5lc3MiKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOwotCWxhYmVsLnNldEltYWdlKHNhdHVyYXRpb25JbWFnZSk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCWxhYmVsLnNldExheW91dERhdGEgKGRhdGEpOwotCQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsgLy9zcGFjZXIKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCgiU2F0dXJhdGlvbiIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0JaHVlSW1hZ2UuZGlzcG9zZSgpOwotCXNhdHVyYXRpb25JbWFnZS5kaXNwb3NlKCk7CQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTkyNTAyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIE9wZW5HTCBzbmlwcGV0OiB1c2UgSk9HTCB0byBkcmF3IHRvIGFuIFNXVCBHTENhbnZhcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTERhdGE7Ci0KLWltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuR0w7Ci1pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMQ29udGV4dDsKLWltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuR0xEcmF3YWJsZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLmdsdS5HTFU7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjA5IHsKLQlzdGF0aWMgdm9pZCBkcmF3VG9ydXMoR0wgZ2wsIGZsb2F0IHIsIGZsb2F0IFIsIGludCBuc2lkZXMsIGludCByaW5ncykgewotCQlmbG9hdCByaW5nRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gcmluZ3M7Ci0JCWZsb2F0IHNpZGVEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBuc2lkZXM7Ci0JCWZsb2F0IHRoZXRhID0gMC4wZiwgY29zVGhldGEgPSAxLjBmLCBzaW5UaGV0YSA9IDAuMGY7Ci0JCWZvciAoaW50IGkgPSByaW5ncyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlmbG9hdCB0aGV0YTEgPSB0aGV0YSArIHJpbmdEZWx0YTsKLQkJCWZsb2F0IGNvc1RoZXRhMSA9IChmbG9hdCkgTWF0aC5jb3ModGhldGExKTsKLQkJCWZsb2F0IHNpblRoZXRhMSA9IChmbG9hdCkgTWF0aC5zaW4odGhldGExKTsKLQkJCWdsLmdsQmVnaW4oR0wuR0xfUVVBRF9TVFJJUCk7Ci0JCQlmbG9hdCBwaGkgPSAwLjBmOwotCQkJZm9yIChpbnQgaiA9IG5zaWRlczsgaiA+PSAwOyBqLS0pIHsKLQkJCQlwaGkgKz0gc2lkZURlbHRhOwotCQkJCWZsb2F0IGNvc1BoaSA9IChmbG9hdCkgTWF0aC5jb3MocGhpKTsKLQkJCQlmbG9hdCBzaW5QaGkgPSAoZmxvYXQpIE1hdGguc2luKHBoaSk7Ci0JCQkJZmxvYXQgZGlzdCA9IFIgKyByICogY29zUGhpOwotCQkJCWdsLmdsTm9ybWFsM2YoY29zVGhldGExICogY29zUGhpLCAtc2luVGhldGExICogY29zUGhpLCBzaW5QaGkpOwotCQkJCWdsLmdsVmVydGV4M2YoY29zVGhldGExICogZGlzdCwgLXNpblRoZXRhMSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJCWdsLmdsTm9ybWFsM2YoY29zVGhldGEgKiBjb3NQaGksIC1zaW5UaGV0YSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlnbC5nbFZlcnRleDNmKGNvc1RoZXRhICogZGlzdCwgLXNpblRoZXRhICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQl9Ci0JCQlnbC5nbEVuZCgpOwotCQkJdGhldGEgPSB0aGV0YTE7Ci0JCQljb3NUaGV0YSA9IGNvc1RoZXRhMTsKLQkJCXNpblRoZXRhID0gc2luVGhldGExOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEgKCk7Ci0JCWRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLQkJZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKGNvbXAsIFNXVC5OT05FLCBkYXRhKTsKLQotCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQlmaW5hbCBHTENvbnRleHQgY29udGV4dCA9IEdMRHJhd2FibGVGYWN0b3J5LmdldEZhY3RvcnkoKS5jcmVhdGVFeHRlcm5hbEdMQ29udGV4dCgpOwotCi0JCWNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Qm91bmRzKCk7Ci0JCQkJZmxvYXQgZkFzcGVjdCA9IChmbG9hdCkgYm91bmRzLndpZHRoIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCQkJY29udGV4dC5tYWtlQ3VycmVudCgpOwotCQkJCUdMIGdsID0gY29udGV4dC5nZXRHTCAoKTsKLQkJCQlnbC5nbFZpZXdwb3J0KDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMLkdMX1BST0pFQ1RJT04pOwotCQkJCWdsLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJR0xVIGdsdSA9IG5ldyBHTFUoKTsKLQkJCQlnbHUuZ2x1UGVyc3BlY3RpdmUoNDUuMGYsIGZBc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0JCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMLkdMX01PREVMVklFVyk7Ci0JCQkJZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJCQljb250ZXh0LnJlbGVhc2UoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY29udGV4dC5tYWtlQ3VycmVudCgpOwotCQlHTCBnbCA9IGNvbnRleHQuZ2V0R0wgKCk7Ci0JCWdsLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJZ2wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlnbC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlnbC5nbENsZWFyRGVwdGgoMS4wKTsKLQkJZ2wuZ2xMaW5lV2lkdGgoMik7Ci0JCWdsLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQljb250ZXh0LnJlbGVhc2UoKTsKLQotCQlzaGVsbC5zZXRUZXh0KCJTV1QvSk9HTCBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldFNpemUoNjQwLCA0ODApOwotCQlzaGVsbC5vcGVuKCk7Ci0KLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJaW50IHJvdCA9IDA7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFjYW52YXMuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCQkJCWNvbnRleHQubWFrZUN1cnJlbnQoKTsKLQkJCQkJR0wgZ2wgPSBjb250ZXh0LmdldEdMICgpOwotCQkJCQlnbC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUKTsKLQkJCQkJZ2wuZ2xDbGVhckNvbG9yKC4zZiwgLjVmLCAuOGYsIDEuMGYpOwotCQkJCQlnbC5nbExvYWRJZGVudGl0eSgpOwotCQkJCQlnbC5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTEwLjBmKTsKLQkJCQkJZmxvYXQgZnJvdCA9IHJvdDsKLQkJCQkJZ2wuZ2xSb3RhdGVmKDAuMTVmICogcm90LCAyLjBmICogZnJvdCwgMTAuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJZ2wuZ2xSb3RhdGVmKDAuM2YgKiByb3QsIDMuMGYgKiBmcm90LCAxLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCXJvdCsrOwotCQkJCQlnbC5nbFBvbHlnb25Nb2RlKEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9MSU5FKTsKLQkJCQkJZ2wuZ2xDb2xvcjNmKDAuOWYsIDAuOWYsIDAuOWYpOwotCQkJCQlkcmF3VG9ydXMoZ2wsIDEsIDEuOWYgKyAoKGZsb2F0KSBNYXRoLnNpbigoMC4wMDRmICogZnJvdCkpKSwgMTUsIDE1KTsKLQkJCQkJY2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0JCQkJCWNvbnRleHQucmVsZWFzZSgpOwotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYmEwMDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ2FudmFzIGV4YW1wbGUgc25pcHBldDogaW1wbGVtZW50IHRhYiB0cmF2ZXJzYWwgKGJlaGF2ZSBsaWtlIGEgdGFiIGdyb3VwKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JZmluYWwgQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0Qm91bmRzICgxMCwgMTAsIDEwMCwgMzIpOwotCWIuc2V0VGV4dCAoIkJ1dHRvbiIpOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24gKGIpOwotCWZpbmFsIENhbnZhcyBjID0gbmV3IENhbnZhcyAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMuc2V0Qm91bmRzICgxMCwgNTAsIDEwMCwgMzIpOwotCWMuYWRkTGlzdGVuZXIgKFNXVC5UcmF2ZXJzZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkvKiBEbyB0YWIgZ3JvdXAgdHJhdmVyc2FsICovCi0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9UQUJfTkVYVDoJCi0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfTkVYVDoJCi0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUEFHRV9QUkVWSU9VUzoKLQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9KTsKLQljLmFkZExpc3RlbmVyIChTV1QuRm9jdXNJbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWMuc2V0QmFja2dyb3VuZCAocmVkKTsKLQkJfQotCX0pOwotCWMuYWRkTGlzdGVuZXIgKFNXVC5Gb2N1c091dCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWMuc2V0QmFja2dyb3VuZCAoYmx1ZSk7Ci0JCX0KLQl9KTsKLQljLmFkZExpc3RlbmVyIChTV1QuS2V5RG93biwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIktFWSIpOwotCQkJZm9yIChpbnQgaT0wOyBpPDY0OyBpKyspIHsKLQkJCQlDb2xvciBjMSA9IHJlZCwgYzIgPSBibHVlOwotCQkJCWlmIChjLmlzRm9jdXNDb250cm9sICgpKSB7Ci0JCQkJCWMxID0gYmx1ZTsgIGMyID0gcmVkOwotCQkJCX0KLQkJCQljLnNldEJhY2tncm91bmQgKGMxKTsKLQkJCQljLnVwZGF0ZSAoKTsKLQkJCQljLnNldEJhY2tncm91bmQgKGMyKTsKLQkJCX0KLQkJfQotCX0pOwotCVRleHQgdCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCXQuc2V0Qm91bmRzICgxMCwgODUsIDEwMCwgMzIpOwotCi0JVGV4dCByID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQlyLnNldEJvdW5kcyAoMTAsIDEyMCwgMTAwLCAzMik7Ci0JCi0JYy5zZXRGb2N1cyAoKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmU2YTYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIHRleHQgYmV0d2VlbiB0d28gU3R5bGVkVGV4dCB3aWRnZXRzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjEwIHsKLQlzdGF0aWMgU3RyaW5nIHN0cmluZzEgPSAiQSBkcmFnIHNvdXJjZSBpcyB0aGUgcHJvdmlkZXIgb2YgZGF0YSBpbiBhIERyYWcgYW5kIERyb3AgZGF0YSB0cmFuc2ZlciBhcyB3ZWxsIGFzICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIG9yaWdpbmF0b3Igb2YgdGhlIERyYWcgYW5kIERyb3Agb3BlcmF0aW9uLiBUaGUgZGF0YSBwcm92aWRlZCBieSB0aGUgZHJhZyBzb3VyY2UgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXkgYmUgdHJhbnNmZXJyZWQgdG8gYW5vdGhlciBsb2NhdGlvbiBpbiB0aGUgc2FtZSB3aWRnZXQsIHRvIGEgZGlmZmVyZW50IHdpZGdldCAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbiwgb3IgdG8gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gYWx0b2dldGhlci4gRm9yIGV4YW1wbGUsICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAieW91IGNhbiBkcmFnIHRleHQgZnJvbSB5b3VyIGFwcGxpY2F0aW9uIGFuZCBkcm9wIGl0IG9uIGFuIGVtYWlsIGFwcGxpY2F0aW9uLCBvciB5b3UgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBkcmFnIGFuIGl0ZW0gaW4gYSB0cmVlIGFuZCBkcm9wIGl0IGJlbG93IGEgZGlmZmVyZW50IG5vZGUgaW4gdGhlIHNhbWUgdHJlZS4iOwotCi0Jc3RhdGljIFN0cmluZyBzdHJpbmcyID0gIkEgZHJvcCB0YXJnZXQgcmVjZWl2ZXMgZGF0YSBpbiBhIERyYWcgYW5kIERyb3Agb3BlcmF0aW9uLiBUaGUgZGF0YSByZWNlaXZlZCBieSAiKwotCSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZHJvcCB0YXJnZXQgbWF5IGhhdmUgY29tZSBmcm9tIHRoZSBzYW1lIHdpZGdldCwgZnJvbSBhIGRpZmZlcmVudCB3aWRnZXQgd2l0aGluICIrCi0JICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBzYW1lIGFwcGxpY2F0aW9uLCBvciBmcm9tIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIGFsdG9nZXRoZXIuIEZvciBleGFtcGxlLCB5b3UgIisKLQkgICAgICAgICAgICAgICAgICAgICAgICAiY2FuIGRyYWcgdGV4dCBmcm9tIGFuIGVtYWlsIGFwcGxpY2F0aW9uIGFuZCBkcm9wIGl0IG9uIHlvdXIgYXBwbGljYXRpb24sIG9yIHlvdSBjb3VsZCAiKwotCSAgICAgICAgICAgICAgICAgICAgICAgICJkcmFnIGFuIGl0ZW0gaW4gYSB0cmVlIGFuZCBkcm9wIGl0IGJlbG93IGEgZGlmZmVyZW50IG5vZGUgaW4gdGhlIHNhbWUgdHJlZS4iOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlpbnQgc3R5bGUgPSBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVI7Ci0JZmluYWwgU3R5bGVkVGV4dCB0ZXh0MSA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBzdHlsZSk7Ci0JdGV4dDEuc2V0VGV4dChzdHJpbmcxKTsKLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKHRleHQxLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VBZGFwdGVyKCkgewotCQlQb2ludCBzZWxlY3Rpb247Ci0JCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZSkgewotCQkJc2VsZWN0aW9uID0gdGV4dDEuZ2V0U2VsZWN0aW9uKCk7Ci0JCQllLmRvaXQgPSBzZWxlY3Rpb24ueCAhPSBzZWxlY3Rpb24ueTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZSkgewotCQkJZS5kYXRhID0gdGV4dDEuZ2V0VGV4dChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnktMSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkgewotCQkJCXRleHQxLnJlcGxhY2VUZXh0UmFuZ2Uoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLngsICIiKTsKLQkJCX0KLQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCX0KLQl9KTsKLQkKLQlmaW5hbCBTdHlsZWRUZXh0IHRleHQyID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIHN0eWxlKTsKLQl0ZXh0Mi5zZXRUZXh0KHN0cmluZzIpOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGV4dDIsIERORC5EUk9QX0RFRkFVTFQgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTkspOwotCXRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQllLmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWUuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBlKSB7Ci0JCQl0ZXh0Mi5pbnNlcnQoKFN0cmluZyllLmRhdGEpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM4NTk4Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIFN0eWxlZFRleHQgc25pcHBldDogdXNlIHJpc2UgYW5kIGZvbnQgd2l0aCBTdHlsZVJhbmdlLiAKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjExIHsKLQotCXN0YXRpYyBTdHJpbmcgdGV4dCA9IAotCQkiWW91IGNhbiBzZXQgYW55IGZvbnQgeW91IHdhbnQgaW4gYSByYW5nZS4gWW91IGNhbiBhbHNvIHNldCBhIGJhc2VsaW5lIHJpc2UgYW5kIGFsbCBvdGhlciBvbGQgZmVhdHVyZXMiICsgCi0JCSIgbGlrZSBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kLCBhbmQgbWl4IHRoZW0gYW55IHdheSB5b3Ugd2FudC4gVG90YWxseSBhd2Vzb21lLiI7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5XUkFQIHwgU1dULkJPUkRFUik7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJRm9udERhdGEgZGF0YSA9IHN0eWxlZFRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JCUZvbnQgZm9udDEgPSBuZXcgRm9udChkaXNwbGF5LCBkYXRhLmdldE5hbWUoKSwgZGF0YS5nZXRIZWlnaHQoKSAqIDIsIGRhdGEuZ2V0U3R5bGUoKSk7Ci0JCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCBkYXRhLmdldE5hbWUoKSwgZGF0YS5nZXRIZWlnaHQoKSAqIDQgLyA1LCBkYXRhLmdldFN0eWxlKCkpOwotCQlTdHlsZVJhbmdlW10gc3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbOF07Ci0JCXN0eWxlc1swXSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1swXS5mb250ID0gZm9udDE7IAotCQlzdHlsZXNbMV0gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbMV0ucmlzZSA9IGRhdGEuZ2V0SGVpZ2h0KCkgLyAzOyAKLQkJc3R5bGVzWzJdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzJdLmJhY2tncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTik7IAotCQlzdHlsZXNbM10gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbM10uZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX01BR0VOVEEpOyAKLQkJc3R5bGVzWzRdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzRdLmZvbnQgPSBmb250MjsgCi0JCXN0eWxlc1s0XS5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7OwotCQlzdHlsZXNbNF0udW5kZXJsaW5lID0gdHJ1ZTsKLQkJc3R5bGVzWzVdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzVdLnJpc2UgPSAtZGF0YS5nZXRIZWlnaHQoKSAvIDM7IAotCQlzdHlsZXNbNV0uc3RyaWtlb3V0ID0gdHJ1ZTsKLQkJc3R5bGVzWzVdLnVuZGVybGluZSA9IHRydWU7Ci0JCXN0eWxlc1s2XSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1s2XS5mb250ID0gZm9udDE7IAotCQlzdHlsZXNbNl0uZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVyk7Ci0JCXN0eWxlc1s2XS5iYWNrZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCXN0eWxlc1s3XSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1s3XS5yaXNlID0gIGRhdGEuZ2V0SGVpZ2h0KCkgLyAzOwotCQlzdHlsZXNbN10udW5kZXJsaW5lID0gdHJ1ZTsKLQkJc3R5bGVzWzddLmZvbnRTdHlsZSA9IFNXVC5CT0xEOwotCQlzdHlsZXNbN10uZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JCXN0eWxlc1s3XS5iYWNrZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spOwotCQkKLQkJaW50W10gcmFuZ2VzID0gbmV3IGludFtdIHsxNiwgNCwgNjEsIDEzLCAxMDcsIDEwLCAxMjIsIDEwLCAxMzQsIDMsIDE0MywgNiwgMTYwLCA3LCAxNjgsIDd9OwotCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2VzKHJhbmdlcywgc3R5bGVzKTsKLQkJCi0JCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWZvbnQxLmRpc3Bvc2UoKTsKLQkJZm9udDIuZGlzcG9zZSgpOwkJCi0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlZjNiNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLS8qKgotICogU3R5bGVkVGV4dCBzbmlwcGV0OiBlbWJlZCBpbWFnZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjEyIHsKLQkKLQlzdGF0aWMgU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCXN0YXRpYyBTdHJpbmcgdGV4dCA9IAotCQkiVGhpcyBzbmlwcGV0IHNob3dzIGhvdyB0byBlbWJlZCBpbWFnZXMgaW4gYSBTdHlsZWRUZXh0LlxuIisKLQkJIkhlcmUgaXMgb25lOiBcdUZGRkMsIGFuZCBoZXJlIGlzIGFub3RoZXI6IFx1RkZGQy4iKwotCQkiVXNlIHRoZSBhZGQgYnV0dG9uIHRvIGFkZCBhbiBpbWFnZSBmcm9tIHlvdXIgZmlsZXN5c3RlbSB0byB0aGUgU3R5bGVkVGV4dCBhdCB0aGUgY3VycmVudCBjYXJldCBvZmZzZXQuIjsKLQlzdGF0aWMgSW1hZ2VbXSBpbWFnZXM7Ci0Jc3RhdGljIGludFtdIG9mZnNldHM7Ci0KLQlzdGF0aWMgdm9pZCBhZGRJbWFnZShJbWFnZSBpbWFnZSwgaW50IG9mZnNldCkgewotCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UgKCk7Ci0JCXN0eWxlLnN0YXJ0ID0gb2Zmc2V0OwotCQlzdHlsZS5sZW5ndGggPSAxOwotCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlzdHlsZS5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcyhyZWN0LmhlaWdodCwgMCwgcmVjdC53aWR0aCk7Ci0JCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuV1JBUCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZWRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlzdHlsZWRUZXh0LnNldFRleHQodGV4dCk7Ci0JCWltYWdlcyA9IG5ldyBJbWFnZVtdIHsKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fUVVFU1RJT04pLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTiksCi0JCX07Ci0JCW9mZnNldHMgPSBuZXcgaW50W2ltYWdlcy5sZW5ndGhdOwotCQlpbnQgbGFzdE9mZnNldCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gdGV4dC5pbmRleE9mKCJcdUZGRkMiLCBsYXN0T2Zmc2V0KTsKLQkJCW9mZnNldHNbaV0gPSBvZmZzZXQ7Ci0JCQlhZGRJbWFnZShpbWFnZXNbaV0sIG9mZnNldCk7Ci0JCQlsYXN0T2Zmc2V0ID0gb2Zmc2V0ICsgMTsKLQkJfQotCQkKLQkJLy8gdXNlIGEgdmVyaWZ5IGxpc3RlbmVyIHRvIGtlZXAgdGhlIG9mZnNldHMgdXAgdG8gZGF0ZQotCQlzdHlsZWRUZXh0LmFkZFZlcmlmeUxpc3RlbmVyKG5ldyBWZXJpZnlMaXN0ZW5lcigpICB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGUpIHsKLQkJCQlpbnQgc3RhcnQgPSBlLnN0YXJ0OwotCQkJCWludCByZXBsYWNlQ2hhckNvdW50ID0gZS5lbmQgLSBlLnN0YXJ0OwotCQkJCWludCBuZXdDaGFyQ291bnQgPSBlLnRleHQubGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWludCBvZmZzZXQgPSBvZmZzZXRzW2ldOwotCQkJCQlpZiAoc3RhcnQgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IHN0YXJ0ICsgcmVwbGFjZUNoYXJDb3VudCkgewotCQkJCQkJLy8gdGhpcyBpbWFnZSBpcyBiZWluZyBkZWxldGVkIGZyb20gdGhlIHRleHQKLQkJCQkJCWlmIChpbWFnZXNbaV0gIT0gbnVsbCAmJiAhaW1hZ2VzW2ldLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCWltYWdlc1tpXS5kaXNwb3NlKCk7Ci0JCQkJCQkJaW1hZ2VzW2ldID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCW9mZnNldCA9IC0xOwotCQkJCQl9Ci0JCQkJCWlmIChvZmZzZXQgIT0gLTEgJiYgb2Zmc2V0ID49IHN0YXJ0KSBvZmZzZXQgKz0gbmV3Q2hhckNvdW50IC0gcmVwbGFjZUNoYXJDb3VudDsKLQkJCQkJb2Zmc2V0c1tpXSA9IG9mZnNldDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzdHlsZWRUZXh0LmFkZFBhaW50T2JqZWN0TGlzdGVuZXIobmV3IFBhaW50T2JqZWN0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludE9iamVjdChQYWludE9iamVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gZXZlbnQuc3R5bGU7Ci0JCQkJaW50IHN0YXJ0ID0gc3R5bGUuc3RhcnQ7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWludCBvZmZzZXQgPSBvZmZzZXRzW2ldOwotCQkJCQlpZiAoc3RhcnQgPT0gb2Zmc2V0KSB7Ci0JCQkJCQlJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCQkJCWludCB4ID0gZXZlbnQueDsKLQkJCQkJCWludCB5ID0gZXZlbnQueSArIGV2ZW50LmFzY2VudCAtIHN0eWxlLm1ldHJpY3MuYXNjZW50OwkJCQkJCQotCQkJCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCB4LCB5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIkFkZCBJbWFnZSIpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwpOwotCQkJCVN0cmluZyBmaWxlbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGZpbGVuYW1lICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGZpbGVuYW1lKTsKLQkJCQkJCWludCBvZmZzZXQgPSBzdHlsZWRUZXh0LmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2Uob2Zmc2V0LCAwLCAiXHVGRkZDIik7Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJd2hpbGUgKGluZGV4IDwgb2Zmc2V0cy5sZW5ndGgpIHsKLQkJCQkJCQlpZiAob2Zmc2V0c1tpbmRleF0gPT0gLTEgJiYgaW1hZ2VzW2luZGV4XSA9PSBudWxsKSBicmVhazsKLQkJCQkJCQlpbmRleCsrOwotCQkJCQkJfQotCQkJCQkJaWYgKGluZGV4ID09IG9mZnNldHMubGVuZ3RoKSB7Ci0JCQkJCQkJaW50W10gdG1wT2Zmc2V0cyA9IG5ldyBpbnRbaW5kZXggKyAxXTsKLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9mZnNldHMsIDAsIHRtcE9mZnNldHMsIDAsIG9mZnNldHMubGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXRzID0gdG1wT2Zmc2V0czsKLQkJCQkJCQlJbWFnZVtdIHRtcEltYWdlcyA9IG5ldyBJbWFnZVtpbmRleCArIDFdOwotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW1hZ2VzLCAwLCB0bXBJbWFnZXMsIDAsIGltYWdlcy5sZW5ndGgpOwotCQkJCQkJCWltYWdlcyA9IHRtcEltYWdlczsKLQkJCQkJCX0KLQkJCQkJCW9mZnNldHNbaW5kZXhdID0gb2Zmc2V0OwotCQkJCQkJaW1hZ2VzW2luZGV4XSA9IGltYWdlOwotCQkJCQkJYWRkSW1hZ2UoaW1hZ2UsIG9mZnNldCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDliNDMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTV1QgU3R5bGVkVGV4dCBzbmlwcGV0OiB1c2UgaW5kZW50LCBhbGlnbm1lbnQgYW5kIGp1c3RpZnkuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTMgewotCi0Jc3RhdGljIFN0cmluZyB0ZXh0ID0gCi0JCSJUaGUgZmlyc3QgcGFyYWdyYXBoIGhhcyBhbiBpbmRlbnRhdGlvbiBvZiBmaWZ0eSBwaXhlbHMuIEluZGVudGF0aW9uIGlzIHRoZSBhbW91bnQgb2Ygd2hpdGUgc3BhY2UgaW4gZnJvbnQgb2YgdGhlIGZpcnN0IGxpbmUgb2YgYSBwYXJhZ3JhcGguIElmIHRoaXMgcGFyYWdyYXBoIHdyYXBzIHRvIHNldmVyYWwgbGluZXMgeW91IHNob3VsZCBzZWUgdGhlIGluZGVudGF0aW9uIG9ubHkgb24gdGhlIGZpcnN0IGxpbmUuXG5cbiIgKwotCQkiVGhlIHNlY29uZCBwYXJhZ3JhcGggaXMgY2VudGVyIGFsaWduZWQuIEFsaWdubWVudCBvbmx5IHdvcmtzIHdoZW4gdGhlIFN0eWxlZFRleHQgaXMgdXNpbmcgd29yZCB3cmFwLiBBbGlnbm1lbnQsIGFzIHdpdGggYWxsIG90aGVyIGxpbmUgYXR0cmlidXRlcywgY2FuIGJlIHNldCBmb3IgdGhlIHdob2xlIHdpZGdldCBvciBqdXN0IGZvciBhIHNldCBvZiBsaW5lcy5cblxuIiArCi0JCSJUaGUgdGhpcmQgcGFyYWdyYXBoIGlzIGp1c3RpZmllZC4gTGlrZSBhbGlnbm1lbnQsIGp1c3RpZnkgb25seSB3b3JrcyB3aGVuIHRoZSBTdHlsZWRUZXh0IGlzIHVzaW5nIHdvcmQgd3JhcC4gSWYgdGhlIHBhcmFncmFwaCB3cmFwcyB0byBzZXZlcmFsIGxpbmVzLCB0aGUganVzdGlmaWNhdGlvbiBpcyBwZXJmb3JtZWQgb24gYWxsIGxpbmVzIGJ1dCB0aGUgbGFzdCBvbmUuXG5cbiIgKwkJCi0JCSJUaGUgbGFzdCBwYXJhZ3JhcGggaXMganVzdGlmaWVkIGFuZCByaWdodCBhbGlnbmVkLiBJbiB0aGlzIGNhc2UsIHRoZSBhbGlnbm1lbnQgaXMgb25seSBub3RpY2VhYmxlIGluIHRoZSBmaW5hbCBsaW5lLiI7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5XUkFQIHwgU1dULkJPUkRFUik7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJc3R5bGVkVGV4dC5zZXRMaW5lSW5kZW50KDAsIDEsIDUwKTsKLQkJc3R5bGVkVGV4dC5zZXRMaW5lQWxpZ25tZW50KDIsIDEsIFNXVC5DRU5URVIpOwotCQlzdHlsZWRUZXh0LnNldExpbmVKdXN0aWZ5KDQsIDEsIHRydWUpOwotCQlzdHlsZWRUZXh0LnNldExpbmVBbGlnbm1lbnQoNiwgMSwgU1dULlJJR0hUKTsKLQkJc3R5bGVkVGV4dC5zZXRMaW5lSnVzdGlmeSg2LCAxLCB0cnVlKTsKLQkJCi0JCXNoZWxsLnNldFNpemUoMzAwLCA0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMDQ2NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IHNldCBhIGJhY2tncm91bmQgaW1hZ2UgKGEgZHluYW1pYyBncmFkaWVudCkKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjE0IHsKLQlzdGF0aWMgSW1hZ2Ugb2xkSW1hZ2U7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0QmFja2dyb3VuZE1vZGUgKFNXVC5JTkhFUklUX0RFRkFVTFQpOwotCQlGaWxsTGF5b3V0IGxheW91dDEgPSBuZXcgRmlsbExheW91dCAoU1dULlZFUlRJQ0FMKTsKLQkJbGF5b3V0MS5tYXJnaW5XaWR0aCA9IGxheW91dDEubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCXNoZWxsLnNldExheW91dCAobGF5b3V0MSk7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwIChzaGVsbCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0ICgiR3JvdXAgIik7Ci0JCVJvd0xheW91dCBsYXlvdXQyID0gbmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKTsKLQkJbGF5b3V0Mi5tYXJnaW5XaWR0aCA9IGxheW91dDIubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Mi5zcGFjaW5nID0gMTA7Ci0JCWdyb3VwLnNldExheW91dCAobGF5b3V0Mik7Ci0JCWZvciAoaW50IGk9MDsgaTw4OyBpKyspIHsKLQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChncm91cCwgU1dULlJBRElPKTsKLQkJCWJ1dHRvbi5zZXRUZXh0ICgiQnV0dG9uICIgKyBpKTsKLQkJfQotCQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQlJbWFnZSBuZXdJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgTWF0aC5tYXggKDEsIHJlY3Qud2lkdGgpLCAxKTsJCi0JCQkJR0MgZ2MgPSBuZXcgR0MgKG5ld0ltYWdlKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSkpOwotCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSAocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIDEsIGZhbHNlKTsKLQkJCQlnYy5kaXNwb3NlICgpOwotCQkJCXNoZWxsLnNldEJhY2tncm91bmRJbWFnZSAobmV3SW1hZ2UpOwotCQkJCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlICgpOwotCQkJCW9sZEltYWdlID0gbmV3SW1hZ2U7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrICgpOwotCQlzaGVsbC5vcGVuICgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UgKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNzMzMWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IHRha2UgYSBzY3JlZW4gc2hvdCB3aXRoIGEgR0MKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiQ2FwdHVyZSIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkKLQkJCS8qIFRha2UgdGhlIHNjcmVlbiBzaG90ICovCi0JCQlHQyBnYyA9IG5ldyBHQyhkaXNwbGF5KTsKLQkJCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRpc3BsYXkuZ2V0Qm91bmRzKCkpOwotCQkJZ2MuY29weUFyZWEoaW1hZ2UsIDAsIDApOwotCQkJZ2MuZGlzcG9zZSgpOwotCQkJCi0JCQlTaGVsbCBwb3B1cCA9IG5ldyBTaGVsbChzaGVsbCwgU1dULlNIRUxMX1RSSU0pOwotCQkJcG9wdXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJcG9wdXAuc2V0VGV4dCgiSW1hZ2UiKTsKLQkJCXBvcHVwLnNldEJvdW5kcyg1MCwgNTAsIDIwMCwgMjAwKTsKLQkJCXBvcHVwLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZSAocG9wdXAsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzYywgU1dULk5PTkUpOwotCQkJc2Muc2V0Q29udGVudChjYW52YXMpOwotCQkJY2FudmFzLnNldEJvdW5kcyhkaXNwbGF5LmdldEJvdW5kcyAoKSk7Ci0JCQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXBvcHVwLm9wZW4oKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZThmN2M0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sIFRpcHMgZXhhbXBsZSBzbmlwcGV0OiBzaG93IGEgdG9vbCB0aXAgaW5zaWRlIGEgcmVjdGFuZ2xlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjE2IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCWZpbmFsIENvbG9yIFtdIGNvbG9ycyA9IHsKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0dSRUVOKSwKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKSwKLQkJfTsKLQkJZmluYWwgUmVjdGFuZ2xlIFtdIHJlY3RzID0gewotCQkJbmV3IFJlY3RhbmdsZSAoMTAsIDEwLCAzMCwgMzApLAotCQkJbmV3IFJlY3RhbmdsZSAoMjAsIDQ1LCAyNSwgMzUpLAotCQkJbmV3IFJlY3RhbmdsZSAoODAsIDgwLCAxMCwgMTApLAotCQl9OwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JCUxpc3RlbmVyIG1vdXNlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJCWNhc2UgU1dULk1vdXNlRW50ZXI6Ci0JCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxyZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmIChyZWN0cyBbaV0uY29udGFpbnMgKGV2ZW50LngsIGV2ZW50LnkpKSB7Ci0JCQkJCQkJCVN0cmluZyB0ZXh0ID0gIlRvb2xUaXAgIiArIGk7Ci0JCQkJCQkJCWlmICghKHRleHQuZXF1YWxzIChzaGVsbC5nZXRUb29sVGlwVGV4dCAoKSkpKSB7Ci0JCQkJCQkJCQlzaGVsbC5zZXRUb29sVGlwVGV4dCAoIlRvb2xUaXAgIiArIGkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzaGVsbC5zZXRUb29sVGlwVGV4dCAobnVsbCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJfQotCQl9OwotCQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbW91c2VMaXN0ZW5lcik7Ci0JCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VFbnRlciwgbW91c2VMaXN0ZW5lcik7Ci0JCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCWZvciAoaW50IGk9MDsgaTxyZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcnMgW2ldKTsKLQkJCQkJZ2MuZmlsbFJlY3RhbmdsZSAocmVjdHMgW2ldKTsKLQkJCQkJZ2MuZHJhd1JlY3RhbmdsZSAocmVjdHMgW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjUxMWU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBTdHlsZWRUZXh0IHNuaXBwZXQ6IGVtYmVkIGNvbnRyb2xzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxNyB7Ci0JCi0Jc3RhdGljIFN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlzdGF0aWMgU3RyaW5nIHRleHQgPSAKLQkJIlRoaXMgc25pcHBldCBzaG93cyBob3cgdG8gZW1iZWQgd2lkZ2V0cyBpbiBhIFN0eWxlZFRleHQuXG4iKwotCQkiSGVyZSBpcyBvbmU6IFx1RkZGQywgYW5kIGhlcmUgaXMgYW5vdGhlcjogXHVGRkZDLiI7Ci0Jc3RhdGljIGludFtdIG9mZnNldHM7Ci0Jc3RhdGljIENvbnRyb2xbXSBjb250cm9sczsKLQlzdGF0aWMgaW50IE1BUkdJTiA9IDU7Ci0JCi0Jc3RhdGljIHZvaWQgYWRkQ29udHJvbChDb250cm9sIGNvbnRyb2wsIGludCBvZmZzZXQpIHsKLQkJU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlICgpOwotCQlzdHlsZS5zdGFydCA9IG9mZnNldDsKLQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJY29udHJvbC5wYWNrKCk7Ci0JCVJlY3RhbmdsZSByZWN0ID0gY29udHJvbC5nZXRCb3VuZHMoKTsKLQkJaW50IGFzY2VudCA9IDIqcmVjdC5oZWlnaHQvMzsKLQkJaW50IGRlc2NlbnQgPSByZWN0LmhlaWdodCAtIGFzY2VudDsKLQkJc3R5bGUubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoYXNjZW50ICsgTUFSR0lOLCBkZXNjZW50ICsgTUFSR0lOLCByZWN0LndpZHRoICsgMipNQVJHSU4pOwotCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgIlRhaG9tYSIsIDMyLCBTV1QuTk9STUFMKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuV1JBUCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZWRUZXh0LnNldEZvbnQoZm9udCk7Ci0JCXN0eWxlZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJY29udHJvbHMgPSBuZXcgQ29udHJvbFsyXTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVkVGV4dCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiQnV0dG9uIDEiKTsKLQkJY29udHJvbHNbMF0gPSBidXR0b247Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHN0eWxlZFRleHQsIFNXVC5OT05FKTsKLQkJY29tYm8uYWRkKCJpdGVtIDEiKTsKLQkJY29tYm8uYWRkKCJhbm90aGVyIGl0ZW0iKTsKLQkJY29udHJvbHNbMV0gPSBjb21ibzsKLQkJb2Zmc2V0cyA9IG5ldyBpbnRbY29udHJvbHMubGVuZ3RoXTsKLQkJaW50IGxhc3RPZmZzZXQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gdGV4dC5pbmRleE9mKCJcdUZGRkMiLCBsYXN0T2Zmc2V0KTsKLQkJCW9mZnNldHNbaV0gPSBvZmZzZXQ7Ci0JCQlhZGRDb250cm9sKGNvbnRyb2xzW2ldLCBvZmZzZXRzW2ldKTsKLQkJCWxhc3RPZmZzZXQgPSBvZmZzZXQgKyAxOwotCQl9Ci0JCQotCQkvLyB1c2UgYSB2ZXJpZnkgbGlzdGVuZXIgdG8ga2VlcCB0aGUgb2Zmc2V0cyB1cCB0byBkYXRlCi0JCXN0eWxlZFRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobmV3IFZlcmlmeUxpc3RlbmVyKCkgIHsKLQkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZSkgewotCQkJCWludCBzdGFydCA9IGUuc3RhcnQ7Ci0JCQkJaW50IHJlcGxhY2VDaGFyQ291bnQgPSBlLmVuZCAtIGUuc3RhcnQ7Ci0JCQkJaW50IG5ld0NoYXJDb3VudCA9IGUudGV4dC5sZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IG9mZnNldCA9IG9mZnNldHNbaV07Ci0JCQkJCWlmIChzdGFydCA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgc3RhcnQgKyByZXBsYWNlQ2hhckNvdW50KSB7Ci0JCQkJCQkvLyB0aGlzIHdpZGdldCBpcyBiZWluZyBkZWxldGVkIGZyb20gdGhlIHRleHQKLQkJCQkJCWlmIChjb250cm9sc1tpXSAhPSBudWxsICYmICFjb250cm9sc1tpXS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQljb250cm9sc1tpXS5kaXNwb3NlKCk7Ci0JCQkJCQkJY29udHJvbHNbaV0gPSBudWxsOwotCQkJCQkJfQotCQkJCQkJb2Zmc2V0ID0gLTE7Ci0JCQkJCX0KLQkJCQkJaWYgKG9mZnNldCAhPSAtMSAmJiBvZmZzZXQgPj0gc3RhcnQpIG9mZnNldCArPSBuZXdDaGFyQ291bnQgLSByZXBsYWNlQ2hhckNvdW50OwotCQkJCQlvZmZzZXRzW2ldID0gb2Zmc2V0OwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyByZXBvc2l0aW9uIHdpZGdldHMgb24gcGFpbnQgZXZlbnQKLQkJc3R5bGVkVGV4dC5hZGRQYWludE9iamVjdExpc3RlbmVyKG5ldyBQYWludE9iamVjdExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRPYmplY3RFdmVudCBldmVudCkgewotCQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBldmVudC5zdHlsZTsKLQkJCQlpbnQgc3RhcnQgPSBzdHlsZS5zdGFydDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IG9mZnNldCA9IG9mZnNldHNbaV07Ci0JCQkJCWlmIChzdGFydCA9PSBvZmZzZXQpIHsKLQkJCQkJCVBvaW50IHB0ID0gY29udHJvbHNbaV0uZ2V0U2l6ZSgpOwotCQkJCQkJaW50IHggPSBldmVudC54ICsgTUFSR0lOOwotCQkJCQkJaW50IHkgPSBldmVudC55ICsgZXZlbnQuYXNjZW50IC0gMipwdC55LzM7Ci0JCQkJCQljb250cm9sc1tpXS5zZXRMb2NhdGlvbih4LCB5KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCQotCQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlmb250LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDI0YTQwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTV1QgU3R5bGVkVGV4dCBzbmlwcGV0OiB1c2UgZ3JhZGllbnQgYmFja2dyb3VuZC4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxOCB7Ci0KLQlzdGF0aWMgU3RyaW5nIHRleHQgPSAiUGxhbnMgZG8gbm90IG1hdGVyaWFsaXplIG91dCBvZiBub3doZXJlLCBub3IgYXJlIHRoZXkgZW50aXJlbHkgc3RhdGljLiBUbyBlbnN1cmUgdGhlIHBsYW5uaW5nIHByb2Nlc3MgaXMgIiArCi0JCSJ0cmFuc3BhcmVudCBhbmQgb3BlbiB0byB0aGUgZW50aXJlIEVjbGlwc2UgY29tbXVuaXR5LCB3ZSAodGhlIEVjbGlwc2UgUE1DKSBwb3N0IHBsYW5zIGluIGFuIGVtYnJ5b25pYyAiKwotCQkiZm9ybSBhbmQgcmV2aXNlIHRoZW0gdGhyb3VnaG91dCB0aGUgcmVsZWFzZSBjeWNsZS4gXG4iKwotCQkiVGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBsYW4gZGVhbHMgd2l0aCB0aGUgaW1wb3J0YW50IG1hdHRlcnMgb2YgcmVsZWFzZSBkZWxpdmVyYWJsZXMsIHJlbGVhc2UgbWlsZXN0b25lcywgdGFyZ2V0ICIrCi0JCSJvcGVyYXRpbmcgZW52aXJvbm1lbnRzLCBhbmQgcmVsZWFzZS10by1yZWxlYXNlIGNvbXBhdGliaWxpdHkuIFRoZXNlIGFyZSBhbGwgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBjbGVhciBmb3IgIisKLQkJImFueSByZWxlYXNlLCBldmVuIGlmIG5vIGZlYXR1cmVzIHdlcmUgdG8gY2hhbmdlLiAgXG4iOwotCXN0YXRpYyBJbWFnZSBvbGRJbWFnZTsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULldSQVAgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQpOwotCQlGb250RGF0YSBkYXRhID0gZGlzcGxheS5nZXRTeXN0ZW1Gb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIDE2LCBTV1QuQk9MRCk7Ci0JCXN0eWxlZFRleHQuc2V0Rm9udChmb250KTsKLQkJc3R5bGVkVGV4dC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCXN0eWxlZFRleHQuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHN0eWxlZFRleHQuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQlJbWFnZSBuZXdJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMSwgTWF0aC5tYXggKDEsIHJlY3QuaGVpZ2h0KSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0MgKG5ld0ltYWdlKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlIChyZWN0LngsIHJlY3QueSwgMSwgcmVjdC5oZWlnaHQsIHRydWUpOwotCQkJCWdjLmRpc3Bvc2UgKCk7Ci0JCQkJc3R5bGVkVGV4dC5zZXRCYWNrZ3JvdW5kSW1hZ2UgKG5ld0ltYWdlKTsKLQkJCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSAoKTsKLQkJCQlvbGRJbWFnZSA9IG5ld0ltYWdlOwotCQkJfQotCQl9KTsJCi0JCXNoZWxsLnNldFNpemUoNzAwLCA0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlICgpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDJiZTMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFJlZ2lvbiBzbmlwcGV0OiBDcmVhdGUgbm9uLXJlY3Rhbmd1bGFyIHNoZWxsIGZyb20gYW4gaW1hZ2Ugd2l0aCB0cmFuc3BhcmVuY3kKLSAqIChFU0MgdG8gY2xvc2Ugc2hlbGwpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxOSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJZmluYWwgSW1hZ2VEYXRhIGltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCQlpZiAoaW1hZ2VEYXRhLmFscGhhRGF0YSAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgcGl4ZWwgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEsIDEpOwotCQkJZm9yIChpbnQgeSA9IDA7IHkgPCBpbWFnZURhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCQlmb3IgKGludCB4ID0gMDsgeCA8IGltYWdlRGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJCWlmIChpbWFnZURhdGEuZ2V0QWxwaGEoeCwgeSkgPT0gMjU1KSB7Ci0JCQkJCQlwaXhlbC54ID0gaW1hZ2VEYXRhLnggKyB4OwotCQkJCQkJcGl4ZWwueSA9IGltYWdlRGF0YS55ICsgeTsKLQkJCQkJCXJlZ2lvbi5hZGQocGl4ZWwpOwotCQkJCQl9IAotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUltYWdlRGF0YSBtYXNrID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCVJlY3RhbmdsZSBwaXhlbCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMSwgMSk7Ci0JCQlmb3IgKGludCB5ID0gMDsgeSA8IG1hc2suaGVpZ2h0OyB5KyspIHsKLQkJCQlmb3IgKGludCB4ID0gMDsgeCA8IG1hc2sud2lkdGg7IHgrKykgewotCQkJCQlpZiAobWFzay5nZXRQaXhlbCh4LCB5KSAhPSAwKSB7Ci0JCQkJCQlwaXhlbC54ID0gaW1hZ2VEYXRhLnggKyB4OwotCQkJCQkJcGl4ZWwueSA9IGltYWdlRGF0YS55ICsgeTsKLQkJCQkJCXJlZ2lvbi5hZGQocGl4ZWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNoZWxsLnNldFJlZ2lvbihyZWdpb24pOwotCi0JCUxpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlpbnQgc3RhcnRYLCBzdGFydFk7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSAgewotCQkJCWlmIChlLnR5cGUgPT0gU1dULktleURvd24gJiYgZS5jaGFyYWN0ZXIgPT0gU1dULkVTQykgewotCQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWlmIChlLnR5cGUgPT0gU1dULk1vdXNlRG93biAmJiBlLmJ1dHRvbiA9PSAxKSB7Ci0JCQkJCXN0YXJ0WCA9IGUueDsKLQkJCQkJc3RhcnRZID0gZS55OyAKLQkJCQl9Ci0JCQkJaWYgKGUudHlwZSA9PSBTV1QuTW91c2VNb3ZlICYmIChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT04xKSAhPSAwKSB7Ci0JCQkJCVBvaW50IHAgPSBzaGVsbC50b0Rpc3BsYXkoZS54LCBlLnkpOwotCQkJCQlwLnggLT0gc3RhcnRYOwotCQkJCQlwLnkgLT0gc3RhcnRZOwotCQkJCQlzaGVsbC5zZXRMb2NhdGlvbihwKTsKLQkJCQl9Ci0JCQkJaWYgKGUudHlwZSA9PSBTV1QuUGFpbnQpIHsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIGltYWdlRGF0YS54LCBpbWFnZURhdGEueSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgbCk7Ci0JCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGwpOwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCBsKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBsKTsKLQotCQlzaGVsbC5zZXRTaXplKGltYWdlRGF0YS54ICsgaW1hZ2VEYXRhLndpZHRoLCBpbWFnZURhdGEueSArIGltYWdlRGF0YS5oZWlnaHQpOwotCQlzaGVsbC5vcGVuICgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJaW1hZ2UuZGlzcG9zZSAoKTsKLQkJZGlzcGxheS5kaXNwb3NlICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NWI1YmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHNlbGVjdCBhbGwgdGhlIHRleHQgaW4gdGhlIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIDApOwotCXRleHQuc2V0VGV4dCAoIkFTREYiKTsKLQl0ZXh0LnNldFNpemUgKDY0LCAzMik7Ci0JdGV4dC5zZWxlY3RBbGwgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODI1MTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IEltYWdlcyBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgVHJlZUl0ZW0KLSAqCi0gKiBGb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGlzIHNuaXBwZXQgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtQ3VzdG9tRHJhd2luZ1RhYmxlQW5kVHJlZUl0ZW1zL2N1c3RvbURyYXcuaHRtI19leGFtcGxlNQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjAgewkKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAzNTAsIDIwMCk7Ci0JSW1hZ2UgeEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUdDIGdjID0gbmV3IEdDKHhJbWFnZSk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5kcmF3TGluZSgxLCAxLCAxNCwgMTQpOwotCWdjLmRyYXdMaW5lKDEsIDE0LCAxNCwgMSk7Ci0JZ2MuZHJhd092YWwoMiwgMiwgMTEsIDExKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZmluYWwgaW50IElNQUdFX01BUkdJTiA9IDI7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZS5zZXRCb3VuZHMoMTAsIDEwLCAzMDAsIDE1MCk7Ci0JVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KCJyb290IGl0ZW0iKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJbmV3SXRlbS5zZXRUZXh0KCJkZXNjZW5kZW50ICIgKyBpKTsKLQkJaWYgKGkgJSAyID09IDApIG5ld0l0ZW0uc2V0RGF0YSh4SW1hZ2UpOwotCQlpdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCQlpdGVtID0gbmV3SXRlbTsKLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtIGFuZCBQYWludEl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LiAgVGhlcmVmb3JlIGl0IGlzCi0JICogY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZSBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCUltYWdlIHRyYWlsaW5nSW1hZ2UgPSAoSW1hZ2UpaXRlbS5nZXREYXRhKCk7Ci0JCQlpZiAodHJhaWxpbmdJbWFnZSAhPSBudWxsKSB7Ci0JCQkJZXZlbnQud2lkdGggKz0gdHJhaWxpbmdJbWFnZS5nZXRCb3VuZHMoKS53aWR0aCArIElNQUdFX01BUkdJTjsKLQkJCX0KLQkJfQotCX0pOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJSW1hZ2UgdHJhaWxpbmdJbWFnZSA9IChJbWFnZSlpdGVtLmdldERhdGEoKTsKLQkJCWlmICh0cmFpbGluZ0ltYWdlICE9IG51bGwpIHsKLQkJCQlpbnQgeCA9IGV2ZW50LnggKyBldmVudC53aWR0aCArIElNQUdFX01BUkdJTjsKLQkJCQlpbnQgaXRlbUhlaWdodCA9IHRyZWUuZ2V0SXRlbUhlaWdodCgpOwotCQkJCWludCBpbWFnZUhlaWdodCA9IHRyYWlsaW5nSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQkJCWludCB5ID0gZXZlbnQueSArIChpdGVtSGVpZ2h0IC0gaW1hZ2VIZWlnaHQpIC8gMjsKLQkJCQlldmVudC5nYy5kcmF3SW1hZ2UodHJhaWxpbmdJbWFnZSwgeCwgeSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JeEltYWdlLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2MDY5Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBTY3JvbGwgdHJlZSB3aGVuIG1vdXNlIGF0IHRvcCBvciBib3R0b20KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjEgewotCXN0YXRpYyBSdW5uYWJsZSBIZWFydGJlYXQ7Ci0Jc3RhdGljIGJvb2xlYW4gVHJhY2tpbmc7Ci0Jc3RhdGljIGludCBTY3JvbGxTcGVlZCA9IDQwOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCWNvbHVtbjAuc2V0VGV4dCgiQ29sdW1uIDAiKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMS5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQljb2x1bW4yLnNldFRleHQoIkNvbHVtbiAyIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlpdGVtLnNldFRleHQoMSwgImNvbHVtbiAxIC0gIitpKTsKLQkJaXRlbS5zZXRUZXh0KDIsICJjb2x1bW4gMiAtICIraSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgOTsgaisrKSB7Ci0JCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSAiK2krIiAiK2opOwotCQkJc3ViSXRlbS5zZXRUZXh0KDEsICJjb2x1bW4gMSAtICIraSsiICIraik7Ci0JCQlzdWJJdGVtLnNldFRleHQoMiwgImNvbHVtbiAyIC0gIitpKyIgIitqKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgOTsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gc3Vic3ViSXRlbSA9IG5ldyBUcmVlSXRlbShzdWJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KCJpdGVtICIraSsiICIraisiICIrayk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KDEsICJjb2x1bW4gMSAtICIraSsiICIraisiICIrayk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KDIsICJjb2x1bW4gMiAtICIraSsiICIraisiICIrayk7Ci0JCQl9Ci0JCX0KLQl9Ci0JY29sdW1uMC5wYWNrKCk7Ci0JY29sdW1uMS5wYWNrKCk7Ci0JY29sdW1uMi5wYWNrKCk7Ci0JCi0JSGVhcnRiZWF0ID0gbmV3IFJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoIVRyYWNraW5nIHx8IHRyZWUuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQlQb2ludCBjdXJzb3IgPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uKCk7Ci0JCQljdXJzb3IgPSBkaXNwbGF5Lm1hcChudWxsLCB0cmVlLCBjdXJzb3IpOwotCQkJU2Nyb2xsKHRyZWUsIGN1cnNvci54LCBjdXJzb3IueSk7Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyhTY3JvbGxTcGVlZCwgSGVhcnRiZWF0KTsKLQkJfQotCX07Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCWNhc2UgU1dULk1vdXNlRW50ZXI6Ci0JCQkJVHJhY2tpbmcgPSB0cnVlOwotCQkJCWRpc3BsYXkudGltZXJFeGVjKDAsIEhlYXJ0YmVhdCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5Nb3VzZUV4aXQ6Ci0JCQkJVHJhY2tpbmcgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VFbnRlciwgbGlzdGVuZXIpOyAKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZUV4aXQsIGxpc3RlbmVyKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXN0YXRpYyB2b2lkIFNjcm9sbChUcmVlIHRyZWUsIGludCB4LCBpbnQgeSkgewotCVRyZWVJdGVtIGl0ZW0gPSB0cmVlLmdldEl0ZW0obmV3IFBvaW50KHgsIHkpKTsKLQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JUmVjdGFuZ2xlIGFyZWEgPSB0cmVlLmdldENsaWVudEFyZWEoKTsKLQlpbnQgaGVhZGVySGVpZ2h0ID0gdHJlZS5nZXRIZWFkZXJIZWlnaHQoKTsKLQlpbnQgaXRlbUhlaWdodD0gdHJlZS5nZXRJdGVtSGVpZ2h0KCk7Ci0JVHJlZUl0ZW0gbmV4dEl0ZW0gPSBudWxsOwotCWlmICh5IDwgYXJlYS55ICsgaGVhZGVySGVpZ2h0ICsgMiAqIGl0ZW1IZWlnaHQpIHsKLQkJbmV4dEl0ZW0gPSBQcmV2aW91c0l0ZW0odHJlZSwgaXRlbSk7Ci0JfQotCWlmICh5ID4gYXJlYS55ICsgYXJlYS5oZWlnaHQgLSAyICogaXRlbUhlaWdodCkgewotCQluZXh0SXRlbSA9IE5leHRJdGVtKHRyZWUsIGl0ZW0pOwotCX0KLQlpZiAobmV4dEl0ZW0gIT0gbnVsbCkgdHJlZS5zaG93SXRlbShuZXh0SXRlbSk7Ci19Ci0KLXN0YXRpYyBUcmVlSXRlbSBQcmV2aW91c0l0ZW0oVHJlZSB0cmVlLCBUcmVlSXRlbSBpdGVtKSB7Ci0JaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JVHJlZUl0ZW0gY2hpbGRJdGVtID0gaXRlbTsKLQlUcmVlSXRlbSBwYXJlbnRJdGVtID0gY2hpbGRJdGVtLmdldFBhcmVudEl0ZW0oKTsKLQlpbnQgaW5kZXggPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmluZGV4T2YoY2hpbGRJdGVtKSA6IHBhcmVudEl0ZW0uaW5kZXhPZihjaGlsZEl0ZW0pOwotCWlmIChpbmRleCA9PSAwKSB7Ci0JCXJldHVybiBwYXJlbnRJdGVtOwotCX0gZWxzZSB7Ci0JCVRyZWVJdGVtIG5leHRJdGVtID0gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5nZXRJdGVtKGluZGV4LTEpIDogcGFyZW50SXRlbS5nZXRJdGVtKGluZGV4LTEpOwotCQlpbnQgY291bnQgPSBuZXh0SXRlbS5nZXRJdGVtQ291bnQoKTsKLQkJd2hpbGUgKGNvdW50ID4gMCAmJiBuZXh0SXRlbS5nZXRFeHBhbmRlZCgpKSB7Ci0JCQluZXh0SXRlbSA9IG5leHRJdGVtLmdldEl0ZW0oY291bnQgLSAxKTsKLQkJCWNvdW50ID0gbmV4dEl0ZW0uZ2V0SXRlbUNvdW50KCk7Ci0JCX0KLQkJcmV0dXJuIG5leHRJdGVtOwotCX0KLX0KLXN0YXRpYyBUcmVlSXRlbSBOZXh0SXRlbShUcmVlIHRyZWUsIFRyZWVJdGVtIGl0ZW0pIHsKLQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlpZiAoaXRlbS5nZXRFeHBhbmRlZCgpKSB7Ci0JCXJldHVybiBpdGVtLmdldEl0ZW0oMCk7Ci0JfSBlbHNlIHsKLQkJVHJlZUl0ZW0gY2hpbGRJdGVtID0gaXRlbTsKLQkJVHJlZUl0ZW0gcGFyZW50SXRlbSA9IGNoaWxkSXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCWludCBpbmRleCA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuaW5kZXhPZihjaGlsZEl0ZW0pIDogcGFyZW50SXRlbS5pbmRleE9mKGNoaWxkSXRlbSk7Ci0JCWludCBjb3VudCA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuZ2V0SXRlbUNvdW50KCkgOiBwYXJlbnRJdGVtLmdldEl0ZW1Db3VudCgpOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGluZGV4ICsgMSA8IGNvdW50KSB7Ci0JCQkJcmV0dXJuIHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuZ2V0SXRlbShpbmRleCArIDEpIDogcGFyZW50SXRlbS5nZXRJdGVtKGluZGV4ICsgMSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwYXJlbnRJdGVtID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2hpbGRJdGVtID0gcGFyZW50SXRlbTsKLQkJCQkJcGFyZW50SXRlbSA9IGNoaWxkSXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQkJCWluZGV4ID0gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5pbmRleE9mKGNoaWxkSXRlbSkgOiBwYXJlbnRJdGVtLmluZGV4T2YoY2hpbGRJdGVtKTsKLQkJCQkJY291bnQgPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmdldEl0ZW1Db3VudCgpIDogcGFyZW50SXRlbS5nZXRJdGVtQ291bnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOTkzODUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBTdHlsZWRUZXh0IGJ1bGxldGVkIGxpc3QgZXhhbXBsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyMiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU3R5bGVkVGV4dCBCdWxsZXQgRXhhbXBsZSIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0JU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JdGV4dC5hcHBlbmQoIkhlcmUgaXMgU3R5bGVkVGV4dCB3aXRoIHNvbWUgYnVsbGV0ZWQgbGlzdHM6XG5cbiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB0ZXh0LmFwcGVuZCgiUmVkIEJ1bGxldCBMaXN0IEl0ZW0gIiArIGkgKyAiXG4iKTsKLQl0ZXh0LmFwcGVuZCgiXG4iKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgdGV4dC5hcHBlbmQoIk51bWJlcmVkIExpc3QgSXRlbSAiICsgaSArICJcbiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB0ZXh0LmFwcGVuZCgiU3ViIExpc3QgSXRlbSAiICsgaSArICJcbiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB0ZXh0LmFwcGVuZCgiTnVtYmVyZWQgTGlzdCBJdGVtICIgKyAoMiArIGkpICsgIlxuIik7Ci0JdGV4dC5hcHBlbmQoIlxuIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHRleHQuYXBwZW5kKCJDdXN0b20gRHJhdyBMaXN0IEl0ZW0gIiArIGkgKyAiXG4iKTsJCi0Jc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQudG9TdHJpbmcoKSk7Ci0JCQotCVN0eWxlUmFuZ2Ugc3R5bGUwID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTAubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoMCwgMCwgNDApOwotCXN0eWxlMC5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlCdWxsZXQgYnVsbGV0MCA9IG5ldyBCdWxsZXQgKHN0eWxlMCk7Ci0JU3R5bGVSYW5nZSBzdHlsZTEgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMS5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcygwLCAwLCA1MCk7Ci0Jc3R5bGUxLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlCdWxsZXQgYnVsbGV0MSA9IG5ldyBCdWxsZXQgKFNULkJVTExFVF9OVU1CRVIgfCBTVC5CVUxMRVRfVEVYVCwgc3R5bGUxKTsKLQlidWxsZXQxLnRleHQgPSAiLiI7Ci0JU3R5bGVSYW5nZSBzdHlsZTIgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMi5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcygwLCAwLCA4MCk7Ci0Jc3R5bGUyLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTik7Ci0JQnVsbGV0IGJ1bGxldDIgPSBuZXcgQnVsbGV0IChTVC5CVUxMRVRfVEVYVCwgc3R5bGUyKTsKLQlidWxsZXQyLnRleHQgPSAiXHUyNzEzIjsKLQlTdHlsZVJhbmdlIHN0eWxlMyA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUzLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKDAsIDAsIDUwKTsKLQlCdWxsZXQgYnVsbGV0MyA9IG5ldyBCdWxsZXQgKFNULkJVTExFVF9DVVNUT00sIHN0eWxlMik7Ci0KLQlzdHlsZWRUZXh0LnNldExpbmVCdWxsZXQoMiwgNCwgYnVsbGV0MCk7Ci0Jc3R5bGVkVGV4dC5zZXRMaW5lQnVsbGV0KDcsIDIsIGJ1bGxldDEpOwotCXN0eWxlZFRleHQuc2V0TGluZUJ1bGxldCg5LCA0LCBidWxsZXQyKTsKLQlzdHlsZWRUZXh0LnNldExpbmVCdWxsZXQoMTMsIDIsIGJ1bGxldDEpOwotCXN0eWxlZFRleHQuc2V0TGluZUJ1bGxldCgxNiwgNCwgYnVsbGV0Myk7Ci0KLQlzdHlsZWRUZXh0LmFkZFBhaW50T2JqZWN0TGlzdGVuZXIobmV3IFBhaW50T2JqZWN0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50T2JqZWN0KFBhaW50T2JqZWN0RXZlbnQgZXZlbnQpIHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IGV2ZW50LmRpc3BsYXk7Ci0JCQlTdHlsZVJhbmdlIHN0eWxlID0gZXZlbnQuc3R5bGU7Ci0JCQlGb250IGZvbnQgPSBzdHlsZS5mb250OwotCQkJaWYgKGZvbnQgPT0gbnVsbCkgZm9udCA9IHN0eWxlZFRleHQuZ2V0Rm9udCgpOwotCQkJVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQkJCWxheW91dC5zZXRBc2NlbnQoZXZlbnQuYXNjZW50KTsKLQkJCWxheW91dC5zZXREZXNjZW50KGV2ZW50LmRlc2NlbnQpOwotCQkJbGF5b3V0LnNldEZvbnQoZm9udCk7Ci0JCQlsYXlvdXQuc2V0VGV4dCgiXHUyMDIzIDEuIiArIGV2ZW50LmJ1bGxldEluZGV4ICsgIikiKTsKLQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCBldmVudC54ICsgMTAsIGV2ZW50LnkpOwotCQkJbGF5b3V0LmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ZkOTJhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBleGFtcGxlIHNuaXBwZXQ6IEV4cGFuZEJhciBleGFtcGxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCXNoZWxsLnNldFRleHQoIkV4cGFuZEJhciBFeGFtcGxlIik7Ci0JRXhwYW5kQmFyIGJhciA9IG5ldyBFeHBhbmRCYXIgKHNoZWxsLCBTV1QuVl9TQ1JPTEwpOwotCUltYWdlIGltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9RVUVTVElPTik7Ci0JCi0JLy8gRmlyc3QgaXRlbQotCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChiYXIsIFNXVC5OT05FKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCWxheW91dC5tYXJnaW5MZWZ0ID0gbGF5b3V0Lm1hcmdpblRvcCA9IGxheW91dC5tYXJnaW5SaWdodCA9IGxheW91dC5tYXJnaW5Cb3R0b20gPSAxMDsKLQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiU1dULlBVU0giKTsKLQlidXR0b24gPSBuZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JYnV0dG9uLnNldFRleHQoIlNXVC5SQURJTyIpOwotCWJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQlidXR0b24uc2V0VGV4dCgiU1dULkNIRUNLIik7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuVE9HR0xFKTsKLQlidXR0b24uc2V0VGV4dCgiU1dULlRPR0dMRSIpOwotCUV4cGFuZEl0ZW0gaXRlbTAgPSBuZXcgRXhwYW5kSXRlbSAoYmFyLCBTV1QuTk9ORSwgMCk7Ci0JaXRlbTAuc2V0VGV4dCgiV2hhdCBpcyB5b3VyIGZhdm9yaXRlIGJ1dHRvbiIpOwotCWl0ZW0wLnNldEhlaWdodChjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLQlpdGVtMC5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JaXRlbTAuc2V0SW1hZ2UoaW1hZ2UpOwotCQotCS8vIFNlY29uZCBpdGVtCi0JY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoYmFyLCBTV1QuTk9ORSk7Ci0JbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKDIsIGZhbHNlKTsKLQlsYXlvdXQubWFyZ2luTGVmdCA9IGxheW91dC5tYXJnaW5Ub3AgPSBsYXlvdXQubWFyZ2luUmlnaHQgPSBsYXlvdXQubWFyZ2luQm90dG9tID0gMTA7Ci0JbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsJCi0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldEltYWdlKGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiU1dULklDT05fRVJST1IiKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0SW1hZ2UoZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTikpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJTV1QuSUNPTl9JTkZPUk1BVElPTiIpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiU1dULklDT05fV0FSTklORyIpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNXVC5JQ09OX1FVRVNUSU9OIik7Ci0JRXhwYW5kSXRlbSBpdGVtMSA9IG5ldyBFeHBhbmRJdGVtIChiYXIsIFNXVC5OT05FLCAxKTsKLQlpdGVtMS5zZXRUZXh0KCJXaGF0IGlzIHlvdXIgZmF2b3JpdGUgaWNvbiIpOwotCWl0ZW0xLnNldEhlaWdodChjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLQlpdGVtMS5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JaXRlbTEuc2V0SW1hZ2UoaW1hZ2UpOwotCQotCS8vIFRoaXJkIGl0ZW0KLQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChiYXIsIFNXVC5OT05FKTsKLQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoMiwgdHJ1ZSk7Ci0JbGF5b3V0Lm1hcmdpbkxlZnQgPSBsYXlvdXQubWFyZ2luVG9wID0gbGF5b3V0Lm1hcmdpblJpZ2h0ID0gbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDEwOwotCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMDsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNjYWxlIik7CQotCW5ldyBTY2FsZSAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNwaW5uZXIiKTsJCi0JbmV3IFNwaW5uZXIgKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNsaWRlciIpOwkKLQluZXcgU2xpZGVyIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlFeHBhbmRJdGVtIGl0ZW0yID0gbmV3IEV4cGFuZEl0ZW0gKGJhciwgU1dULk5PTkUsIDIpOwotCWl0ZW0yLnNldFRleHQoIldoYXQgaXMgeW91ciBmYXZvcml0ZSByYW5nZSB3aWRnZXQiKTsKLQlpdGVtMi5zZXRIZWlnaHQoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0JaXRlbTIuc2V0Q29udHJvbChjb21wb3NpdGUpOwotCWl0ZW0yLnNldEltYWdlKGltYWdlKTsKLQkKLQlpdGVtMS5zZXRFeHBhbmRlZCh0cnVlKTsKLQliYXIuc2V0U3BhY2luZyg4KTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgMzUwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIHsKLQkJCWRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTA4N2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGltcGxlbWVudCByYWRpbyBiZWhhdmlvciBmb3Igc2V0U2VsZWN0aW9uKCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyNCB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlJBRElPKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCIiArIGkpOwotCQlpZiAoaSA9PSAwKSBidXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQl9Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJTZXQgU2VsZWN0aW9uIHRvIEI0Iik7Ci0JYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBzaGVsbC5nZXRDaGlsZHJlbiAoKTsKLQkJCUJ1dHRvbiBuZXdCdXR0b24gPSAoQnV0dG9uKSBjaGlsZHJlbiBbNF07Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW4gW2ldOwotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJ1dHRvbiAmJiAoY2hpbGQuZ2V0U3R5bGUgKCkgJiBTV1QuUkFESU8pICE9IDApIHsKLQkJCQkJKChCdXR0b24pIGNoaWxkKS5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQluZXdCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3NzUyYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBUb29sdGlwIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgYmFsbG9vbiB0b29sdGlwIGZvciBhIHRyYXkgaXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCWZpbmFsIFRvb2xUaXAgdGlwID0gbmV3IFRvb2xUaXAoc2hlbGwsIFNXVC5CQUxMT09OIHwgU1dULklDT05fSU5GT1JNQVRJT04pOwotCXRpcC5zZXRNZXNzYWdlKCJIZXJlIGlzIGEgbWVzc2FnZSBmb3IgdGhlIHVzZXIuIFdoZW4gdGhlIG1lc3NhZ2UgaXMgdG9vIGxvbmcgaXQgd3JhcHMuIEkgc2hvdWxkIHNheSBzb21ldGhpbmcgY29vbCBidXQgbm90aGluZyBjb21lcyB0byBteSBtaW5kLiIpOwotCVRyYXkgdHJheSA9IGRpc3BsYXkuZ2V0U3lzdGVtVHJheSgpOwotCWlmICh0cmF5ICE9IG51bGwpIHsKLQkJVHJheUl0ZW0gaXRlbSA9IG5ldyBUcmF5SXRlbSh0cmF5LCBTV1QuTk9ORSk7Ci0JCWltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0JCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQl0aXAuc2V0VGV4dCgiTm90aWZpY2F0aW9uIGZyb20gYSB0cmF5IGl0ZW0iKTsKLQkJaXRlbS5zZXRUb29sVGlwKHRpcCk7Ci0JfSBlbHNlIHsKLQkJdGlwLnNldFRleHQoIk5vdGlmaWNhdGlvbiBmcm9tIGFueXdoZXJlIik7Ci0JCXRpcC5zZXRMb2NhdGlvbig0MDAsIDQwMCk7Ci0JfQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJQcmVzcyBmb3IgYmFsbG9vbiB0aXAiKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJdGlwLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLQlidXR0b24ucGFjaygpOwotCXNoZWxsLnNldEJvdW5kcyg1MCwgNTAsIDMwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjRmNjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgYSBjdXN0b20gZ3JhZGllbnQgc2VsZWN0aW9uIGZvciB0cmVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjYgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkN1c3RvbSBncmFkaWVudCBzZWxlY3Rpb24gZm9yIFRyZWUiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWludCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwkKLQl9Ci0JaW50IGl0ZW1Db3VudCA9IDM7Ci0JZm9yIChpbnQgaT0wOyBpPGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0xID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbTEuc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlmb3IgKGludCBjPTE7IGMgPCBjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQlpdGVtMS5zZXRUZXh0KGMsICJpdGVtIFsiK2krIi0iK2MrIl0iKTsKLQkJfQotCQlmb3IgKGludCBqPTA7IGo8aXRlbUNvdW50OyBqKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0yID0gbmV3IFRyZWVJdGVtKGl0ZW0xLCBTV1QuTk9ORSk7Ci0JCQlpdGVtMi5zZXRUZXh0KCJpdGVtIFsiK2krIiAiK2orIl0iKTsKLQkJCWZvciAoaW50IGM9MTsgYzxjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQkJaXRlbTIuc2V0VGV4dChjLCAiaXRlbSBbIitpKyIgIitqKyItIitjKyJdIik7Ci0JCQl9Ci0JCQlmb3IgKGludCBrPTA7IGs8aXRlbUNvdW50OyBrKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtMyA9IG5ldyBUcmVlSXRlbShpdGVtMiwgU1dULk5PTkUpOwotCQkJCWl0ZW0zLnNldFRleHQoIml0ZW0gWyIraSsiICIraisiICIraysiXSIpOwotCQkJCWZvciAoaW50IGM9MTsgYzxjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQkJCWl0ZW0zLnNldFRleHQoYywgIml0ZW0gWyIraSsiICIraisiICIraysiLSIrYysiXSIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kZXRhaWwgJj0gflNXVC5IT1Q7Ci0JCQlpZiAoKGV2ZW50LmRldGFpbCAmIFNXVC5TRUxFQ1RFRCkgIT0gMCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSB0cmVlLmdldENsaWVudEFyZWEoKTsKLQkJCQkvKgotCQkJCSAqIElmIHlvdSB3aXNoIHRvIHBhaW50IHRoZSBzZWxlY3Rpb24gYmV5b25kIHRoZSBlbmQgb2YKLQkJCQkgKiBsYXN0IGNvbHVtbiwgeW91IG11c3QgY2hhbmdlIHRoZSBjbGlwcGluZyByZWdpb24uCi0JCQkJICovCi0JCQkJaW50IGNvbHVtbkNvdW50ID0gdHJlZS5nZXRDb2x1bW5Db3VudCgpOwotCQkJCWlmIChldmVudC5pbmRleCA9PSBjb2x1bW5Db3VudCAtIDEgfHwgY29sdW1uQ291bnQgPT0gMCkgewotCQkJCQlpbnQgd2lkdGggPSBhcmVhLnggKyBhcmVhLndpZHRoIC0gZXZlbnQueDsKLQkJCQkJaWYgKHdpZHRoID4gMCkgewotCQkJCQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJCQkJCWdjLmdldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQkJCQlyZWdpb24uYWRkKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLCBldmVudC5oZWlnaHQpOyAKLQkJCQkJCWdjLnNldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQkJCQlyZWdpb24uZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWdjLnNldEFkdmFuY2VkKHRydWUpOwotCQkJCWlmIChnYy5nZXRBZHZhbmNlZCgpKSBnYy5zZXRBbHBoYSgxMjcpOwkJCQkJCQkJCi0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBldmVudC5nZXRCb3VuZHMoKTsKLQkJCQlDb2xvciBmb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgwLCByZWN0LnksIDUwMCwgcmVjdC5oZWlnaHQsIGZhbHNlKTsKLQkJCQkvLyByZXN0b3JlIGNvbG9ycyBmb3Igc3Vic2VxdWVudCBkcmF3aW5nCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULlNFTEVDVEVEOwkJCQkJCi0JCQl9CQkJCQkJCi0JCX0KLQl9KTsJCQotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9CQotCXRyZWUuc2V0U2VsZWN0aW9uKHRyZWUuZ2V0SXRlbSgwKSk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsJCi19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzAwYzY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogZHJhdyBtdWx0aXBsZSBsaW5lcyBpbiBhIHRyZWUgaXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI3IHsJCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIk11bHRpcGxlIGxpbmVzIGluIGEgVHJlZUl0ZW0iKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlpbnQgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsKLQkJY29sdW1uLnNldFdpZHRoKDEwMCk7Ci0JfQotCWludCBpdGVtQ291bnQgPSAzOwotCWZvciAoaW50IGk9MDsgaTxpdGVtQ291bnQ7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtMSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0xLnNldFRleHQoIml0ZW0gIitpKTsKLQkJZm9yIChpbnQgYz0xOyBjIDwgY29sdW1uQ291bnQ7IGMrKykgewotCQkJaXRlbTEuc2V0VGV4dChjLCAiaXRlbSBbIitpKyItIitjKyJdIik7Ci0JCX0KLQkJZm9yIChpbnQgaj0wOyBqPGl0ZW1Db3VudDsgaisrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtMiA9IG5ldyBUcmVlSXRlbShpdGVtMSwgU1dULk5PTkUpOwotCQkJaXRlbTIuc2V0VGV4dCgiaXRlbSBbIitpKyIgIitqKyJdIik7Ci0JCQlmb3IgKGludCBjPTE7IGM8Y29sdW1uQ291bnQ7IGMrKykgewotCQkJCWl0ZW0yLnNldFRleHQoYywgIml0ZW0gWyIraSsiICIraisiLSIrYysiXSIpOwotCQkJfQotCQkJZm9yIChpbnQgaz0wOyBrPGl0ZW1Db3VudDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTMgPSBuZXcgVHJlZUl0ZW0oaXRlbTIsIFNXVC5OT05FKTsKLQkJCQlpdGVtMy5zZXRUZXh0KCJpdGVtIFsiK2krIiAiK2orIiAiK2srIl0iKTsKLQkJCQlmb3IgKGludCBjPTE7IGM8Y29sdW1uQ291bnQ7IGMrKykgewotCQkJCQlpdGVtMy5zZXRUZXh0KGMsICJpdGVtIFsiK2krIiAiK2orIiAiK2srIi0iK2MrIl0iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCUxpc3RlbmVyIHBhaW50TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2goZXZlbnQudHlwZSkgewkJCi0JCQkJY2FzZSBTV1QuTWVhc3VyZUl0ZW06IHsKLQkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCQlTdHJpbmcgdGV4dCA9IGdldFRleHQoaXRlbSwgZXZlbnQuaW5kZXgpOwotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh0ZXh0KTsKLQkJCQkJZXZlbnQud2lkdGggPSBzaXplLng7Ci0JCQkJCWV2ZW50LmhlaWdodCA9IE1hdGgubWF4KGV2ZW50LmhlaWdodCwgc2l6ZS55KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBhaW50SXRlbTogewotCQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChpdGVtLCBldmVudC5pbmRleCk7Ci0JCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwkJCQkJCi0JCQkJCWludCBvZmZzZXQyID0gZXZlbnQuaW5kZXggPT0gMCA/IE1hdGgubWF4KDAsIChldmVudC5oZWlnaHQgLSBzaXplLnkpIC8gMikgOiAwOwotCQkJCQlldmVudC5nYy5kcmF3VGV4dCh0ZXh0LCBldmVudC54LCBldmVudC55ICsgb2Zmc2V0MiwgdHJ1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5FcmFzZUl0ZW06IHsJCi0JCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkZPUkVHUk9VTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmcgZ2V0VGV4dChUcmVlSXRlbSBpdGVtLCBpbnQgY29sdW1uKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGl0ZW0uZ2V0VGV4dChjb2x1bW4pOwotCQkJaWYgKGNvbHVtbiAhPSAwKSB7Ci0JCQkJVHJlZUl0ZW0gcGFyZW50ID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQkJaW50IGluZGV4ID0gcGFyZW50ID09IG51bGwgPyB0cmVlLmluZGV4T2YoaXRlbSkgOiBwYXJlbnQuaW5kZXhPZihpdGVtKTsKLQkJCQlpZiAoKGluZGV4K2NvbHVtbikgJSAzID09IDEpewotCQkJCQl0ZXh0ICs9IlxubmV3IGxpbmUiOwotCQkJCX0KLQkJCQlpZiAoKGluZGV4K2NvbHVtbikgJSAzID09IDIpIHsKLQkJCQkJdGV4dCArPSJcbm5ldyBsaW5lXG5uZXcgbGluZSI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQl9OwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBwYWludExpc3RlbmVyKTsKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgcGFpbnRMaXN0ZW5lcik7Ci0KLQlzaGVsbC5zZXRTaXplKDYwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBkMWY1MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogc2hvdyByZXN1bHRzIGFzIGEgYmFyIGNoYXJ0IGluIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjggewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwkJCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCXNoZWxsLnNldFRleHQoIlNob3cgcmVzdWx0cyBhcyBhIGJhciBjaGFydCBpbiBUYWJsZSIpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMS5zZXRUZXh0KCJCdWcgU3RhdHVzIik7Ci0JY29sdW1uMS5zZXRXaWR0aCgxMDApOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4yLnNldFRleHQoIlBlcmNlbnQiKTsKLQljb2x1bW4yLnNldFdpZHRoKDIwMCk7Ci0JU3RyaW5nW10gbGFiZWxzID0gbmV3IFN0cmluZ1tdeyJSZXNvbHZlZCIsICJOZXciLCAiV29uJ3QgRml4IiwgIkludmFsaWQifTsKLQlmb3IgKGludCBpPTA7IGk8bGFiZWxzLmxlbmd0aDsgaSsrKSB7Ci0JCSBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJIGl0ZW0uc2V0VGV4dChsYWJlbHNbaV0pOwotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlpbnRbXSBwZXJjZW50cyA9IG5ldyBpbnRbXSB7NTAsIDMwLCA1LCAxNX07Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuaW5kZXggPT0gMSkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCQlpbnQgcGVyY2VudCA9IHBlcmNlbnRzW2luZGV4XTsKLQkJCQlDb2xvciBmb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCQkJCWludCB3aWR0aCA9IChjb2x1bW4yLmdldFdpZHRoKCkgLSAxKSAqIHBlcmNlbnQgLyAxMDA7Ci0JCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLCBldmVudC5oZWlnaHQsIHRydWUpOwkJCQkJCi0JCQkJUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCB3aWR0aC0xLCBldmVudC5oZWlnaHQtMSk7Ci0JCQkJZ2MuZHJhd1JlY3RhbmdsZShyZWN0Mik7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpKTsKLQkJCQlTdHJpbmcgdGV4dCA9IHBlcmNlbnQrIiUiOwotCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwkJCQkJCi0JCQkJaW50IG9mZnNldCA9IE1hdGgubWF4KDAsIChldmVudC5oZWlnaHQgLSBzaXplLnkpIC8gMik7Ci0JCQkJZ2MuZHJhd1RleHQodGV4dCwgZXZlbnQueCsyLCBldmVudC55K29mZnNldCwgdHJ1ZSk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGZvcmVncm91bmQpOwotCQkJfQotCQl9Ci0JfSk7CQkKLQkJCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OWJkN2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgYSBjdXN0b20gZ3JhZGllbnQgc2VsZWN0aW9uIGZvciB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI5IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJDdXN0b20gZ3JhZGllbnQgc2VsZWN0aW9uIGZvciBUYWJsZSIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlpbnQgY29sdW1uQ291bnQgPSAzOwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsJCi0JfQotCWludCBpdGVtQ291bnQgPSA4OwotCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Iml0ZW0gIitpKyIgYSIsICJpdGVtICIraSsiIGIiLCAiaXRlbSAiK2krIiBjIn0pOwotCX0JCQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuSE9UOwkKLQkJCWlmKChldmVudC5kZXRhaWwgJiBTV1QuU0VMRUNURUQpICE9IDApIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCVJlY3RhbmdsZSBhcmVhID0gdGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCS8qCi0JCQkJICogSWYgeW91IHdpc2ggdG8gcGFpbnQgdGhlIHNlbGVjdGlvbiBiZXlvbmQgdGhlIGVuZCBvZgotCQkJCSAqIGxhc3QgY29sdW1uLCB5b3UgbXVzdCBjaGFuZ2UgdGhlIGNsaXBwaW5nIHJlZ2lvbi4KLQkJCQkgKi8KLQkJCQlpbnQgY29sdW1uQ291bnQgPSB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOwotCQkJCWlmIChldmVudC5pbmRleCA9PSBjb2x1bW5Db3VudCAtIDEgfHwgY29sdW1uQ291bnQgPT0gMCkgewotCQkJCQlpbnQgd2lkdGggPSBhcmVhLnggKyBhcmVhLndpZHRoIC0gZXZlbnQueDsKLQkJCQkJaWYgKHdpZHRoID4gMCkgewotCQkJCQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJCQkJCWdjLmdldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQkJCQlyZWdpb24uYWRkKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLCBldmVudC5oZWlnaHQpOyAKLQkJCQkJCWdjLnNldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQkJCQlyZWdpb24uZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWdjLnNldEFkdmFuY2VkKHRydWUpOwotCQkJCWlmIChnYy5nZXRBZHZhbmNlZCgpKSBnYy5zZXRBbHBoYSgxMjcpOwkJCQkJCQkJCi0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBldmVudC5nZXRCb3VuZHMoKTsKLQkJCQlDb2xvciBmb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgwLCByZWN0LnksIDUwMCwgcmVjdC5oZWlnaHQsIGZhbHNlKTsKLQkJCQkvLyByZXN0b3JlIGNvbG9ycyBmb3Igc3Vic2VxdWVudCBkcmF3aW5nCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULlNFTEVDVEVEOwkJCQkJCi0JCQl9CQkJCQkJCi0JCX0KLQl9KTsJCQotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbihpKS5wYWNrKCk7Ci0JfQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24odGFibGUuZ2V0SXRlbSgwKSk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsJCi19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyMzY5MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmFja2VyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdHJhY2tlciAoZHJhZyBvbiBtb3VzZSBkb3duKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlUcmFja2VyIHRyYWNrZXIgPSBuZXcgVHJhY2tlciAoc2hlbGwsIFNXVC5OT05FKTsKLQkJCXRyYWNrZXIuc2V0UmVjdGFuZ2xlcyAobmV3IFJlY3RhbmdsZSBbXSB7Ci0JCQkJbmV3IFJlY3RhbmdsZSAoZS54LCBlLnksIDEwMCwgMTAwKSwKLQkJCX0pOwotCQkJdHJhY2tlci5vcGVuICgpOwotCQl9Ci0JfSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzNTQ4NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogZHJhdyBpbWFnZXMgb24gcmlnaHQgc2lkZSBvZiB0YWJsZSBpdGVtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzAgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIEltYWdlIGltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiSW1hZ2VzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBUYWJsZUl0ZW0iKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQgKCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwkJCQotCWludCBjb2x1bW5Db3VudCA9IDM7Ci0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwkKLQl9Ci0JaW50IGl0ZW1Db3VudCA9IDg7Ci0JZm9yKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaXRlbSAiK2krIiBhIiwgIml0ZW0gIitpKyIgYiIsICJpdGVtICIraSsiIGMifSk7Ci0JfQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsJCQotCQkJc3dpdGNoKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCQlldmVudC53aWR0aCArPSByZWN0LndpZHRoOwotCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIHJlY3QuaGVpZ2h0ICsgMik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QYWludEl0ZW06IHsKLQkJCQkJaW50IHggPSBldmVudC54ICsgZXZlbnQud2lkdGg7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQpIC8gMik7Ci0JCQkJCWV2ZW50LmdjLmRyYXdJbWFnZShpbWFnZSwgeCwgZXZlbnQueSArIG9mZnNldCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07CQkKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwkJCi0KLQlmb3IoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0JCi0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4NjNlYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgbXVsdGlwbGUgbGluZXMgaW4gYSB0YWJsZSBpdGVtCi0gKgotICogRm9yIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhpcyBzbmlwcGV0IHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLUN1c3RvbURyYXdpbmdUYWJsZUFuZFRyZWVJdGVtcy9jdXN0b21EcmF3Lmh0bSNfZXhhbXBsZTYKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjMxIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDQ7Ci0JZmluYWwgaW50IElURU1fQ09VTlQgPSA4OwotCWZpbmFsIGludCBURVhUX01BUkdJTiA9IDM7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IENPTFVNTl9DT1VOVDsgaSsrKSB7Ci0JCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IElURU1fQ09VTlQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBDT0xVTU5fQ09VTlQ7IGorKykgewotCQkJU3RyaW5nIHN0cmluZyA9ICJpdGVtICIgKyBpICsgIiBjb2wgIiArIGo7Ci0JCQlpZiAoKGkgKyBqKSAlIDMgPT0gMSkgewotCQkJCXN0cmluZyArPSJcbm5ldyBsaW5lMSI7Ci0JCQl9Ci0JCQlpZiAoKGkgKyBqKSAlIDMgPT0gMikgewotCQkJCXN0cmluZyArPSJcbm5ldyBsaW5lMVxubmV3IGxpbmUyIjsKLQkJCX0KLQkJCWl0ZW0uc2V0VGV4dChqLCBzdHJpbmcpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCQkJU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQoZXZlbnQuaW5kZXgpOwotCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LmdjLnRleHRFeHRlbnQodGV4dCk7Ci0JCQlldmVudC53aWR0aCA9IHNpemUueCArIDIgKiBURVhUX01BUkdJTjsKLQkJCWV2ZW50LmhlaWdodCA9IE1hdGgubWF4KGV2ZW50LmhlaWdodCwgc2l6ZS55ICsgVEVYVF9NQVJHSU4pOwotCQl9Ci0JfSk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuRk9SRUdST1VORDsKLQkJfQotCX0pOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCQkJU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQoZXZlbnQuaW5kZXgpOwotCQkJLyogY2VudGVyIGNvbHVtbiAxIHZlcnRpY2FsbHkgKi8KLQkJCWludCB5T2Zmc2V0ID0gMDsKLQkJCWlmIChldmVudC5pbmRleCA9PSAxKSB7Ci0JCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LmdjLnRleHRFeHRlbnQodGV4dCk7Ci0JCQkJeU9mZnNldCA9IE1hdGgubWF4KDAsIChldmVudC5oZWlnaHQgLSBzaXplLnkpIC8gMik7Ci0JCQl9Ci0JCQlldmVudC5nYy5kcmF3VGV4dCh0ZXh0LCBldmVudC54ICsgVEVYVF9NQVJHSU4sIGV2ZW50LnkgKyB5T2Zmc2V0LCB0cnVlKTsKLQkJfQotCX0pOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBDT0xVTU5fQ09VTlQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0KLQl0YWJsZS5wYWNrKCk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYjk5M2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogc2hvdyByZXN1bHRzIGFzIGEgYmFyIGNoYXJ0IGluIHRyZWUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzMiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7CQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU2hvdyByZXN1bHRzIGFzIGEgYmFyIGNoYXJ0IGluIFRyZWUiKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQljb2x1bW4xLnNldFRleHQoIkJ1ZyBTdGF0dXMiKTsKLQljb2x1bW4xLnNldFdpZHRoKDEwMCk7Ci0JZmluYWwgVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCWNvbHVtbjIuc2V0VGV4dCgiUGVyY2VudCIpOwotCWNvbHVtbjIuc2V0V2lkdGgoMjAwKTsKLQlTdHJpbmdbXSBzdGF0ZXMgPSBuZXcgU3RyaW5nW117IlJlc29sdmVkIiwgIk5ldyIsICJXb24ndCBGaXgiLCAiSW52YWxpZCJ9OwotCVN0cmluZ1tdIHRlYW1zID0gbmV3IFN0cmluZ1tdIHsiVUkiLCAiU1dUIiwgIk9TR0kifTsKLQlmb3IgKGludCBpPTA7IGk8dGVhbXMubGVuZ3RoOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCh0ZWFtc1tpXSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc3RhdGVzLmxlbmd0aDsgaisrKSB7Ci0JCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dChzdGF0ZXNbal0pOwkKLQkJfQotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCWludFtdIHBlcmNlbnRzID0gbmV3IGludFtdIHs1MCwgMzAsIDUsIDE1fTsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5pbmRleCA9PSAxKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCVRyZWVJdGVtIHBhcmVudCA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCQlpbnQgaW5kZXggPSBwYXJlbnQuaW5kZXhPZihpdGVtKTsKLQkJCQkJaW50IHBlcmNlbnQgPSBwZXJjZW50c1tpbmRleF07Ci0JCQkJCUNvbG9yIGZvcmVncm91bmQgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQkJCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JCQkJCWludCB3aWR0aCA9IChjb2x1bW4yLmdldFdpZHRoKCkgLSAxKSAqIHBlcmNlbnQgLyAxMDA7Ci0JCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCB3aWR0aCwgZXZlbnQuaGVpZ2h0LCB0cnVlKTsJCQkJCQotCQkJCQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLTEsIGV2ZW50LmhlaWdodC0xKTsKLQkJCQkJZ2MuZHJhd1JlY3RhbmdsZShyZWN0Mik7Ci0JCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gcGVyY2VudCsiJSI7Ci0JCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwkJCQkJCi0JCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gc2l6ZS55KSAvIDIpOwotCQkJCQlnYy5kcmF3VGV4dCh0ZXh0LCBldmVudC54KzIsIGV2ZW50Lnkrb2Zmc2V0LCB0cnVlKTsKLQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCQkJZ2Muc2V0QmFja2dyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsJCQotCQkJCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwNDEyZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgZGlhbG9nIHNoZWxsIGFuZCBwb3NpdGlvbiBpdAotICogd2l0aCB1cHBlciBsZWZ0IGNvcm5lciBhdCBjdXJzb3IgcG9zaXRpb24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjMzIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCAoIlBhcmVudCBTaGVsbCIpOwotCQlzaGVsbC5hZGRNb3VzZUxpc3RlbmVyIChuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duIChNb3VzZUV2ZW50IGUpIHsKLQkJCQlTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQkJCVBvaW50IHB0ID0gZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbiAoKTsKLQkJCQlkaWFsb2cuc2V0TG9jYXRpb24gKHB0LngsIHB0LnkpOwotCQkJCWRpYWxvZy5zZXRUZXh0ICgiRGlhbG9nIFNoZWxsIik7Ci0JCQkJZGlhbG9nLnNldFNpemUgKDEwMCwgMTAwKTsKLQkJCQlkaWFsb2cub3BlbiAoKTsgCi0JCQl9fSk7Ci0JCXNoZWxsLnNldFNpemUgKDQwMCwgNDAwKTsKLQkJc2hlbGwub3BlbiAoKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NTM5YWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogRml4ZWQgZmlyc3QgY29sdW1uIGFuZCBob3Jpem9udGFsIHNjcm9sbCByZW1haW5pbmcgY29sdW1ucwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjM0IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWludCByb3dDb3VudCA9IDQwOwotCWludCBjb2x1bW5Db3VudCA9IDE1OwotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5CT1JERVIpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQlmaW5hbCBUYWJsZSBsZWZ0VGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCWxlZnRUYWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkZJTEwsIGZhbHNlLCB0cnVlKSk7Ci0JbGVmdFRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JZmluYWwgVGFibGUgcmlnaHRUYWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JcmlnaHRUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCUdyaWREYXRhIHRhYmxlMkRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAyKTsKLQlyaWdodFRhYmxlLnNldExheW91dERhdGEodGFibGUyRGF0YSk7Ci0JLy8gQ3JlYXRlIGNvbHVtbnMKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKGxlZnRUYWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0VGV4dCgiTmFtZSIpOwotCWNvbHVtbjEuc2V0V2lkdGgoMTUwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHJpZ2h0VGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIlZhbHVlICIraSk7Ci0JCWNvbHVtbi5zZXRXaWR0aCgyMDApOwotCX0KLQkvLyBDcmVhdGUgcm93cwotCWZvciAoaW50IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0obGVmdFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShyaWdodFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewotCQkJaXRlbS5zZXRUZXh0KGosICJJdGVtICIraSsiIHZhbHVlIEAgIitqKTsKLQkJfQotCX0KLQkvLyBNYWtlIHNlbGVjdGlvbiB0aGUgc2FtZSBpbiBib3RoIHRhYmxlcwotCWxlZnRUYWJsZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlyaWdodFRhYmxlLnNldFNlbGVjdGlvbihsZWZ0VGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkJfQotCX0pOwotCXJpZ2h0VGFibGUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJbGVmdFRhYmxlLnNldFNlbGVjdGlvbihyaWdodFRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCX0KLQl9KTsKLQkvLyBPbiBXaW5kb3dzLCB0aGUgc2VsZWN0aW9uIGlzIGdyYXkgaWYgdGhlIHRhYmxlIGRvZXMgbm90IGhhdmUgZm9jdXMuCi0JLy8gVG8gbWFrZSBib3RoIHRhYmxlcyBhcHBlYXIgaW4gZm9jdXMsIGRyYXcgdGhlIHNlbGVjdGlvbiBiYWNrZ3JvdW5kIGhlcmUuCi0JLy8gVGhpcyBwYXJ0IG9ubHkgd29ya3Mgb24gdmVyc2lvbiAzLjIgb3IgbGF0ZXIuCi0JTGlzdGVuZXIgZXJhc2VMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkhPVDsKLQkJCWlmKChldmVudC5kZXRhaWwgJiBTV1QuU0VMRUNURUQpICE9IDApIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCVJlY3RhbmdsZSByZWN0ID0gZXZlbnQuZ2V0Qm91bmRzKCk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhUKSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTikpOwotCQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdCk7Ci0JCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuU0VMRUNURUQ7CQkJCQkKLQkJCX0KLQkJfQotCX07Ci0JCi0JbGVmdFRhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIGVyYXNlTGlzdGVuZXIpOwotCXJpZ2h0VGFibGUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgZXJhc2VMaXN0ZW5lcik7Ci0JLy8gTWFrZSB2ZXJ0aWNhbCBzY3JvbGxiYXJzIHNjcm9sbCB0b2dldGhlcgotCVNjcm9sbEJhciB2QmFyTGVmdCA9IGxlZnRUYWJsZS5nZXRWZXJ0aWNhbEJhcigpOwotCXZCYXJMZWZ0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXJpZ2h0VGFibGUuc2V0VG9wSW5kZXgobGVmdFRhYmxlLmdldFRvcEluZGV4KCkpOwotCQl9Ci0JfSk7Ci0JU2Nyb2xsQmFyIHZCYXJSaWdodCA9IHJpZ2h0VGFibGUuZ2V0VmVydGljYWxCYXIoKTsKLQl2QmFyUmlnaHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJbGVmdFRhYmxlLnNldFRvcEluZGV4KHJpZ2h0VGFibGUuZ2V0VG9wSW5kZXgoKSk7Ci0JCX0KLQl9KTsKLQkvLyBIb3Jpem9udGFsIGJhciBvbiBzZWNvbmQgdGFibGUgdGFrZXMgdXAgYSBsaXR0bGUgZXh0cmEgc3BhY2UuCi0JLy8gVG8ga2VlcCB2ZXJ0aWNhbCBzY3JvbGwgYmFycyBpbiBzaW5rLCBmb3JjZSB0YWJsZTEgdG8gZW5kIGFib3ZlCi0JLy8gaG9yaXpvbnRhbCBzY3JvbGxiYXIKLQlTY3JvbGxCYXIgaEJhclJpZ2h0ID0gcmlnaHRUYWJsZS5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCUdyaWREYXRhIHNwYWNlckRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlzcGFjZXJEYXRhLmhlaWdodEhpbnQgPSBoQmFyUmlnaHQuZ2V0U2l6ZSgpLnk7Ci0Jc3BhY2VyLnNldFZpc2libGUoZmFsc2UpOwotCXBhcmVudC5zZXRCYWNrZ3JvdW5kKGxlZnRUYWJsZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQotCXNoZWxsLnNldFNpemUoNjAwLCA0MDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3YTU5Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgYSBzeXN0ZW0gc2V0dGluZ3MgY2hhbmdlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzUgewotCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJUaGUgU1dULlNldHRpbmdzIEV2ZW50Iik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuV1JBUCk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JbGFiZWwuc2V0VGV4dCgiQ2hhbmdlIGEgc3lzdGVtIHNldHRpbmcgYW5kIHRoZSB0YWJsZSBiZWxvdyB3aWxsIGJlIHVwZGF0ZWQuIik7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbi5zZXRXaWR0aCgxNTApOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sb3JJZHMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihjb2xvcklkc1tpXSk7Ci0JCWl0ZW0uc2V0VGV4dCgwLCBjb2xvck5hbWVzW2ldKTsKLQkJaXRlbS5zZXRCYWNrZ3JvdW5kKDEsIGNvbG9yKTsKLQkJaXRlbS5zZXRUZXh0KDIsIGNvbG9yLnRvU3RyaW5nKCkpOwotCX0KLQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JY29sdW1uc1swXS5wYWNrKCk7Ci0JY29sdW1uc1syXS5wYWNrKCk7Ci0JZGlzcGxheS5hZGRMaXN0ZW5lcihTV1QuU2V0dGluZ3MsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sb3JJZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoY29sb3JJZHNbaV0pOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbShpKTsKLQkJCQlpdGVtLnNldEJhY2tncm91bmQoMSwgY29sb3IpOwotCQkJfQotCQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQkJY29sdW1uc1swXS5wYWNrKCk7Ci0JCQljb2x1bW5zWzJdLnBhY2soKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotc3RhdGljIGludFtdIGNvbG9ySWRzID0gbmV3IGludFtdIHtTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5ELCAKLQkJU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCwgCi0JCVNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQsCi0JCVNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQsCi0JCVNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTiwKLQkJU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQsCi0JCVNXVC5DT0xPUl9USVRMRV9CQUNLR1JPVU5ELAotCQlTV1QuQ09MT1JfVElUTEVfQkFDS0dST1VORF9HUkFESUVOVCwKLQkJU1dULkNPTE9SX1RJVExFX0ZPUkVHUk9VTkQsCi0JCVNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9CQUNLR1JPVU5ELAotCQlTV1QuQ09MT1JfVElUTEVfSU5BQ1RJVkVfQkFDS0dST1VORF9HUkFESUVOVCwKLQkJU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0ZPUkVHUk9VTkQsCi0JCVNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCwKLQkJU1dULkNPTE9SX1dJREdFVF9CT1JERVIsCi0JCVNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1csCi0JCVNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCwKLQkJU1dULkNPTE9SX1dJREdFVF9ISUdITElHSFRfU0hBRE9XLAotCQlTV1QuQ09MT1JfV0lER0VUX0xJR0hUX1NIQURPVywKLQkJU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XLH07Ci1zdGF0aWMgU3RyaW5nIFtdIGNvbG9yTmFtZXMgPSBuZXcgU3RyaW5nW10geyJTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQiLCAKLQkJIlNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQiLAotCQkiU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCIsCi0JCSJTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04iLAotCQkiU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQiLAotCQkiU1dULkNPTE9SX1RJVExFX0JBQ0tHUk9VTkQiLAotCQkiU1dULkNPTE9SX1RJVExFX0JBQ0tHUk9VTkRfR1JBRElFTlQiLAotCQkiU1dULkNPTE9SX1RJVExFX0ZPUkVHUk9VTkQiLAotCQkiU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0JBQ0tHUk9VTkQiLAotCQkiU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0JBQ0tHUk9VTkRfR1JBRElFTlQiLAotCQkiU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0ZPUkVHUk9VTkQiLAotCQkiU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfQk9SREVSIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1ciLAotCQkiU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfSElHSExJR0hUX1NIQURPVyIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX0xJR0hUX1NIQURPVyIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1ciLH07Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjU3ZWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBkcmF3IGRpZmZlcmVudCBmb3JlZ3JvdW5kIGNvbG9ycyBmb3IgdGV4dCBpbiBhIFRhYmxlSXRlbS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJUYWJsZTogQ2hhbmdlIHN0eWxlIG11bHRpcGxlIHRpbWVzIGluIGNlbGwiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZvcihpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsJCQkKLQl9Ci0JZmluYWwgVGV4dExheW91dCB0ZXh0TGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JdGV4dExheW91dC5zZXRUZXh0KCJTV1Q6IFN0YW5kYXJkIFdpZGdldCBUb29sa2l0Iik7Ci0JRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksICJUYWhvbWEiLCAxNCwgU1dULkJPTEQpOwotCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMTAsIFNXVC5OT1JNQUwpOwotCUZvbnQgZm9udDMgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMTQsIFNXVC5JVEFMSUMpOwotCVRleHRTdHlsZSBzdHlsZTEgPSBuZXcgVGV4dFN0eWxlKGZvbnQxLCBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSwgbnVsbCk7Ci0JVGV4dFN0eWxlIHN0eWxlMiA9IG5ldyBUZXh0U3R5bGUoZm9udDIsIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX01BR0VOVEEpLCBudWxsKTsKLQlUZXh0U3R5bGUgc3R5bGUzID0gbmV3IFRleHRTdHlsZShmb250MywgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSwgbnVsbCk7Ci0JdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTEsIDAsIDApOyB0ZXh0TGF5b3V0LnNldFN0eWxlKHN0eWxlMSwgNSwgMTIpOwotCXRleHRMYXlvdXQuc2V0U3R5bGUoc3R5bGUyLCAxLCAxKTsgdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTIsIDE0LCAxOSk7Ci0JdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTMsIDIsIDIpOyB0ZXh0TGF5b3V0LnNldFN0eWxlKHN0eWxlMywgMjEsIDI3KTsKLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJdGV4dExheW91dC5kcmF3KGV2ZW50LmdjLCBldmVudC54LCBldmVudC55KTsKLQkJfQotCX0pOwotCWZpbmFsIFJlY3RhbmdsZSB0ZXh0TGF5b3V0Qm91bmRzID0gdGV4dExheW91dC5nZXRCb3VuZHMoKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZS53aWR0aCA9IHRleHRMYXlvdXRCb3VuZHMud2lkdGggKyAyOwotCQkJZS5oZWlnaHQgPSB0ZXh0TGF5b3V0Qm91bmRzLmhlaWdodCArIDI7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlmb250MS5kaXNwb3NlKCk7Ci0JZm9udDIuZGlzcG9zZSgpOwotCWZvbnQzLmRpc3Bvc2UoKTsKLQl0ZXh0TGF5b3V0LmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4MjNmNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBDb21wb3NpdGUgU25pcHBldDogaW5oZXJpdCBhIGJhY2tncm91bmQgY29sb3Igb3IgaW1hZ2UKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kTW9kZSgpIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCi0JQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9DWUFOKTsKLQkKLQlHcm91cCBncm91cCA9IG5ldyBHcm91cChzaGVsbCwgU1dULk5PTkUpOwotCWdyb3VwLnNldFRleHQoIlNXVC5JTkhFUklUX05PTkUiKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kTW9kZShTV1QuSU5IRVJJVF9OT05FKTsKLQljcmVhdGVDaGlsZHJlbihncm91cCk7Ci0JCi0JZ3JvdXAgPSBuZXcgR3JvdXAoc2hlbGwsIFNXVC5OT05FKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlncm91cC5zZXRUZXh0KCJTV1QuSU5IRVJJVF9ERUZBVUxUIik7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZE1vZGUoU1dULklOSEVSSVRfREVGQVVMVCk7Ci0JY3JlYXRlQ2hpbGRyZW4oZ3JvdXApOwotCQotCWdyb3VwID0gbmV3IEdyb3VwKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JZ3JvdXAuc2V0VGV4dCgiU1dULklOSEVSSVRfRk9SQ0UiKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kTW9kZShTV1QuSU5IRVJJVF9GT1JDRSk7Ci0JY3JlYXRlQ2hpbGRyZW4oZ3JvdXApOwotCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXN0YXRpYyB2b2lkIGNyZWF0ZUNoaWxkcmVuKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQlsaXN0LmFkZCgiTGlzdCBpdGVtIDEiKTsKLQlsaXN0LmFkZCgiTGlzdCBpdGVtIDIiKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJMYWJlbCIpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLQlidXR0b24uc2V0VGV4dCgiUmFkaW8gQnV0dG9uIik7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYnV0dG9uLnNldFRleHQoIkNoZWNrIGJveCBCdXR0b24iKTsKLQlidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJQdXNoIEJ1dHRvbiIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRUZXh0KCJUZXh0Iik7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNmNlMDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgcG9wdXAgbWVudSB3aXRoIGEgc3VibWVudQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljb21wb3NpdGUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JTWVudUl0ZW0gaXRlbTEgPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtMS5zZXRUZXh0ICgiUHVzaCBJdGVtIik7Ci0JTWVudUl0ZW0gaXRlbTIgPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlpdGVtMi5zZXRUZXh0ICgiQ2FzY2FkZSBJdGVtIik7Ci0JTWVudSBzdWJNZW51ID0gbmV3IE1lbnUgKG1lbnUpOwotCWl0ZW0yLnNldE1lbnUgKHN1Yk1lbnUpOwotCU1lbnVJdGVtIHN1Ykl0ZW0xID0gbmV3IE1lbnVJdGVtIChzdWJNZW51LCBTV1QuUFVTSCk7Ci0Jc3ViSXRlbTEuc2V0VGV4dCAoIlN1Yml0ZW0gMSIpOwotCU1lbnVJdGVtIHN1Ykl0ZW0yID0gbmV3IE1lbnVJdGVtIChzdWJNZW51LCBTV1QuUFVTSCk7Ci0Jc3ViSXRlbTIuc2V0VGV4dCAoIlN1Yml0ZW0gMiIpOwotCWNvbXBvc2l0ZS5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDczMmUyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVGFibGUgc25pcHBldDogbWFrZSB0ZXh0IHNwYW4gbXVsdGlwbGUgY29sdW1ucwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjM5IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiVGV4dCBzcGFucyB0d28gY29sdW1ucyBpbiBhIFRhYmxlSXRlbSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlpbnQgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsJCi0JfQotCWludCBpdGVtQ291bnQgPSA4OwotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgwLCAiaXRlbSAiK2krIiBhIik7Ci0JCWl0ZW0uc2V0VGV4dCgzLCAiaXRlbSAiK2krIiBkIik7Ci0JfQkKLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCWZpbmFsIFN0cmluZyBzdHJpbmcgPSAidGV4dCB0aGF0IHNwYW5zIHR3byBjb2x1bW5zIjsKLQlHQyBnYyA9IG5ldyBHQyh0YWJsZSk7Ci0JZmluYWwgUG9pbnQgZXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZyk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaChldmVudC50eXBlKSB7CQkKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlldmVudC53aWR0aCA9IGV4dGVudC54LzI7Ci0JCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIGV4dGVudC55ICsgMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBhaW50SXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gMDsKLQkJCQkJCWlmIChldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IHRhYmxlLmdldENvbHVtbigxKTsKLQkJCQkJCQlvZmZzZXQgPSBjb2x1bW4xLmdldFdpZHRoKCk7Ci0JCQkJCQl9Ci0JCQkJCQlldmVudC5nYy5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JCQkJCQlpbnQgeSA9IGV2ZW50LnkgKyAoZXZlbnQuaGVpZ2h0IC0gZXh0ZW50LnkpLzI7Ci0JCQkJCQlldmVudC5nYy5kcmF3U3RyaW5nKHN0cmluZywgZXZlbnQueCAtIG9mZnNldCwgeSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0KLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNDRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBDUiBpbiBhIHRleHQgb3IgY29tYm8gY29udHJvbCAoZGVmYXVsdCBzZWxlY3Rpb24pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY29tYm8uc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJBLTEiLCAiQi0xIiwgIkMtMSJ9KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQgKCJzb21lIHRleHQiKTsKLQljb21iby5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKGUud2lkZ2V0ICsgIiAtIERlZmF1bHQgU2VsZWN0aW9uIik7Ci0JCX0KLQl9KTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoZS53aWRnZXQgKyAiIC0gRGVmYXVsdCBTZWxlY3Rpb24iKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThhMWI0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRyZWUgc25pcHBldDogVGV4dCB0aGF0IHNwYW5zIG11bHRpcGxlIGNvbHVtbnMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiVGV4dCBzcGFucyB0d28gY29sdW1ucyBpbiBhIFRyZWVJdGVtIik7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JaW50IGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7CQotCX0KLQlpbnQgaXRlbUNvdW50ID0gODsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoMCwgIml0ZW0gIitpKyIgYSIpOwotCQlpdGVtLnNldFRleHQoMywgIml0ZW0gIitpKyIgZCIpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgewotCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQlzdWJJdGVtLnNldFRleHQoMCwgInN1Ykl0ZW0gIitpKyItIitqKyIgYSIpOwotCQkJc3ViSXRlbS5zZXRUZXh0KDMsICJzdWJJdGVtICIraSsiLSIraisiIGQiKTsKLQkJfQotCX0JCi0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQlmaW5hbCBTdHJpbmcgc3RyaW5nID0gInRleHQgdGhhdCBzcGFucyB0d28gY29sdW1ucyI7Ci0JR0MgZ2MgPSBuZXcgR0ModHJlZSk7Ci0JZmluYWwgUG9pbnQgZXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZyk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaChldmVudC50eXBlKSB7CQkKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlldmVudC53aWR0aCA9IGV4dGVudC54LzI7Ci0JCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIGV4dGVudC55ICsgMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBhaW50SXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gMDsKLQkJCQkJCWlmIChldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQkJVHJlZUNvbHVtbiBjb2x1bW4xID0gdHJlZS5nZXRDb2x1bW4oMSk7Ci0JCQkJCQkJb2Zmc2V0ID0gY29sdW1uMS5nZXRXaWR0aCgpOwotCQkJCQkJfQotCQkJCQkJZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZChyZWQpOwotCQkJCQkJaW50IHkgPSBldmVudC55ICsgKGV2ZW50LmhlaWdodCAtIGV4dGVudC55KS8yOwotCQkJCQkJZXZlbnQuZ2MuZHJhd1N0cmluZyhzdHJpbmcsIGV2ZW50LnggLSBvZmZzZXQsIHksIHRydWUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgcGFpbnRMaXN0ZW5lcik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyNjI3My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRleHQgc25pcHBldDogb3ZlcnJpZGUgVGFiIGJlaGF2aW9yIHRvIHRyYXZlcnNlIG91dCBvZiBhIHRleHQgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsMTAsMjAwLDIwMCk7Ci0JVGV4dCB0ZXh0MSA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JdGV4dDEuc2V0Qm91bmRzKDEwLDEwLDE1MCw1MCk7Ci0JdGV4dDEuc2V0VGV4dCgiVGFiIHdpbGwgdHJhdmVyc2Ugb3V0IGZyb20gaGVyZS4iKTsKLQl0ZXh0MS5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpIHsKLQkJCQllLmRvaXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfSk7Ci0JVGV4dCB0ZXh0MiA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JdGV4dDIuc2V0Qm91bmRzKDEwLDEwMCwxNTAsNTApOwotCXRleHQyLnNldFRleHQoIkJ1dCBUYWIgd2lsbCBOT1QgdHJhdmVyc2Ugb3V0IGZyb20gaGVyZSAoQ3RybCtUYWIgd2lsbCkuIik7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0MjczYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIEN1cnNvciBzbmlwcGV0OiBIaWRlIHRoZSBDdXJzb3Igb3ZlciBhIGNvbnRyb2wuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljYW52YXMuc2V0Qm91bmRzKDEwLDUwLDE1MCwxMDApOwotCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQllLmdjLmRyYXdTdHJpbmcoImhpZGUgQ3Vyc29yIGhlcmUiLCAxMCwgMTApOwotCQl9Ci0JfSk7Ci0KLQkvLyBjcmVhdGUgYSBjdXJzb3Igd2l0aCBhIHRyYW5zcGFyZW50IGltYWdlCi0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCIFtdIHt3aGl0ZS5nZXRSR0IoKSwgYmxhY2suZ2V0UkdCKCl9KTsKLQlJbWFnZURhdGEgc291cmNlRGF0YSA9IG5ldyBJbWFnZURhdGEgKDE2LCAxNiwgMSwgcGFsZXR0ZSk7Ci0Jc291cmNlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gMDsKLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBzb3VyY2VEYXRhLCAwLCAwKTsKLQotCXNoZWxsLm9wZW4oKTsKLQljYW52YXMuc2V0Q3Vyc29yKGN1cnNvcik7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjQyZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUZXh0IHNuaXBwZXQ6IHR5cGUgaW4gb25lIHRleHQsIG91dHB1dCB0byBhbm90aGVyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRleHQgdGV4dDAgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWZpbmFsIFRleHQgdGV4dDEgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXRleHQwLmFkZFZlcmlmeUxpc3RlbmVyIChuZXcgVmVyaWZ5TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0IChWZXJpZnlFdmVudCBldmVudCkgewotCQkJdGV4dDEuc2V0VG9wSW5kZXggKHRleHQwLmdldFRvcEluZGV4ICgpKTsKLQkJCXRleHQxLnNldFNlbGVjdGlvbiAoZXZlbnQuc3RhcnQsIGV2ZW50LmVuZCk7Ci0JCQl0ZXh0MS5pbnNlcnQgKGV2ZW50LnRleHQpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTdkZmU5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogU3R5bGVkVGV4dCBzbmlwcGV0OiBEcmF3IGEgYm94IGFyb3VuZCB0ZXh0LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQ0IHsKLQlzdGF0aWMgU3RyaW5nIFNFQVJDSF9TVFJJTkcgPSAiYm94IjsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgICAgIGZpbmFsIENvbG9yIFJFRCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgICAgICBzaGVsbC5zZXRCb3VuZHMoMTAsMTAsMjUwLDI1MCk7Ci0gICAgICAgIGZpbmFsIFN0eWxlZFRleHQgdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRleHQuc2V0Qm91bmRzKDEwLDEwLDIwMCwyMDApOwotICAgICAgICB0ZXh0LmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgY29udGVudHMgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlpbnQgc3RyaW5nV2lkdGggPSBldmVudC5nYy5zdHJpbmdFeHRlbnQoU0VBUkNIX1NUUklORykueDsKLQkJCQlpbnQgbGluZUhlaWdodCA9IHRleHQuZ2V0TGluZUhlaWdodCgpOwotCQkJCWV2ZW50LmdjLnNldEZvcmVncm91bmQoUkVEKTsKLQkJCQlpbnQgaW5kZXggPSBjb250ZW50cy5pbmRleE9mKFNFQVJDSF9TVFJJTkcpOwotCQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCQlQb2ludCB0b3BMZWZ0ID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KGluZGV4KTsKLQkJCQkJZXZlbnQuZ2MuZHJhd1JlY3RhbmdsZSh0b3BMZWZ0LnggLSAxLCB0b3BMZWZ0LnksIHN0cmluZ1dpZHRoICsgMSwgbGluZUhlaWdodCAtIDEpOwotCQkJCQlpbmRleCA9IGNvbnRlbnRzLmluZGV4T2YoU0VBUkNIX1NUUklORywgaW5kZXggKyAxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotICAgICAgICB0ZXh0LnNldFRleHQoIlRoaXMgZGVtb25zdHJhdGVzIGRyYXdpbmcgYSBib3hcbmFyb3VuZCBldmVyeSBvY2N1cnJlbmNlIG9mIHRoZSB3b3JkXG5ib3ggaW4gdGhlIFN0eWxlZFRleHQiKTsKLSAgICAgICAgc2hlbGwub3BlbigpOwotICAgICAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGI4NDI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogQ2FudmFzIHNuaXBwZXQ6IHBhaW50IGEgY2lyY2xlIGluIGEgY2FudmFzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQ1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEoKTsKLQkJCWV2ZW50LmdjLmRyYXdPdmFsKDAsIDAsIHJlY3Qud2lkdGggLSAxLCByZWN0LmhlaWdodCAtIDEpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTE4NmI3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBXcml0ZSBhbiBJbWFnZSB0byBhIFBORyBmaWxlLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDYgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiQ29taWMgU2FucyBNUyIsIDI0LCBTV1QuQk9MRCk7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDg3LCA0OCk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlLmdldEJvdW5kcygpKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJZ2MuZHJhd1N0cmluZygiUyIsIDMsIDApOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JCWdjLmRyYXdTdHJpbmcoIlciLCAyNSwgMCk7Ci0JCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQlnYy5kcmF3U3RyaW5nKCJUIiwgNjIsIDApOwotCQlnYy5kaXNwb3NlKCk7Ci0KLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHtpbWFnZS5nZXRJbWFnZURhdGEoKX07Ci0JCWxvYWRlci5zYXZlKCJzd3QucG5nIiwgU1dULklNQUdFX1BORyk7Ci0KLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDA1MDBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogYWxsb3cgYSBtdWx0aS1saW5lIHRleHQgdG8gcHJvY2VzcyB0aGUgZGVmYXVsdCBidXR0b24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0NyB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCVN0cmluZyBtb2RpZmllciA9IFNXVC5NT0QxID09IFNXVC5DVFJMID8gIkN0cmwiIDogIkNvbW1hbmQiOwotCXRleHQuc2V0VGV4dCgiSGl0ICIgKyBtb2RpZmllciArICIrUmV0dXJuXG50byBzZWVcbnRoZSBkZWZhdWx0IGJ1dHRvblxucnVuIik7Ci0JdGV4dC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5NT0QxKSAhPSAwKSBlLmRvaXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnBhY2soKTsKLQlidXR0b24uc2V0VGV4dCgiT0siKTsKLQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9LIHNlbGVjdGVkIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uKGJ1dHRvbik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5MGFiZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBhbGxvdyBlc2NhcGUgdG8gY2xvc2UgYSBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDggewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCQlldmVudC5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0pOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiQSBCdXR0b24gKHRoYXQgZG9lc24ndCBwcm9jZXNzIEVzY2FwZSkiKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjRhYjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFN0YWNrTGF5b3V0IGV4YW1wbGUgc25pcHBldDogdXNlIGEgU3RhY2tMYXlvdXQgdG8gc3dpdGNoIGJldHdlZW4gQ29tcG9zaXRlcy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0OSB7Ci0KLQlzdGF0aWMgaW50IHBhZ2VOdW0gPSAtMTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcyAoMTAsIDEwLCAzMDAsIDIwMCk7Ci0JLy8gY3JlYXRlIHRoZSBjb21wb3NpdGUgdGhhdCB0aGUgcGFnZXMgd2lsbCBzaGFyZQotCWZpbmFsIENvbXBvc2l0ZSBjb250ZW50UGFuZWwgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JY29udGVudFBhbmVsLnNldEJvdW5kcyAoMTAwLCAxMCwgMTkwLCA5MCk7Ci0JZmluYWwgU3RhY2tMYXlvdXQgbGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0ICgpOwotCWNvbnRlbnRQYW5lbC5zZXRMYXlvdXQgKGxheW91dCk7Ci0KLQkvLyBjcmVhdGUgdGhlIGZpcnN0IHBhZ2UncyBjb250ZW50Ci0JZmluYWwgQ29tcG9zaXRlIHBhZ2UwID0gbmV3IENvbXBvc2l0ZSAoY29udGVudFBhbmVsLCBTV1QuTk9ORSk7Ci0JcGFnZTAuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAocGFnZTAsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiTGFiZWwgb24gcGFnZSAxIik7Ci0JbGFiZWwucGFjayAoKTsKLQotCS8vIGNyZWF0ZSB0aGUgc2Vjb25kIHBhZ2UncyBjb250ZW50CQotCWZpbmFsIENvbXBvc2l0ZSBwYWdlMSA9IG5ldyBDb21wb3NpdGUgKGNvbnRlbnRQYW5lbCwgU1dULk5PTkUpOwotCXBhZ2UxLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHBhZ2UxLCBTV1QuTk9ORSk7Ci0JYnV0dG9uLnNldFRleHQgKCJCdXR0b24gb24gcGFnZSAyIik7Ci0JYnV0dG9uLnBhY2sgKCk7Ci0KLQkvLyBjcmVhdGUgdGhlIGJ1dHRvbiB0aGF0IHdpbGwgc3dpdGNoIGJldHdlZW4gdGhlIHBhZ2VzCi0JQnV0dG9uIHBhZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCXBhZ2VCdXR0b24uc2V0VGV4dCAoIlB1c2giKTsKLQlwYWdlQnV0dG9uLnNldEJvdW5kcyAoMTAsIDEwLCA4MCwgMjUpOwotCXBhZ2VCdXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcGFnZU51bSA9ICsrcGFnZU51bSAlIDI7Ci0JCQlsYXlvdXQudG9wQ29udHJvbCA9IHBhZ2VOdW0gPT0gMCA/IHBhZ2UwIDogcGFnZTE7Ci0JCQljb250ZW50UGFuZWwubGF5b3V0ICgpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiYzdlMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBrZXkgc3RhdGUsIGNvZGUgYW5kIGNoYXJhY3RlcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjUgewotCi1zdGF0aWMgU3RyaW5nIHN0YXRlTWFzayAoaW50IHN0YXRlTWFzaykgewotCVN0cmluZyBzdHJpbmcgPSAiIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5DVFJMKSAhPSAwKSBzdHJpbmcgKz0gIiBDVFJMIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5BTFQpICE9IDApIHN0cmluZyArPSAiIEFMVCI7Ci0JaWYgKChzdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApIHN0cmluZyArPSAiIFNISUZUIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5DT01NQU5EKSAhPSAwKSBzdHJpbmcgKz0gIiBDT01NQU5EIjsKLQlyZXR1cm4gc3RyaW5nOwotfQotCi1zdGF0aWMgU3RyaW5nIGNoYXJhY3RlciAoY2hhciBjaGFyYWN0ZXIpIHsKLQlzd2l0Y2ggKGNoYXJhY3RlcikgewotCQljYXNlIDA6IAkJcmV0dXJuICInXFwwJyI7Ci0JCWNhc2UgU1dULkJTOglyZXR1cm4gIidcXGInIjsKLQkJY2FzZSBTV1QuQ1I6CXJldHVybiAiJ1xcciciOwotCQljYXNlIFNXVC5ERUw6CXJldHVybiAiREVMIjsKLQkJY2FzZSBTV1QuRVNDOglyZXR1cm4gIkVTQyI7Ci0JCWNhc2UgU1dULkxGOglyZXR1cm4gIidcXG4nIjsKLQkJY2FzZSBTV1QuVEFCOglyZXR1cm4gIidcXHQnIjsKLQl9Ci0JcmV0dXJuICInIiArIGNoYXJhY3RlciArIiciOwotfQotCi1zdGF0aWMgU3RyaW5nIGtleUNvZGUgKGludCBrZXlDb2RlKSB7Ci0Jc3dpdGNoIChrZXlDb2RlKSB7Ci0JCQotCQkvKiBLZXlib2FyZCBhbmQgTW91c2UgTWFza3MgKi8KLQkJY2FzZSBTV1QuQUxUOiAJCXJldHVybiAiQUxUIjsKLQkJY2FzZSBTV1QuU0hJRlQ6IAlyZXR1cm4gIlNISUZUIjsKLQkJY2FzZSBTV1QuQ09OVFJPTDoJcmV0dXJuICJDT05UUk9MIjsKLQkJY2FzZSBTV1QuQ09NTUFORDoJcmV0dXJuICJDT01NQU5EIjsKLQkJCQotCQkvKiBOb24tTnVtZXJpYyBLZXlwYWQgS2V5cyAqLwotCQljYXNlIFNXVC5BUlJPV19VUDoJCXJldHVybiAiQVJST1dfVVAiOwotCQljYXNlIFNXVC5BUlJPV19ET1dOOglyZXR1cm4gIkFSUk9XX0RPV04iOwotCQljYXNlIFNXVC5BUlJPV19MRUZUOglyZXR1cm4gIkFSUk9XX0xFRlQiOwotCQljYXNlIFNXVC5BUlJPV19SSUdIVDoJcmV0dXJuICJBUlJPV19SSUdIVCI7Ci0JCWNhc2UgU1dULlBBR0VfVVA6CQlyZXR1cm4gIlBBR0VfVVAiOwotCQljYXNlIFNXVC5QQUdFX0RPV046CQlyZXR1cm4gIlBBR0VfRE9XTiI7Ci0JCWNhc2UgU1dULkhPTUU6CQkJcmV0dXJuICJIT01FIjsKLQkJY2FzZSBTV1QuRU5EOgkJCXJldHVybiAiRU5EIjsKLQkJY2FzZSBTV1QuSU5TRVJUOgkJcmV0dXJuICJJTlNFUlQiOwotCi0JCS8qIFZpcnR1YWwgYW5kIEFzY2lpIEtleXMgKi8KLQkJY2FzZSBTV1QuQlM6CXJldHVybiAiQlMiOwotCQljYXNlIFNXVC5DUjoJcmV0dXJuICJDUiI7CQkKLQkJY2FzZSBTV1QuREVMOglyZXR1cm4gIkRFTCI7Ci0JCWNhc2UgU1dULkVTQzoJcmV0dXJuICJFU0MiOwotCQljYXNlIFNXVC5MRjoJcmV0dXJuICJMRiI7Ci0JCWNhc2UgU1dULlRBQjoJcmV0dXJuICJUQUIiOwotCQotCQkvKiBGdW5jdGlvbnMgS2V5cyAqLwotCQljYXNlIFNXVC5GMToJcmV0dXJuICJGMSI7Ci0JCWNhc2UgU1dULkYyOglyZXR1cm4gIkYyIjsKLQkJY2FzZSBTV1QuRjM6CXJldHVybiAiRjMiOwotCQljYXNlIFNXVC5GNDoJcmV0dXJuICJGNCI7Ci0JCWNhc2UgU1dULkY1OglyZXR1cm4gIkY1IjsKLQkJY2FzZSBTV1QuRjY6CXJldHVybiAiRjYiOwotCQljYXNlIFNXVC5GNzoJcmV0dXJuICJGNyI7Ci0JCWNhc2UgU1dULkY4OglyZXR1cm4gIkY4IjsKLQkJY2FzZSBTV1QuRjk6CXJldHVybiAiRjkiOwotCQljYXNlIFNXVC5GMTA6CXJldHVybiAiRjEwIjsKLQkJY2FzZSBTV1QuRjExOglyZXR1cm4gIkYxMSI7Ci0JCWNhc2UgU1dULkYxMjoJcmV0dXJuICJGMTIiOwotCQljYXNlIFNXVC5GMTM6CXJldHVybiAiRjEzIjsKLQkJY2FzZSBTV1QuRjE0OglyZXR1cm4gIkYxNCI7Ci0JCWNhc2UgU1dULkYxNToJcmV0dXJuICJGMTUiOwotCQkKLQkJLyogTnVtZXJpYyBLZXlwYWQgS2V5cyAqLwotCQljYXNlIFNXVC5LRVlQQURfQUREOgkJcmV0dXJuICJLRVlQQURfQUREIjsKLQkJY2FzZSBTV1QuS0VZUEFEX1NVQlRSQUNUOglyZXR1cm4gIktFWVBBRF9TVUJUUkFDVCI7Ci0JCWNhc2UgU1dULktFWVBBRF9NVUxUSVBMWToJcmV0dXJuICJLRVlQQURfTVVMVElQTFkiOwotCQljYXNlIFNXVC5LRVlQQURfRElWSURFOgkJcmV0dXJuICJLRVlQQURfRElWSURFIjsKLQkJY2FzZSBTV1QuS0VZUEFEX0RFQ0lNQUw6CXJldHVybiAiS0VZUEFEX0RFQ0lNQUwiOwotCQljYXNlIFNXVC5LRVlQQURfQ1I6CQkJcmV0dXJuICJLRVlQQURfQ1IiOwotCQljYXNlIFNXVC5LRVlQQURfMDoJCQlyZXR1cm4gIktFWVBBRF8wIjsKLQkJY2FzZSBTV1QuS0VZUEFEXzE6CQkJcmV0dXJuICJLRVlQQURfMSI7Ci0JCWNhc2UgU1dULktFWVBBRF8yOgkJCXJldHVybiAiS0VZUEFEXzIiOwotCQljYXNlIFNXVC5LRVlQQURfMzoJCQlyZXR1cm4gIktFWVBBRF8zIjsKLQkJY2FzZSBTV1QuS0VZUEFEXzQ6CQkJcmV0dXJuICJLRVlQQURfNCI7Ci0JCWNhc2UgU1dULktFWVBBRF81OgkJCXJldHVybiAiS0VZUEFEXzUiOwotCQljYXNlIFNXVC5LRVlQQURfNjoJCQlyZXR1cm4gIktFWVBBRF82IjsKLQkJY2FzZSBTV1QuS0VZUEFEXzc6CQkJcmV0dXJuICJLRVlQQURfNyI7Ci0JCWNhc2UgU1dULktFWVBBRF84OgkJCXJldHVybiAiS0VZUEFEXzgiOwotCQljYXNlIFNXVC5LRVlQQURfOToJCQlyZXR1cm4gIktFWVBBRF85IjsKLQkJY2FzZSBTV1QuS0VZUEFEX0VRVUFMOgkJcmV0dXJuICJLRVlQQURfRVFVQUwiOwotCi0JCS8qIE90aGVyIGtleXMgKi8KLQkJY2FzZSBTV1QuQ0FQU19MT0NLOgkJcmV0dXJuICJDQVBTX0xPQ0siOwotCQljYXNlIFNXVC5OVU1fTE9DSzoJCXJldHVybiAiTlVNX0xPQ0siOwotCQljYXNlIFNXVC5TQ1JPTExfTE9DSzoJcmV0dXJuICJTQ1JPTExfTE9DSyI7Ci0JCWNhc2UgU1dULlBBVVNFOgkJCXJldHVybiAiUEFVU0UiOwotCQljYXNlIFNXVC5CUkVBSzoJCQlyZXR1cm4gIkJSRUFLIjsKLQkJY2FzZSBTV1QuUFJJTlRfU0NSRUVOOglyZXR1cm4gIlBSSU5UX1NDUkVFTiI7Ci0JCWNhc2UgU1dULkhFTFA6CQkJcmV0dXJuICJIRUxQIjsKLQl9Ci0JcmV0dXJuIGNoYXJhY3RlciAoKGNoYXIpIGtleUNvZGUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9IGUudHlwZSA9PSBTV1QuS2V5RG93biA/ICJET1dOOiIgOiAiVVAgIDoiOwotCQkJc3RyaW5nICs9ICIgc3RhdGVNYXNrPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcgKGUuc3RhdGVNYXNrKSArIHN0YXRlTWFzayAoZS5zdGF0ZU1hc2spICsgIiwiOwotCQkJc3RyaW5nICs9ICIga2V5Q29kZT0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nIChlLmtleUNvZGUpICsgIiAiICsga2V5Q29kZSAoZS5rZXlDb2RlKSArICIsIjsKLQkJCXN0cmluZyArPSAiIGNoYXJhY3Rlcj0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nIChlLmNoYXJhY3RlcikgKyAiICIgKyBjaGFyYWN0ZXIgKGUuY2hhcmFjdGVyKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoc3RyaW5nKTsKLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5LZXlEb3duLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5LZXlVcCwgbGlzdGVuZXIpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NTkzYmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERhdGVUaW1lIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgRGF0ZVRpbWUgY2FsZW5kYXIgYW5kIGEgRGF0ZVRpbWUgdGltZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCi0JRGF0ZVRpbWUgY2FsZW5kYXIgPSBuZXcgRGF0ZVRpbWUgKHNoZWxsLCBTV1QuQ0FMRU5EQVIpOwotCWNhbGVuZGFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYWxlbmRhciBkYXRlIGNoYW5nZWQiKTsKLQkJfQotCX0pOwotCi0JRGF0ZVRpbWUgdGltZSA9IG5ldyBEYXRlVGltZSAoc2hlbGwsIFNXVC5USU1FKTsKLQl0aW1lLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJ0aW1lIGNoYW5nZWQiKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg4ZjAwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEYXRlVGltZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIERhdGVUaW1lIGNhbGVuZGFyLCBkYXRlLCBhbmQgdGltZSBpbiBhIGRpYWxvZy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlCdXR0b24gb3BlbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0Jb3Blbi5zZXRUZXh0ICgiT3BlbiBEaWFsb2ciKTsKLQlvcGVuLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0pOwotCQkJZGlhbG9nLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDMsIGZhbHNlKSk7Ci0KLQkJCWZpbmFsIERhdGVUaW1lIGNhbGVuZGFyID0gbmV3IERhdGVUaW1lIChkaWFsb2csIFNXVC5DQUxFTkRBUiB8IFNXVC5CT1JERVIpOwotCQkJZmluYWwgRGF0ZVRpbWUgZGF0ZSA9IG5ldyBEYXRlVGltZSAoZGlhbG9nLCBTV1QuREFURSB8IFNXVC5TSE9SVCk7Ci0JCQlmaW5hbCBEYXRlVGltZSB0aW1lID0gbmV3IERhdGVUaW1lIChkaWFsb2csIFNXVC5USU1FIHwgU1dULlNIT1JUKTsKLQotCQkJbmV3IExhYmVsIChkaWFsb2csIFNXVC5OT05FKTsKLQkJCW5ldyBMYWJlbCAoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQgKCJPSyIpOwotCQkJb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiQ2FsZW5kYXIgZGF0ZSBzZWxlY3RlZCAoTU0vREQvWVlZWSkgPSAiICsgKGNhbGVuZGFyLmdldE1vbnRoICgpICsgMSkgKyAiLyIgKyBjYWxlbmRhci5nZXREYXkgKCkgKyAiLyIgKyBjYWxlbmRhci5nZXRZZWFyICgpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGF0ZSBzZWxlY3RlZCAoTU0vWVlZWSkgPSAiICsgKGRhdGUuZ2V0TW9udGggKCkgKyAxKSArICIvIiArIGRhdGUuZ2V0WWVhciAoKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlRpbWUgc2VsZWN0ZWQgKEhIOk1NKSA9ICIgKyB0aW1lLmdldEhvdXJzICgpICsgIjoiICsgKHRpbWUuZ2V0TWludXRlcyAoKSA8IDEwID8gIjAiIDogIiIpICsgdGltZS5nZXRNaW51dGVzICgpKTsKLQkJCQkJZGlhbG9nLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24gKG9rKTsKLQkJCWRpYWxvZy5wYWNrICgpOwotCQkJZGlhbG9nLm9wZW4gKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZjY3NTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIExpbmVBdHRyaWJ1dGVzIGV4YW1wbGUgc25pcHBldDogZHJhdyAyIHBvbHlsaW5lcyB3aXRoIGRpZmZlcmVudCBsaW5lIGF0dHJpYnV0ZXMuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjUyIHsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJCi0JCQkJZ2Muc2V0TGluZUF0dHJpYnV0ZXMobmV3IExpbmVBdHRyaWJ1dGVzKDEwLCBTV1QuQ0FQX0ZMQVQsIFNXVC5KT0lOX01JVEVSLCBTV1QuTElORV9TT0xJRCwgbnVsbCwgMCwgMTApKTsKLQkJCQlnYy5kcmF3UG9seWxpbmUobmV3IGludFtdezUwLCAxMDAsIDUwLCAyMCwgNjAsIDMwLCA1MCwgNDV9KTsKLQkJCQkKLQkJCQlnYy5zZXRMaW5lQXR0cmlidXRlcyhuZXcgTGluZUF0dHJpYnV0ZXMoMS8yZiwgU1dULkNBUF9GTEFULCBTV1QuSk9JTl9NSVRFUiwgU1dULkxJTkVfRE9ULCBudWxsLCAwLCAxMCkpOwotCQkJCWdjLmRyYXdQb2x5bGluZShuZXcgaW50W117MTAwLCAxMDAsIDEwMCwgMjAsIDExMCwgMzAsIDEwMCwgNDV9KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5zZXRTaXplKDE1MCwgMTUwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMWVjOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBjb21wdXRlIHRoZSB2aXNpYmxlIHJvd3MgaW4gYSB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTMgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCUZpbGxMYXlvdXQgbGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQgKFNXVC5WRVJUSUNBTCk7Ci0JCXNoZWxsLnNldExheW91dCAobGF5b3V0KTsKLQkJZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGk9MDsgaTwzMjsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyAoaSsxKSArICIgaXMgcXVpdGUgbG9uZyIpOwotCQl9Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCAoIlZpc2libGUgSXRlbXMgW10iKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHRhYmxlLmdldENsaWVudEFyZWEgKCk7Ci0JCQkJaW50IGl0ZW1IZWlnaHQgPSB0YWJsZS5nZXRJdGVtSGVpZ2h0ICgpOwotCQkJCWludCBoZWFkZXJIZWlnaHQgPSB0YWJsZS5nZXRIZWFkZXJIZWlnaHQgKCk7Ci0JCQkJaW50IHZpc2libGVDb3VudCA9IChyZWN0LmhlaWdodCAtIGhlYWRlckhlaWdodCArIGl0ZW1IZWlnaHQgLSAxKSAvIGl0ZW1IZWlnaHQ7Ci0JCQkJYnV0dG9uLnNldFRleHQgKCJWaXNpYmxlIEl0ZW1zIFsiICsgdmlzaWJsZUNvdW50ICsgIl0iKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoMjAwLCAyNTApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQzYzI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogY29tcHV0ZSB0aGUgdmlzaWJsZSByb3dzIGluIGEgdHJlZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTQgewotCi0Jc3RhdGljIFRyZWVJdGVtIG5leHRJdGVtKFRyZWUgdHJlZSwgVHJlZUl0ZW0gaXRlbSkgewotCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJaWYgKGl0ZW0uZ2V0RXhwYW5kZWQoKSAmJiBpdGVtLmdldEl0ZW1Db3VudCgpID4gMCkgcmV0dXJuIGl0ZW0uZ2V0SXRlbSgwKTsKLQkJVHJlZUl0ZW0gY2hpbGRJdGVtID0gaXRlbTsKLQkJVHJlZUl0ZW0gcGFyZW50SXRlbSA9IGNoaWxkSXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCWludCBpbmRleCA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuaW5kZXhPZihjaGlsZEl0ZW0pIDogcGFyZW50SXRlbS5pbmRleE9mKGNoaWxkSXRlbSk7Ci0JCWludCBjb3VudCA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuZ2V0SXRlbUNvdW50KCkgOiBwYXJlbnRJdGVtLmdldEl0ZW1Db3VudCgpOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGluZGV4ICsgMSA8IGNvdW50KSByZXR1cm4gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5nZXRJdGVtKGluZGV4ICsgMSkgOiBwYXJlbnRJdGVtLmdldEl0ZW0oaW5kZXggKyAxKTsKLQkJCWlmIChwYXJlbnRJdGVtID09IG51bGwpIHJldHVybiBudWxsOwotCQkJY2hpbGRJdGVtID0gcGFyZW50SXRlbTsKLQkJCXBhcmVudEl0ZW0gPSBjaGlsZEl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJaW5kZXggPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmluZGV4T2YoY2hpbGRJdGVtKSA6IHBhcmVudEl0ZW0uaW5kZXhPZihjaGlsZEl0ZW0pOwotCQkJY291bnQgPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmdldEl0ZW1Db3VudCgpIDogcGFyZW50SXRlbS5nZXRJdGVtQ291bnQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKTsKLQkJbGF5b3V0LmZpbGwgPSB0cnVlOwotCQlsYXlvdXQud3JhcCA9IGZhbHNlOwotCQlzaGVsbC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULk5PTkUpOwotCQlmb3IgKGludCBpPTA7IGk8MzI7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbTAgPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJCWl0ZW0wLnNldFRleHQgKCJJdGVtICIgKyBpICsgIiBpcyBxdWl0ZSBsb25nIik7Ci0JCQlmb3IgKGludCBqPTA7IGo8MzsgaisrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0gKGl0ZW0wLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbTEuc2V0VGV4dCAoIkl0ZW0gIiArIGkgKyAiICIgKyBqICsgIiBpcyBxdWl0ZSBsb25nIik7Ci0JCQkJZm9yIChpbnQgaz0wOyBrPDM7IGsrKykgewotCQkJCQlUcmVlSXRlbSBpdGVtMiA9IG5ldyBUcmVlSXRlbSAoaXRlbTEsIFNXVC5OT05FKTsKLQkJCQkJaXRlbTIuc2V0VGV4dCAoIkl0ZW0gIiArIGkgKyAiICIgKyBqICsgIiAiICsgayArICIgaXMgcXVpdGUgbG9uZyIpOwkKLQkJCQkJZm9yIChpbnQgbD0wOyBsPDM7IGwrKykgewotCQkJCQkJVHJlZUl0ZW0gaXRlbTMgPSBuZXcgVHJlZUl0ZW0gKGl0ZW0yLCBTV1QuTk9ORSk7Ci0JCQkJCQlpdGVtMy5zZXRUZXh0ICgiSXRlbSAiICsgaSArICIgIiArIGogKyAiICIgKyBrICsgIiAiICsgbCArICIgaXMgcXVpdGUgbG9uZyIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRyZWUuc2V0TGF5b3V0RGF0YShuZXcgUm93RGF0YSAoMjAwLCAyMDApKTsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiVmlzaWJsZSBJdGVtcyBbXSIpOwotCQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJCWludCB2aXNpYmxlQ291bnQgPSAwOwotCQkJCVJlY3RhbmdsZSByZWN0ID0gdHJlZS5nZXRDbGllbnRBcmVhICgpOwotCQkJCVRyZWVJdGVtIGl0ZW0gPSB0cmVlLmdldFRvcEl0ZW0gKCk7Ci0JCQkJd2hpbGUgKGl0ZW0gIT0gbnVsbCkgewotCQkJCQl2aXNpYmxlQ291bnQrKzsKLQkJCQkJUmVjdGFuZ2xlIGl0ZW1SZWN0ID0gaXRlbS5nZXRCb3VuZHMoKTsKLQkJCQkJaWYgKGl0ZW1SZWN0LnkgKyBpdGVtUmVjdC5oZWlnaHQgPiByZWN0LnkgKyByZWN0LmhlaWdodCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaXRlbSA9IG5leHRJdGVtICh0cmVlLCBpdGVtKTsKLQkJCQl9CQkJCQotCQkJCWJ1dHRvbi5zZXRUZXh0ICgiVmlzaWJsZSBJdGVtcyBbIiArIHZpc2libGVDb3VudCArICJdIik7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODIwYjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB0ZXh0IHdpdGggdW5kZXJsaW5lIGFuZCBzdHJpa2UgdGhyb3VnaAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1NiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5ET1VCTEVfQlVGRkVSRUQpOwkKLQlzaGVsbC5zZXRUZXh0KCJVbmRlcmxpbmUsIFN0cmlrZSBPdXQiKTsKLQlGb250IGZvbnQgPSBzaGVsbC5nZXRGb250KCk7Ci0JU3RyaW5nIHRleHQgPSAiSGVyZSBpcyBzb21lIHRleHQgdGhhdCBpcyB1bmRlcmxpbmVkIG9yIHN0cnVjayBvdXQgb3IgYm90aC4iOwotCWZpbmFsIFRleHRMYXlvdXQgbGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JbGF5b3V0LnNldFRleHQodGV4dCk7Ci0JVGV4dFN0eWxlIHN0eWxlMSA9IG5ldyBUZXh0U3R5bGUoZm9udCwgbnVsbCwgbnVsbCk7Ci0Jc3R5bGUxLnVuZGVybGluZSA9IHRydWU7Ci0JbGF5b3V0LnNldFN0eWxlKHN0eWxlMSwgMjYsIDM1KTsKLQlUZXh0U3R5bGUgc3R5bGUyID0gbmV3IFRleHRTdHlsZShmb250LCBudWxsLCBudWxsKTsKLQlzdHlsZTIuc3RyaWtlb3V0ID0gdHJ1ZTsKLQlsYXlvdXQuc2V0U3R5bGUoc3R5bGUyLCA0MCwgNDkpOwotCVRleHRTdHlsZSBzdHlsZTMgPSBuZXcgVGV4dFN0eWxlKGZvbnQsIG51bGwsIG51bGwpOwotCXN0eWxlMy51bmRlcmxpbmUgPSB0cnVlOwotCXN0eWxlMy5zdHJpa2VvdXQgPSB0cnVlOwotCWxheW91dC5zZXRTdHlsZShzdHlsZTMsIDU0LCA1Nyk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludCgxMCwgMTApOwotCQkJaW50IHdpZHRoID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gMiAqIHBvaW50Lng7Ci0JCQlsYXlvdXQuc2V0V2lkdGgod2lkdGgpOwotCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIHBvaW50LngsIHBvaW50LnkpOwkJCi0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWxheW91dC5kaXNwb3NlKCk7CQkKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhNjcxMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgdGV4dCBzZWxlY3Rpb24gd2l0aGluIGEgU3R5bGVkVGV4dCB3aWRnZXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTcgewotCi0Jc3RhdGljIFN0cmluZyBzdHJpbmcxID0gIkEgZHJhZyBzb3VyY2UgaXMgdGhlIHByb3ZpZGVyIG9mIGRhdGEgaW4gYSBEcmFnIGFuZCBEcm9wIGRhdGEgdHJhbnNmZXIgYXMgd2VsbCBhcyAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBvcmlnaW5hdG9yIG9mIHRoZSBEcmFnIGFuZCBEcm9wIG9wZXJhdGlvbi4gVGhlIGRhdGEgcHJvdmlkZWQgYnkgdGhlIGRyYWcgc291cmNlICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibWF5IGJlIHRyYW5zZmVycmVkIHRvIGFub3RoZXIgbG9jYXRpb24gaW4gdGhlIHNhbWUgd2lkZ2V0LCB0byBhIGRpZmZlcmVudCB3aWRnZXQgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoaW4gdGhlIHNhbWUgYXBwbGljYXRpb24sIG9yIHRvIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIGFsdG9nZXRoZXIuIEZvciBleGFtcGxlLCAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgInlvdSBjYW4gZHJhZyB0ZXh0IGZyb20geW91ciBhcHBsaWNhdGlvbiBhbmQgZHJvcCBpdCBvbiBhbiBlbWFpbCBhcHBsaWNhdGlvbiwgb3IgeW91ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgZHJhZyBhbiBpdGVtIGluIGEgdHJlZSBhbmQgZHJvcCBpdCBiZWxvdyBhIGRpZmZlcmVudCBub2RlIGluIHRoZSBzYW1lIHRyZWUuIjsKLQotCXN0YXRpYyBTdHJpbmcgRFJBR19TVEFSVF9EQVRBID0gIkRSQUdfU1RBUlRfREFUQSI7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCXNoZWxsLnNldFNpemUoMTAwLCAzMDApOwotCWludCBzdHlsZSA9IFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUjsKLQlmaW5hbCBTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgc3R5bGUpOwotCXRleHQuc2V0VGV4dChzdHJpbmcxKTsKLQlmaW5hbCBEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKHRleHQsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFKTsKLQlzb3VyY2Uuc2V0RHJhZ1NvdXJjZUVmZmVjdChuZXcgRHJhZ1NvdXJjZUVmZmVjdCh0ZXh0KSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLQkJfQotCX0pOwotCXNvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJUG9pbnQgc2VsZWN0aW9uOwotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlzZWxlY3Rpb24gPSB0ZXh0LmdldFNlbGVjdGlvbigpOwotCQkJZXZlbnQuZG9pdCA9IHNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbi55OwotCQkJdGV4dC5zZXREYXRhKERSQUdfU1RBUlRfREFUQSwgc2VsZWN0aW9uKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZSkgewotCQkJZS5kYXRhID0gdGV4dC5nZXRUZXh0KHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueS0xKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUpIHsKLQkJCQlQb2ludCBuZXdTZWxlY3Rpb249IHRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaW50IGxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJaW50IGRlbHRhID0gMDsKLQkJCQlpZiAobmV3U2VsZWN0aW9uLnggPCBzZWxlY3Rpb24ueCkKLQkJCQkJZGVsdGEgPSBsZW5ndGg7IAotCQkJCXRleHQucmVwbGFjZVRleHRSYW5nZShzZWxlY3Rpb24ueCArIGRlbHRhLCBsZW5ndGgsICIiKTsKLQkJCX0KLQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQl0ZXh0LnNldERhdGEoRFJBR19TVEFSVF9EQVRBLCBudWxsKTsKLQkJfQotCX0pOwotCQotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGV4dCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlpZiAodGV4dC5nZXREYXRhKERSQUdfU1RBUlRfREFUQSkgPT0gbnVsbCkKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCQllbHNlIAotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9NT1ZFOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJaWYgKHRleHQuZ2V0RGF0YShEUkFHX1NUQVJUX0RBVEEpID09IG51bGwpCi0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJZWxzZSAKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NDUk9MTCB8IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfTk9ORSkgewotCQkJCVBvaW50IHNlbGVjdGlvbiA9IChQb2ludCkgdGV4dC5nZXREYXRhKERSQUdfU1RBUlRfREFUQSk7Ci0JCQkJaW50IGluc2VydFBvcyA9IHRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUgJiYgc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnggPD0gaW5zZXJ0UG9zICAmJiBpbnNlcnRQb3MgPD0gc2VsZWN0aW9uLnkgCi0JCQkJCQl8fCBldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfQ09QWSAmJiBzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24ueCA8IGluc2VydFBvcyAgJiYgaW5zZXJ0UG9zIDwgc2VsZWN0aW9uLnkpIHsKLQkJCQkJdGV4dC5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsgIC8vIHByZXZlbnQgc291cmNlIGZyb20gZGVsZXRpbmcgc2VsZWN0aW9uCi0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpZXZlbnQuZGF0YTsKLQkJCQkJdGV4dC5pbnNlcnQoc3RyaW5nKTsKLQkJCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotCQkJCQkJdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShpbnNlcnRQb3MsIHN0cmluZy5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDQ4MTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIHNlYXJjaCB0ZXh0IGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1OCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNFQVJDSCB8IFNXVC5JQ09OX0NBTkNFTCk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJaWYgKCh0ZXh0LmdldFN0eWxlKCkgJiBTV1QuSUNPTl9DQU5DRUwpID09IDApIHsKLQkJCWltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUik7Ci0JCQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5GTEFUKTsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQkJCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0ZXh0LnNldFRleHQoIiIpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlYXJjaCBjYW5jZWxsZWQiKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0ZXh0LnNldFRleHQoIlNlYXJjaCB0ZXh0Iik7Ci0JCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuQ0FOQ0VMKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoIGNhbmNlbGxlZCIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoaW5nIGZvcjogIiArIHRleHQuZ2V0VGV4dCgpICsgIi4uLiIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTUzNTRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGV0ZWN0IGRyYWcgaW4gYSBjdXN0b20gY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjU5IHsKLQotc3RhdGljIGNsYXNzIE15TGlzdCBleHRlbmRzIENhbnZhcyB7Ci0JaW50IHNlbGVjdGlvbjsKLQlTdHJpbmcgW10gaXRlbXMgPSBuZXcgU3RyaW5nIFswXTsKLQlzdGF0aWMgZmluYWwgaW50IElOU0VUX1ggPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgSU5TRVRfWSA9IDI7Ci0JCi1zdGF0aWMgaW50IGNoZWNrU3R5bGUgKGludCBzdHlsZSkgewotCXN0eWxlICY9IH4oU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlzdHlsZSB8PSBTV1QuTk9fQkFDS0dST1VORCB8IFNXVC5OT19SRURSQVdfUkVTSVpFOwotCXJldHVybiBzdHlsZTsKLX0KLQotcHVibGljIE15TGlzdCAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0Jc3VwZXIgKHBhcmVudCwgY2hlY2tTdHlsZSAoc3R5bGUpKTsKLQlzdXBlci5zZXREcmFnRGV0ZWN0IChmYWxzZSk7Ci0JYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRG93biAoTW91c2VFdmVudCBldmVudCkgewotCQkJR0MgZ2MgPSBuZXcgR0MgKE15TGlzdC50aGlzKTsKLQkJCVJlY3RhbmdsZSBjbGllbnQgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCQlpbnQgaW5kZXggPSAwLCB4ID0gY2xpZW50LnggKyBJTlNFVF9YLCB5ID0gY2xpZW50LnkgKyBJTlNFVF9ZOwotCQkJd2hpbGUgKGluZGV4IDwgaXRlbXMubGVuZ3RoKSB7Ci0JCQkJUG9pbnQgcHQgPSBnYy5zdHJpbmdFeHRlbnQoaXRlbXMgW2luZGV4XSk7Ci0JCQkJUmVjdGFuZ2xlIGl0ZW0gPSBuZXcgUmVjdGFuZ2xlICh4LCB5LCBwdC54LCBwdC55KTsKLQkJCQlpZiAoaXRlbS5jb250YWlucyAoZXZlbnQueCwgZXZlbnQueSkpIGJyZWFrOwotCQkJCXkgKz0gcHQueTsKLQkJCQlpZiAoIWNsaWVudC5jb250YWlucyAoeCwgeSkpIHJldHVybjsKLQkJCQlpbmRleCsrOwotCQkJfQotCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCWlmIChpbmRleCA9PSBpdGVtcy5sZW5ndGggfHwgIWNsaWVudC5jb250YWlucyAoeCwgeSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzZWxlY3Rpb24gPSBpbmRleDsKLQkJCXJlZHJhdyAoKTsKLQkJCXVwZGF0ZSAoKTsKLQkJCWRyYWdEZXRlY3QgKGV2ZW50KTsKLQkJfQotCX0pOwotCWFkZFBhaW50TGlzdGVuZXIgKG5ldyBQYWludExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sIChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJQ29sb3IgZm9yZWdyb3VuZCA9IGV2ZW50LmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotCQkJQ29sb3IgYmFja2dyb3VuZCA9IGV2ZW50LmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOwotCQkJQ29sb3Igc2VsZWN0Rm9yZWdyb3VuZCA9IGV2ZW50LmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhUKTsKLQkJCUNvbG9yIHNlbGVjdEJhY2tncm91bmQgPSBldmVudC5kaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCAoZm9yZWdyb3VuZCk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kIChiYWNrZ3JvdW5kKTsKLQkJCU15TGlzdC50aGlzLmRyYXdCYWNrZ3JvdW5kIChnYywgZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQlpbnQgeCA9IElOU0VUX1gsIHkgPSBJTlNFVF9ZOwotCQkJZm9yIChpbnQgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUG9pbnQgcHQgPSBnYy5zdHJpbmdFeHRlbnQoaXRlbXMgW2ldKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kIChpID09IHNlbGVjdGlvbiA/IHNlbGVjdEZvcmVncm91bmQgOiBmb3JlZ3JvdW5kKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kIChpID09IHNlbGVjdGlvbiA/IHNlbGVjdEJhY2tncm91bmQgOiBiYWNrZ3JvdW5kKTsKLQkJCQlnYy5kcmF3U3RyaW5nIChpdGVtcyBbaV0sIHgsIHkpOwotCQkJCXkgKz0gcHQueTsKLQkJCX0KLQkJCQotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZSAoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCUdDIGdjID0gbmV3IEdDICh0aGlzKTsKLQlpbnQgaW5kZXggPSAwLCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0Jd2hpbGUgKGluZGV4IDwgaXRlbXMubGVuZ3RoKSB7Ci0JCVBvaW50IHB0ID0gZ2Muc3RyaW5nRXh0ZW50KGl0ZW1zIFtpbmRleF0pOwotCQl3aWR0aCA9IE1hdGgubWF4ICh3aWR0aCwgcHQueCk7Ci0JCWhlaWdodCArPSBwdC55OwotCQlpbmRleCsrOwotCX0KLQlnYy5kaXNwb3NlICgpOwotCXdpZHRoICs9IElOU0VUX1ggKiAyOwotCWhlaWdodCArPSBJTlNFVF9ZICogMjsKLQlSZWN0YW5nbGUgcmVjdCA9IGNvbXB1dGVUcmltICgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQlyZXR1cm4gbmV3IFBvaW50IChyZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgW10gZ2V0SXRlbXMgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCXJldHVybiBpdGVtczsKLX0KLQotcHVibGljIHZvaWQgc2V0SXRlbXMgKFN0cmluZyBbXSBpdGVtcykgewotCWNoZWNrV2lkZ2V0ICgpOwotCWlmIChpdGVtcyA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JcmVkcmF3ICgpOwkKLX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCU15TGlzdCB0MSA9IG5ldyBNeUxpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQl0MS5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IlNvbWUiLCAiaXRlbXMiLCAiaW4iLCAidGhlIiwgImxpc3QifSk7Ci0JdDEuYWRkRHJhZ0RldGVjdExpc3RlbmVyIChuZXcgRHJhZ0RldGVjdExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0RldGVjdGVkIChEcmFnRGV0ZWN0RXZlbnQgZXZlbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRyYWcgc3RhcnRlZCAuLi4iKTsKLQkJfQotCX0pOwotCU15TGlzdCB0MiA9IG5ldyBNeUxpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQl0Mi5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IlNvbWUiLCAiaXRlbXMiLCAiaW4iLCAiYW5vdGhlciIsICJsaXN0In0pOwotCXQyLmFkZERyYWdEZXRlY3RMaXN0ZW5lciAobmV3IERyYWdEZXRlY3RMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdEZXRlY3RlZCAoRHJhZ0RldGVjdEV2ZW50IGV2ZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEcmFnIHN0YXJ0ZWQgLi4uIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2NlNWU4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbWJvIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29tYm8gYm94IChub24tZWRpdGFibGUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKHNoZWxsLCBTV1QuUkVBRF9PTkxZKTsKLQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkEiLCAiQiIsICJDIn0pOwotCWNvbWJvLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5ZjgzNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTW96aWxsYSBpbiBhIEJyb3dzZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNjAgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJc2hlbGwuc2V0VGV4dCgiTW96aWxsYSIpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5NT1pJTExBKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCWRpc3BsYXkuZGlzcG9zZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly9tb3ppbGxhLm9yZyIpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1YWMyOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIEV4Y2VsIHNoZWV0LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjYxIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJFeGNlbCBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdHJ5IHsKLQkJCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQluZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsICJFeGNlbC5TaGVldCIpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2hlbGwuc2V0U2l6ZSg4MDAsIDYwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQkKLQlzdGF0aWMgdm9pZCBhZGRGaWxlTWVudShPbGVGcmFtZSBmcmFtZSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGZyYW1lLmdldFNoZWxsKCk7Ci0JCU1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJTWVudUl0ZW0gZmlsZU1lbnUgPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlmaWxlTWVudS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IG1lbnVGaWxlID0gbmV3IE1lbnUoZmlsZU1lbnUpOwotCQlmaWxlTWVudS5zZXRNZW51KG1lbnVGaWxlKTsKLQkJTWVudUl0ZW0gbWVudUZpbGVDb250cm9sID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlQ29udHJvbC5zZXRUZXh0KCJFeGl0Iik7Ci0JCW1lbnVGaWxlQ29udHJvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlmcmFtZS5zZXRGaWxlTWVudXMobmV3IE1lbnVJdGVtW10geyBmaWxlTWVudSB9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDQ3MDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBPcGVuIGFuIE9MRSBXb3JkIGRvY3VtZW50LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjYyIHsKLQlzdGF0aWMgT2xlQ2xpZW50U2l0ZSBjbGllbnRTaXRlOwotCXN0YXRpYyBPbGVGcmFtZSBmcmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJXb3JkIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cnkgewotCQkJZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWNsaWVudFNpdGUgPSBuZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsICJXb3JkLkRvY3VtZW50Iik7Ci0JCQlhZGRGaWxlTWVudShmcmFtZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIG9wZW4gYWN0aXZlWCBjb250cm9sIik7Ci0JCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQotCXN0YXRpYyB2b2lkIGFkZEZpbGVNZW51KE9sZUZyYW1lIGZyYW1lKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZnJhbWUuZ2V0U2hlbGwoKTsKLQkJTWVudSBtZW51QmFyID0gc2hlbGwuZ2V0TWVudUJhcigpOwotCQlpZiAobWVudUJhciA9PSBudWxsKSB7Ci0JCQltZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJfQotCQlNZW51SXRlbSBmaWxlTWVudSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVNZW51LnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgbWVudUZpbGUgPSBuZXcgTWVudShmaWxlTWVudSk7Ci0JCWZpbGVNZW51LnNldE1lbnUobWVudUZpbGUpOwotCQlmcmFtZS5zZXRGaWxlTWVudXMobmV3IE1lbnVJdGVtW10geyBmaWxlTWVudSB9KTsKLQotCQlNZW51SXRlbSBtZW51RmlsZU9wZW4gPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVPcGVuLnNldFRleHQoIk9wZW4uLi4iKTsKLQkJbWVudUZpbGVPcGVuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbGVPcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlNZW51SXRlbSBtZW51RmlsZUV4aXQgPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVFeGl0LnNldFRleHQoIkV4aXQiKTsKLQkJbWVudUZpbGVFeGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgZmlsZU9wZW4oKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coY2xpZW50U2l0ZS5nZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLmRvYyIgfSk7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQljbGllbnRTaXRlLmRpc3Bvc2UoKTsKLQkJCWNsaWVudFNpdGUgPSBuZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsICJXb3JkLkRvY3VtZW50IiwgbmV3IEZpbGUoZmlsZU5hbWUpKTsKLQkJCWNsaWVudFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmYWYzMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIFBvd2VyUG9pbnQgc2xpZGUuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovIAotcHVibGljIGNsYXNzIFNuaXBwZXQyNjMgewotCXN0YXRpYyBPbGVDbGllbnRTaXRlIGNsaWVudFNpdGU7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJQb3dlclBvaW50IEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cnkgewotCQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWNsaWVudFNpdGUgID0gbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiUG93ZXJQb2ludC5TbGlkZSIpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2hlbGwuc2V0U2l6ZSg4MDAsIDYwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQkKLQlzdGF0aWMgdm9pZCBhZGRGaWxlTWVudShPbGVGcmFtZSBmcmFtZSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGZyYW1lLmdldFNoZWxsKCk7Ci0JCU1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJTWVudUl0ZW0gZmlsZU1lbnUgPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlmaWxlTWVudS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IG1lbnVGaWxlID0gbmV3IE1lbnUoZmlsZU1lbnUpOwotCQlmaWxlTWVudS5zZXRNZW51KG1lbnVGaWxlKTsKLQkJTWVudUl0ZW0gbWVudUZpbGVDb250cm9sID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlQ29udHJvbC5zZXRUZXh0KCJFeGl0Iik7Ci0JCW1lbnVGaWxlQ29udHJvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlmcmFtZS5zZXRGaWxlTWVudXMobmV3IE1lbnVJdGVtW10geyBmaWxlTWVudSB9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzE2MzVmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogT3BlbiBhbiBPTEUgTWVkaWEgUGxheWVyLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjY0IHsKLQlzdGF0aWMgT2xlQ2xpZW50U2l0ZSBjbGllbnRTaXRlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiTWVkaWEgUGxheWVyIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cnkgewotCQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWNsaWVudFNpdGUgID0gbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiTVBsYXllciIpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2hlbGwuc2V0U2l6ZSg4MDAsIDYwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQkKLQlzdGF0aWMgdm9pZCBhZGRGaWxlTWVudShPbGVGcmFtZSBmcmFtZSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGZyYW1lLmdldFNoZWxsKCk7Ci0JCU1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJTWVudUl0ZW0gZmlsZU1lbnUgPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlmaWxlTWVudS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IG1lbnVGaWxlID0gbmV3IE1lbnUoZmlsZU1lbnUpOwotCQlmaWxlTWVudS5zZXRNZW51KG1lbnVGaWxlKTsKLQkJTWVudUl0ZW0gbWVudUZpbGVDb250cm9sID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlQ29udHJvbC5zZXRUZXh0KCJFeGl0Iik7Ci0JCW1lbnVGaWxlQ29udHJvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlmcmFtZS5zZXRGaWxlTWVudXMobmV3IE1lbnVJdGVtW10geyBmaWxlTWVudSB9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGUxNWEyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogT3BlbiBhbiBPTEUgV2luZG93cyBNZWRpYSBQbGF5ZXIuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXQyNjUgewotCXN0YXRpYyBPbGVDbGllbnRTaXRlIGNsaWVudFNpdGU7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJNZWRpYSBQbGF5ZXIgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRyeSB7Ci0JCQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIldNUGxheWVyLk9DWCIpOwotCQkJY2xpZW50U2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JCQlhZGRGaWxlTWVudShmcmFtZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIG9wZW4gYWN0aXZlWCBjb250cm9sIik7Ci0JCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBhZGRGaWxlTWVudShPbGVGcmFtZSBmcmFtZSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGZyYW1lLmdldFNoZWxsKCk7Ci0JCU1lbnUgbWVudUJhciA9IHNoZWxsLmdldE1lbnVCYXIoKTsKLQkJaWYgKG1lbnVCYXIgPT0gbnVsbCkgewotCQkJbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCX0KLQkJTWVudUl0ZW0gZmlsZU1lbnUgPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlmaWxlTWVudS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IG1lbnVGaWxlID0gbmV3IE1lbnUoZmlsZU1lbnUpOwotCQlmaWxlTWVudS5zZXRNZW51KG1lbnVGaWxlKTsKLQkJZnJhbWUuc2V0RmlsZU1lbnVzKG5ldyBNZW51SXRlbVtdIHsgZmlsZU1lbnUgfSk7Ci0KLQkJTWVudUl0ZW0gbWVudUZpbGVPcGVuID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlT3Blbi5zZXRUZXh0KCJPcGVuLi4uIik7Ci0JCW1lbnVGaWxlT3Blbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaWxlT3BlbigpOwotCQkJfQotCQl9KTsKLQkJTWVudUl0ZW0gbWVudUZpbGVFeGl0ID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlRXhpdC5zZXRUZXh0KCJFeGl0Iik7Ci0JCW1lbnVGaWxlRXhpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXN0YXRpYyB2b2lkIGZpbGVPcGVuKCkgewotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGNsaWVudFNpdGUuZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi53bXYiIH0pOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCkgewotCQkJT2xlQXV0b21hdGlvbiBwbGF5ZXIgPSBuZXcgT2xlQXV0b21hdGlvbihjbGllbnRTaXRlKTsKLQkJCWludCBwbGF5VVJMW10gPSBwbGF5ZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiVVJMIiB9KTsKLQkJCWlmIChwbGF5VVJMICE9IG51bGwpIHsKLQkJCQlWYXJpYW50IHRoZUZpbGUgPSBuZXcgVmFyaWFudChmaWxlbmFtZSk7Ci0JCQkJcGxheWVyLnNldFByb3BlcnR5KHBsYXlVUkxbMF0sIHRoZUZpbGUpOwotCQkJfQotCQkJcGxheWVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTdhMGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogU3BhbiBhbmQgY2VudGVyIGNvbHVtbnMgd2l0aCBhIEdyaWRMYXlvdXQuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXQyNjYgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJCi0JCVRhYkZvbGRlciB0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQkJCi0JCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIldpZGdldCIpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJaXRlbS5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoIlN0YW5kYXJkIik7Ci0JCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KCJXaWRnZXQiKTsKLQkJVHJlZUl0ZW0gYnJhbmNoID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJYnJhbmNoLnNldFRleHQobmV3IFN0cmluZyBbXSB7IkVmZmljaWVudCIsICJQb3J0YWJsZSJ9KTsKLQkJVHJlZUl0ZW0gbGVhZiA9IG5ldyBUcmVlSXRlbShicmFuY2gsIFNXVC5OT05FKTsKLQkJbGVhZi5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJDcm9zcyIsICJQbGF0Zm9ybSJ9KTsKLQkJYnJhbmNoLnNldEV4cGFuZGVkKHRydWUpOwotCQlicmFuY2ggPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlicmFuY2guc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiTmF0aXZlIiwgIkNvbnRyb2xzIn0pOwotCQlsZWFmID0gbmV3IFRyZWVJdGVtKGJyYW5jaCwgU1dULk5PTkUpOwotCQlsZWFmLnNldFRleHQobmV3IFN0cmluZyBbXSB7IkNyb3NzIiwgIlBsYXRmb3JtIn0pOwotCQlicmFuY2ggPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlicmFuY2guc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiQ3Jvc3MiLCAiUGxhdGZvcm0ifSk7Ci0JCWNvbHVtbjEucGFjaygpOwotCQljb2x1bW4yLnBhY2soKTsKLQotCQlpdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiVG9vbGtpdCIpOwotCQkKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJUb3RhbGx5Iik7Ci0JCWJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCi0JCWJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIkF3ZXNvbWUiKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZmQwYTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLm1vemlsbGEuaW50ZXJmYWNlcy4qOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IFRvZ2dsZSBhIE1vemlsbGEgQnJvd3NlciBiZXR3ZWVuIERlc2lnbiBtb2RlIGFuZCBWaWV3IG1vZGUuCi0gKiAKLSAqIElNUE9SVEFOVDogRm9yIHRoaXMgc25pcHBldCB0byB3b3JrIHByb3Blcmx5IGFsbCBvZiB0aGUgcmVxdWlyZW1lbnRzCi0gKiBmb3IgdXNpbmcgSmF2YVhQQ09NIGluIGEgc3RhbmQtYWxvbmUgYXBwbGljYXRpb24gbXVzdCBiZSBzYXRpc2ZpZWQKLSAqIChzZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvZmFxLnBocCNob3d1c2VqYXZheHBjb20pLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjY3IHsKLQlzdGF0aWMgQnJvd3NlciBicm93c2VyOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJc2hlbGwuc2V0VGV4dCgiVXNlIE1vemlsbGEncyBEZXNpZ24gTW9kZSIpOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTU9aSUxMQSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQotCQlmaW5hbCBCdXR0b24gb2ZmQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlJBRElPKTsKLQkJb2ZmQnV0dG9uLnNldFRleHQoIkRlc2lnbiBNb2RlIE9mZiIpOwotCQlvZmZCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9mZkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgcmV0dXJuOwotCQkJCXNldERlc2lnbk1vZGUoIm9mZiIpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgQnV0dG9uIG9uQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlJBRElPKTsKLQkJb25CdXR0b24uc2V0VGV4dCgiRGVzaWduIE1vZGUgT24iKTsKLQkJb25CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKSByZXR1cm47Ci0JCQkJYm9vbGVhbiBzdWNjZXNzID0gc2V0RGVzaWduTW9kZSgib24iKTsKLQkJCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQkJb25CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJb2ZmQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlvZmZCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JCWJyb3dzZXIuc2V0VXJsKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKTsKLQkJc2hlbGwuc2V0U2l6ZSg0MDAsNDAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXREZXNpZ25Nb2RlKFN0cmluZyB2YWx1ZSkgewotCQluc0lXZWJCcm93c2VyIHdlYkJyb3dzZXIgPSAobnNJV2ViQnJvd3Nlcilicm93c2VyLmdldFdlYkJyb3dzZXIoKTsKLQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgZ2V0IHRoZSBuc0lXZWJCcm93c2VyIGZyb20gdGhlIEJyb3dzZXIgd2lkZ2V0Iik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJbnNJRE9NV2luZG93IHdpbmRvdyA9IHdlYkJyb3dzZXIuZ2V0Q29udGVudERPTVdpbmRvdygpOwotCQluc0lET01Eb2N1bWVudCBkb2N1bWVudCA9IHdpbmRvdy5nZXREb2N1bWVudCgpOwotCQluc0lET01OU0hUTUxEb2N1bWVudCBuc0RvY3VtZW50ID0gKG5zSURPTU5TSFRNTERvY3VtZW50KWRvY3VtZW50LnF1ZXJ5SW50ZXJmYWNlKG5zSURPTU5TSFRNTERvY3VtZW50Lk5TX0lET01OU0hUTUxET0NVTUVOVF9JSUQpOwotCQluc0RvY3VtZW50LnNldERlc2lnbk1vZGUodmFsdWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMTI1NjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVUkgQXV0b21hdGlvbiAoZm9yIHRlc3RpbmcgdG9vbHMpIHNuaXBwZXQ6IHBvc3QgbW91c2Ugd2hlZWwgZXZlbnRzIHRvIGEgc3R5bGVkIHRleHQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjY4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuVl9TQ1JPTEwpOwotCVN0cmluZyBtdWx0aUxpbmVTdHJpbmcgPSAiIjsKLQlmb3IgKGludCBpID0gMDsgaSA8IDIwMDsgaSsrKSB7Ci0JCW11bHRpTGluZVN0cmluZyA9IG11bHRpTGluZVN0cmluZy5jb25jYXQoIlRoaXMgaXMgbGluZSBudW1iZXIgIiArIGkgKyAiIGluIHRoZSBtdWx0aS1saW5lIHN0cmluZy5cbiIpOwotCX0KLQlzdHlsZWRUZXh0LnNldFRleHQobXVsdGlMaW5lU3RyaW5nKTsKLQlzaGVsbC5zZXRTaXplKHN0eWxlZFRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIDQwMCkpOwotCXNoZWxsLm9wZW4oKTsKLQlzdHlsZWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZVdoZWVsLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZSBXaGVlbCBldmVudCAiICsgZSk7Ci0JCX0KLQl9KTsKLQluZXcgVGhyZWFkKCl7Ci0JCUV2ZW50IGV2ZW50OwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHsKLQkJCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQkJCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VXaGVlbDsKLQkJCQlldmVudC5kZXRhaWwgPSBTV1QuU0NST0xMX0xJTkU7Ci0JCQkJZXZlbnQuY291bnQgPSAtMjsKLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSBkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQl9Ci0JCX0JCi0JfS5zdGFydCgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhNGJkOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBDb21ibyBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgY2FyZXQgcG9zaXRpb24gd2l0aGluIGEgQ29tYm8ncyB0ZXh0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2OSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY29tYm8uYWRkICgiaXRlbSIpOwotCWNvbWJvLnNlbGVjdCAoMCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCWludCBzdHJpbmdMZW5ndGggPSBjb21iby5nZXRUZXh0ICgpLmxlbmd0aCAoKTsgCi0JY29tYm8uc2V0U2VsZWN0aW9uIChuZXcgUG9pbnQgKHN0cmluZ0xlbmd0aCwgc3RyaW5nTGVuZ3RoKSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzM2E5YzIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBvcGVuIGEgc2hlbGwgbWluaW1pemVkIChpY29uaWZpZWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TWluaW1pemVkICh0cnVlKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNjFkMTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgc25pcHBldDogYnJpbmcgdXAgYSBicm93c2VyIHdpdGggcG9wLXVwIHdpbmRvdyBzdXBwb3J0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjcwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiBXaW5kb3ciKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgQnJvd3NlciBicm93c2VyOwotCXRyeSB7Ci0JCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybjsKLQl9Ci0JaW5pdGlhbGl6ZShkaXNwbGF5LCBicm93c2VyKTsKLQlzaGVsbC5vcGVuKCk7Ci0JYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0vKiByZWdpc3RlciBXaW5kb3dFdmVudCBsaXN0ZW5lcnMgKi8KLXN0YXRpYyB2b2lkIGluaXRpYWxpemUoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBCcm93c2VyIGJyb3dzZXIpIHsKLQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoIWV2ZW50LnJlcXVpcmVkKSByZXR1cm47CS8qIG9ubHkgZG8gaXQgaWYgbmVjZXNzYXJ5ICovCi0JCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJCXNoZWxsLnNldFRleHQoIk5ldyBXaW5kb3ciKTsKLQkJCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCQkJZXZlbnQuYnJvd3NlciA9IGJyb3dzZXI7Ci0JCX0KLQl9KTsKLQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoaWRlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJaWYgKGV2ZW50LmxvY2F0aW9uICE9IG51bGwpIHNoZWxsLnNldExvY2F0aW9uKGV2ZW50LmxvY2F0aW9uKTsKLQkJCWlmIChldmVudC5zaXplICE9IG51bGwpIHsKLQkJCQlQb2ludCBzaXplID0gZXZlbnQuc2l6ZTsKLQkJCQlzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KSk7Ci0JCQl9Ci0JCQlzaGVsbC5vcGVuKCk7Ci0JCX0KLQl9KTsKLQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCX0KLQl9KTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODIxOTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIHNuaXBwZXQ6IHNwZWNpZnkgY3VzdG9tIGNvbnRlbnQgZGltZW5zaW9ucyBpbiBhIHRhYmxlIHdpdGggbm8gY29sdW1ucwotICogCi0gKiBGb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGlzIHNuaXBwZXQgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtQ3VzdG9tRHJhd2luZ1RhYmxlQW5kVHJlZUl0ZW1zL2N1c3RvbURyYXcuaHRtI19leGFtcGxlMQotICogIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsMTAsMjAwLDI1MCk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQl0YWJsZS5zZXRCb3VuZHMoMTAsMTAsMTUwLDIwMCk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKS5zZXRUZXh0KCJpdGVtICIgKyBpKTsKLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtIGlzIGNhbGxlZCByZXBlYXRlZGx5LiAgVGhlcmVmb3JlIGl0IGlzIGNyaXRpY2FsCi0JICogZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhpcyBtZXRob2QgYmUgYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaW50IGNsaWVudFdpZHRoID0gdGFibGUuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCQkJZXZlbnQuaGVpZ2h0ID0gZXZlbnQuZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKSAqIDI7Ci0JCQlldmVudC53aWR0aCA9IGNsaWVudFdpZHRoICogMjsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3OGMxYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgc25pcHBldDogc3BlY2lmeSBjdXN0b20gY29sdW1uIHdpZHRocyB3aGVuIGEgY29sdW1uIGlzIHBhY2tlZAotICogIAotICogRm9yIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhpcyBzbmlwcGV0IHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLUN1c3RvbURyYXdpbmdUYWJsZUFuZFRyZWVJdGVtcy9jdXN0b21EcmF3Lmh0bSNfZXhhbXBsZTIKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsgCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLDEwLDQwMCwyMDApOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JdGFibGUuc2V0Qm91bmRzKDEwLDEwLDM1MCwxNTApOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4wLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWNvbHVtbjAucGFjaygpOwotCQl9Ci0JfSk7Ci0JY29sdW1uMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQljb2x1bW4xLnBhY2soKTsKLQkJfQotCX0pOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoMCwgIml0ZW0gIiArIGkgKyAiIGNvbCAwIik7Ci0JCWl0ZW0uc2V0VGV4dCgxLCAiaXRlbSAiICsgaSArICIgY29sIDEiKTsKLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtIGlzIGNhbGxlZCByZXBlYXRlZGx5LiAgVGhlcmVmb3JlIGl0IGlzIGNyaXRpY2FsCi0JICogZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhpcyBtZXRob2QgYmUgYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXZlbnQud2lkdGggKj0gMjsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlNmMzYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjczLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIHNuaXBwZXQ6IG1vZGlmeSB0aGUgY2xpcHBpbmcgb2YgY3VzdG9tIGJhY2tncm91bmQgcGFpbnRzCi0gKiAKLSAqIEZvciBhIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoaXMgc25pcHBldCBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1DdXN0b21EcmF3aW5nVGFibGVBbmRUcmVlSXRlbXMvY3VzdG9tRHJhdy5odG0jX2V4YW1wbGU0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjczIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIFN0cmluZ1tdIE1PTlRIUyA9IHsKLQkJIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKLQkJIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgotCX07Ci0JZmluYWwgaW50W10gSElHSFMgPSB7LTcsIC00LCAxLCAxMSwgMTgsIDI0LCAyNiwgMjUsIDIwLCAxMywgNSwgLTR9OwotCWZpbmFsIGludFtdIExPV1MgPSB7LTE1LCAtMTMsIC03LCAxLCA3LCAxMywgMTUsIDE0LCAxMCwgNCwgLTIsIC0xMX07Ci0JZmluYWwgaW50IFNDQUxFX01JTiA9IC0zMDsgZmluYWwgaW50IFNDQUxFX01BWCA9IDMwOwotCWZpbmFsIGludCBTQ0FMRV9SQU5HRSA9IE1hdGguYWJzKFNDQUxFX01JTiAtIFNDQUxFX01BWCk7Ci0KLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwxMCw0MDAsMzUwKTsKLQlzaGVsbC5zZXRUZXh0KCJPdHRhd2EgQXZlcmFnZSBEYWlseSBUZW1wZXJhdHVyZSBSYW5nZXMiKTsKLQlmaW5hbCBDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JZmluYWwgQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JZmluYWwgQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkvLyBmaW5hbCBJbWFnZSBwYXJsaWFtZW50SW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgIi4vcGFybGlhbWVudC5qcGciKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk5PTkUpOwotCXRhYmxlLnNldEJvdW5kcygxMCwxMCwzNTAsMzAwKTsKLQkvLyB0YWJsZS5zZXRCYWNrZ3JvdW5kSW1hZ2UocGFybGlhbWVudEltYWdlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChNT05USFNbaV0gKyAiICgiICsgTE9XU1tpXSArICJDLi4uIiArIEhJR0hTW2ldICsgIkMpIik7Ci0JfQotCWZpbmFsIGludCBjbGllbnRXaWR0aCA9IHRhYmxlLmdldENsaWVudEFyZWEoKS53aWR0aDsKLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuIFRoZXJlZm9yZSBpdCBpcwotCSAqIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUgYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaW50IGl0ZW1JbmRleCA9IHRhYmxlLmluZGV4T2YoKFRhYmxlSXRlbSlldmVudC5pdGVtKTsKLQkJCWludCByaWdodFggPSAoSElHSFNbaXRlbUluZGV4XSAtIFNDQUxFX01JTikgKiBjbGllbnRXaWR0aCAvIFNDQUxFX1JBTkdFOwotCQkJZXZlbnQud2lkdGggPSByaWdodFg7Ci0JCX0KLQl9KTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgaXRlbUluZGV4ID0gdGFibGUuaW5kZXhPZigoVGFibGVJdGVtKWV2ZW50Lml0ZW0pOwotCQkJaW50IGxlZnRYID0gKExPV1NbaXRlbUluZGV4XSAtIFNDQUxFX01JTikgKiBjbGllbnRXaWR0aCAvIFNDQUxFX1JBTkdFOwotCQkJaW50IHJpZ2h0WCA9IChISUdIU1tpdGVtSW5kZXhdIC0gU0NBTEVfTUlOKSAqIGNsaWVudFdpZHRoIC8gU0NBTEVfUkFOR0U7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJUmVjdGFuZ2xlIGNsaXBwaW5nID0gZ2MuZ2V0Q2xpcHBpbmcoKTsKLQkJCWNsaXBwaW5nLnggPSBsZWZ0WDsKLQkJCWNsaXBwaW5nLndpZHRoID0gcmlnaHRYIC0gbGVmdFg7Ci0JCQlnYy5zZXRDbGlwcGluZyhjbGlwcGluZyk7Ci0JCQlDb2xvciBvbGRGb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJQ29sb3Igb2xkQmFja2dyb3VuZCA9IGdjLmdldEJhY2tncm91bmQoKTsKLQkJCWdjLnNldEZvcmVncm91bmQoYmx1ZSk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCAvIDIsIGV2ZW50LmhlaWdodCwgZmFsc2UpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCh3aGl0ZSk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKHJlZCk7Ci0JCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoCi0JCQkJZXZlbnQueCArIGV2ZW50LndpZHRoIC8gMiwgZXZlbnQueSwgZXZlbnQud2lkdGggLyAyLCBldmVudC5oZWlnaHQsIGZhbHNlKTsKLQkJCWdjLnNldEZvcmVncm91bmQob2xkRm9yZWdyb3VuZCk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKG9sZEJhY2tncm91bmQpOwotCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuQkFDS0dST1VORDsKLQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkhPVDsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQkvLyBwYXJsaWFtZW50SW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQyMzRkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIHNuaXBwZXQ6IGltcGxlbWVudCBzdGFuZGFyZCB0cmVlIGNoZWNrIGJveCBiZWhhdmlvciAoU1dULkNIRUNLKQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI3NCB7Ci0JCi0Jc3RhdGljIHZvaWQgY2hlY2tQYXRoKFRyZWVJdGVtIGl0ZW0sIGJvb2xlYW4gY2hlY2tlZCwgYm9vbGVhbiBncmF5ZWQpIHsKLQkgICAgaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCSAgICBpZiAoZ3JheWVkKSB7Ci0JICAgICAgICBjaGVja2VkID0gdHJ1ZTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIGludCBpbmRleCA9IDA7Ci0JICAgICAgICBUcmVlSXRlbVtdIGl0ZW1zID0gaXRlbS5nZXRJdGVtcygpOwotCSAgICAgICAgd2hpbGUgKGluZGV4IDwgaXRlbXMubGVuZ3RoKSB7Ci0JICAgICAgICAgICAgVHJlZUl0ZW0gY2hpbGQgPSBpdGVtc1tpbmRleF07Ci0JICAgICAgICAgICAgaWYgKGNoaWxkLmdldEdyYXllZCgpIHx8IGNoZWNrZWQgIT0gY2hpbGQuZ2V0Q2hlY2tlZCgpKSB7Ci0JICAgICAgICAgICAgICAgIGNoZWNrZWQgPSBncmF5ZWQgPSB0cnVlOwotCSAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaW5kZXgrKzsKLQkgICAgICAgIH0KLQkgICAgfQotCSAgICBpdGVtLnNldENoZWNrZWQoY2hlY2tlZCk7Ci0JICAgIGl0ZW0uc2V0R3JheWVkKGdyYXllZCk7Ci0JICAgIGNoZWNrUGF0aChpdGVtLmdldFBhcmVudEl0ZW0oKSwgY2hlY2tlZCwgZ3JheWVkKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBjaGVja0l0ZW1zKFRyZWVJdGVtIGl0ZW0sIGJvb2xlYW4gY2hlY2tlZCkgewotCSAgICBpdGVtLnNldEdyYXllZChmYWxzZSk7Ci0JICAgIGl0ZW0uc2V0Q2hlY2tlZChjaGVja2VkKTsKLQkgICAgVHJlZUl0ZW1bXSBpdGVtcyA9IGl0ZW0uZ2V0SXRlbXMoKTsKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCSAgICAgICAgY2hlY2tJdGVtcyhpdGVtc1tpXSwgY2hlY2tlZCk7Ci0JICAgIH0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCSAgICBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5DSEVDSyk7Ci0JICAgIHRyZWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkgICAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5DSEVDSykgewotCSAgICAgICAgICAgICAgICBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCSAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrZWQgPSBpdGVtLmdldENoZWNrZWQoKTsKLQkgICAgICAgICAgICAgICAgY2hlY2tJdGVtcyhpdGVtLCBjaGVja2VkKTsKLQkgICAgICAgICAgICAgICAgY2hlY2tQYXRoKGl0ZW0uZ2V0UGFyZW50SXRlbSgpLCBjaGVja2VkLCBmYWxzZSk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICB9KTsKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkgICAgICAgIFRyZWVJdGVtIGl0ZW1JID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkgICAgICAgIGl0ZW1JLnNldFRleHQoIkl0ZW0gIiArIGkpOwotCSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKLQkgICAgICAgICAgICBUcmVlSXRlbSBpdGVtSiA9IG5ldyBUcmVlSXRlbShpdGVtSSwgU1dULk5PTkUpOwotCSAgICAgICAgICAgIGl0ZW1KLnNldFRleHQoIkl0ZW0gIiArIGkgKyAiICIgKyBqKTsKLQkgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykgewotCSAgICAgICAgICAgICAgICBUcmVlSXRlbSBpdGVtSyA9IG5ldyBUcmVlSXRlbShpdGVtSiwgU1dULk5PTkUpOwotCSAgICAgICAgICAgICAgICBpdGVtSy5zZXRUZXh0KCJJdGVtICIgKyBpICsgIiAiICsgaiArICIgIiArIGspOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgfQotCSAgICB0cmVlLnNldFNpemUoMjAwLCAyMDApOwotCSAgICBzaGVsbC5wYWNrKCk7Ci0JICAgIHNoZWxsLm9wZW4oKTsKLQkgICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkgICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCSAgICB9Ci0JICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjA5ZmQyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDYW52YXMgc25pcHBldDogdXBkYXRlIGEgcG9ydGlvbiBvZiBhIENhbnZhcyBmcmVxdWVudGx5Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjc1IHsKLQotc3RhdGljIFN0cmluZyB2YWx1ZTsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgaW50IElOVEVSVkFMID0gODg4OwotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCA3NTAsIDc1MCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcyAoMTAsIDEwLCA3OTAsIDc5MCk7Ci0JZmluYWwgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY2FudmFzLnNldEJvdW5kcyAoMTAsIDEwLCA3NTAsIDc1MCk7Ci0JY2FudmFzLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJdmFsdWUgPSBTdHJpbmcudmFsdWVPZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpKTsKLQkJCWV2ZW50LmdjLmRyYXdJbWFnZSAoaW1hZ2UsIDAsIDApOwotCQkJZXZlbnQuZ2MuZHJhd1N0cmluZyAodmFsdWUsIDEwLCAxMCwgdHJ1ZSk7Ci0JCX0KLQl9KTsKLQlkaXNwbGF5LnRpbWVyRXhlYyAoSU5URVJWQUwsIG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlpZiAoY2FudmFzLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCS8vIGNhbnZhcy5yZWRyYXcgKCk7IC8vIDwtLSBiYWQsIGRhbWFnZXMgbW9yZSB0aGFuIGlzIG5lZWRlZAotCQkJR0MgZ2MgPSBuZXcgR0MgKGNhbnZhcyk7Ci0JCQlQb2ludCBleHRlbnQgPSBnYy5zdHJpbmdFeHRlbnQgKHZhbHVlICsgJzAnKTsKLQkJCWdjLmRpc3Bvc2UgKCk7Ci0JCQljYW52YXMucmVkcmF3ICgxMCwgMTAsIGV4dGVudC54LCBleHRlbnQueSwgZmFsc2UpOwotCQkJZGlzcGxheS50aW1lckV4ZWMgKElOVEVSVkFMLCB0aGlzKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKXsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3NzlmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGlzcGxheSBzbmlwcGV0OiBtYXAgZnJvbSBjb250cm9sLXJlbGF0aXZlIHRvIGRpc3BsYXktcmVsYXRpdmUgY29vcmRpbmF0ZXMKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMgKDIwMCwgMjAwLCA0MDAsIDQwMCk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCAoImNsaWNrIGluIHNoZWxsIHRvIHByaW50IGRpc3BsYXktcmVsYXRpdmUgY29vcmRpbmF0ZSIpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKGRpc3BsYXkubWFwICgoQ29udHJvbClldmVudC53aWRnZXQsIG51bGwsIHBvaW50KSk7Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0JbGFiZWwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlsYWJlbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKXsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MzA1NmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogSW1wbGVtZW50IGEgY3VzdG9tIGRvd25sb2FkIGhhbmRsZXIgZm9yIGEgTW96aWxsYSBCcm93c2VyLgotICogCi0gKiBJTVBPUlRBTlQ6IEZvciB0aGlzIHNuaXBwZXQgdG8gd29yayBwcm9wZXJseSBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cwotICogZm9yIHVzaW5nIEphdmFYUENPTSBpbiBhIHN0YW5kLWFsb25lIGFwcGxpY2F0aW9uIG11c3QgYmUgc2F0aXNmaWVkCi0gKiAoc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L2ZhcS5waHAjaG93dXNlamF2YXhwY29tKS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLm1vemlsbGEuaW50ZXJmYWNlcy4qOwotaW1wb3J0IG9yZy5tb3ppbGxhLnhwY29tLk1vemlsbGE7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjc3IHsKLQlzdGF0aWMgU2hlbGwgc2hlbGw7Ci0Jc3RhdGljIFRhYmxlIHRhYmxlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCQlzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXNoZWxsLnNldFRleHQgKCJDdXN0b20gRG93bmxvYWQgSGFuZGxlciIpOwotCi0JCUJyb3dzZXIgYnJvd3NlcjsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlciAoc2hlbGwsIFNXVC5NT1pJTExBKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UgKCkpOwotCQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5taW5pbXVtSGVpZ2h0ID0gODAwOwotCQlkYXRhLm1pbmltdW1XaWR0aCA9IDgwMDsKLQkJYnJvd3Nlci5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQotCQl0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5OT05FKTsKLQkJdGFibGUuc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmV4Y2x1ZGUgPSB0cnVlOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQluZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0KLQkJbnNJQ29tcG9uZW50UmVnaXN0cmFyIHJlZ2lzdHJhciA9IE1vemlsbGEuZ2V0SW5zdGFuY2UgKCkuZ2V0Q29tcG9uZW50UmVnaXN0cmFyICgpOwotCQlTdHJpbmcgTlNfRE9XTkxPQURfQ0lEID0gImUzZmE5RDBhLTFkZDEtMTFiMi1iZGVmLThjNzIwYjU5NzQ0NSI7Ci0JCVN0cmluZyBOU19UUkFOU0ZFUl9DT05UUkFDVElEID0gIkBtb3ppbGxhLm9yZy90cmFuc2ZlcjsxIjsKLQkJcmVnaXN0cmFyLnJlZ2lzdGVyRmFjdG9yeSAoTlNfRE9XTkxPQURfQ0lELCAiVHJhbnNmZXIiLCBOU19UUkFOU0ZFUl9DT05UUkFDVElELCBuZXcgbnNJRmFjdG9yeSAoKSB7Ci0JCQlwdWJsaWMgbnNJU3VwcG9ydHMgcXVlcnlJbnRlcmZhY2UgKFN0cmluZyB1dWlkKSB7Ci0JCQkJaWYgKHV1aWQuZXF1YWxzIChuc0lGYWN0b3J5Lk5TX0lGQUNUT1JZX0lJRCkgfHwKLQkJCQkJdXVpZC5lcXVhbHMgKG5zSUZhY3RvcnkuTlNfSVNVUFBPUlRTX0lJRCkpIHJldHVybiB0aGlzOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcHVibGljIG5zSVN1cHBvcnRzIGNyZWF0ZUluc3RhbmNlIChuc0lTdXBwb3J0cyBvdXRlciwgU3RyaW5nIGlpZCkgewotCQkJCXJldHVybiBjcmVhdGVUcmFuc2ZlciAoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxvY2tGYWN0b3J5IChib29sZWFuIGxvY2spIHt9Ci0JCX0pOwotCi0JCWJyb3dzZXIuc2V0VXJsICgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMiKTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbiAoKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSAoKTsKLQl9Ci0KLQlzdGF0aWMgbnNJVHJhbnNmZXIgY3JlYXRlVHJhbnNmZXIgKCkgewotCQkvKiBuc0lUcmFuc2ZlciBpcyBkb2N1bWVudGVkIGF0IGh0dHA6Ly93d3cueHVscGxhbmV0LmNvbS9yZWZlcmVuY2VzL3hwY29tcmVmL2lmYWNlcy9uc0lUcmFuc2Zlci5odG1sICovCi0JCXJldHVybiBuZXcgbnNJVHJhbnNmZXIgKCkgewotCQkJcHVibGljIG5zSVN1cHBvcnRzIHF1ZXJ5SW50ZXJmYWNlIChTdHJpbmcgdXVpZCkgewotCQkJCWlmICh1dWlkLmVxdWFscyAobnNJVHJhbnNmZXIuTlNfSVRSQU5TRkVSX0lJRCkgfHwKLQkJCQkJdXVpZC5lcXVhbHMgKG5zSVRyYW5zZmVyLk5TX0lXRUJQUk9HUkVTU0xJU1RFTkVSMl9JSUQpIHx8Ci0JCQkJCXV1aWQuZXF1YWxzIChuc0lUcmFuc2Zlci5OU19JV0VCUFJPR1JFU1NMSVNURU5FUl9JSUQpIHx8Ci0JCQkJCXV1aWQuZXF1YWxzIChuc0lUcmFuc2Zlci5OU19JU1VQUE9SVFNfSUlEKSkgcmV0dXJuIHRoaXM7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBvblN0YXRlQ2hhbmdlIChuc0lXZWJQcm9ncmVzcyB3ZWJQcm9ncmVzcywgbnNJUmVxdWVzdCByZXF1ZXN0LCBsb25nIHN0YXRlRmxhZ3MsIGxvbmcgc3RhdHVzKSB7Ci0JCQkJaWYgKChzdGF0ZUZsYWdzICYgbnNJV2ViUHJvZ3Jlc3NMaXN0ZW5lci5TVEFURV9TVE9QKSAhPSAwKSB7Ci0JCQkJCXJlbW92ZUZyb21UYWJsZSAoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlNjQgKG5zSVdlYlByb2dyZXNzIHdlYlByb2dyZXNzLCBuc0lSZXF1ZXN0IHJlcXVlc3QsIGxvbmcgY3VyU2VsZlByb2dyZXNzLCBsb25nIG1heFNlbGZQcm9ncmVzcywgbG9uZyBjdXJUb3RhbFByb2dyZXNzLCBsb25nIG1heFRvdGFsUHJvZ3Jlc3MpIHsKLQkJCQlsb25nIGN1cnJlbnRLQnl0ZXMgPSBjdXJUb3RhbFByb2dyZXNzIC8gMTAyNDsKLQkJCQlsb25nIHRvdGFsS0J5dGVzID0gbWF4VG90YWxQcm9ncmVzcyAvIDEwMjQ7Ci0JCQkJdGFibGVJdGVtLnNldFRleHQgKDEsIGJhc2VTdHJpbmcgKyAiICgiICsgY3VycmVudEtCeXRlcyArICIvIiArIHRvdGFsS0J5dGVzICsgIikiKTsKLQkJCQl0YWJsZS5nZXRDb2x1bW4gKDEpLnBhY2sgKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpbml0IChuc0lVUkkgc291cmNlLCBuc0lVUkkgdGFyZ2V0LCBTdHJpbmcgZGlzcGxheU5hbWUsIG5zSU1JTUVJbmZvIE1JTUVJbmZvLCBkb3VibGUgc3RhcnRUaW1lLCBuc0lMb2NhbEZpbGUgdGVtcEZpbGUsIGZpbmFsIG5zSUNhbmNlbGFibGUgY2FuY2VsYWJsZSkgewotCQkJCXRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJYnV0dG9uID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5QVVNIKTsKLQkJCQlidXR0b24uc2V0VGV4dCAoIkNhbmNlbCIpOwotCQkJCWJ1dHRvbi5wYWNrICgpOwotCQkJCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQljYW5jZWxhYmxlLmNhbmNlbCAoTW96aWxsYS5OU19FUlJPUl9BQk9SVCk7Ci0JCQkJCQlyZW1vdmVGcm9tVGFibGUgKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJCQllZGl0b3Iuc2V0RWRpdG9yIChidXR0b24sIHRhYmxlSXRlbSwgMCk7Ci0JCQkJZWRpdG9yLm1pbmltdW1XaWR0aCA9IGJ1dHRvbi5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCWJhc2VTdHJpbmcgPSAiRG93bmxvYWRpbmcgdG8gIiArIHRhcmdldC5nZXRQYXRoICgpOwotCQkJCXRhYmxlSXRlbS5zZXRUZXh0ICgxLCBiYXNlU3RyaW5nKTsKLQkJCQlpZiAodGFibGUuZ2V0SXRlbUNvdW50ICgpID09IDEpIHsKLQkJCQkJKChHcmlkRGF0YSl0YWJsZS5nZXRMYXlvdXREYXRhICgpKS5leGNsdWRlID0gZmFsc2U7CS8qIHNob3cgdGhlIHRhYmxlICovCi0JCQkJCXRhYmxlLmdldENvbHVtbiAoMCkuc2V0V2lkdGggKGVkaXRvci5taW5pbXVtV2lkdGgpOwotCQkJCX0KLQkJCQl0YWJsZS5nZXRDb2x1bW4gKDEpLnBhY2sgKCk7Ci0JCQkJdGFibGUuZ2V0U2hlbGwgKCkubGF5b3V0ICgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgb25TdGF0dXNDaGFuZ2UgKG5zSVdlYlByb2dyZXNzIHdlYlByb2dyZXNzLCBuc0lSZXF1ZXN0IHJlcXVlc3QsIGxvbmcgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSkge30KLQkJCXB1YmxpYyB2b2lkIG9uU2VjdXJpdHlDaGFuZ2UgKG5zSVdlYlByb2dyZXNzIHdlYlByb2dyZXNzLCBuc0lSZXF1ZXN0IHJlcXVlc3QsIGxvbmcgc3RhdGUpIHt9Ci0JCQlwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlIChuc0lXZWJQcm9ncmVzcyB3ZWJQcm9ncmVzcywgbnNJUmVxdWVzdCByZXF1ZXN0LCBpbnQgY3VyU2VsZlByb2dyZXNzLCBpbnQgbWF4U2VsZlByb2dyZXNzLCBpbnQgY3VyVG90YWxQcm9ncmVzcywgaW50IG1heFRvdGFsUHJvZ3Jlc3MpIHt9Ci0JCQlwdWJsaWMgdm9pZCBvbkxvY2F0aW9uQ2hhbmdlIChuc0lXZWJQcm9ncmVzcyB3ZWJQcm9ncmVzcywgbnNJUmVxdWVzdCByZXF1ZXN0LCBuc0lVUkkgbG9jYXRpb24pIHt9Ci0KLQkJCS8qIHRoZSBmb2xsb3dpbmcgYXJlIG5vdCBwYXJ0IG9mIHRoZSBuc0lUcmFuc2ZlciBpbnRlcmZhY2UgYnV0IGFyZSBoZXJlIGZvciB0aGUgc25pcHBldCdzIGNvbnZlbmllbmNlICovCi0JCQlCdXR0b24gYnV0dG9uOwotCQkJVGFibGVJdGVtIHRhYmxlSXRlbTsKLQkJCVN0cmluZyBiYXNlU3RyaW5nOwotCi0JCQl2b2lkIHJlbW92ZUZyb21UYWJsZSAoKSB7Ci0JCQkJdGFibGVJdGVtLmRpc3Bvc2UgKCk7Ci0JCQkJYnV0dG9uLmRpc3Bvc2UgKCk7Ci0JCQkJaWYgKHRhYmxlLmdldEl0ZW1Db3VudCAoKSA9PSAwKSB7Ci0JCQkJCSgoR3JpZERhdGEpdGFibGUuZ2V0TGF5b3V0RGF0YSAoKSkuZXhjbHVkZSA9IHRydWU7CS8qIGhpZGUgdGhlIHRhYmxlICovCi0JCQkJfQotCQkJCXRhYmxlLmdldENvbHVtbiAoMSkucGFjayAoKTsKLQkJCQl0YWJsZS5nZXRTaGVsbCAoKS5sYXlvdXQgKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzI2ZDVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sIHRpcCBzbmlwcGV0OiBzaG93IGEgdG9vbCB0aXAgaWZmIGl0J3Mgbm90IGZ1bGx5IHZpc2libGUKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjc4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcyAoMTAsIDEwLCAzMDAsIDEwMCk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCAoInJlc2l6ZSB0aGUgU2hlbGwgdGhlbiBob3ZlciBvdmVyIHRoaXMgTGFiZWwiKTsKLQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRW50ZXIsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcmVxdWlyZWRTaXplID0gbGFiZWwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQlQb2ludCBsYWJlbFNpemUgPSBsYWJlbC5nZXRTaXplICgpOwotCQkJYm9vbGVhbiBmdWxseVZpc2libGUgPSByZXF1aXJlZFNpemUueCA8PSBsYWJlbFNpemUueCAmJiByZXF1aXJlZFNpemUueSA8PSBsYWJlbFNpemUueTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkxhYmVsIGlzIGZ1bGx5IHZpc2libGU6ICIgKyBmdWxseVZpc2libGUpOwotCQkJbGFiZWwuc2V0VG9vbFRpcFRleHQgKGZ1bGx5VmlzaWJsZSA/IG51bGwgOiBsYWJlbC5nZXRUZXh0ICgpKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlmN2U4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBkcmF3IGEgcmVmbGVjdGlvbiBvZiBhbiBpbWFnZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULkRPVUJMRV9CVUZGRVJFRCk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCAoKSk7Ci0JCWZpbmFsIEltYWdlIGltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZSAoU1dULklDT05fUVVFU1RJT04pOwotCQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCQlHQyBnYyA9IGUuZ2M7Ci0JCQkJaW50IHggPSAxMCwgeSA9IDEwOwotCQkJCWdjLmRyYXdJbWFnZSAoaW1hZ2UsIHgsIHkpOwotCQkJCVRyYW5zZm9ybSB0ciA9IG5ldyBUcmFuc2Zvcm0gKGUuZGlzcGxheSk7Ci0JCQkJdHIuc2V0RWxlbWVudHMgKDEsIDAsIDAsIC0xLCAxLCAyKih5K3JlY3QuaGVpZ2h0KSk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtICh0cik7Ci0JCQkJZ2MuZHJhd0ltYWdlIChpbWFnZSwgeCwgeSk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtIChudWxsKTsKLQkJCQlDb2xvciBiYWNrZ3JvdW5kID0gZ2MuZ2V0QmFja2dyb3VuZCAoKTsKLQkJCQlQYXR0ZXJuIHAgPSBuZXcgUGF0dGVybiAoZS5kaXNwbGF5LCB4LCB5K3JlY3QuaGVpZ2h0LCB4LCB5KygyKnJlY3QuaGVpZ2h0KSwgYmFja2dyb3VuZCwgMCwgYmFja2dyb3VuZCwgMjU1KTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybiAocCk7Ci0JCQkJZ2MuZmlsbFJlY3RhbmdsZSAoeCwgeStyZWN0LmhlaWdodCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJCXAuZGlzcG9zZSAoKTsKLQkJCQl0ci5kaXNwb3NlICgpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZSAoNjAwLCA0MDApOwotCQlzaGVsbC5vcGVuICgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpCi0JCQkJZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0JfQotCQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODkxZmNjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogb3BlbiBhIHNoZWxsIG1heGltaXplZCAoZnVsbCBzY3JlZW4pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TWF4aW1pemVkICh0cnVlKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDliMWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGRyYXcgYSBtdWx0aS1ncmFkaWVudCAod2l0aG91dCBhZHZhbmNlZCBncmFwaGljcykKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjgwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCAoKSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5QYWludCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCUNvbG9yIGNvbG9yMSA9IG5ldyBDb2xvciAoZGlzcGxheSwgMjM0LCAyNDYsIDI1Myk7Ci0JCQlDb2xvciBjb2xvcjIgPSBuZXcgQ29sb3IgKGRpc3BsYXksIDIxNywgMjQwLCAyNTIpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcjEpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvcjIpOwotCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlIChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQgLyAyLCB0cnVlKTsKLQkJCWNvbG9yMS5kaXNwb3NlICgpOwotCQkJY29sb3IyLmRpc3Bvc2UgKCk7Ci0JCQlDb2xvciBjb2xvcjMgPSBuZXcgQ29sb3IgKGRpc3BsYXksIDE5MCwgMjMwLCAyNTMpOwotCQkJQ29sb3IgY29sb3I0ID0gbmV3IENvbG9yIChkaXNwbGF5LCAxNjcsIDIxNywgMjQ1KTsKLQkJCWdjLnNldEZvcmVncm91bmQoY29sb3IzKTsKLQkJCWdjLnNldEJhY2tncm91bmQoY29sb3I0KTsKLQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSAocmVjdC54LCByZWN0LnkgKyAocmVjdC5oZWlnaHQgLyAyKSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQgLyAyICsgMSwgdHJ1ZSk7Ci0JCQljb2xvcjMuZGlzcG9zZSAoKTsKLQkJCWNvbG9yNC5kaXNwb3NlICgpOwotCQkJCi0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDY0KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotCQkJZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZTBhY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGRyYXcgYSBtdWx0aS1ncmFkaWVudAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuTk9fQkFDS0dST1VORCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJR0MgZ2MgPSBlLmdjOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yIChkaXNwbGF5LCAyMzQsIDI0NiwgMjUzKTsKLQkJCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvciAoZGlzcGxheSwgMjE3LCAyNDAsIDI1Mik7Ci0JCQlDb2xvciBjb2xvcjMgPSBuZXcgQ29sb3IgKGRpc3BsYXksIDE5MCwgMjMwLCAyNTMpOwotCQkJQ29sb3IgY29sb3I0ID0gbmV3IENvbG9yIChkaXNwbGF5LCAxNjcsIDIxNywgMjQ1KTsKLQkJCVBhdHRlcm4gcDEgPSBuZXcgUGF0dGVybiAoZGlzcGxheSwgMCwgMCwgMCwgcmVjdC5oZWlnaHQgLyAyLCBjb2xvcjEsIGNvbG9yMik7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybiAocDEpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZSAocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0IC8gMik7Ci0JCQlQYXR0ZXJuIHAyID0gbmV3IFBhdHRlcm4gKGRpc3BsYXksIDAsIHJlY3QuaGVpZ2h0IC8gMiwgMCwgcmVjdC5oZWlnaHQsIGNvbG9yMywgY29sb3I0KTsKLQkJCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuIChwMik7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlIChyZWN0LngsIHJlY3QueSArIChyZWN0LmhlaWdodCAvIDIpLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCAvIDIgKyAxKTsKLQkJCXAxLmRpc3Bvc2UgKCk7Ci0JCQlwMi5kaXNwb3NlICgpOwotCQkJY29sb3IxLmRpc3Bvc2UgKCk7Ci0JCQljb2xvcjIuZGlzcG9zZSAoKTsKLQkJCWNvbG9yMy5kaXNwb3NlICgpOwotCQkJY29sb3I0LmRpc3Bvc2UgKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDY0KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotCQkJZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OWRjODUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb3B5L3Bhc3RlIGltYWdlIHRvL2Zyb20gY2xpcGJvYXJkLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjgyIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoZGlzcGxheSk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzaGVsbC5zZXRUZXh0KCJDbGlwYm9hcmQgSW1hZ2VUcmFuc2ZlciIpOwotCi0JICAgIGZpbmFsIEJ1dHRvbiBpbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5OT05FICk7Ci0JICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JICAgIGdkLm1pbmltdW1IZWlnaHQgPSA0MDA7Ci0JICAgIGdkLm1pbmltdW1XaWR0aCA9IDYwMDsKLQkgICAgaW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JICAgIAotCSAgICBmaW5hbCBUZXh0IGltYWdlVGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQkgICAgaW1hZ2VUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25zID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQlidXR0b25zLnNldExheW91dChuZXcgR3JpZExheW91dCg0LCB0cnVlKSk7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIk9wZW4iKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyAoc2hlbGwsIFNXVC5PUEVOKTsKLQkJCQlkaWFsb2cuc2V0VGV4dCgiT3BlbiBhbiBpbWFnZSBmaWxlIG9yIGNhbmNlbCIpOwotCQkJCVN0cmluZyBzdHJpbmcgPSBkaWFsb2cub3BlbiAoKTsKLQkJCQlpZiAoc3RyaW5nICE9IG51bGwpIHsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZUJ1dHRvbi5nZXRJbWFnZSgpOwotCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBzdHJpbmcpOwotCQkJCQlpbWFnZUJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCQkJCWltYWdlVGV4dC5zZXRUZXh0KHN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlidXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIkNvcHkiKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZUJ1dHRvbi5nZXRJbWFnZSgpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCUltYWdlVHJhbnNmZXIgaW1hZ2VUcmFuc2ZlciA9IEltYWdlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQkJVGV4dFRyYW5zZmVyIHRleHRUcmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtde2ltYWdlLmdldEltYWdlRGF0YSgpLCBpbWFnZVRleHQuZ2V0VGV4dCgpfSwgCi0JCQkJCQkJbmV3IFRyYW5zZmVyW117aW1hZ2VUcmFuc2ZlciwgdGV4dFRyYW5zZmVyfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlidXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIlBhc3RlIik7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSAoSW1hZ2VEYXRhKWNsaXBib2FyZC5nZXRDb250ZW50cyhJbWFnZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJCWlmIChpbWFnZURhdGEgIT0gbnVsbCkgewotCQkJCQlpbWFnZUJ1dHRvbi5zZXRUZXh0KCIiKTsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZUJ1dHRvbi5nZXRJbWFnZSgpOwotCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQkJCQlpbWFnZUJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW1hZ2VCdXR0b24uc2V0VGV4dCgiTm8gaW1hZ2UiKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKWNsaXBib2FyZC5nZXRDb250ZW50cyhUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJCQlpbWFnZVRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbWFnZVRleHQuc2V0VGV4dCgiIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiQ2xlYXIiKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaW1hZ2VCdXR0b24uc2V0VGV4dCgiIik7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZUJ1dHRvbi5nZXRJbWFnZSgpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaW1hZ2VCdXR0b24uc2V0SW1hZ2UobnVsbCk7Ci0JCQkJaW1hZ2VUZXh0LnNldFRleHQoIiIpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmUwY2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IERyYXcgbGVmdCBhbGlnbmVkIGljb24sIHRleHQgYW5kIHNlbGVjdGlvbgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODMgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIFNuaXBwZXQyODMuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZWNsaXBzZS5wbmciKSk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpICsgIiB3aXRoIGxvbmcgdGV4dCB0aGF0IHNjcm9sbHMuIik7Ci0JCQlpZiAoaSAlIDIgPT0gMSkgaXRlbS5zZXRJbWFnZSAoaW1hZ2UpOwotCQl9Ci0JCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSB0YWJsZS5nZXRDbGllbnRBcmVhICgpOwotCQkJCVBvaW50IHBvaW50ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCQlpZiAodGFibGUuZ2V0SXRlbShwb2ludCkgIT0gbnVsbCkgcmV0dXJuOwotCQkJCWZvciAoaW50IGk9dGFibGUuZ2V0VG9wSW5kZXggKCk7IGk8dGFibGUuZ2V0SXRlbUNvdW50KCk7IGkrKykgewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCQlSZWN0YW5nbGUgaXRlbVJlY3QgPSBpdGVtLmdldEJvdW5kcyAoKTsKLQkJCQkJaWYgKCFpdGVtUmVjdC5pbnRlcnNlY3RzIChyZWN0KSkgcmV0dXJuOwotCQkJCQlpdGVtUmVjdC54ID0gcmVjdC54OwotCQkJCQlpdGVtUmVjdC53aWR0aCA9IHJlY3Qud2lkdGg7Ci0JCQkJCWlmIChpdGVtUmVjdC5jb250YWlucyAocG9pbnQpKSB7Ci0JCQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24gKGl0ZW0pOwotCQkJCQkJRXZlbnQgc2VsZWN0aW9uRXZlbnQgPSBuZXcgRXZlbnQgKCk7Ci0JCQkJCQlzZWxlY3Rpb25FdmVudC5pdGVtID0gaXRlbTsKLQkJCQkJCXRhYmxlLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBzZWxlY3Rpb25FdmVudCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkvKgotCQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkJICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCQkgKi8KLQkJdGFibGUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudC5kZXRhaWwgJj0gflNXVC5GT1JFR1JPVU5EOwotCQkJCVN0cmluZyBvc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLQkJCQlpZiAob3NOYW1lICE9IG51bGwgJiYgb3NOYW1lLmluZGV4T2YgKCJXaW5kb3dzIikgIT0gLTEpIHsKLQkJCQkJaWYgKG9zTmFtZS5pbmRleE9mICgiVmlzdGEiKSAhPSAtMSB8fCBvc05hbWUuaW5kZXhPZiAoInVua25vd24iKSAhPSAtMSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWV2ZW50LmRldGFpbCAmPSB+KFNXVC5GT1JFR1JPVU5EIHwgU1dULlNFTEVDVEVEIHwgU1dULkhPVCB8IFNXVC5GT0NVU0VEKTsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCQkJCVJlY3RhbmdsZSByZWN0ID0gdGFibGUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQlSZWN0YW5nbGUgaXRlbVJlY3QgPSBpdGVtLmdldEJvdW5kcyAoKTsKLQkJCQlpdGVtUmVjdC54ID0gcmVjdC54OwotCQkJCWl0ZW1SZWN0LndpZHRoID0gcmVjdC53aWR0aDsKLQkJCQlnYy5zZXRDbGlwcGluZyAoKFJlY3RhbmdsZSkgbnVsbCk7Ci0JCQkJZ2MuZmlsbFJlY3RhbmdsZSAoaXRlbVJlY3QpOwotCQkJfQotCQl9KTsKLQkJdGFibGUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCUltYWdlIGltYWdlID0gaXRlbS5nZXRJbWFnZSAoMCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQgKDApOwotCQkJCVBvaW50IHRleHRFeHRlbnQgPSBnYy5zdHJpbmdFeHRlbnQgKHRleHQpOwotCQkJCVJlY3RhbmdsZSBpbWFnZVJlY3QgPSBpdGVtLmdldEltYWdlQm91bmRzKDApOwotCQkJCVJlY3RhbmdsZSB0ZXh0UmVjdCA9IGl0ZW0uZ2V0VGV4dEJvdW5kcyAoMCk7Ci0JCQkJaW50IHRleHRZID0gdGV4dFJlY3QueSArIE1hdGgubWF4ICgwLCAodGV4dFJlY3QuaGVpZ2h0IC0gdGV4dEV4dGVudC55KSAvIDIpOwotCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCWdjLmRyYXdTdHJpbmcodGV4dCwgaW1hZ2VSZWN0LngsIHRleHRZLCB0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlSZWN0YW5nbGUgaW1hZ2VFeHRlbnQgPSBpbWFnZS5nZXRCb3VuZHMgKCk7Ci0JCQkJCWludCBpbWFnZVkgPSBpbWFnZVJlY3QueSArIE1hdGgubWF4ICgwLCAoaW1hZ2VSZWN0LmhlaWdodCAtIGltYWdlRXh0ZW50LmhlaWdodCkgLyAyKTsKLQkJCQkJZ2MuZHJhd0ltYWdlIChpbWFnZSwgaW1hZ2VSZWN0LngsIGltYWdlWSk7Ci0JCQkJCWdjLmRyYXdTdHJpbmcgKHRleHQsIHRleHRSZWN0LngsIHRleHRZLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTNmM2EzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZHJhZyBhIFVSTCBiZXR3ZWVuIHR3byBsYWJlbHMuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiVVJMVHJhbnNmZXIiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGFiZWwxLnNldFRleHQgKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUik7Ci0Jc2V0RHJhZ1NvdXJjZSAobGFiZWwxKTsKLQlzZXREcm9wVGFyZ2V0IChsYWJlbDIpOwotCXNoZWxsLnNldFNpemUoNjAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREcmFnU291cmNlIChmaW5hbCBMYWJlbCBsYWJlbCkgewotCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCWZpbmFsIERyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UgKGxhYmVsLCBvcGVyYXRpb25zKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1VSTFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyIChuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQkJCWUuZGF0YSA9IGxhYmVsLmdldFRleHQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIHNldERyb3BUYXJnZXQgKGZpbmFsIExhYmVsIGxhYmVsKSB7Ci0JaW50IG9wZXJhdGlvbnMgPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldChsYWJlbCwgb3BlcmF0aW9ucyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtVUkxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lciAobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBETkQuRFJPUF9OT05FKQotCQkJCWUuZGV0YWlsID0gRE5ELkRST1BfTElOSzsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZSkgewotCQkJaWYgKGUuZGV0YWlsID09IERORC5EUk9QX05PTkUpCi0JCQkJZS5kZXRhaWwgPSBETkQuRFJPUF9MSU5LOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSA9PSBudWxsKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlsYWJlbC5zZXRUZXh0KCgoU3RyaW5nKSBldmVudC5kYXRhKSk7Ci0JCX0KLQl9KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyNzBjMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGNyZWF0ZSBhIGNpcmN1bGFyIHNoZWxsIGZyb20gYSBwYXRoLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI4NSB7Ci0Jc3RhdGljIHZvaWQgbG9hZFBhdGgoUmVnaW9uIHJlZ2lvbiwgZmxvYXRbXSBwb2ludHMsIGJ5dGVbXSB0eXBlcykgewotCQlpbnQgc3RhcnQgPSAwLCBlbmQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzd2l0Y2ggKHR5cGVzW2ldKSB7Ci0JCQkJY2FzZSBTV1QuUEFUSF9NT1ZFX1RPOiB7Ci0JCQkJCWlmIChzdGFydCAhPSBlbmQpIHsKLQkJCQkJCWludCBuID0gMDsKLQkJCQkJCWludFtdIHRlbXAgPSBuZXcgaW50W2VuZCAtIHN0YXJ0XTsKLQkJCQkJCWZvciAoaW50IGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7Ci0JCQkJCQkJdGVtcFtuKytdID0gTWF0aC5yb3VuZChwb2ludHNba10pOwotCQkJCQkJfQotCQkJCQkJcmVnaW9uLmFkZCh0ZW1wKTsKLQkJCQkJfQotCQkJCQlzdGFydCA9IGVuZDsKLQkJCQkJZW5kICs9IDI7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QQVRIX0xJTkVfVE86IHsKLQkJCQkJZW5kICs9IDI7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QQVRIX0NMT1NFOiB7Ci0JCQkJCWlmIChzdGFydCAhPSBlbmQpIHsKLQkJCQkJCWludCBuID0gMDsKLQkJCQkJCWludFtdIHRlbXAgPSBuZXcgaW50W2VuZCAtIHN0YXJ0XTsKLQkJCQkJCWZvciAoaW50IGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7Ci0JCQkJCQkJdGVtcFtuKytdID0gTWF0aC5yb3VuZChwb2ludHNba10pOwotCQkJCQkJfQotCQkJCQkJcmVnaW9uLmFkZCh0ZW1wKTsKLQkJCQkJfQotCQkJCQlzdGFydCA9IGVuZDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaW50IHdpZHRoID0gMjUwLCBoZWlnaHQgPSAyNTA7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQkJZmluYWwgUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlzcGxheSk7Ci0JCXBhdGguYWRkQXJjKDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIDM2MCk7Ci0JCVBhdGggcGF0aDIgPSBuZXcgUGF0aChkaXNwbGF5LCBwYXRoLCAwLjFmKTsKLQkJcGF0aC5kaXNwb3NlKCk7Ci0JCVBhdGhEYXRhIGRhdGEgPSBwYXRoMi5nZXRQYXRoRGF0YSgpOwotCQlwYXRoMi5kaXNwb3NlKCk7Ci0JCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCQlsb2FkUGF0aChyZWdpb24sIGRhdGEucG9pbnRzLCBkYXRhLnR5cGVzKTsKLQkJc2hlbGwuc2V0UmVnaW9uKHJlZ2lvbik7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQkJY2FzZSBTV1QuTW91c2VEb3duOiB7Ci0JCQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIFNXVC5QYWludDogewotCQkJCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCQkJUGF0dGVybiBwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGlzcGxheSwgcmVjdC54LCByZWN0LnkKLQkJCQkJCQkJKyByZWN0LmhlaWdodCwgcmVjdC54ICsgcmVjdC53aWR0aCwgcmVjdC55LCBkaXNwbGF5Ci0JCQkJCQkJCS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSksIGRpc3BsYXkKLQkJCQkJCQkJLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQkJCQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JCQkJCQlnYy5maWxsUmVjdGFuZ2xlKHJlY3QpOwotCQkJCQkJcGF0dGVybi5kaXNwb3NlKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIGxpc3RlbmVyKTsKLQkJc2hlbGwuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlyZWdpb24uZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NWVhM2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIHVzZSBhIG1lbnUgaXRlbSdzIGFybUxpc3RlbmVyIHRvIHVwZGF0ZSBhIHN0YXR1cyBsaW5lLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjg2IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQlDYW52YXMgYmxhbmtDYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJYmxhbmtDYW52YXMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMjAwLCAyMDApKTsKLQkJZmluYWwgTGFiZWwgc3RhdHVzTGluZSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlzdGF0dXNMaW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCi0JCU1lbnUgYmFyID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuQkFSKTsKLQkJc2hlbGwuc2V0TWVudUJhciAoYmFyKTsKLQkJCi0JCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChiYXIsIFNXVC5DQVNDQURFKTsKLQkJbWVudUl0ZW0uc2V0VGV4dCAoIlRlc3QiKTsKLQkJTWVudSBtZW51ID0gbmV3IE1lbnUoYmFyKTsKLQkJbWVudUl0ZW0uc2V0TWVudSAobWVudSk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCQlpdGVtLmFkZEFybUxpc3RlbmVyKG5ldyBBcm1MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRBcm1lZChBcm1FdmVudCBlKSB7Ci0JCQkJCXN0YXR1c0xpbmUuc2V0VGV4dCgoKE1lbnVJdGVtKWUuZ2V0U291cmNlKCkpLmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWY4M2I0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IHNlYXJjaCBmb3IgYSBzdHJpbmcgaW4gYSB0cmVlIChyZWN1cnNpdmVseSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODcgewotCi1zdGF0aWMgVHJlZSB0cmVlOwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIFN0cmluZyBTRUFSQ0hfU1RSSU5HID0gIjRiIjsKLQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMgKDEwLDEwLDMwMCwzMDApOwotCXNoZWxsLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCi0JLyogY3JlYXRlIHRoZSBUcmVlICovCi0JdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0cmVlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JdHJlZS5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCW5ldyBUcmVlQ29sdW1uICh0cmVlLCBTV1QuTk9ORSkuc2V0V2lkdGggKDkwKTsKLQl9Ci0JaW50IGluZGV4ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gY3JlYXRlSXRlbSAobnVsbCwgaW5kZXgrKyk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCQlpdGVtID0gY3JlYXRlSXRlbSAoaXRlbSwgaW5kZXgrKyk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCAoIkZpbmQgJyIgKyBTRUFSQ0hfU1RSSU5HICsgIiciKTsKLQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJaW50IGl0ZW1Db3VudCA9IHRyZWUuZ2V0SXRlbUNvdW50ICgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSB0cmVlLmdldEl0ZW0gKGkpOwotCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGZpbmQgKGl0ZW0sIFNFQVJDSF9TVFJJTkcpOwotCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkZvdW5kIGl0Iik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEaWQgbm90IGZpbmQgaXQiKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotLyogZm9yIGNyZWF0aW5nIHNhbXBsZSBUcmVlICovCi1zdGF0aWMgVHJlZUl0ZW0gY3JlYXRlSXRlbSAoVHJlZUl0ZW0gcGFyZW50LCBpbnQgaXRlbUluZGV4KSB7Ci0JVHJlZUl0ZW0gbmV3SXRlbSA9IG51bGw7Ci0JaWYgKHBhcmVudCA9PSBudWxsKSB7CS8qIHJvb3QgbGV2ZWwgaXRlbSAqLwotCQluZXdJdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JfSBlbHNlIHsKLQkJbmV3SXRlbSA9IG5ldyBUcmVlSXRlbSAocGFyZW50LCBTV1QuTk9ORSk7Ci0JfQotCVN0cmluZyBpbmRleFN0cmluZyA9IFN0cmluZy52YWx1ZU9mIChpdGVtSW5kZXgpOyAKLQluZXdJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsKLQkJaW5kZXhTdHJpbmcgKyAnYScsIGluZGV4U3RyaW5nICsgJ2InLCBpbmRleFN0cmluZyArICdjJ30pOwotCXJldHVybiBuZXdJdGVtOwotfQotCi0vKiByZWN1cnNpdmUgZmluZCAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGZpbmQgKFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBzZWFyY2hTdHJpbmcpIHsKLQkvKiBjaGVjayB0aGlzIGl0ZW0gKi8KLQlmb3IgKGludCBpID0gMDsgaSA8IHRyZWUuZ2V0Q29sdW1uQ291bnQgKCk7IGkrKykgewotCQlTdHJpbmcgY29udGVudHMgPSBpdGVtLmdldFRleHQgKGkpOwotCQlpZiAoKGNvbnRlbnRzLnRvVXBwZXJDYXNlICgpLmluZGV4T2YgKHNlYXJjaFN0cmluZy50b1VwcGVyQ2FzZSAoKSkpICE9IC0xKSB7Ci0JCQl0cmVlLnNldFNlbGVjdGlvbiAoaXRlbSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCWlmICghaXRlbS5nZXRFeHBhbmRlZCAoKSkgcmV0dXJuIGZhbHNlOyAvKiBkb24ndCBjaGVjayBjaGlsZCBpdGVtcyAqLwotCi0JLyogY2hlY2sgY2hpbGQgaXRlbXMgKi8KLQlpbnQgY2hpbGRDb3VudCA9IGl0ZW0uZ2V0SXRlbUNvdW50ICgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGNoaWxkID0gaXRlbS5nZXRJdGVtIChpKTsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmluZCAoY2hpbGQsIHNlYXJjaFN0cmluZyk7Ci0JCWlmIChzdWNjZXNzKSByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NGJmYjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBUb29sQmFyIGNvbnRhaW5pbmcgYW5pbWF0ZWQgR0lGcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODggewotCQotCXN0YXRpYyBEaXNwbGF5IGRpc3BsYXk7Ci0Jc3RhdGljIFNoZWxsIHNoZWxsOwotCXN0YXRpYyBHQyBzaGVsbEdDOwotCXN0YXRpYyBDb2xvciBzaGVsbEJhY2tncm91bmQ7Ci0Jc3RhdGljIEltYWdlTG9hZGVyW10gbG9hZGVyOwotCXN0YXRpYyBJbWFnZURhdGFbXVtdIGltYWdlRGF0YUFycmF5OwotCXN0YXRpYyBUaHJlYWQgYW5pbWF0ZVRocmVhZFtdOwotCXN0YXRpYyBJbWFnZVtdW10gaW1hZ2U7Ci0JcHJpdmF0ZSBzdGF0aWMgVG9vbEl0ZW0gaXRlbVtdOwotCXN0YXRpYyBmaW5hbCBib29sZWFuIHVzZUdJRkJhY2tncm91bmQgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCQlzaGVsbEJhY2tncm91bmQgPSBzaGVsbC5nZXRCYWNrZ3JvdW5kKCk7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOIHwgU1dULk1VTFRJKTsKLQkJZGlhbG9nLnNldFRleHQoIlNlbGVjdCBNdWx0aXBsZSBBbmltYXRlZCBHSUZzIik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouZ2lmIn0pOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBkaWFsb2cub3BlbigpOwotCQlTdHJpbmcgZmlsZW5hbWVzW10gPSBkaWFsb2cuZ2V0RmlsZU5hbWVzKCk7Ci0JCWludCBudW1Ub29sQmFySXRlbXMgPSBmaWxlbmFtZXMubGVuZ3RoOwotCQlpZiAobnVtVG9vbEJhckl0ZW1zID4gMCkgewotCQkJdHJ5IHsKLQkJCQlsb2FkQWxsSW1hZ2VzKG5ldyBGaWxlKGZpbGVuYW1lKS5nZXRQYXJlbnQoKSwgZmlsZW5hbWVzKTsKLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJUaGVyZSB3YXMgYW4gZXJyb3IgbG9hZGluZyBhbiBpbWFnZS4iKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JCQlpdGVtID0gbmV3IFRvb2xJdGVtW251bVRvb2xCYXJJdGVtc107Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bVRvb2xCYXJJdGVtczsgaSsrKSB7Ci0JCQkJaXRlbVtpXSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQkJCWl0ZW1baV0uc2V0SW1hZ2UoaW1hZ2VbaV1bMF0pOwotCQkJfQotCQkJdG9vbEJhci5wYWNrICgpOwotCQkJc2hlbGwub3BlbiAoKTsKLQkJCQotCQkJc3RhcnRBbmltYXRpb25UaHJlYWRzKCk7Ci0JCQkKLQkJCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJCX0KLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Ub29sQmFySXRlbXM7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW1hZ2VbaV0ubGVuZ3RoOyBqKyspIHsKLQkJCQkJaW1hZ2VbaV1bal0uZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkQWxsSW1hZ2VzKFN0cmluZyBkaXJlY3RvcnksIFN0cmluZ1tdIGZpbGVuYW1lcykgdGhyb3dzIFNXVEV4Y2VwdGlvbiB7Ci0JCWludCBudW1JdGVtcyA9IGZpbGVuYW1lcy5sZW5ndGg7Ci0JCWxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcltudW1JdGVtc107Ci0JCWltYWdlRGF0YUFycmF5ID0gbmV3IEltYWdlRGF0YVtudW1JdGVtc11bXTsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2VbbnVtSXRlbXNdW107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykgewotCQkJbG9hZGVyW2ldID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQlpbnQgZnVsbFdpZHRoID0gbG9hZGVyW2ldLmxvZ2ljYWxTY3JlZW5XaWR0aDsKLQkJCWludCBmdWxsSGVpZ2h0ID0gbG9hZGVyW2ldLmxvZ2ljYWxTY3JlZW5IZWlnaHQ7Ci0JCQlpbWFnZURhdGFBcnJheVtpXSA9IGxvYWRlcltpXS5sb2FkKGRpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZW5hbWVzW2ldKTsKLQkJCWludCBudW1GcmFtZXNPZkFuaW1hdGlvbiA9IGltYWdlRGF0YUFycmF5W2ldLmxlbmd0aDsKLQkJCWltYWdlW2ldID0gbmV3IEltYWdlW251bUZyYW1lc09mQW5pbWF0aW9uXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbnVtRnJhbWVzT2ZBbmltYXRpb247IGorKykgewotCQkJCWlmIChqID09IDApIHsKLQkJCQkJLy9mb3IgdGhlIGZpcnN0IGZyYW1lIG9mIGFuaW1hdGlvbiwganVzdCBkcmF3IHRoZSBmaXJzdCBmcmFtZQotCQkJCQlpbWFnZVtpXVtqXSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGFBcnJheVtpXVtqXSk7Ci0JCQkJCWZ1bGxXaWR0aCA9IGltYWdlRGF0YUFycmF5W2ldW2pdLndpZHRoOwotCQkJCQlmdWxsSGVpZ2h0ID0gaW1hZ2VEYXRhQXJyYXlbaV1bal0uaGVpZ2h0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy9hZnRlciB0aGUgZmlyc3QgZnJhbWUgb2YgYW5pbWF0aW9uLCBkcmF3IHRoZSBiYWNrZ3JvdW5kIG9yIHByZXZpb3VzIGZyYW1lIGZpcnN0LCB0aGVuIHRoZSBuZXcgaW1hZ2UgZGF0YSAKLQkJCQkJaW1hZ2VbaV1bal0gPSBuZXcgSW1hZ2UoZGlzcGxheSwgZnVsbFdpZHRoLCBmdWxsSGVpZ2h0KTsKLQkJCQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2VbaV1bal0pOwotCQkJCQlnYy5zZXRCYWNrZ3JvdW5kKHNoZWxsQmFja2dyb3VuZCk7Ci0JCQkJCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgZnVsbFdpZHRoLCBmdWxsSGVpZ2h0KTsKLQkJCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IGltYWdlRGF0YUFycmF5W2ldW2pdOwotCQkJCQlzd2l0Y2ggKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCkgewotCQkJCQljYXNlIFNXVC5ETV9GSUxMX0JBQ0tHUk9VTkQ6Ci0JCQkJCQkvKiBGaWxsIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgYmVmb3JlIGRyYXdpbmcuICovCi0JCQkJCQlDb2xvciBiZ0NvbG9yID0gbnVsbDsKLQkJCQkJCWlmICh1c2VHSUZCYWNrZ3JvdW5kICYmIGxvYWRlcltpXS5iYWNrZ3JvdW5kUGl4ZWwgIT0gLTEpIHsKLQkJCQkJCQliZ0NvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIGltYWdlRGF0YS5wYWxldHRlLmdldFJHQihsb2FkZXJbaV0uYmFja2dyb3VuZFBpeGVsKSk7Ci0JCQkJCQl9Ci0JCQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJnQ29sb3IgIT0gbnVsbCA/IGJnQ29sb3IgOiBzaGVsbEJhY2tncm91bmQpOwotCQkJCQkJZ2MuZmlsbFJlY3RhbmdsZShpbWFnZURhdGEueCwgaW1hZ2VEYXRhLnksIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQlpZiAoYmdDb2xvciAhPSBudWxsKSBiZ0NvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJLyogUmVzdG9yZSB0aGUgcHJldmlvdXMgaW1hZ2UgYmVmb3JlIGRyYXdpbmcuICovCi0JCQkJCQlnYy5kcmF3SW1hZ2UoCi0JCQkJCQkJaW1hZ2VbaV1bai0xXSwKLQkJCQkJCQkwLAotCQkJCQkJCTAsCi0JCQkJCQkJZnVsbFdpZHRoLAotCQkJCQkJCWZ1bGxIZWlnaHQsCi0JCQkJCQkJMCwKLQkJCQkJCQkwLAotCQkJCQkJCWZ1bGxXaWR0aCwKLQkJCQkJCQlmdWxsSGVpZ2h0KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCUltYWdlIG5ld0ZyYW1lID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCQkJCWdjLmRyYXdJbWFnZShuZXdGcmFtZSwKLQkJCQkJCQkwLAotCQkJCQkJCTAsCi0JCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQluZXdGcmFtZS5kaXNwb3NlKCk7Ci0JCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uVGhyZWFkcygpIHsKLQkJYW5pbWF0ZVRocmVhZCA9IG5ldyBUaHJlYWRbaW1hZ2UubGVuZ3RoXTsKLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IGltYWdlLmxlbmd0aDsgaWkrKykgewotCQkJZmluYWwgaW50IGkgPSBpaTsKLQkJCWFuaW1hdGVUaHJlYWRbaV0gPSBuZXcgVGhyZWFkKCJBbmltYXRpb24gIitpKSB7Ci0JCQkJaW50IGltYWdlRGF0YUluZGV4ID0gMDsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnQgcmVwZWF0Q291bnQgPSBsb2FkZXJbaV0ucmVwZWF0Q291bnQ7Ci0JCQkJCQl3aGlsZSAobG9hZGVyW2ldLnJlcGVhdENvdW50ID09IDAgfHwgcmVwZWF0Q291bnQgPiAwKSB7Ci0JCQkJCQkJaW1hZ2VEYXRhSW5kZXggPSAoaW1hZ2VEYXRhSW5kZXggKyAxKSAlIGltYWdlRGF0YUFycmF5W2ldLmxlbmd0aDsKLQkJCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlpZiAoIWl0ZW1baV0uaXNEaXNwb3NlZCgpKQotCQkJCQkJCQkJCQlpdGVtW2ldLnNldEltYWdlKGltYWdlW2ldW2ltYWdlRGF0YUluZGV4XSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQkvKiBTbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBkZWxheSB0aW1lIChhZGRpbmcgY29tbW9ubHktdXNlZCBzbG93LWRvd24gZnVkZ2UgZmFjdG9ycykuICovCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW50IG1zID0gaW1hZ2VEYXRhQXJyYXlbaV1baW1hZ2VEYXRhSW5kZXhdLmRlbGF5VGltZSAqIDEwOwotCQkJCQkJCQlpZiAobXMgPCAyMCkgbXMgKz0gMzA7Ci0JCQkJCQkJCWlmIChtcyA8IDMwKSBtcyArPSAxMDsKLQkJCQkJCQkJVGhyZWFkLnNsZWVwKG1zKTsKLQkJCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfQotCi0JCQkJCQkJLyogSWYgd2UgaGF2ZSBqdXN0IGRyYXduIHRoZSBsYXN0IGltYWdlLCBkZWNyZW1lbnQgdGhlIHJlcGVhdCBjb3VudCBhbmQgc3RhcnQgYWdhaW4uICovCi0JCQkJCQkJaWYgKGltYWdlRGF0YUluZGV4ID09IGltYWdlRGF0YUFycmF5W2ldLmxlbmd0aCAtIDEpIHJlcGVhdENvdW50LS07Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSB3YXMgYW4gZXJyb3IgYW5pbWF0aW5nIHRoZSBHSUYiKTsKLQkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCWFuaW1hdGVUaHJlYWRbaV0uc2V0RGFlbW9uKHRydWUpOwotCQkJYW5pbWF0ZVRocmVhZFtpXS5zdGFydCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWU2OWZlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb21ibyBleGFtcGxlIHNuaXBwZXQ6IGFkZCBhbiBpdGVtIHRvIGEgY29tYm8gYm94Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODkgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhzaGVsbCwgU1dULk5PTkUpOwotCWNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmcgW10geyIxMTExIiwgIjIyMjIiLCAiMzMzMyIsICI0NDQ0In0pOwotCWNvbWJvLnNldFRleHQoY29tYm8uZ2V0SXRlbSgwKSk7Ci0JY29tYm8uYWRkVmVyaWZ5TGlzdGVuZXIobmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGUpIHsKLQkJCVN0cmluZyBuZXdUZXh0ID0gZS50ZXh0OwotCQkJdHJ5IHsKLQkJCQlJbnRlZ2VyLnBhcnNlSW50KG5ld1RleHQpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9KTsKLQljb21iby5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQkJU3RyaW5nIG5ld1RleHQgPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJSW50ZWdlci5wYXJzZUludChuZXdUZXh0KTsKLQkJCQkJY29tYm8uYWRkKG5ld1RleHQpOwotCQkJCQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIG5ld1RleHQubGVuZ3RoKCkpKTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOGMzNmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGJhciBhbmQgcHVsbCBkb3duIG1lbnUgKGFjY2VsZXJhdG9ycywgbW5lbW9uaWNzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCU1lbnUgYmFyID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyIChiYXIpOwotCU1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtIChiYXIsIFNXVC5DQVNDQURFKTsKLQlmaWxlSXRlbS5zZXRUZXh0ICgiJkZpbGUiKTsKLQlNZW51IHN1Ym1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWZpbGVJdGVtLnNldE1lbnUgKHN1Ym1lbnUpOwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKHN1Ym1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2VsZWN0IEFsbCIpOwotCQl9Ci0JfSk7Ci0JaXRlbS5zZXRUZXh0ICgiU2VsZWN0ICZBbGxcdEN0cmwrQSIpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IgKFNXVC5NT0QxICsgJ0EnKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOTFjMTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBDYW52YXMgc25pcHBldDogaWdub3JlIDJuZCBtb3VzZSB1cCBldmVudCBhZnRlciBkb3VibGUtY2xpY2sKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyOTAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJaWYgKGUuY291bnQgPT0gMSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW91c2UgdXAiKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJEb3VibGUtY2xpY2siKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5MDk5OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIEdpdmUgYWNjZXNzaWJsZSBuYW1lcyB0byBhIHRyZWUgYW5kIGl0cyB0cmVlIGl0ZW1zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjkxIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCQl0cmVlSXRlbS5zZXRUZXh0ICgiaXRlbSIgKyBpKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7Ci0JCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCQkJCXN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSIgKyBpICsgaik7Ci0JCQl9Ci0JCX0KLQkJdHJlZS5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpIHsKLQkJCQkJZS5yZXN1bHQgPSAiVGhpcyBpcyB0aGUgQWNjZXNzaWJsZSBOYW1lIGZvciB0aGUgVHJlZSI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlkaXNwbGF5LmZpbmRXaWRnZXQodHJlZSwgZS5jaGlsZElEKTsKLQkJCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCQkJZS5yZXN1bHQgPSAiVGhpcyBpcyB0aGUgQWNjZXNzaWJsZSBOYW1lIGZvciB0aGUgVHJlZUl0ZW06ICIgKyBpdGVtLmdldFRleHQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZhYWJlYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRha2UgYSBzbmFwc2hvdCBvZiBhIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyOTIgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCWZpbmFsIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoIkdyb3VwIik7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoZ3JvdXAsIFNXVC5CT1JERVIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJCXRyZWVJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAiICsgaSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgewotCQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzdWJJdGVtLnNldFRleHQoIlN1Ykl0ZW0gIiArIGkgKyAiLSIgKyBqKTsKLQkJCX0KLQkJCWlmIChpICUgMyA9PSAwKSB0cmVlSXRlbS5zZXRFeHBhbmRlZCAodHJ1ZSk7Ci0JCX0KLQkJbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpLnNldFRleHQoIkJ1dHRvbiIpOwotCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQkJbGFiZWwuYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IGxhYmVsLmdldEltYWdlICgpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlICgpOwotCQkJfQotCQl9KTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiU25hcHNob3QiKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IGxhYmVsLmdldEltYWdlICgpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlICgpOwotCQkJCWltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBncm91cC5nZXRCb3VuZHMgKCkpOwotCQkJCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JCQkJYm9vbGVhbiBzdWNjZXNzID0gZ3JvdXAucHJpbnQgKGdjKTsKLQkJCQlnYy5kaXNwb3NlICgpOwotCQkJCWxhYmVsLnNldEltYWdlIChpbWFnZSk7Ci0JCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJCU1lc3NhZ2VCb3ggbWVzc2FnZUJveCA9IG5ldyBNZXNzYWdlQm94IChzaGVsbCwgU1dULk9LIHwgU1dULlBSSU1BUllfTU9EQUwpOwotCQkJCQltZXNzYWdlQm94LnNldE1lc3NhZ2UgKCJTb3JyeSwgdGFraW5nIGEgc25hcHNob3QgaXMgbm90IHN1cHBvcnRlZCBvbiB5b3VyIHBsYXRmb3JtIik7Ci0JCQkJCW1lc3NhZ2VCb3gub3BlbiAoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKTsKLQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YmM1OTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGNyZWF0ZSBhIHRyaS1zdGF0ZSBidXR0b24uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI5MyB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJCi0JCQlCdXR0b24gYjEgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULkNIRUNLKTsKLQkJCWIxLnNldFRleHQoIlN0YXRlIDEiKTsKLQkJCWIxLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQotCQkJQnV0dG9uIGIyID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JCQliMi5zZXRUZXh0KCJTdGF0ZSAyIik7Ci0JCQliMi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCi0JCQlCdXR0b24gYjMgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULkNIRUNLKTsKLQkJCWIzLnNldFRleHQoIlN0YXRlIDMiKTsKLQkJCWIzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWIzLnNldEdyYXllZCh0cnVlKTsKLQkJCQotCQkJc2hlbGwucGFjaygpOwotCQkJc2hlbGwub3BlbigpOwotCQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJCWRpc3BsYXkuZGlzcG9zZSgpOwotCQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjk0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjk0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGQ2NjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogUmVnaW9uIG9uIGEgY29udHJvbDogY3JlYXRlIGEgbm9uLXJlY3Rhbmd1bGFyIGJ1dHRvbgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQyOTQgewotCi0Jc3RhdGljIGludFtdIGNpcmNsZShpbnQgciwgaW50IG9mZnNldFgsIGludCBvZmZzZXRZKSB7Ci0JCWludFtdIHBvbHlnb24gPSBuZXcgaW50WzggKiByICsgNF07Ci0JCS8vIHheMiArIHleMiA9IHJeMgotCQlmb3IgKGludCBpID0gMDsgaSA8IDIgKiByICsgMTsgaSsrKSB7Ci0JCQlpbnQgeCA9IGkgLSByOwotCQkJaW50IHkgPSAoaW50KU1hdGguc3FydChyKnIgLSB4KngpOwotCQkJcG9seWdvblsyKmldID0gb2Zmc2V0WCArIHg7Ci0JCQlwb2x5Z29uWzIqaSsxXSA9IG9mZnNldFkgKyB5OwotCQkJcG9seWdvbls4KnIgLSAyKmkgLSAyXSA9IG9mZnNldFggKyB4OwotCQkJcG9seWdvbls4KnIgLSAyKmkgLSAxXSA9IG9mZnNldFkgLSB5OwotCQl9Ci0JCXJldHVybiBwb2x5Z29uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCi0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJSZWdpb25zIG9uIGEgQ29udHJvbCIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19SRUQpKTsKLQkJCi0JCUJ1dHRvbiBiMiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYjIuc2V0VGV4dCgiQnV0dG9uIHdpdGggUmVnaW9ucyIpOwotCQkKLQkJLy8gZGVmaW5lIGEgcmVnaW9uIHRoYXQgbG9va3MgbGlrZSBhIGNpcmNsZSB3aXRoIHR3byBob2xlcyBpbiBvdAotCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQlyZWdpb24uYWRkKGNpcmNsZSg2NywgODcsIDc3KSk7Ci0JCXJlZ2lvbi5zdWJ0cmFjdChjaXJjbGUoMjAsIDg3LCA0NykpOwotCQlyZWdpb24uc3VidHJhY3QoY2lyY2xlKDIwLCA4NywgMTEzKSk7Ci0JCQotCQkvLyBkZWZpbmUgdGhlIHNoYXBlIG9mIHRoZSBidXR0b24gdXNpbmcgc2V0UmVnaW9uCi0JCWIyLnNldFJlZ2lvbihyZWdpb24pOwotCQliMi5zZXRMb2NhdGlvbigxMDAsNTApOwotCQkKLQkJYjIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwuc2V0U2l6ZSgyMDAsMjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWM0MjQyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogY3JlYXRlIGEgZGlhbG9nIFNoZWxsIGFuZCBwcm9tcHQgZm9yIGEgdGV4dCBzdHJpbmcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI5NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTaGVsbCIpOwotCUZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0JZmlsbExheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCWZpbGxMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0Jc2hlbGwuc2V0TGF5b3V0KGZpbGxMYXlvdXQpOwotCi0JQnV0dG9uIG9wZW4gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCW9wZW4uc2V0VGV4dCAoIlByb21wdCBmb3IgYSBTdHJpbmciKTsKLQlvcGVuLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQkJZGlhbG9nLnNldFRleHQoIkRpYWxvZyBTaGVsbCIpOwotCQkJRm9ybUxheW91dCBmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQgKCk7Ci0JCQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCQlmb3JtTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQkJZm9ybUxheW91dC5zcGFjaW5nID0gMTA7Ci0JCQlkaWFsb2cuc2V0TGF5b3V0IChmb3JtTGF5b3V0KTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGRpYWxvZywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCAoIlR5cGUgYSBTdHJpbmc6Iik7Ci0JCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0KLQkJCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJCWNhbmNlbC5zZXRUZXh0ICgiQ2FuY2VsIik7Ci0JCQlkYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCQkJZGF0YS53aWR0aCA9IDYwOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQkJCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCQkJY2FuY2VsLnNldExheW91dERhdGEgKGRhdGEpOwotCQkJY2FuY2VsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2VyIGNhbmNlbGxlZCBkaWFsb2ciKTsKLQkJCQkJZGlhbG9nLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAoZGlhbG9nLCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JCQlkYXRhLndpZHRoID0gMjAwOwotCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgMCwgU1dULkRFRkFVTFQpOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoY2FuY2VsLCAwLCBTV1QuREVGQVVMVCk7Ci0JCQl0ZXh0LnNldExheW91dERhdGEgKGRhdGEpOwotCi0JCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQgKCJPSyIpOwotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQkJCWRhdGEud2lkdGggPSA2MDsKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGNhbmNlbCwgMCwgU1dULkRFRkFVTFQpOwotCQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JCQlvay5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiVXNlciB0eXBlZDogIiArIHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCWRpYWxvZy5jbG9zZSAoKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24gKG9rKTsKLQkJCWRpYWxvZy5wYWNrICgpOwotCQkJZGlhbG9nLm9wZW4gKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjk2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjk2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzZkYWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTY3JvbGxlZENvbXBvc2l0ZSBzbmlwcGV0OiB1c2UgYSBTY3JvbGxlZENvbXBvc2l0ZSB0byBzY3JvbGwgYSBUcmVlIHZlcnRpY2FsbHkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI5NiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMgKDEwLCAxMCwgMzAwLCAzMDApOwotCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlIChzaGVsbCwgU1dULlZFUlRJQ0FMKTsKLQlzYy5zZXRCb3VuZHMgKDEwLCAxMCwgMjgwLCAyMDApOwotCWZpbmFsIGludCBjbGllbnRXaWR0aCA9IHNjLmdldENsaWVudEFyZWEgKCkud2lkdGg7Ci0KLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2MsIFNXVC5OT05FKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDk5OyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJpdGVtICIgKyBpKTsKLQkJbmV3IFRyZWVJdGVtIChpdGVtLCBTV1QuTk9ORSkuc2V0VGV4dCAoImNoaWxkIik7Ci0JfQotCXNjLnNldENvbnRlbnQgKHRyZWUpOwotCWludCBwcmVmSGVpZ2h0ID0gdHJlZS5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotCXRyZWUuc2V0U2l6ZSAoY2xpZW50V2lkdGgsIHByZWZIZWlnaHQpOwotCS8qCi0JICogVGhlIGZvbGxvd2luZyBsaXN0ZW5lciBlbnN1cmVzIHRoYXQgdGhlIFRyZWUgaXMgYWx3YXlzIGxhcmdlCi0JICogZW5vdWdoIHRvIG5vdCBuZWVkIHRvIHNob3cgaXRzIG93biB2ZXJ0aWNhbCBzY3JvbGxiYXIuCi0JICovCi0JdHJlZS5hZGRUcmVlTGlzdGVuZXIgKG5ldyBUcmVlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQgKFRyZWVFdmVudCBlKSB7Ci0JCQlpbnQgcHJlZkhlaWdodCA9IHRyZWUuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLQkJCXRyZWUuc2V0U2l6ZSAoY2xpZW50V2lkdGgsIHByZWZIZWlnaHQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVDb2xsYXBzZWQgKFRyZWVFdmVudCBlKSB7Ci0JCQlpbnQgcHJlZkhlaWdodCA9IHRyZWUuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLQkJCXRyZWUuc2V0U2l6ZSAoY2xpZW50V2lkdGgsIHByZWZIZWlnaHQpOwotCQl9Ci0JfSk7Ci0JLyoKLQkgKiBUaGUgZm9sbG93aW5nIGxpc3RlbmVyIGVuc3VyZXMgdGhhdCBhIG5ld2x5LXNlbGVjdGVkIGl0ZW0KLQkgKiBpbiB0aGUgVHJlZSBpcyBhbHdheXMgdmlzaWJsZS4KLQkgKi8KLQl0cmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUcmVlSXRlbSBbXSBzZWxlY3RlZEl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCQlSZWN0YW5nbGUgaXRlbVJlY3QgPSBzZWxlY3RlZEl0ZW1zWzBdLmdldEJvdW5kcygpOwotCQkJCVJlY3RhbmdsZSBhcmVhID0gc2MuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVBvaW50IG9yaWdpbiA9IHNjLmdldE9yaWdpbigpOwotCQkJCWlmIChpdGVtUmVjdC54IDwgb3JpZ2luLnggfHwgaXRlbVJlY3QueSA8IG9yaWdpbi55Ci0JCQkJCQl8fCBpdGVtUmVjdC54ICsgaXRlbVJlY3Qud2lkdGggPiBvcmlnaW4ueCArIGFyZWEud2lkdGgKLQkJCQkJCXx8IGl0ZW1SZWN0LnkgKyBpdGVtUmVjdC5oZWlnaHQgPiBvcmlnaW4ueSArIGFyZWEuaGVpZ2h0KSB7Ci0JCQkJCXNjLnNldE9yaWdpbihpdGVtUmVjdC54LCBpdGVtUmVjdC55KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCUJ1dHRvbiBkb3duQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlkb3duQnV0dG9uLnNldEJvdW5kcyAoMTAsIDIyMCwgMTIwLCAzMCk7Ci0JZG93bkJ1dHRvbi5zZXRUZXh0ICgiRG93biAxMHB4Iik7Ci0JZG93bkJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzYy5zZXRPcmlnaW4gKDAsIHNjLmdldE9yaWdpbiAoKS55ICsgMTApOwotCQl9Ci0JfSk7Ci0JQnV0dG9uIHVwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQl1cEJ1dHRvbi5zZXRCb3VuZHMgKDE0MCwgMjIwLCAxMjAsIDMwKTsKLQl1cEJ1dHRvbi5zZXRUZXh0ICgiVXAgMTBweCIpOwotCXVwQnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXNjLnNldE9yaWdpbiAoMCwgc2MuZ2V0T3JpZ2luICgpLnkgLSAxMCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjk3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjk3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YzcxMjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgd2l0aCBjb2x1bW4gaGVhZGVyIGltYWdlcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyOTcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlJbWFnZSBpbWFnZXNbXSA9IG5ldyBJbWFnZVtdIHsKLQkJZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTiksCi0JCWRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpLAotCQlkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKSwKLQkJZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKSwKLQl9OwotCVN0cmluZ1tdIHRpdGxlcyA9IHsiSW5mb3JtYXRpb24iLCAiRXJyb3IiLCAiUXVlc3Rpb24iLCAiV2FybmluZyJ9OwotCVN0cmluZ1tdIHF1ZXN0aW9ucyA9IHsid2hvPyIsICJ3aGF0PyIsICJ3aGVyZT8iLCAid2hlbj8iLCAid2h5PyJ9OwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCWRhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQl0YWJsZS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUgKHRydWUpOwotCWZvciAoaW50IGk9MDsgaTx0aXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCAodGl0bGVzIFtpXSk7Ci0JCWNvbHVtbi5zZXRJbWFnZShpbWFnZXMgW2ldKTsKLQl9CQotCWludCBjb3VudCA9IDEyODsKLQlmb3IgKGludCBpPTA7IGk8Y291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoMCwgInNvbWUgaW5mbyIpOwotCQlpdGVtLnNldFRleHQgKDEsICJlcnJvciAjIiArIGkpOwotCQlpdGVtLnNldFRleHQgKDIsIHF1ZXN0aW9ucyBbaSAlIHF1ZXN0aW9ucy5sZW5ndGhdKTsKLQkJaXRlbS5zZXRUZXh0ICgzLCAibG9vayBvdXQhIik7Ci0JfQotCWZvciAoaW50IGk9MDsgaTx0aXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uIChpKS5wYWNrICgpOwotCX0JCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM5ZTJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmFuc2Zvcm0gc25pcHBldDogc2hlYXIgaW1hZ2VzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjk4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWludFtdIGljb25zID0gbmV3IGludFtde1NXVC5JQ09OX0VSUk9SLCBTV1QuSUNPTl9XQVJOSU5HLCBTV1QuSUNPTl9JTkZPUk1BVElPTiwgU1dULklDT05fUVVFU1RJT04sIFNXVC5JQ09OX1dPUktJTkd9OwotCQkJaW50IHggPSAxMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWNvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJbWFnZSBpbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoaWNvbnNbaV0pOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCVRyYW5zZm9ybSB0ID0gbmV3IFRyYW5zZm9ybShkaXNwbGF5KTsKLQkJCQkJdC50cmFuc2xhdGUoeCwgMTApOwotCQkJCQl0LnNoZWFyKDEsIDApOwotCQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCQlnYy5zZXRUcmFuc2Zvcm0odCk7Ci0JCQkJCXQuZGlzcG9zZSgpOwotCQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCQkJCQl4ICs9IGltYWdlLmdldEJvdW5kcygpLndpZHRoICsgMTA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgyNjAsIDEwMCk7Ci0Jc2hlbGwub3BlbigpOwkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2E4YWRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUm93TGF5b3V0OiBjZW50ZXIgYWxpZ25tZW50Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjk5IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCVJvd0xheW91dCBsYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0JCWxheW91dC5jZW50ZXIgPSB0cnVlOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlCdXR0b24gYnV0dG9uMCA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uMC5zZXRUZXh0KCJCdXR0b24gMCIpOwotCQkKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjEuc2V0VGV4dCgiQnV0dG9uIDEiKTsKLQkJYnV0dG9uMS5zZXRMYXlvdXREYXRhKG5ldyBSb3dEYXRhIChTV1QuREVGQVVMVCwgNTApKTsKLQkJCi0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24yLnNldFRleHQoIkJ1dHRvbiAyIik7Ci0JCWJ1dHRvbjIuc2V0TGF5b3V0RGF0YShuZXcgUm93RGF0YSAoU1dULkRFRkFVTFQsIDcwKSk7Ci0KLQkJQnV0dG9uIGJ1dHRvbjMgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjMuc2V0VGV4dCgiQnV0dG9uIDMiKTsKLQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1ZjFlZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogZmluZCBhIHRhYmxlIGNlbGwgZnJvbSBtb3VzZSBkb3duIChTV1QuRlVMTF9TRUxFQ1RJT04pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMCi0JCQl8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JZmluYWwgaW50IHJvd0NvdW50ID0gNjQsIGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewotCQkJaXRlbS5zZXRUZXh0KGosICJJdGVtICIgKyBpICsgIi0iICsgaik7Ci0JCX0KLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbihpKS5wYWNrKCk7Ci0JfQotCVBvaW50IHNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgMjAwKTsKLQl0YWJsZS5zZXRTaXplKHNpemUpOwotCXNoZWxsLnBhY2soKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBwdCA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbShwdCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMoaSk7Ci0JCQkJaWYgKHJlY3QuY29udGFpbnMocHQpKSB7Ci0JCQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YoaXRlbSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSXRlbSAiICsgaW5kZXggKyAiLSIgKyBpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmZmJjNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQcm9ncmFtIGV4YW1wbGUgc25pcHBldDogaW52b2tlIHRoZSBzeXN0ZW0gdGV4dCBlZGl0b3Igb24gYSBuZXcgZmlsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlQcm9ncmFtIHAgPSBQcm9ncmFtLmZpbmRQcm9ncmFtICgiLnR4dCIpOwotCWlmIChwICE9IG51bGwpIHAuZXhlY3V0ZSAoIm5ld2ZpbGUiKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YjliMmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IERORCBiZXR3ZWVuIFN3aW5nIGFuZCBTV1QKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBqYXZheC5zd2luZy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmF3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzAwIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIlNXVCBhbmQgU3dpbmcgRE5EIEV4YW1wbGUiKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCi0JCVRleHQgc3d0VGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJc3d0VGV4dC5zZXRUZXh0KCJTV1QgVGV4dCIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXN3dFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2V0RHJhZ0Ryb3Aoc3d0VGV4dCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuRU1CRURERUQpOwotCQlqYXZhLmF3dC5GcmFtZSBmcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKGNvbXApOwotCQlKVGV4dEZpZWxkIHN3aW5nVGV4dCA9IG5ldyBKVGV4dEZpZWxkKDQwKTsKLQkJc3dpbmdUZXh0LnNldFRleHQoIlN3aW5nIFRleHQiKTsKLQkJc3dpbmdUZXh0LnNldERyYWdFbmFibGVkKHRydWUpOwotCQlmcmFtZS5hZGQoc3dpbmdUZXh0KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBzd2luZ1RleHQuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXNoZWxsLnNldFNpemUoNDAwLCAyMDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RHJhZ0Ryb3AgKGZpbmFsIFRleHQgdGV4dCkgewotCQlUcmFuc2ZlcltdIHR5cGVzID0gbmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfTsKLQkJaW50IG9wZXJhdGlvbnMgPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JCQotCQlmaW5hbCBEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlICh0ZXh0LCBvcGVyYXRpb25zKTsKLQkJc291cmNlLnNldFRyYW5zZmVyKHR5cGVzKTsKLQkJc291cmNlLmFkZERyYWdMaXN0ZW5lciAobmV3IERyYWdTb3VyY2VMaXN0ZW5lciAoKSB7Ci0JCQlQb2ludCBzZWxlY3Rpb247Ci0JCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQkJCQlzZWxlY3Rpb24gPSB0ZXh0LmdldFNlbGVjdGlvbigpOwotCQkJCWUuZG9pdCA9IHNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbi55OwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQkJCQllLmRhdGEgPSB0ZXh0LmdldFRleHQoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi55LTEpOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUuZGV0YWlsID09IERORC5EUk9QX01PVkUpIHsKLQkJCQkJdGV4dC5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQkJdGV4dC5pbnNlcnQoIiIpOwotCQkJCX0KLQkJCQlzZWxlY3Rpb24gPSBudWxsOwotCQkJfQotCQl9KTsKLQotCQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRleHQsIG9wZXJhdGlvbnMpOwotCQl0YXJnZXQuc2V0VHJhbnNmZXIodHlwZXMpOwotCQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyIChuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5kYXRhID09IG51bGwpIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0ZXh0LmFwcGVuZCgoU3RyaW5nKSBldmVudC5kYXRhKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDhiODcxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIHdpdGggbm8gc2Nyb2xsIGJhcnMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzAxIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1NDUk9MTCk7Ci0JCWZvciAoaW50IGk9MDsgaTwxMDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJfQotCQlzaGVsbC5wYWNrICgpOwotCQlzaGVsbC5vcGVuICgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlICgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTA3ZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmVlIHdpdGggbm8gc2Nyb2xsIGJhcnMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzAyIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1NDUk9MTCk7Ci0JCWZvciAoaW50IGk9MDsgaTwxMDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJfQotCQlzaGVsbC5wYWNrICgpOwotCQlzaGVsbC5vcGVuICgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUzYWM1ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IGxpc3RlbiBmb3IgRE9NIG1vdXNlZG93biBldmVudHMgd2l0aCBqYXZhc2NyaXB0Ci0gKgotICogVGhpcyBzbmlwcGV0IHdvcmtzIGZvciBhbGwgc3VwcG9ydGVkIGJyb3dzZXIgdHlwZXMgKGllLi0gQnJvd3NlcnMgY3JlYXRlZCB3aXRoIHN0eWxlCi0gKiBTV1QuTk9ORSkuICBGb3IgYSBCcm93c2VyIGNyZWF0ZWQgd2l0aCBzdHlsZSBTV1QuTU9aSUxMQSB0aGUgY2xlYW5lciBhcHByb2FjaCB3b3VsZAotICogYmUgdG8gdXNlIEphdmFYUENPTSB0byBob29rIHRoZSBET00gbGlzdGVuZXJzLiAKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMDMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIFN0cmluZyBTQ1JJUFQgPSAiZG9jdW1lbnQub25tb3VzZWRvd24gPSBmdW5jdGlvbihlKSB7aWYgKCFlKSB7ZSA9IHdpbmRvdy5ldmVudDt9IGlmIChlKSB7d2luZG93LnN0YXR1cyA9ICdNT1VTRURPV046ICcgKyBlLmNsaWVudFggKyAnLCcgKyBlLmNsaWVudFk7fX0iOwotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQl0cnkgewotCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm47Ci0JfQotCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJYnJvd3Nlci5leGVjdXRlKFNDUklQVCk7Ci0JCX0KLQl9KTsKLQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LnRleHQuc3RhcnRzV2l0aCgiTU9VU0VET1dOOiAiKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihldmVudC50ZXh0KTsKLQkJCQlicm93c2VyLmV4ZWN1dGUoIndpbmRvdy5zdGF0dXMgPSAnJzsiKTsKLQkJCX0KLQkJfQotCX0pOwotCWJyb3dzZXIuc2V0VXJsKCJlY2xpcHNlLm9yZyIpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzA0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YWY1OWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFVJIEF1dG9tYXRpb24gKGZvciB0ZXN0aW5nIHRvb2xzKSBzbmlwcGV0OiBwb3N0IGtleSBldmVudHMgdG8gc2ltdWxhdGUKLSAqIG1vdmluZyB0aGUgSS1iZWFtIHRvIHRoZSBlbmQgb2YgYSB0ZXh0IGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMwNCB7Ci0gICAgc3RhdGljIERpc3BsYXkgZGlzcGxheSA9IG51bGw7IAotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0KLSAgICAgICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIHRleHQuc2V0VGV4dCgiPCBjdXJzb3Igd2FzIHRoZXJlXG5hXG5tdWx0aVxubGluZVxudGV4dFxubm93IGl0J3MgaGVyZSA+Iik7Ci0KLSAgICAgICAgdGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIktleURvd24gIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2V5VXAgICAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNoZWxsLnBhY2soKTsKLSAgICAgICAgc2hlbGwub3BlbigpOwotCi0gICAgICAgIC8qCi0gICAgICAgICogU2ltdWxhdGUgdGhlIChwbGF0Zm9ybSBzcGVjaWZpYykga2V5IHNlcXVlbmNlCi0gICAgICAgICogdG8gbW92ZSB0aGUgSS1iZWFtIHRvIHRoZSBlbmQgb2YgYSB0ZXh0IGNvbnRyb2wuCi0gICAgICAgICovCi0gICAgCW5ldyBUaHJlYWQoKXsKLSAgICAJCXB1YmxpYyB2b2lkIHJ1bigpewotICAgIAkJCWludCBrZXkgPSBTV1QuRU5EOwotICAgIAkJCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotICAgIAkJCWlmIChwbGF0Zm9ybS5lcXVhbHMoImNhcmJvbiIpIHx8IHBsYXRmb3JtLmVxdWFscygiY29jb2EiKSApIHsKLSAgICAgICAgCQkJa2V5ID0gU1dULkFSUk9XX0RPV047Ci0gICAgCQkJfQotICAgIAkgICAgICAgIHBvc3RFdmVudChTV1QuTU9EMSwgU1dULktleURvd24pOwotICAgIAkgICAgICAgIHBvc3RFdmVudChrZXksIFNXVC5LZXlEb3duKTsKLSAgICAJICAgICAgICBwb3N0RXZlbnQoa2V5LCBTV1QuS2V5VXApOwotICAgIAkgICAgICAgIHBvc3RFdmVudChTV1QuTU9EMSwgU1dULktleVVwKTsKLSAgICAJCX0KLSAgICAJfS5zdGFydCgpOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotICAgICAgICAgICAgICAgIGRpc3BsYXkuc2xlZXAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcG9zdEV2ZW50KGludCBrZXlDb2RlLCBpbnQgdHlwZSkgewotICAgICAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gdHlwZTsKLSAgICAgICAgZXZlbnQua2V5Q29kZSA9IGtleUNvZGU7Ci0gICAgICAgIGRpc3BsYXkucG9zdChldmVudCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwOTk1YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzA1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hvdyByb3cvY29sdW1uIHBvc2l0aW9uIG9mIGN1cnJlbnQgc2VsZWN0aW9uIGluIGFuIEV4Y2VsIHNoZWV0LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMDUgewotCXN0YXRpYyBpbnQgU2hlZXRTZWxlY3Rpb25DaGFuZ2UgPSAweDAwMDAwNjE2OwotCXN0YXRpYyBTdHJpbmcgSUlEX0FwcEV2ZW50cyA9ICJ7MDAwMjQ0MTMtMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2fSI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJFeGNlbCBTaGVldCBTZWxlY3Rpb24gRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCU9sZUF1dG9tYXRpb24gYXBwbGljYXRpb247Ci0JCXRyeSB7Ci0JCQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQkJT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiRXhjZWwuU2hlZXQiKTsKLQkJCWNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQkJCQotCQkJT2xlQXV0b21hdGlvbiBleGNlbFNoZWV0ID0gbmV3IE9sZUF1dG9tYXRpb24oY29udHJvbFNpdGUpOwotCQkJaW50W10gZGlzcElEcyA9IGV4Y2VsU2hlZXQuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiQXBwbGljYXRpb24iIH0pOwotCQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gZXhjZWxTaGVldC5nZXRQcm9wZXJ0eShkaXNwSURzWzBdKTsKLQkJCWFwcGxpY2F0aW9uID0gcFZhclJlc3VsdC5nZXRBdXRvbWF0aW9uKCk7Ci0JCQlwVmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQkJCWV4Y2VsU2hlZXQuZGlzcG9zZSgpOwotCQkJCi0JCQlPbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBlKSB7Ci0JCQkJCS8vIFNoZWV0U2VsZWN0aW9uQ2hhbmdlKEJ5VmFsIFNoIEFzIE9iamVjdCwgQnlWYWwgVGFyZ2V0IEFzIEV4Y2VsLlJhbmdlKQotCQkJCQlWYXJpYW50W10gYXJncyA9IGUuYXJndW1lbnRzOwotCQkJCQkvLyBPbGVBdXRvbWF0aW9uIHNoZWV0ID0gYXJnc1sxXS5nZXRBdXRvbWF0aW9uKCk7IC8vIEV4Y2VsLlNoZWV0Ci0JCQkJCU9sZUF1dG9tYXRpb24gcmFuZ2UgPSBhcmdzWzBdLmdldEF1dG9tYXRpb24oKTsgLy8gRXhjZWwuUmFuZ2UKLQkJCQkJaW50W10gZGlzcElEcyA9IHJhbmdlLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIlJvdyIgfSk7Ci0JCQkJCVZhcmlhbnQgcFZhclJlc3VsdCA9IHJhbmdlLmdldFByb3BlcnR5KGRpc3BJRHNbMF0pOwotCQkJCQlpbnQgcm93ID0gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQkJCQkJZGlzcElEcyA9IHJhbmdlLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIkNvbHVtbiIgfSk7Ci0JCQkJCXBWYXJSZXN1bHQgPSByYW5nZS5nZXRQcm9wZXJ0eShkaXNwSURzWzBdKTsKLQkJCQkJaW50IGNvbHVtbiA9IHBWYXJSZXN1bHQuZ2V0SW50KCk7Ci0JCQkJCXJhbmdlLmRpc3Bvc2UoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJyb3c9IiArIHJvdyArICIgY29sdW1uPSIgKyBjb2x1bW4pOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWFyZ3NbaV0uZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCWNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoYXBwbGljYXRpb24sIElJRF9BcHBFdmVudHMsIFNoZWV0U2VsZWN0aW9uQ2hhbmdlLCBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIG9wZW4gYWN0aXZlWCBjb250cm9sIik7Ci0JCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpZiAoYXBwbGljYXRpb24gIT0gbnVsbCkgYXBwbGljYXRpb24uZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzA2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzVkNDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBTaG93IGFuIEhUTUwgZWxlbWVudC1zcGVjaWZpYyBjb250ZXh0IG1lbnUKLSAqIGluIGEgTW96aWxsYSBCcm93c2VyLgotICogCi0gKiBJTVBPUlRBTlQ6IEZvciB0aGlzIHNuaXBwZXQgdG8gd29yayBwcm9wZXJseSBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cwotICogZm9yIHVzaW5nIEphdmFYUENPTSBpbiBhIHN0YW5kLWFsb25lIGFwcGxpY2F0aW9uIG11c3QgYmUgc2F0aXNmaWVkCi0gKiAoc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L2ZhcS5waHAjaG93dXNlamF2YXhwY29tKS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcubW96aWxsYS5pbnRlcmZhY2VzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzA2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQl0cnkgewotCQlicm93c2VyID0gbmV3IEJyb3dzZXIgKHNoZWxsLCBTV1QuTU9aSUxMQSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSAoKSk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm47Ci0JfQotCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lciAobmV3IFByb2dyZXNzQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbXBsZXRlZCAoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJbnNJV2ViQnJvd3NlciB3ZWJCcm93c2VyID0gKG5zSVdlYkJyb3dzZXIpYnJvd3Nlci5nZXRXZWJCcm93c2VyICgpOwotCQkJbnNJRE9NV2luZG93IGRvbVdpbmRvdyA9IHdlYkJyb3dzZXIuZ2V0Q29udGVudERPTVdpbmRvdyAoKTsKLQkJCW5zSURPTUV2ZW50VGFyZ2V0IHRhcmdldCA9IChuc0lET01FdmVudFRhcmdldClkb21XaW5kb3cucXVlcnlJbnRlcmZhY2UgKG5zSURPTUV2ZW50VGFyZ2V0Lk5TX0lET01FVkVOVFRBUkdFVF9JSUQpOwotCQkJbnNJRE9NRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBuc0lET01FdmVudExpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgbnNJU3VwcG9ydHMgcXVlcnlJbnRlcmZhY2UgKFN0cmluZyB1dWlkKSB7Ci0JCQkJCWlmICh1dWlkLmVxdWFscyAobnNJRE9NRXZlbnRMaXN0ZW5lci5OU19JRE9NRVZFTlRMSVNURU5FUl9JSUQpIHx8Ci0JCQkJCQl1dWlkLmVxdWFscyAobnNJRE9NRXZlbnRMaXN0ZW5lci5OU19JU1VQUE9SVFNfSUlEKSkgewotCQkJCQkJCXJldHVybiB0aGlzOwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAobnNJRE9NRXZlbnQgZXZlbnQpIHsKLQkJCQkJbnNJRE9NRWxlbWVudCBlbGVtZW50ID0gKG5zSURPTUVsZW1lbnQpZXZlbnQuZ2V0VGFyZ2V0ICgpLnF1ZXJ5SW50ZXJmYWNlIChuc0lET01FbGVtZW50Lk5TX0lET01FTEVNRU5UX0lJRCk7Ci0JCQkJCU1lbnUgbWVudSA9IG5ldyBNZW51IChicm93c2VyKTsKLQkJCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULk5PTkUpOwotCQkJCQlpdGVtLnNldFRleHQgKCJjdXN0b20gbWVudSBmb3IgZWxlbWVudCB3aXRoIHRhZzogIiArIGVsZW1lbnQuZ2V0VGFnTmFtZSAoKSk7Ci0JCQkJCW5zSURPTU1vdXNlRXZlbnQgbW91c2VFdmVudCA9IChuc0lET01Nb3VzZUV2ZW50KWV2ZW50LnF1ZXJ5SW50ZXJmYWNlIChuc0lET01Nb3VzZUV2ZW50Lk5TX0lET01NT1VTRUVWRU5UX0lJRCk7Ci0JCQkJCW1lbnUuc2V0TG9jYXRpb24gKG1vdXNlRXZlbnQuZ2V0U2NyZWVuWCAoKSwgbW91c2VFdmVudC5nZXRTY3JlZW5ZICgpKTsKLQkJCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCQl9Ci0JCQl9OwotCQkJdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIgKCJjb250ZXh0bWVudSIsIGxpc3RlbmVyLCBmYWxzZSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCWJyb3dzZXIuc2V0VXJsICgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5NWU2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBjYWxsIEphdmEgZnJvbSBKYXZhU2NyaXB0LgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy41Ci0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMwNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlzaGVsbC5zZXRCb3VuZHMgKDEwLDEwLDMwMCwyMDApOwotCi0JZmluYWwgQnJvd3NlciBicm93c2VyOwotCXRyeSB7Ci0JCWJyb3dzZXIgPSBuZXcgQnJvd3NlciAoc2hlbGwsIFNXVC5OT05FKTsKLQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbiAoIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlICgpKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybjsKLQl9Ci0JYnJvd3Nlci5zZXRUZXh0IChjcmVhdGVIVE1MICgpKTsKLQlmaW5hbCBCcm93c2VyRnVuY3Rpb24gZnVuY3Rpb24gPSBuZXcgQ3VzdG9tRnVuY3Rpb24gKGJyb3dzZXIsICJ0aGVKYXZhRnVuY3Rpb24iKTsKLQotCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lciAobmV3IFByb2dyZXNzQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbXBsZXRlZCAoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyIChuZXcgTG9jYXRpb25BZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkIChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCWJyb3dzZXIucmVtb3ZlTG9jYXRpb25MaXN0ZW5lciAodGhpcyk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoImxlZnQgamF2YSBmdW5jdGlvbi1hd2FyZSBwYWdlLCBzbyBkaXNwb3NlZCBDdXN0b21GdW5jdGlvbiIpOwotCQkJCQlmdW5jdGlvbi5kaXNwb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotCQkJZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi1zdGF0aWMgY2xhc3MgQ3VzdG9tRnVuY3Rpb24gZXh0ZW5kcyBCcm93c2VyRnVuY3Rpb24gewotCUN1c3RvbUZ1bmN0aW9uIChCcm93c2VyIGJyb3dzZXIsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyIChicm93c2VyLCBuYW1lKTsKLQl9Ci0JcHVibGljIE9iamVjdCBmdW5jdGlvbiAoT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbiAoInRoZUphdmFGdW5jdGlvbigpIGNhbGxlZCBmcm9tIGphdmFzY3JpcHQgd2l0aCBhcmdzOiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGFyZyA9IGFyZ3VtZW50c1tpXTsKLQkJCWlmIChhcmcgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlx0LS0+bnVsbCIpOwotCQkJfSBlbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJcdC0tPiIgKyBhcmcuZ2V0Q2xhc3MgKCkuZ2V0TmFtZSAoKSArICI6ICIgKyBhcmcudG9TdHJpbmcgKCkpOwotCQkJfQotCQl9Ci0JCU9iamVjdCByZXR1cm5WYWx1ZSA9IG5ldyBPYmplY3RbXSB7Ci0JCQluZXcgU2hvcnQgKChzaG9ydCkzKSwKLQkJCW5ldyBCb29sZWFuICh0cnVlKSwKLQkJCW51bGwsCi0JCQluZXcgT2JqZWN0W10geyJhIHN0cmluZyIsIG5ldyBCb29sZWFuIChmYWxzZSl9LAotCQkJImhpIiwKLQkJCW5ldyBGbG9hdCAoMi4wZiAvIDMuMGYpLAotCQl9OwotCQkvL2ludCB6ID0gMyAvIDA7IC8vIHVuY29tbWVudCB0byBjYXVzZSBhIGphdmEgZXJyb3IgaW5zdGVhZAotCQlyZXR1cm4gcmV0dXJuVmFsdWU7Ci0JfQotfQotCi1zdGF0aWMgU3RyaW5nIGNyZWF0ZUhUTUwgKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyICgpOwotCWJ1ZmZlci5hcHBlbmQgKCI8aHRtbD5cbiIpOwotCWJ1ZmZlci5hcHBlbmQgKCI8aGVhZD5cbiIpOwotCWJ1ZmZlci5hcHBlbmQgKCI8c2NyaXB0IGxhbmd1YWdlPVwiSmF2YVNjcmlwdFwiPlxuIik7Ci0JYnVmZmVyLmFwcGVuZCAoImZ1bmN0aW9uIGZ1bmN0aW9uMSgpIHtcbiIpOwotCWJ1ZmZlci5hcHBlbmQgKCIgICAgdmFyIHJlc3VsdDtcbiIpOwotCWJ1ZmZlci5hcHBlbmQgKCIgICAgdHJ5IHtcbiIpOwotCWJ1ZmZlci5hcHBlbmQgKCIgICAgICAgIHJlc3VsdCA9IHRoZUphdmFGdW5jdGlvbigxMiwgZmFsc2UsIG51bGwsIFszLjYsIFsnc3d0JywgdHJ1ZV1dLCAnZWNsaXBzZScpO1xuIik7Ci0JYnVmZmVyLmFwcGVuZCAoIiAgICB9IGNhdGNoIChlKSB7XG4iKTsKLQlidWZmZXIuYXBwZW5kICgiICAgICAgICBhbGVydCgnYSBqYXZhIGVycm9yIG9jY3VycmVkOiAnICsgZS5tZXNzYWdlKTtcbiIpOwotCWJ1ZmZlci5hcHBlbmQgKCIgICAgICAgIHJldHVybjtcbiIpOwotCWJ1ZmZlci5hcHBlbmQgKCIgICAgfVxuIik7Ci0JYnVmZmVyLmFwcGVuZCAoIiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuIik7Ci0JYnVmZmVyLmFwcGVuZCAoIiAgICAgICAgYWxlcnQoJ3JldHVybmVkICcgKyBpICsgJzogJyArIHJlc3VsdFtpXSk7XG4iKTsKLQlidWZmZXIuYXBwZW5kICgiICAgIH1cbiIpOwotCWJ1ZmZlci5hcHBlbmQgKCJ9XG4iKTsKLQlidWZmZXIuYXBwZW5kICgiPC9zY3JpcHQ+XG4iKTsKLQlidWZmZXIuYXBwZW5kICgiPC9oZWFkPlxuIik7Ci0JYnVmZmVyLmFwcGVuZCAoIjxib2R5PlxuIik7Ci0JYnVmZmVyLmFwcGVuZCAoIjxpbnB1dCBpZD1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiUHVzaCB0byBJbnZva2UgSmF2YVwiIG9uY2xpY2s9XCJmdW5jdGlvbjEoKTtcIj5cbiIpOwotCWJ1ZmZlci5hcHBlbmQgKCI8cD48YSBocmVmPVwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZ1wiPmdvIHRvIGVjbGlwc2Uub3JnPC9hPlxuIik7Ci0JYnVmZmVyLmFwcGVuZCAoIjwvYm9keT5cbiIpOwotCWJ1ZmZlci5hcHBlbmQgKCI8L2h0bWw+XG4iKTsKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzA4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhY2Y1ZWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBxdWVyeSBET00gbm9kZSB2YWx1ZSAoaW1wcm92ZWQgaW1wbGVtZW50YXRpb24gZm9yIGVjbGlwc2Uvc3d0IDMuNSBhbmQgbmV3ZXIpIAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjUKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzA4IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBTdHJpbmcgaHRtbCA9ICI8aHRtbD48dGl0bGU+U25pcHBldDwvdGl0bGU+PGJvZHk+PHAgaWQ9J215aWQnPkJlc3QgRnJpZW5kczwvcD48cCBpZD0nbXlpZDInPkNhdCBhbmQgRG9nPC9wPjwvYm9keT48L2h0bWw+IjsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZylicm93c2VyLmV2YWx1YXRlKCJyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215aWQnKS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTsiKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgdmFsdWU6ICIrdmFsdWUpOwotCQkJfQotCQl9KTsKLQkJLyogTG9hZCBhbiBIVE1MIGRvY3VtZW50ICovCi0JCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmJhN2U4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogRGlzcGxheSBkaWZmZXJlbnQgc3R5bGVzIG9mIHRoZSBTZWFyY2ggVGV4dCBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuNQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMDkgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOwotCQlUZXh0IHRleHQ7Ci0KLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVRleHQgdCA9IChUZXh0KSBldmVudC53aWRnZXQ7Ci0JCQkJU3RyaW5nIG1zZyA9IHQuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULklDT05fQ0FOQ0VMKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FuY2VsIG9uICIgKyBtc2cpOwotCQkJCX0gZWxzZSBpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5JQ09OX1NFQVJDSCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklDT04gb24gIiArIG1zZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IHNlbGVjdGlvbiBvbiAiICsgbXNnKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuU0VBUkNIKTsKLQkJdGV4dC5zZXRNZXNzYWdlKCJzZWFyY2giKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCi0JCXRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNFQVJDSCB8IFNXVC5JQ09OX0NBTkNFTCk7Ci0JCXRleHQuc2V0TWVzc2FnZSgic2VhcmNoICsgY2FuY2VsIik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRleHQuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQotCQl0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TRUFSQ0ggfCBTV1QuSUNPTl9TRUFSQ0gpOwotCQl0ZXh0LnNldE1lc3NhZ2UoInNlYXJjaCArIGljb24iKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCi0JCXRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNFQVJDSCB8IFNXVC5JQ09OX0NBTkNFTCB8IFNXVC5JQ09OX1NFQVJDSCk7Ci0JCXRleHQuc2V0TWVzc2FnZSgic2VhcmNoICsgY2FuY2VsICsgaWNvbiIpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0KLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCQl9Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODk4YzFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyYWNrZXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmFja2VyIChkcmFnIHdoZW4gInRvcm4gb2ZmIikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCVBvaW50IHBvaW50ID0gbnVsbDsKLQkJc3RhdGljIGZpbmFsIGludCBKSVRURVIgPSA4OwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCQkJcG9pbnQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQkJCWlmIChwb2ludCA9PSBudWxsKSByZXR1cm47Ci0JCQkJCWludCBkZWx0YVggPSBwb2ludC54IC0gZXZlbnQueCwgZGVsdGFZID0gcG9pbnQueSAtIGV2ZW50Lnk7Ci0JCQkJCWlmIChNYXRoLmFicyAoZGVsdGFYKSA8IEpJVFRFUiAmJiBNYXRoLmFicyAoZGVsdGFZKSA8IEpJVFRFUikgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVRyYWNrZXIgdHJhY2tlciA9IG5ldyBUcmFja2VyIChkaXNwbGF5LCBTV1QuTk9ORSk7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gZGlzcGxheS5tYXAgKHNoZWxsLCBudWxsLCBzaGVsbC5nZXRDbGllbnRBcmVhICgpKTsKLQkJCQkJcmVjdC54IC09IGRlbHRhWDsKLQkJCQkJcmVjdC55IC09IGRlbHRhWTsKLQkJCQkJdHJhY2tlci5zZXRSZWN0YW5nbGVzIChuZXcgUmVjdGFuZ2xlIFtdIHtyZWN0fSk7Ci0JCQkJCXRyYWNrZXIub3BlbiAoKTsKLQkJCQkJLy9GQUxMIFRIUk9VR0gKLQkJCQljYXNlIFNXVC5Nb3VzZVVwOgotCQkJCQlwb2ludCA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZVVwLCBsaXN0ZW5lcik7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDA1NmYzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTcGlubmVyIGV4YW1wbGUgc25pcHBldDogdmFsaWRhdGUgaW5wdXQgaW4gYSBzcGlubmVyIHdpZGdldAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjUKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMxMCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZmluYWwgU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJc3Bpbm5lci5zZXRWYWx1ZXMoMCwgLTEwMCwgMTAwLCAwLCAxLCAxMCk7Ci0JCXNwaW5uZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMjAwLCBTV1QuREVGQVVMVCkpOwotCQlmaW5hbCBUb29sVGlwIHRvb2xUaXAgPSBuZXcgVG9vbFRpcChzaGVsbCwgU1dULkJBTExPT04gfCBTV1QuSUNPTl9XQVJOSU5HKTsKLQkJc3Bpbm5lci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgc3RyaW5nID0gc3Bpbm5lci5nZXRUZXh0KCk7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQoc3RyaW5nKTsKLQkJCQkJaW50IG1heGltdW0gPSBzcGlubmVyLmdldE1heGltdW0oKTsKLQkJCQkJaW50IG1pbmltdW0gPSBzcGlubmVyLmdldE1pbmltdW0oKTsKLQkJCQkJaWYgKHZhbHVlID4gbWF4aW11bSkgewotCQkJCQkJbWVzc2FnZSA9ICJDdXJyZW50IGlucHV0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBsaW1pdCAoIittYXhpbXVtKyIpIjsKLQkJCQkJfSBlbHNlIGlmICh2YWx1ZSA8IG1pbmltdW0pIHsKLQkJCQkJCW1lc3NhZ2UgPSAiQ3VycmVudCBpbnB1dCBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gbGltaXQgKCIrbWluaW11bSsiKSI7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJbWVzc2FnZSA9ICJDdXJyZW50IGlucHV0IGlzIG5vdCBudW1lcmljIjsKLQkJCQl9Ci0JCQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQlzcGlubmVyLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gc3Bpbm5lci5nZXRCb3VuZHMoKTsKLQkJCQkJR0MgZ2MgPSBuZXcgR0Moc3Bpbm5lcik7Ci0JCQkJCVBvaW50IHB0ID0gZ2MudGV4dEV4dGVudChzdHJpbmcpOwotCQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJCXRvb2xUaXAuc2V0TG9jYXRpb24oZGlzcGxheS5tYXAoc2hlbGwsIG51bGwsIHJlY3QueCArIHB0LngsIHJlY3QueSArIHJlY3QuaGVpZ2h0KSk7Ci0JCQkJCXRvb2xUaXAuc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJdG9vbFRpcC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRvb2xUaXAuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCXNwaW5uZXIuc2V0Rm9yZWdyb3VuZChudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5zZXRTaXplKDMwMCwgMTAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1ZmEzMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogc2hvdyBhIG1lbnUgaW4gYSB0YWJsZSBoZWFkZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy41Ci0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMxMSB7Ci0JCi0Jc3RhdGljIFN0cmluZ1tdW10gZmlsZXMgPSB7Ci0JCXsidmVyLnR4dCIsICIxIEtCIiwgIlRleHQgRG9jdW1lbnQiLCAiMjgvMDkvMjAwNSA5OjU3IEFNIiwgImFkbWluIix9LAotCQl7IlRodW1icy5kYiIsICI3NiBLQiIsICJEYXRhIEJhc2UgZmlsZSIsICIxMy8wMy8yMDA2IDM6NTYgUE0iLCAiam9obiIsfSwKLQkJeyJkYWRkeS5ibXAiLCAiMTQ4IE1CIiwgIkJpdG1hcCIsICIyNy8xMC8yMDA4IDE6MzQgUE0iLCAiYmlsbCIsfSwKLQkJeyJpby5zeXMiLCAiNDggS0IiLCAiRmlsZSBTeXN0ZW0iLCAiMTYvMTIvMjAwOCA2OjE0IEFNIiwgImFkbWluIix9LAotCQl7IlByb2dyYW1zIiwgIjAgS0IiLCAiRmlsZSBGb2xkZXIiLCAiMDQvMDIvMjAwOSAxMjoxOCBQTSIsICJhbm5lIix9LAotCQl7InRlc3Qucm5kIiwgIjU1IE1CIiwgIlJORCBGaWxlIiwgIjE5LzAyLzIwMDkgNTo0OSBQTSIsICJqb2huIix9LAotCQl7ImFyaWFsLnR0ZiIsICI5NCBLQiIsICJUcnVlIFR5cGUgRm9udCIsICIyNS8wOC8yMDA4IDE6MjUgUE0iLCAiam9obiIsfSwKLQl9OyAKLQkKLXN0YXRpYyB2b2lkIGNyZWF0ZU1lbnVJdGVtKE1lbnUgcGFyZW50LCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4pIHsKLQlmaW5hbCBNZW51SXRlbSBpdGVtTmFtZSA9IG5ldyBNZW51SXRlbShwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JaXRlbU5hbWUuc2V0VGV4dChjb2x1bW4uZ2V0VGV4dCgpKTsKLQlpdGVtTmFtZS5zZXRTZWxlY3Rpb24oY29sdW1uLmdldFJlc2l6YWJsZSgpKTsKLQlpdGVtTmFtZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoaXRlbU5hbWUuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQljb2x1bW4uc2V0V2lkdGgoMTUwKTsKLQkJCQljb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljb2x1bW4uc2V0V2lkdGgoMCk7Ci0JCQkJY29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0JCi0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTHxTV1QuSF9TQ1JPTEx8IFNXVC5CT1JERVIpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JZmluYWwgTWVudSBoZWFkZXJNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5QT1BfVVApOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbk5hbWUgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW5OYW1lLnNldFRleHQoIk5hbWUiKTsKLQljb2x1bW5OYW1lLnNldFdpZHRoKDE1MCk7Ci0JY3JlYXRlTWVudUl0ZW0oaGVhZGVyTWVudSwgY29sdW1uTmFtZSk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uU2l6ZSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtblNpemUuc2V0VGV4dCgiU2l6ZSIpOwotCWNvbHVtblNpemUuc2V0V2lkdGgoMTUwKTsKLQljcmVhdGVNZW51SXRlbShoZWFkZXJNZW51LCBjb2x1bW5TaXplKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW5UeXBlID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uVHlwZS5zZXRUZXh0KCJUeXBlIik7Ci0JY29sdW1uVHlwZS5zZXRXaWR0aCgxNTApOwotCWNyZWF0ZU1lbnVJdGVtKGhlYWRlck1lbnUsIGNvbHVtblR5cGUpOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbkRhdGUgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW5EYXRlLnNldFRleHQoIkRhdGUiKTsKLQljb2x1bW5EYXRlLnNldFdpZHRoKDE1MCk7Ci0JY3JlYXRlTWVudUl0ZW0oaGVhZGVyTWVudSwgY29sdW1uRGF0ZSk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uT3duZXIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW5Pd25lci5zZXRUZXh0KCJPd25lciIpOwotCWNvbHVtbk93bmVyLnNldFdpZHRoKDApOwotCWNvbHVtbk93bmVyLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JY3JlYXRlTWVudUl0ZW0oaGVhZGVyTWVudSwgY29sdW1uT3duZXIpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChmaWxlc1tpXSk7Ci0JfQotCQotCWZpbmFsIE1lbnUgdGFibGVNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5QT1BfVVApOwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0odGFibGVNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KCJPcGVuIik7Ci0JaXRlbSA9IG5ldyBNZW51SXRlbSh0YWJsZU1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQoIk9wZW4gV2l0aCIpOwotCW5ldyBNZW51SXRlbSh0YWJsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0odGFibGVNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KCJDdXQiKTsKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHRhYmxlTWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCgiQ29weSIpOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0odGFibGVNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KCJQYXN0ZSIpOwotCW5ldyBNZW51SXRlbSh0YWJsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0odGFibGVNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KCJEZWxldGUiKTsKLQkKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVudURldGVjdCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcHQgPSBkaXNwbGF5Lm1hcChudWxsLCB0YWJsZSwgbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gdGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotCQkJYm9vbGVhbiBoZWFkZXIgPSBjbGllbnRBcmVhLnkgPD0gcHQueSAmJiBwdC55IDwgKGNsaWVudEFyZWEueSArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKTsKLQkJCXRhYmxlLnNldE1lbnUoaGVhZGVyID8gaGVhZGVyTWVudSA6IHRhYmxlTWVudSk7Ci0JCX0KLQl9KTsKLQkKLQkvKiBJTVBPUlRBTlQ6IERpc3Bvc2UgdGhlIG1lbnVzIChvbmx5IHRoZSBjdXJyZW50IG1lbnUsIHNldCB3aXRoIHNldE1lbnUoKSwgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRpc3Bvc2VkKSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQloZWFkZXJNZW51LmRpc3Bvc2UoKTsKLQkJCXRhYmxlTWVudS5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmN2Q0YTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogc2hvdyBhIG1lbnUgaW4gYSB0cmVlIGhlYWRlcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjUKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzEyIHsKLQkKLQlzdGF0aWMgU3RyaW5nW11bXSBmaWxlcyA9IHsKLQkJeyJ2ZXIudHh0IiwgIjEgS0IiLCAiVGV4dCBEb2N1bWVudCIsICIyOC8wOS8yMDA1IDk6NTcgQU0iLCAiYWRtaW4iLH0sCi0JCXsiVGh1bWJzLmRiIiwgIjc2IEtCIiwgIkRhdGEgQmFzZSBmaWxlIiwgIjEzLzAzLzIwMDYgMzo1NiBQTSIsICJqb2huIix9LAotCQl7ImRhZGR5LmJtcCIsICIxNDggTUIiLCAiQml0bWFwIiwgIjI3LzEwLzIwMDggMTozNCBQTSIsICJiaWxsIix9LAotCQl7ImlvLnN5cyIsICI0OCBLQiIsICJGaWxlIFN5c3RlbSIsICIxNi8xMi8yMDA4IDY6MTQgQU0iLCAiYWRtaW4iLH0sCi0JCXsiUHJvZ3JhbXMiLCAiMCBLQiIsICJGaWxlIEZvbGRlciIsICIwNC8wMi8yMDA5IDEyOjE4IFBNIiwgImFubmUiLH0sCi0JCXsidGVzdC5ybmQiLCAiNTUgTUIiLCAiUk5EIEZpbGUiLCAiMTkvMDIvMjAwOSA1OjQ5IFBNIiwgImpvaG4iLH0sCi0JCXsiYXJpYWwudHRmIiwgIjk0IEtCIiwgIlRydWUgVHlwZSBGb250IiwgIjI1LzA4LzIwMDggMToyNSBQTSIsICJqb2huIix9LAotCX07IAotCQotc3RhdGljIHZvaWQgY3JlYXRlTWVudUl0ZW0oTWVudSBwYXJlbnQsIGZpbmFsIFRyZWVDb2x1bW4gY29sdW1uKSB7Ci0JZmluYWwgTWVudUl0ZW0gaXRlbU5hbWUgPSBuZXcgTWVudUl0ZW0ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWl0ZW1OYW1lLnNldFRleHQoY29sdW1uLmdldFRleHQoKSk7Ci0JaXRlbU5hbWUuc2V0U2VsZWN0aW9uKGNvbHVtbi5nZXRSZXNpemFibGUoKSk7Ci0JaXRlbU5hbWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKGl0ZW1OYW1lLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJY29sdW1uLnNldFdpZHRoKDE1MCk7Ci0JCQkJY29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29sdW1uLnNldFdpZHRoKDApOwotCQkJCWNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCQkJfQotCQl9Ci0JfSk7Ci19CQotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuVl9TQ1JPTEx8U1dULkhfU0NST0xMfCBTV1QuQk9SREVSKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JZmluYWwgTWVudSBoZWFkZXJNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5QT1BfVVApOwotCWZpbmFsIFRyZWVDb2x1bW4gY29sdW1uTmFtZSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQljb2x1bW5OYW1lLnNldFRleHQoIk5hbWUiKTsKLQljb2x1bW5OYW1lLnNldFdpZHRoKDE1MCk7Ci0JY3JlYXRlTWVudUl0ZW0oaGVhZGVyTWVudSwgY29sdW1uTmFtZSk7Ci0JZmluYWwgVHJlZUNvbHVtbiBjb2x1bW5TaXplID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCWNvbHVtblNpemUuc2V0VGV4dCgiU2l6ZSIpOwotCWNvbHVtblNpemUuc2V0V2lkdGgoMTUwKTsKLQljcmVhdGVNZW51SXRlbShoZWFkZXJNZW51LCBjb2x1bW5TaXplKTsKLQlmaW5hbCBUcmVlQ29sdW1uIGNvbHVtblR5cGUgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JY29sdW1uVHlwZS5zZXRUZXh0KCJUeXBlIik7Ci0JY29sdW1uVHlwZS5zZXRXaWR0aCgxNTApOwotCWNyZWF0ZU1lbnVJdGVtKGhlYWRlck1lbnUsIGNvbHVtblR5cGUpOwotCWZpbmFsIFRyZWVDb2x1bW4gY29sdW1uRGF0ZSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQljb2x1bW5EYXRlLnNldFRleHQoIkRhdGUiKTsKLQljb2x1bW5EYXRlLnNldFdpZHRoKDE1MCk7Ci0JY3JlYXRlTWVudUl0ZW0oaGVhZGVyTWVudSwgY29sdW1uRGF0ZSk7Ci0JZmluYWwgVHJlZUNvbHVtbiBjb2x1bW5Pd25lciA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQljb2x1bW5Pd25lci5zZXRUZXh0KCJPd25lciIpOwotCWNvbHVtbk93bmVyLnNldFdpZHRoKDApOwotCWNvbHVtbk93bmVyLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JY3JlYXRlTWVudUl0ZW0oaGVhZGVyTWVudSwgY29sdW1uT3duZXIpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChmaWxlc1tpXSk7Ci0JCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQlzdWJJdGVtLnNldFRleHQoIm5vZGUiKTsKLQl9Ci0JCi0JZmluYWwgTWVudSB0cmVlTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKHRyZWVNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KCJPcGVuIik7Ci0JaXRlbSA9IG5ldyBNZW51SXRlbSh0cmVlTWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCgiT3BlbiBXaXRoIik7Ci0JbmV3IE1lbnVJdGVtKHRyZWVNZW51LCBTV1QuU0VQQVJBVE9SKTsKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHRyZWVNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KCJDdXQiKTsKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHRyZWVNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KCJDb3B5Iik7Ci0JaXRlbSA9IG5ldyBNZW51SXRlbSh0cmVlTWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCgiUGFzdGUiKTsKLQluZXcgTWVudUl0ZW0odHJlZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0odHJlZU1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQoIkRlbGV0ZSIpOwotCQotCXRyZWUuYWRkTGlzdGVuZXIoU1dULk1lbnVEZXRlY3QsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHB0ID0gZGlzcGxheS5tYXAobnVsbCwgdHJlZSwgbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gdHJlZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQlib29sZWFuIGhlYWRlciA9IGNsaWVudEFyZWEueSA8PSBwdC55ICYmIHB0LnkgPCAoY2xpZW50QXJlYS55ICsgdHJlZS5nZXRIZWFkZXJIZWlnaHQoKSk7Ci0JCQl0cmVlLnNldE1lbnUoaGVhZGVyID8gaGVhZGVyTWVudSA6IHRyZWVNZW51KTsKLQkJfQotCX0pOwotCQotCS8qIElNUE9SVEFOVDogRGlzcG9zZSB0aGUgbWVudXMgKG9ubHkgdGhlIGN1cnJlbnQgbWVudSwgc2V0IHdpdGggc2V0TWVudSgpLCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGlzcG9zZWQpICovCi0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaGVhZGVyTWVudS5kaXNwb3NlKCk7Ci0JCQl0cmVlTWVudS5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYWI0MzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEZvcm1MYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB1c2UgYSBmb3JtIGxheW91dCB0byBoaWRlL3Nob3cgYSBjb21wb3NpdGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy41Ci0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzEzIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGb3JtTGF5b3V0KCkpOwotCi0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCI+PiIpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgNCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTQpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0KLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlmaW5hbCBGb3JtRGF0YSBkb3duID0gbmV3IEZvcm1EYXRhICgpOwotCQlkb3duLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAoYnV0dG9uLCA0LCBTV1QuQk9UVE9NKTsKLQkJZG93bi5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTQpOwotCQlkb3duLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDQpOwotCQlkb3duLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIC00KTsKLQkJZmluYWwgRm9ybURhdGEgdXAgPSBuZXcgRm9ybURhdGEgKCk7Ci0JCXVwLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCk7Ci0JCXVwLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCk7Ci0JCXVwLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDApOwotCQl1cC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhICh1cCk7Ci0KLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChjb21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpID09IHVwKSB7Ci0JCQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhIChkb3duKTsKLQkJCQkJYnV0dG9uLnNldFRleHQoIjw8Iik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29tcG9zaXRlLnNldExheW91dERhdGEgKHVwKTsKLQkJCQkJYnV0dG9uLnNldFRleHQoIj4+Iik7Ci0JCQkJfQotCQkJCXNoZWxsLnBhY2sgKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0KLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotCQkJCWRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxMjBjMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiB1c2Ugc2hlbGwgbW9kaWZpZWQgc3RhdGUgdG8gcHJvbXB0IGZvciBzYXZlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuNQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzE0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0ICgiVGV4dCBFZGl0b3IiKTsKLQkJTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyIChiYXIpOwotCQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVJdGVtLnNldFRleHQgKCImRmlsZSIpOwotCQlNZW51IGZpbGVNZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQkJZmlsZUl0ZW0uc2V0TWVudSAoZmlsZU1lbnUpOwotCQlNZW51SXRlbSBzYXZlSXRlbSA9IG5ldyBNZW51SXRlbSAoZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJc2F2ZUl0ZW0uc2V0VGV4dCAoIiZTYXZlXHRDdHJsK1MiKTsKLQkJc2F2ZUl0ZW0uc2V0QWNjZWxlcmF0b3IgKFNXVC5NT0QxICsgJ1MnKTsKLQkJc2F2ZUl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJCS8vU0FWRSBDT0RFIEdPRVMgSEVSRSAuLi4KLQkJCQlzaGVsbC5zZXRNb2RpZmllZCAoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJTWVudUl0ZW0gZXhpdEl0ZW0gPSAgbmV3IE1lbnVJdGVtIChmaWxlTWVudSwgU1dULlBVU0gpOwotCQlleGl0SXRlbS5zZXRUZXh0ICgiRXhpdCIpOwotCQlleGl0SXRlbS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJc2hlbGwuY2xvc2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuTW9kaWZ5LCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQlzaGVsbC5zZXRNb2RpZmllZCAodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQlpZiAoc2hlbGwuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94IChzaGVsbCwgU1dULlBSSU1BUllfTU9EQUwgfCBTV1QuT0sgfCBTV1QuQ0FOQ0VMKTsKLQkJCQkJYm94LnNldFRleHQgKHNoZWxsLmdldFRleHQgKCkpOwotCQkJCQlib3guc2V0TWVzc2FnZSAoIllvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcywgZG8geW91IHdhbnQgdG8gZXhpdD8iKTsKLQkJCQkJZS5kb2l0ID0gYm94Lm9wZW4gKCkgPT0gU1dULk9LOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkKLQkJCQlkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzE1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMjc5NmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJ1dHRvbiBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRyaS1zdGF0ZSBidXR0b24gKHRvZ2dsZSB0aHJlZSBzdGF0ZXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuNQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzE1IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiVHJpLXN0YXRlIik7Ci0JCS8qIE1ha2UgdGhlIGJ1dHRvbiB0b2dnbGUgYmV0d2VlbiB0aHJlZSBzdGF0ZXMgKi8KLQkJYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJCWlmIChidXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJaWYgKCFidXR0b24uZ2V0R3JheWVkKCkpIHsKLQkJCQkJCWJ1dHRvbi5zZXRHcmF5ZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoYnV0dG9uLmdldEdyYXllZCgpKSB7Ci0JCQkJCQlidXR0b24uc2V0R3JheWVkKGZhbHNlKTsKLQkJCQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJLyogUmVhZCB0aGUgdHJpLXN0YXRlIGJ1dHRvbiAoYXBwbGljYXRpb24gY29kZSkgKi8KLQkJYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJCWlmIChidXR0b24uZ2V0R3JheWVkKCkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJHcmF5ZWQiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoYnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlbGVjdGVkIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdCBzZWxlY3RlZCIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzczMTYzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTdHlsZWRUZXh0IGV4YW1wbGU6IHVzZSBtYXJnaW5zIGluIFN0eWxlZFRleHQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy41Ci0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzE2IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCXRleHQuc2V0VGV4dCgiU3R5bGVkVGV4dCB3aXRoIG1hcmdpbnMuIik7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJUYWhvbWEiLCAxNCwgU1dULklUQUxJQyk7Ci0JCXRleHQuc2V0VGV4dCgiXCJJZiB5b3UgZ28gZG93biB0byB0aGUgd29vZHMgdG9kYXlcbllvdSdkIGJldHRlciBub3QgZ28gYWxvbmVcbkl0J3MgbG92ZWx5IGRvd24gaW4gdGhlIHdvb2RzIHRvZGF5XG5CdXQgc2FmZXIgdG8gc3RheSBhdCBob21lXCIiKTsKLQkJU3R5bGVSYW5nZSBpdGFsaWMgPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlpdGFsaWMuZm9udCA9IGZvbnQ7Ci0JCXRleHQuc2V0U3R5bGVSYW5nZXMobmV3IGludFtdIHswLCB0ZXh0LmdldENoYXJDb3VudCgpfSwgbmV3IFN0eWxlUmFuZ2VbXSB7aXRhbGljfSk7Ci0JCXRleHQuc2V0TWFyZ2lucygzMCwgMzAsIDMwLCAzMCk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yIChkaXNwbGF5LCAxMzgsIDIyNiwgMjU1KTsKLQkJdGV4dC5zZXRNYXJnaW5Db2xvcihjb2xvcik7Ci0JCXNoZWxsLnNldFNpemUoNTAwLCAzMDApOwotCQlzaGVsbC5vcGVuICgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2YWE0NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBwcm92aWRlIGNyZWRlbnRpYWxzIGZvciBhIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZQotICogCi0gKiBOb3RlIHRoYXQgdGhlIEtOT1dOX0hPU1QsIEtOT1dOX1VTRVIgYW5kIEtOT1dOX1BBU1NXT1JEIGZpZWxkcyBpbiB0aGUgc25pcHBldAotICogYmVsb3cgcmVxdWlyZSB2YWxpZCB2YWx1ZXMgaW4gb3JkZXIgdG8gZnVsbHkgZGVtb25zdHJhdGUgdGhlIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuNQotICovCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMxNyB7Ci0KLXN0YXRpYyBTdHJpbmcgS05PV05fSE9TVCA9ICJ3d3cuZWNsaXBzZS5vcmciOwotc3RhdGljIFN0cmluZyBLTk9XTl9VU0VSID0gImFub255bW91cyI7Ci1zdGF0aWMgU3RyaW5nIEtOT1dOX1BBU1NXT1JEID0gImFub255bW91c1Bhc3N3b3JkIjsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JZmluYWwgVGV4dCBsb2NhdGlvbiA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCWxvY2F0aW9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JQnV0dG9uIGdvID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWdvLnNldFRleHQoIkdvIik7Ci0KLQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JdHJ5IHsKLQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuOwotCX0KLQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JYnJvd3Nlci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWJyb3dzZXIuc2V0VXJsICgiZWNsaXBzZS5vcmciKTsKLQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsb2NhdGlvbi5zZXRUZXh0KGV2ZW50LmxvY2F0aW9uKTsKLQkJfQotCX0pOwotCi0JTGlzdGVuZXIgbmF2aWdhdGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCX0KLQl9OwotCWdvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5hdmlnYXRlTGlzdGVuZXIpOwotCWxvY2F0aW9uLmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuYXZpZ2F0ZUxpc3RlbmVyKTsKLQotCWJyb3dzZXIuYWRkQXV0aGVudGljYXRpb25MaXN0ZW5lcihuZXcgQXV0aGVudGljYXRpb25MaXN0ZW5lcigpewotCQlwdWJsaWMgdm9pZCBhdXRoZW50aWNhdGUoQXV0aGVudGljYXRpb25FdmVudCBldmVudCkgewotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTChldmVudC5sb2NhdGlvbik7Ci0JCQkJaWYgKHVybC5nZXRIb3N0KCkuZXF1YWxzKEtOT1dOX0hPU1QpKSB7Ci0JCQkJCWV2ZW50LnVzZXIgPSBLTk9XTl9VU0VSOwotCQkJCQlldmVudC5wYXNzd29yZCA9IEtOT1dOX1BBU1NXT1JEOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIGRvIG5vdGhpbmcsIGxldCBkZWZhdWx0IHByb21wdGVyIHJ1biAqLwotCQkJCX0KLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLyogc2hvdWxkIG5vdCBoYXBwZW4sIGxldCBkZWZhdWx0IHByb21wdGVyIHJ1biAqLwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5zZXRCb3VuZHMoMTAsMTAsNTAwLDUwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODNhMmU4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQcmludGVyIGV4YW1wbGUgc25pcHBldDogcHJpbnQgaW4gbGFuZHNjYXBlIG1vZGUKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuNQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMTggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JUHJpbnRlckRhdGEgcHJpbnRlckRhdGEgPSBuZXcgUHJpbnRlckRhdGEoKTsKLQlwcmludGVyRGF0YS5vcmllbnRhdGlvbiA9IFByaW50ZXJEYXRhLkxBTkRTQ0FQRTsKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihwcmludGVyRGF0YSk7Ci0JUG9pbnQgZHBpID0gcHJpbnRlci5nZXREUEkoKTsKLQlpZiAocHJpbnRlci5zdGFydEpvYigiU1dUIFByaW50aW5nIFNuaXBwZXQiKSkgewotCQlHQyBnYyA9IG5ldyBHQyhwcmludGVyKTsKLQkJaWYgKHByaW50ZXIuc3RhcnRQYWdlKCkpIHsKLQkJCWludCBvbmVJbmNoID0gZHBpLng7Ci0JCQlnYy5kcmF3U3RyaW5nKCJIZWxsbyBXb3JsZCEiLCBvbmVJbmNoLCAyICogb25lSW5jaCk7Ci0JCQlnYy5kcmF3U3RyaW5nKCJQcmludGVkIG9uICIgKyBwcmludGVyRGF0YS5uYW1lICsgIiB1c2luZyBTV1Qgb24gIiArIFNXVC5nZXRQbGF0Zm9ybSgpLCBvbmVJbmNoLCBvbmVJbmNoICogNS8yKTsKLQkJCXByaW50ZXIuZW5kUGFnZSgpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJcHJpbnRlci5lbmRKb2IoKTsKLQl9Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxY2JkYTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3JhbSBleGFtcGxlIHNuaXBwZXQ6IGZpbmQgdGhlIGljb24gb2YgdGhlIHByb2dyYW0gdGhhdCBlZGl0cyAuYm1wIGZpbGVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiQ2FuJ3QgZmluZCBpY29uIGZvciAuYm1wIik7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCVByb2dyYW0gcCA9IFByb2dyYW0uZmluZFByb2dyYW0gKCIuYm1wIik7Ci0JaWYgKHAgIT0gbnVsbCkgewotCQlJbWFnZURhdGEgZGF0YSA9IHAuZ2V0SW1hZ2VEYXRhICgpOwotCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgZGF0YSk7Ci0JCQlsYWJlbC5zZXRJbWFnZSAoaW1hZ2UpOwotCQl9Ci0JfQotCWxhYmVsLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYjMyMTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGlyZWN0b3J5RGlhbG9nIGV4YW1wbGUgc25pcHBldDogcHJvbXB0IGZvciBhIGRpcmVjdG9yeQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyAoc2hlbGwpOwotCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCWRpYWxvZy5zZXRGaWx0ZXJQYXRoIChwbGF0Zm9ybS5lcXVhbHMoIndpbjMyIikgfHwgcGxhdGZvcm0uZXF1YWxzKCJ3cGYiKSA/ICJjOlxcIiA6ICIvIik7Ci0JU3lzdGVtLm91dC5wcmludGxuICgiUkVTVUxUPSIgKyBkaWFsb2cub3BlbiAoKSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3NjVjYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTGFiZWwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBsYWJlbCAod2l0aCBhbiBpbWFnZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRJbWFnZSAoaW1hZ2UpOwotCWxhYmVsLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOyAKLQl9IAotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzODdjZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0YWJsZSAobm8gY29sdW1ucywgbm8gaGVhZGVycykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIDApOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTcyODQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBmbGF0IHRvb2wgYmFyIChpbWFnZXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5GTEFUIHwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQl9Ci0JdG9vbEJhci5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmNmNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIExhYmVsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbGFiZWwgKGEgc2VwYXJhdG9yKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQluZXcgTGFiZWwgKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCW5ldyBMYWJlbCAoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuVkVSVElDQUwpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhNTgxMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIChjb2x1bW5zLCBoZWFkZXJzLCBsaW5lcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gMjAwOwotCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JU3RyaW5nW10gdGl0bGVzID0geyIgIiwgIkMiLCAiISIsICJEZXNjcmlwdGlvbiIsICJSZXNvdXJjZSIsICJJbiBGb2xkZXIiLCAiTG9jYXRpb24ifTsKLQlmb3IgKGludCBpPTA7IGk8dGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQgKHRpdGxlcyBbaV0pOwotCX0JCi0JaW50IGNvdW50ID0gMTI4OwotCWZvciAoaW50IGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgwLCAieCIpOwotCQlpdGVtLnNldFRleHQgKDEsICJ5Iik7Ci0JCWl0ZW0uc2V0VGV4dCAoMiwgIiEiKTsKLQkJaXRlbS5zZXRUZXh0ICgzLCAidGhpcyBzdHVmZiBiZWhhdmVzIHRoZSB3YXkgSSBleHBlY3QiKTsKLQkJaXRlbS5zZXRUZXh0ICg0LCAiYWxtb3N0IGV2ZXJ5d2hlcmUiKTsKLQkJaXRlbS5zZXRUZXh0ICg1LCAic29tZS5mb2xkZXIiKTsKLQkJaXRlbS5zZXRUZXh0ICg2LCAibGluZSAiICsgaSArICIgaW4gbm93aGVyZSIpOwotCX0KLQlmb3IgKGludCBpPTA7IGk8dGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbiAoaSkucGFjayAoKTsKLQl9CQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YmRkY2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ0NvbWJvIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgQ0NvbWJvCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCUNDb21ibyBjb21ibyA9IG5ldyBDQ29tYm8oc2hlbGwsIFNXVC5GTEFUIHwgU1dULkJPUkRFUik7Ci0JCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJY29tYm8uYWRkKCJpdGVtIiArIGkpOwotCQl9Ci0JCWNvbWJvLnNldFRleHQoIml0ZW0wIik7Ci0KLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJdGVtIHNlbGVjdGVkIik7Ci0JCQl9OwotCQl9KTsKLQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmM4NDExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBlc2NhcGUgZnJvbSBjbG9zaW5nIGEgZGlhbG9nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dCgiT3BlbiBEaWFsb2cgLi4uIik7Ci0JCWIucGFjaygpOwotCQliLnNldExvY2F0aW9uKDEwLCAxMCk7Ci0JCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCVNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNKTsKLQkJCQlkaWFsb2cuYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKSB7Ci0JCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjU3NmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBwb3B1cCBtZW51IChzZXQgaW4gbXVsdGlwbGUgY29udHJvbHMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29tcG9zaXRlIGMxID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMxLnNldFNpemUgKDEwMCwgMTAwKTsKLQlDb21wb3NpdGUgYzIgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYzIuc2V0Qm91bmRzICgxMDAsIDAsIDEwMCwgMTAwKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKCJQb3B1cCIpOwotCWMxLnNldE1lbnUgKG1lbnUpOwotCWMyLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwZTE5Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sIFRpcHMgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdG9vbCB0aXBzIGZvciBhIHRhYiBpdGVtLCB0b29sIGl0ZW0sIGFuZCBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JU3RyaW5nIHN0cmluZyA9ICJUaGlzIGlzIGEgc3RyaW5nXG53aXRoIGEgbmV3IGxpbmUuIjsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBUYWJGb2xkZXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb2xkZXIuc2V0U2l6ZSAoMjAwLCAyMDApOwotCVRhYkl0ZW0gaXRlbTAgPSBuZXcgVGFiSXRlbSAoZm9sZGVyLCAwKTsKLQlpdGVtMC5zZXRUb29sVGlwVGV4dCAoIlRhYkl0ZW0gdG9vbFRpcDogIiArIHN0cmluZyk7Ci0JVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWJhci5zZXRCb3VuZHMgKDAsIDIwMCwgMjAwLCA2NCk7Ci0JVG9vbEl0ZW0gaXRlbTEgPSBuZXcgVG9vbEl0ZW0gKGJhciwgMCk7Ci0JaXRlbTEuc2V0VG9vbFRpcFRleHQgKCJUb29sSXRlbSB0b29sVGlwOiAiICsgc3RyaW5nKTsKLQlzaGVsbC5zZXRUb29sVGlwVGV4dCAoIlNoZWxsIHRvb2xUaXA6ICIgKyBzdHJpbmcpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWRmNDFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERpc3BsYXkgZXhhbXBsZSBzbmlwcGV0OiBnZXQgdGhlIGJvdW5kcyBhbmQgY2xpZW50IGFyZWEgb2YgYSBkaXNwbGF5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEaXNwbGF5IEJvdW5kcz0iICsgZGlzcGxheS5nZXRCb3VuZHMgKCkgKyAiIERpc3BsYXkgQ2xpZW50QXJlYT0iICsgZGlzcGxheS5nZXRDbGllbnRBcmVhICgpKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4NzA0Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDYXJldCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNhcmV0ICh1c2luZyBhbiBpbWFnZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlDYXJldCBjYXJldCA9IG5ldyBDYXJldCAoc2hlbGwsIFNXVC5OT05FKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoYmxhY2spOwotCWdjLmZpbGxSZWN0YW5nbGUgKDAsIDAsIDIwLCAyMCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZCAod2hpdGUpOwotCWdjLmRyYXdMaW5lICgwLCAwLCAxOSwgMTkpOwotCWdjLmRyYXdMaW5lICgxOSwgMCwgMCwgMTkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JY2FyZXQuc2V0TG9jYXRpb24gKDEwLCAxMCk7Ci0JY2FyZXQuc2V0SW1hZ2UgKGltYWdlKTsKLQljYXJldC5zZXRWaXNpYmxlICh0cnVlKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlnYy5kcmF3SW1hZ2UgKGltYWdlLCAxMCwgNjQpOwotCQkJZ2MuZHJhd1N0cmluZyAoIlRlc3QiLCAxMiwgMTIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1Njg2OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDdXJzb3IgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIGhhbmQgY3Vyc29yIGludG8gYSBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvciAoZGlzcGxheSwgU1dULkNVUlNPUl9IQU5EKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlmaW5hbCBCdXR0b24gYiA9IG5ldyBCdXR0b24gKHNoZWxsLCAwKTsKLQliLnNldEJvdW5kcyAoMTAsIDEwLCAyMDAsIDIwMCk7Ci0JYi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWIuc2V0Q3Vyc29yIChjdXJzb3IpOwotCQl9Ci0JfSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmFjZWUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNjYWxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2NhbGUgKG1heGltdW0gNDAsIHBhZ2UgaW5jcmVtZW50IDUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JU2NhbGUgc2NhbGUgPSBuZXcgU2NhbGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlzY2FsZS5zZXRTaXplICgyMDAsIDY0KTsKLQlzY2FsZS5zZXRNYXhpbXVtICg0MCk7Ci0Jc2NhbGUuc2V0UGFnZUluY3JlbWVudCAoNSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YWM2MjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IGludGVyY2VwdCBtb3VzZSBldmVudHMgKGRyYWcgYSBidXR0b24gd2l0aCB0aGUgbW91c2UpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ2IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5OT05FKTsKLQljb21wb3NpdGUuc2V0RW5hYmxlZCAoZmFsc2UpOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJCdXR0b24iKTsKLQljb21wb3NpdGUucGFjayAoKTsKLQljb21wb3NpdGUuc2V0TG9jYXRpb24gKDEwLCAxMCk7Ci0JZmluYWwgUG9pbnQgW10gb2Zmc2V0ID0gbmV3IFBvaW50IFsxXTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRCb3VuZHMgKCk7Ci0JCQkJCWlmIChyZWN0LmNvbnRhaW5zIChldmVudC54LCBldmVudC55KSkgewotCQkJCQkJUG9pbnQgcHQxID0gY29tcG9zaXRlLnRvRGlzcGxheSAoMCwgMCk7Ci0JCQkJCQlQb2ludCBwdDIgPSBzaGVsbC50b0Rpc3BsYXkgKGV2ZW50LngsIGV2ZW50LnkpOyAKLQkJCQkJCW9mZnNldCBbMF0gPSBuZXcgUG9pbnQgKHB0Mi54IC0gcHQxLngsIHB0Mi55IC0gcHQxLnkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaWYgKG9mZnNldCBbMF0gIT0gbnVsbCkgewotCQkJCQkJUG9pbnQgcHQgPSBvZmZzZXQgWzBdOwotCQkJCQkJY29tcG9zaXRlLnNldExvY2F0aW9uIChldmVudC54IC0gcHQueCwgZXZlbnQueSAtIHB0LnkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlVXA6Ci0JCQkJCW9mZnNldCBbMF0gPSBudWxsOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlVXAsIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA1NWNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdG9vbCBiYXIgKG5vcm1hbCwgaG90IGFuZCBkaXNhYmxlZCBpbWFnZXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0KLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JCi0JSW1hZ2UgZGlzYWJsZWRJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQljb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9HUkVFTik7Ci0JZ2MgPSBuZXcgR0MgKGRpc2FibGVkSW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChkaXNhYmxlZEltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQkKLQlJbWFnZSBob3RJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQljb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCWdjID0gbmV3IEdDIChob3RJbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGhvdEltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQkKLQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5GTEFUKTsKLQliYXIuc2V0U2l6ZSAoMjAwLCAzMik7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCAwKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW1hZ2UpOwotCQlpdGVtLnNldERpc2FibGVkSW1hZ2UgKGRpc2FibGVkSW1hZ2UpOwotCQlpdGVtLnNldEhvdEltYWdlIChob3RJbWFnZSk7Ci0JCWlmIChpICUgMyA9PSAwKSBpdGVtLnNldEVuYWJsZWQgKGZhbHNlKTsKLQl9Ci0JCi0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNhYmxlZEltYWdlLmRpc3Bvc2UgKCk7Ci0JaG90SW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzYmE3Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENhbnZhcyBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhbiBpbWFnZSAoZmxpY2tlciBmcmVlLCBubyBkb3VibGUgYnVmZmVyaW5nKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JSW1hZ2Ugb3JpZ2luYWxJbWFnZSA9IG51bGw7Ci0JRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyAoc2hlbGwsIFNXVC5PUEVOKTsKLQlkaWFsb2cuc2V0VGV4dCAoIk9wZW4gYW4gaW1hZ2UgZmlsZSBvciBjYW5jZWwiKTsKLQlTdHJpbmcgc3RyaW5nID0gZGlhbG9nLm9wZW4gKCk7Ci0JaWYgKHN0cmluZyAhPSBudWxsKSB7Ci0JCW9yaWdpbmFsSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIHN0cmluZyk7Ci0JfQotCWlmIChvcmlnaW5hbEltYWdlID09IG51bGwpIHsKLQkJaW50IHdpZHRoID0gMTUwLCBoZWlnaHQgPSAyMDA7Ci0JCW9yaWdpbmFsSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIHdpZHRoLCBoZWlnaHQpOwotCQlHQyBnYyA9IG5ldyBHQyAob3JpZ2luYWxJbWFnZSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUgKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlnYy5kcmF3TGluZSAoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JCWdjLmRyYXdMaW5lICgwLCBoZWlnaHQsIHdpZHRoLCAwKTsKLQkJZ2MuZHJhd1RleHQgKCJEZWZhdWx0IEltYWdlIiwgMTAsIDEwKTsKLQkJZ2MuZGlzcG9zZSAoKTsKLQl9Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBvcmlnaW5hbEltYWdlOwotCWZpbmFsIFBvaW50IG9yaWdpbiA9IG5ldyBQb2ludCAoMCwgMCk7Ci0JZmluYWwgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMgKHNoZWxsLCBTV1QuTk9fQkFDS0dST1VORCB8Ci0JCQlTV1QuTk9fUkVEUkFXX1JFU0laRSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIgPSBjYW52YXMuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQloQmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJaW50IGhTZWxlY3Rpb24gPSBoQmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWludCBkZXN0WCA9IC1oU2VsZWN0aW9uIC0gb3JpZ2luLng7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCWNhbnZhcy5zY3JvbGwgKGRlc3RYLCAwLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJb3JpZ2luLnggPSAtaFNlbGVjdGlvbjsKLQkJfQotCX0pOwotCWZpbmFsIFNjcm9sbEJhciB2QmFyID0gY2FudmFzLmdldFZlcnRpY2FsQmFyICgpOwotCXZCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlpbnQgdlNlbGVjdGlvbiA9IHZCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaW50IGRlc3RZID0gLXZTZWxlY3Rpb24gLSBvcmlnaW4ueTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzICgpOwotCQkJY2FudmFzLnNjcm9sbCAoMCwgZGVzdFksIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCBmYWxzZSk7Ci0JCQlvcmlnaW4ueSA9IC12U2VsZWN0aW9uOwotCQl9Ci0JfSk7Ci0JY2FudmFzLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCAgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzICgpOwotCQkJUmVjdGFuZ2xlIGNsaWVudCA9IGNhbnZhcy5nZXRDbGllbnRBcmVhICgpOwotCQkJaEJhci5zZXRNYXhpbXVtIChyZWN0LndpZHRoKTsKLQkJCXZCYXIuc2V0TWF4aW11bSAocmVjdC5oZWlnaHQpOwotCQkJaEJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHJlY3Qud2lkdGgsIGNsaWVudC53aWR0aCkpOwotCQkJdkJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHJlY3QuaGVpZ2h0LCBjbGllbnQuaGVpZ2h0KSk7Ci0JCQlpbnQgaFBhZ2UgPSByZWN0LndpZHRoIC0gY2xpZW50LndpZHRoOwotCQkJaW50IHZQYWdlID0gcmVjdC5oZWlnaHQgLSBjbGllbnQuaGVpZ2h0OwotCQkJaW50IGhTZWxlY3Rpb24gPSBoQmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWludCB2U2VsZWN0aW9uID0gdkJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpZiAoaFNlbGVjdGlvbiA+PSBoUGFnZSkgewotCQkJCWlmIChoUGFnZSA8PSAwKSBoU2VsZWN0aW9uID0gMDsKLQkJCQlvcmlnaW4ueCA9IC1oU2VsZWN0aW9uOwotCQkJfQotCQkJaWYgKHZTZWxlY3Rpb24gPj0gdlBhZ2UpIHsKLQkJCQlpZiAodlBhZ2UgPD0gMCkgdlNlbGVjdGlvbiA9IDA7Ci0JCQkJb3JpZ2luLnkgPSAtdlNlbGVjdGlvbjsKLQkJCX0KLQkJCWNhbnZhcy5yZWRyYXcgKCk7Ci0JCX0KLQl9KTsKLQljYW52YXMuYWRkTGlzdGVuZXIgKFNXVC5QYWludCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWdjLmRyYXdJbWFnZSAoaW1hZ2UsIG9yaWdpbi54LCBvcmlnaW4ueSk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCVJlY3RhbmdsZSBjbGllbnQgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCWludCBtYXJnaW5XaWR0aCA9IGNsaWVudC53aWR0aCAtIHJlY3Qud2lkdGg7Ci0JCQlpZiAobWFyZ2luV2lkdGggPiAwKSB7Ci0JCQkJZ2MuZmlsbFJlY3RhbmdsZSAocmVjdC53aWR0aCwgMCwgbWFyZ2luV2lkdGgsIGNsaWVudC5oZWlnaHQpOwotCQkJfQotCQkJaW50IG1hcmdpbkhlaWdodCA9IGNsaWVudC5oZWlnaHQgLSByZWN0LmhlaWdodDsKLQkJCWlmIChtYXJnaW5IZWlnaHQgPiAwKSB7Ci0JCQkJZ2MuZmlsbFJlY3RhbmdsZSAoMCwgcmVjdC5oZWlnaHQsIGNsaWVudC53aWR0aCwgbWFyZ2luSGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMTUwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlvcmlnaW5hbEltYWdlLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjZhMTI4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdG9vbCBiYXIgKHdyYXAgb24gcmVzaXplKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULldSQVApOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJUG9pbnQgc2l6ZSA9IHRvb2xCYXIuY29tcHV0ZVNpemUgKHJlY3Qud2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJCXRvb2xCYXIuc2V0U2l6ZSAoc2l6ZSk7Ci0JCX0KLQl9KTsKLQl0b29sQmFyLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNTBhNDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTY3JvbGxlZENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhIGNvbnRyb2wgaW4gYSBzY3JvbGxlZCBjb21wb3NpdGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIAotewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLSAgICAvLyB0aGlzIGJ1dHRvbiBpcyBhbHdheXMgNDAwIHggNDAwLiBTY3JvbGxiYXJzIGFwcGVhciBpZiB0aGUgd2luZG93IGlzIHJlc2l6ZWQgdG8gYmUKLSAgICAvLyB0b28gc21hbGwgdG8gc2hvdyBwYXJ0IG9mIHRoZSBidXR0b24KLSAgICBTY3JvbGxlZENvbXBvc2l0ZSBjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgQnV0dG9uIGIxID0gbmV3IEJ1dHRvbihjMSwgU1dULlBVU0gpOwotICAgIGIxLnNldFRleHQoImZpeGVkIHNpemUgYnV0dG9uIik7Ci0gICAgYjEuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0gICAgYzEuc2V0Q29udGVudChiMSk7Ci0KLSAgICAvLyB0aGlzIGJ1dHRvbiBoYXMgYSBtaW5pbXVtIHNpemUgb2YgNDAwIHggNDAwLiBJZiB0aGUgd2luZG93IGlzIHJlc2l6ZWQgdG8gYmUgYmlnCi0gICAgLy8gZW5vdWdoIHRvIHNob3cgbW9yZSB0aGFuIDQwMCB4IDQwMCwgdGhlIGJ1dHRvbiB3aWxsIGdyb3cgaW4gc2l6ZS4gSWYgdGhlIHdpbmRvdwotICAgIC8vIGlzIG1hZGUgdG9vIHNtYWxsIHRvIHNob3cgNDAwIHggNDAwLCBzY3JvbGxiYXJzIHdpbGwgYXBwZWFyLgotICAgIFNjcm9sbGVkQ29tcG9zaXRlIGMyID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICBCdXR0b24gYjIgPSBuZXcgQnV0dG9uKGMyLCBTV1QuUFVTSCk7Ci0gICAgYjIuc2V0VGV4dCgiZXhwYW5kaW5nIGJ1dHRvbiIpOwotICAgIGMyLnNldENvbnRlbnQoYjIpOwotICAgIGMyLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0gICAgYzIuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0gICAgYzIuc2V0TWluU2l6ZSg0MDAsIDQwMCk7Ci0KLSAgICBzaGVsbC5zZXRTaXplKDYwMCwgMzAwKTsKLSAgICBzaGVsbC5vcGVuICgpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmQyOTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgZGlhbG9nIHNoZWxsCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCAoIlNoZWxsIik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0JU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsIChzaGVsbCk7Ci0JZGlhbG9nLnNldFRleHQgKCJEaWFsb2ciKTsKLQlkaWFsb2cuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWRpYWxvZy5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYmQ3NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhIHRhYmxlIChzZXQgdGhlIHRvcCBpbmRleCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0VG9wSW5kZXggKDk1KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQyNDYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogc2VsZWN0IGFuIGluZGV4IChzZWxlY3QgYW5kIHNjcm9sbCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0U2VsZWN0aW9uICg5NSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjYWU0NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiByZW1vdmUgc2VsZWN0ZWQgaXRlbXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQl0YWJsZS5zZXRNZW51IChtZW51KTsKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0ICgiRGVsZXRlIFNlbGVjdGlvbiIpOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJdGFibGUucmVtb3ZlICh0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzICgpKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGIzYTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNhc2ggZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBzYXNoIChhbGxvdyBpdCB0byBiZSBtb3ZlZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVkVSVElDQUwpOwotCXNhc2guc2V0Qm91bmRzICgxMCwgMTAsIDMyLCAxMDApOwotCXNhc2guYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlzYXNoLnNldEJvdW5kcyAoZS54LCBlLnksIGUud2lkdGgsIGUuaGVpZ2h0KTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jc2FzaC5zZXRGb2N1cyAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNmE4M2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiByZXNpemUgYSB0ZXh0IGNvbnRyb2wgKHNob3cgYWJvdXQgMTAgY2hhcmFjdGVycykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWludCBjb2x1bW5zID0gMTA7Ci0JR0MgZ2MgPSBuZXcgR0MgKHRleHQpOwotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MgKCk7Ci0JaW50IHdpZHRoID0gY29sdW1ucyAqIGZtLmdldEF2ZXJhZ2VDaGFyV2lkdGggKCk7Ci0JaW50IGhlaWdodCA9IGZtLmdldEhlaWdodCAoKTsKLQlnYy5kaXNwb3NlICgpOwotCXRleHQuc2V0U2l6ZSAodGV4dC5jb21wdXRlU2l6ZSAod2lkdGgsIGhlaWdodCkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZWFiYjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3Jlc3NCYXIgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgYSBwcm9ncmVzcyBiYXIgKGZyb20gYW5vdGhlciB0aHJlYWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTYgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJZmluYWwgUHJvZ3Jlc3NCYXIgYmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBTV1QuU01PT1RIKTsKLQkJYmFyLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMzIpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWZpbmFsIGludCBtYXhpbXVtID0gYmFyLmdldE1heGltdW0oKTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmb3IgKGZpbmFsIGludFtdIGkgPSBuZXcgaW50WzFdOyBpWzBdIDw9IG1heGltdW07IGlbMF0rKykgewotCQkJCXRyeSB7VGhyZWFkLnNsZWVwICgxMDApO30gY2F0Y2ggKFRocm93YWJsZSB0aCkge30KLQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChiYXIuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCQkJCWJhci5zZXRTZWxlY3Rpb24oaVswXSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGI5ZDhmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyZXNzQmFyIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIGEgcHJvZ3Jlc3MgYmFyIChmcm9tIHRoZSBVSSB0aHJlYWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgUHJvZ3Jlc3NCYXIgYmFyID0gbmV3IFByb2dyZXNzQmFyIChzaGVsbCwgU1dULlNNT09USCk7Ci0JYmFyLnNldEJvdW5kcyAoMTAsIDEwLCAyMDAsIDMyKTsKLQlzaGVsbC5vcGVuICgpOwotCQotCWRpc3BsYXkudGltZXJFeGVjKDEwMCwgbmV3IFJ1bm5hYmxlKCkgewotCQlpbnQgaSA9IDA7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChiYXIuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQliYXIuc2V0U2VsZWN0aW9uKGkrKyk7Ci0JCQlpZiAoaSA8PSBiYXIuZ2V0TWF4aW11bSgpKSBkaXNwbGF5LnRpbWVyRXhlYygxMDAsIHRoaXMpOwotCQl9Ci0JfSk7Ci0KLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MTQ0MTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGEgY29tYm8gYm94IGluIGEgdG9vbCBiYXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChiYXIsIDApOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JVG9vbEl0ZW0gc2VwID0gbmV3IFRvb2xJdGVtIChiYXIsIFNXVC5TRVBBUkFUT1IpOwotCWludCBzdGFydCA9IGJhci5nZXRJdGVtQ291bnQgKCk7Ci0JZm9yIChpbnQgaT1zdGFydDsgaTxzdGFydCs0OyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCAwKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChiYXIsIFNXVC5SRUFEX09OTFkpOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJY29tYm8uYWRkICgiSXRlbSAiICsgaSk7Ci0JfQotCWNvbWJvLnBhY2sgKCk7Ci0Jc2VwLnNldFdpZHRoIChjb21iby5nZXRTaXplICgpLngpOwotCXNlcC5zZXRDb250cm9sIChjb21ibyk7Ci0JYmFyLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4ZGFjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaXN0IGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2VsZWN0ZWQgaXRlbXMgaW4gYSBsaXN0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgTGlzdCBsaXN0ID0gbmV3IExpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIGxpc3QuYWRkICgiSXRlbSAiICsgaSk7Ci0JbGlzdC5zZXRCb3VuZHMgKDAsIDAsIDEwMCwgMTAwKTsKLQlsaXN0LmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJaW50IFtdIHNlbGVjdGlvbiA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcyAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCWxpc3QuYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJaW50IFtdIHNlbGVjdGlvbiA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcyAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGVmYXVsdFNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzMjQ3Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEdyaWRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgZ3JpZCBsYXlvdXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0gICAgZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotICAgIHNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBmaW5hbCBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGMuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgIEJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgICAgIGIuc2V0VGV4dCgiQnV0dG9uICIraSk7Ci0gICAgfQotCi0gICAgQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgYi5zZXRUZXh0KCJhZGQgYSBuZXcgYnV0dG9uIGF0IHJvdyAyIGNvbHVtbiAxIik7Ci0gICAgZmluYWwgaW50W10gaW5kZXggPSBuZXcgaW50WzFdOwotICAgIGIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgICAgICBCdXR0b24gcyA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotICAgICAgICAgICAgcy5zZXRUZXh0KCJTcGVjaWFsICIraW5kZXhbMF0pOwotICAgICAgICAgICAgaW5kZXhbMF0rKzsKLSAgICAgICAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IGMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIHMubW92ZUFib3ZlKGNoaWxkcmVuWzNdKTsKLSAgICAgICAgICAgIHNoZWxsLmxheW91dChuZXcgQ29udHJvbFtdIHtzfSk7Ci0gICAgICAgIH0KLSAgICB9KTsKLQotICAgIHNoZWxsLm9wZW4gKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiY2UxMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEaXNwbGF5IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIHR3byBvbmUgc2hvdCB0aW1lcnMgKDUwMDAgbXMsIDIwMDAgbXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0JZGlzcGxheS50aW1lckV4ZWMgKDUwMDAsIG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCI1MDAwIik7Ci0JCX0KLQl9KTsKLQlkaXNwbGF5LnRpbWVyRXhlYyAoMjAwMCwgbmV3IFJ1bm5hYmxlICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIjIwMDAiKTsKLQkJfQotCX0pOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5NWU2Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2VsZWN0ZWQgaXRlbXMgaW4gYSB0cmVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtMCA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCWl0ZW0wLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJZm9yIChpbnQgaj0wOyBqPDQ7IGorKykgewotCQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0gKGl0ZW0wLCAwKTsKLQkJCWl0ZW0xLnNldFRleHQgKCJTdWJJdGVtICIgKyBpICsgIiAiICsgaik7Ci0JCQlmb3IgKGludCBrPTA7IGs8NDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTIgPSBuZXcgVHJlZUl0ZW0gKGl0ZW0xLCAwKTsKLQkJCQlpdGVtMi5zZXRUZXh0ICgiU3ViSXRlbSAiICsgaSArICIgIiArIGogKyAiICIgKyBrKTsKLQkJCX0JCi0JCX0KLQl9Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCVRyZWVJdGVtIFtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlUcmVlSXRlbSBbXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGVmYXVsdFNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuRXhwYW5kLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRXhwYW5kPXsiICsgZS5pdGVtICsgIn0iKTsKLQkJfQotCX0pOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5Db2xsYXBzZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkNvbGxhcHNlPXsiICsgZS5pdGVtICsgIn0iKTsKLQkJfQotCX0pOwotCXRyZWUuZ2V0SXRlbXMgKCkgWzBdLnNldEV4cGFuZGVkICh0cnVlKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWI5Njc3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogcHJpbnQgbW91c2Ugc3RhdGUgYW5kIGJ1dHRvbiAoZG93biwgbW92ZSwgdXApCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2MiB7Ci0KLXN0YXRpYyBTdHJpbmcgc3RhdGVNYXNrIChpbnQgc3RhdGVNYXNrKSB7Ci0JU3RyaW5nIHN0cmluZyA9ICIiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkNUUkwpICE9IDApIHN0cmluZyArPSAiIENUUkwiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMCkgc3RyaW5nICs9ICIgQUxUIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgc3RyaW5nICs9ICIgU0hJRlQiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkNPTU1BTkQpICE9IDApIHN0cmluZyArPSAiIENPTU1BTkQiOwotCXJldHVybiBzdHJpbmc7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIlVua25vd24iOwotCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246IHN0cmluZyA9ICJET1dOIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOiBzdHJpbmcgPSAiTU9WRSI7IGJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlVXA6IHN0cmluZyA9ICJVUCI7IGJyZWFrOwotCQkJfQotCQkJc3RyaW5nICs9IjogYnV0dG9uOiAiICsgZS5idXR0b24gKyAiLCAiOwotCQkJc3RyaW5nICs9ICJzdGF0ZU1hc2s9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyAoZS5zdGF0ZU1hc2spICsgc3RhdGVNYXNrIChlLnN0YXRlTWFzaykgKyAiLCB4PSIgKyBlLnggKyAiLCB5PSIgKyBlLnk7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjEpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjEiOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT04yKSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT04yIjsKLQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMykgIT0gMCkgc3RyaW5nICs9ICIgQlVUVE9OMyI7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjQpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjQiOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT041KSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT041IjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoc3RyaW5nKTsKLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWUxYTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBkaWFsb2cgc2hlbGwgKHByb21wdCBmb3IgYSB2YWx1ZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCWZpbmFsIGJvb2xlYW4gW10gcmVzdWx0ID0gbmV3IGJvb2xlYW4gWzFdOwotCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JZGlhbG9nLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JZmluYWwgQnV0dG9uIG9rID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0Jb2suc2V0VGV4dCAoIk9LIik7Ci0JQnV0dG9uIGNhbmNlbCA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCWNhbmNlbC5zZXRUZXh0ICgiQ2FuY2VsIik7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPW5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcmVzdWx0IFswXSA9IGV2ZW50LndpZGdldCA9PSBvazsKLQkJCWRpYWxvZy5jbG9zZSAoKTsKLQkJfQotCX07Ci0Jb2suYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQljYW5jZWwuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQlkaWFsb2cucGFjayAoKTsKLQlkaWFsb2cub3BlbiAoKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJQcm9tcHQgLi4uIik7Ci0Jd2hpbGUgKCFkaWFsb2cuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJSZXN1bHQ6ICIgKyByZXN1bHQgWzBdKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOGRiMTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2VsZWN0ZWQgaXRlbXMgaW4gYSB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0YWJsZS5zZXRCb3VuZHMgKDAsIDAsIDEwMCwgMTAwKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCVRhYmxlSXRlbSBbXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlUYWJsZUl0ZW0gW10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEZWZhdWx0U2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDU1MmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEZvcm1MYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBzaW1wbGUgZGlhbG9nIHVzaW5nIGZvcm0gbGF5b3V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULldSQVApOwotCWxhYmVsLnNldFRleHQgKCJUaGlzIGlzIGEgbG9uZyB0ZXh0IHN0cmluZyB0aGF0IHdpbGwgd3JhcCB3aGVuIHRoZSBkaWFsb2cgaXMgcmVzaXplZC4iKTsKLQlMaXN0IGxpc3QgPSBuZXcgTGlzdCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWxpc3Quc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJJdGVtIDEiLCAiSXRlbSAyIn0pOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCJPSyIpOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24yLnNldFRleHQgKCJDYW5jZWwiKTsKLQkKLQlmaW5hbCBpbnQgaW5zZXRYID0gNCwgaW5zZXRZID0gNDsKLQlGb3JtTGF5b3V0IGZvcm1MYXlvdXQgPSBuZXcgRm9ybUxheW91dCAoKTsKLQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gaW5zZXRYOwotCWZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gaW5zZXRZOwotCXNoZWxsLnNldExheW91dCAoZm9ybUxheW91dCk7Ci0JCi0JUG9pbnQgc2l6ZSA9IGxhYmVsLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCWZpbmFsIEZvcm1EYXRhIGxhYmVsRGF0YSA9IG5ldyBGb3JtRGF0YSAoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JbGFiZWxEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWxhYmVsRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhIChsYWJlbERhdGEpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJbGFiZWxEYXRhLndpZHRoID0gcmVjdC53aWR0aCAtIGluc2V0WCAqIDI7Ci0JCQlzaGVsbC5sYXlvdXQgKCk7Ci0JCX0KLQl9KTsKLQkJCi0JRm9ybURhdGEgYnV0dG9uMkRhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMkRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLWluc2V0WCk7Ci0JYnV0dG9uMkRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWJ1dHRvbjIuc2V0TGF5b3V0RGF0YSAoYnV0dG9uMkRhdGEpOwotCQotCUZvcm1EYXRhIGJ1dHRvbjFEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWJ1dHRvbjFEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50IChidXR0b24yLCAtaW5zZXRYKTsKLQlidXR0b24xRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMS5zZXRMYXlvdXREYXRhIChidXR0b24xRGF0YSk7Ci0JCi0JRm9ybURhdGEgbGlzdERhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JbGlzdERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgMCk7Ci0JbGlzdERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JbGlzdERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgaW5zZXRZKTsKLQlsaXN0RGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGJ1dHRvbjIsIC1pbnNldFkpOwotCWxpc3Quc2V0TGF5b3V0RGF0YSAobGlzdERhdGEpOwotCQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjhmODcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiBpbXBsZW1lbnQgYSBzaW1wbGUgc2NyaWJibGUgcHJvZ3JhbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJaW50IGxhc3RYID0gMCwgbGFzdFkgPSAwOwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMSkgPT0gMCkgYnJlYWs7Ci0JCQkJCUdDIGdjID0gbmV3IEdDIChzaGVsbCk7Ci0JCQkJCWdjLmRyYXdMaW5lIChsYXN0WCwgbGFzdFksIGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQlnYy5kaXNwb3NlICgpOwotCQkJCQkvL0ZBTEwgVEhST1VHSAotCQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCQkJbGFzdFggPSBldmVudC54OwotCQkJCQlsYXN0WSA9IGV2ZW50Lnk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMTRlOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGEgZHJvcCBkb3duIG1lbnUgaW4gYSB0b29sIGJhcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULk5PTkUpOwotCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JZm9yIChpbnQgaT0wOyBpPDg7IGkrKykgewotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlmaW5hbCBUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyAoKTsKLQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludCAocmVjdC54LCByZWN0LnkgKyByZWN0LmhlaWdodCk7Ci0JCQkJcHQgPSB0b29sQmFyLnRvRGlzcGxheSAocHQpOwotCQkJCW1lbnUuc2V0TG9jYXRpb24gKHB0LngsIHB0LnkpOwotCQkJCW1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl0b29sQmFyLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQltZW51LmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTJiMWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIERpc3BsYXkgZXhhbXBsZSBzbmlwcGV0OiBzdG9wIGEgcmVwZWF0aW5nIHRpbWVyIHdoZW4gYSBidXR0b24gaXMgcHJlc3NlZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCWZpbmFsIENvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJTdG9wIFRpbWVyIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRCYWNrZ3JvdW5kIChyZWQpOwotCWZpbmFsIGludCB0aW1lID0gNTAwOwotCWZpbmFsIFJ1bm5hYmxlIHRpbWVyID0gbmV3IFJ1bm5hYmxlICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCWlmIChsYWJlbC5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCQlDb2xvciBjb2xvciA9IGxhYmVsLmdldEJhY2tncm91bmQgKCkuZXF1YWxzIChyZWQpID8gYmx1ZSA6IHJlZDsKLQkJCWxhYmVsLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQkJCWRpc3BsYXkudGltZXJFeGVjICh0aW1lLCB0aGlzKTsKLQkJfQotCX07Ci0JZGlzcGxheS50aW1lckV4ZWMgKHRpbWUsIHRpbWVyKTsKLQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJZGlzcGxheS50aW1lckV4ZWMgKC0xLCB0aW1lcik7Ci0JCX0KLQl9KTsKLQlidXR0b24ucGFjayAoKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhIChuZXcgUm93RGF0YSAoYnV0dG9uLmdldFNpemUgKCkpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGJmOTk5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEZvcm1MYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBjZW50ZXIgYSBsYWJlbCBhbmQgc2luZ2xlIGxpbmUgdGV4dCB1c2luZyBhIGZvcm0gbGF5b3V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULk5PTkUgfCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRUZXh0ICgiTmFtZSIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULk5PTkUpOwotCi0JRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCAoKTsKLQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQlzaGVsbC5zZXRMYXlvdXQgKGxheW91dCk7Ci0KLQlHQyBnYyA9IG5ldyBHQyAodGV4dCk7Ci0JRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcyAoKTsKLQlpbnQgY2hhcldpZHRoID0gZm0uZ2V0QXZlcmFnZUNoYXJXaWR0aCAoKTsKLQlpbnQgd2lkdGggPSB0ZXh0LmNvbXB1dGVTaXplIChjaGFyV2lkdGggKiA4LCBTV1QuREVGQVVMVCkueDsKLQlnYy5kaXNwb3NlICgpOwotCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEgKHdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JdGV4dC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGxhYmVsLCA1KTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAobGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4MzYzZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgKGxhenkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0ICgiTGF6eSBUYWJsZSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCWZvciAoaW50IGk9MDsgaTwyMDAwMDsgaSsrKSB7Ci0JCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQlmaW5hbCBpbnQgW10gaW5kZXggPSBuZXcgaW50IFtdIHtpfTsKLQkJCQlkaXNwbGF5LnN5bmNFeGVjIChuZXcgUnVubmFibGUgKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCQkJCWl0ZW0uc2V0VGV4dCAoIlRhYmxlIEl0ZW0gIiArIGluZGV4IFswXSk7Ci0JCQkJCQlpdGVtLnNldEltYWdlIChpbWFnZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX07Ci0JdGhyZWFkLnN0YXJ0ICgpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzI3NzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYW4gaWNvbiAoaW4gbWVtb3J5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQkKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKHJlZCk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoNSwgNSwgMTAsIDEwKTsKLQlnYy5kaXNwb3NlICgpOwotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEgKCk7Ci0JCi0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAoCi0JCW5ldyBSR0IgW10gewotCQkJbmV3IFJHQiAoMCwgMCwgMCksCi0JCQluZXcgUkdCICgweEZGLCAweEZGLCAweEZGKSwKLQkJfSk7Ci0JSW1hZ2VEYXRhIG1hc2tEYXRhID0gbmV3IEltYWdlRGF0YSAoMjAsIDIwLCAxLCBwYWxldHRlKTsKLQlJbWFnZSBtYXNrID0gbmV3IEltYWdlIChkaXNwbGF5LCBtYXNrRGF0YSk7Ci0JZ2MgPSBuZXcgR0MgKG1hc2spOwotCWdjLnNldEJhY2tncm91bmQgKGJsYWNrKTsKLQlnYy5maWxsUmVjdGFuZ2xlICgwLCAwLCAyMCwgMjApOwotCWdjLnNldEJhY2tncm91bmQgKHdoaXRlKTsKLQlnYy5maWxsUmVjdGFuZ2xlICg1LCA1LCAxMCwgMTApOwotCWdjLmRpc3Bvc2UgKCk7Ci0JbWFza0RhdGEgPSBtYXNrLmdldEltYWdlRGF0YSAoKTsKLQkKLQlJbWFnZSBpY29uID0gbmV3IEltYWdlIChkaXNwbGF5LCBpbWFnZURhdGEsIG1hc2tEYXRhKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldEltYWdlIChpY29uKTsKLQlidXR0b24uc2V0U2l6ZSAoNjAsIDYwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpY29uLmRpc3Bvc2UgKCk7Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQltYXNrLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMGQ0ZmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRm9ybUxheW91dCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNpbXBsZSBPSy9DQU5DRUwgZGlhbG9nIHVzaW5nIGZvcm0gbGF5b3V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0pOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChkaWFsb2csIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiRXhpdCB0aGUgYXBwbGljYXRpb24/Iik7Ci0JQnV0dG9uIG9rQnV0dG9uID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0Jb2tCdXR0b24uc2V0VGV4dCAoIiZPSyIpOwotCUJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQljYW5jZWxCdXR0b24uc2V0VGV4dCAoIiZDYW5jZWwiKTsKLQkKLQlGb3JtTGF5b3V0IGZvcm0gPSBuZXcgRm9ybUxheW91dCAoKTsKLQlmb3JtLm1hcmdpbldpZHRoID0gZm9ybS5tYXJnaW5IZWlnaHQgPSA4OwotCWRpYWxvZy5zZXRMYXlvdXQgKGZvcm0pOwotCUZvcm1EYXRhIG9rRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlva0RhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgOCk7Ci0Jb2tCdXR0b24uc2V0TGF5b3V0RGF0YSAob2tEYXRhKTsKLQlGb3JtRGF0YSBjYW5jZWxEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWNhbmNlbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAob2tCdXR0b24sIDgpOwotCWNhbmNlbERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChva0J1dHRvbiwgMCwgU1dULlRPUCk7Ci0JY2FuY2VsQnV0dG9uLnNldExheW91dERhdGEgKGNhbmNlbERhdGEpOwotCQotCWRpYWxvZy5zZXREZWZhdWx0QnV0dG9uIChva0J1dHRvbik7Ci0JZGlhbG9nLnBhY2sgKCk7Ci0JZGlhbG9nLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWQwZTU1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEZpbGVEaWFsb2cgZXhhbXBsZSBzbmlwcGV0OiBwcm9tcHQgZm9yIGEgZmlsZSBuYW1lICh0byBzYXZlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyAoc2hlbGwsIFNXVC5TQVZFKTsKLQlTdHJpbmcgW10gZmlsdGVyTmFtZXMgPSBuZXcgU3RyaW5nIFtdIHsiSW1hZ2UgRmlsZXMiLCAiQWxsIEZpbGVzICgqKSJ9OwotCVN0cmluZyBbXSBmaWx0ZXJFeHRlbnNpb25zID0gbmV3IFN0cmluZyBbXSB7IiouZ2lmOyoucG5nOyoueHBtOyouanBnOyouanBlZzsqLnRpZmYiLCAiKiJ9OwotCVN0cmluZyBmaWx0ZXJQYXRoID0gIi8iOwotCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCWlmIChwbGF0Zm9ybS5lcXVhbHMoIndpbjMyIikgfHwgcGxhdGZvcm0uZXF1YWxzKCJ3cGYiKSkgewotCQlmaWx0ZXJOYW1lcyA9IG5ldyBTdHJpbmcgW10geyJJbWFnZSBGaWxlcyIsICJBbGwgRmlsZXMgKCouKikifTsKLQkJZmlsdGVyRXh0ZW5zaW9ucyA9IG5ldyBTdHJpbmcgW10geyIqLmdpZjsqLnBuZzsqLmJtcDsqLmpwZzsqLmpwZWc7Ki50aWZmIiwgIiouKiJ9OwotCQlmaWx0ZXJQYXRoID0gImM6XFwiOwotCX0KLQlkaWFsb2cuc2V0RmlsdGVyTmFtZXMgKGZpbHRlck5hbWVzKTsKLQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyAoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0JZGlhbG9nLnNldEZpbHRlclBhdGggKGZpbHRlclBhdGgpOwotCWRpYWxvZy5zZXRGaWxlTmFtZSAoIm15ZmlsZSIpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNhdmUgdG86ICIgKyBkaWFsb2cub3BlbiAoKSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQ4NTVjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBlbmFibGUgbWVudSBpdGVtcyBkeW5hbWljYWxseSAod2hlbiBtZW51IHNob3duKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDczIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQl0cmVlLnNldE1lbnUgKG1lbnUpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCXRyZWVJdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJbWVudUl0ZW0uc2V0VGV4dCAodHJlZUl0ZW0uZ2V0VGV4dCAoKSk7Ci0JfQotCW1lbnUuYWRkTGlzdGVuZXIgKFNXVC5TaG93LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCU1lbnVJdGVtIFtdIG1lbnVJdGVtcyA9IG1lbnUuZ2V0SXRlbXMgKCk7Ci0JCQlUcmVlSXRlbSBbXSB0cmVlSXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxtZW51SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG1lbnVJdGVtcyBbaV0uZ2V0VGV4dCAoKTsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCXdoaWxlIChpbmRleDx0cmVlSXRlbXMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0cmVlSXRlbXMgW2luZGV4XS5nZXRUZXh0ICgpLmVxdWFscyAodGV4dCkpIGJyZWFrOwotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCQltZW51SXRlbXMgW2ldLnNldEVuYWJsZWQgKGluZGV4ICE9IHRyZWVJdGVtcy5sZW5ndGgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JdHJlZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThiZGIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENhcmV0IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY2FyZXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlDYXJldCBjYXJldCA9IG5ldyBDYXJldCAoc2hlbGwsIFNXVC5OT05FKTsKLQljYXJldC5zZXRCb3VuZHMgKDEwLCAxMCwgMiwgMzIpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI3OWNlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIHRhYiB0cmF2ZXJzYWwgb3JkZXIgb2YgY2hpbGRyZW4KLSAqIEluIHRoaXMgZXhhbXBsZSwgY29tcG9zaXRlMSAoaS5lLiBjMSkgdGFiIG9yZGVyIGlzIHNldCB0bzogQjIsIEIxLCBCMywgYW5kCi0gKiBzaGVsbCB0YWIgb3JkZXIgaXMgc2V0IHRvOiBjMSwgQjcsIHRvb2xCYXIxLCAoYzQ6IG5vIGZvY3VzYWJsZSBjaGlsZHJlbiksIGMyLCBMMgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCQotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljMS5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBiMSA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjEuc2V0VGV4dCAoIkImMSIpOwotCUJ1dHRvbiByMSA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCXIxLnNldFRleHQgKCJSMSIpOwotCUJ1dHRvbiByMiA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCXIyLnNldFRleHQgKCJSJjIiKTsKLQlCdXR0b24gcjMgPSBuZXcgQnV0dG9uIChjMSwgU1dULlJBRElPKTsKLQlyMy5zZXRUZXh0ICgiUjMiKTsKLQlCdXR0b24gYjIgPSBuZXcgQnV0dG9uIChjMSwgU1dULlBVU0gpOwotCWIyLnNldFRleHQgKCJCMiIpOwotCUxpc3QgbDEgPSBuZXcgTGlzdCAoYzEsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQlsMS5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkwxIn0pOwotCUJ1dHRvbiBiMyA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjMuc2V0VGV4dCAoIkImMyIpOwotCUJ1dHRvbiBiNCA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjQuc2V0VGV4dCAoIkImNCIpOwotCQotCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljMi5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBiNSA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUFVTSCk7Ci0JYjUuc2V0VGV4dCAoIkImNSIpOwotCUJ1dHRvbiBiNiA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUFVTSCk7Ci0JYjYuc2V0VGV4dCAoIkImNiIpOwotCQotCUxpc3QgbDIgPSBuZXcgTGlzdCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQlsMi5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkwyIn0pOwotCQotCVRvb2xCYXIgdGIxID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIpOwotCVRvb2xJdGVtIGkxID0gbmV3IFRvb2xJdGVtICh0YjEsIFNXVC5SQURJTyk7Ci0JaTEuc2V0VGV4dCAoIkkxIik7Ci0JVG9vbEl0ZW0gaTIgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULlJBRElPKTsKLQlpMi5zZXRUZXh0ICgiSTIiKTsKLQlDb21ibyBjb21ibzEgPSBuZXcgQ29tYm8gKHRiMSwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCWNvbWJvMS5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkMxIn0pOwotCWNvbWJvMS5zZXRUZXh0ICgiQzEiKTsKLQljb21ibzEucGFjayAoKTsKLQlUb29sSXRlbSBpMyA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuU0VQQVJBVE9SKTsKLQlpMy5zZXRXaWR0aCAoY29tYm8xLmdldFNpemUgKCkueCk7Ci0JaTMuc2V0Q29udHJvbCAoY29tYm8xKTsKLQlUb29sSXRlbSBpNCA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuUFVTSCk7Ci0JaTQuc2V0VGV4dCAoIkkmNCIpOwotCVRvb2xJdGVtIGk1ID0gbmV3IFRvb2xJdGVtICh0YjEsIFNXVC5DSEVDSyk7Ci0JaTUuc2V0VGV4dCAoIkk1Iik7Ci0JCi0JQnV0dG9uIGI3ID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQliNy5zZXRUZXh0ICgiQiY3Iik7Ci0JCi0JQ29tcG9zaXRlIGM0ID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCUNvbXBvc2l0ZSBjNSA9IG5ldyBDb21wb3NpdGUgKGM0LCBTV1QuQk9SREVSKTsKLQljNS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbmV3IExhYmVsKGM1LCBTV1QuTk9ORSkuc2V0VGV4dCgiTm8iKTsKLQljNS5wYWNrKCk7Ci0KLQlDb250cm9sIFtdIHRhYkxpc3QxID0gbmV3IENvbnRyb2wgW10ge2IyLCBiMSwgYjN9OwotCWMxLnNldFRhYkxpc3QgKHRhYkxpc3QxKTsKLQlDb250cm9sIFtdIHRhYkxpc3QyID0gbmV3IENvbnRyb2wgW10ge2MxLCBiNywgdGIxLCBjNCwgYzIsIGwyfTsKLQlzaGVsbC5zZXRUYWJMaXN0ICh0YWJMaXN0Mik7Ci0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE3ODNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYkZvbGRlciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYiBmb2xkZXIgKHNpeCBwYWdlcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUYWJGb2xkZXIgdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTw2OyBpKyspIHsKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0gKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJUYWJJdGVtICIgKyBpKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHRhYkZvbGRlciwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCAoIlBhZ2UgIiArIGkpOwotCQlpdGVtLnNldENvbnRyb2wgKGJ1dHRvbik7Ci0JfQotCXRhYkZvbGRlci5wYWNrICgpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjI3NmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiByZXNpemUgY29sdW1ucyBhcyB0YWJsZSByZXNpemVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JZmluYWwgQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0VGV4dCgiQ29sdW1uIDEiKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Iml0ZW0gMCIgKyBpLCAiaXRlbSAxIitpfSk7Ci0JfQotCWNvbXAuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSBhcmVhID0gY29tcC5nZXRDbGllbnRBcmVhKCk7Ci0JCQlQb2ludCBzaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCVNjcm9sbEJhciB2QmFyID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKTsKLQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSB0YWJsZS5jb21wdXRlVHJpbSgwLDAsMCwwKS53aWR0aCAtIHZCYXIuZ2V0U2l6ZSgpLng7Ci0JCQlpZiAoc2l6ZS55ID4gYXJlYS5oZWlnaHQgKyB0YWJsZS5nZXRIZWFkZXJIZWlnaHQoKSkgewotCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0JCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCVBvaW50IHZCYXJTaXplID0gdkJhci5nZXRTaXplKCk7Ci0JCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCX0KLQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQlpZiAob2xkU2l6ZS54ID4gYXJlYS53aWR0aCkgewotCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zIAotCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGgvMyk7Ci0JCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAtIGNvbHVtbjEuZ2V0V2lkdGgoKSk7Ci0JCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlIAotCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aC8zKTsKLQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC0gY29sdW1uMS5nZXRXaWR0aCgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQkKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MWRhOTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRyYWcgdGV4dCBiZXR3ZWVuIHR3byBsYWJlbHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDc4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbDEuc2V0VGV4dCAoIlRFWFQiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlzZXREcmFnRHJvcCAobGFiZWwxKTsKLQlzZXREcmFnRHJvcCAobGFiZWwyKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotcHVibGljIHN0YXRpYyB2b2lkIHNldERyYWdEcm9wIChmaW5hbCBMYWJlbCBsYWJlbCkgewotCQotCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9OwotCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCQotCWZpbmFsIERyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UgKGxhYmVsLCBvcGVyYXRpb25zKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIodHlwZXMpOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIgKG5ldyBEcmFnU291cmNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kb2l0ID0gKGxhYmVsLmdldFRleHQgKCkubGVuZ3RoICgpICE9IDApOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhIChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRhdGEgPSBsYWJlbC5nZXRUZXh0ICgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkKLQkJCQlsYWJlbC5zZXRUZXh0ICgiIik7Ci0JCX0KLQl9KTsKLQotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQobGFiZWwsIG9wZXJhdGlvbnMpOwotCXRhcmdldC5zZXRUcmFuc2Zlcih0eXBlcyk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lciAobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgPT0gbnVsbCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbGFiZWwuc2V0VGV4dCAoKFN0cmluZykgZXZlbnQuZGF0YSk7Ci0JCX0KLQl9KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NWQzNWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkZWZpbmUgbXkgb3duIGRhdGEgdHJhbnNmZXIgdHlwZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3OSB7Ci0KLS8qIFRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkIGlzIGFuIDxib2xkPmFycmF5IG9mIHR5cGUgTXlUeXBlPC9ib2xkPiB3aGVyZSBNeVR5cGUgaXMgZGVmaW5lIGFzOiAqLwotc3RhdGljIGNsYXNzIE15VHlwZSB7Ci0JU3RyaW5nIGZpbGVOYW1lOwotCWxvbmcgZmlsZUxlbmd0aDsKLQlsb25nIGxhc3RNb2RpZmllZDsKLX0KLQotc3RhdGljIGNsYXNzIE15VHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlUWVBFTkFNRSA9ICJuYW1lX2Zvcl9teV90eXBlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVlUWVBFSUQgPSByZWdpc3RlclR5cGUgKE1ZVFlQRU5BTUUpOwotCXByaXZhdGUgc3RhdGljIE15VHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHJhbnNmZXIgKCk7Ci0KLXB1YmxpYyBzdGF0aWMgTXlUcmFuc2ZlciBnZXRJbnN0YW5jZSAoKSB7Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLX0KLQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JaWYgKCFjaGVja015VHlwZShvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUgKHRyYW5zZmVyRGF0YSkpIHsKLQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCX0KLQlNeVR5cGUgW10gbXlUeXBlcyA9IChNeVR5cGUgW10pIG9iamVjdDsKLQl0cnkgewotCQkvLyB3cml0ZSBkYXRhIHRvIGEgYnl0ZSBhcnJheSBhbmQgdGhlbiBhc2sgc3VwZXIgdG8gY29udmVydCB0byBwTWVkaXVtCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtICgpOwotCQlEYXRhT3V0cHV0U3RyZWFtIHdyaXRlT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0gKG91dCk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBteVR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlieXRlIFtdIGJ1ZmZlciA9IG15VHlwZXMgW2ldLmZpbGVOYW1lLmdldEJ5dGVzICgpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQgKGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUgKGJ1ZmZlcik7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcgKG15VHlwZXMgW2ldLmZpbGVMZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nIChteVR5cGVzIFtpXS5sYXN0TW9kaWZpZWQpOwotCQl9Ci0JCWJ5dGUgW10gYnVmZmVyID0gb3V0LnRvQnl0ZUFycmF5ICgpOwotCQl3cml0ZU91dC5jbG9zZSAoKTsKLQkJc3VwZXIuamF2YVRvTmF0aXZlIChidWZmZXIsIHRyYW5zZmVyRGF0YSk7Ci0JfQotCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotfQotCi1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YSAoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCWlmIChpc1N1cHBvcnRlZFR5cGUgKHRyYW5zZmVyRGF0YSkpIHsKLQkJYnl0ZSBbXSBidWZmZXIgPSAoYnl0ZSBbXSkgc3VwZXIubmF0aXZlVG9KYXZhICh0cmFuc2ZlckRhdGEpOwotCQlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiBudWxsOwotCi0JCU15VHlwZSBbXSBteURhdGEgPSBuZXcgTXlUeXBlIFswXTsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtIChidWZmZXIpOwotCQkJRGF0YUlucHV0U3RyZWFtIHJlYWRJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0gKGluKTsKLQkJCXdoaWxlIChyZWFkSW4uYXZhaWxhYmxlICgpID4gMjApIHsKLQkJCQlNeVR5cGUgZGF0dW0gPSBuZXcgTXlUeXBlICgpOwotCQkJCWludCBzaXplID0gcmVhZEluLnJlYWRJbnQgKCk7Ci0JCQkJYnl0ZSBbXSBuYW1lID0gbmV3IGJ5dGUgW3NpemVdOwotCQkJCXJlYWRJbi5yZWFkIChuYW1lKTsKLQkJCQlkYXR1bS5maWxlTmFtZSA9IG5ldyBTdHJpbmcgKG5hbWUpOwotCQkJCWRhdHVtLmZpbGVMZW5ndGggPSByZWFkSW4ucmVhZExvbmcgKCk7Ci0JCQkJZGF0dW0ubGFzdE1vZGlmaWVkID0gcmVhZEluLnJlYWRMb25nICgpOwotCQkJCU15VHlwZSBbXSBuZXdNeURhdGEgPSBuZXcgTXlUeXBlIFtteURhdGEubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weSAobXlEYXRhLCAwLCBuZXdNeURhdGEsIDAsIG15RGF0YS5sZW5ndGgpOwotCQkJCW5ld015RGF0YSBbbXlEYXRhLmxlbmd0aF0gPSBkYXR1bTsKLQkJCQlteURhdGEgPSBuZXdNeURhdGE7Ci0JCQl9Ci0JCQlyZWFkSW4uY2xvc2UgKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbXlEYXRhOwotCX0KLQotCXJldHVybiBudWxsOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIFtdIGdldFR5cGVOYW1lcyAoKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmcgW10ge01ZVFlQRU5BTUV9OwotfQotCi1wcm90ZWN0ZWQgaW50IFtdIGdldFR5cGVJZHMgKCkgewotCXJldHVybiBuZXcgaW50IFtdIHtNWVRZUEVJRH07Ci19Ci0KLWJvb2xlYW4gY2hlY2tNeVR5cGUoT2JqZWN0IG9iamVjdCkgewotCWlmIChvYmplY3QgPT0gbnVsbCB8fCAKLQkJIShvYmplY3QgaW5zdGFuY2VvZiBNeVR5cGVbXSkgfHwgCi0JCSgoTXlUeXBlW10pb2JqZWN0KS5sZW5ndGggPT0gMCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCU15VHlwZVtdIG15VHlwZXMgPSAoTXlUeXBlW10pb2JqZWN0OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbXlUeXBlcy5sZW5ndGg7IGkrKykgewotCQlpZiAobXlUeXBlc1tpXSA9PSBudWxsIHx8IAotCQkJbXlUeXBlc1tpXS5maWxlTmFtZSA9PSBudWxsIHx8IAotCQkJbXlUeXBlc1tpXS5maWxlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQlyZXR1cm4gY2hlY2tNeVR5cGUob2JqZWN0KTsKLX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIExhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwxLnNldFRleHQgKCJEcmFnIFNvdXJjZSBmb3IgTXlEYXRhW10iKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxhYmVsMi5zZXRUZXh0ICgiRHJvcCBUYXJnZXQgZm9yIE15RGF0YVtdIik7Ci0KLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlIChsYWJlbDEsIERORC5EUk9QX0NPUFkpOwotCXNvdXJjZS5zZXRUcmFuc2ZlciAobmV3IFRyYW5zZmVyIFtdIHtNeVRyYW5zZmVyLmdldEluc3RhbmNlICgpfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lciAobmV3IERyYWdTb3VyY2VBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEgKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJTXlUeXBlIG15VHlwZTEgPSBuZXcgTXlUeXBlICgpOwotCQkJbXlUeXBlMS5maWxlTmFtZSA9ICJDOlxcYWJjLnR4dCI7Ci0JCQlteVR5cGUxLmZpbGVMZW5ndGggPSAxMDAwOwotCQkJbXlUeXBlMS5sYXN0TW9kaWZpZWQgPSAxMjMxMjMxMzsKLQkJCU15VHlwZSBteVR5cGUyID0gbmV3IE15VHlwZSAoKTsKLQkJCW15VHlwZTIuZmlsZU5hbWUgPSAiQzpcXHh5ei50eHQiOwotCQkJbXlUeXBlMi5maWxlTGVuZ3RoID0gNTAwOwotCQkJbXlUeXBlMi5sYXN0TW9kaWZpZWQgPSAxMjMxMjMyMzsKLQkJCWV2ZW50LmRhdGEgPSBuZXcgTXlUeXBlIFtdIHtteVR5cGUxLCBteVR5cGUyfTsKLQkJfQotCX0pOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQgKGxhYmVsMiwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQpOwotCXRhcmdldC5zZXRUcmFuc2ZlciAobmV3IFRyYW5zZmVyIFtdIHtNeVRyYW5zZmVyLmdldEluc3RhbmNlICgpfSk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lciAobmV3IERyb3BUYXJnZXRBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyIChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZCAoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJvcCAoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSAhPSBudWxsKSB7Ci0JCQkJTXlUeXBlIFtdIG15VHlwZXMgPSAoTXlUeXBlIFtdKSBldmVudC5kYXRhOwotCQkJCWlmIChteVR5cGVzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG15VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXN0cmluZyArPSBteVR5cGVzIFtpXS5maWxlTmFtZSArICIgIjsKLQkJCQkJfQotCQkJCQlsYWJlbDIuc2V0VGV4dCAoc3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTJiNzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRyZWUgKGxhenkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDggewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKCJMYXp5IFRyZWUiKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCUZpbGUgW10gcm9vdHMgPSBGaWxlLmxpc3RSb290cyAoKTsKLQlmb3IgKGludCBpPTA7IGk8cm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJVHJlZUl0ZW0gcm9vdCA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCXJvb3Quc2V0VGV4dCAocm9vdHMgW2ldLnRvU3RyaW5nICgpKTsKLQkJcm9vdC5zZXREYXRhIChyb290cyBbaV0pOwotCQluZXcgVHJlZUl0ZW0gKHJvb3QsIDApOwotCX0KLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuRXhwYW5kLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoZmluYWwgRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIFRyZWVJdGVtIHJvb3QgPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQlUcmVlSXRlbSBbXSBpdGVtcyA9IHJvb3QuZ2V0SXRlbXMgKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGl0ZW1zIFtpXS5nZXREYXRhICgpICE9IG51bGwpIHJldHVybjsKLQkJCQlpdGVtcyBbaV0uZGlzcG9zZSAoKTsKLQkJCX0KLQkJCUZpbGUgZmlsZSA9IChGaWxlKSByb290LmdldERhdGEgKCk7Ci0JCQlGaWxlIFtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMgKCk7Ci0JCQlpZiAoZmlsZXMgPT0gbnVsbCkgcmV0dXJuOwotCQkJZm9yIChpbnQgaT0gMDsgaTxmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHJvb3QsIDApOwotCQkJCWl0ZW0uc2V0VGV4dCAoZmlsZXMgW2ldLmdldE5hbWUgKCkpOwotCQkJCWl0ZW0uc2V0RGF0YSAoZmlsZXMgW2ldKTsKLQkJCQlpZiAoZmlsZXMgW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJbmV3IFRyZWVJdGVtIChpdGVtLCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlQb2ludCBzaXplID0gdHJlZS5jb21wdXRlU2l6ZSAoMzAwLCBTV1QuREVGQVVMVCk7Ci0JaW50IHdpZHRoID0gTWF0aC5tYXggKDMwMCwgc2l6ZS54KTsKLQlpbnQgaGVpZ2h0ID0gTWF0aC5tYXggKDMwMCwgc2l6ZS55KTsKLQlzaGVsbC5zZXRTaXplIChzaGVsbC5jb21wdXRlU2l6ZSAod2lkdGgsIGhlaWdodCkpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDU1ODIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGxpbWl0IHNlbGVjdGlvbiB0byBpdGVtcyB0aGF0IG1hdGNoIGEgcGF0dGVybgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODAgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJpdGVtICIgKyBpKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKLQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJc3ViSXRlbS5zZXRUZXh0KCJpdGVtICIgKyBqKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgMjsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gc3Vic3ViSXRlbSA9IG5ldyBUcmVlSXRlbShzdWJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KCJpdGVtICIgKyBrKTsKLQkJCX0KLQkJfQotCX0KLQkKLQl0cmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlUcmVlSXRlbVtdIHJldmlzZWRTZWxlY3Rpb24gPSBuZXcgVHJlZUl0ZW1bMF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyB0ZXh0ID0gc2VsZWN0aW9uW2ldLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dC5pbmRleE9mKCIxIikgPiAwKSB7Ci0JCQkJCVRyZWVJdGVtW10gbmV3U2VsZWN0aW9uID0gbmV3IFRyZWVJdGVtW3JldmlzZWRTZWxlY3Rpb24ubGVuZ3RoICsgMV07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkocmV2aXNlZFNlbGVjdGlvbiwgMCwgbmV3U2VsZWN0aW9uLCAwLCByZXZpc2VkU2VsZWN0aW9uLmxlbmd0aCk7Ci0JCQkJCW5ld1NlbGVjdGlvbltyZXZpc2VkU2VsZWN0aW9uLmxlbmd0aF0gPSBzZWxlY3Rpb25baV07Ci0JCQkJCXJldmlzZWRTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JCQkJfQotCQkJfQotCQkJdHJlZS5zZXRTZWxlY3Rpb24ocmV2aXNlZFNlbGVjdGlvbik7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxYWFhZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE9MRSBhbmQgQWN0aXZlWCBleGFtcGxlIHNuaXBwZXQ6IGJyb3dzZSB0aGUgdHlwZWxpYmluZm8gZm9yIGEgcHJvZ3JhbSBpZCAod2luMzIgb25seSkKLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCi0JaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YSBNYWluIDxwcm9ncmFtIGlkPiIpOwotCQlyZXR1cm47Ci0JfQotCi0JU3RyaW5nIHByb2dJRCA9IGFyZ3NbMF07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQotCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JT2xlQ29udHJvbFNpdGUgc2l0ZSA9IG51bGw7Ci0JT2xlQXV0b21hdGlvbiBhdXRvID0gbnVsbDsKLQl0cnkgewotCQlzaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKGZyYW1lLCBTV1QuTk9ORSwgcHJvZ0lEKTsJCi0JCWF1dG8gPSBuZXcgT2xlQXV0b21hdGlvbihzaXRlKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiB0eXBlIGxpYnJhcnkgZm9yICIrcHJvZ0lEKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybjsKLQl9Ci0JCQotCXByaW50VHlwZUluZm8oYXV0byk7Ci0JCi0JYXV0by5kaXNwb3NlKCk7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCi19Ci0KLXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRUeXBlSW5mbyhPbGVBdXRvbWF0aW9uIGF1dG8pIHsKLQlUWVBFQVRUUiB0eXBlYXR0ciA9IGF1dG8uZ2V0VHlwZUluZm9BdHRyaWJ1dGVzKCk7Ci0JaWYgKHR5cGVhdHRyICE9IG51bGwpIHsJCQotCQlpZiAodHlwZWF0dHIuY0Z1bmNzID4gMCkgU3lzdGVtLm91dC5wcmludGxuKCJGdW5jdGlvbnMgOlxuIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZWF0dHIuY0Z1bmNzOyBpKyspIHsJCQkKLQkJCU9sZUZ1bmN0aW9uRGVzY3JpcHRpb24gZGF0YSA9IGF1dG8uZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbihpKTsKLQkJCVN0cmluZyBhcmdMaXN0ID0gIiI7Ci0JCQlpbnQgZmlyc3RPcHRpb25hbEFyZ0luZGV4ID0gZGF0YS5hcmdzLmxlbmd0aCAtIGRhdGEub3B0aW9uYWxBcmdDb3VudDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5hcmdzLmxlbmd0aDsgaisrKSB7Ci0JCQkJYXJnTGlzdCArPSAiWyI7Ci0JCQkJaWYgKGogPj0gZmlyc3RPcHRpb25hbEFyZ0luZGV4KSBhcmdMaXN0ICs9ICJvcHRpb25hbCwgIjsKLQkJCQlhcmdMaXN0ICs9IGdldERpcmVjdGlvbihkYXRhLmFyZ3Nbal0uZmxhZ3MpKyJdICIrZ2V0VHlwZU5hbWUoZGF0YS5hcmdzW2pdLnR5cGUpKyIgIitkYXRhLmFyZ3Nbal0ubmFtZTsKLQkJCQlpZiAoIGogPCBkYXRhLmFyZ3MubGVuZ3RoIC0gMSkgYXJnTGlzdCArPSAiLCAiOwotCQkJfQkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldEludm9rZUtpbmQoZGF0YS5pbnZva2VLaW5kKSsiIChpZCA9ICIrZGF0YS5pZCsiKSA6ICIKLQkJCQkJICAgICAgICArIlxuXHRTaWduYXR1cmUgICA6ICIrZ2V0VHlwZU5hbWUoZGF0YS5yZXR1cm5UeXBlKSsiICIrZGF0YS5uYW1lKyIoIithcmdMaXN0KyIpIgotCQkJICAgICAgICAgICAgICAgICAgICArIlxuXHREZXNjcmlwdGlvbiA6ICIrZGF0YS5kb2N1bWVudGF0aW9uCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdEhlbHAgRmlsZSAgIDogIitkYXRhLmhlbHBGaWxlKyJcbiIpOwotCQl9Ci0JCQotCQlpZiAodHlwZWF0dHIuY1ZhcnMgPiAwKSBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5WYXJpYWJsZXMgIDpcbiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVhdHRyLmNWYXJzOyBpKyspIHsKLQkJCU9sZVByb3BlcnR5RGVzY3JpcHRpb24gZGF0YSA9IGF1dG8uZ2V0UHJvcGVydHlEZXNjcmlwdGlvbihpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUFJPUEVSVFkgKGlkID0gIitkYXRhLmlkKyIpIDoiCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdE5hbWUgOiAiK2RhdGEubmFtZQotCQkJICAgICAgICAgICAgICAgICAgICArIlxuXHRUeXBlIDogIitnZXRUeXBlTmFtZShkYXRhLnR5cGUpKyJcbiIpOwotCQl9Ci0JfQotfQotcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKGludCB0eXBlKSB7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgT0xFLlZUX0JPT0wgOiByZXR1cm4gImJvb2xlYW4iOwotCQljYXNlIE9MRS5WVF9SNCA6IHJldHVybiAiZmxvYXQiOwotCQljYXNlIE9MRS5WVF9SOCA6IHJldHVybiAiZG91YmxlIjsKLQkJY2FzZSBPTEUuVlRfSTQgOiByZXR1cm4gImludCI7Ci0JCWNhc2UgT0xFLlZUX0RJU1BBVENIIDogcmV0dXJuICJJRGlzcGF0Y2giOwotCQljYXNlIE9MRS5WVF9VTktOT1dOIDogcmV0dXJuICJJVW5rbm93biI7Ci0JCWNhc2UgT0xFLlZUX0kyIDogcmV0dXJuICJzaG9ydCI7Ci0JCWNhc2UgT0xFLlZUX0JTVFIgOiByZXR1cm4gIlN0cmluZyI7Ci0JCWNhc2UgT0xFLlZUX1ZBUklBTlQgOiByZXR1cm4gIlZhcmlhbnQiOwotCQljYXNlIE9MRS5WVF9DWSA6IHJldHVybiAiQ3VycmVuY3kiOwotCQljYXNlIE9MRS5WVF9EQVRFIDogcmV0dXJuICJEYXRlIjsKLQkJY2FzZSBPTEUuVlRfVUkxIDogcmV0dXJuICJ1bnNpZ25lZCBjaGFyIjsKLQkJY2FzZSBPTEUuVlRfVUk0IDogcmV0dXJuICJ1bnNpZ25lZCBpbnQiOwotCQljYXNlIE9MRS5WVF9VU0VSREVGSU5FRCA6IHJldHVybiAiVXNlckRlZmluZWQiOwotCQljYXNlIE9MRS5WVF9IUkVTVUxUIDogcmV0dXJuICJpbnQiOwotCQljYXNlIE9MRS5WVF9WT0lEIDogcmV0dXJuICJ2b2lkIjsKLQkJCi0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0JPT0wgOiByZXR1cm4gImJvb2xlYW4gKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1I0IDogcmV0dXJuICJmbG9hdCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfUjggOiByZXR1cm4gImRvdWJsZSAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfSTQgOiByZXR1cm4gImludCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfRElTUEFUQ0ggOiByZXR1cm4gIklEaXNwYXRjaCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVU5LTk9XTiA6IHJldHVybiAiSVVua25vd24gKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0kyIDogcmV0dXJuICJzaG9ydCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfQlNUUiA6IHJldHVybiAiU3RyaW5nICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9WQVJJQU5UIDogcmV0dXJuICJWYXJpYW50ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9DWSA6IHJldHVybiAiQ3VycmVuY3kgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0RBVEUgOiByZXR1cm4gIkRhdGUgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1VJMSA6IHJldHVybiAidW5zaWduZWQgY2hhciAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVUk0IDogcmV0dXJuICJ1bnNpZ25lZCBpbnQgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1VTRVJERUZJTkVEIDogcmV0dXJuICJVc2VyRGVmaW5lZCAqIjsKLQl9Ci0JcmV0dXJuICJ1bmtub3duICIrIHR5cGU7CQotfQotcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERpcmVjdGlvbihpbnQgZGlyZWN0aW9uKXsKLQlTdHJpbmcgZGlyU3RyaW5nID0gIiI7Ci0JYm9vbGVhbiBjb21tYSA9IGZhbHNlOwotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRklOKSAhPSAwKSB7Ci0JCWRpclN0cmluZyArPSAiaW4iOwotCQljb21tYSA9IHRydWU7Ci0JfQotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRk9VVCkgIT0gMCl7Ci0JCWlmIChjb21tYSkgZGlyU3RyaW5nICs9ICIsICI7Ci0JCWRpclN0cmluZyArPSAib3V0IjsKLQkJY29tbWEgPSB0cnVlOwotCX0KLQlpZiAoKGRpcmVjdGlvbiAmIE9MRS5JRExGTEFHX0ZMQ0lEKSAhPSAwKXsKLQkJaWYgKGNvbW1hKSBkaXJTdHJpbmcgKz0gIiwgIjsKLQkJZGlyU3RyaW5nICs9ICJsY2lkIjsKLQkJY29tbWEgPSB0cnVlOwotCX0KLQlpZiAoKGRpcmVjdGlvbiAmIE9MRS5JRExGTEFHX0ZSRVRWQUwpICE9IDApewotCQlpZiAoY29tbWEpIGRpclN0cmluZyArPSAiLCAiOyAKLQkJZGlyU3RyaW5nICs9ICJyZXR2YWwiOwotCX0KLQkKLQlyZXR1cm4gZGlyU3RyaW5nOwotfQotcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEludm9rZUtpbmQoaW50IGludktpbmQpIHsKLQlzd2l0Y2ggKGludktpbmQpIHsKLQkJY2FzZSBPTEUuSU5WT0tFX0ZVTkMgOiByZXR1cm4gIk1FVEhPRCI7Ci0JCWNhc2UgT0xFLklOVk9LRV9QUk9QRVJUWUdFVCA6IHJldHVybiAiUFJPUEVSVFkgR0VUIjsKLQkJY2FzZSBPTEUuSU5WT0tFX1BST1BFUlRZUFVUIDogcmV0dXJuICJQUk9QRVJUWSBQVVQiOwotCQljYXNlIE9MRS5JTlZPS0VfUFJPUEVSVFlQVVRSRUYgOiByZXR1cm4gIlBST1BFUlRZIFBVVCBCWSBSRUYiOwotCX0KLQlyZXR1cm4gInVua25vd24gIitpbnZLaW5kOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkNzIzMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ1RhYkZvbGRlciBleGFtcGxlIHNuaXBwZXQ6IHByZXZlbnQgYW4gaXRlbSBmcm9tIGNsb3NpbmcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODIgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUNUYWJGb2xkZXIgZm9sZGVyID0gbmV3IENUYWJGb2xkZXIoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCUNUYWJJdGVtIGl0ZW0gPSBuZXcgQ1RhYkl0ZW0oZm9sZGVyLCBTV1QuQ0xPU0UpOwotCQlpdGVtLnNldFRleHQoIkl0ZW0gIitpKTsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoZm9sZGVyLCBTV1QuTVVMVEkpOwotCQl0ZXh0LnNldFRleHQoIkNvbnRlbnQgZm9yIEl0ZW0gIitpKTsKLQkJaXRlbS5zZXRDb250cm9sKHRleHQpOwotCX0KLQkKLQlmaW5hbCBDVGFiSXRlbSBzcGVjaWFsSXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5DTE9TRSk7Ci0Jc3BlY2lhbEl0ZW0uc2V0VGV4dCgiRG9uJ3QgQ2xvc2UgTWUiKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChmb2xkZXIsIFNXVC5NVUxUSSk7Ci0JdGV4dC5zZXRUZXh0KCJUaGlzIHRhYiBjYW4gbmV2ZXIgYmUgY2xvc2VkIik7Ci0Jc3BlY2lhbEl0ZW0uc2V0Q29udHJvbCh0ZXh0KTsKLQkJCi0JZm9sZGVyLmFkZENUYWJGb2xkZXIyTGlzdGVuZXIobmV3IENUYWJGb2xkZXIyQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY2xvc2UoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuaXRlbS5lcXVhbHMoc3BlY2lhbEl0ZW0pKSB7Ci0JCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JZmluYWwgQ1RhYkl0ZW0gbm9DbG9zZUl0ZW0gPSBuZXcgQ1RhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0Jbm9DbG9zZUl0ZW0uc2V0VGV4dCgiTm8gQ2xvc2UgQnV0dG9uIik7Ci0JVGV4dCB0ZXh0MiA9IG5ldyBUZXh0KGZvbGRlciwgU1dULk1VTFRJKTsKLQl0ZXh0Mi5zZXRUZXh0KCJUaGlzIHRhYiBkb2VzIG5vdCBoYXZlIGEgY2xvc2UgYnV0dG9uIik7Ci0Jbm9DbG9zZUl0ZW0uc2V0Q29udHJvbCh0ZXh0Mik7Ci0JCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmOGZjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkZXRlcm1pbmUgZGF0YSB0eXBlcyBhdmFpbGFibGUgKHdpbjMyIG9ubHkpCi0gKiBOT1RFOiBUaGlzIHNuaXBwZXQgdXNlcyBpbnRlcm5hbCBTV1QgcGFja2FnZXMgdGhhdCBhcmUKLSAqIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDgzIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCi1wcml2YXRlIHN0YXRpYyBTbmlwcGV0ODMgX2luc3RhbmNlID0gbmV3IFNuaXBwZXQ4MygpOwotcHJpdmF0ZSBpbnRbXSBpZHM7Ci1wcml2YXRlIFN0cmluZ1tdIG5hbWVzOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIGNvbnRyb2wgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dCgiRHJhZyBkYXRhIG92ZXIgdGhpcyBzaXRlIHRvIHNlZSB0aGUgbmF0aXZlIHRyYW5zZmVyIHR5cGUuIik7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldChjb250cm9sLCBETkQuRFJPUF9ERUZBVUxUIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTksgfCBETkQuRFJPUF9NT1ZFKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1NuaXBwZXQ4My5nZXRJbnN0YW5jZSgpfSk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsJCQkKLQkJCVN0cmluZyBvcHMgPSAiIjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0NPUFkpICE9IDApIG9wcyArPSAiQ29weTsiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTU9WRSkgIT0gMCkgb3BzICs9ICJNb3ZlOyI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9MSU5LKSAhPSAwKSBvcHMgKz0gIkxpbms7IjsKLQkJCWNvbnRyb2wucmVtb3ZlQWxsKCk7Ci0JCQlUYWJsZUl0ZW0gaXRlbTEgPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsU1dULk5PTkUpOwotCQkJaXRlbTEuc2V0VGV4dCgiQWxsb3dlZCBPcGVyYXRpb25zIGFyZSAiK29wcyk7Ci0JCQkKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0NPUFkpICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCQl9IGVsc2UgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTElOSykgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9MSU5LOwotCQkJCX0gZWxzZSBpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9NT1ZFKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX01PVkU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlUcmFuc2ZlckRhdGFbXSBkYXRhID0gZXZlbnQuZGF0YVR5cGVzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW50IGlkID0gZGF0YVtpXS50eXBlOwotCQkJCVN0cmluZyBuYW1lID0gZ2V0TmFtZUZyb21JZChpZCk7Ci0JCQkJVGFibGVJdGVtIGl0ZW0yID0gbmV3IFRhYmxlSXRlbShjb250cm9sLFNXVC5OT05FKTsKLQkJCQlpdGVtMi5zZXRUZXh0KCJEYXRhIHR5cGUgaXMgIitpZCsiICIrbmFtZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHN0YXRpYyBTbmlwcGV0ODMgZ2V0SW5zdGFuY2UgKCkgewotCXJldHVybiBfaW5zdGFuY2U7Ci19Ci1TbmlwcGV0ODMoKSB7Ci0JaWRzID0gbmV3IGludFs4MDAwMF07Ci0JbmFtZXMgPSBuZXcgU3RyaW5nWzgwMDAwXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQlpZHNbaV0gPSBpOwotCQluYW1lc1tpXSA9IGdldE5hbWVGcm9tSWQoaSk7Ci0JfQotfQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci19Ci1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKXsKLQlyZXR1cm4gIkhlbGxvIFdvcmxkIjsKLX0KLXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKXsKLQlyZXR1cm4gbmFtZXM7Ci19Ci1wcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpewotCXJldHVybiBpZHM7Ci19Ci1zdGF0aWMgU3RyaW5nIGdldE5hbWVGcm9tSWQoaW50IGlkKSB7Ci0JU3RyaW5nIG5hbWUgPSBudWxsOwotCWludCBtYXhTaXplID0gMTI4OwotCVRDSEFSIGJ1ZmZlciA9IG5ldyBUQ0hBUigwLCBtYXhTaXplKTsKLQlpbnQgc2l6ZSA9IENPTS5HZXRDbGlwYm9hcmRGb3JtYXROYW1lKGlkLCBidWZmZXIsIG1heFNpemUpOwotCWlmIChzaXplICE9IDApIHsKLQkJbmFtZSA9IGJ1ZmZlci50b1N0cmluZygwLCBzaXplKTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIENPTS5DRl9IRFJPUDoKLQkJCQluYW1lID0gIkNGX0hEUk9QIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1RFWFQ6Ci0JCQkJbmFtZSA9ICJDRl9URVhUIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX0JJVE1BUDoKLQkJCQluYW1lID0gIkNGX0JJVE1BUCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9NRVRBRklMRVBJQ1Q6Ci0JCQkJbmFtZSA9ICJDRl9NRVRBRklMRVBJQ1QiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfU1lMSzoKLQkJCQluYW1lID0gIkNGX1NZTEsiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfRElGOgotCQkJCW5hbWUgPSAiQ0ZfRElGIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1RJRkY6Ci0JCQkJbmFtZSA9ICJDRl9USUZGIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX09FTVRFWFQ6Ci0JCQkJbmFtZSA9ICJDRl9PRU1URVhUIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX0RJQjoKLQkJCQluYW1lID0gIkNGX0RJQiI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9QQUxFVFRFOgotCQkJCW5hbWUgPSAiQ0ZfUEFMRVRURSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9QRU5EQVRBOgotCQkJCW5hbWUgPSAiQ0ZfUEVOREFUQSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9SSUZGOgotCQkJCW5hbWUgPSAiQ0ZfUklGRiI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9XQVZFOgotCQkJCW5hbWUgPSAiQ0ZfV0FWRSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9VTklDT0RFVEVYVDoKLQkJCQluYW1lID0gIkNGX1VOSUNPREVURVhUIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX0VOSE1FVEFGSUxFOgotCQkJCW5hbWUgPSAiQ0ZfRU5ITUVUQUZJTEUiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfTE9DQUxFOgotCQkJCW5hbWUgPSAiQ0ZfTE9DQUxFIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX01BWDoKLQkJCQluYW1lID0gIkNGX01BWCI7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JfQotCXJldHVybiBuYW1lOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmZjExMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRlZmluZSBhIGRlZmF1bHQgb3BlcmF0aW9uIChpbiB0aGlzIGV4YW1wbGUsIENvcHkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4NCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsLnNldFRleHQoIkRyYWcgU291cmNlIik7Ci0JRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShsYWJlbCwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZXZlbnQuZGF0YSA9ICJUZXh0IFRyYW5zZmVycmVkIjsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZG9pdCkgewotCQkJCVN0cmluZyBvcGVyYXRpb24gPSBudWxsOwotCQkJCXN3aXRjaCAoZXZlbnQuZGV0YWlsKSB7Ci0JCQkJY2FzZSBETkQuRFJPUF9NT1ZFOgotCQkJCQlvcGVyYXRpb24gPSAibW92ZWQiOyBicmVhazsKLQkJCQljYXNlIERORC5EUk9QX0NPUFk6Ci0JCQkJCW9wZXJhdGlvbiA9ICJjb3BpZWQiOyBicmVhazsKLQkJCQljYXNlIERORC5EUk9QX0xJTks6Ci0JCQkJCW9wZXJhdGlvbiA9ICJsaW5rZWQiOyBicmVhazsKLQkJCQljYXNlIERORC5EUk9QX05PTkU6Ci0JCQkJCW9wZXJhdGlvbiA9ICJkaXNhbGxvd2VkIjsgYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJb3BlcmF0aW9uID0gInVua25vd24iOyBicmVhazsKLQkJCQl9Ci0JCQkJbGFiZWwuc2V0VGV4dCgiRHJhZyBTb3VyY2UgKGRhdGEgIitvcGVyYXRpb24rIikiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiRHJhZyBTb3VyY2UgKGRyYWcgY2FuY2VsbGVkKSIpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGV4dC5zZXRUZXh0KCJEcm9wIFRhcmdldCIpOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGV4dCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBvcGVyYXRpb24gPSBudWxsOwotCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCWNhc2UgRE5ELkRST1BfTU9WRToKLQkJCQlvcGVyYXRpb24gPSAibW92ZWQiOyBicmVhazsKLQkJCWNhc2UgRE5ELkRST1BfQ09QWToKLQkJCQlvcGVyYXRpb24gPSAiY29waWVkIjsgYnJlYWs7Ci0JCQljYXNlIERORC5EUk9QX0xJTks6Ci0JCQkJb3BlcmF0aW9uID0gImxpbmtlZCI7IGJyZWFrOwotCQkJY2FzZSBETkQuRFJPUF9OT05FOgotCQkJCW9wZXJhdGlvbiA9ICJkaXNhbGxvd2VkIjsgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCW9wZXJhdGlvbiA9ICJ1bmtub3duIjsgYnJlYWs7Ci0JCQl9Ci0JCQl0ZXh0LmFwcGVuZCgiXG4iK29wZXJhdGlvbisoU3RyaW5nKWV2ZW50LmRhdGEpOwotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmNkMDhkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFBvY2tldFBDIGV4YW1wbGUgc25pcHBldDogSGVsbG8gV29ybGQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCi0JLyogCi0JICogQ3JlYXRlIGEgU2hlbGwgd2l0aCB0aGUgZGVmYXVsdCBzdHlsZQotCSAqIGkuZS4gZnVsbCBzY3JlZW4sIG5vIGRlY29yYXRpb24gb24gUG9ja2V0UEMuCi0JICovCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0KLQkvKiAKLQkgKiBTZXQgYSB0ZXh0IHNvIHRoYXQgdGhlIHRvcCBsZXZlbCBTaGVsbAotCSAqIGFsc28gYXBwZWFycyBpbiB0aGUgUG9ja2V0UEMgdGFzayBsaXN0Ci0JICovCi0Jc2hlbGwuc2V0VGV4dCgiTWFpbiIpOwotCi0JLyoKLQkgKiBTZXQgYSBtZW51YmFyIHRvIGZvbGxvdyBVSSBndWlkZWxpbmVzCi0JICogb24gUG9ja2V0UEMKLQkgKi8KLQlNZW51IG1iID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIobWIpOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjk5MjQ5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFBvY2tldFBDIFNoZWxsIGV4YW1wbGUgc25pcHBldDogJ09rJyBidXR0b24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5DTE9TRSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiIpOwotCU1lbnUgbWIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhcihtYik7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDAwNjg2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBQb2NrZXRQQyBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IHJlc2l6ZSBhdXRvbWF0aWNhbGx5IGFzIFNJUCBpcyBvbiBvciBvZmYKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuUkVTSVpFKTsKLQlzaGVsbC5zZXRUZXh0KCJNYWluIik7Ci0JTWVudSBtYiA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyKG1iKTsKLQkvKiBBZGQgYSBidXR0b24gdG8gbWFrZSB0aGUgcmVzaXplIG1vcmUgdmlzdWFsICovCi0JRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIk1haW4iKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzYwZGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGVFZGl0b3IgZXhhbXBsZSBzbmlwcGV0OiBlZGl0IHRoZSB0ZXh0IG9mIGEgdGFibGUgaXRlbSAoaW4gcGxhY2UpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODggewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSElERV9TRUxFQ1RJT04pOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaXRlbSAiICsgaSwgImVkaXQgdGhpcyB2YWx1ZSJ9KTsKLQl9Ci0JY29sdW1uMS5wYWNrKCk7Ci0JY29sdW1uMi5wYWNrKCk7Ci0JCi0JZmluYWwgVGFibGVFZGl0b3IgZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yKHRhYmxlKTsKLQkvL1RoZSBlZGl0b3IgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGNlbGwgYW5kIG11c3QKLQkvL25vdCBiZSBhbnkgc21hbGxlciB0aGFuIDUwIHBpeGVscy4KLQllZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JZWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCS8vIGVkaXRpbmcgdGhlIHNlY29uZCBjb2x1bW4KLQlmaW5hbCBpbnQgRURJVEFCTEVDT0xVTU4gPSAxOwotCQotCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyBDbGVhbiB1cCBhbnkgcHJldmlvdXMgZWRpdG9yIGNvbnRyb2wKLQkJCUNvbnRyb2wgb2xkRWRpdG9yID0gZWRpdG9yLmdldEVkaXRvcigpOwotCQkJaWYgKG9sZEVkaXRvciAhPSBudWxsKSBvbGRFZGl0b3IuZGlzcG9zZSgpOwotCQotCQkJLy8gSWRlbnRpZnkgdGhlIHNlbGVjdGVkIHJvdwotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWUuaXRlbTsKLQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkKLQkJCS8vIFRoZSBjb250cm9sIHRoYXQgd2lsbCBiZSB0aGUgZWRpdG9yIG11c3QgYmUgYSBjaGlsZCBvZiB0aGUgVGFibGUKLQkJCVRleHQgbmV3RWRpdG9yID0gbmV3IFRleHQodGFibGUsIFNXVC5OT05FKTsKLQkJCW5ld0VkaXRvci5zZXRUZXh0KGl0ZW0uZ2V0VGV4dChFRElUQUJMRUNPTFVNTikpOwotCQkJbmV3RWRpdG9yLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IG1lKSB7Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KWVkaXRvci5nZXRFZGl0b3IoKTsKLQkJCQkJZWRpdG9yLmdldEl0ZW0oKS5zZXRUZXh0KEVESVRBQkxFQ09MVU1OLCB0ZXh0LmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQluZXdFZGl0b3Iuc2VsZWN0QWxsKCk7Ci0JCQluZXdFZGl0b3Iuc2V0Rm9jdXMoKTsKLQkJCWVkaXRvci5zZXRFZGl0b3IobmV3RWRpdG9yLCBpdGVtLCBFRElUQUJMRUNPTFVNTik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3MjViYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIG1lbnUgd2l0aCByYWRpbyBpdGVtcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4OSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU1lbnVJdGVtIGl0ZW0gPSAoTWVudUl0ZW0pZS53aWRnZXQ7Ci0JCQkJaWYgKGl0ZW0uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoaXRlbSArICIgc2VsZWN0ZWQiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKGl0ZW0gKyAiIHVuc2VsZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQlzaGVsbC5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjk4ZjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBzY3JvbGwgYSBjaGlsZCBjb250cm9sIGF1dG9tYXRpY2FsbHkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JY29tcG9zaXRlLnNldFNpemUgKDcwMCwgNjAwKTsKLQlmaW5hbCBDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQljb21wb3NpdGUuYWRkUGFpbnRMaXN0ZW5lciAobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbCAoUGFpbnRFdmVudCBlKSB7Ci0JCQllLmdjLnNldEJhY2tncm91bmQgKHJlZCk7Ci0JCQllLmdjLmZpbGxPdmFsICg1LCA1LCA2OTAsIDU5MCk7Ci0JCX0KLQl9KTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhciA9IHNoZWxsLmdldEhvcml6b250YWxCYXIgKCk7Ci0JaEJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gY29tcG9zaXRlLmdldExvY2F0aW9uICgpOwotCQkJbG9jYXRpb24ueCA9IC1oQmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMb2NhdGlvbiAobG9jYXRpb24pOwotCQl9Ci0JfSk7Ci0JZmluYWwgU2Nyb2xsQmFyIHZCYXIgPSBzaGVsbC5nZXRWZXJ0aWNhbEJhciAoKTsKLQl2QmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUG9pbnQgbG9jYXRpb24gPSBjb21wb3NpdGUuZ2V0TG9jYXRpb24gKCk7Ci0JCQlsb2NhdGlvbi55ID0gLXZCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJY29tcG9zaXRlLnNldExvY2F0aW9uIChsb2NhdGlvbik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlQb2ludCBzaXplID0gY29tcG9zaXRlLmdldFNpemUgKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQloQmFyLnNldE1heGltdW0gKHNpemUueCk7Ci0JCQl2QmFyLnNldE1heGltdW0gKHNpemUueSk7Ci0JCQloQmFyLnNldFRodW1iIChNYXRoLm1pbiAoc2l6ZS54LCByZWN0LndpZHRoKSk7Ci0JCQl2QmFyLnNldFRodW1iIChNYXRoLm1pbiAoc2l6ZS55LCByZWN0LmhlaWdodCkpOwotCQkJaW50IGhQYWdlID0gc2l6ZS54IC0gcmVjdC53aWR0aDsKLQkJCWludCB2UGFnZSA9IHNpemUueSAtIHJlY3QuaGVpZ2h0OwotCQkJaW50IGhTZWxlY3Rpb24gPSBoQmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWludCB2U2VsZWN0aW9uID0gdkJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IGNvbXBvc2l0ZS5nZXRMb2NhdGlvbiAoKTsKLQkJCWlmIChoU2VsZWN0aW9uID49IGhQYWdlKSB7Ci0JCQkJaWYgKGhQYWdlIDw9IDApIGhTZWxlY3Rpb24gPSAwOwotCQkJCWxvY2F0aW9uLnggPSAtaFNlbGVjdGlvbjsKLQkJCX0KLQkJCWlmICh2U2VsZWN0aW9uID49IHZQYWdlKSB7Ci0JCQkJaWYgKHZQYWdlIDw9IDApIHZTZWxlY3Rpb24gPSAwOwotCQkJCWxvY2F0aW9uLnkgPSAtdlNlbGVjdGlvbjsKLQkJCX0KLQkJCWNvbXBvc2l0ZS5zZXRMb2NhdGlvbiAobG9jYXRpb24pOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSg2MDAsIDUwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjEzY2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBtb3VzZSBkb3duIGluIGEgdHJlZSBpdGVtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUcmVlSXRlbSB0cmVlSXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQl0cmVlSXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJVHJlZUl0ZW0gaXRlbSA9IHRyZWUuZ2V0SXRlbSAocG9pbnQpOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIk1vdXNlIGRvd246ICIgKyBpdGVtKTsKLQkJCX0KLQkJfQotCX0pOwotCXRyZWUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZjk1MzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZHJhZyBsZWFmIGl0ZW1zIGluIGEgdHJlZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJpdGVtICIraSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7Ci0JCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSAiK2krIiAiK2opOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCAzOyBrKyspIHsKLQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzdWJzdWJJdGVtLnNldFRleHQoIml0ZW0gIitpKyIgIitqKyIgIitrKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlUcmFuc2ZlcltdIHR5cGVzID0gbmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfTsKLQlpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQkKLQlmaW5hbCBEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlICh0cmVlLCBvcGVyYXRpb25zKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIodHlwZXMpOwotCWZpbmFsIFRyZWVJdGVtW10gZHJhZ1NvdXJjZUl0ZW0gPSBuZXcgVHJlZUl0ZW1bMV07Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lciAobmV3IERyYWdTb3VyY2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCVRyZWVJdGVtW10gc2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24ubGVuZ3RoID4gMCAmJiBzZWxlY3Rpb25bMF0uZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotCQkJCWV2ZW50LmRvaXQgPSB0cnVlOwotCQkJCWRyYWdTb3VyY2VJdGVtWzBdID0gc2VsZWN0aW9uWzBdOwotCQkJfSBlbHNlIHsKLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhIChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRhdGEgPSBkcmFnU291cmNlSXRlbVswXS5nZXRUZXh0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFKQotCQkJCWRyYWdTb3VyY2VJdGVtWzBdLmRpc3Bvc2UoKTsKLQkJCQlkcmFnU291cmNlSXRlbVswXSA9IG51bGw7Ci0JCX0KLQl9KTsKLQotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodHJlZSwgb3BlcmF0aW9ucyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKHR5cGVzKTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyIChuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfRVhQQU5EIHwgRE5ELkZFRURCQUNLX1NDUk9MTDsKLQkJCWlmIChldmVudC5pdGVtICE9IG51bGwpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJUG9pbnQgcHQgPSBkaXNwbGF5Lm1hcChudWxsLCB0cmVlLCBldmVudC54LCBldmVudC55KTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gaXRlbS5nZXRCb3VuZHMoKTsKLQkJCQlpZiAocHQueSA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwotCQkJCX0gZWxzZSBpZiAocHQueSA+IGJvdW5kcy55ICsgMipib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLQkJCQl9IGVsc2UgewotCQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfU0VMRUNUOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgPT0gbnVsbCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKWV2ZW50LmRhdGE7Ci0JCQlpZiAoZXZlbnQuaXRlbSA9PSBudWxsKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbS5zZXRUZXh0KHRleHQpOwotCQkJfSBlbHNlIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJUG9pbnQgcHQgPSBkaXNwbGF5Lm1hcChudWxsLCB0cmVlLCBldmVudC54LCBldmVudC55KTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gaXRlbS5nZXRCb3VuZHMoKTsKLQkJCQlUcmVlSXRlbSBwYXJlbnQgPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHBhcmVudC5nZXRJdGVtcygpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbXNbaV0gPT0gaXRlbSkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocHQueSA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHBhcmVudCwgU1dULk5PTkUsIGluZGV4KTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfSBlbHNlIGlmIChwdC55ID4gYm91bmRzLnkgKyAyKmJvdW5kcy5oZWlnaHQvMykgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShwYXJlbnQsIFNXVC5OT05FLCBpbmRleCsxKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCVRyZWVJdGVtW10gaXRlbXMgPSB0cmVlLmdldEl0ZW1zKCk7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChpdGVtc1tpXSA9PSBpdGVtKSB7Ci0JCQkJCQkJaW5kZXggPSBpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChwdC55IDwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUsIGluZGV4KTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfSBlbHNlIGlmIChwdC55ID4gYm91bmRzLnkgKyAyKmJvdW5kcy5oZWlnaHQvMykgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSwgaW5kZXgrMSk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkKLQkJCX0KLQkJfQotCX0pOwotCi0Jc2hlbGwuc2V0U2l6ZSAoNDAwLCA0MDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YTcxMDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY3Vyc29yIGZyb20gYSBzb3VyY2UgYW5kIGEgbWFzawotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQkKLQkvL0NyZWF0ZSBhIHNvdXJjZSBJbWFnZURhdGEgb2YgZGVwdGggMSAobW9ub2Nocm9tZSkKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCIFtdIHt3aGl0ZS5nZXRSR0IoKSwgYmxhY2suZ2V0UkdCKCksfSk7Ci0JSW1hZ2VEYXRhIHNvdXJjZURhdGEgPSBuZXcgSW1hZ2VEYXRhICgyMCwgMjAsIDEsIHBhbGV0dGUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkgKyspIHsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAyMDsgaisrKSB7Ci0JCQlzb3VyY2VEYXRhLnNldFBpeGVsKGksIGosIDEpOwotCQl9Ci0JfQotCQotCS8vQ3JlYXRlIGEgbWFzayBJbWFnZURhdGEgb2YgZGVwdGggMSAobW9ub2Nocm9tZSkKLQlwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCIFtdIHt3aGl0ZS5nZXRSR0IoKSwgYmxhY2suZ2V0UkdCKCksfSk7Ci0JSW1hZ2VEYXRhIG1hc2tEYXRhID0gbmV3IEltYWdlRGF0YSAoMjAsIDIwLCAxLCBwYWxldHRlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpICsrKSB7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgewotCQkJbWFza0RhdGEuc2V0UGl4ZWwoaSwgaiwgMSk7Ci0JCX0KLQl9Ci0JLy9DcmVhdGUgY3Vyc29yCi0JQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgc291cmNlRGF0YSwgbWFza0RhdGEsIDEwLCAxMCk7Ci0JCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgSW1hZ2Ugc291cmNlID0gbmV3IEltYWdlIChkaXNwbGF5LHNvdXJjZURhdGEpOwotCWZpbmFsIEltYWdlIG1hc2sgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIG1hc2tEYXRhKTsKLQkvL0RyYXcgc291cmNlIGFuZCBtYXNrIGp1c3QgdG8gc2hvdyB3aGF0IHRoZXkgbG9vayBsaWtlCi0Jc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJR0MgZ2MgPSBlLmdjOwotCQkJZ2MuZHJhd1N0cmluZygic291cmNlOiAiLCAxMCwgMTApOwotCQkJZ2MuZHJhd0ltYWdlKHNvdXJjZSwgMCwgMCwgMjAsIDIwLCA2MCwgMTAsIDIwLCAyMCk7Ci0JCQlnYy5kcmF3U3RyaW5nKCJtYXNrOiAiLDEwLCA0MCk7Ci0JCQlnYy5kcmF3SW1hZ2UobWFzaywgMCwgMCwgMjAsIDIwLCA2MCwgNDAsIDIwLCAyMCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDE1MCwgMTUwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQljdXJzb3IuZGlzcG9zZSgpOwotCXNvdXJjZS5kaXNwb3NlKCk7Ci0JbWFzay5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU3MjlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogbWVhc3VyZSBhIHN0cmluZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULk5PTkUpOwotCUdDIGdjID0gbmV3IEdDIChsYWJlbCk7Ci0JUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQgKCJIZWxsbyIpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JbGFiZWwuc2V0VGV4dCAoIkhlbGxvIC0+ICIgKyBzaXplKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjZlMjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ2xpcGJvYXJkIGV4YW1wbGUgc25pcHBldDogY29weSBhbmQgcGFzdGUgZGF0YSB3aXRoIHRoZSBjbGlwYm9hcmQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBDbGlwYm9hcmQgY2IgPSBuZXcgQ2xpcGJvYXJkKGRpc3BsYXkpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQotCUJ1dHRvbiBjb3B5ID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWNvcHkuc2V0VGV4dCgiQ29weSIpOwotCWNvcHkuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgdGV4dERhdGEgPSB0ZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCWlmICh0ZXh0RGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlUZXh0VHJhbnNmZXIgdGV4dFRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQkJY2Iuc2V0Q29udGVudHMobmV3IE9iamVjdFtde3RleHREYXRhfSwgbmV3IFRyYW5zZmVyW117dGV4dFRyYW5zZmVyfSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlCdXR0b24gcGFzdGUgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JcGFzdGUuc2V0VGV4dCgiUGFzdGUiKTsKLQlwYXN0ZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVRleHRUcmFuc2ZlciB0cmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQkJU3RyaW5nIGRhdGEgPSAoU3RyaW5nKWNiLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQkJCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCQl0ZXh0Lmluc2VydChkYXRhKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocGFzdGUsIDAsIFNXVC5MRUZUKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCWNvcHkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb3B5LCA1KTsKLQlwYXN0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChwYXN0ZSwgLTUpOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlzaGVsbC5zZXRTaXplKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWNiLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZGMxMDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogY2FwdHVyZSBhIHdpZGdldCBpbWFnZSB3aXRoIGEgR0MKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJXaWRnZXQiKTsKLQkKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0Qm91bmRzKDEwLCAxMCwgMTAwLCAxMDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgOTsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKS5zZXRUZXh0KCJpdGVtIiArIGkpOwotCX0KLQkKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJDYXB0dXJlIik7Ci0JYnV0dG9uLnBhY2soKTsKLQlidXR0b24uc2V0TG9jYXRpb24oMTAsIDE0MCk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHRhYmxlU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCUdDIGdjID0gbmV3IEdDKHRhYmxlKTsKLQkJCWZpbmFsIEltYWdlIGltYWdlID0KLQkJCQluZXcgSW1hZ2UoZGlzcGxheSwgdGFibGVTaXplLngsIHRhYmxlU2l6ZS55KTsKLQkJCWdjLmNvcHlBcmVhKGltYWdlLCAwLCAwKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQotCQkJU2hlbGwgcG9wdXAgPSBuZXcgU2hlbGwoc2hlbGwpOwotCQkJcG9wdXAuc2V0VGV4dCgiSW1hZ2UiKTsKLQkJCXBvcHVwLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhwb3B1cCwgU1dULk5PTkUpOwotCQkJY2FudmFzLnNldEJvdW5kcygxMCwgMTAsIHRhYmxlU2l6ZS54KzEwLCB0YWJsZVNpemUueSsxMCk7Ci0JCQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXBvcHVwLnBhY2soKTsKLQkJCXBvcHVwLm9wZW4oKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzZWMwYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGVDdXJzb3IgZXhhbXBsZSBzbmlwcGV0OiBuYXZpZ2F0ZSBhIHRhYmxlIGNlbGxzIHdpdGggYXJyb3cga2V5cy4gCi0gKiBFZGl0IHdoZW4gdXNlciBoaXRzIFJldHVybiBrZXkuICBFeGl0IGVkaXQgbW9kZSBieSBoaXR0aW5nIEVzY2FwZSAoY2FuY2VscyBlZGl0KQotICogb3IgUmV0dXJuIChhcHBsaWVzIGVkaXQgdG8gdGFibGUpLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JLy8gY3JlYXRlIGEgdGFibGUgd2l0aCAzIGNvbHVtbnMgYW5kIGZpbGwgd2l0aCBkYXRhCi0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJjZWxsICIgKyBpICsgIiAwIiwgCSJjZWxsICIgKyBpICsgIiAxIiwgImNlbGwgIiArIGkgKyAiIDIiIH0pOwotCX0KLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQljb2x1bW4zLnBhY2soKTsKLQotCS8vIGNyZWF0ZSBhIFRhYmxlQ3Vyc29yIHRvIG5hdmlnYXRlIGFyb3VuZCB0aGUgdGFibGUKLQlmaW5hbCBUYWJsZUN1cnNvciBjdXJzb3IgPSBuZXcgVGFibGVDdXJzb3IodGFibGUsIFNXVC5OT05FKTsKLQkvLyBjcmVhdGUgYW4gZWRpdG9yIHRvIGVkaXQgdGhlIGNlbGwgd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIgCi0JLy8gd2hpbGUgb3ZlciBhIGNlbGwgaW4gdGhlIHRhYmxlCi0JZmluYWwgQ29udHJvbEVkaXRvciBlZGl0b3IgPSBuZXcgQ29udHJvbEVkaXRvcihjdXJzb3IpOwotCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JZWRpdG9yLmdyYWJWZXJ0aWNhbCA9IHRydWU7Ci0KLQljdXJzb3IuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCS8vIHdoZW4gdGhlIFRhYmxlRWRpdG9yIGlzIG92ZXIgYSBjZWxsLCBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcm93IGluIAotCQkvLyB0aGUgdGFibGUKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7IGN1cnNvci5nZXRSb3coKX0pOwotCQl9Ci0JCS8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiIGluIHRoZSBUYWJsZUN1cnNvciwgcG9wIHVwIGEgdGV4dCBlZGl0b3Igc28gdGhhdCAKLQkJLy8gdGhleSBjYW4gY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjZWxsCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjdXJzb3IsIFNXVC5OT05FKTsKLQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJdGV4dC5zZXRUZXh0KHJvdy5nZXRUZXh0KGNvbHVtbikpOwotCQkJdGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIGFuZCBjb3B5IHRoZSBkYXRhIG92ZXIgCi0JCQkJCS8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJCQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQkJCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJCQkJcm93LnNldFRleHQoY29sdW1uLCB0ZXh0LmdldFRleHQoKSk7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3Igd2hlbiB0aGUgdXNlciBoaXRzICJFU0MiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIHdoZW4gdGhlIHVzZXIgdGFicyBhd2F5Ci0JCQl0ZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCXRleHQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJZWRpdG9yLnNldEVkaXRvcih0ZXh0KTsKLQkJCXRleHQuc2V0Rm9jdXMoKTsKLQkJfQotCX0pOwotCS8vIEhpZGUgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUgIkNUUkwiIG9yICJTSElGVCIga2V5LgotCS8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBtdWx0aXBsZSBpdGVtcyBpbiB0aGUgdGFibGUuCi0JY3Vyc29yLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkNUUkwKLQkJCQl8fCBlLmtleUNvZGUgPT0gU1dULlNISUZUCi0JCQkJfHwgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDAKLQkJCQl8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApIHsKLQkJCQljdXJzb3Iuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkvLyBXaGVuIHRoZSB1c2VyIGRvdWJsZSBjbGlja3MgaW4gdGhlIFRhYmxlQ3Vyc29yLCBwb3AgdXAgYSB0ZXh0IGVkaXRvciBzbyB0aGF0IAotCS8vIHRoZXkgY2FuIGNoYW5nZSB0aGUgdGV4dCBvZiB0aGUgY2VsbC4KLQljdXJzb3IuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjdXJzb3IsIFNXVC5OT05FKTsKLQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJdGV4dC5zZXRUZXh0KHJvdy5nZXRUZXh0KGNvbHVtbikpOwotCQkJdGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIGFuZCBjb3B5IHRoZSBkYXRhIG92ZXIgCi0JCQkJCS8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJCQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQkJCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJCQkJcm93LnNldFRleHQoY29sdW1uLCB0ZXh0LmdldFRleHQoKSk7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3Igd2hlbiB0aGUgdXNlciBoaXRzICJFU0MiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGF3YXkKLQkJCXRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQllZGl0b3Iuc2V0RWRpdG9yKHRleHQpOwotCQkJdGV4dC5zZXRGb2N1cygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gU2hvdyB0aGUgVGFibGVDdXJzb3Igd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgIlNISUZUIiBvciAiQ1RSTCIga2V5LgotCS8vIFRoaXMgc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBtdWx0aXBsZSBzZWxlY3Rpb24gdGFzay4KLQl0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuQ09OVFJPTCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuU0hJRlQgJiYgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKGUua2V5Q29kZSAhPSBTV1QuQ09OVFJPTAotCQkJCSYmIChlLnN0YXRlTWFzayAmIFNXVC5DT05UUk9MKSAhPSAwKQotCQkJCXJldHVybjsKLQkJCWlmIChlLmtleUNvZGUgIT0gU1dULlNISUZUICYmIChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkKLQkJCQlyZXR1cm47Ci0KLQkJCVRhYmxlSXRlbVtdIHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJVGFibGVJdGVtIHJvdyA9IChzZWxlY3Rpb24ubGVuZ3RoID09IDApID8gdGFibGUuZ2V0SXRlbSh0YWJsZS5nZXRUb3BJbmRleCgpKSA6IHNlbGVjdGlvblswXTsKLQkJCXRhYmxlLnNob3dJdGVtKHJvdyk7Ci0JCQljdXJzb3Iuc2V0U2VsZWN0aW9uKHJvdywgMCk7Ci0JCQljdXJzb3Iuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWN1cnNvci5zZXRGb2N1cygpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMDE3NGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBmaWxsIGEgbWVudSBkeW5hbWljYWxseSAod2hlbiBtZW51IHNob3duKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQl0cmVlLnNldE1lbnUgKG1lbnUpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCW1lbnUuYWRkTGlzdGVuZXIgKFNXVC5TaG93LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCU1lbnVJdGVtIFtdIG1lbnVJdGVtcyA9IG1lbnUuZ2V0SXRlbXMgKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8bWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbWVudUl0ZW1zIFtpXS5kaXNwb3NlICgpOwotCQkJfQotCQkJVHJlZUl0ZW0gW10gdHJlZUl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8dHJlZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJCQltZW51SXRlbS5zZXRUZXh0ICh0cmVlSXRlbXMgW2ldLmdldFRleHQgKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JdHJlZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzc5MTg2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYW5kIGRpc3Bvc2UgY2hpbGRyZW4gb2YgYSBjb21wb3NpdGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTggewotCi1zdGF0aWMgaW50IHBhZ2VOdW0gPSAwOwotc3RhdGljIENvbXBvc2l0ZSBwYWdlQ29tcG9zaXRlOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiUHVzaCIpOwotCXBhZ2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JcGFnZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JcGFnZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoKHBhZ2VDb21wb3NpdGUgIT0gbnVsbCkgJiYgKCFwYWdlQ29tcG9zaXRlLmlzRGlzcG9zZWQoKSkpIHsKLQkJCQlwYWdlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXBhZ2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlwYWdlQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQlpZiAocGFnZU51bSsrICUgMiA9PSAwKSB7Ci0JCQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFnZUNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCQkJbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpLnNldFRleHQoInRhYmxlIGl0ZW0gIiArIGkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbmV3IEJ1dHRvbihwYWdlQ29tcG9zaXRlLCBTV1QuUkFESU8pLnNldFRleHQoInJhZGlvIik7Ci0JCQl9Ci0JCQlzaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhM2FjYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBwcmV2ZW50IGEgc2hlbGwgZnJvbSBjbG9zaW5nIChwcm9tcHQgdGhlIHVzZXIpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgc3R5bGUgPSBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuWUVTIHwgU1dULk5POwotCQkJTWVzc2FnZUJveCBtZXNzYWdlQm94ID0gbmV3IE1lc3NhZ2VCb3ggKHNoZWxsLCBzdHlsZSk7Ci0JCQltZXNzYWdlQm94LnNldFRleHQgKCJJbmZvcm1hdGlvbiIpOwotCQkJbWVzc2FnZUJveC5zZXRNZXNzYWdlICgiQ2xvc2UgdGhlIHNoZWxsPyIpOwotCQkJZXZlbnQuZG9pdCA9IG1lc3NhZ2VCb3gub3BlbiAoKSA9PSBTV1QuWUVTOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXRMYXVuY2hlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldExhdW5jaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZWI1MzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldExhdW5jaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNpbXBsZSAiaGFja2FibGUiIGNvZGUgdGhhdCBydW5zIGFsbCBvZiB0aGUgU1dUIFNuaXBwZXRzLAotICogdHlwaWNhbGx5IGZvciB0ZXN0aW5nLiBPbmUgZXhhbXBsZSBvZiBhIHVzZWZ1bCAiaGFjayIgaXMKLSAqIHRvIGFkZCB0aGUgbGluZToKLSAqICAgIGlmIChzb3VyY2UuaW5kZXhPZigiVGFibGUiKSA9PSAtMSAmJiBzb3VyY2UuaW5kZXhPZigiVHJlZSIpID09IC0xKSBjb250aW51ZTsKLSAqIGFmdGVyIHRoZSBsaW5lOgotICogICAgU3RyaW5nIHNvdXJjZSA9IFN0cmluZy52YWx1ZU9mKGJ1ZmZlcik7Ci0gKiBpbiBvcmRlciB0byBydW4gYWxsIG9mIHRoZSBUYWJsZSBhbmQgVHJlZSBTbmlwcGV0cy4KLSAqLwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0TGF1bmNoZXIgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCUZpbGUgc291cmNlRGlyID0gbmV3IEZpbGUoInNyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMiKTsKLQkJYm9vbGVhbiBoYXNTb3VyY2UgPSBzb3VyY2VEaXIuZXhpc3RzKCk7Ci0JCWludCBjb3VudCA9IDUwMDsKLQkJaWYgKGhhc1NvdXJjZSkgewotCQkJRmlsZSBbXSBmaWxlcyA9IHNvdXJjZURpci5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKSBjb3VudCA9IGZpbGVzLmxlbmd0aDsKLQkJfQotCQlmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWlmIChpID09IDEzMiB8fCBpID09IDEzMyB8fCBpID09IDI5MiB8fCBpID09IDMxOCkgY29udGludWU7IC8vIGF2b2lkIHByaW50aW5nIHRvIHByaW50ZXIKLQkJCVN0cmluZyBjbGFzc05hbWUgPSAiU25pcHBldCIgKyBpOwotCQkJQ2xhc3MgY2xhenogPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljbGF6eiA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy4iICsgY2xhc3NOYW1lKTsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkge30KLQkJCWlmIChjbGF6eiAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIgKyBjbGF6ei5nZXROYW1lKCkpOwotCQkJCWlmIChoYXNTb3VyY2UpIHsKLQkJCQkJRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlRGlyLCBjbGFzc05hbWUgKyAiLmphdmEiKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGVSZWFkZXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc291cmNlRmlsZSk7Ci0JCQkJCQljaGFyIFtdIGJ1ZmZlciA9IG5ldyBjaGFyIFsoaW50KXNvdXJjZUZpbGUubGVuZ3RoKCldOwotCQkJCQkJcmVhZGVyLnJlYWQoYnVmZmVyKTsKLQkJCQkJCVN0cmluZyBzb3VyY2UgPSBTdHJpbmcudmFsdWVPZihidWZmZXIpOwotCQkJCQkJaW50IHN0YXJ0ID0gc291cmNlLmluZGV4T2YoInBhY2thZ2UiKTsKLQkJCQkJCXN0YXJ0ID0gc291cmNlLmluZGV4T2YoIi8qIiwgc3RhcnQpOwotCQkJCQkJaW50IGVuZCA9IHNvdXJjZS5pbmRleE9mKCIqIEZvciBhIGxpc3Qgb2YgYWxsIik7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc291cmNlLnN1YnN0cmluZyhzdGFydCwgZW5kLTMpKTsKLQkJCQkJCWJvb2xlYW4gc2tpcCA9IGZhbHNlOwotCQkJCQkJU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtKCk7Ci0JCQkJCQlpZiAoc291cmNlLmluZGV4T2YoIlBvY2tldFBDIikgIT0gLTEpIHsKLQkJCQkJCQlwbGF0Zm9ybSA9ICJQb2NrZXRQQyI7Ci0JCQkJCQkJc2tpcCA9IHRydWU7Ci0JCQkJCQl9IGVsc2UgaWYgKHNvdXJjZS5pbmRleE9mKCJPcGVuR0wiKSAhPSAtMSkgewotCQkJCQkJCXBsYXRmb3JtID0gIk9wZW5HTCI7Ci0JCQkJCQkJc2tpcCA9IHRydWU7Ci0JCQkJCQl9IGVsc2UgaWYgKHNvdXJjZS5pbmRleE9mKCJKYXZhWFBDT00iKSAhPSAtMSkgewotCQkJCQkJCXBsYXRmb3JtID0gIkphdmFYUENPTSI7Ci0JCQkJCQkJc2tpcCA9IHRydWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBbXSBwbGF0Zm9ybXMgPSB7IndpbjMyIiwgIm1vdGlmIiwgImd0ayIsICJwaG90b24iLCAiY2FyYm9uIn07Ci0JCQkJCQkJZm9yIChpbnQgcCA9IDA7IHAgPCBwbGF0Zm9ybXMubGVuZ3RoOyBwKyspIHsKLQkJCQkJCQkJaWYgKCFwbGF0Zm9ybXNbcF0uZXF1YWxzKHBsYXRmb3JtKSAmJiBzb3VyY2UuaW5kZXhPZigiLiIgKyBwbGF0Zm9ybXNbcF0pICE9IC0xKSB7Ci0JCQkJCQkJCQlwbGF0Zm9ybSA9IHBsYXRmb3Jtc1twXTsKLQkJCQkJCQkJCXNraXAgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoc2tpcCkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLi4uc2tpcHBpbmcgIiArIHBsYXRmb3JtICsgIiBleGFtcGxlLi4uIik7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJCX0KLQkJCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJCQlTdHJpbmcgW10gcGFyYW0gPSBuZXcgU3RyaW5nIFswXTsKLQkJCQlpZiAoaSA9PSA4MSkgcGFyYW0gPSBuZXcgU3RyaW5nW10geyJTaGVsbC5FeHBsb3JlciJ9OwotCQkJCXRyeSB7Ci0JCQkJCW1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCgibWFpbiIsIG5ldyBDbGFzc1tdIHtwYXJhbS5nZXRDbGFzcygpfSk7Ci0JCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBEaWQgbm90IGZpbmQgbWFpbihTdHJpbmcgW10pIik7Ci0JCQkJfQotCQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbWV0aG9kLmludm9rZShjbGF6eiwgbmV3IE9iamVjdCBbXSB7cGFyYW19KTsKLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIEZhaWxlZCB0byBsYXVuY2ggKGlsbGVnYWwgYWNjZXNzKSIpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBGYWlsZWQgdG8gbGF1bmNoIChpbGxlZ2FsIGFyZ3VtZW50IHRvIG1haW4pIik7Ci0JCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBFeGNlcHRpb24gaW4gU25pcHBldDogIiArIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvZWNsaXBzZS5wbmcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9lY2xpcHNlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5NzUyNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9lY2xpcHNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZTVkYjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkpVbml0IFRlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGF0YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg4Y2ZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTk4NzgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNToxMjoxOSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxCcm93c2VyVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsQnJvd3NlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTAyNzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxCcm93c2VyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciB0ZXN0aW5nIGFsbCBvZiB0aGUgZ3JhcGhpY3MgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbEJyb3dzZXJUZXN0cyB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3Nlci5zdWl0ZSgpKTsJCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyLlRlc3RfQnJvd3NlclN1aXRlLnN1aXRlKCkpOwotCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxDYXJib25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxDYXJib25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjJlYWQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsQ2FyYm9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciBydW5uaW5nIGFsbCBTV1QgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbENhcmJvblRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotLyoqCi0gKiBUZXN0cyBub3QgcnVuIGJlY2F1c2UgdGhleSBjb25zaXN0ZW50bHkgZmFpbAotICovCi1zdGF0aWMgU3RyaW5nW10gZXhjbHVkZVRlc3RzID0gewotCSJ0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSkiLAotCSJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCkiLAotCSJ0ZXN0X2dldEJvdW5kc0kob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKSIsCi0JInRlc3RfZ2V0Qm91bmRzSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSkiLAotCSJ0ZXN0X2dldEJvdW5kcyhvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSkiLAotCSJ0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9nZXRUb3BQaXhlbChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3RfZ2V0VG9wSW5kZXgob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2NsZWFyU2VsZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfY29weShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X2N1dChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X2dldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfcGFzdGUob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3Rfc2V0U2VsZWN0aW9uRW1wdHkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyKSIsCi0JIkJyb3dzZXI0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyLlRlc3RfQnJvd3NlclN1aXRlKSIsCi0JIkJyb3dzZXI1KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyLlRlc3RfQnJvd3NlclN1aXRlKSIsCi0JLy8KLQkidGVzdF9jb3B5KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9jdXQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X3Bhc3RlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9zZWxlY3RBbGwob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2NvcHkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JInRlc3RfY3V0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotCSJ0ZXN0X2ludm9rZUFjdGlvbkkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JInRlc3RfcGFzdGUob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JCi0JLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyAoY3V0L2NvcHkvcGFzdGUpIGZhaWwgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLiBUaGV5IGRvIG5vdCBmYWlsIGxvY2FsbHkuCi0JInRlc3RfY29weShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21ibykiLAotCSJ0ZXN0X2N1dChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21ibykiLAotCSJ0ZXN0X3Bhc3RlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvKSIsCi19OwotCi1zdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKFN0cmluZyBuYW1lKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlVGVzdHMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG5hbWUuZXF1YWxzKGV4Y2x1ZGVUZXN0c1tpXSkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0JaWYgKFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzID4gMCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkV4Y2x1ZGVkIFRlc3RzOiAiICsgZXhjbHVkZVRlc3RzLmxlbmd0aCk7Ci0JfQotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBmdWxsU3VpdGUgPSAoVGVzdFN1aXRlKUFsbFRlc3RzLnN1aXRlKCk7Ci0JVGVzdFN1aXRlIGZpbHRlcmVkU3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsU3VpdGUudGVzdENvdW50KCk7IGkrKykgewotCQlUZXN0IGNhbmRpZGF0ZVRlc3QgPSBmdWxsU3VpdGUudGVzdEF0KGkpOwotCQlpZiAoY2FuZGlkYXRlVGVzdCBpbnN0YW5jZW9mIFRlc3RTdWl0ZSkgewotCQkJVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSljYW5kaWRhdGVUZXN0OwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdWl0ZS50ZXN0Q291bnQoKTsgaisrKSB7Ci0JCQkJVGVzdCB0ZXN0ID0gc3VpdGUudGVzdEF0KGopOwotCQkJCWlmICghaXNFeGNsdWRlZCh0ZXN0LnRvU3RyaW5nKCkpKSBmaWx0ZXJlZFN1aXRlLmFkZFRlc3QodGVzdCk7CQkJCQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBmaWx0ZXJlZFN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxDb2NvYVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbENvY29hVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxMjQxMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbENvY29hVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciBydW5uaW5nIGFsbCBTV1QgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbENvY29hVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0vKioKLSAqIFRlc3RzIG5vdCBydW4gYmVjYXVzZSB0aGV5IGNvbnNpc3RlbnRseSBmYWlsCi0gKi8KLXN0YXRpYyBTdHJpbmdbXSBleGNsdWRlVGVzdHMgPSB7Ci0JInRlc3RfZ2V0Qm91bmRzSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0pIiwKLQkidGVzdF9nZXRCb3VuZHNJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKSIsCi0JInRlc3RfZ2V0Qm91bmRzKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKSIsCi0JInRlc3RfZ2V0VG9wUGl4ZWwob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSkiLAotCQotCS8vdGVzdHMgcGFzcyBsb2NhbGx5LCBidXQgZmFpbCBvbiB0aGUgcmVsZW5nIG1hY2hpbmUKLQkidGVzdF9jb3B5KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9jdXQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X3Bhc3RlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9zZWxlY3RBbGwob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2NvcHkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9jdXQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9wYXN0ZShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X2NvcHkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8pIiwKLQkidGVzdF9jdXQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8pIiwKLQkidGVzdF9wYXN0ZShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21ibykiLAotCSJ0ZXN0X2NvcHkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JInRlc3RfY3V0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotCSJ0ZXN0X2ludm9rZUFjdGlvbkkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JInRlc3RfcGFzdGUob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi19OwotCi1zdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKFN0cmluZyBuYW1lKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlVGVzdHMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG5hbWUuZXF1YWxzKGV4Y2x1ZGVUZXN0c1tpXSkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0JaWYgKFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzID4gMCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkV4Y2x1ZGVkIFRlc3RzOiAiICsgZXhjbHVkZVRlc3RzLmxlbmd0aCk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIGZ1bGxTdWl0ZSA9IChUZXN0U3VpdGUpQWxsVGVzdHMuc3VpdGUoKTsKLQlUZXN0U3VpdGUgZmlsdGVyZWRTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bGxTdWl0ZS50ZXN0Q291bnQoKTsgaSsrKSB7Ci0JCVRlc3QgY2FuZGlkYXRlVGVzdCA9IGZ1bGxTdWl0ZS50ZXN0QXQoaSk7Ci0JCWlmIChjYW5kaWRhdGVUZXN0IGluc3RhbmNlb2YgVGVzdFN1aXRlKSB7Ci0JCQlUZXN0U3VpdGUgc3VpdGUgPSAoVGVzdFN1aXRlKWNhbmRpZGF0ZVRlc3Q7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHN1aXRlLnRlc3RDb3VudCgpOyBqKyspIHsKLQkJCQlUZXN0IHRlc3QgPSBzdWl0ZS50ZXN0QXQoaik7Ci0JCQkJaWYgKCFpc0V4Y2x1ZGVkKHRlc3QudG9TdHJpbmcoKSkpIGZpbHRlcmVkU3VpdGUuYWRkVGVzdCh0ZXN0KTsJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGZpbHRlcmVkU3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEdyYXBoaWNzVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3JhcGhpY3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTgzNzJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3JhcGhpY3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHRlc3RpbmcgYWxsIG9mIHRoZSBncmFwaGljcyB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsR3JhcGhpY3NUZXN0cyB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3Muc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbi5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQi5zdWl0ZSgpKTsKLQkKLQkKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudC5zdWl0ZSgpKTsKLQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3RrVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3RrVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3Zjc5Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEd0a1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgcnVubmluZyBhbGwgU1dUIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxHdGtUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLS8qKgotICogVGVzdHMgbm90IHJ1biBiZWNhdXNlIHRoZXkgY29uc2lzdGVudGx5IGZhaWwKLSAqLwotc3RhdGljIFN0cmluZ1tdIGV4Y2x1ZGVUZXN0cyA9IHsKLQkidGVzdF9nZXRBY3RpdmVTaGVsbChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KSIsCi0JInRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KSIsCi0JInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Iob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKSIsCi0JInRlc3RfZ2V0Qm91bmRzSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0pIiwKLQkidGVzdF9nZXRCb3VuZHNJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKSIsCi0JInRlc3RfZ2V0Qm91bmRzKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKSIsCi0JInRlc3Rfc2V0RGVmYXVsdEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0ob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSkiLAotCSJ0ZXN0X3NldEFjdGl2ZShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCkiLAotCSJ0ZXN0X2dldEl0ZW1IZWlnaHQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdCkiLAotCSJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdCkiLAotCSJ0ZXN0X3NldFRvcEluZGV4SShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0KSIsCi0JInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0KSIsCi0JInRlc3RfZ2V0VGV4dExpbWl0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9nZXRUb3BQaXhlbChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3Rfc2V0VGV4dExpbWl0SShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3Rfc2V0VG9wSW5kZXhJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9nZXRIZWFkZXJIZWlnaHQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSkiLAotCSJ0ZXN0X3NldFNlbGVjdGlvbkVtcHR5KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcikiLAotCSJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfZ2V0Um93Q291bnQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhcikiLAotCSJ0ZXN0X2dldEhlYWRlckhlaWdodChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSkiLAotfTsKLQotc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlZChTdHJpbmcgbmFtZSkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZVRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChuYW1lLmVxdWFscyhleGNsdWRlVGVzdHNbaV0pKSByZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCWlmIChTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyBTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5FeGNsdWRlZCBUZXN0czogIiArIGV4Y2x1ZGVUZXN0cy5sZW5ndGgpOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgZnVsbFN1aXRlID0gKFRlc3RTdWl0ZSlBbGxUZXN0cy5zdWl0ZSgpOwotCVRlc3RTdWl0ZSBmaWx0ZXJlZFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZnVsbFN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLQkJVGVzdCBjYW5kaWRhdGVUZXN0ID0gZnVsbFN1aXRlLnRlc3RBdChpKTsKLQkJaWYgKGNhbmRpZGF0ZVRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKLQkJCVRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpY2FuZGlkYXRlVGVzdDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3VpdGUudGVzdENvdW50KCk7IGorKykgewotCQkJCVRlc3QgdGVzdCA9IHN1aXRlLnRlc3RBdChqKTsKLQkJCQlpZiAoIWlzRXhjbHVkZWQodGVzdC50b1N0cmluZygpKSkgZmlsdGVyZWRTdWl0ZS5hZGRUZXN0KHRlc3QpOwkJCQkKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZmlsdGVyZWRTdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsTW90aWZUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxNb3RpZlRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZmJhMGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxNb3RpZlRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgcnVubmluZyBhbGwgU1dUIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxNb3RpZlRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotLyoqCi0gKiBUZXN0cyBub3QgcnVuIGJlY2F1c2UgdGhleSBjb25zaXN0ZW50bHkgZmFpbAotICovCi1zdGF0aWMgU3RyaW5nW10gZXhjbHVkZVRlc3RzID0gewotCSJ0ZXN0X3NsZWVwKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkpIiwKLQkidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcihvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UpIiwKLQkidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQpIiwKLQkidGVzdF9nZXRGb250RGF0YShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCkiLAotCSJ0ZXN0X2dldEJvdW5kc0kob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKSIsCi0JInRlc3RfZ2V0Qm91bmRzSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSkiLAotCSJ0ZXN0X3NldE1heGltaXplZFoob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwpIiwKLQkidGVzdF9nZXRMaW5lSW5kZXgob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JInRlc3RfZ2V0TGluZVBpeGVsKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotCSJ0ZXN0X3Bhc3RlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotfTsKLQotc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlZChTdHJpbmcgbmFtZSkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZVRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChuYW1lLmVxdWFscyhleGNsdWRlVGVzdHNbaV0pKSByZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCWlmIChTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyBTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5FeGNsdWRlZCBUZXN0czogIiArIGV4Y2x1ZGVUZXN0cy5sZW5ndGgpOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgZnVsbFN1aXRlID0gKFRlc3RTdWl0ZSlBbGxUZXN0cy5zdWl0ZSgpOwotCVRlc3RTdWl0ZSBmaWx0ZXJlZFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZnVsbFN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLQkJVGVzdCBjYW5kaWRhdGVUZXN0ID0gZnVsbFN1aXRlLnRlc3RBdChpKTsKLQkJaWYgKGNhbmRpZGF0ZVRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKLQkJCVRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpY2FuZGlkYXRlVGVzdDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3VpdGUudGVzdENvdW50KCk7IGorKykgewotCQkJCVRlc3QgdGVzdCA9IHN1aXRlLnRlc3RBdChqKTsKLQkJCQlpZiAoIWlzRXhjbHVkZWQodGVzdC50b1N0cmluZygpKSkgZmlsdGVyZWRTdWl0ZS5hZGRUZXN0KHRlc3QpOwkJCQkKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZmlsdGVyZWRTdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyMTE1ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHJ1bm5pbmcgYWxsIFNXVCB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCWlmIChTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyBTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0JfQotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgQWxsVGVzdHMoKTsKLX0KLQotcHVibGljIEFsbFRlc3RzKCkgewotCXN1cGVyKCk7Ci0JLyogVGhlIGxvZ2ljYWwgb3JkZXIgdG8gcnVuIHRoZSB0ZXN0cyBpbiBpczoKLQkgKiAtIFNXVCwgU1dURXJyb3IsIFNXVEV4Y2VwdGlvbgotCSAqIC0gRGlzcGxheQotCSAqIC0gZ3JhcGhpY3MgY2xhc3NlcwotCSAqIC0gaXRlbXMgYW5kIENhcmV0LCBldGMKLQkgKiAtIHdpZGdldHMKLQkgKiAtIGRpYWxvZ3MKLQkgKiAtIGxheW91dAotCSAqIC0gY3VzdG9tIHdpZGdldHMKLQkgKiAtIHByaW50aW5nIGFuZCBwcm9ncmFtCi0JICogLSBldmVudHMKLQkgKiAtIGRyYWcgJiBkcm9wCi0JICogLSBhY2Nlc3NpYmlsaXR5Ci0JICogLSBPTEUKLQkgKiAtIGJyb3dzZXIKLQkgKi8KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yLnN1aXRlKCkpOwotCi0JLyogTk9URTogSWYgdGhlIERpc3BsYXkgdGVzdCBzdWl0ZSBpcyBydW4sIGl0IG11c3QgYmUgcnVuCi0JICogYmVmb3JlIGFueSBvdGhlciB0ZXN0cyB0aGF0IG5lZWQgYSBkaXNwbGF5IChpLmUuIGdyYXBoaWNzCi0JICogb3Igd2lkZ2V0IHRlc3RzLCBldGMpLiBPdGhlcndpc2UsIGFuIEludmFsaWRUaHJlYWRBY2Nlc3MKLQkgKiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gZm9yIGVhY2ggRGlzcGxheSB0ZXN0LgotCSAqLwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5LnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0Muc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyLnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS5zdWl0ZSgpKTsKLQkvL2FkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHlwZWRMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudS5zdWl0ZSgpKTsKLQkvL2FkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIuc3VpdGUoKSk7Ci0JCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsLnN1aXRlKCkpOwotCS8vYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRCYXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3Quc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21iby5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RhdGVUaW1lLnN1aXRlKCkpOwotCS8vYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2cuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZpbGVEaWFsb2cuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpcmVjdG9yeURpYWxvZy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTW9uaXRvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dEYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWRMYXlvdXQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRmlsbExheW91dC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dMYXlvdXQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUxheW91dC5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2FzaEZvcm0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVFZGl0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmlld0Zvcm0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckFkYXB0ZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0xhYmVsLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TY3JvbGxlZENvbXBvc2l0ZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UcmVlRWRpdG9yLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyLnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0FkYXB0ZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudC5zdWl0ZSgpKTsKLQkKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50RGlhbG9nLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyLnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9wcm9ncmFtX1Byb2dyYW0uc3VpdGUoKSk7Ci0KLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0ZpbGVUcmFuc2Zlci5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VBZGFwdGVyLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEFkYXB0ZXIuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UZXh0VHJhbnNmZXIuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRE5ELnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0LnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FDQy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUFkYXB0ZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNvbnRyb2xTaXRlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZ1bmN0aW9uRGVzY3JpcHRpb24uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudC5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkFkYXB0ZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3Nlci5UZXN0X0Jyb3dzZXJTdWl0ZS5zdWl0ZSgpKTsKLQotCi19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbFdpZGdldFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbFdpZGdldFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZGQ4ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxXaWRnZXRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciB0ZXN0aW5nIGFsbCBvZiB0aGUgd2lkZ2V0IHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxXaWRnZXRUZXN0cyB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0uc3VpdGUoKSk7Ci0JLy9zdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUuc3VpdGUoKSk7Ci0JLy9zdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyLnN1aXRlKCkpOwotCQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbC5zdWl0ZSgpKTsKLQkvL3N1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbi5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kQmFyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxCYXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Nhc2guc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY2FsZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0Jhci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EYXRlVGltZS5zdWl0ZSgpKTsKLQkvL3N1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyLnN1aXRlKCkpOwotCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2cuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3guc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3Iuc3VpdGUoKSk7Ci0KLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3Muc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21iby5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJBZGFwdGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3Quc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1Quc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5zdWl0ZSgpKTsKLQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQ29uc2lzdGVuY3lVdGlsaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0NvbnNpc3RlbmN5VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDE4ZWJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQ29uc2lzdGVuY3lVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ29uc2lzdGVuY3lVdGlsaXR5IHsKLQotICAgIHN0YXRpYyBIYXNoTWFwIGV2ZW50T3JkZXJpbmcgPSBuZXcgSGFzaE1hcCgpOwotICAgIHN0YXRpYyBIYXNoTWFwIGV2ZW50VHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiRG91YmxlQ2xpY2siLCAJCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIiwgIk1vdXNlRG93biIsICJNb3VzZURvdWJsZUNsaWNrIiwgIkRlZmF1bHRTZWxlY3Rpb24iLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkRyYWdEZXRlY3QiLCAJCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiRHJhZ0RldGVjdCIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiRW50ZXJTZWxlY3Rpb24iLCAJCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOlJldHVybiIsICJLZXlEb3duIiwgIkRlZmF1bHRTZWxlY3Rpb24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJLZXlTZWxlY3Rpb24iLCAJCQluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIktleURvd24iLCAiU2VsZWN0aW9uOiIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIk1lbnVEZXRlY3QiLCAJCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTWVudURldGVjdCIsICJNb3VzZVVwIn0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkJ1dHRvbk1vdXNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDb21ib01vdXNlU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiVmVyaWZ5IiwgIk1vZGlmeSIsICJTZWxlY3Rpb246In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ0NvbWJvTW91c2VTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJNb2RpZnkiLCAiU2VsZWN0aW9uOiJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkV4cGFuZEJhck1vdXNlU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJTZWxlY3Rpb246In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiTGlzdE1vdXNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTYXNoTW91c2VTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uOkRyYWciLCAiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYkZvbGRlck1vdXNlU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlTW91c2VTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRvb2xCYXJNb3VzZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJTZWxlY3Rpb246In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVHJlZU1vdXNlU2VsZWN0aW9uIiwJCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlTW91c2VTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ1RhYkZvbGRlck1vdXNlU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJTZWxlY3Rpb246IiwgIk1vdXNlRG93biIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJMaXN0RG91YmxlQ2xpY2siLCAJCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VEb3duIiwgIk1vdXNlRG91YmxlQ2xpY2siLCAiRGVmYXVsdFNlbGVjdGlvbiIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQnV0dG9uRW50ZXJTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6UmV0dXJuIiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJFeHBhbmRCYXJFbnRlclNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6UmV0dXJuIiwgIlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNDb21ib0VudGVyU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOlJldHVybiIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUb29sQmFyRW50ZXJTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6UmV0dXJuIiwgIlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRyZWVEcmFnRGV0ZWN0IiwgCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJEcmFnRGV0ZWN0IiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVEcmFnRGV0ZWN0IiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIkRyYWdEZXRlY3QiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlTWVudURldGVjdCIsIAkJbmV3IFN0cmluZ1tdIHsiTWVudURldGVjdCIsICJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlTWVudURldGVjdCIsCW5ldyBTdHJpbmdbXSB7Ik1lbnVEZXRlY3QiLCAiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJCdXR0b25TcGFjZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpNbmVtb25pYyIsICJLZXlEb3duIiwgIktleVVwIiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJFeHBhbmRCYXJTcGFjZVNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiU2VsZWN0aW9uOiIsICJUcmF2ZXJzZTpNbmVtb25pYyIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiTGlzdFNwYWNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRvb2xCYXJTcGFjZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJTZWxlY3Rpb246IiwgIlRyYXZlcnNlOk1uZW1vbmljIiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUcmVlU3BhY2VTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uOiIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlU3BhY2VTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiS2V5VXAifSk7IAotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNvbWJvS2V5U2VsZWN0aW9uIiwgCQluZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIlZlcmlmeSIsICJNb2RpZnkiLCAiU2VsZWN0aW9uOiIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNDb21ib0tleVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIk1vZGlmeSIsICJTZWxlY3Rpb246IiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDVGFiRm9sZGVyS2V5U2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6QXJyb3cgTmV4dCIsICJTZWxlY3Rpb246IiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTbGlkZXJLZXlTZWxlY3Rpb24iLAkJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6QXJyb3cgTmV4dCIsICJLZXlEb3duIiwgIlNlbGVjdGlvbjpBcnJvdyBEb3duIiwgIktleVVwIiB9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTbGlkZXJBcnJvd1NlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246QXJyb3cgRG93biIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDb29sQmFyQ2hldnJvbkRyYWdEZXRlY3QiLG5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJEcmFnRGV0ZWN0In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ29vbEJhckNoZXZyb25NZW51RGV0ZWN0IixuZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOkFycm93In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ29vbEJhckNoZXZyb25Nb3VzZVNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjpBcnJvdyIsIH0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNjYWxlVHJvdWdoU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uOiIsICJNb3VzZURvd24iLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTbGlkZXJUcm91Z2hTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOlBhZ2UgRG93biIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNjYWxlVGh1bWJTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJTZWxlY3Rpb246IiwgIk1vdXNlRG93biIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNsaWRlclRodW1iU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjpEcmFnIiwgIk1vdXNlVXAiIH0pOwotCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTaGVsbENsb3NlIiwJCQkJbmV3IFN0cmluZ1tdIHsiQ2xvc2UiLCAiRGlzcG9zZSJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNoZWxsRGlzcG9zZSIsCQkJbmV3IFN0cmluZ1tdIHsiRGlzcG9zZSJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNoZWxsSWNvbmlmeSIsCQkJbmV3IFN0cmluZ1tdIHsiRm9jdXNPdXQiLCAiSWNvbmlmeSIsICJEZWFjdGl2YXRlIiwgIkRlaWNvbmlmeSIsICJBY3RpdmF0ZSIsICJGb2N1c0luIiwgIkFjdGl2YXRlIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2hlbGxPcGVuIiwJCQkJbmV3IFN0cmluZ1tdIHsiQWN0aXZhdGUiLCAiRm9jdXNJbiIsICJTaG93In0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYkZvbGRlclBnZHduU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIlRyYXZlcnNlOlBhZ2UgTmV4dCIsICJTZWxlY3Rpb246IiwgIktleVVwIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFiRm9sZGVyUGd1cFNlbGVjdGlvbiIsIG5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiVHJhdmVyc2U6UGFnZSBQcmV2aW91cyIsICJTZWxlY3Rpb246IiwgIktleVVwIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ1RhYkZvbGRlclBnZHduU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIlNlbGVjdGlvbjoiLCAiVHJhdmVyc2U6Tm9uZSIsICJLZXlVcCIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNUYWJGb2xkZXJQZ3VwU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIlNlbGVjdGlvbjoiLCAiVHJhdmVyc2U6Tm9uZSIsICJLZXlVcCIsICJLZXlVcCJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTdHlsZWRUZXh0TW9kaWZ5IiwJCW5ldyBTdHJpbmdbXSB7IlZlcmlmeSIsICJNb2RpZnkiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRleHRNb2RpZnkiLAkJCQluZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIlZlcmlmeSIsICJNb2RpZnkiLCAiS2V5VXAifSk7CQkKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRyZWVLZXlFeHBhbmQiLCAJCQluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIktleURvd24iLCAiRXhwYW5kIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVHJlZU1vdXNlRXhwYW5kIiwgCQluZXcgU3RyaW5nW10geyJFeHBhbmQiLCAiTW91c2VEb3duIiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVLZXlFeHBhbmQiLCAJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6QXJyb3cgTmV4dCIsICJFeHBhbmQiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlVHJlZU1vdXNlRXhwYW5kIiwgCW5ldyBTdHJpbmdbXSB7IkV4cGFuZCIsICJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIn0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlVHJlZVRhYmxlIiwgCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJNb3VzZURvdWJsZUNsaWNrIiwgIktleURvd24iLCAiS2V5VXAiLCAiTWVudURldGVjdCIsICJEcmFnRGV0ZWN0IiwgIlRyYXZlcnNlIn0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk5vbmUiLCBuZXcgSW50ZWdlcihTV1QuTm9uZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiS2V5RG93biIsIG5ldyBJbnRlZ2VyKFNXVC5LZXlEb3duKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJLZXlVcCIsIG5ldyBJbnRlZ2VyKFNXVC5LZXlVcCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW91c2VEb3duIiwgbmV3IEludGVnZXIoU1dULk1vdXNlRG93bikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW91c2VVcCIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZVVwKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZU1vdmUiLCBuZXcgSW50ZWdlcihTV1QuTW91c2VNb3ZlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZUVudGVyIiwgbmV3IEludGVnZXIoU1dULk1vdXNlRW50ZXIpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlRXhpdCIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZUV4aXQpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlRG91YmxlQ2xpY2siLCBuZXcgSW50ZWdlcihTV1QuTW91c2VEb3VibGVDbGljaykpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiUGFpbnQiLCBuZXcgSW50ZWdlcihTV1QuUGFpbnQpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdmUiLCBuZXcgSW50ZWdlcihTV1QuTW92ZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiUmVzaXplIiwgbmV3IEludGVnZXIoU1dULlJlc2l6ZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRGlzcG9zZSIsIG5ldyBJbnRlZ2VyKFNXVC5EaXNwb3NlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJTZWxlY3Rpb24iLCBuZXcgSW50ZWdlcihTV1QuU2VsZWN0aW9uKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJEZWZhdWx0U2VsZWN0aW9uIiwgbmV3IEludGVnZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkZvY3VzSW4iLCBuZXcgSW50ZWdlcihTV1QuRm9jdXNJbikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRm9jdXNPdXQiLCBuZXcgSW50ZWdlcihTV1QuRm9jdXNPdXQpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkV4cGFuZCIsIG5ldyBJbnRlZ2VyKFNXVC5FeHBhbmQpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkNvbGxhcHNlIiwgbmV3IEludGVnZXIoU1dULkNvbGxhcHNlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJJY29uaWZ5IiwgbmV3IEludGVnZXIoU1dULkljb25pZnkpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkRlaWNvbmlmeSIsIG5ldyBJbnRlZ2VyKFNXVC5EZWljb25pZnkpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkNsb3NlIiwgbmV3IEludGVnZXIoU1dULkNsb3NlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJTaG93IiwgbmV3IEludGVnZXIoU1dULlNob3cpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkhpZGUiLCBuZXcgSW50ZWdlcihTV1QuSGlkZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW9kaWZ5IiwgbmV3IEludGVnZXIoU1dULk1vZGlmeSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiVmVyaWZ5IiwgbmV3IEludGVnZXIoU1dULlZlcmlmeSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiQWN0aXZhdGUiLCBuZXcgSW50ZWdlcihTV1QuQWN0aXZhdGUpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkRlYWN0aXZhdGUiLCBuZXcgSW50ZWdlcihTV1QuRGVhY3RpdmF0ZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiSGVscCIsIG5ldyBJbnRlZ2VyKFNXVC5IZWxwKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJEcmFnRGV0ZWN0IiwgbmV3IEludGVnZXIoU1dULkRyYWdEZXRlY3QpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkFybSIsIG5ldyBJbnRlZ2VyKFNXVC5Bcm0pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIlRyYXZlcnNlIiwgbmV3IEludGVnZXIoU1dULlRyYXZlcnNlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZUhvdmVyIiwgbmV3IEludGVnZXIoU1dULk1vdXNlSG92ZXIpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkhhcmRLZXlEb3duIiwgbmV3IEludGVnZXIoU1dULkhhcmRLZXlEb3duKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJIYXJkS2V5VXAiLCBuZXcgSW50ZWdlcihTV1QuSGFyZEtleVVwKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNZW51RGV0ZWN0IiwgbmV3IEludGVnZXIoU1dULk1lbnVEZXRlY3QpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIlNldERhdGEiLCBuZXcgSW50ZWdlcihTV1QuU2V0RGF0YSkpOwotICAgIH0KLSAKLSAgICBzdGF0aWMgU3RyaW5nW10gZXZlbnROYW1lcyA9IHsKLQkJIk5vbmUiLCAJCQkiS2V5RG93biIsIAkJIktleVVwIiwgCQkJIk1vdXNlRG93biIsIAotCQkiTW91c2VVcCIsCQkJIk1vdXNlTW92ZSIsCSJNb3VzZUVudGVyIiwJCSJNb3VzZUV4aXQiLAotCQkiTW91c2VEb3VibGVDbGljayIsCSJQYWludCIsCQkiTW92ZSIsCQkJCSJSZXNpemUiLAotCQkiRGlzcG9zZSIsCQkJIlNlbGVjdGlvbiIsCSJEZWZhdWx0U2VsZWN0aW9uIiwJIkZvY3VzSW4iLAotCQkiRm9jdXNPdXQiLAkJCSJFeHBhbmQiLAkJIkNvbGxhcHNlIiwJCQkiSWNvbmlmeSIsCi0JCSJEZWljb25pZnkiLAkJIkNsb3NlIiwJCSJTaG93IiwJCQkJIkhpZGUiLAotCQkiTW9kaWZ5IiwJCQkiVmVyaWZ5IiwJCSJBY3RpdmF0ZSIsCQkJIkRlYWN0aXZhdGUiLAotCQkiSGVscCIsCQkJCSJEcmFnRGV0ZWN0IiwJIkFybSIsCQkJCSJUcmF2ZXJzZSIsCi0JCSJNb3VzZUhvdmVyIiwJCSJIYXJkS2V5RG93biIsCSJIYXJkS2V5VXAiLAkJIk1lbnVEZXRlY3QiLAotCQkiU2V0RGF0YSJ9OwotICAgIAotICAgIHN0YXRpYyBpbnRbXSBjb252ZXJ0RXZlbnROYW1lcyhTdHJpbmdbXSBvcmlnTmFtZXMpIHsKLSAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW29yaWdOYW1lcy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdOYW1lcywgMCwgbmFtZXMsIDAsIG9yaWdOYW1lcy5sZW5ndGgpOwotICAgICAgICBuYW1lcyA9IHJlbW92ZUR1cGxpY2F0ZXMobmFtZXMpOwotICAgICAgICBpbnRbXSB0eXBlcyA9IG5ldyBpbnRbbmFtZXMubGVuZ3RoXTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8bmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHR5cGVzW2ldID0gKChJbnRlZ2VyKWV2ZW50VHlwZXMuZ2V0KG5hbWVzW2ldKSkuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZXM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHJlbW92ZUR1cGxpY2F0ZXMoU3RyaW5nW10gbmFtZXMpIHsKLSAgICAgICAgaW50IGR1cHM9MDsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8bmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IG5hbWVzW2ldLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmKGluZGV4ICE9IC0xKQotICAgICAgICAgICAgICAgIG5hbWVzW2ldID0gbmFtZXNbaV0uc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgIGZvcihpbnQgaj0wOyBqPGk7IGorKykgewotICAgICAgICAgICAgICAgIGlmKG5hbWVzW2ldLmVxdWFscyhuYW1lc1tqXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGludCBrPWkrMTsgazxuYW1lcy5sZW5ndGg7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNbay0xXSA9IG5hbWVzW2tdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzW25hbWVzLmxlbmd0aC0xXSA9ICJkdXBsaWNhdGUiKyBkdXBzOwotICAgICAgICAgICAgICAgICAgICBkdXBzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIHRlbXAgPSBuZXcgU3RyaW5nW25hbWVzLmxlbmd0aC1kdXBzXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lcywgMCwgdGVtcCwgMCwgbmFtZXMubGVuZ3RoLWR1cHMpOwotICAgICAgICByZXR1cm4gdGVtcDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzZWxlY3Rpb25UeXBlcyA9IHsKLSAgICAgICAgIkRyYWciLCAJCSJIb21lIiwgIAkJCSJFbmQiLCAJCQkJIkFycm93IERvd24iLCAKLSAgICAgICAgIkFycm93IFVwIiwgCSJQYWdlIERvd24iLCAJCSJQYWdlIFVwIiwgCQkJIkNoZWNrIiwgCQotICAgICAgICAiQXJyb3ciLCAgICAgCi0gICAgfTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGludFtdIFtdIHNlbGVjdGlvbkNvbnZlcnNpb24gPSB7Ci0gICAgICAgIHtTV1QuRFJBRywgMH0sCi0gICAgICAgIHtTV1QuSE9NRSwgMX0sCi0gICAgICAgIHtTV1QuRU5ELCAyfSwKLSAgICAgICAge1NXVC5BUlJPV19ET1dOLCAzfSwKLSAgICAgICAge1NXVC5BUlJPV19VUCwgNH0sCi0gICAgICAgIHtTV1QuUEFHRV9ET1dOLCA1fSwKLSAgICAgICAge1NXVC5QQUdFX1VQLCA2fSwKLSAgICAgICAge1NXVC5DSEVDSywgN30sCi0gICAgICAgIHtTV1QuQVJST1csIDh9LAotICAgIH07Ci0gICAgCi0gICAgc3RhdGljIFN0cmluZyBnZXRTZWxlY3Rpb25UeXBlKGludCB0eXBlKSB7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPHNlbGVjdGlvbkNvbnZlcnNpb24ubGVuZ3RoO2krKykgewotICAgICAgICAgICAgaWYodHlwZSA9PSBzZWxlY3Rpb25Db252ZXJzaW9uW2ldWzBdKSAKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uVHlwZXNbc2VsZWN0aW9uQ29udmVyc2lvbltpXVsxXV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU3RyaW5nW10gdHJhdmVyc2FsVHlwZXMgPSB7Ci0gICAgCSAgICAiTm9uZSIsIAkJIkVzY2FwZSIsIAkJCSJSZXR1cm4iLCAJCQkiVGFiIFByZXZpb3VzIiwgCi0gICAgCSAgICAiVGFiIE5leHQiLCAJIkFycm93IFByZXZpb3VzIiwJIkFycm93IE5leHQiLCAJCSJNbmVtb25pYyIsIAotICAgIAkgICAgIlBhZ2UgUHJldmlvdXMiLCAiUGFnZSBOZXh0In07Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldFRyYXZlcnNhbFR5cGUoaW50IHR5cGUpIHsKLSAgICAgICAgaW50IHBvdyA9IDA7Ci0gICAgICAgIGlmKHR5cGUgIT0gMCkKLSAgICAgICAgICAgIHBvdyA9KGludCkoTWF0aC5sb2codHlwZSkvTWF0aC5sb2coMikpOwotICAgICAgICByZXR1cm4gdHJhdmVyc2FsVHlwZXNbcG93XTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0hFTExfSUNPTklGWSA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBLRVlfUFJFU1MgPSAxMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IERPVUJMRV9LRVlfUFJFU1MgPSAyMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1PVVNFX0NMSUNLID0gMzA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNT1VTRV9ET1VCTEVDTElDSyA9IDQwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9VU0VfRFJBRyA9IDUwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OID0gNjA7Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIGludCBFU0NBUEVfTUVOVSA9IDE7Ci0gICAgCi0gICAgCi0gICAgLy9wb3N0cyBhIGNsaWNrIGF0IGRpc3BsYXkgbWFwcGVkIHggYW5kIHkgd2l0aCBidXR0b24gYnV0dG9uCi0gICAgc3RhdGljIGJvb2xlYW4gcG9zdENsaWNrKERpc3BsYXkgZGlzcGxheSwgaW50IHgsIGludCB5LCBpbnQgYnV0dG9uKSB7Ci0gICAgICAgIEV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VNb3ZlOwotICAgICAgICBldmVudC54ID0geDsKLSAgICAgICAgZXZlbnQueSA9IHk7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZU1vdmUgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULk1vdXNlRG93bjsKLSAgICAgICAgZXZlbnQuYnV0dG9uID0gYnV0dG9uOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZURvd24gbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VVcDsKLSAgICAgICAgZXZlbnQuYnV0dG9uID0gYnV0dG9uOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZVVwIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIC8vVE9ETzogcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIHRvIGhhdmUgYSBtb3VzZWRvd24gYW5kIG5vIG1vdXNldXAKLSAgICAgICAgICAgIC8vZm9yY2UgdGhlIGlzc3VlPwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0vLwkgIAl0cnkgewotLy8JICAgICAgICBUaHJlYWQuc2xlZXAoMTYwMCk7CQotLy8JICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHt9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0Q2xpY2soRGlzcGxheSBkaXNwbGF5LCBQb2ludCBwdCwgaW50IGJ1dHRvbikgewotICAgICAgICByZXR1cm4gcG9zdENsaWNrKGRpc3BsYXksIHB0LngsIHB0LnksIGJ1dHRvbik7Ci0gICAgfQotICAgIAotICAgIC8vZG91YmxlY2xpY2tzIGF0IGRpc3BsYXkgbWFwcGVkIHB0IHdpdGggYnV0dG9uIGJ1dHRvbgotICAgIHN0YXRpYyBib29sZWFuIHBvc3REb3VibGVDbGljayhEaXNwbGF5IGRpc3BsYXksIFBvaW50IHB0LCBpbnQgYnV0dG9uKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gcG9zdENsaWNrKGRpc3BsYXksIHB0LCBidXR0b24pOwotICAgICAgICByZXQgJj0gcG9zdENsaWNrKGRpc3BsYXksIHB0LCBidXR0b24pOwotLy8JICAJdHJ5IHsKLS8vCSAgICAgICAgVGhyZWFkLnNsZWVwKDE2MDApOwkKLS8vCSAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7fQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICAKLSAgICAvL3Bvc3QgYSBrZXkgcHJlc3MgCi0gICAgc3RhdGljIGJvb2xlYW4gcG9zdEtleVByZXNzKERpc3BsYXkgZGlzcGxheSwgaW50IGNoLCBpbnQga2V5Y29kZSkgewotICAgICAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULktleURvd247Ci0gICAgICAgIGV2ZW50LmNoYXJhY3RlciA9IChjaGFyKWNoOwotICAgICAgICBldmVudC5rZXlDb2RlID0ga2V5Y29kZTsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2V5RG93biBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLSAgICAgICAgZXZlbnQuY2hhcmFjdGVyID0gKGNoYXIpY2g7Ci0gICAgICAgIGV2ZW50LmtleUNvZGUgPSBrZXljb2RlOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJLZXlVcCBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICAvL1RPRE86IHBvdGVudGlhbGx5IGRhbmdlcm91cyB0byBoYXZlIGEga2V5ZG93biBhbmQgbm8ga2V5dXAKLSAgICAgICAgICAgIC8vZm9yY2UgdGhlIGlzc3VlPwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvL3Bvc3QgcHJlc3NpbmcgYW5kIGhvbGRpbmcgY2gxL2tleWNvZGUxIGFuZCB0aGVuIHByZXNzaW5nIGNoMi9rZXljb2RlMgotICAgIHN0YXRpYyBib29sZWFuIHBvc3REb3VibGVLZXlQcmVzcyhEaXNwbGF5IGRpc3BsYXksIGludCBjaDEsIGludCBrZXljb2RlMSwgCi0gICAgICAgICAgICAJCQkJCQkgIGludCBjaDIsIGludCBrZXljb2RlMikgewotICAgICAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULktleURvd247Ci0gICAgICAgIGV2ZW50LmNoYXJhY3RlciA9IChjaGFyKWNoMTsKLSAgICAgICAgZXZlbnQua2V5Q29kZSA9IGtleWNvZGUxOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJLZXlEb3duIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBwb3N0S2V5UHJlc3MoZGlzcGxheSwgY2gyLCBrZXljb2RlMik7Ci0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuS2V5VXA7Ci0gICAgICAgIGV2ZW50LmNoYXJhY3RlciA9IChjaGFyKWNoMTsKLSAgICAgICAgZXZlbnQua2V5Q29kZSA9IGtleWNvZGUxOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJLZXlVcCBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICAvL1RPRE86IHBvdGVudGlhbGx5IGRhbmdlcm91cyB0byBoYXZlIGEga2V5ZG93biBhbmQgbm8ga2V5dXAKLSAgICAgICAgICAgIC8vZm9yY2UgdGhlIGlzc3VlPwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvL3Bvc3RzIGEgZHJhZyBmcm9tIGRpc3BsYXkgbWFwcGVkIG9yaWdpbiB0byBkZXN0aW5hdGlvbgotICAgIC8vdGhlIGJ1dHRvbiB0byBkcmFnIHdpdGggaXMgc3lzdGVtIGRlcGVuZGVudAotICAgIHN0YXRpYyBib29sZWFuIHBvc3REcmFnKERpc3BsYXkgZGlzcGxheSwgUG9pbnQgb3JpZ2luLCBQb2ludCBkZXN0aW5hdGlvbikgewotICAgICAgICBpbnQgYnV0dG9uID0gZGV0ZXJtaW5lRHJhZygpOwotICAgICAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULk1vdXNlTW92ZTsKLSAgICAgICAgZXZlbnQueCA9IG9yaWdpbi54OwotICAgICAgICBldmVudC55ID0gb3JpZ2luLnk7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZU1vdmUgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULk1vdXNlRG93bjsKLSAgICAgICAgZXZlbnQuYnV0dG9uID0gYnV0dG9uOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZURvd24gbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULk1vdXNlTW92ZTsKLSAgICAgICAgZXZlbnQueCA9IGRlc3RpbmF0aW9uLng7Ci0gICAgICAgIGV2ZW50LnkgPSBkZXN0aW5hdGlvbi55OwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTW91c2VNb3ZlIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VVcDsKLSAgICAgICAgZXZlbnQuYnV0dG9uID0gYnV0dG9uOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZVVwIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIC8vVE9ETzogcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIHRvIGhhdmUgYSBtb3VzZWRvd24gYW5kIG5vIG1vdXNldXAKLSAgICAgICAgICAgIC8vZm9yY2UgdGhlIGlzc3VlPwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vZGV0ZXJtaW5lcyB3aGljaCBidXR0b24gdG8gZHJhZyB3aXRoCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGRldGVybWluZURyYWcoKSB7Ci0gICAgICAgIGlmKFN3dEp1bml0LmlzV2luZG93cyB8fCBTd3RKdW5pdC5pc0NhcmJvbiB8fCBTd3RKdW5pdC5pc0dUSykKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgCi0gICAgLy9wb3N0cyBhIHNlbGVjdGlvbiBpZSBjbGlja3Mgb24gcHQxLCB0aGVuIGNsaWNrIG9uIHB0MiAoZm9yIGV4YW1wbGUsIHNlbGVjdGluZwotICAgIC8vb25lIG9mIHRoZSBvcHRpb25zIGluIGEgY29tYm8gYnkgZHJvcHBpbmcgZG93biB0aGUgbGlzdCkKLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0U2VsZWN0aW9uKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgUG9pbnQgcHQxLCBQb2ludCBwdDIpIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBwb3N0Q2xpY2soZGlzcGxheSwgcHQxLCAxKTsKLSAgICAgICAgZGlzcGxheS5zeW5jRXhlYyhuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGRpc3BsYXkudXBkYXRlKCk7Ci0gICAgICAgIH19KTsKLSAgICAgICAgcmV0ICY9IHBvc3RDbGljayhkaXNwbGF5LCBwdDIsIDEpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8vaWNvbmlmaWVzIHRoZSBzaGVsbC4gcHQgaXMgYSBzeXN0ZW0gZGVwZW5kZW50IHBvaW50IG9uIHRoZSBzaGVsbC4KLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0U2hlbGxJY29uaWZ5KERpc3BsYXkgZGlzcGxheSwgUG9pbnQgcHQsIGludCBidXR0b24pIHsKLSAgICAgICAgaW50IHggPSBwdC54OwotICAgICAgICBpbnQgeSA9IHB0LnkgLSAxMDsKLSAgICAgICAgaWYoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0gICAgICAgICAgICB4ICs9IC0zNTsKLSAgICAgICAgfSBlbHNlIGlmKFN3dEp1bml0LmlzTGludXgpIHsKLSAgICAgICAgCXggKz0gLTE2OwotICAgICAgICB9IGVsc2UgaWYgKFN3dEp1bml0LmlzQ2FyYm9uKSB7Ci0gICAgICAgIAl4ICs9IDMwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3N0Q2xpY2soZGlzcGxheSwgeCwgeSwgYnV0dG9uKTsgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9FbXVsYXRlZFdpZGdldHNUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9FbXVsYXRlZFdpZGdldHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2JmMzI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvRW11bGF0ZWRXaWRnZXRzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciB0ZXN0aW5nIHdpZGdldHMgdGhhdCBoYXZlIGJlZW4gZW11bGF0ZWQgb24gTW90aWYuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbXVsYXRlZFdpZGdldHNUZXN0cyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nLnN1aXRlKCkpOwkKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbi5zdWl0ZSgpKTsJCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtLnN1aXRlKCkpOwotCQkKLQlyZXR1cm4gc3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N0eWxlZFRleHRDb250ZW50U3BlYy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9TdHlsZWRUZXh0Q29udGVudFNwZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0MjFlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N0eWxlZFRleHRDb250ZW50U3BlYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLS8qKgotICogVXNlIHRoaXMgdGVzdCBjbGFzcyB0byB2YWxpZGF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3R5bGVkVGV4dENvbnRlbnQKLSAqIGludGVyZmFjZS4gIFRvIHBlcmZvcm0gdGhlIHZhbGlkYXRpb24sIGNvcHkgdGhpcyBjbGFzcyB0byB0aGUgcGFja2FnZSB3aGVyZSAKLSAqIHlvdXIgU3R5bGVkVGV4dENvbnRlbnQgaW1wbGVtZW50YXRpb24gbGl2ZXMuICBUaGVuIHNwZWNpZnkgdGhlIGZ1bGx5IHF1YWxpZmllZAotICogbmFtZSBvZiB5b3VyIFN0eWxlZFRleHRDb250ZW50IGNsYXNzIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBtYWluIG1ldGhvZCBvZiB0aGlzIAotICogY2xhc3MuIAotICogCi0gKiBOT1RFOiAgVGhpcyB0ZXN0IGNsYXNzIGFzc3VtZXMgdGhhdCB5b3VyIFN0eWxlZFRleHRDb250ZW50IGltcGxlbWVudGF0aW9uIAotICogaGFuZGxlcyB0aGUgZm9sbG93aW5nIGRlbGltaXRlcnM6Ci0gKiAKLSAqIAkJL3IKLSAqIAkJL24KLSAqIAkJL3IvbgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1wdWJsaWMgY2xhc3MgU3R5bGVkVGV4dENvbnRlbnRTcGVjIGltcGxlbWVudHMgVGV4dENoYW5nZUxpc3RlbmVyIHsKLQlzdGF0aWMgU3RyaW5nIGNvbnRlbnRDbGFzc05hbWU7Ci0Jc3RhdGljIGludCBmYWlsQ291bnQgPSAwOwotCXN0YXRpYyBpbnQgZXJyb3JDb3VudCA9IDA7Ci0JQ2xhc3MgY29udGVudENsYXNzID0gbnVsbDsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50SW5zdGFuY2UgPSBudWxsOwotCWludCB2ZXJpZnkgPSAwOwotCU1ldGhvZCBjdXJyZW50TWV0aG9kID0gbnVsbDsKLQlib29sZWFuIGZhaWxlZCA9IGZhbHNlOwotCVN0eWxlZFRleHQgd2lkZ2V0ID0gbnVsbDsKLQlTaGVsbCBzaGVsbCA9IG51bGw7Ci0JCi1wdWJsaWMgU3R5bGVkVGV4dENvbnRlbnRTcGVjKCkgewotfQotcHVibGljIHZvaWQgYXNzZXJ0VHJ1ZShTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiBjb25kaXRpb24pIHsKLQlTeXN0ZW0ub3V0LnByaW50KCJcdCIgKyBjdXJyZW50TWV0aG9kLmdldE5hbWUoKSArICIgIiArIG1lc3NhZ2UpOwotCWlmICghY29uZGl0aW9uKSAKLQkJZmFpbChtZXNzYWdlKTsKLQllbHNlIAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBwYXNzZWQiKTsKLX0KLXB1YmxpYyB2b2lkIGZhaWwoU3RyaW5nIG1lc3NhZ2UpIHsKLQlmYWlsZWQgPSB0cnVlOwotCVN5c3RlbS5vdXQucHJpbnRsbigiIEZBSUxFRDogIiArIG1lc3NhZ2UpOwotCWZhaWxDb3VudCsrOwotfQotcHVibGljIFN0eWxlZFRleHRDb250ZW50IGdldENvbnRlbnRJbnN0YW5jZSgpIHsKLQljb250ZW50SW5zdGFuY2Uuc2V0VGV4dCgiIik7Ci0Jd2lkZ2V0LnNldENvbnRlbnQoY29udGVudEluc3RhbmNlKTsKLQlyZXR1cm4gY29udGVudEluc3RhbmNlOwotfQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdFRleHQoKSB7Ci0JcmV0dXJuIAotCQkiVGhpcyBpcyB0aGUgZmlyc3QgbGluZS5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBzZWNvbmQgbGluZS5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSB0aGlyZCBsaW5lLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZvdXJ0aCBsaW5lLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZpZnRoIGxpbmUuXHJcbiIgKwotCQkiXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZmlyc3QgbGluZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBzZWNvbmQgbGluZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSB0aGlyZCBsaW5lIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZvdXJ0aCBsaW5lIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZpZnRoIGxpbmUgYWdhaW4uXHJcbiIgKwotCQkiXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZmlyc3QgbGluZSBvbmNlIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIHNlY29uZCBsaW5lIG9uY2UgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgdGhpcmQgbGluZSBvbmNlIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZvdXJ0aCBsaW5lIG9uY2UgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZmlmdGggbGluZSBvbmNlIGFnYWluLiI7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnRTcGVjIHNwZWMgPSBuZXcgU3R5bGVkVGV4dENvbnRlbnRTcGVjKCk7Ci0JaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotCQljb250ZW50Q2xhc3NOYW1lID0gYXJnc1swXTsKLQl9IGVsc2UgewotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5JQ09OX0VSUk9SKTsKLQkJYm94LnNldE1lc3NhZ2UoIkNvbnRlbnQgY2xhc3MgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYW4gZXhlY3V0aW9uIGFyZ3VtZW50LiIpOyAvLyROT04tTkxTLTEkCi0JCWJveC5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci0Jc3BlYy5ydW4oKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oZmFpbENvdW50ICsgIiBURVNUIEZBSUxVUkVTLiIpOwotCVN5c3RlbS5vdXQucHJpbnRsbihlcnJvckNvdW50ICsgIiBVTkVYUEVDVEVEIEVSUk9SUy4iKTsKLX0KLXB1YmxpYyB2b2lkIHJ1bigpIHsKLQlpZiAoY29udGVudENsYXNzTmFtZS5lcXVhbHMoIiIpKSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULklDT05fRVJST1IpOwotCQlib3guc2V0TWVzc2FnZSgiQ29udGVudCBjbGFzcyBtdXN0IGJlIHNwZWNpZmllZCBhcyBhbiBleGVjdXRpb24gYXJndW1lbnQuIik7IC8vJE5PTi1OTFMtMSQKLQkJYm94Lm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoY29udGVudENsYXNzID09IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWNvbnRlbnRDbGFzcyA9IENsYXNzLmZvck5hbWUoY29udGVudENsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuSUNPTl9FUlJPUik7Ci0JCQlib3guc2V0TWVzc2FnZSgiQ29udGVudCBjbGFzczpcbiIgKyBjb250ZW50Q2xhc3NOYW1lICsgIlxubm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJveC5vcGVuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JdHJ5IHsKLQkJY29udGVudEluc3RhbmNlID0gKFN0eWxlZFRleHRDb250ZW50KWNvbnRlbnRDbGFzcy5uZXdJbnN0YW5jZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5JQ09OX0VSUk9SKTsKLQkJYm94LnNldE1lc3NhZ2UoIlVuYWJsZSB0byBhY2Nlc3MgY29udGVudCBjbGFzczpcbiIgKyBjb250ZW50Q2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlib3gub3BlbigpOwotCQlyZXR1cm47Ci0JfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULklDT05fRVJST1IpOwotCQlib3guc2V0TWVzc2FnZSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGNvbnRlbnQgY2xhc3M6XG4iICsgY29udGVudENsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJYm94Lm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQlDbGFzcyBjbGF6ejsKLQljbGF6eiA9IHRoaXMuZ2V0Q2xhc3MoKTsKLQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JZm9yIChpbnQgaT0wOyBpPG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJc2V0VXAoKTsKLQkJY3VycmVudE1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWZhaWxlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKGN1cnJlbnRNZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInRlc3RfIikpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY3VycmVudE1ldGhvZC5nZXROYW1lKCkgKyAiLi4uIik7Ci0JCQkJY3VycmVudE1ldGhvZC5pbnZva2UodGhpcywgbmV3IE9iamVjdFswXSk7Ci0JCQkJaWYgKCFmYWlsZWQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQQVNTRUQuIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJGQUlMRUQiKTsKLQkJCQl9Ci0JCQl9IAotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIGN1cnJlbnRNZXRob2QuZ2V0TmFtZSgpICsgIiBFUlJPUiA9PT4gIiArIGV4LmdldFRhcmdldEV4Y2VwdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGQUlMRUQiKTsKLQkJCWVycm9yQ291bnQrKzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIGN1cnJlbnRNZXRob2QuZ2V0TmFtZSgpICsgIiBFUlJPUiA9PT4gIiArIGV4LnRvU3RyaW5nKCkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGQUlMRUQiKTsKLQkJCWVycm9yQ291bnQrKzsKLQkJfQotCQlpZiAodmVyaWZ5ICE9IDApIHsKLQkJCXZlcmlmeSA9IDA7Ci0JCQljb250ZW50SW5zdGFuY2UucmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXRlYXJEb3duKCk7Ci0JfQotfQotcHVibGljIHZvaWQgdGV4dFNldChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci19Ci1wdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci19Ci1wdWJsaWMgdm9pZCB0ZXh0Q2hhbmdpbmcoVGV4dENoYW5naW5nRXZlbnQgZXZlbnQpIHsKLQlzd2l0Y2ggKHZlcmlmeSkgewotCQljYXNlIDEgOiB7Ci0JCQlhc3NlcnRUcnVlKCI6MWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjoxYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDIgOiB7Ci0JCQlhc3NlcnRUcnVlKCI6MmE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAyKTsKLQkJCWFzc2VydFRydWUoIjoyYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDMgOiB7Ci0JCQlhc3NlcnRUcnVlKCI6M2E6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjozYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDQ6IHsKLQkJCWFzc2VydFRydWUoIjo0OiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgNSA6IHsKLQkJCWFzc2VydFRydWUoIjo1YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjViOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgNiA6IHsKLQkJCWFzc2VydFRydWUoIjo2YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJYXNzZXJ0VHJ1ZSgiOjZiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgOCA6IHsKLQkJCWFzc2VydFRydWUoIjo4YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJYXNzZXJ0VHJ1ZSgiOjhiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgOSA6IHsKLQkJCWFzc2VydFRydWUoIjo5YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJYXNzZXJ0VHJ1ZSgiOjliOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTA6ewotCQkJYXNzZXJ0VHJ1ZSgiOjEwOiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTE6IHsKLQkJCWFzc2VydFRydWUoIjoxMToiLCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDEyOiB7Ci0JCQlhc3NlcnRUcnVlKCI6MTJhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQlhc3NlcnRUcnVlKCI6MTJiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTM6IHsKLQkJCWFzc2VydFRydWUoIjoxM2E6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjoxM2I6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxNDogewotCQkJYXNzZXJ0VHJ1ZSgiOjE0OiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTU6IHsKLQkJCWFzc2VydFRydWUoIjoxNWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCWFzc2VydFRydWUoIjoxNWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxNjp7Ci0JCQlhc3NlcnRUcnVlKCI6MTY6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxNzogewotCQkJYXNzZXJ0VHJ1ZSgiOjE3OiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTg6IHsKLQkJCWFzc2VydFRydWUoIjoxOGE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjoxOGI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxOTogewotCQkJYXNzZXJ0VHJ1ZSgiOjE5YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjE5YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMyk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDIwOiB7Ci0JCQlhc3NlcnRUcnVlKCI6MjA6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X0luc2VydCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JU3RyaW5nIG5ld1RleHQ7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAidGVzdFxuICIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgbmV3VGV4dC5lcXVhbHMoInRlc3RcbiBUaGlzXG5pcyBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygidGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIFRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MWY6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAwLCAiKioqICIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbioqKiBpcyBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiKioqIGlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MmU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcclxuTGluZSAyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcciIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgbmV3VGV4dC5lcXVhbHMoIlxyTGluZSAxXHJcbkxpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIkxpbmUgMiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoOSwgMCwgIlxyIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozZjoiLCBuZXdUZXh0LmVxdWFscygiXHJMaW5lIDFcclxuXHJMaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNnOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNoOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2k6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjozajoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNrOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIkxpbmUgMiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0YToiLCBuZXdUZXh0LmVxdWFscygiXG5UaGlzXG5pcyBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRmOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIiIpKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDcsIDAsICJcclxubmV3TGluZSIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbmlzXHJcbm5ld0xpbmUgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlzIikpOwotCWFzc2VydFRydWUoIjo1ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJuZXdMaW5lIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NWY6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlRoaXNcbmlzXHJcbm5ld0xpbmUgYSB0ZXN0XHIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5pc1xyXG5uZXdMaW5lIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjo2YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDQpOwotCWFzc2VydFRydWUoIjo2YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjo2ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpcyIpKTsKLQlhc3NlcnRUcnVlKCI6NmU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygibmV3TGluZSBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZmOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIiIpKTsKLQotCS8vIGluc2VydCBhdCBlbmQKLQljb250ZW50LnNldFRleHQoIlRoaXMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNCwgMCwgIlxuICIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6N2E6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbiAiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjdjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiAiKSk7Ci0JY29udGVudC5zZXRUZXh0KCJUaGlzXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo3ZToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuXG4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdmOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjdnOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdoOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6N2k6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JLy8gaW5zZXJ0IGF0IGJlZ2lubmluZwotCWNvbnRlbnQuc2V0VGV4dCgiVGhpcyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhhOiIsIG5ld1RleHQuZXF1YWxzKCJcblRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjhjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6OGQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiVGhpcyIpKTsKLQotCS8vIGluc2VydCB0ZXh0Ci0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAwLCAiKioqICIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6OWE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbioqKiBpcyBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6OWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6OWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6OWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiKioqIGlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6OWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDAsICJsaW5lIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxMGE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbmxpbmUiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjoxMGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MTBkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImxpbmUiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg4KSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTBmOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDkpID09IDEpOwotCi0JLy8gaW5zZXJ0IGF0IGJlZ2lubmluZyAKLQljb250ZW50LnNldFRleHQoIlRoaXNcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAibGluZVxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxMWE6IiwgbmV3VGV4dC5lcXVhbHMoImxpbmVcblRoaXNcbiIpKTsKLQlhc3NlcnRUcnVlKCI6MTFiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjExYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJsaW5lIikpOwotCWFzc2VydFRydWUoIjoxMWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MTFlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDUpID09IDEpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcclxuTGluZSAyXHJcbkxpbmUgMyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXHIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyYToiLCBuZXdUZXh0LmVxdWFscygiXHJMaW5lIDFcclxuTGluZSAyXHJcbkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6MTJiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJMaW5lIDMiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxuTGluZSAyXG5MaW5lIDMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNywgMCwgIkxpbmUxYVxuTGluZTFiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzYToiLCBuZXdUZXh0LmVxdWFscygiTGluZSAxXG5MaW5lMWFcbkxpbmUxYlxuTGluZSAyXG5MaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDUpOwotCWFzc2VydFRydWUoIjoxM2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjoxM2Q6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZTFhIikpOwotCWFzc2VydFRydWUoIjoxM2U6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTGluZTFiIikpOwotCWFzc2VydFRydWUoIjoxM2Y6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiTGluZSAyIikpOwotCWFzc2VydFRydWUoIjoxM2c6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygiTGluZSAzIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcbkxpbmUgMlxuTGluZSAzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDExLCAwLCAibDFhIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxNGE6IiwgbmV3VGV4dC5lcXVhbHMoIkxpbmUgMVxuTGluZWwxYSAyXG5MaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoxNGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjoxNGQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZWwxYSAyIikpOwotCWFzc2VydFRydWUoIjoxNGU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTGluZSAzIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcbkxpbmUgMiBpcyBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BhbnMgbWFueSB3b3Jkc1xuTGluZSAzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDE5LCAwLCAidmVyeSwgdmVyeSwgIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxNWE6IiwgbmV3VGV4dC5lcXVhbHMoIkxpbmUgMVxuTGluZSAyIGlzIGEgdmVyeSwgdmVyeSwgdmVyeSBsb25nIGxpbmUgdGhhdCBzcGFucyBtYW55IHdvcmRzXG5MaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoxNWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjoxNWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZSAyIGlzIGEgdmVyeSwgdmVyeSwgdmVyeSBsb25nIGxpbmUgdGhhdCBzcGFucyBtYW55IHdvcmRzIikpOwotCWFzc2VydFRydWUoIjoxNWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTGluZSAzIikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0VtcHR5KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJ0ZXN0Iik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsNCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfTGluZV9Db252ZXJzaW9uKCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxycmVwZWF0XG5lbmRcciIpOwotCWFzc2VydFRydWUoIjoxYToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDUpOwkKLQlhc3NlcnRUcnVlKCI6MWI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7CQotCWFzc2VydFRydWUoIjoxZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDApOwotCWFzc2VydFRydWUoIjoxZjoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSA1KTsJCi0JYXNzZXJ0VHJ1ZSgiOjFnOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoInJlcGVhdCIpKTsKLQlhc3NlcnRUcnVlKCI6MWg6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMikgPT0gMTUpOwkKLQlhc3NlcnRUcnVlKCI6MWk6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiZW5kIikpOwotCWFzc2VydFRydWUoIjoxajoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgzKSA9PSAyMik7Ci0JYXNzZXJ0VHJ1ZSgiOjFrOiIsIGNvbnRlbnQuZ2V0TGluZSg0KS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6MWw6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoNCkgPT0gMjYpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xyXG5pcyBhIHRlc3QiKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjoyYzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg0KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNSkgPT0gMCk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXNcclxuaXMgYSB0ZXN0XHIiKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjozYzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxNSkgPT0gMSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRmOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDIpID09IDEpOwotCi0JY29udGVudC5zZXRUZXh0KCJcclxuXG5cclxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6NWI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1YzoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsJCi0JYXNzZXJ0VHJ1ZSgiOjVkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWU6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gMik7CQotCWFzc2VydFRydWUoIjo1ZjoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVnOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDMpOwkKLQlhc3NlcnRUcnVlKCI6NWg6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1aToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgzKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NWo6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1azoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSg0KSA9PSA2KTsKLQkKLQljb250ZW50LnNldFRleHQoInRlc3RcclxydGVzdDJcclxyIik7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoInRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZjOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCWFzc2VydFRydWUoIjo2ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZlOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDUpOwkKLQlhc3NlcnRUcnVlKCI6NmY6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygidGVzdDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZnOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDYpOwkKLQlhc3NlcnRUcnVlKCI6Nmg6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo2aToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgzKSA9PSAxMik7Ci0JYXNzZXJ0VHJ1ZSgiOjZqOiIsIGNvbnRlbnQuZ2V0TGluZSg0KS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6Nms6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoNCkgPT0gMTMpOwotfQotcHVibGljIHZvaWQgdGVzdF9PZmZzZXRfVG9fTGluZSgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RccnJlcGVhdFxuZW5kXHIiKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDMpID09IDApOwotCWFzc2VydFRydWUoIjoxYzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg0KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMjUpID09IDMpOwotCWFzc2VydFRydWUoIjoxZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgyNikgPT0gNCk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXHJcbmlzIGEgdGVzdCIpOwotCWFzc2VydFRydWUoIjoyYToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg1KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNikgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDEwKSA9PSAxKTsKLQkKLQljb250ZW50LnNldFRleHQoIlxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDEpID09IDApOwotCWFzc2VydFRydWUoIjozYzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgyKSA9PSAxKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcblxuXHJcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCWFzc2VydFRydWUoIjo0YjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMikgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDMpID09IDIpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg0KSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNSkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjRnOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDYpID09IDQpOwotCi0JY29udGVudC5zZXRUZXh0KCJcclxuXHJcbiIpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NWI6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDIpID09IDEpOwotCWFzc2VydFRydWUoIjo1ZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgzKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NWU6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNCkgPT0gMik7Ci0KLQljb250ZW50LnNldFRleHQoIlxyXHJcclxuXHJcbiIpOwotCWFzc2VydFRydWUoIjo2YToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NmI6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMSkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDIpID09IDIpOwotCWFzc2VydFRydWUoIjo2ZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg0KSA9PSAzKTsKLQkKLQljb250ZW50LnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoIjo3YToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQkKLQljb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjhhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9MaW5lX1RvX09mZnNldCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RccnJlcGVhdFxuZW5kXHIiKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDUpOwotCWFzc2VydFRydWUoIjoxYzoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgyKSA9PSAxNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDMpID09IDIyKTsKLQlhc3NlcnRUcnVlKCI6MWU6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoNCkgPT0gMjYpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xyXG5pcyBhIHRlc3QiKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDYpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcbiIpOwotCWFzc2VydFRydWUoIjozYToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gMik7Ci0KLQljb250ZW50LnNldFRleHQoIlxyXG5cblxyXHJcbiIpOwotCWFzc2VydFRydWUoIjo0YToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDMpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgzKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoNCkgPT0gNik7Ci0KLQljb250ZW50LnNldFRleHQoIlxyXG50ZXN0XHJcbiIpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NWI6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0RlbGV0ZSgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JU3RyaW5nIG5ld1RleHQ7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg2LCAyLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuaWEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjoxYjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoxYzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpYSB0ZXN0IikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgOSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcblxyIikpOwotCWFzc2VydFRydWUoIjoyYjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6MmU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyMSwgNywgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzIikpOwotCWFzc2VydFRydWUoIjozYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjozYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjozZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoImxpbmUgMyIpKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgNSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgbmV3VGV4dC5lcXVhbHMoImlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygibGluZSAzIikpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJsaW5lIDQiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDE2LCA3LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0ZjoiLCBuZXdUZXh0LmVxdWFscygiaXMgYSB0ZXN0XG5saW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRnOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NGg6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygibGluZSAzIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg5LCA3LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0aToiLCBuZXdUZXh0LmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo0ajoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDgsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRrOiIsIG5ld1RleHQuZXF1YWxzKCJpIikpOwotCWFzc2VydFRydWUoIjo0bDoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJpIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0bToiLCBuZXdUZXh0LmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0bjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDksICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5cciIpKTsKLQlhc3NlcnRUcnVlKCI6NWI6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo1YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjo1ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDQsIDgsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIG5ld1RleHQuZXF1YWxzKCJMMVxyXG5MNFxyXG4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkw0IikpOwotCWFzc2VydFRydWUoIjo2ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlxuTDFcclxuTDIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6N2E6IiwgbmV3VGV4dC5lcXVhbHMoIkwxXHJcbkwyIikpOwotCWFzc2VydFRydWUoIjo3YjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjdjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkwxIikpOwotCWFzc2VydFRydWUoIjo3ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMMiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXG5MMVxyXG5MMlxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNywgMiwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6OGE6IiwgbmV3VGV4dC5lcXVhbHMoIlxuTDFcclxuTDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6OGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo4ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMMSIpKTsKLQlhc3NlcnRUcnVlKCI6OGU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTDIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlxuTGluZSAxXG5MaW5lIDJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCA3LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo5YToiLCBuZXdUZXh0LmVxdWFscygiXG5MaW5lIDJcbiIpKTsKLQlhc3NlcnRUcnVlKCI6OWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6OWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo5ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjllOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSAxXG5MaW5lIDJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg2LCA4LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxMGE6IiwgbmV3VGV4dC5lcXVhbHMoIkxpbmUgMSIpKTsKLQlhc3NlcnRUcnVlKCI6MTBiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgb25lIGlzIHNob3J0XHJcbkxpbmUgMiBpcyBhIGxvbmdlciBsaW5lXHJcbkxpbmUgM1xuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEyLCAxNywgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MTFhOiIsIG5ld1RleHQuZXF1YWxzKCJMaW5lIG9uZSBpcyBhIGxvbmdlciBsaW5lXHJcbkxpbmUgM1xuIikpOwotCWFzc2VydFRydWUoIjoxMWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MTFjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkxpbmUgb25lIGlzIGEgbG9uZ2VyIGxpbmUiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfUmVwbGFjZSgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JU3RyaW5nIG5ld1RleHQ7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCA0LCAiYSIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbmEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjoxYjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAyLCAid2FzIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoyYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xud2FzIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjoyYjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIndhcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpcyBpcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAyLCAid2FzIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozYToiLCBuZXdUZXh0LmVxdWFscygiVGhpcyB3YXMgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyB3YXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjozZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxNSkgPT0gMCk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcbkxpbmUgMlxuTGluZSAzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDcsICJMYVxuTGJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgbmV3VGV4dC5lcXVhbHMoIkxhXG5MYlxuTGluZSAyXG5MaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkxhIikpOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMYiIpKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTGluZSAyIikpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJMaW5lIDMiKSk7Ci0KLQljb250ZW50LnNldFRleHQoZ2V0VGVzdFRleHQoKSk7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWludCBzdGFydCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDYpOwotCWludCBlbmQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZSgxMSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxMik7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZSg1KS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lKDYpLmVxdWFscygiIikpOwotCXN0YXJ0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUoNyk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKHN0YXJ0LCBjb250ZW50LmdldENoYXJDb3VudCgpIC0gc3RhcnQsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gOCk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZSg1KS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lKDYpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmUoNykuZXF1YWxzKCIiKSk7Ci0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfU3BlY2lhbF9DYXNlcygpIHsKLQlTdHJpbmcgbmV3VGV4dDsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjBhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBiOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWI6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxYzoiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg0LCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWU6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxZjoiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNiwgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFnOiIsY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg3LCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWg6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoyYToiLCBuZXdUZXh0LmVxdWFscygiXG5UaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjoyYjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIlRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgbmV3VGV4dC5lcXVhbHMoIlxuXG5UaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjoyZToiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJmOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6Mmc6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIG5ld1RleHQuZXF1YWxzKCJcblxuXG5UaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjozYjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2Q6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozZToiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNmOiIsIG5ld1RleHQuZXF1YWxzKCJcblxuXG5cblRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNnOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2g6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozaToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNqOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2s6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0YToiLCBuZXdUZXh0LmVxdWFscygiXG5cblxuVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgbmV3VGV4dC5lcXVhbHMoIlxuXG5UaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjo0ZzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRoOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGk6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAiYSIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgbmV3VGV4dC5lcXVhbHMoIlxuXG5hVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQlhc3NlcnRUcnVlKCI6NWI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1YzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVkOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoImFUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJhYmNcclxuZGVmIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIG5ld1RleHQuZXF1YWxzKCJhY1xyXG5kZWYiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjZjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImFjIikpOwotCWFzc2VydFRydWUoIjo2ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJkZWYiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZlOiIsIG5ld1RleHQuZXF1YWxzKCJhXHJcbmRlZiIpKTsKLQlhc3NlcnRUcnVlKCI6NmY6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6Nmc6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiYSIpKTsKLQlhc3NlcnRUcnVlKCI6Nmg6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiZGVmIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo2aToiLCBuZXdUZXh0LmVxdWFscygiYWRlZiIpKTsKLQlhc3NlcnRUcnVlKCI6Nmo6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6Nms6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiYWRlZiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6Nmw6IiwgbmV3VGV4dC5lcXVhbHMoImFlZiIpKTsKLQlhc3NlcnRUcnVlKCI6Nm06IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6Nm46IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiYWVmIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo2bzoiLCBuZXdUZXh0LmVxdWFscygiYWYiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZwOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZxOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImFmIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJhYmMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgIjEiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdiOiIsIG5ld1RleHQuZXF1YWxzKCIxYmMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIjFiYyIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo3ZDoiLCBuZXdUZXh0LmVxdWFscygiXG4xYmMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdlOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjdmOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6N2c6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiMWJjIikpOwotCQotCWNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwwLCJhIik7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJwYWNrYWdlIHRlc3Q7XG4vKiBMaW5lIDFcbiAqIExpbmUgMlxuICovXG5wdWJsaWMgY2xhc3MgU2ltcGxlQ2xhc3Mge1xufSIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxNCwgMjMsICJcdC8qTGluZSAxXG5cdCAqIExpbmUgMlxuXHQgKi8iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhhOiIsIG5ld1RleHQuZXF1YWxzKCJwYWNrYWdlIHRlc3Q7XG5cdC8qTGluZSAxXG5cdCAqIExpbmUgMlxuXHQgKi9cbnB1YmxpYyBjbGFzcyBTaW1wbGVDbGFzcyB7XG59IikpOwotCWFzc2VydFRydWUoIjo4YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDYpOwotCWFzc2VydFRydWUoIjo4YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJwYWNrYWdlIHRlc3Q7IikpOwotCWFzc2VydFRydWUoIjo4ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJcdC8qTGluZSAxIikpOwotCWFzc2VydFRydWUoIjo4ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJcdCAqIExpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6OGY6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiXHQgKi8iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhnOiIsIGNvbnRlbnQuZ2V0TGluZSg0KS5lcXVhbHMoInB1YmxpYyBjbGFzcyBTaW1wbGVDbGFzcyB7IikpOwotCWFzc2VydFRydWUoIjo4aDoiLCBjb250ZW50LmdldExpbmUoNSkuZXF1YWxzKCJ9IikpOwotfQotcHVibGljIHZvaWQgdGVzdF9UZXh0X0NoYW5nZWRfRXZlbnQoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCWNvbnRlbnQuYWRkVGV4dENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCXZlcmlmeSA9IDE7Ci0JY29udGVudC5zZXRUZXh0KCJ0ZXN0aW5nIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMjsKLQljb250ZW50LnNldFRleHQoIlxuXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMiwgImEiKTsKLQotCXZlcmlmeSA9IDM7Ci0JY29udGVudC5zZXRUZXh0KCJhIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsICJcblxuIik7Ci0KLQl2ZXJpZnkgPSA0OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtjb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjQ6IiwgdHJ1ZSk7fQotCi0JdmVyaWZ5ID0gNTsKLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxyXG5MaW5lIDIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSA2OwotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyMSwgNywgIiIpOwotCi0JdmVyaWZ5ID0gNzsKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDksICIiKTsKLQotCXZlcmlmeSA9IDg7Ci0JY29udGVudC5zZXRUZXh0KCJcbkwxXHJcbkwyXHJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0KLQl2ZXJpZnkgPSA5OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0Iik7Ci0KLQl2ZXJpZnkgPSAxMDsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICIiKTt9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6MTA6IiwgdHJ1ZSk7fQotCi0JdmVyaWZ5ID0gMTE7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAiIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6MTE6IiwgdHJ1ZSk7fQotCi0JdmVyaWZ5ID0gMTI7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMTM7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gMTQ7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAidGVzdCIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjE0OiIsIHRydWUpO30KLQotCXZlcmlmeSA9IDE1OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0XG5cbiIpOwotCi0JdmVyaWZ5ID0gMTY7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxyXG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge2Fzc2VydFRydWUoIjoxNjoiLCB0cnVlKTt9Ci0KLQl2ZXJpZnkgPSAxNzsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICJ0ZXN0XG5cbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjE3OiIsIHRydWUpO30KLQotCXZlcmlmeSA9IDE4OwotIAljb250ZW50LnNldFRleHQoIkwxXHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxudGVzdFxyXG4iKTsKLQotCXZlcmlmeSA9IDE5OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAidGVzdFxyXHJcciIpOwotCXZlcmlmeSA9IDIwOwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtjb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjIwOiIsIHRydWUpO30KLQotCi0JdmVyaWZ5ID0gMDsKLQljb250ZW50LnJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfRGVsaW1pdGVyX1NwZWNpYWxfQ2FzZXMoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCVN0cmluZyBuZXdUZXh0OwotCQotCWNvbnRlbnQuc2V0VGV4dCgiXG5MMVxyXG5MMlxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNywgMiwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBuZXdUZXh0LmVxdWFscygiXG5MMVxyXG5MMiIpKTsKLQkKLQljb250ZW50LnNldFRleHQoIkwxXHJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdFxuXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgbmV3VGV4dC5lcXVhbHMoIkwxdGVzdFxuXG4iKSk7Ci0KLS8vCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0vLwljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcclxuIik7Ci0vLwluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0vLwlhc3NlcnRUcnVlKCI6MzoiLCBuZXdUZXh0LmVxdWFscygiTDFccnRlc3RcclxuIikpOwotCi0vLwljb250ZW50LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotLy8JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICJ0ZXN0XG5cbiIpOwotLy8JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotLy8JYXNzZXJ0VHJ1ZSgiOjQ6IiwgbmV3VGV4dC5lcXVhbHMoIkx0ZXN0XG5cblxuTDJcclxuTDNcclxuTDRcclxuIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMMVxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJ0ZXN0XHJcclxyIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozOiIsIG5ld1RleHQuZXF1YWxzKCJMMXRlc3RcclxyXHJcbiIpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgIHsKLQkvLyBjcmVhdGUgc2hlbGwKLQlzaGVsbCA9IG5ldyBTaGVsbCAoKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCXNoZWxsLnNldFNpemUoNTAwLCAzMDApOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCS8vIGNyZWF0ZSB3aWRnZXQKLQl3aWRnZXQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCXNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0Jc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0Jc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0Jd2lkZ2V0LnNldExheW91dERhdGEoc3BlYyk7Ci0Jc2hlbGwub3BlbiAoKTsKLX0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgIHsKLQlpZiAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCAoKSkgCi0JCXNoZWxsLmRpc3Bvc2UgKCk7Ci0Jc2hlbGwgPSBudWxsOwotCi19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dEp1bml0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dEp1bml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNTllNjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9Td3RKdW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLQotLyoqCi0gKiBQbGF0Zm9ybS1zcGVjaWZpYyBjb25zdGFudHMgdXNlZCBpbiBTV1QgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIFN3dEp1bml0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRlc3RGb250TmFtZTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzID0gU1dULmdldFBsYXRmb3JtKCkuc3RhcnRzV2l0aCgid2luMzIiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNDYXJib24gPSBTV1QuZ2V0UGxhdGZvcm0oKS5zdGFydHNXaXRoKCJjYXJib24iKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNDb2NvYSA9IFNXVC5nZXRQbGF0Zm9ybSgpLnN0YXJ0c1dpdGgoImNvY29hIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzTW90aWYgPSBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIm1vdGlmIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzR1RLID0gU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJndGsiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNQaG90b24gPSBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoInBob3RvbiIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0xpbnV4ID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuZXF1YWxzKCJMaW51eCIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0FJWCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiQUlYIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzU29sYXJpcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiU29sYXJpcyIpIHx8IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiU3VuT1MiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNIUFVYID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuZXF1YWxzKCJIUC1VWCIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1dQRiA9IFNXVC5nZXRQbGF0Zm9ybSgpLnN0YXJ0c1dpdGgoIndwZiIpOwotCQotCXN0YXRpYyB7Ci0JCWlmIChpc01vdGlmKSB7Ci0JCQl0ZXN0Rm9udE5hbWUgPSAibWlzYy1maXhlZCI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0ZXN0Rm9udE5hbWUgPSAiSGVsdmV0aWNhIjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3d0VGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3d0VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjYmIzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuKjsKLQotcHVibGljIGNsYXNzIFN3dFRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIHVzZWQgdG8gbWFyayB0ZXN0IGNhc2VzIHRoYXQKLQkgKiBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5IGJ5IFNXVCBhdCB0aGlzIHRpbWUsIG9yIHRlc3QKLQkgKiBjYXNlcyB0aGF0IG1heWJlIHRoZW1zZWx2ZXMgZHViaW91cyAoZWcuIHdoZW4gdGhlIGNvcnJlY3QKLQkgKiBiZWhhdmlvdXIgbWF5IG5vdCBiZSBjbGVhcikuIE1vc3Qgb2YgdGhlc2UgZmxhZ2dlZCB0ZXN0Ci0JICogY2FzZXMgaW52b2x2ZSBoYW5kbGluZyBlcnJvciBjb25kaXRpb25zLgotCSAqCi0JICogU2V0dGluZyB0aGVzZSBmbGFncyB0byB0cnVlIHdpbGwgcnVuIHRob3NlIHRlc3RzLiBBcyBhcGkKLQkgKiBpcyBpbXBsZW1lbnRlZCB0aGlzIGdpdmVzIHVzIGEgY29udmVuaWVudCB3YXkgdG8gaW5jbHVkZQotCSAqIGl0IGluIHRoZSBqdW5pdCB0ZXN0cy4KLQkgKi8KLQotCS8vIHJ1biB0ZXN0IGNhc2VzIHRoYXQgbWF5IHRoZW1zZWx2ZXMgYmUgZHViaW91cwotCS8vIHRoZXNlIHNob3VsZCBiZSBldmVudHVhbGx5IGNoZWNrZWQgdG8gc2VlIGlmIAotCS8vIHRoZXJlIGlzIGEgdmFsaWQgZmFpbHVyZSBvciB0aGUgdGVzdCBpcyBib2d1cwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmQ2hlY2tCb2d1c1Rlc3RDYXNlcyA9IGZhbHNlOwotCi0JLy8gY2hlY2sgdmlzaWJpbGl0eSBhcGkgKGVnIGluIG1lbnUpCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZDaGVja1Zpc2liaWxpdHkgPSBmYWxzZTsKLQotCS8vIHJ1biB0ZXN0IGNhc2VzIHRoYXQgY2hlY2sgU1dUIHBvbGljeSBub3QgY292ZXJlZCBieSB0aGUgZmxhZ3MgYWJvdmUKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZkNoZWNrU1dUUG9saWN5ID0gZmFsc2U7Ci0KLQkvLyBtYWtlIGRpYWxvZyBvcGVuIGNhbGxzLCBvcGVyYXRvciBtdXN0IHRoZW4gY2xvc2UgdGhlbQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmVGVzdERpYWxvZ09wZW4gPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZlRlc3RDb25zaXN0ZW5jeSA9IGZhbHNlOwotCi0JLy8gdmFyaWFibGUgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHVuaW1wbGVtZW50ZWQgbWV0aG9kcwotCXB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCQotCS8vIHZhcmlhYmxlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiB1bmltcGxlbWVudGVkIEFQSSBtZXRob2RzCi0JcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZEFQSTsKLQkKLQkvLyB1c2VkIHRvIHNwZWNpZnkgdmVyYm9zZSBtb2RlLCBpZiB0cnVlIHVuaW1wbGVtZW50ZWQgd2FybmluZyBtZXNzYWdlcyB3aWxsIAotCS8vIGJlIHdyaXR0ZW4gdG8gU3lzdGVtLm91dAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JCi0JLy8gYWxsb3cgc3BlY2lmaWMgaW1hZ2UgZm9ybWF0cyB0byBiZSB0ZXN0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGltYWdlRm9ybWF0cyA9IG5ldyBTdHJpbmdbXSB7ImJtcCIsICJqcGciLCAiZ2lmIiwgInBuZyJ9OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gaW1hZ2VGaWxlbmFtZXMgPSBuZXcgU3RyaW5nW10geyJmb2xkZXIiLCAiZm9sZGVyT3BlbiIsICJ0YXJnZXQifTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGludmFsaWRJbWFnZUZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbXSB7ImNvcnJ1cHQiLCAiY29ycnVwdEJhZEJpdERlcHRoLnBuZyJ9OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdHJhbnNwYXJlbnRJbWFnZUZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbXSB7InRyYW5zcGFyZW50LnBuZyJ9OwotCQotCS8vIHNwZWNpZnkgcmVwYXJlbnRhYmxlIHBsYXRmb3JtcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gcmVwYXJlbnRhYmxlUGxhdGZvcm1zID0gbmV3IFN0cmluZ1tdIHsid2luMzIiLCAiZ3RrIiwgImNhcmJvbiIsICJjb2NvYSJ9OwotCQotcHVibGljIFN3dFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1zdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0U2FtZShTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkW10sIE9iamVjdCBhY3R1YWxbXSkgewotCWlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKSByZXR1cm47Ci0JYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0JaWYgKGV4cGVjdGVkICE9IG51bGwgJiYgYWN0dWFsICE9IG51bGwgJiYgZXhwZWN0ZWQubGVuZ3RoID09IGFjdHVhbC5sZW5ndGgpIHsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCXNhbWUgPSB0cnVlOwotCQlib29sZWFuW10gbWF0Y2hlZCA9IG5ldyBib29sZWFuW2V4cGVjdGVkLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKCFtYXRjaGVkW2pdKSB7Ci0JCQkJCWlmICgoYWN0dWFsW2ldID09IG51bGwgJiYgZXhwZWN0ZWQgW2pdID09IG51bGwpIHx8Ci0JCQkJCSAgICAoYWN0dWFsW2ldICE9IG51bGwgJiYgYWN0dWFsW2ldLmVxdWFscyhleHBlY3RlZFtqXSkpKSB7Ci0JCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCQltYXRjaGVkW2pdID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFtYXRjaCkgewotCQkJCXNhbWUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlpZiAoIXNhbWUpIHsKLQkJZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci19Ci1zdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0U2FtZShPYmplY3QgZXhwZWN0ZWRbXSwgT2JqZWN0IGFjdHVhbFtdKSB7Ci0JYXNzZXJ0U2FtZShudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRTYW1lKFN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0ZWRbXSwgaW50IGFjdHVhbFtdKSB7Ci0JaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpIHJldHVybjsKLQlib29sZWFuIHNhbWUgPSBmYWxzZTsKLQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDApIHJldHVybjsKLQkJc2FtZSA9IHRydWU7Ci0JCWJvb2xlYW5bXSBtYXRjaGVkID0gbmV3IGJvb2xlYW5bZXhwZWN0ZWQubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWwubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWQubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoIW1hdGNoZWRbal0gJiYgYWN0dWFsW2ldID09IGV4cGVjdGVkW2pdKSB7Ci0JCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQkJbWF0Y2hlZFtqXSA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbWF0Y2gpIHsKLQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCFzYW1lKSB7Ci0JCWZhaWxOb3RFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotfQotc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFNhbWUoaW50IGV4cGVjdGVkW10sIGludCBhY3R1YWxbXSkgewotCWFzc2VydFNhbWUobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci19Ci1zdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWRbXSwgT2JqZWN0IGFjdHVhbFtdKSB7Ci0JaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpCi0JCXJldHVybjsKLQlib29sZWFuIGVxdWFsID0gZmFsc2U7Ci0JaWYgKGV4cGVjdGVkICE9IG51bGwgJiYgYWN0dWFsICE9IG51bGwgJiYgZXhwZWN0ZWQubGVuZ3RoID09IGFjdHVhbC5sZW5ndGgpIHsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQllcXVhbCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghZXhwZWN0ZWRbaV0uZXF1YWxzKGFjdHVhbFtpXSkpIHsKLQkJCQllcXVhbCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCWlmICghZXF1YWwpIHsKLQkJZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci19Ci1zdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0ZWRDb2RlLCBUaHJvd2FibGUgYWN0dWFsVGhyb3dhYmxlKSB7Ci0JaWYgKGFjdHVhbFRocm93YWJsZSBpbnN0YW5jZW9mIFNXVEVycm9yKSB7Ci0JCVNXVEVycm9yIGVycm9yID0gKFNXVEVycm9yKSBhY3R1YWxUaHJvd2FibGU7Ci0JCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZENvZGUsIGVycm9yLmNvZGUpOwotCX0gZWxzZSBpZiAoYWN0dWFsVGhyb3dhYmxlIGluc3RhbmNlb2YgU1dURXhjZXB0aW9uKSB7Ci0JCVNXVEV4Y2VwdGlvbiBleGNlcHRpb24gPSAoU1dURXhjZXB0aW9uKSBhY3R1YWxUaHJvd2FibGU7Ci0JCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZENvZGUsIGV4Y2VwdGlvbi5jb2RlKTsKLQl9IGVsc2UgewotCQl0cnkgewotCQkJU1dULmVycm9yKGV4cGVjdGVkQ29kZSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBleHBlY3RlZFRocm93YWJsZSkgewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkVGhyb3dhYmxlLmdldE1lc3NhZ2UoKSwgYWN0dWFsVGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci19Ci1zdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKE9iamVjdCBleHBlY3RlZFtdLCBPYmplY3QgYWN0dWFsW10pIHsKLSAgICBhc3NlcnRFcXVhbHMobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci19Ci1zdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0ZWRbXSwgaW50IGFjdHVhbFtdKSB7Ci0JaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpCi0JCXJldHVybjsKLQlib29sZWFuIGVxdWFsID0gZmFsc2U7Ci0JaWYgKGV4cGVjdGVkICE9IG51bGwgJiYgYWN0dWFsICE9IG51bGwgJiYgZXhwZWN0ZWQubGVuZ3RoID09IGFjdHVhbC5sZW5ndGgpIHsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQllcXVhbCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChleHBlY3RlZFtpXSAhPSBhY3R1YWxbaV0pIHsKLQkJCQllcXVhbCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCWlmICghZXF1YWwpIHsKLQkJZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci19Ci1zdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGludCBleHBlY3RlZFtdLCBpbnQgYWN0dWFsW10pIHsKLSAgICBhc3NlcnRFcXVhbHMobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci19Ci0KLXN0YXRpYyBwcml2YXRlIHZvaWQgZmFpbE5vdEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0W10gZXhwZWN0ZWQsIE9iamVjdFtdIGFjdHVhbCkgewotCVN0cmluZyBmb3JtYXR0ZWQ9ICIiOwotCWlmIChtZXNzYWdlICE9IG51bGwpCi0JCWZvcm1hdHRlZD0gbWVzc2FnZSsiICI7Ci0JZm9ybWF0dGVkICs9ICJleHBlY3RlZDo8IjsKLQlpZihleHBlY3RlZCAhPSBudWxsKSB7Ci0JICAgIGZvcihpbnQgaT0wOyBpPE1hdGgubWluKGV4cGVjdGVkLmxlbmd0aCwgNSk7IGkrKykKLQkgICAgICAgIGZvcm1hdHRlZCArPSBleHBlY3RlZFtpXSArIiwgIjsKLQkgICAgaWYoZXhwZWN0ZWQubGVuZ3RoICE9IDApCi0JICAgICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQuc3Vic3RyaW5nKDAsIGZvcm1hdHRlZC5sZW5ndGgoKS0yKTsKLQl9Ci0JaWYoZXhwZWN0ZWQubGVuZ3RoID4gNSkKLQkgICAgZm9ybWF0dGVkICs9ICIuLi4iOwotCWZvcm1hdHRlZCArPSAiPiBidXQgd2FzOjwiOwotCWlmKGFjdHVhbCAhPSBudWxsKSB7Ci0JICAgIGZvcihpbnQgaT0wOyBpPE1hdGgubWluKGFjdHVhbC5sZW5ndGgsIDUpOyBpKyspCi0JICAgICAgICBmb3JtYXR0ZWQgKz0gYWN0dWFsW2ldICsiLCAiOwotCSAgICBpZihhY3R1YWwubGVuZ3RoICE9IDApCi0JICAgICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQuc3Vic3RyaW5nKDAsIGZvcm1hdHRlZC5sZW5ndGgoKS0yKTsKLQl9Ci0JaWYoYWN0dWFsLmxlbmd0aCA+IDUpCi0JICAgIGZvcm1hdHRlZCArPSAiLi4uIjsKLQlmYWlsKGZvcm1hdHRlZCsiPiIpOwotfQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0oyTUUoKSB7Ci0JdHJ5IHsKLQkJQ29tcGF0aWJpbGl0eS5uZXdGaWxlSW5wdXRTdHJlYW0oIiIpOwotCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXJldHVybiB0cnVlOwotfQotcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXBhcmVudGFibGVQbGF0Zm9ybSgpIHsKLQlTdHJpbmcgcGxhdGZvcm0gPSBTV1QuZ2V0UGxhdGZvcm0oKTsKLQlmb3IgKGludCBpPTA7IGk8cmVwYXJlbnRhYmxlUGxhdGZvcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChyZXBhcmVudGFibGVQbGF0Zm9ybXNbaV0uZXF1YWxzKHBsYXRmb3JtKSkgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNCaWRpKCkgewotCXJldHVybiAgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJndGsiKSB8fCBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoImNhcmJvbiIpIHx8ICBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoImNvY29hIikgfHwgQmlkaVV0aWwuaXNCaWRpUGxhdGZvcm0oKTsvLyB8fCBpc01pcnJvcmVkOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl0cnkgewotCQlzdXBlci5zZXRVcCgpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVNXVEVycm9yIGVycm9yID0gbmV3IFNXVEVycm9yKCk7Ci0JCWVycm9yLnRocm93YWJsZSA9IGU7Ci0JCXRocm93IGVycm9yOwotCX0KLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHdhcm5VbmltcGwoU3RyaW5nIG1lc3NhZ2UpIHsKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpICsgIjogIiArIG1lc3NhZ2UpOwotCX0KLQl1bmltcGxlbWVudGVkTWV0aG9kcysrOwotfQotcHJvdGVjdGVkIHZvaWQgd2FyblVuaW1wbEFQSShTdHJpbmcgbWVzc2FnZSkgewotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQVBJIG5vdCBpbXBsZW1lbnRlZCAiICsgdGhpcy5nZXRDbGFzcygpICsgIiAiICsgZ2V0TmFtZSgpKTsKLQl9Ci0JdW5pbXBsZW1lbnRlZEFQSSsrOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNjM5OGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5TV1QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5TV1QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JLy8gRG8gbm90aGluZy4gQ2xhc3MgU1dUIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Vycm9ySSgpIHsKLQkvLyBUZXN0IHRoYXQgd2UgdGhyb3cgdGhlIGV4cGVjdGVkIGtpbmRzIG9mIGVycm9ycyBmb3IgdGhlIGdpdmVuIGVycm9yIHR5cGVzLgotCWJvb2xlYW4gcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgRVJST1JfTlVMTF9BUkdVTUVOVCIsIHBhc3NlZCk7Ci0JcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9GQUlMRURfRVhFQyk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCXBhc3NlZCA9IHRydWU7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gZm9yIEVSUk9SX0ZBSUxFRF9FWEVDIiwgcGFzc2VkKTsKLQlwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX05PX0hBTkRMRVMpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGV4KSB7Ci0JCXBhc3NlZCA9IHRydWU7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gZm9yIEVSUk9SX05PX0hBTkRMRVMiLCBwYXNzZWQpOwotCXBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCVNXVC5lcnJvcigtMSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgZXJyb3IoLTEpIiwgcGFzc2VkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcnJvcklMamF2YV9sYW5nX1Rocm93YWJsZSgpIHsKLQkvLyBUZXN0IHRoYXQgdGhlIGNhdXNpbmcgdGhyb3dhYmxlIGlzIGZpbGxlZCBpbi4KLQlUaHJvd2FibGUgY2F1c2UgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigiSnVzdCBmb3IgdGVzdGluZyIpOwotCWJvb2xlYW4gcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQsIGNhdXNlKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJcGFzc2VkID0gZXgudGhyb3dhYmxlID09IGNhdXNlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBFUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQiLCBwYXNzZWQpOwotCXBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfTk9UX0lNUExFTUVOVEVELCBjYXVzZSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJcGFzc2VkID0gZXgudGhyb3dhYmxlID09IGNhdXNlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBFUlJPUl9OT1RfSU1QTEVNRU5URUQiLCBwYXNzZWQpOwotCXBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCVNXVC5lcnJvcigtMSwgY2F1c2UpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGV4KSB7Ci0JCXBhc3NlZCA9IGV4LnRocm93YWJsZSA9PSBjYXVzZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgZXJyb3IoLTEpIiwgcGFzc2VkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlwYXNzZWQgPSBmYWxzZTsKLQkJU1dULmdldE1lc3NhZ2UobnVsbCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCXBhc3NlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gd2l0aCBudWxsIGFyZ3VtZW50IiwgcGFzc2VkKTsKLQl0cnkgewotCQlTV1QuZ2V0TWVzc2FnZSgiU1dUX1llcyIpOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCWZhaWwgKCJleGNlcHRpb24gIiArIHQgKyAiIGdlbmVyYXRlZCBmb3IgU1dUX1llcyIpOwotCX0KLQlhc3NlcnRUcnVlICgKLQkJImludmFsaWQga2V5IGRpZCBub3QgcmV0dXJuIGFzIGl0c2VsZiIsCi0JCSJfTk9UX0ZPVU5EX0lOX1BST1BFUlRJRVNfIi5lcXVhbHMoU1dULmdldE1lc3NhZ2UoIl9OT1RfRk9VTkRfSU5fUFJPUEVSVElFU18iKSkpOwotCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQbGF0Zm9ybSgpIHsKLQkvLyBDYW4ndCB0ZXN0IHRoZSBsaXN0IG9mIHBsYXRmb3Jtcywgc2luY2UgdGhpcyBtYXkgY2hhbmdlLAotCS8vIHNvIGp1c3QgdGVzdCB0byBzZWUgaXQgcmV0dXJucyBzb21ldGhpbmcuCi0JYXNzZXJ0VHJ1ZSAoInJldHVybmVkIG51bGwgcGxhdGZvcm0gbmFtZSIsIFNXVC5nZXRQbGF0Zm9ybSgpICE9IG51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb24oKSB7Ci0JLy8gVGVzdCB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlciB3aGljaCBpcyByZXR1cm5lZCBpcyByZWFzb25hYmxlLgotCWludCB2ZXIgPSBTV1QuZ2V0VmVyc2lvbigpOwotCWFzc2VydFRydWUgKCJ1bnJlYXNvbmFibGUgdmFsdWUgcmV0dXJuZWQiLCB2ZXIgPiAwICYmIHZlciA8IDEwMDAwMDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Vycm9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJTGphdmFfbGFuZ19UaHJvd2FibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGxhdGZvcm0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFZlcnNpb24iKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXJyb3JJIikpIHRlc3RfZXJyb3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcnJvcklMamF2YV9sYW5nX1Rocm93YWJsZSIpKSB0ZXN0X2Vycm9ySUxqYXZhX2xhbmdfVGhyb3dhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9nZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBsYXRmb3JtIikpIHRlc3RfZ2V0UGxhdGZvcm0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFZlcnNpb24iKSkgdGVzdF9nZXRWZXJzaW9uKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjE3OWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFcnJvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEVycm9yKCkuY29kZSA9PSBTV1QuRVJST1JfVU5TUEVDSUZJRUQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEVycm9yKFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTykuY29kZSA9PSBTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydFRydWUgKAotCQkiZGlkIG5vdCBmaWxsIGluIGNvZGUgcHJvcGVybHkiLAotCQluZXcgU1dURXJyb3IoU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPLCAiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSAKLQkJCT09IFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEVycm9yKCJBbiB1bmludGVyZXN0aW5nIG1lc3NhZ2UiKS5jb2RlID09IFNXVC5FUlJPUl9VTlNQRUNJRklFRCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZSgpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgaW5jbHVkZSBjcmVhdGlvbiBzdHJpbmcgaW4gcmVzdWx0IiwKLQkJbmV3IFNXVEVycm9yKFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTywgIkFuIGludGVyZXN0aW5nIG1lc3NhZ2UiKS5nZXRNZXNzYWdlKCkgCi0JCQkuaW5kZXhPZigiQW4gaW50ZXJlc3RpbmcgbWVzc2FnZSIpID49IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ByaW50U3RhY2tUcmFjZSgpIHsKLQkKLQkvLyBXQVJOSU5HOiB0aGlzIHRlc3QgaXMgbm90IENMREMgc2FmZSwgYmVjYXVzZSBpdCByZXF1aXJlcyBqYXZhLmlvLlByaW50U3RyZWFtCi0JCi0JdHJ5IHsKLQkJQ2xhc3MuZm9yTmFtZSgiamF2YS5pby5QcmludFN0cmVhbSIpOwotCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkvLyBpZ25vcmUgdGVzdCBpZiBydW5uaW5nIG9uIENMREMKLQkJcmV0dXJuOwotCX0KLQkKLQkvLyB0ZXN0IGRlZmF1bHQgU1dURXJyb3IKLQkKLQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCVN5c3RlbS5zZXRFcnIobmV3IFByaW50U3RyZWFtKG91dCkpOwotCVNXVEVycm9yIGVycm9yID0gbmV3IFNXVEVycm9yKCk7Ci0JZXJyb3IucHJpbnRTdGFja1RyYWNlKCk7Ci0JYXNzZXJ0VHJ1ZShvdXQuc2l6ZSgpID4gMCk7Ci0JYXNzZXJ0VHJ1ZShuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpKS5pbmRleE9mKCJ0ZXN0X3ByaW50U3RhY2tUcmFjZSIpICE9IC0xKTsKLQkKLQkvLyB0ZXN0IFNXVEVycm9yIHdpdGggY29kZQotCQotCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQlTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQllcnJvciA9IG5ldyBTV1RFcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JZXJyb3IucHJpbnRTdGFja1RyYWNlKCk7Ci0JYXNzZXJ0VHJ1ZShvdXQuc2l6ZSgpID4gMCk7Ci0JYXNzZXJ0VHJ1ZShuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpKS5pbmRleE9mKCJ0ZXN0X3ByaW50U3RhY2tUcmFjZSIpICE9IC0xKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXJyb3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lc3NhZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3ByaW50U3RhY2tUcmFjZSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZXNzYWdlIikpIHRlc3RfZ2V0TWVzc2FnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcHJpbnRTdGFja1RyYWNlIikpIHRlc3RfcHJpbnRTdGFja1RyYWNlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFlMmMxYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXhjZXB0aW9uIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXhjZXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEV4Y2VwdGlvbigpLmNvZGUgPT0gU1dULkVSUk9SX1VOU1BFQ0lGSUVEKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPKS5jb2RlID09IFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPLCAiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSAKLQkJCT09IFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEV4Y2VwdGlvbigiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSA9PSBTV1QuRVJST1JfVU5TUEVDSUZJRUQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGluY2x1ZGUgY3JlYXRpb24gc3RyaW5nIGluIHJlc3VsdCIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPLCAiQW4gaW50ZXJlc3RpbmcgbWVzc2FnZSIpLmdldE1lc3NhZ2UoKSAKLQkJCS5pbmRleE9mKCJBbiBpbnRlcmVzdGluZyBtZXNzYWdlIikgPj0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRTdGFja1RyYWNlKCkgewotCQotCS8vIFdBUk5JTkc6IHRoaXMgdGVzdCBpcyBub3QgQ0xEQyBzYWZlLCBiZWNhdXNlIGl0IHJlcXVpcmVzIGphdmEuaW8uUHJpbnRTdHJlYW0KLQkKLQl0cnkgewotCQlDbGFzcy5mb3JOYW1lKCJqYXZhLmlvLlByaW50U3RyZWFtIik7Ci0JfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIGlnbm9yZSB0ZXN0IGlmIHJ1bm5pbmcgb24gQ0xEQwotCQlyZXR1cm47Ci0JfQotCQotCS8vIHRlc3QgZGVmYXVsdCBTV1RFeGNlcHRpb24KLQkKLQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCVN5c3RlbS5zZXRFcnIobmV3IFByaW50U3RyZWFtKG91dCkpOwotCVNXVEV4Y2VwdGlvbiBlcnJvciA9IG5ldyBTV1RFeGNlcHRpb24oKTsKLQllcnJvci5wcmludFN0YWNrVHJhY2UoKTsKLQlhc3NlcnRUcnVlKG91dC5zaXplKCkgPiAwKTsKLQlhc3NlcnRUcnVlKG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpLmluZGV4T2YoInRlc3RfcHJpbnRTdGFja1RyYWNlIikgIT0gLTEpOwotCQotCS8vIHRlc3QgU1dURXhjZXB0aW9uIHdpdGggY29kZQotCQotCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQlTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQllcnJvciA9IG5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotCWFzc2VydFRydWUob3V0LnNpemUoKSA+IDApOwotCWFzc2VydFRydWUobmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkuaW5kZXhPZigidGVzdF9wcmludFN0YWNrVHJhY2UiKSAhPSAtMSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcHJpbnRTdGFja1RyYWNlIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lc3NhZ2UiKSkgdGVzdF9nZXRNZXNzYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wcmludFN0YWNrVHJhY2UiKSkgdGVzdF9wcmludFN0YWNrVHJhY2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViZDI4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQUNDCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FDQyBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FDQygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzQxN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JYWNjZXNzaWJsZSA9IHNoZWxsLmdldEFjY2Vzc2libGUoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBzaGVsbC5pc0Rpc3Bvc2VkKCkpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKHNoZWxsLmlzRGlzcG9zZWQoKSk7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoKSB7Ci0JQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBnZXRWYWx1ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRDaGlsZChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRDaGlsZEF0UG9pbnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRDb3VudChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRDaGlsZHJlbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXREZWZhdWx0QWN0aW9uKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldEZvY3VzKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldExvY2F0aW9uKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldFJvbGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0U2VsZWN0aW9uKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldFN0YXRlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JfTsKLQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIobGlzdGVuZXIpOwotCWFjY2Vzc2libGUucmVtb3ZlQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQWNjZXNzaWJsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lcigpIHsKLQlBY2Nlc3NpYmxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQWNjZXNzaWJsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0RGVzY3JpcHRpb24oQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRIZWxwKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0S2V5Ym9hcmRTaG9ydGN1dChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQl9Ci0JfTsKLQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JYWNjZXNzaWJsZS5yZW1vdmVBY2Nlc3NpYmxlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lcigpIHsKLQlBY2Nlc3NpYmxlVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFjY2Vzc2libGVUZXh0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldFNlbGVjdGlvblJhbmdlKEFjY2Vzc2libGVUZXh0RXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldENhcmV0T2Zmc2V0KEFjY2Vzc2libGVUZXh0RXZlbnQgZSkgewotCQl9Ci0JfTsKLQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXIobGlzdGVuZXIpOwotCWFjY2Vzc2libGUucmVtb3ZlQWNjZXNzaWJsZVRleHRMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQlhc3NlcnRFcXVhbHMoc2hlbGwsIGFjY2Vzc2libGUuZ2V0Q29udHJvbCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9XTV9HRVRPQkpFQ1RJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfV01fR0VUT0JKRUNUSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0FjY2Vzc2libGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfQWNjZXNzaWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19BY2Nlc3NpYmxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX25ld19BY2Nlc3NpYmxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoKSB7Ci0JLy8gVGVzdGVkIGluIHRlc3RfYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyLgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIoKSB7Ci0JLy8gVGVzdGVkIGluIHRlc3RfYWRkQWNjZXNzaWJsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lci4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoKSB7Ci0JLy8gVGVzdGVkIGluIHRlc3RfYWRkQWNjZXNzaWJsZVRleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyLgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdGlvbkNoYW5nZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NlbGVjdGlvbkNoYW5nZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1c0koKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvY3VzSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRDYXJldE1vdmVkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfdGV4dENhcmV0TW92ZWRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dENoYW5nZWRJSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RleHRDaGFuZ2VkSUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dFNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RleHRTZWxlY3Rpb25DaGFuZ2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQWNjZXNzaWJsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQWNjZXNzaWJsZVRleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9XTV9HRVRPQkpFQ1RJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9BY2Nlc3NpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdfQWNjZXNzaWJsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0aW9uQ2hhbmdlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0Q2FyZXRNb3ZlZEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRDaGFuZ2VkSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0U2VsZWN0aW9uQ2hhbmdlZCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X2FkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQWNjZXNzaWJsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lciIpKSB0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lciIpKSB0ZXN0X2FkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX1dNX0dFVE9CSkVDVElJIikpIHRlc3RfaW50ZXJuYWxfV01fR0VUT0JKRUNUSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfQWNjZXNzaWJsZSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfQWNjZXNzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfbmV3X0FjY2Vzc2libGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X2ludGVybmFsX25ld19BY2Nlc3NpYmxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFjY2Vzc2libGVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUFjY2Vzc2libGVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWNjZXNzaWJsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0aW9uQ2hhbmdlZCIpKSB0ZXN0X3NlbGVjdGlvbkNoYW5nZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvY3VzSSIpKSB0ZXN0X3NldEZvY3VzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dENhcmV0TW92ZWRJIikpIHRlc3RfdGV4dENhcmV0TW92ZWRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90ZXh0Q2hhbmdlZElJSSIpKSB0ZXN0X3RleHRDaGFuZ2VkSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90ZXh0U2VsZWN0aW9uQ2hhbmdlZCIpKSB0ZXN0X3RleHRTZWxlY3Rpb25DaGFuZ2VkKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLXByaXZhdGUgQWNjZXNzaWJsZSBhY2Nlc3NpYmxlOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3MGYxMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTU0YjEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyMTE2NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0KCkgewotCS8vIE9iamVjdCB3aWxsIHR5cGljYWxseSBiZSBhIHdpZGdldC4KLQlBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGV2ZW50ID0gbmV3IEFjY2Vzc2libGVDb250cm9sRXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQpOwotCQotCS8vIFRlc3Qgd2l0aCBzb21lIG90aGVyIG9iamVjdCBhbHNvLgotCWV2ZW50ID0gbmV3IEFjY2Vzc2libGVDb250cm9sRXZlbnQobmV3IEludGVnZXIoNSkpOwotCWFzc2VydE5vdE51bGwoZXZlbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUFjY2Vzc2libGVDb250cm9sRXZlbnQgZXZlbnQgPSBuZXcgQWNjZXNzaWJsZUNvbnRyb2xFdmVudChzaGVsbCk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGV2ZW50LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFNoZWxsIHNoZWxsOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlM2M5NGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWE1MGFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0KCkgewotCS8vIE9iamVjdCB3aWxsIHR5cGljYWxseSBiZSBhIHdpZGdldC4KLQlBY2Nlc3NpYmxlRXZlbnQgZXZlbnQgPSBuZXcgQWNjZXNzaWJsZUV2ZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLQkKLQkvLyBUZXN0IHdpdGggc29tZSBvdGhlciBvYmplY3QgYWxzby4KLQlldmVudCA9IG5ldyBBY2Nlc3NpYmxlRXZlbnQobmV3IEludGVnZXIoNSkpOwotCWFzc2VydE5vdE51bGwoZXZlbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUFjY2Vzc2libGVFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlRXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFNoZWxsIHNoZWxsOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2NlYWQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IikpIHRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IikpIHRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IikpIHRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxZjNlYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0QWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZVRleHRBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0QWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IikpIHRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCIpKSB0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODQwMzM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXNoZWxsLmRpc3Bvc2UoKTsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JLy8gT2JqZWN0IHdpbGwgdHlwaWNhbGx5IGJlIGEgd2lkZ2V0LgotCUFjY2Vzc2libGVUZXh0RXZlbnQgZXZlbnQgPSBuZXcgQWNjZXNzaWJsZVRleHRFdmVudChzaGVsbCk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci0JCi0JLy8gVGVzdCB3aXRoIHNvbWUgb3RoZXIgb2JqZWN0IGFsc28uCi0JZXZlbnQgPSBuZXcgQWNjZXNzaWJsZVRleHRFdmVudChuZXcgSW50ZWdlcig1KSk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JQWNjZXNzaWJsZVRleHRFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlVGV4dEV2ZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoZXZlbnQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgU2hlbGwgc2hlbGw7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlN2Y4Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25SYW5nZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb25SYW5nZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKSkgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25SYW5nZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hd3RfU1dUX0FXVC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hd3RfU1dUX0FXVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2VkNzVmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYXd0X1NXVF9BV1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYXd0LlNXVF9BV1QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdUIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYXd0X1NXVF9BV1QoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25ld19TaGVsbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfYXd0X0NhbnZhcyBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdUKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25ld19TaGVsbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfYXd0X0NhbnZhcyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUiKSkgdGVzdF9uZXdfRnJhbWVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMiKSkgdGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmI5NjkwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3NlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3NlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmRpc3Bvc2UoKTsKLQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5CT1JERVIpOwotCWJyb3dzZXIuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihudWxsLCBTV1QuTk9ORSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlDbG9zZVdpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCUxvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlTG9jYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkT3BlbldpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JT3BlbldpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5yZW1vdmVPcGVuV2luZG93TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCXRyeSB7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JU3RhdHVzVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRUaXRsZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlUaXRsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRpdGxlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZFRpdGxlTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlVGl0bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9iYWNrKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfYmFjayIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlicm93c2VyLmJhY2soKTsKLQkJcnVuTG9vcFRpbWVyKDEpOwotCX0KLQkvKiByZXR1cm5pbmcgMTAgdGltZXMgaW4gaGlzdG9yeSAtIGV4cGVjdGluZyBmYWxzZSBpcyByZXR1cm5lZCAqLwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5iYWNrKCk7Ci0JYXNzZXJ0RmFsc2UocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmciKTsKLQl0cnkgewotCQlicm93c2VyLmV4ZWN1dGUobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNjcmlwdCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvKiBSZWFsIHRlc3RpbmcgaXMgZG9uZSBpbiB0aGUgdGVzdHMgdGhhdCBydW4gdGhlIGV2ZW50IGxvb3AKLQkgKiBzaW5jZSBhIGRvY3VtZW50IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCB0byBleGVjdXRlIGEgc2NyaXB0IG9uIGl0LgotCSAqLwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvcndhcmQoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9mb3J3YXJkIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWJyb3dzZXIuZm9yd2FyZCgpOwotCQlydW5Mb29wVGltZXIoMSk7Ci0JfQotCS8qIGdvaW5nIGZvcndhcmQgMTAgdGltZXMgaW4gaGlzdG9yeSAtIGV4cGVjdGluZyBmYWxzZSBpcyByZXR1cm5lZCAqLwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5mb3J3YXJkKCk7Ci0JYXNzZXJ0RmFsc2UocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRVcmwoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9nZXRVcmwiKTsKLQlTdHJpbmcgc3RyaW5nID0gYnJvd3Nlci5nZXRVcmwoKTsKLQlhc3NlcnRUcnVlKHN0cmluZyAhPSBudWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0JhY2tFbmFibGVkKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfaXNCYWNrRW5hYmxlZCIpOwotCQotCS8qIGJhY2sgc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzQmFja0VuYWJsZWQgcHJldmlvdXNseSByZXR1cm5lZCAqLwotCWFzc2VydEVxdWFscyhicm93c2VyLmlzQmFja0VuYWJsZWQoKSwgYnJvd3Nlci5iYWNrKCkpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlicm93c2VyLmJhY2soKTsKLQkJcnVuTG9vcFRpbWVyKDEpOwotCX0KLQkvKiBnb2luZyBiYWNrIDEwIHRpbWVzIGluIGhpc3RvcnkgLSBleHBlY3RpbmcgZmFsc2UgaXMgcmV0dXJuZWQgKi8KLQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuaXNCYWNrRW5hYmxlZCgpOwotCWFzc2VydEZhbHNlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb3J3YXJkRW5hYmxlZCgpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2lzRm9yd2FyZEVuYWJsZWQiKTsKLQkKLQkvKiBmb3J3YXJkIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgdGhhdCBpc0ZvcndhcmRFbmFibGVkIHByZXZpb3VzbHkgcmV0dXJuZWQgKi8KLQlhc3NlcnRFcXVhbHMoYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCksIGJyb3dzZXIuZm9yd2FyZCgpKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCXJ1bkxvb3BUaW1lcigxKTsKLQl9Ci0JLyogZ29pbmcgZm9yd2FyZCAxMCB0aW1lcyBpbiBoaXN0b3J5IC0gZXhwZWN0aW5nIGZhbHNlIGlzIHJldHVybmVkICovCi0JYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmlzRm9yd2FyZEVuYWJsZWQoKTsKLQlhc3NlcnRGYWxzZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZnJlc2goKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9yZWZyZXNoIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWJyb3dzZXIucmVmcmVzaCgpOwotCQlydW5Mb29wVGltZXIoMSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNsb3NlV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQl0cnkgewotCQlicm93c2VyLnJlbW92ZUNsb3NlV2luZG93TGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIHRlc3RlZCBpbiBhZGRDbG9zZVdpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTG9jYXRpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlTG9jYXRpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZExvY2F0aW9uTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlT3BlbldpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkT3BlbldpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZFByb2dyZXNzTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTdGF0dXNUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkU3RhdHVzVGV4dExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlVGl0bGVMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZFRpdGxlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXNoZWxsLnNldFRleHQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JCi0JU3RyaW5nIGh0bWwgPSAiPEhUTUw+PEhFQUQ+PFRJVExFPkhUTUwgZXhhbXBsZSAyPC9USVRMRT48L0hFQUQ+PEJPRFk+PEgxPkhUTUwgZXhhbXBsZSAyPC9IMT4iOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Ci0JCWh0bWwgKz0iPFA+VGhhdCBpcyBhIHRlc3QgbGluZSB3aXRoIHRoZSBudW1iZXIgIitpKyI8L1A+IjsKLQl9Ci0JaHRtbCArPSAiPC9CT0RZPjwvSFRNTD4iOwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLQlydW5Mb29wVGltZXIoMTApOwotCQotCXRyeSB7Ci0JCWJyb3dzZXIuc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGV4dCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRVcmxMamF2YV9sYW5nX1N0cmluZygpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X3NldFVybExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5zZXRVcmwobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHVybCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkKLQkvKiBUSElTIFRFU1QgUkVRVUlSRVMgV0VCIEFDQ0VTUyEgSG93IGVsc2UgY2FuIHdlIHJlYWxseSB0ZXN0IHRoZSBodHRwOi8vIHBhcnQgb2YgYSBicm93c2VyIHdpZGdldD8gKi8KLQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QiKTsKLQlydW5Mb29wVGltZXIoMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0b3AoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9zdG9wIik7Ci0JLyogVEhJUyBURVNUIFJFUVVJUkVTIFdFQiBBQ0NFU1MhIEhvdyBlbHNlIGNhbiB3ZSByZWFsbHkgdGVzdCB0aGUgaHR0cDovLyBwYXJ0IG9mIGEgYnJvd3NlciB3aWRnZXQ/ICovCi0JYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0Iik7Ci0JcnVuTG9vcFRpbWVyKDEpOwotCWJyb3dzZXIuc3RvcCgpOwotCXJ1bkxvb3BUaW1lcigxMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9iYWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvcndhcmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFVybCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNCYWNrRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNGb3J3YXJkRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVmcmVzaCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFVybExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdG9wIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIikpIHRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKSkgdGVzdF9hZGRPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIiKSkgdGVzdF9hZGRQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIiKSkgdGVzdF9hZGRTdGF0dXNUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIiKSkgdGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIiKSkgdGVzdF9hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9iYWNrIikpIHRlc3RfYmFjaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb3J3YXJkIikpIHRlc3RfZm9yd2FyZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VXJsIikpIHRlc3RfZ2V0VXJsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0JhY2tFbmFibGVkIikpIHRlc3RfaXNCYWNrRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNGb3J3YXJkRW5hYmxlZCIpKSB0ZXN0X2lzRm9yd2FyZEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZnJlc2giKSkgdGVzdF9yZWZyZXNoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxvY2F0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUxvY2F0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlT3BlbldpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVRpdGxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVRpdGxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VXJsTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRVcmxMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3RvcCIpKSB0ZXN0X3N0b3AoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Ccm93c2VyIGJyb3dzZXI7Ci0KLXZvaWQgcnVuTG9vcFRpbWVyKGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JZmluYWwgYm9vbGVhbltdIGV4aXQgPSB7ZmFsc2V9OwotCW5ldyBUaHJlYWQoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7VGhyZWFkLnNsZWVwKHNlY29uZHMgKiAxMDAwKTt9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCWV4aXRbMF0gPSB0cnVlOwotCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0uc3RhcnQoKTsKLQlzaGVsbC5vcGVuKCk7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0Jd2hpbGUgKCFleGl0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmQ1YzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkNsb3NlV2luZG93TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkNsb3NlV2luZG93TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xvc2VMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Nsb3NlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xvc2VMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9jbG9zZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGY2M2YxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25BZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQluZXcgTG9jYXRpb25BZGFwdGVyKCkge307Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JTG9jYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTG9jYXRpb25BZGFwdGVyKCkgewkKLQl9OwotCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihhZGFwdGVyKTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50IikpIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50IikpIHRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZDk2ZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0JCQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKSkgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKSkgdGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZTU3OGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuT3BlbldpbmRvd0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5PcGVuV2luZG93TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW5XaW5kb3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbldpbmRvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW5XaW5kb3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9vcGVuV2luZG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZDM3ZjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0FkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCW5ldyBQcm9ncmVzc0FkYXB0ZXIoKSB7fTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzQWRhcHRlcigpIHt9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKSkgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50IikpIHRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGEzZWUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0xpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKSkgdGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGE3ZDAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyNTIwNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5UaXRsZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5UaXRsZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihuZXcgVGl0bGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChUaXRsZUV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlRXZlbnQiKSkgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZTY4YzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5WaXNpYmlsaXR5V2luZG93QWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQluZXcgVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIoKSB7fTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dBZGFwdGVyKCl7fSk7Ci0Jc2hlbGwuY2xvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50IikpIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpKSB0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhOWMzYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudAotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50IikpIHRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIyODAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkFuaW1hdGVkUHJvZ3Jlc3MKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQW5pbWF0ZWRQcm9ncmVzcwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jbGVhciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0YXJ0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zdGFydCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0b3AoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3N0b3Agbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xlYXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdGFydCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3RvcCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbGVhciIpKSB0ZXN0X2NsZWFyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdGFydCIpKSB0ZXN0X3N0YXJ0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdG9wIikpIHRlc3Rfc3RvcCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTBjMTM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQmlkaVNlZ21lbnRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NGM0NTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CaWRpU2VnbWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQmlkaVNlZ21lbnRMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CaWRpU2VnbWVudExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQlTaGVsbCBzaGVsbDsKLQlTdHlsZWRUZXh0IHRleHQ7Ci0JYm9vbGVhbiBsaXN0ZW5lckNhbGxlZDsJCi0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCQkJCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLXByaXZhdGUgdm9pZCB0ZXN0TGlzdGVuZXIoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIGludFtdIHNlZ21lbnRzLCBib29sZWFuIGV4Y2VwdGlvbkV4cGVjdGVkKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlCaWRpU2VnbWVudExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEJpZGlTZWdtZW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRTZWdtZW50cyhCaWRpU2VnbWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSArICIgaW5jb3JyZWN0IEJpZGlTZWdtZW50RXZlbnQiLCAwLCBldmVudC5saW5lT2Zmc2V0KTsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlICsgIiBpbmNvcnJlY3QgQmlkaVNlZ21lbnRFdmVudCIsIGxpbmUsIGV2ZW50LmxpbmVUZXh0KTsKLQkJCQotCQkJZXZlbnQuc2VnbWVudHMgPSBzZWdtZW50czsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsJCi0JCX0KLQl9OwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCQotCXRyeSB7Ci0JCXRleHQuYWRkQmlkaVNlZ21lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWZpbmFsbHkgewotCQl0ZXh0LnJlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQlpZiAoZXhjZXB0aW9uRXhwZWN0ZWQpIHsKLQkJYXNzZXJ0VHJ1ZShtZXNzYWdlICsgIiBleHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JfQotCWVsc2UgewotCQlhc3NlcnRUcnVlKG1lc3NhZ2UgKyAiIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biIsIGV4Y2VwdGlvblRocm93biA9PSBmYWxzZSk7Ci0JfQotCWlmIChpc0JpZGkoKSkgewotCQlhc3NlcnRUcnVlKG1lc3NhZ2UgKyAiIGxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7CQotCX0KLQllbHNlIHsKLQkJYXNzZXJ0VHJ1ZShtZXNzYWdlICsgIiBsaXN0ZW5lciBjYWxsZWQgd2hlbiBpdCBzaG91bGRuJ3QgYmUiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JfQotfQotcHJpdmF0ZSB2b2lkIHRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhmaW5hbCBpbnRbXSBzZWdtZW50cywgaW50W10gYm9sZFJhbmdlcykgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JQmlkaVNlZ21lbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBCaWRpU2VnbWVudExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0U2VnbWVudHMoQmlkaVNlZ21lbnRFdmVudCBldmVudCkgewotCQkJYXNzZXJ0RXF1YWxzKCIgaW5jb3JyZWN0IEJpZGlTZWdtZW50RXZlbnQiLCAwLCBldmVudC5saW5lT2Zmc2V0KTsKLQkJCWFzc2VydEVxdWFscygiIGluY29ycmVjdCBCaWRpU2VnbWVudEV2ZW50IiwgbGluZSwgZXZlbnQubGluZVRleHQpOwotCQkJCi0JCQlldmVudC5zZWdtZW50cyA9IHNlZ21lbnRzOwotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwkKLQkJfQotCX07Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkJCi0JdHJ5IHsKLQkJdGV4dC5hZGRCaWRpU2VnbWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGV4dC5zZXRTdHlsZVJhbmdlKG51bGwpOwotCQlmb3IgKGludCBpPTA7IGk8Ym9sZFJhbmdlcy5sZW5ndGg7IGkrPTIpIHsKLQkJCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKGJvbGRSYW5nZXNbaV0sIGJvbGRSYW5nZXNbaSsxXSwgbnVsbCwgbnVsbCwgU1dULkJPTEQpOwotCQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlUmFuZ2UpOwotCQl9Ci0JCXRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWZpbmFsbHkgewotCQl0ZXh0LnJlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQlhc3NlcnRUcnVlKCIgdW5leHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duID09IGZhbHNlKTsKLQlpZiAoaXNCaWRpKCkpIHsKLQkJYXNzZXJ0VHJ1ZSgiIGxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7CQotCX0KLQllbHNlIHsKLQkJYXNzZXJ0VHJ1ZSgiIGxpc3RlbmVyIGNhbGxlZCB3aGVuIGl0IHNob3VsZG4ndCBiZSIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGluZUdldFNlZ21lbnRzTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudCgpIHsKLQlpbnQgbGluZUxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0KLQl0ZXh0LnNldFRleHQobGluZSk7CQotCS8vIHNob3VsZCBub3QgY2F1c2UgYW4gZXhjZXB0aW9uCi0JdGVzdExpc3RlbmVyKCI6YToiLCBudWxsLCBmYWxzZSk7Ci0JdGVzdExpc3RlbmVyKCI6YjoiLCBuZXcgaW50W10gezAsIGxpbmVMZW5ndGggLyAyLCBsaW5lTGVuZ3RofSwgZmFsc2UpOwotCXRlc3RMaXN0ZW5lcigiOmM6IiwgbmV3IGludFtdIHswLCBsaW5lTGVuZ3RoIC8gMn0sIGZhbHNlKTsKLQkJCQotCS8vIHNob3VsZCBhbGwgY2F1c2UgYW4gZXhjZXB0aW9uIG9uIGEgYmlkaSBwbGF0Zm9ybQotCWlmIChpc0JpZGkoKSkgewotCQl0ZXN0TGlzdGVuZXIoIjpkOiIsIG5ldyBpbnRbXSB7bGluZUxlbmd0aCAvIDJ9LCB0cnVlKTsKLQkJdGVzdExpc3RlbmVyKCI6ZToiLCBuZXcgaW50W10gezAsIDEsIDEsIGxpbmVMZW5ndGggLyAyfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmY6IiwgbmV3IGludFtdIHswLCAxLCAyLCBsaW5lTGVuZ3RoICsgMX0sIHRydWUpOwotCQl0ZXN0TGlzdGVuZXIoIjpnOiIsIG5ldyBpbnRbXSB7MCwgMSwgbGluZUxlbmd0aCArIDEsIGxpbmVMZW5ndGggKyAxfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmg6IiwgbmV3IGludFtdIHswLCAyLCAxfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmk6IiwgbmV3IGludFtdIHswLCAtMSwgMn0sIHRydWUpOwotCQl0ZXN0TGlzdGVuZXIoIjpqOiIsIG5ldyBpbnRbXSB7MCwgLTEsIDJ9LCB0cnVlKTsKLQl9Ci0KLQkvLyB0ZXN0IGJvbGQgc2VnbWVudGluZwotCWxpbmUgPSAidGhpcyBpcyBhIGxpbmUgd2l0aCA1MCBjaGFycyAtICoqKiogKioqKiAqKioqICoqKioiOwotCXRleHQuc2V0VGV4dChsaW5lKTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MCw1LDUsMiwxMiwzLDIwLDV9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1LDEwLDE1LDIwLDI1fSwgbmV3IGludFtdIHswLDUsNSwyLDEyLDMsMjAsNX0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHswLDUsNSwxLDcsMywxMCwzLDE1LDUsMjAsNX0KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDUsMTAsMTUsMjAsMjV9LCBuZXcgaW50W10gezAsNiw3LDYsMTUsMTB9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MCw1LDUsNSwxMCw1fQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNX0sIG5ldyBpbnRbXSB7MCwxNX0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHswLDV9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1fSwgbmV3IGludFtdIHswLDV9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MiwzfQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNX0sIG5ldyBpbnRbXSB7MiwzfSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezAsMn0KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDV9LCBuZXcgaW50W10gezAsMn0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHsxMCw1fQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNX0sIG5ldyBpbnRbXSB7MTAsNX0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHsxMiwzfQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNX0sIG5ldyBpbnRbXSB7MTIsM30pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHszLDIsNSw1LDEwLDMsMjEsNCwyNSwzfQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNSwyMCwyNSwzMH0sIG5ldyBpbnRbXSB7MywxMCwyMSw3fSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezEwLDJ9Ci0JbGluZSA9ICJ0ZXN0MXRlc3QyL3IvbiI7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNX0sIG5ldyBpbnRbXSB7MTAsMn0pOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9saW5lR2V0U2VnbWVudHNMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xpbmVHZXRTZWdtZW50c0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQiKSkgdGVzdF9saW5lR2V0U2VnbWVudHNMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZTc3NTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93V2hpbGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2xhbmdfUnVubmFibGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dXaGlsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfbGFuZ19SdW5uYWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1doaWxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dXaGlsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfbGFuZ19SdW5uYWJsZSIpKSB0ZXN0X3Nob3dXaGlsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfbGFuZ19SdW5uYWJsZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDllOTczMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm8KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljY29tYm8gPSBuZXcgQ0NvbWJvKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoY2NvbWJvKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29weSgpIHsKLQljY29tYm8uc2V0VGV4dCgiMTIzNDU2Iik7Ci0JY2NvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMSwzKSk7Ci0JY2NvbWJvLmNvcHkoKTsKLQljY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLDApKTsKLQljY29tYm8ucGFzdGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMjMxMjM0NTYiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY3V0KCkgewotCWNjb21iby5zZXRUZXh0KCIxMjM0NTYiKTsKLQljY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgxLDMpKTsKLQljY29tYm8uY3V0KCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY2NvbWJvLmdldFRleHQoKS5lcXVhbHMoIjE0NTYiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0kgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NsZWFyU2VsZWN0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jbGVhclNlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kZXNlbGVjdEFsbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGVzZWxlY3RJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkcmVuIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RWRpdGFibGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEVkaXRhYmxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtQ291bnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSGVpZ2h0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSGVpZ2h0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1zIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXggbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3R5bGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dEhlaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGV4dEhlaWdodCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRMaW1pdCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGV4dExpbWl0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb2N1c0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzRm9jdXNDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFzdGUoKSB7Ci0JY2NvbWJvLnNldFRleHQoIjEyMzQ1NiIpOwotCWNjb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDEsMykpOwotCWNjb21iby5jdXQoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMTQ1NiIpKTsKLQljY29tYm8ucGFzdGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMTIzNDU2IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZHJhdygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVkcmF3IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3SUlJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlZHJhd0lJSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVBbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZWxlY3RJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdGFibGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFZGl0YWJsZVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RW5hYmxlZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9jdXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGltaXRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGltaXRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFZpc2libGVaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbGVhclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvcHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2N1dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRyZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVkaXRhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRMaW1pdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0ZvY3VzQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFzdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZHJhdyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3SUlJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdGFibGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExpbWl0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xlYXJTZWxlY3Rpb24iKSkgdGVzdF9jbGVhclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weSIpKSB0ZXN0X2NvcHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2N1dCIpKSB0ZXN0X2N1dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJIikpIHRlc3RfZGVzZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZHJlbiIpKSB0ZXN0X2dldENoaWxkcmVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFZGl0YWJsZSIpKSB0ZXN0X2dldEVkaXRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKSkgdGVzdF9nZXRJdGVtSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SGVpZ2h0IikpIHRlc3RfZ2V0VGV4dEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dExpbWl0IikpIHRlc3RfZ2V0VGV4dExpbWl0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0ZvY3VzQ29udHJvbCIpKSB0ZXN0X2lzRm9jdXNDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYXN0ZSIpKSB0ZXN0X3Bhc3RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXciKSkgdGVzdF9yZWRyYXcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd0lJSUlaIikpIHRlc3RfcmVkcmF3SUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFsbCIpKSB0ZXN0X3JlbW92ZUFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSSIpKSB0ZXN0X3JlbW92ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUlJIikpIHRlc3RfcmVtb3ZlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SSIpKSB0ZXN0X3NlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRhYmxlWiIpKSB0ZXN0X3NldEVkaXRhYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9jdXMiKSkgdGVzdF9zZXRGb2N1cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExpbWl0SSIpKSB0ZXN0X3NldFRleHRMaW1pdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZpc2libGVaIikpIHRlc3Rfc2V0VmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIEN1c3RvbSAqLwotQ0NvbWJvIGNjb21ibzsKLQotcHJpdmF0ZSB2b2lkIGFkZCgpIHsKLSAgICBjY29tYm8uYWRkKCJ0aGlzIik7Ci0gICAgY2NvbWJvLmFkZCgiaXMiKTsKLSAgICBjY29tYm8uYWRkKCJTV1QiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KGNjb21iby5nZXRTaXplKCkueC0xMCwgNSwgMzAsIGNjb21iby5nZXRJdGVtSGVpZ2h0KCkqMiwgCi0gICAgICAgICAgICAJCSBDb25zaXN0ZW5jeVV0aWxpdHkuU0VMRUNUSU9OKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICAvL29uIGFycm93Ci0gICAgY29uc2lzdGVuY3lFdmVudChjY29tYm8uZ2V0U2l6ZSgpLngtMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgLy9vbiB0ZXh0Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMywgQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDEwZTJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWxhYmVsID0gbmV3IENMYWJlbChzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGxhYmVsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxpZ25tZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBbGlnbm1lbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9vbFRpcFRleHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvb2xUaXBUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QWxpZ25tZW50SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0xhYmVsKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbGlnbm1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxpZ25tZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9vbFRpcFRleHQiKSkgdGVzdF9nZXRUb29sVGlwVGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxpZ25tZW50SSIpKSB0ZXN0X3NldEFsaWdubWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJIikpIHRlc3Rfc2V0QmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUNMYWJlbCBsYWJlbDsKLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjJlZDYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZENUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVUcmltSUlJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Db3VudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGFiSGVpZ2h0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUYWJIZWlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BSaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9wUmlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQ1RhYkZvbGRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvcmRlclZpc2libGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCb3JkZXJWaXNpYmxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbnNlcnRNYXJrSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluc2VydE1hcmtJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTZWxlY3Rpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGFiSGVpZ2h0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGFiSGVpZ2h0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd1NlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZENUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUYWJIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcFJpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbnNlcnRNYXJrSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUYWJIZWlnaHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9QZ2R3blNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIiKSkgdGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGFiSGVpZ2h0IikpIHRlc3RfZ2V0VGFiSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BSaWdodCIpKSB0ZXN0X2dldFRvcFJpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIikpIHRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbnNlcnRNYXJrSVoiKSkgdGVzdF9zZXRJbnNlcnRNYXJrSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVoiKSkgdGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW1aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldFNlbGVjdGlvbkZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGFiSGVpZ2h0SSIpKSB0ZXN0X3NldFRhYkhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9QZ2R3blNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfUGd1cFNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBDVGFiRm9sZGVyIGN0YWJGb2xkZXI7Ci0KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudCgpIHsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLQljdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIoc2hlbGwsIDApOwotCXNldFdpZGdldChjdGFiRm9sZGVyKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYkZvbGRlcihWZWN0b3IgZXZlbnRzKSB7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKGN0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJDVGFiSXRlbSAmIiArIGkpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJDVGFiSXRlbSBUb29sVGlwIiArIGkpOwotCQlUZXh0IGl0ZW1UZXh0ID0gbmV3IFRleHQoY3RhYkZvbGRlciwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCWl0ZW1UZXh0LnNldFRleHQoIlxuVGV4dCBmb3IgQ1RhYkl0ZW0gIiArIGkgKyAiXG5cblxuIik7Ci0JCWl0ZW0uc2V0Q29udHJvbChpdGVtVGV4dCk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbVRleHQsIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotCWN0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGN0YWJGb2xkZXIuZ2V0SXRlbSgwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfUklHSFQsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KGN0YWJGb2xkZXIuZ2V0U2l6ZSgpLngvMiwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkNUUkwsIDAsIFNXVC5QQUdFX0RPV04sIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTLCBldmVudHMsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGN0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDIpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkNUUkwsIDAsIFNXVC5QQUdFX1VQLCBDb25zaXN0ZW5jeVV0aWxpdHkuRE9VQkxFX0tFWV9QUkVTUywgZXZlbnRzLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICBjdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICBjdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCA3MCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlZThkZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCIpKSB0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Y2U1YTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCXN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MjgxMDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXJMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IikpIHRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMzQ5MmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLQlDVGFiRm9sZGVyIGNUYWJGb2xkZXI7Ci0JQ1RhYkl0ZW0gY1RhYkl0ZW07Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWNUYWJGb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihzaGVsbCwgU1dULk5PTkUpOwotCWNUYWJJdGVtID0gbmV3IENUYWJJdGVtKGNUYWJGb2xkZXIsIFNXVC5OT05FKTsKLQlzZXRXaWRnZXQoY1RhYkl0ZW0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzYWJsZWRJbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGlzYWJsZWRJbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9vbFRpcFRleHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvb2xUaXBUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREaXNhYmxlZEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvb2xUaXBUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250cm9sIikpIHRlc3RfZ2V0Q29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGlzYWJsZWRJbWFnZSIpKSB0ZXN0X2dldERpc2FibGVkSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9vbFRpcFRleHQiKSkgdGVzdF9nZXRUb29sVGlwVGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg4Y2Q3ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5Db250cm9sRWRpdG9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNvbnRyb2xFZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVkaXRvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RWRpdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9sYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFZGl0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWRpdG9yIikpIHRlc3RfZ2V0RWRpdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXQiKSkgdGVzdF9sYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwMDU1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5FeHRlbmRlZE1vZGlmeUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkV4dGVuZGVkTW9kaWZ5RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50KCkgewotCS8vIHRoaXMgbWV0aG9kIHRlc3RlZCBieSBvdGhlciB0ZXN0IGNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDhjMjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCWludCB2ZXJpZnkgPSAtMTsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzaGVsbC5vcGVuKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQoKSB7Ci0JRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KEV4dGVuZGVkTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCh2ZXJpZnkpIHsKLQkJCQljYXNlIDEgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxYToiLCBldmVudC5zdGFydCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjFiOiIsIGV2ZW50Lmxlbmd0aCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjFjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMiA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjJhOiIsIGV2ZW50LnN0YXJ0ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MmI6IiwgZXZlbnQubGVuZ3RoID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6MmM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXG5cbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMyA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjNhOiIsIGV2ZW50LnN0YXJ0ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6M2I6IiwgZXZlbnQubGVuZ3RoID09IDIpOwotCQkJCQlhc3NlcnRUcnVlKCI6M2M6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiYSIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNDogewotCQkJCQlhc3NlcnRUcnVlKCI6NDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDUgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo1YToiLCBldmVudC5zdGFydCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjViOiIsIGV2ZW50Lmxlbmd0aCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjVjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNiA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjZhOiIsIGV2ZW50LnN0YXJ0ID09IDIxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjZiOiIsIGV2ZW50Lmxlbmd0aCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjZjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIlxubGluZSA0IikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA3IDogewotCQkJCQlhc3NlcnRUcnVlKCI6N2E6IiwgZXZlbnQuc3RhcnQgPT0gNSk7Ci0JCQkJCWFzc2VydFRydWUoIjo3YjoiLCBldmVudC5sZW5ndGggPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjo3YzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDggOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo4YToiLCBldmVudC5zdGFydCA9PSA3KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjhiOiIsIGV2ZW50Lmxlbmd0aCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjhjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIlxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDkgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo5YToiLCBldmVudC5zdGFydCA9PSAyKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjliOiIsIGV2ZW50Lmxlbmd0aCA9PSA0KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjljOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIlxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEwOnsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTE6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjExOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTI6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyYToiLCBldmVudC5zdGFydCA9PSAzKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyYjoiLCBldmVudC5sZW5ndGggPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjoxMmM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTNhOiIsIGV2ZW50LnN0YXJ0ID09IDIpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTNiOiIsIGV2ZW50Lmxlbmd0aCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEzYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE0OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE1OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNWE6IiwgZXZlbnQuc3RhcnQgPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjoxNWI6IiwgZXZlbnQubGVuZ3RoID09IDYpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTVjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIlxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE2OnsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE2OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTc6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE3OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTg6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4YToiLCBldmVudC5zdGFydCA9PSAzKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4YjoiLCBldmVudC5sZW5ndGggPT0gNyk7Ci0JCQkJCWFzc2VydFRydWUoIjoxOGM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxOTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTlhOiIsIGV2ZW50LnN0YXJ0ID09IDIpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTliOiIsIGV2ZW50Lmxlbmd0aCA9PSA3KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE5YzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIwOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyMDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIxOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyMWE6IiwgZXZlbnQuc3RhcnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoyMWI6IiwgZXZlbnQubGVuZ3RoID09IDE2KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIxYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0Jc3R5bGVkVGV4dC5hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkKLQlib29sZWFuIGV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCXZlcmlmeSA9IDE7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlxuXG4iKTsKLQl2ZXJpZnkgPSAyOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAyLCAiYSIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoImEiKTsKLQl2ZXJpZnkgPSAzOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiXG5cbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDQ7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6NDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTGluZSAxXHJcbkxpbmUgMiIpOwotCXZlcmlmeSA9IDU7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKTsKLQl2ZXJpZnkgPSA2OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyMSwgNywgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JdmVyaWZ5ID0gNzsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNSwgOSwgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlxuTDFcclxuTDJcclxuIik7Ci0JdmVyaWZ5ID0gODsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNywgMiwgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDk7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0Iik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTA7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgIiIpO30gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl2ZXJpZnkgPSAxMTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAiIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxMTogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcciIpOwotCXZlcmlmeSA9IDEyOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxuIik7Ci0JdmVyaWZ5ID0gMTM7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDE0OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJ0ZXN0Iik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTU7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0XG5cbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDE2OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XHJcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTY6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDE3OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICJ0ZXN0XG5cbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTc6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLSAJc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyIik7Ci0JdmVyaWZ5ID0gMTg7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbnRlc3RcclxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcbiIpOwotCXZlcmlmeSA9IDE5OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAidGVzdFxyXHJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDIwOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjIwOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDIxOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0Jc3R5bGVkVGV4dC5yZW1vdmVFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQiKSkgdGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzUwNDNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVCYWNrZ3JvdW5kRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZUJhY2tncm91bmRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQoKSB7Ci0JLy8gdGhpcyBtZXRob2QgdGVzdGVkIGJ5IG90aGVyIHRlc3QgY2xhc3NlcwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwM2U0Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lQmFja2dyb3VuZExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2hlbGwub3BlbigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xpbmVHZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCgpIHsKLQlMaW5lQmFja2dyb3VuZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRCYWNrZ3JvdW5kKExpbmVCYWNrZ3JvdW5kRXZlbnQgZXZlbnQpIHsKLQkJCWFzc2VydFRydWUoIjoxOiIsIGV2ZW50LmxpbmVPZmZzZXQ9PTApOwotCQkJYXNzZXJ0VHJ1ZSgiOjI6IixldmVudC5saW5lVGV4dC5lcXVhbHMoIjAxMjM0NTY3ODkiKSk7Ci0JCX0KLQl9OwotCXN0eWxlZFRleHQuYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0JLy8gZm9yY2UgZ2V0IGxpbmUgYmcgY2FsbGJhY2sKLQlzdHlsZWRUZXh0LnNlbGVjdEFsbCgpOwotCXN0eWxlZFRleHQuY29weSgpOwotCXN0eWxlZFRleHQucmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xpbmVHZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9saW5lR2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kRXZlbnQiKSkgdGVzdF9saW5lR2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIxYTA0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpIHsKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0ZWQgYnkgb3RoZXIgdGVzdCBjbGFzc2VzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFmY2YxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNoZWxsLm9wZW4oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9saW5lR2V0U3R5bGVMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudCgpIHsKLQlMaW5lU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaW5lU3R5bGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldFN0eWxlKExpbmVTdHlsZUV2ZW50IGV2ZW50KSB7Ci0JCQlhc3NlcnRUcnVlKCI6MToiLCBldmVudC5saW5lT2Zmc2V0PT0wKTsKLQkJCWFzc2VydFRydWUoIjoyOiIsZXZlbnQubGluZVRleHQuZXF1YWxzKCIwMTIzNDU2Nzg5IikpOwotCQl9Ci0JfTsKLQlzdHlsZWRUZXh0LmFkZExpbmVTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLQkvLyBmb3JjZSBnZXQgbGluZSBzdHlsZXMgY2FsbGJhY2sKLQlzdHlsZWRUZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNSk7Ci0Jc3R5bGVkVGV4dC5yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9saW5lR2V0U3R5bGVMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9saW5lR2V0U3R5bGVMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudCIpKSB0ZXN0X2xpbmVHZXRTdHlsZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjEzYWJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlBvcHVwTGlzdAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5Qb3B1cExpc3QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3QgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtV2lkdGgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW1XaWR0aCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NlbGVjdExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1XaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1pbmltdW1XaWR0aEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW11bVdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW11bVdpZHRoSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNaW5pbXVtV2lkdGgiKSkgdGVzdF9nZXRNaW5pbXVtV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZWxlY3RMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1XaWR0aEkiKSkgdGVzdF9zZXRNaW5pbXVtV2lkdGhJKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyMDNkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU1QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU1QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JLy8gZG9lc24ndCBtYWtlIHNlbnNlIHRvIHRlc3QgdGhpcywgU1QgaXMgY29uc3RhbnRzIGNsYXNzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2FzaEZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRjM2E3Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2FzaEZvcm0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2FzaEZvcm0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNYXhpbWl6ZWRDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNYXhpbWl6ZWRDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T3JpZW50YXRpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE9yaWVudGF0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2VpZ2h0cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0V2VpZ2h0cyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xheW91dFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2xheW91dFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW1pemVkQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNYXhpbWl6ZWRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmllbnRhdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE9yaWVudGF0aW9uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdlaWdodHMkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V2VpZ2h0cyRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNYXhpbWl6ZWRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPcmllbnRhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0V2VpZ2h0cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF5b3V0WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNYXhpbWl6ZWRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V2VpZ2h0cyRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWF4aW1pemVkQ29udHJvbCIpKSB0ZXN0X2dldE1heGltaXplZENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9yaWVudGF0aW9uIikpIHRlc3RfZ2V0T3JpZW50YXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdlaWdodHMiKSkgdGVzdF9nZXRXZWlnaHRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXRaIikpIHRlc3RfbGF5b3V0WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpKSB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1heGltaXplZENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldE1heGltaXplZENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0T3JpZW50YXRpb25JIikpIHRlc3Rfc2V0T3JpZW50YXRpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXZWlnaHRzJEkiKSkgdGVzdF9zZXRXZWlnaHRzJEkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TY3JvbGxlZENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmQ1Zjc3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TY3JvbGxlZENvbXBvc2l0ZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TY3JvbGxlZENvbXBvc2l0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBbHdheXNTaG93U2Nyb2xsQmFycyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPcmlnaW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE9yaWdpbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xheW91dFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2xheW91dFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBbHdheXNTaG93U2Nyb2xsQmFyc1ooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEFsd2F5c1Nob3dTY3JvbGxCYXJzWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEV4cGFuZEhvcml6b250YWxaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RXhwYW5kVmVydGljYWxaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFeHBhbmRWZXJ0aWNhbFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluSGVpZ2h0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluSGVpZ2h0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pblNpemVJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluU2l6ZUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1pblNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluV2lkdGhJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNaW5XaWR0aEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmlnaW5JSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0T3JpZ2luSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmlnaW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRPcmlnaW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbHdheXNTaG93U2Nyb2xsQmFycyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0T3JpZ2luIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbHdheXNTaG93U2Nyb2xsQmFyc1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEV4cGFuZFZlcnRpY2FsWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluSGVpZ2h0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluU2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluV2lkdGhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRPcmlnaW5JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0T3JpZ2luTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBbHdheXNTaG93U2Nyb2xsQmFycyIpKSB0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250ZW50IikpIHRlc3RfZ2V0Q29udGVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T3JpZ2luIikpIHRlc3RfZ2V0T3JpZ2luKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXRaIikpIHRlc3RfbGF5b3V0WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWx3YXlzU2hvd1Njcm9sbEJhcnNaIikpIHRlc3Rfc2V0QWx3YXlzU2hvd1Njcm9sbEJhcnNaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEV4cGFuZEhvcml6b250YWxaIikpIHRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEV4cGFuZFZlcnRpY2FsWiIpKSB0ZXN0X3NldEV4cGFuZFZlcnRpY2FsWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpKSB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbkhlaWdodEkiKSkgdGVzdF9zZXRNaW5IZWlnaHRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5TaXplSUkiKSkgdGVzdF9zZXRNaW5TaXplSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pblNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0TWluU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbldpZHRoSSIpKSB0ZXN0X3NldE1pbldpZHRoSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0T3JpZ2luSUkiKSkgdGVzdF9zZXRPcmlnaW5JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0T3JpZ2luTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldE9yaWdpbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdGFja0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjZlM2ZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWJhMjk1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2UKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCWZpbmFsIHN0YXRpYyBSR0IgUkVEID0gbmV3IFJHQigyNTUsMCwwKTsKLQlmaW5hbCBzdGF0aWMgUkdCIEJMVUUgPSBuZXcgUkdCKDAsMCwyNTUpOwotCWZpbmFsIHN0YXRpYyBSR0IgR1JFRU4gPSBuZXcgUkdCKDAsMjU1LDApOwotCUhhc2h0YWJsZSBjb2xvcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHJpdmF0ZSBDb2xvciBnZXRDb2xvcihSR0IgcmdiKSB7Ci0JcmV0dXJuIChDb2xvciljb2xvcnMuZ2V0KHJnYik7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29sb3JzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCWNvbG9ycy5wdXQoUkVELCBuZXcgQ29sb3IgKGRpc3BsYXksIFJFRCkpOwotCWNvbG9ycy5wdXQoR1JFRU4sIG5ldyBDb2xvciAoZGlzcGxheSwgR1JFRU4pKTsKLQljb2xvcnMucHV0KEJMVUUsIG5ldyBDb2xvciAoZGlzcGxheSwgQkxVRSkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWluaXRpYWxpemVDb2xvcnMoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JRW51bWVyYXRpb24gZWxlbWVudHMgPSBjb2xvcnMua2V5cygpOwotCXdoaWxlIChlbGVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlDb2xvciBjb2xvciA9IChDb2xvciljb2xvcnMuZ2V0KGVsZW1lbnRzLm5leHRFbGVtZW50KCkpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzdHlsZVJhbmdlLnN0YXJ0ID09IDApOwotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlUmFuZ2UubGVuZ3RoID09IDApOwotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlUmFuZ2UuZm9yZWdyb3VuZCA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzdHlsZVJhbmdlLmJhY2tncm91bmQgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc3R5bGVSYW5nZS5mb250U3R5bGUgPT0gU1dULk5PUk1BTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVSYW5nZS5zdGFydCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzdHlsZVJhbmdlLmxlbmd0aCA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVSYW5nZS5mb3JlZ3JvdW5kID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjpiOiIsIHN0eWxlUmFuZ2UuYmFja2dyb3VuZCA9PSBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVSYW5nZS5mb250U3R5bGUgPT0gU1dULk5PUk1BTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9ySSgpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZVJhbmdlLnN0YXJ0ID09IDUpOwotCWFzc2VydFRydWUoIjpjOiIsIHN0eWxlUmFuZ2UubGVuZ3RoID09IDEwKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZVJhbmdlLmZvcmVncm91bmQgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc3R5bGVSYW5nZS5iYWNrZ3JvdW5kID09IGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZVJhbmdlLmZvbnRTdHlsZSA9PSBTV1QuQk9MRCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQSA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBudWxsLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQiA9IChTdHlsZVJhbmdlKXN0eWxlUmFuZ2VBLmNsb25lKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6Iiwgc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VCKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQSA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULkJPTEQpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUIgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VDID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIGdldENvbG9yKEJMVUUpLCBnZXRDb2xvcihCTFVFKSwgU1dULkJPTEQpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUQgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VFID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTEsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRiA9IG5ldyBTdHlsZVJhbmdlKDUsIDExLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihSRUQpLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRyA9IG5ldyBTdHlsZVJhbmdlKDUsIDExLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VCKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VDKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VGKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwhc3R5bGVSYW5nZUEuZXF1YWxzKHN0eWxlUmFuZ2VHKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JQ29sb3IgdGVzdENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCAwLCAwLCAwKTsKLQkKLQkvL3JlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDMwOTI0Ci0Jc2V0LmFkZChuZXcgU3R5bGVSYW5nZSgpKTsKLQlzZXQuYWRkKG5ldyBTdHlsZVJhbmdlKDAsIDEsIHRlc3RDb2xvciwgbnVsbCkpOwotCXNldC5hZGQobmV3IFN0eWxlUmFuZ2UoMCwgMSwgdGVzdENvbG9yLCB0ZXN0Q29sb3IpKTsKLQlzZXQuYWRkKG5ldyBTdHlsZVJhbmdlKDAsIDEsIHRlc3RDb2xvciwgdGVzdENvbG9yLCBTV1QuQk9MRCkpOwotCXRlc3RDb2xvci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNVbnN0eWxlZCgpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VBID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIG51bGwsIG51bGwsIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUIgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoUkVEKSwgbnVsbCwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQyA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBudWxsLCBudWxsLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRCA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBudWxsLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRSA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBudWxsLCBudWxsKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBzdHlsZVJhbmdlQS5pc1Vuc3R5bGVkKCkpOwotCWFzc2VydFRydWUoIjplOiIsIXN0eWxlUmFuZ2VCLmlzVW5zdHlsZWQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwhc3R5bGVSYW5nZUMuaXNVbnN0eWxlZCgpKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCFzdHlsZVJhbmdlRC5pc1Vuc3R5bGVkKCkpOwotCWFzc2VydFRydWUoIjplOiIsIHN0eWxlUmFuZ2VFLmlzVW5zdHlsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2ltaWxhclRvTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VBID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VCID0gbmV3IFN0eWxlUmFuZ2UoNSwgNSwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUMgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUQgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoQkxVRSksIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VFID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKFJFRCksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUYgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzdHlsZVJhbmdlQS5zaW1pbGFyVG8oc3R5bGVSYW5nZUIpKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzdHlsZVJhbmdlQS5zaW1pbGFyVG8oc3R5bGVSYW5nZUMpKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCAhc3R5bGVSYW5nZUEuc2ltaWxhclRvKHN0eWxlUmFuZ2VEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgIXN0eWxlUmFuZ2VBLnNpbWlsYXJUbyhzdHlsZVJhbmdlRSkpOwotCWFzc2VydFRydWUoIjpmOiIsICFzdHlsZVJhbmdlQS5zaW1pbGFyVG8oc3R5bGVSYW5nZUYpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgbnVsbCwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCXN0eWxlUmFuZ2UudG9TdHJpbmcoKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvbmUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNVbnN0eWxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2ltaWxhclRvTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JJIikpIHRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xvbmUiKSkgdGVzdF9jbG9uZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNVbnN0eWxlZCIpKSB0ZXN0X2lzVW5zdHlsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NpbWlsYXJUb0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKSkgdGVzdF9zaW1pbGFyVG9Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYmFhZDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLkJpZGlVdGlsOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyB7Ci0KLVN0eWxlZFRleHQgdGV4dDsKLWZpbmFsIHN0YXRpYyBSR0IgUkVEID0gbmV3IFJHQigyNTUsMCwwKTsKLWZpbmFsIHN0YXRpYyBSR0IgQkxVRSA9IG5ldyBSR0IoMCwwLDI1NSk7Ci1maW5hbCBzdGF0aWMgUkdCIEdSRUVOID0gbmV3IFJHQigwLDI1NSwwKTsKLWZpbmFsIHN0YXRpYyBSR0IgWUVMTE9XID0gbmV3IFJHQigyNTUsMjU1LDApOwotZmluYWwgc3RhdGljIFJHQiBDWUFOID0gbmV3IFJHQigwLDI1NSwyNTUpOwotZmluYWwgc3RhdGljIFJHQiBQVVJQTEUgPSBuZXcgUkdCKDI1NSwwLDI1NSk7Ci1maW5hbCBzdGF0aWMgU3RyaW5nIFBMQVRGT1JNX0xJTkVfREVMSU1JVEVSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotSGFzaHRhYmxlIGNvbG9ycyA9IG5ldyBIYXNodGFibGUoKTsKLXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lckNhbGxlZDsJCi1wcml2YXRlIGJvb2xlYW4gbGlzdGVuZXIyQ2FsbGVkOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWluaXRpYWxpemVDb2xvcnMoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCUVudW1lcmF0aW9uIGVsZW1lbnRzID0gY29sb3JzLmtleXMoKTsKLQl3aGlsZSAoZWxlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJQ29sb3IgY29sb3IgPSAoQ29sb3IpY29sb3JzLmdldCgoUkdCKWVsZW1lbnRzLm5leHRFbGVtZW50KCkpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotCXN1cGVyLnRlYXJEb3duKCk7Ci0JCi19Ci0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIFN0eWxlUmFuZ2VbXSBkZWZhdWx0U3R5bGVzKCkgewotCXJldHVybiBuZXcgU3R5bGVSYW5nZVtdIHsKLQkJZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSwgCi0JCWdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTiksIAotCQlnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcm90ZWN0ZWQgdm9pZCBnZXRMaW5lQmFja2dyb3VuZHMoKSB7Ci0JZm9yIChpbnQgaT0wOyBpPHRleHQuZ2V0TGluZUNvdW50KCk7IGkrKykgewotCQl0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKGkpOwotCX0KLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIFN0cmluZyB0ZXh0U3RyaW5nKCkgewotCXJldHVybiAiVGhpcyBpcyB0aGUgdGV4dCBjb21wb25lbnQgaW4gdGVzdGluZ1xuTmV3IExpbmUxXG5OZXcgTGluZTJcbk5ldyBMaW5lM1xuTmV3IExpbmU0LiI7Ci19Ci1ib29sZWFuIGlzQmlkaUNhcmV0KCkgewotCXJldHVybiBCaWRpVXRpbC5pc0JpZGlQbGF0Zm9ybSgpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBub3QgYmUgcHVibGljIHNvIHRoYXQgdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgU3R5bGVSYW5nZSBnZXRTdHlsZShpbnQgc3RhcnQsIGludCBsZW5ndGgsIFJHQiBmZywgUkdCIGJnKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUuc3RhcnQgPSBzdGFydDsKLQlzdHlsZS5sZW5ndGggPSBsZW5ndGg7Ci0JaWYgKGZnICE9IG51bGwpIHN0eWxlLmZvcmVncm91bmQgPSBnZXRDb2xvcihmZyk7Ci0JZWxzZSBzdHlsZS5mb3JlZ3JvdW5kID0gbnVsbDsKLQlpZiAoYmcgIT0gbnVsbCkgc3R5bGUuYmFja2dyb3VuZCA9IGdldENvbG9yKGJnKTsKLQllbHNlIHN0eWxlLmJhY2tncm91bmQgPSBudWxsOwotCXJldHVybiBzdHlsZTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIENvbG9yIGdldENvbG9yKFJHQiByZ2IpIHsKLQlyZXR1cm4gKENvbG9yKWNvbG9ycy5nZXQocmdiKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29sb3JzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCWNvbG9ycy5wdXQoUkVELCBuZXcgQ29sb3IgKGRpc3BsYXksIFJFRCkpOwotCWNvbG9ycy5wdXQoQkxVRSwgbmV3IENvbG9yIChkaXNwbGF5LCBCTFVFKSk7Ci0JY29sb3JzLnB1dChHUkVFTiwgbmV3IENvbG9yIChkaXNwbGF5LCBHUkVFTikpOwotCWNvbG9ycy5wdXQoWUVMTE9XLCBuZXcgQ29sb3IgKGRpc3BsYXksIFlFTExPVykpOwotCWNvbG9ycy5wdXQoQ1lBTiwgbmV3IENvbG9yIChkaXNwbGF5LCBDWUFOKSk7Ci0JY29sb3JzLnB1dChQVVJQTEUsIG5ldyBDb2xvciAoZGlzcGxheSwgUFVSUExFKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpewotCVN0eWxlZFRleHQgdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuUkVBRF9PTkxZKTsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuZGlzcG9zZSgpOwotCi0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFZlcnRpY2FsQmFyKCkgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRIb3Jpem9udGFsQmFyKCkgPT0gbnVsbCk7Ci0JdGV4dC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JZmluYWwgU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KEV4dGVuZGVkTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLmxlbmd0aCgpLCBldmVudC5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCAiIiwgZXZlbnQucmVwbGFjZWRUZXh0KTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCQkKLQkvLyB0ZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnQgbW9kaWZ5aW5nIEFQSSBtZXRob2RzIHNlbmQgYW4gRXh0ZW5kZWRNb2RpZnkgZXZlbnQKLQl0ZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LmFwcGVuZChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiYXBwZW5kIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuaW5zZXJ0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXIgPSBuZXcgRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChFeHRlbmRlZE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZS5sZW5ndGgoKSwgZXZlbnQubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZS5zdWJzdHJpbmcoMCwgMSksIGV2ZW50LnJlcGxhY2VkVGV4dCk7Ci0JCX0KLQl9OwotCXRleHQuYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsIGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXIgPSBuZXcgRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChFeHRlbmRlZE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZS5sZW5ndGgoKSwgZXZlbnQubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSArIGxpbmUuc3Vic3RyaW5nKDEsIGxpbmUubGVuZ3RoKCkpICsgbGluZSwgZXZlbnQucmVwbGFjZWRUZXh0KTsKLQkJfQotCX07Ci0JdGV4dC5hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoInNldFRleHQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRLZXlCaW5kaW5nSUkoKXsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCwgU1dULk5VTEwpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMKSA9PSBTV1QuTlVMTCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKFNXVC5ERUwsIFNULkxJTkVfVVApOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMKSA9PSBTVC5MSU5FX1VQKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyLCBTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMikgPT0gU1QuU0VMRUNUX1BBR0VfVVApOwotCXRleHQuc2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIsIFNULlBBR0VfVVApOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIpID09IFNULlBBR0VfVVApOwotCXRleHQuc2V0S2V5QmluZGluZygtMSwgU1QuUEFHRV9VUCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKC0xLCAtMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JQmlkaVNlZ21lbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBCaWRpU2VnbWVudExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0U2VnbWVudHMoQmlkaVNlZ21lbnRFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZEJpZGlTZWdtZW50TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQl0ZXh0LmFkZEJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgQmlkaVNlZ21lbnRMaXN0ZW5lci4gCi0JdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApOwotCWlmIChpc0JpZGkoKSkgewotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgY2FsbGVkIiwgbGlzdGVuZXJDYWxsZWQpOwotCX0KLQllbHNlIHsKLQkJYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgY2FsbGVkIHdoZW4gaXQgc2hvdWxkbid0IGJlIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCX0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgQmlkaVNlZ21lbnRMaXN0ZW5lci4gCi0JdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGluZUJhY2tncm91bmRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldEJhY2tncm91bmQoTGluZUJhY2tncm91bmRFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQl0ZXh0LmFkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0U2VsZWN0aW9uKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY29weSgpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcigpIHsKLQlTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlMaW5lU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaW5lU3R5bGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldFN0eWxlKExpbmVTdHlsZUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkTGluZVN0eWxlTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQl0ZXh0LmFkZExpbmVTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFNlbGVjdGlvbigwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgY2FsbGVkIiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQl0ZXh0LnNldFNlbGVjdGlvbigwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCU1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gdGVzdCB3aGV0aGVyIGFsbCBjb250ZW50IG1vZGlmeWluZyBBUEkgbWV0aG9kcyBzZW5kIGEgTW9kaWZ5IGV2ZW50CQotCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LmFwcGVuZChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiYXBwZW5kIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuaW5zZXJ0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCBsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgicmVwbGFjZVRleHRSYW5nZSBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoInNldFRleHQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyMkNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlsaXN0ZW5lcjJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRU5EKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgY2FsbGVkIiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIGNhbGxlZCB1bmV4cGVjdGVkbHkiLCBsaXN0ZW5lcjJDYWxsZWQgPT0gZmFsc2UpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JbGlzdGVuZXIyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0VORCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgY2FsbGVkIHVuZXhwZWN0ZWRseSIsIGxpc3RlbmVyMkNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVZlcmlmeUtleUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZlcmlmeUtleUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlLZXkoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRWZXJpZnlLZXlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQotCS8vIG9ubHkgdGVzdCB3aGV0aGVyIGxpc3RlbmVyIGNhbiBiZSBhZGRlZCBhbmQgcmVtb3ZlZC4KLQkvLyBjYW4ndCB0ZXN0IGxpc3RlbmVyIGJlY2F1c2UgVmVyaWZ5S2V5IGlzIHVzZXIgZHJpdmVuLgotCXRleHQuYWRkVmVyaWZ5S2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHQucmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JZmluYWwgU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWZpbmFsIFN0cmluZyBuZXdMaW5lID0gIk5ld0xpbmUxIjsKLQlmaW5hbCBpbnQgdGV4dExlbmd0aDsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVZlcmlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC5zdGFydCA9IDI7Ci0JCQlldmVudC5lbmQgPSA1OwotCQkJZXZlbnQudGV4dCA9IG5ld0xpbmU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0KLQkvLyB0ZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnQgbW9kaWZ5aW5nIEFQSSBzZW5kcyBhIFZlcmlmeSBldmVudAotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LmFwcGVuZChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiYXBwZW5kIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuaW5zZXJ0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lICsgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMSwgZXZlbnQuZW5kKTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUsIGV2ZW50LnRleHQpOwotCQkJZXZlbnQuc3RhcnQgPSAyOwotCQkJZXZlbnQuZW5kID0gNTsKLQkJCWV2ZW50LnRleHQgPSBuZXdMaW5lOwotCQl9Ci0JfTsKLQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0TGVuZ3RoID0gdGV4dC5nZXRDaGFyQ291bnQoKSAtIDEgKyBuZXdMaW5lLmxlbmd0aCgpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCBsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgicmVwbGFjZVRleHRSYW5nZSBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSArIG5ld0xpbmUuc3Vic3RyaW5nKDEsIG5ld0xpbmUubGVuZ3RoKCkpICsgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgdGV4dExlbmd0aCwgZXZlbnQuZW5kKTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUsIGV2ZW50LnRleHQpOwotCQkJZXZlbnQuc3RhcnQgPSAyOwotCQkJZXZlbnQuZW5kID0gNTsKLQkJCWV2ZW50LnRleHQgPSBuZXdMaW5lOwotCQl9Ci0JfTsKLQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoInNldFRleHQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDIsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIG5ld0xpbmUubGVuZ3RoKCksIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJfQotCX07Ci0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIHRleHQuZ2V0Q2hhckNvdW50KCkgLSAyLCBsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd247CQotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQkKLQl0ZXh0LmFwcGVuZChsaW5lKTsKLQlhc3NlcnRFcXVhbHMoImFwcGVuZCB0byBlbXB0eSB0ZXh0IiwgbGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQuYXBwZW5kKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJhcHBlbmQgbnVsbCBzdHJpbmciLCBleGNlcHRpb25UaHJvd24pOwotCi0JdGV4dC5hcHBlbmQoIiIpOwotCWFzc2VydEVxdWFscygiYXBwZW5kIGVtcHR5IHN0cmluZyIsIGxpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQl0ZXh0LmFwcGVuZChsaW5lKTsKLQlhc3NlcnRFcXVhbHMoImFwcGVuZCBub24tZW1wdHkgc3RyaW5nIiwgbGluZSArIGxpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQl0ZXh0LnNldFRleHQoIiIpOwotCVN0cmluZyB0ZXh0MiA9ICJsaW5lXHIiOwotCXRleHQuYXBwZW5kKHRleHQyKTsKLQlhc3NlcnRFcXVhbHMoImFwcGVuZCBzdHJpbmcgZW5kaW5nIHdpdGggbGluZSBkZWxpbWl0ZXIiLCB0ZXh0MiwgdGV4dC5nZXRUZXh0KCkpOwotCQotCVN0cmluZyB0ZXh0MyA9ICJsaW5lXHJcbmxpbmUzIjsKLQl0ZXh0LmFwcGVuZCh0ZXh0Myk7Ci0JYXNzZXJ0RXF1YWxzKCJhcHBlbmQgbXVsdGkgbGluZSBzdHJpbmciLCB0ZXh0MiArIHRleHQzLCB0ZXh0LmdldFRleHQoKSk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIGluaGVyaXRlZCB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb3B5KCkgewotCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHRleHQuZ2V0RGlzcGxheSgpKTsKLQlUZXh0VHJhbnNmZXIgdHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQlTdHJpbmcgY2xpcGJvYXJkVGV4dDsKLQlTdHJpbmcgY29udmVydGVkVGV4dDsKLQotCVN0cmluZyBiZWZvcmUgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JdGV4dC5jb3B5KCk7CQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjphOiIsIGJlZm9yZSA9PSBudWxsID8gY2xpcGJvYXJkVGV4dCA9PSBudWxsIDogYmVmb3JlLmVxdWFscyhjbGlwYm9hcmRUZXh0KSk7Ci0JCi0JYmVmb3JlID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCXRleHQuY29weSgpOwkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBiZWZvcmUgPT0gbnVsbCA/IGNsaXBib2FyZFRleHQgPT0gbnVsbCA6IGJlZm9yZS5lcXVhbHMoY2xpcGJvYXJkVGV4dCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAxKTsKLQl0ZXh0LmNvcHkoKTsJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKCIwIikpOwotCQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMSwgMik7CQotCXRleHQuY29weSgpOwkJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKCIxMiIpKTsKLQkKLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQl0ZXh0LnNldFRleHQoIlxyTGluZTFcbkxpbmUyXHJcbkxpbmUzXG5cckxpbmU0XG4iKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY29weSgpOwkJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQljb252ZXJ0ZWRUZXh0ID0gIlxyXG5MaW5lMVxyXG5MaW5lMlxyXG5MaW5lM1xyXG5cclxuTGluZTRcclxuIjsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiXG5MaW5lMVxuTGluZTJcbkxpbmUzXG5cbkxpbmU0XG4iOwotCX0KLQlhc3NlcnRUcnVlKCI6ZjoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCXRleHQuc2V0VGV4dCgiTGluZTFcclxuTGluZTIiKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY29weSgpOwkJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcbkxpbmUyIjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKGNvbnZlcnRlZFRleHQpKTsKLQotCXRlc3RSdGZDb3B5KCk7Ci0JY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jdXQoKSB7Ci0JQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQodGV4dC5nZXREaXNwbGF5KCkpOwotCVRleHRUcmFuc2ZlciB0cmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCVN0cmluZyBjbGlwYm9hcmRUZXh0OwotCVN0cmluZyBjb252ZXJ0ZWRUZXh0OwotCi0JU3RyaW5nIGJlZm9yZSA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQl0ZXh0LmN1dCgpOwkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBiZWZvcmUgPT0gbnVsbCA/IGNsaXBib2FyZFRleHQgPT0gbnVsbCA6IGJlZm9yZS5lcXVhbHMoY2xpcGJvYXJkVGV4dCkpOwotCQotCWJlZm9yZSA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQl0ZXh0LmN1dCgpOwkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBiZWZvcmUgPT0gbnVsbCA/IGNsaXBib2FyZFRleHQgPT0gbnVsbCA6IGJlZm9yZS5lcXVhbHMoY2xpcGJvYXJkVGV4dCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAxKTsKLQl0ZXh0LmN1dCgpOwkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoIjAiKSk7Ci0JCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgxLCAyKTsJCi0JdGV4dC5jdXQoKTsJCQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjplOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscygiMjMiKSk7Ci0JCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JdGV4dC5zZXRUZXh0KCJcckxpbmUxXG5MaW5lMlxyXG5MaW5lM1xuXHJMaW5lNFxuIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmN1dCgpOwkJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQljb252ZXJ0ZWRUZXh0ID0gIlxyXG5MaW5lMVxyXG5MaW5lMlxyXG5MaW5lM1xyXG5cclxuTGluZTRcclxuIjsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiXG5MaW5lMVxuTGluZTJcbkxpbmUzXG5cbkxpbmU0XG4iOwotCX0KLQlhc3NlcnRUcnVlKCI6ZjoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCXRleHQuc2V0VGV4dCgiTGluZTFcclxuTGluZTIiKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY3V0KCk7CQkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxuTGluZTIiOwotCX0KLQlhc3NlcnRUcnVlKCI6ZzoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCi0JY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCaWRpQ29sb3JpbmcoKSB7Ci0JLy8vIGdldEJpZGlDb2xvcmluZyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJpZGlDb2xvcmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENhcmV0T2Zmc2V0KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQotCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpLCAwLCAiTGluZTEiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JU3RyaW5nIG5ld1RleHQgPSAiTGluZS0xXHJcbiI7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDEpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSBuZXdUZXh0Lmxlbmd0aCgpICsgMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGVudCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gdGV4dC5nZXRDb250ZW50KCk7Ci0JCi0JYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOwotCWNvbnRlbnQgPSBuZXcgU3R5bGVkVGV4dENvbnRlbnQoKSB7Ci0JCXB1YmxpYyB2b2lkIGFkZFRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgaW50IGdldENoYXJDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRPZmZzZXRBdExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuIDA7Ci0JCX0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHRSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVwbGFjZVRleHRSYW5nZShpbnQgc3RhcnQsIGludCByZXBsYWNlTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJfQotCX07Ci0JdGV4dC5zZXRDb250ZW50KGNvbnRlbnQpOwotCWFzc2VydEVxdWFscyhjb250ZW50LCB0ZXh0LmdldENvbnRlbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RWRpdGFibGUoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIb3Jpem9udGFsSW5kZXgoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7CQotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMSk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoNTAwKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID4gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMSk7Ci0JLy8gbWFrZSBzdXJlIHRoZSB3aWRnZXQgY2FuIGJlIHNjcm9sbGVkCi0Jc2hlbGwub3BlbigpOwotCXRleHQuc2V0U2l6ZSgxMCwgNTApOwotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmo6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAxKTsJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhvcml6b250YWxQaXhlbCgpIHsJCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7CQotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPiAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA+IDApOwotCS8vIG1ha2Ugc3VyZSB0aGUgd2lkZ2V0IGNhbiBiZSBzY3JvbGxlZAotCXNoZWxsLm9wZW4oKTsKLQl0ZXh0LnNldFNpemUoMTAsIDUwKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRLZXlCaW5kaW5nSSgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkRFTCkgPT0gU1QuREVMRVRFX05FWFQpOwotCXRleHQuc2V0S2V5QmluZGluZyhTV1QuREVMLCBTVC5MSU5FX1VQKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkRFTCkgPT0gU1QuTElORV9VUCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMiwgU1QuU0VMRUNUX1BBR0VfVVApOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIpID09IFNULlNFTEVDVF9QQUdFX1VQKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyLCBTVC5QQUdFX1VQKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyKSA9PSBTVC5QQUdFX1VQKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldEtleUJpbmRpbmcoLTEpID09IFNXVC5OVUxMKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkYyKSA9PSBTV1QuTlVMTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hhckNvdW50KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gNSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IDApOwotCXRleHQuc2V0VGV4dCgiTGluZTBcbiIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gNik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUJhY2tncm91bmRJKCkgewotCVN0cmluZyB0ZXh0U3RyaW5nID0gIkwxXG5MMlxuTDNcbkw0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDIpID09IGdldENvbG9yKEJMVUUpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lQ291bnQoKSB7Ci0JU3RyaW5nIGRlbGltaXRlclN0cmluZyA9ICJcclxuIjsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0xKTsKLQl0ZXh0LmFwcGVuZCgiZGRkYXNkIiArIGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09Mik7Ci0JdGV4dC5hcHBlbmQoImRkYXNkYXNkYXNkYXNkIiArIGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09Myk7Ci0KLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0xKTsKLQl0ZXh0Lmluc2VydChkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0TGluZUNvdW50KCk9PTIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVBdE9mZnNldEkoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQl0cnkgewotCQl0ZXh0LmdldExpbmVBdE9mZnNldCgtMSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6YjoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5nZXRMaW5lQXRPZmZzZXQoMTAwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwkKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldExpbmVBdE9mZnNldCg0KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldExpbmVBdE9mZnNldCg1KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldExpbmVBdE9mZnNldCg2KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldExpbmVBdE9mZnNldCg3KSA9PSAxKTsKLQl0cnkgewotCQl0ZXh0LmdldExpbmVBdE9mZnNldCg4KTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpoOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCkgewotCWZpbmFsIFN0cmluZyBsaW5lRGVsaW1pdGVyID0gIlxuIjsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gdGV4dC5nZXRDb250ZW50KCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKGNvbnRlbnQuZ2V0TGluZURlbGltaXRlcigpLCB0ZXh0LmdldExpbmVEZWxpbWl0ZXIoKSk7Ci0KLQljb250ZW50ID0gbmV3IFN0eWxlZFRleHRDb250ZW50KCkgewotCQlwdWJsaWMgdm9pZCBhZGRUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIGludCBnZXRDaGFyQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQkJcmV0dXJuIGxpbmVEZWxpbWl0ZXI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRPZmZzZXRBdExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuIDA7Ci0JCX0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHRSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVwbGFjZVRleHRSYW5nZShpbnQgc3RhcnQsIGludCByZXBsYWNlTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJfQotCX07Ci0JdGV4dC5zZXRDb250ZW50KGNvbnRlbnQpOwotCWFzc2VydEVxdWFscyhsaW5lRGVsaW1pdGVyLCB0ZXh0LmdldExpbmVEZWxpbWl0ZXIoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUhlaWdodCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVIZWlnaHQoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVJbmRleCAoKSB7Ci0JdGVzdF9nZXRMaW5lSW5kZXgodGV4dCk7Ci0JU3R5bGVkVGV4dCB0ZXh0MiA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuV1JBUCk7Ci0JdGVzdF9nZXRMaW5lSW5kZXgodGV4dDIpOwotCXRleHQyLmRpc3Bvc2UoKTsKLX0KLQotdm9pZCB0ZXN0X2dldExpbmVJbmRleCAoU3R5bGVkVGV4dCB0ZXh0KSB7Ci0JaW50IGxpbmVIZWlnaHQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwXG5MaW5lMVxuTGluZTIiKTsKLQl0ZXh0LnNldFNpemUoNDAwLCBsaW5lSGVpZ2h0ICogMyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0xMDApKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0IC8gMikpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KGxpbmVIZWlnaHQgKyBsaW5lSGVpZ2h0IC8gMikpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVJbmRleCgyICogbGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMiAqIGxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMiAqIGxpbmVIZWlnaHQgKyBsaW5lSGVpZ2h0IC8gMikpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgzICogbGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMyAqIGxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMTAgKiBsaW5lSGVpZ2h0KSk7Ci0JCi0JdGV4dC5zZXRTaXplKDQwMCwgbGluZUhlaWdodCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEwICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtbGluZUhlaWdodCAvIDIpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgoMCkpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDIgKiBsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDEwICogbGluZUhlaWdodCkpOwotCi0KLQl0ZXh0LnNldFRvcEluZGV4KDIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtMTAgKiBsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0yICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtbGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgoLWxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgoLTEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDEwICogbGluZUhlaWdodCkpOwotCQotCi0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQl0ZXh0LnNldFNpemUoNDAwLCAwKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEwMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtMSkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KGxpbmVIZWlnaHQgLyAyKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KGxpbmVIZWlnaHQgLSAxKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KGxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgobGluZUhlaWdodCArIGxpbmVIZWlnaHQgLyAyKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KDIgKiBsaW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgyICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgyICogbGluZUhlaWdodCArIGxpbmVIZWlnaHQgLyAyKSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDMgKiBsaW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgzICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgxMCAqIGxpbmVIZWlnaHQpKTsKLQkKLQl0ZXh0LnNldFRvcFBpeGVsKDMgKiBsaW5lSGVpZ2h0KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTMgKiBsaW5lSGVpZ2h0IC0xMDApKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTMgKiBsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0yICogbGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgoLTIgKiBsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KC1saW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgtbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDEwMCkpOwotCQotCXRleHQuc2V0VG9wUGl4ZWwoMCk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEwMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KDEpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoMTAwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZVBpeGVsICgpIHsKLQl0ZXN0X2dldExpbmVQaXhlbCh0ZXh0KTsKLQlTdHlsZWRUZXh0IHRleHQyID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5XUkFQKTsKLQl0ZXN0X2dldExpbmVQaXhlbCh0ZXh0Mik7Ci0JdGV4dDIuZGlzcG9zZSgpOwotfQotCi12b2lkIHRlc3RfZ2V0TGluZVBpeGVsKFN0eWxlZFRleHQgdGV4dCkgewotCWludCBsaW5lSGVpZ2h0ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxuTGluZTFcbkxpbmUyIik7Ci0JdGV4dC5zZXRTaXplKDQwMCwgbGluZUhlaWdodCAqIDMpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVQaXhlbCgtMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZVBpeGVsKDApKTsKLQlhc3NlcnRFcXVhbHMobGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMSkpOwotCWFzc2VydEVxdWFscygyICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMikpOwotCWFzc2VydEVxdWFscygzICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMykpOwotCWFzc2VydEVxdWFscygzICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMTAwKSk7Ci0JCi0JdGV4dC5zZXRTaXplKDQwMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZVBpeGVsKC0xMDApKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lUGl4ZWwoMCkpOwotCWFzc2VydEVxdWFscyhsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgxKSk7Ci0JYXNzZXJ0RXF1YWxzKDIgKiBsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgyKSk7Ci0JYXNzZXJ0RXF1YWxzKDMgKiBsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgzKSk7Ci0JYXNzZXJ0RXF1YWxzKDMgKiBsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgxMDApKTsKLQkKLQl0ZXh0LnNldFNpemUoNDAwLCBsaW5lSGVpZ2h0KTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydEVxdWFscygtbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoLTEwMCkpOwotCWFzc2VydEVxdWFscygtbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVQaXhlbCgxKSk7Ci0JYXNzZXJ0RXF1YWxzKGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDIpKTsKLQlhc3NlcnRFcXVhbHMoMiAqIGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDMpKTsKLQlhc3NlcnRFcXVhbHMoMiAqIGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDEwMCkpOwotCi0JdGV4dC5zZXRTaXplKDQwMCwgMCk7IAotCXRleHQuc2V0VG9wUGl4ZWwoMyAqIGxpbmVIZWlnaHQpOwotCWFzc2VydEVxdWFscygtMyAqIGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKC0xMDApKTsKLQlhc3NlcnRFcXVhbHMoLTMgKiBsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKC0yICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMSkpOwotCWFzc2VydEVxdWFscygtbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMikpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVQaXhlbCgzKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZVBpeGVsKDEwMCkpOwotCQotCXRleHQuc2V0VG9wUGl4ZWwoMCk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lUGl4ZWwoLTEwKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZVBpeGVsKDApKTsKLQlhc3NlcnRFcXVhbHMobGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMSkpOwotCWFzc2VydEVxdWFscyhsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgxMCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uQXRPZmZzZXRJKCl7Ci0JLy8gY29weSBmcm9tIFN0eWxlZFRleHQsIGhhcyB0byBtYXRjaCB2YWx1ZSB1c2VkIGJ5IFN0eWxlZFRleHQKLQlmaW5hbCBpbnQgWElOU0VUID0gaXNCaWRpQ2FyZXQoKSA/IDIgOiAwOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKS5lcXVhbHMobmV3IFBvaW50KFhJTlNFVCwgMCkpKTsKLQl0cnkgewotCQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBvZmZzZXQgPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgxMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIG9mZnNldCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMSIpOwkKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNCkueCA+IDAgJiYgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDQpLnkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDYpLnggPiAwICYmIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg2KS55ID09IDApOwotCS8vIHggbG9jYXRpb24gd2lsbCA9PSBTdHlsZWRUZXh0IHggaW5zZXQgb24gYmlkaSBwbGF0Zm9ybXMKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNykueCA9PSBYSU5TRVQgJiYgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpLnkgPiAwKTsKLQl0cnkgewotCQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMTMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIG9mZnNldCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg0KS54ID4gMCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNCkueSA8IDApOwotCS8vIHggbG9jYXRpb24gd2lsbCA9PSBTdHlsZWRUZXh0IHggaW5zZXQgb24gYmlkaSBwbGF0Zm9ybXMJCi0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpLnggPT0gWElOU0VUICYmIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KS55ID09IDApOwotCQotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpqOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKS54IDwgMCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCkueSA8IDApOwotCWFzc2VydFRydWUoIjprOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KS54IDwgMCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNykueSA9PSAwKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T2Zmc2V0QXRMaW5lSSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCWFzc2VydEVxdWFscygiOmE6IiwgMCwgdGV4dC5nZXRPZmZzZXRBdExpbmUoMCkpOwotCXRyeSB7Ci0JCXRleHQuZ2V0T2Zmc2V0QXRMaW5lKC0xKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpiOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExpbmUoMTAwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG4iKTsJCi0JYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCB0ZXh0LmdldE9mZnNldEF0TGluZSgwKSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZToiLCA3LCB0ZXh0LmdldE9mZnNldEF0TGluZSgxKSk7Ci0KLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TGluZSgyKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpmOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwkKLQlhc3NlcnRFcXVhbHMoIjpnOiIsIDAsIHRleHQuZ2V0T2Zmc2V0QXRMaW5lKDApKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T2Zmc2V0QXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlQb2ludCBsb2NhdGlvbjsKLQlmaW5hbCBpbnQgWElOU0VUID0gaXNCaWRpQ2FyZXQoKSA/IDIgOiAwOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoWElOU0VULCAwKSkgPT0gMCk7Ci0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgtMSwgMCkpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRyeSB7Ci0JCXRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoMCwgLTEpKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbkxpbmUxIik7CQotCWxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoMTAsIDApKSA+IDApOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQobG9jYXRpb24ueCAtIDEsIDApKSA9PSA1KTsKLQlsb2NhdGlvbiA9IHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KTsJCi0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKGxvY2F0aW9uKSA9PSA3KTsKLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KDEwMCwgMCkpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCi0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgxMDAsIDUwKSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6aDoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0KLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoWElOU0VULCAtNSkpID09IDApOwotCWFzc2VydFRydWUoIjpqOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoWElOU0VULCAwKSkgPT0gNyk7Ci0JCi0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOms6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludChYSU5TRVQgKyAtNSwgLTUpKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6bDoiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KFhJTlNFVCArIC01LCAwKSkgPT0gNyk7Ci0KLQkvLyAxR0w0WlZFCi0JYXNzZXJ0VHJ1ZSgiOm06IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgyKSkgPT0gMik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOm46IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgyKSkgPT0gMik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T3JpZW50YXRpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE9yaWVudGF0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXZvaWQgdGVzdFN0eWxlcyAoU3RyaW5nIG1zZywgaW50W10gcmVzdWx0UmFuZ2VzLCBpbnRbXSBleHBlY3RlZFJhbmdlcywgU3R5bGVSYW5nZVtdIHJlc3VsdFN0eWxlcywgU3R5bGVSYW5nZVtdIGV4cGVjdGVkU3R5bGVzKSB7Ci0JYXNzZXJ0Tm90TnVsbCgicmVzdWx0UmFuZ2VzIGlzIG51bGwgb246ICIgKyBtc2csIHJlc3VsdFJhbmdlcyk7Ci0JYXNzZXJ0Tm90TnVsbCgiZXhwZWN0ZWRSYW5nZXMgaXMgbnVsbCBvbjogIiArIG1zZywgZXhwZWN0ZWRSYW5nZXMpOwotCWFzc2VydE5vdE51bGwoInJlc3VsdFN0eWxlcyBpcyBudWxsIG9uOiAiICsgbXNnLCByZXN1bHRTdHlsZXMpOwotCWFzc2VydE5vdE51bGwoImV4cGVjdGVkU3R5bGVzIGlzIG51bGwgb246ICIgKyBtc2csIGV4cGVjdGVkU3R5bGVzKTsKLQlhc3NlcnRFcXVhbHMoInJlc3VsdCByYW5nZXMgYW5kIHN0eWxlcyBsZW5ndGggZG9uJ3QgbWF0Y2ggb246ICIgKyBtc2csIHJlc3VsdFJhbmdlcy5sZW5ndGgsIHJlc3VsdFN0eWxlcy5sZW5ndGggKiAyKTsKLQlhc3NlcnRFcXVhbHMoImV4cGVjdGVkIHJhbmdlcyBhbmQgc3R5bGVzIGxlbmd0aCBkb24ndCBtYXRjaCBvbjogIiArIG1zZywgZXhwZWN0ZWRSYW5nZXMubGVuZ3RoLCBleHBlY3RlZFN0eWxlcy5sZW5ndGggKiAyKTsKLQlhc3NlcnRFcXVhbHMoImV4cGVjdGVkIGFuZCByZXN1bHQgcmFuZ2VzIGFyZSBkaWZmZXJudCBvbjogIiArIG1zZywgZXhwZWN0ZWRSYW5nZXMsIHJlc3VsdFJhbmdlcyk7Ci0JYXNzZXJ0RXF1YWxzKCJleHBlY3RlZCBhbmQgcmVzdWx0IHN0eWxlcyBhcmUgZGlmZmVybnQgb246ICIgKyBtc2csIGV4cGVjdGVkU3R5bGVzLCByZXN1bHRTdHlsZXMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJhbmdlcygpewotCVN0eWxlUmFuZ2Ugc3R5bGUwID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTAucmlzZSA9IDEwOwotCVN0eWxlUmFuZ2Ugc3R5bGUxID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTEucmlzZSA9IDU7Ci0JU3R5bGVSYW5nZSBzdHlsZTIgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMi5yaXNlID0gMzA7Ci0JU3R5bGVSYW5nZVtdIGV4cGVjdGVkU3R5bGVzOwotCWludFtdIGV4cGVjdGVkUmFuZ2VzOwotCQotCS8vIHRlc3RzIHVzaW5nIHRoZSBuZXcgQVBJCi0JdGV4dC5zZXRUZXh0ICgiIik7Ci0JdGV4dC5zZXRUZXh0ICgiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHswLCAxMH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMH0pOwotCWV4cGVjdGVkU3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUwfTsKLQlleHBlY3RlZFJhbmdlcyA9IG5ldyBpbnRbXSB7MCwgMTB9OwotCXRlc3RTdHlsZXMoIlRlc3QgMSIsIHRleHQuZ2V0UmFuZ2VzKDAsMTApLCBleHBlY3RlZFJhbmdlcywgdGV4dC5nZXRTdHlsZVJhbmdlcyhmYWxzZSksIGV4cGVjdGVkU3R5bGVzKTsKLQotCXRleHQuc2V0VGV4dCAoIiIpOwotCXRleHQuc2V0VGV4dCAoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MywgNH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMX0pOwotCWV4cGVjdGVkU3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUxfTsKLQlleHBlY3RlZFJhbmdlcyA9IG5ldyBpbnRbXSB7MywgNH07Ci0JdGVzdFN0eWxlcygiVGVzdCAyIiwgdGV4dC5nZXRSYW5nZXMoMCwxMCksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCi0JdGV4dC5zZXRUZXh0ICgiIik7Ci0JdGV4dC5zZXRUZXh0ICgiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHswLCAxMH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMH0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHszLCA0fSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUxfSk7Ci0JZXhwZWN0ZWRTdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTAsIHN0eWxlMSwgc3R5bGUwfTsKLQlleHBlY3RlZFJhbmdlcyA9IG5ldyBpbnRbXSB7MCwgMywgMywgNCwgNywgM307Ci0JdGVzdFN0eWxlcygiVGVzdCAzIiwgdGV4dC5nZXRSYW5nZXMoMCwxMCksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCQotCXRleHQuc2V0VGV4dCAoIiIpOwotCXRleHQuc2V0VGV4dCAoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MCwgMTB9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTB9KTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MywgNH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMX0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHsxLCA0fSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUyfSk7Ci0JZXhwZWN0ZWRTdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTAsIHN0eWxlMiwgc3R5bGUxLCBzdHlsZTB9OwotCWV4cGVjdGVkUmFuZ2VzID0gbmV3IGludFtdIHswLCAxLCAxLCA0LCA1LCAyLCA3LCAzfTsKLQl0ZXN0U3R5bGVzKCJUZXN0IDQiLCB0ZXh0LmdldFJhbmdlcygwLDEwKSwgZXhwZWN0ZWRSYW5nZXMsIHRleHQuZ2V0U3R5bGVSYW5nZXMoZmFsc2UpLCBleHBlY3RlZFN0eWxlcyk7Ci0JCQotCXRleHQuc2V0VGV4dCAoIiIpOwotCXRleHQuc2V0VGV4dCAoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MCwgMTB9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTB9KTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MywgNH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMX0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHsxLCA4fSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUyfSk7Ci0JZXhwZWN0ZWRTdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTAsIHN0eWxlMiwgc3R5bGUwfTsKLQlleHBlY3RlZFJhbmdlcyA9IG5ldyBpbnRbXSB7MCwgMSwgMSwgOCwgOSwgMX07Ci0JdGVzdFN0eWxlcygiVGVzdCA1IiwgdGV4dC5nZXRSYW5nZXMoMCwxMCksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCQotCXRleHQuc2V0VGV4dCAoIiIpOwotCXRleHQuc2V0VGV4dCAoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MCwgMTB9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTB9KTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MywgNH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMX0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHswLCA1fSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUyfSk7Ci0JZXhwZWN0ZWRTdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTIsIHN0eWxlMSwgc3R5bGUwfTsKLQlleHBlY3RlZFJhbmdlcyA9IG5ldyBpbnRbXSB7MCwgNSwgNSwgMiwgNywgM307Ci0JdGVzdFN0eWxlcygiVGVzdCA2IiwgdGV4dC5nZXRSYW5nZXMoMCwxMCksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCi0JdGV4dC5zZXRUZXh0ICgiIik7Ci0JdGV4dC5zZXRUZXh0ICgiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHswLCAxMH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMH0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHszLCA0fSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUxfSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcygwLCAwLCBuZXcgaW50W10gezEsIDZ9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTJ9KTsKLQlleHBlY3RlZFN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMCwgc3R5bGUyLCBzdHlsZTB9OwotCWV4cGVjdGVkUmFuZ2VzID0gbmV3IGludFtdIHswLCAxLCAxLCA2LCA3LCAzfTsKLQl0ZXN0U3R5bGVzKCJUZXN0IDciLCB0ZXh0LmdldFJhbmdlcygwLDEwKSwgZXhwZWN0ZWRSYW5nZXMsIHRleHQuZ2V0U3R5bGVSYW5nZXMoZmFsc2UpLCBleHBlY3RlZFN0eWxlcyk7Ci0KLQl0ZXh0LnNldFRleHQgKCIiKTsKLQl0ZXh0LnNldFRleHQgKCIwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcygwLCAwLCBuZXcgaW50W10gezAsIDEwfSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUwfSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcygwLCAwLCBuZXcgaW50W10gezMsIDR9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTF9KTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MywgNH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMn0pOwotCWV4cGVjdGVkU3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUwLCBzdHlsZTIsIHN0eWxlMH07Ci0JZXhwZWN0ZWRSYW5nZXMgPSBuZXcgaW50W10gezAsIDMsIDMsIDQsIDcsIDN9OwotCXRlc3RTdHlsZXMoIlRlc3QgOCIsIHRleHQuZ2V0UmFuZ2VzKDAsMTApLCBleHBlY3RlZFJhbmdlcywgdGV4dC5nZXRTdHlsZVJhbmdlcyhmYWxzZSksIGV4cGVjdGVkU3R5bGVzKTsKLQkJCQotCXRleHQuc2V0VGV4dCAoIiIpOwotCXRleHQuc2V0VGV4dCAoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MCwgMTB9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTB9KTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MywgNH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMX0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHswLCAzfSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUyfSk7Ci0JZXhwZWN0ZWRTdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTIsIHN0eWxlMSwgc3R5bGUwfTsKLQlleHBlY3RlZFJhbmdlcyA9IG5ldyBpbnRbXSB7MCwgMywgMywgNCwgNywgM307Ci0JdGVzdFN0eWxlcygiVGVzdCA5IiwgdGV4dC5nZXRSYW5nZXMoMCwxMCksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCi0JdGV4dC5zZXRUZXh0ICgiIik7Ci0JdGV4dC5zZXRUZXh0ICgiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHswLCAxMH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMH0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHszLCA0fSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUxfSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcygwLCAwLCBuZXcgaW50W10gezcsIDN9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTJ9KTsKLQlleHBlY3RlZFN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMCwgc3R5bGUxLCBzdHlsZTJ9OwotCWV4cGVjdGVkUmFuZ2VzID0gbmV3IGludFtdIHswLCAzLCAzLCA0LCA3LCAzfTsKLQl0ZXN0U3R5bGVzKCJUZXN0IDEwIiwgdGV4dC5nZXRSYW5nZXMoMCwxMCksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCQotCXRleHQuc2V0VGV4dCAoIiIpOwotCXRleHQuc2V0VGV4dCAoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MCwgMTB9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTB9KTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MywgNH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMX0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHs0LCAyfSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUyfSk7Ci0JZXhwZWN0ZWRTdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTAsIHN0eWxlMSwgc3R5bGUyLCBzdHlsZTEsIHN0eWxlMH07Ci0JZXhwZWN0ZWRSYW5nZXMgPSBuZXcgaW50W10gezAsIDMsIDMsIDEsIDQsIDIsIDYsIDEsIDcsIDN9OwotCXRlc3RTdHlsZXMoIlRlc3QgMTEiLCB0ZXh0LmdldFJhbmdlcygwLDEwKSwgZXhwZWN0ZWRSYW5nZXMsIHRleHQuZ2V0U3R5bGVSYW5nZXMoZmFsc2UpLCBleHBlY3RlZFN0eWxlcyk7Ci0KLQl0ZXh0LnNldFRleHQgKCIiKTsKLQl0ZXh0LnNldFRleHQgKCIwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcygwLCAwLCBuZXcgaW50W10gezAsIDEwfSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUwfSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcygwLCAwLCBuZXcgaW50W10gezMsIDR9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTF9KTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MiwgNn0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMn0pOwotCWV4cGVjdGVkU3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUwLCBzdHlsZTIsIHN0eWxlMH07Ci0JZXhwZWN0ZWRSYW5nZXMgPSBuZXcgaW50W10gezAsIDIsIDIsIDYsIDgsIDJ9OwotCXRlc3RTdHlsZXMoIlRlc3QgMTIiLCB0ZXh0LmdldFJhbmdlcygwLDEwKSwgZXhwZWN0ZWRSYW5nZXMsIHRleHQuZ2V0U3R5bGVSYW5nZXMoZmFsc2UpLCBleHBlY3RlZFN0eWxlcyk7Ci0JCi0JdGV4dC5zZXRUZXh0ICgiIik7Ci0JdGV4dC5zZXRUZXh0ICgiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHswLCAxMH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMH0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHswLCAxMH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMX0pOwotCWV4cGVjdGVkU3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUxfTsKLQlleHBlY3RlZFJhbmdlcyA9IG5ldyBpbnRbXSB7MCwgMTB9OwotCXRlc3RTdHlsZXMoIlRlc3QgMTMiLCB0ZXh0LmdldFJhbmdlcygwLDEwKSwgZXhwZWN0ZWRSYW5nZXMsIHRleHQuZ2V0U3R5bGVSYW5nZXMoZmFsc2UpLCBleHBlY3RlZFN0eWxlcyk7Ci0KLQl0ZXh0LnNldFRleHQgKCIiKTsKLQl0ZXh0LnNldFRleHQgKCIwMTIzNDU2Nzg5QUIiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MSwgM30sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMH0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHs1LCAxfSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUxfSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcygwLCAwLCBuZXcgaW50W10gezcsIDF9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTB9KTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7OSwgMn0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMX0pOwotCWV4cGVjdGVkU3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUwLCBzdHlsZTEsIHN0eWxlMCwgc3R5bGUxfTsKLQlleHBlY3RlZFJhbmdlcyA9IG5ldyBpbnRbXSB7MSwzLCA1LDEsIDcsMSwgOSwyfTsKLQl0ZXN0U3R5bGVzKCJUZXN0IDE0IiwgdGV4dC5nZXRSYW5nZXMoMCwxMiksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCi0JdGV4dC5zZXRUZXh0ICgiIik7Ci0JdGV4dC5zZXRUZXh0ICgiMDEyMzQ1Njc4OUFCIik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcygwLCAwLCBuZXcgaW50W10gezEsIDN9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTB9KTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7NSwgMX0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMX0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHs3LCAxfSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUwfSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcygwLCAwLCBuZXcgaW50W10gezksIDJ9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTF9KTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKDAsIDAsIG5ldyBpbnRbXSB7MiwgOH0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMn0pOwotCWV4cGVjdGVkU3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUwLCBzdHlsZTIsIHN0eWxlMX07Ci0JZXhwZWN0ZWRSYW5nZXMgPSBuZXcgaW50W10gezEsMSwgMiw4LCAxMCwxfTsKLQl0ZXN0U3R5bGVzKCJUZXN0IDE1IiwgdGV4dC5nZXRSYW5nZXMoMCwxMiksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCQotCS8vdGVzdHMgbWl4aW5nIHRoZSBvbGQgQVBJIGFuZCB0aGUgbmV3IEFQSQotCXRleHQuc2V0VGV4dCAoIiIpOwotCXRleHQuc2V0VGV4dCAoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKG5ldyBTdHlsZVJhbmdlW117bmV3IFN0eWxlUmFuZ2UoMyw0LG51bGwsbnVsbCxTV1QuQk9MRCl9KTsKLQlleHBlY3RlZFN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlW117bmV3IFN0eWxlUmFuZ2UoMyw0LG51bGwsbnVsbCxTV1QuQk9MRCl9OwotCWV4cGVjdGVkUmFuZ2VzID0gbmV3IGludFtdIHszLCA0fTsKLQl0ZXN0U3R5bGVzKCJUZXN0IDE2IiwgdGV4dC5nZXRSYW5nZXMoMCwxMCksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCi0JCi0JLy90ZXN0IHRoZSBtZXJnaW5nIGNvZGUKLQl0ZXh0LnNldFRleHQgKCIiKTsKLQl0ZXh0LnNldFRleHQgKCIwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhuZXcgaW50W10gezEsIDMsIDYsIDN9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTAsIHN0eWxlMH0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMCwgMCwgbmV3IGludFtdIHs0LCAyfSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUwfSk7Ci0JZXhwZWN0ZWRTdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTB9OwotCWV4cGVjdGVkUmFuZ2VzID0gbmV3IGludFtdIHsxLCA4fTsKLQl0ZXN0U3R5bGVzKCJUZXN0IDE3IiwgdGV4dC5nZXRSYW5nZXMoMCwxMCksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCQotCXRleHQuc2V0VGV4dCAoIiIpOwotCXRleHQuc2V0VGV4dCAoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKG5ldyBpbnRbXSB7MSwgMywgNiwgM30sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMCwgc3R5bGUwfSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcygwLCAwLCBuZXcgaW50W10gezIsIDZ9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTB9KTsKLQlleHBlY3RlZFN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMH07Ci0JZXhwZWN0ZWRSYW5nZXMgPSBuZXcgaW50W10gezEsIDh9OwotCXRlc3RTdHlsZXMoIlRlc3QgMTgiLCB0ZXh0LmdldFJhbmdlcygwLDEwKSwgZXhwZWN0ZWRSYW5nZXMsIHRleHQuZ2V0U3R5bGVSYW5nZXMoZmFsc2UpLCBleHBlY3RlZFN0eWxlcyk7Ci0KLQl0ZXh0LnNldFRleHQgKCIiKTsKLQl0ZXh0LnNldFRleHQgKCIwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhuZXcgaW50W10gezEsIDMsIDYsIDN9LCBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTAsIHN0eWxlMH0pOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoMywgNCwgbmV3IGludFtdIHswLCAxLCA5LCAxfSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUwLCBzdHlsZTB9KTsKLQlleHBlY3RlZFN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMCwgc3R5bGUwfTsKLQlleHBlY3RlZFJhbmdlcyA9IG5ldyBpbnRbXSB7MCwgMywgNywgM307Ci0JdGVzdFN0eWxlcygiVGVzdCAxOSIsIHRleHQuZ2V0UmFuZ2VzKDAsMTApLCBleHBlY3RlZFJhbmdlcywgdGV4dC5nZXRTdHlsZVJhbmdlcyhmYWxzZSksIGV4cGVjdGVkU3R5bGVzKTsKLQotCS8vdGVzdHMgbWl4aW5nIHRoZSBvbGQgQVBJIGFuZCB0aGUgbmV3IEFQSQotCXRleHQuc2V0VGV4dCAoIiIpOwotCXRleHQuc2V0VGV4dCAoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKG5ldyBTdHlsZVJhbmdlW117bmV3IFN0eWxlUmFuZ2UoMyw0LG51bGwsbnVsbCxTV1QuQk9MRCl9KTsKLQlleHBlY3RlZFN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlW117fTsKLQlleHBlY3RlZFJhbmdlcyA9IG5ldyBpbnRbXSB7fTsKLQl0ZXN0U3R5bGVzKCJUZXN0IDIwIiwgdGV4dC5nZXRSYW5nZXMoMywwKSwgZXhwZWN0ZWRSYW5nZXMsIHRleHQuZ2V0U3R5bGVSYW5nZXMoMywgMCwgZmFsc2UpLCBleHBlY3RlZFN0eWxlcyk7CQotCi0JLy9idWcgMjUwODU5IChnZXRSYW5nZXMpCi0JdGV4dC5zZXRUZXh0ICgiIik7Ci0JdGV4dC5zZXRUZXh0ICgiVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBjdXJyZW50bHkgZ29pbmcgdGhyb3VnaCB0aGUgZXhlcmNpc2UiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKG5ldyBpbnRbXSB7MTIsIDEwLCAzNiwgNX0sIG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMCwgc3R5bGUxfSk7Ci0JZXhwZWN0ZWRTdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTB9OwotCWV4cGVjdGVkUmFuZ2VzID0gbmV3IGludFtdIHsxMiwgMTB9OwotCXRlc3RTdHlsZXMoIlRlc3QgMjEgKGJ1ZyAyNTA4NTkpIiwgdGV4dC5nZXRSYW5nZXMoMTIsIDEwKSwgZXhwZWN0ZWRSYW5nZXMsIHRleHQuZ2V0U3R5bGVSYW5nZXMoMTIsIDEwLCBmYWxzZSksIGV4cGVjdGVkU3R5bGVzKTsKLQkKLQkvL2J1ZyAyNTAxOTMKLQl0ZXh0LnNldFRleHQgKCIiKTsKLQl0ZXh0LnNldFRleHQoIlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgY3VycmVudGx5IGdvaW5nIHRocm91Z2ggdGhlIGV4ZXJjaXNlIik7Ci0JU3R5bGVSYW5nZSBzcjEgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXNyMS51bmRlcmxpbmUgPSB0cnVlOwotCVN0eWxlUmFuZ2Ugc3IyID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzcjIuc3RyaWtlb3V0ID0gdHJ1ZTsKLQlzcjEuc3RhcnQgPSAxMjsKLQlzcjEubGVuZ3RoID0gMTA7Ci0Jc3IyLnN0YXJ0ID0gMzY7Ci0Jc3IyLmxlbmd0aCA9IDU7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHNyMSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHNyMik7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEyLCAxMCwgIiIpOwotCWV4cGVjdGVkU3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbXSB7c3IyfTsKLQlleHBlY3RlZFJhbmdlcyA9IG5ldyBpbnRbXSB7MjYsIDV9OwotCXRlc3RTdHlsZXMoIlRlc3QgMjIgKGJ1ZyAyNTAxOTMpIiwgdGV4dC5nZXRSYW5nZXMoMjYsIDUpLCBleHBlY3RlZFJhbmdlcywgdGV4dC5nZXRTdHlsZVJhbmdlcygyNiwgNSwgZmFsc2UpLCBleHBlY3RlZFN0eWxlcyk7Ci0JCi0JLy9idWcgMjEyODUxIChnZXRTdHlsZVJhbmdlcykKLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2V0VGV4dCgibGluZTBcbmxpbmUxXG5saW5lMiIpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMobmV3IGludFtdIHswLDIsMiwyLDQsNCwxMywzfSwgbmV3IFN0eWxlUmFuZ2VbXSB7c3R5bGUwLCBzdHlsZTEsIHN0eWxlMiwgc3R5bGUwfSk7Ci0JZXhwZWN0ZWRSYW5nZXMgPSBuZXcgaW50W10gezYsIDJ9OwkKLQlleHBlY3RlZFN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlW10ge3N0eWxlMn07IAotCXRlc3RTdHlsZXMoIlRlc3QgMjMgKGJ1ZyAyMTI4NTEgLSBnZXRSYW5nZXMpIiwgdGV4dC5nZXRSYW5nZXMoNiwgNiksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKDYsIDYsIGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCVN0eWxlUmFuZ2VbXSBzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDYsIDYsIHRydWUpOwotCWludFtdIHJhbmdlcyA9IG5ldyBpbnRbc3R5bGVzLmxlbmd0aCAqIDJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSs9MikgewotCQlyYW5nZXNbaV0gPSBzdHlsZXNbaS8yXS5zdGFydDsKLQkJcmFuZ2VzW2krMV0gPSBzdHlsZXNbaS8yXS5sZW5ndGg7Ci0JfQotCXRlc3RTdHlsZXMoIlRlc3QgMjQgKGJ1ZyAyMTI4NTEgLSBnZXRTdHlsZVJhbmdlcykiLCByYW5nZXMsIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKDYsIDYsIGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCWV4cGVjdGVkUmFuZ2VzID0gbmV3IGludFtdIHs2LCAyLCAxMywgMX07Ci0JZXhwZWN0ZWRTdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtdIHtzdHlsZTIsIHN0eWxlMH07IAotCXRlc3RTdHlsZXMoIlRlc3QgMjUgIiwgdGV4dC5nZXRSYW5nZXMoNiwgOCksIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKDYsIDgsIGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoNiwgOCwgdHJ1ZSk7Ci0JcmFuZ2VzID0gbmV3IGludFtzdHlsZXMubGVuZ3RoICogMl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKz0yKSB7Ci0JCXJhbmdlc1tpXSA9IHN0eWxlc1tpLzJdLnN0YXJ0OwotCQlyYW5nZXNbaSsxXSA9IHN0eWxlc1tpLzJdLmxlbmd0aDsKLQl9Ci0JdGVzdFN0eWxlcygiVGVzdCAyNiAiLCByYW5nZXMsIGV4cGVjdGVkUmFuZ2VzLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKDYsIDgsIGZhbHNlKSwgZXhwZWN0ZWRTdHlsZXMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMiwgMikpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgyLCAyKSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAzKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDIsIDMpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDExKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDMsIDExKSkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoNCwgNCkpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigxMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDExLCAxMSkpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMikpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMiwgMykpKTsJCi19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkJhY2tncm91bmQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCkgIT0gbnVsbCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpID09ICBnZXRDb2xvcihZRUxMT1cpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpIHsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldFNlbGVjdGlvbkZvcmVncm91bmQoKSAhPSBudWxsKTsKLQl0ZXh0LnNldFNlbGVjdGlvbkZvcmVncm91bmQoZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCkgPT0gIGdldENvbG9yKFJFRCkpOwotfQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25SYW5nZSgpIHsKLQlTdHJpbmcgdGVzdFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCWludCBpbnZhbGlkUmFuZ2VzIFtdW10gPSB7ey0xLCAwfSwgey0xLCAtMX0sIHsxMDAsIDF9LCB7MTAwLCAtMX0sIHsxMiwgMX0sIHsxMSwgMn0sIHsyLCAtM30sIHs1MCwgLTF9fTsKLQlpbnQgc2VsZWN0aW9uUmFuZ2VzIFtdW10gPSB7ezAsIDF9LCB7MCwgMH0sIHsyLCAzfSwgezEyLCAwfSwgezIsIC0yfSwgezUsIC0xfX07Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi0JCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSAwICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IDApOwotCXRleHQuc2V0VGV4dCh0ZXN0VGV4dCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25SYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzFdOwotCQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQlpZiAobGVuZ3RoIDwgMCkgewotCQkJc3RhcnQgKz0gbGVuZ3RoOwotCQkJbGVuZ3RoICo9IC0xOwotCQkJYXNzZXJ0RXF1YWxzKCI6YzphOiIgKyBpLCBzdGFydCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsJCQkKLQkJfQotCQllbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmM6YToiICsgaSwgc3RhcnQgKyBsZW5ndGgsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7CQkJCi0JCX0KLQkJYXNzZXJ0VHJ1ZSgiOmM6IiArIGksIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHN0YXJ0ICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IGxlbmd0aCk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTApOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09Mik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09OSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzXG40NTY3ODkwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0wKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEyKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25UZXh0KCkgewotCVN0cmluZyB0ZXN0VGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JaW50IHNlbGVjdGlvblJhbmdlcyBbXVtdID0ge3swLCAxfSwgezAsIDB9LCB7MiwgM30sIHsxMiwgMH19OwotCQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCAiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0VGV4dCh0ZXN0VGV4dCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25SYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uUmFuZ2VzW2ldWzFdOwotCQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjpjOiIgKyBpLCB0ZXN0VGV4dC5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoKSwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZVJhbmdlQXRPZmZzZXRJKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxXHJcbkxpbmUyIjsKLQlpbnQgc3R5bGVTdGFydCA9IDA7Ci0JaW50IHN0eWxlTGVuZ3RoID0gNTsKLQlpbnQgaTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShzdHlsZVN0YXJ0LCBzdHlsZUxlbmd0aCwgZ2V0Q29sb3IoQkxVRSksIGdldENvbG9yKFJFRCksIFNXVC5CT0xEKTsKLQotCXRyeSB7Ci0JCXRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgib2Zmc2V0IG91dCBvZiByYW5nZSBubyB0ZXh0IiwgZXhjZXB0aW9uVGhyb3duKTsKLQotCXRleHQuc2V0VGV4dChsaW5lKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCgtMSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJvZmZzZXQgb3V0IG9mIHJhbmdlIG5lZ2F0aXZlIiwgZXhjZXB0aW9uVGhyb3duKTsKLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGxpbmUubGVuZ3RoKCkpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgib2Zmc2V0IG91dCBvZiByYW5nZSBwb3NpdGl2ZSIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0Jc3R5bGUubGVuZ3RoID0gMTsKLQlmb3IgKGkgPSBzdHlsZVN0YXJ0OyBpIDwgc3R5bGVTdGFydCArIHN0eWxlTGVuZ3RoOyBpKyspIHsKLQkJc3R5bGUuc3RhcnQgPSBpOwotCQlhc3NlcnRFcXVhbHMoc3R5bGUsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpKTsKLQkJCQotCS8vIHRlc3Qgb2Zmc2V0IGF0IGxpbmUgZGVsaW1pdGVyCi0Jc3R5bGUgPSBuZXcgU3R5bGVSYW5nZSg1LCAyLCBudWxsLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQlzdHlsZS5sZW5ndGggPSAxOwotCWFzc2VydEVxdWFscyhzdHlsZSwgdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoNSkpOwotCXN0eWxlLnN0YXJ0ID0gNjsKLQlhc3NlcnRFcXVhbHMoc3R5bGUsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDYpKTsJCi0JYXNzZXJ0RXF1YWxzKG51bGwsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDEwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGVSYW5nZXMoKSB7Ci0JdGV4dC5zZXRUZXh0KCJwYWNrYWdlIHRlc3Q7XG4vKiBMaW5lIDFcbiAqIExpbmUgMlxuICovXG5wdWJsaWMgY2xhc3MgU2ltcGxlQ2xhc3Mge1xufSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDcsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE0LDIzLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDM4LDYsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ1LDUsQkxVRSxudWxsKSk7Ci0gCXRleHQucmVwbGFjZVRleHRSYW5nZSgxNCwgMjMsICJcdC8qTGluZSAxXG5cdCAqIExpbmUgMlxuXHQgKi8iKTsKLSAJU3RyaW5nIG5ld1RleHQgPSB0ZXh0LmdldFRleHRSYW5nZSgwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBuZXdUZXh0LmVxdWFscygicGFja2FnZSB0ZXN0O1xuXHQvKkxpbmUgMVxuXHQgKiBMaW5lIDJcblx0ICovXG5wdWJsaWMgY2xhc3MgU2ltcGxlQ2xhc3Mge1xufSIpKTsKLQlTdHlsZVJhbmdlW10gc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDcsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNDAsNixCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg0Nyw1LEJMVUUsbnVsbCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZVJhbmdlc0lJKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSIpOwotLy8JMAotLy8JIDEyMzQKLS8vCSA1NgotLy8JIDc4Ci0vLwk5Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEsNCxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwyLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsMixZRUxMT1csbnVsbCkpOwotCi0JU3R5bGVSYW5nZVtdIHN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMCwxKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMCw1KTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMSw0LEJMVUUsbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDcsMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDcsMixZRUxMT1csbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDAsMTApOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxLDQsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNywyLFlFTExPVyxudWxsKSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMCw0KTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMSwzLEJMVUUsbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDIsNik7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDIsMyxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg3LDEsWUVMTE9XLG51bGwpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODlcclxuQUJDREVGR0hJSktMIik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw1LFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDEsWUVMTE9XLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDE1LDEpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDE1LDEsWUVMTE9XLG51bGwpKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygxNSwwKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDAsMjApOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNyw1LFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDE1LDEsWUVMTE9XLG51bGwpKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcyg4LDIpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDgsMixSRUQsbnVsbCkpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRhYnMoKSB7Ci0JdGV4dC5zZXRUYWJzKDEpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGFicygpID09IDEpOwotCXRleHQuc2V0VGFicyg4KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRhYnMoKSA9PSA4KTsKLQl0ZXh0LnNldFRleHQoIkxpbmVcdDFcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUYWJzKCkgPT0gOCk7Ci0JdGV4dC5zZXRUYWJzKDcpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGFicygpID09IDcpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JU3RyaW5nIHRlc3RUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKTsKLQl0ZXh0LnNldFRleHQodGVzdFRleHQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscyh0ZXN0VGV4dCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCk7Ci0JCi0JdGV4dC5zZXRUZXh0KHRlc3RUZXh0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHModGVzdFRleHQpKTsKLQl0ZXh0LnNldFRleHQodGVzdFRleHQgKyAiXHJcbiIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscyh0ZXN0VGV4dCArICJcclxuIikpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dElJKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duOwotCVN0cmluZyB0ZXN0VGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JaW50IGludmFsaWRSYW5nZXNbXVtdID0ge3stMSwgMH0sIHswLCAtMX0sIHstMSwgLTF9LCB7MTAwLCAxfSwgezEwMCwgLTF9LCB7MiwgdGVzdFRleHQubGVuZ3RoKCl9LCB7NSwgMn19OwotCWludCByYW5nZXNbXVtdID0ge3swLCAxfSwgezAsIDB9LCB7MiwgNX0sIHs3LCAxMX19OwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgZW5kID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXh0LmdldFRleHQoc3RhcnQsIGVuZCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIjphOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JfQkKLQl0ZXh0LnNldFRleHQodGVzdFRleHQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IHJhbmdlc1tpXVswXTsKLQkJaW50IGVuZCA9IHJhbmdlc1tpXVsxXTsKLQkJYXNzZXJ0RXF1YWxzKCI6YjoiICsgaSwgdGVzdFRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQgKyAxKSwgdGV4dC5nZXRUZXh0KHN0YXJ0LCBlbmQpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBlbmQgPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRleHQuZ2V0VGV4dChzdGFydCwgZW5kKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9CQotCXRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dCgwLDApLmVxdWFscygidCIpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHQoMCwxKS5lcXVhbHMoInRlIikpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dCgxLDUpLmVxdWFscygiZXN0aW4iKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dFJhbmdlSUkoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd247Ci0JU3RyaW5nIHRlc3RUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQlpbnQgaW52YWxpZFJhbmdlc1tdW10gPSB7ey0xLCAwfSwgezAsIC0xfSwgey0xLCAtMX0sIHsxMDAsIDF9LCB7MTAwLCAtMX0sIHsxLCB0ZXN0VGV4dC5sZW5ndGgoKX0sIHs1LCAtMX19OwotCWludCByYW5nZXNbXVtdID0ge3swLCAxfSwgezAsIDB9LCB7NSwgMX0sIHs3LCA1fSwgezEyLCAwfX07Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRleHQuZ2V0VGV4dFJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCI6YToiLCBleGNlcHRpb25UaHJvd24pOwotCX0JCi0JdGV4dC5zZXRUZXh0KHRlc3RUZXh0KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSByYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSByYW5nZXNbaV1bMV07Ci0JCWFzc2VydEVxdWFscygiOmI6IiArIGksIHRlc3RUZXh0LnN1YnN0cmluZyhzdGFydCwgc3RhcnQgKyBsZW5ndGgpLCB0ZXh0LmdldFRleHRSYW5nZShzdGFydCwgbGVuZ3RoKSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXh0LmdldFRleHRSYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9CQotCXRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dFJhbmdlKDAsMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUZXh0UmFuZ2UoMCwxKS5lcXVhbHMoInQiKSk7CQotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dFJhbmdlKDAsMikuZXF1YWxzKCJ0ZSIpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHRSYW5nZSgxLDUpLmVxdWFscygiZXN0aW4iKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dExpbWl0KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPCAwKTsKLQl0ZXh0LnNldFRleHRMaW1pdCgxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUZXh0TGltaXQoKSA9PSAxMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wSW5kZXgoKSB7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMGFcclxuIik7Ci0KLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAxKTsKLQl0ZXh0LnNldFRvcEluZGV4KDIpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAyKTsKLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDMpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAyKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCwgIkxpbmUxIik7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDIpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcFBpeGVsKCkgewotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuTGluZTBhXHJcbiIpOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkpOwotCXRleHQuc2V0VG9wSW5kZXgoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IHRleHQuZ2V0TGluZUhlaWdodCgpICogMik7Ci0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgzKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAyKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCwgIkxpbmUxIik7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IHRleHQuZ2V0TGluZUhlaWdodCgpICogMik7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldFdvcmRXcmFwKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0V29yZFdyYXAoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRXb3JkV3JhcCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFdvcmRXcmFwKCkpOwotCXRleHQuc2V0V29yZFdyYXAoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0V29yZFdyYXAoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRXb3JkV3JhcChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRXb3JkV3JhcCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldFdvcmRXcmFwKHRydWUpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0V29yZFdyYXAoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JU3RyaW5nIGRlbGltaXRlclN0cmluZyA9ICJcbiI7Ci0JdHJ5IHsKLQkJdGV4dC5pbnNlcnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQl0ZXh0Lmluc2VydCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKSk7Ci0JdGV4dC5pbnNlcnQoImZyZWQiKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoImZyZWQiKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0JdGV4dC5pbnNlcnQoImhlbG11dCIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscygiZnJoZWxtdXRlZCIpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09MSk7Ci0JdGV4dC5pbnNlcnQoZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0yKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VBY3Rpb25JKCkgewotCS8vIGludm9raW5nIGFjdGlvbnMgb24gYW4gZW1wdHkgdGV4dCBzaG91bGQgbm90IGNyYXNoCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9ET1dOKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1VQKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ09MVU1OX05FWFQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBR0VfRE9XTik7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFHRV9VUCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV09SRF9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XT1JEX1BSRVZJT1VTKTsJCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9FTkQpOwkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5URVhUX1NUQVJUKTsJCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV0lORE9XX0VORCk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULldJTkRPV19TVEFSVCk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0RPV04pOwkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9VUCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0NPTFVNTl9QUkVWSU9VUyk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0NPTFVNTl9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1BBR0VfRE9XTik7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1dPUkRfUFJFVklPVVMpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XT1JEX05FWFQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9URVhUX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1RFWFRfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XSU5ET1dfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XSU5ET1dfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5DVVQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkNPUFkpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBU1RFKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5ERUxFVEVfUFJFVklPVVMpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkRFTEVURV9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5UT0dHTEVfT1ZFUldSSVRFKTsKLQotCS8vU29tZSBwbGF0Zm9ybXMgY29uc2lkZXIgbnVtYmVyIGEgd29yZCBzdGFydCwgb3RoZXIgZG9uJ3QgIAotLy8JdGV4dC5zZXRUZXh0KCJMaW5lMVxyXG5MaW5lMiIpOwkJCi0JdGV4dC5zZXRUZXh0KCJMaW5lTFxyXG5MaW5lVyIpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRE9XTik7Ci0JYXNzZXJ0RXF1YWxzKDcsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9VUCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCWFzc2VydEVxdWFscyg1LCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfU1RBUlQpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ09MVU1OX05FWFQpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFHRV9ET1dOKTsKLQlhc3NlcnRFcXVhbHMoOCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBR0VfVVApOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9TVEFSVCk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULldPUkRfTkVYVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV09SRF9ORVhUKTsJCi0JYXNzZXJ0RXF1YWxzKDcsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XT1JEX1BSRVZJT1VTKTsJCi0JYXNzZXJ0RXF1YWxzKDUsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5URVhUX0VORCk7CQotCWFzc2VydEVxdWFscyh0ZXh0LmdldENoYXJDb3VudCgpLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9TVEFSVCk7CQotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV0lORE9XX0VORCk7CQotCWFzc2VydEVxdWFscyg1LCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV0lORE9XX1NUQVJUKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRE9XTik7CQotCWFzc2VydEVxdWFscygiTGluZUxcclxuIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX1VQKTsKLQlhc3NlcnRFcXVhbHMoIlxyXG5MaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX1NUQVJUKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVMXHJcbkxpbmVXIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRU5EKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVMIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9DT0xVTU5fUFJFVklPVVMpOwotCWFzc2VydEVxdWFscygiTCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9DT0xVTU5fTkVYVCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfUEFHRV9ET1dOKTsKLQlhc3NlcnRFcXVhbHMoIlxyXG5MaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV09SRF9QUkVWSU9VUyk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XT1JEX05FWFQpOwotCWFzc2VydEVxdWFscygiTGluZVciLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfVEVYVF9FTkQpOwotCWFzc2VydEVxdWFscygiTGluZVciLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfVEVYVF9TVEFSVCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lTFxyXG4iLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV0lORE9XX1NUQVJUKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XSU5ET1dfRU5EKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVMIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5DVVQpOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRE9XTik7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ09QWSk7Ci0JYXNzZXJ0RXF1YWxzKCJcclxuTGluZVciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFTVEUpOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiArIFBMQVRGT1JNX0xJTkVfREVMSU1JVEVSLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5ERUxFVEVfUFJFVklPVVMpOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuREVMRVRFX05FWFQpOwotCWFzc2VydEVxdWFscygiTGluZVciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5UT0dHTEVfT1ZFUldSSVRFKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYXN0ZSgpewotCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHRleHQuZ2V0RGlzcGxheSgpKTsKLQlUZXh0VHJhbnNmZXIgdHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQlTdHJpbmcgY29udmVydGVkVGV4dDsKLQotCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgU3RyaW5nW117IngifSwgbmV3IFRyYW5zZmVyW117dHJhbnNmZXJ9KTsKLQkKLQl0ZXh0LmNvcHkoKTsJCi0JdGV4dC5wYXN0ZSgpOwkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IDEpOwotCQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JdGV4dC5jb3B5KCk7CQotCXRleHQucGFzdGUoKTsJCi0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSAyKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMSk7Ci0JdGV4dC5jb3B5KCk7CQotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMCk7Ci0JdGV4dC5wYXN0ZSgpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoIjAwMTIzNDU2Nzg5IikpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMSwgMik7CQotCXRleHQuY29weSgpOwkKLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoIjAxIikpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0KLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IFN0cmluZ1tdeyJcckxpbmUxXG5MaW5lMlxyXG5MaW5lM1xuXHJMaW5lNFxuIn0sIG5ldyBUcmFuc2Zlcltde3RyYW5zZmVyfSk7Ci0JdGV4dC5wYXN0ZSgpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJcclxuTGluZTFcclxuTGluZTJcclxuTGluZTNcclxuXHJcbkxpbmU0XHJcbiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIlxuTGluZTFcbkxpbmUyXG5MaW5lM1xuXG5MaW5lNFxuIjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRUZXh0KCkgIT0gbnVsbCAmJiB0ZXh0LmdldFRleHQoKS5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0KLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IFN0cmluZ1tdeyJMaW5lMVxyXG5MaW5lMiJ9LCBuZXcgVHJhbnNmZXJbXXt0cmFuc2Zlcn0pOwotCXRleHQucGFzdGUoKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxuTGluZTIiOwotCX0KLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldFRleHQoKSAhPSBudWxsICYmIHRleHQuZ2V0VGV4dCgpLmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgU3RyaW5nW117IkxpbmUxXHJMaW5lMiJ9LCBuZXcgVHJhbnNmZXJbXXt0cmFuc2Zlcn0pOwotCXRleHQucGFzdGUoKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxuTGluZTIiOwotCX0KLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldFRleHQoKSAhPSBudWxsICYmIHRleHQuZ2V0VGV4dCgpLmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQotCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBTdHJpbmdbXXsiTGluZTFcbkxpbmUyIn0sIG5ldyBUcmFuc2Zlcltde3RyYW5zZmVyfSk7Ci0JdGV4dC5wYXN0ZSgpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXG5MaW5lMiI7Ci0JfQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0VGV4dCgpICE9IG51bGwgJiYgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKGNvbnZlcnRlZFRleHQpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCi0KLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ByaW50KCkgewotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpID09IG51bGwpIHJldHVybjsKLQkKLQkvKiBXZSBkb24ndCByZWFsbHkgd2FudCB0byBydW4gdGhpcyB0ZXN0LCBiZWNhdXNlIGl0IHdhc3RlcyBwYXBlci4KLQkgKiBBbG1vc3QgYWxsIG9mIHRoZSBwcmludCgpIG1ldGhvZCBpcyB0ZXN0ZWQgaW4gcHJpbnQoUHJpbnRlciksIGJlbG93LgotCSAqLwotLy8JdGV4dC5wcmludCgpOwotLy8JdGV4dC5zZXRUZXh0KCJMaW5lMSIpOwotLy8JdGV4dC5wcmludCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyKCkgewotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpID09IG51bGwpIHJldHVybjsKLQotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5wcmludCgoUHJpbnRlcikgbnVsbCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQkKLQlhc3NlcnRUcnVlKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBwcmludChudWxsKSIsIGV4Y2VwdGlvblRocm93bik7Ci0JCi0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoKTsKLQl0ZXh0LnByaW50KHByaW50ZXIpOyAvLyBkb24ndCBydW4gdGhlIHJ1bm5hYmxlLCB0byBzYXZlIHBhcGVyCi0JdGV4dC5zZXRUZXh0KCJMaW5lMSIpOwotCXRleHQucHJpbnQocHJpbnRlcik7IC8vIGRvbid0IHJ1biB0aGUgcnVubmFibGUsIHRvIHNhdmUgcGFwZXIKLQlwcmludGVyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRQcmludE9wdGlvbnMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dFByaW50T3B0aW9ucyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZHJhdygpIHsKLQkvLyBpbmhlcml0ZWQgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3SUlJSVooKSB7Ci0JLy8gaW5oZXJpdGVkIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZHJhd1JhbmdlSUlaKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0KLQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDAsIHRydWUpOwotCXRleHQucmVkcmF3UmFuZ2UoMCwgMCwgZmFsc2UpOwotCQotCXRyeSB7Ci0JCXRleHQucmVkcmF3UmFuZ2UoMCwgMSwgdHJ1ZSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlpZiAoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJJbmRleCBvdXQgb2YgYm91bmRzIikpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5yZWRyYXdSYW5nZSgwLCAxLCBmYWxzZSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlpZiAoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJJbmRleCBvdXQgb2YgYm91bmRzIikpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlZHJhd1JhbmdlKC0xLCAyLCB0cnVlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkluZGV4IG91dCBvZiBib3VuZHMiKSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlZHJhd1JhbmdlKC0xLCAyLCBmYWxzZSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlpZiAoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJJbmRleCBvdXQgb2YgYm91bmRzIikpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5yZWRyYXdSYW5nZSgwLCAwLCB0cnVlKTsKLQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDAsIGZhbHNlKTsJCi0JdGV4dC5yZWRyYXdSYW5nZSgwLCAxLCB0cnVlKTsKLQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDEsIGZhbHNlKTsJCi0JdGV4dC5yZWRyYXdSYW5nZSg4LCAyLCB0cnVlKTsKLQl0ZXh0LnJlZHJhd1JhbmdlKDgsIDIsIGZhbHNlKTsJCi0JdGV4dC5yZWRyYXdSYW5nZSgxMCwgMCwgdHJ1ZSk7CQotCXRleHQucmVkcmF3UmFuZ2UoMTAsIDAsIGZhbHNlKTsJCi0KLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlZHJhd1JhbmdlKDEwLCAxLCB0cnVlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkluZGV4IG91dCBvZiBib3VuZHMiKSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0JCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5yZWRyYXdSYW5nZSgxMCwgMSwgZmFsc2UpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiSW5kZXggb3V0IG9mIGJvdW5kcyIpKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVCaWRpU2VnbWVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRCaWRpU2VnbWVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZExpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIKLX0KLXB1YmxpYyB2b2lkIHRlc3RfcmVwbGFjZVN0eWxlUmFuZ2VzSUkkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpIHsKLQlTdHlsZVJhbmdlW10gc3R5bGVzOwotCVN0cmluZyB0ZXh0U3RyaW5nID0gdGV4dFN0cmluZygpOwotCi0JLyogCi0JCWRlZmF1bHRTdHlsZXMKLQkJCi0JCQkoMCw0OCxSRUQsWUVMTE9XKSwgCi0JCQkoNTgsMTAsQkxVRSxDWUFOKSwgCi0JCQkoNjgsMTAsR1JFRU4sUFVSUExFKQotCSovCi0KLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQkKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDc4LCBuZXcgU3R5bGVSYW5nZVtdIHt9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjowOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgNzgsIG5ldyBTdHlsZVJhbmdlW10ge30pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjowOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JLy8gTm8gb3ZlcmxhcCB3aXRoIGV4aXN0aW5nIHN0eWxlcwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNDgsIDUsIG5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDQ4LDUsWUVMTE9XLFJFRCl9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQ4LDUsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIE92ZXJsYXAgbWlkZGxlIG9mIG9uZSBzdHlsZSAtIHBhcnRpYWwKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDEwLCAxMCwgbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMTAsMTAsWUVMTE9XLFJFRCl9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyMCwyOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1s0XS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIG5ldyBTdHlsZVJhbmdlW10ge30pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCQotCS8vIE92ZXJsYXAgbWlkZGxlIG9mIG9uZSBzdHlsZSAtIGZ1bGwKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDU4LCAxMCwgbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoNTgsMTAsWUVMTE9XLFJFRCl9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JLy8gT3ZlcmxhcCBlbmQgb2Ygb25lIHN0eWxlCi0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygzOCwgMTUsIG5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDM4LDE1LFlFTExPVyxSRUQpfSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDM4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzOCwxNSxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCQotCS8vIE92ZXJsYXAgYmVnaW5uaW5nIG9mIG9uZSBzdHlsZQotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNTAsIDEwLCBuZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSg1MCwxMCxZRUxMT1csUkVEKX0pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTAsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYwLDgsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JLy8gT3ZlcmxhcCBjb21wbGV0ZSBzdHlsZQotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNDgsIDIwLCBuZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSg0OCwyMCxZRUxMT1csUkVEKX0pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNDgsMjAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQlTdHlsZVJhbmdlIHJhbmdlc1tdID0gbmV3IFN0eWxlUmFuZ2VbM107Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSg0OCwyMCxCTFVFLENZQU4pOwotCXJhbmdlc1syXSA9IGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgNzgsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0OCwyMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNCIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMCw1LEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTUsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDUsQkxVRSxDWUFOKSkpOwotCQotCXRleHQuc2V0VGV4dCgicmVkZ3JlZW5ibHVleWVsbG93Y3lhbnB1cnBsZSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzRdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMyxSRUQsbnVsbCk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMyw1LEdSRUVOLG51bGwpOwotCXJhbmdlc1syXSA9IGdldFN0eWxlKDgsNCxCTFVFLG51bGwpOwotCXJhbmdlc1szXSA9IGdldFN0eWxlKDEyLDYsWUVMTE9XLG51bGwpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDE4LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMyw1LEdSRUVOLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg4LDQsQkxVRSwgbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDEyLDYsWUVMTE9XLG51bGwpKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMTgsNCxDWUFOLG51bGwpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDIyLDYsUFVSUExFLG51bGwpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDE4LCAxMCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzLmxlbmd0aCA9PSA2KTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbNF0uZXF1YWxzKGdldFN0eWxlKDE4LDQsQ1lBTixudWxsKSkpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1s1XS5lcXVhbHMoZ2V0U3R5bGUoMjIsNixQVVJQTEUsbnVsbCkpKTsKLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHRTdHJpbmcgPSB0ZXh0U3RyaW5nKCk7Ci0JCQkKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDM1LCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMTUsQkxVRSxDWUFOKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgyMCwxMCxHUkVFTixQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDUsIDI1LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDE1LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyMCwxNSxHUkVFTixQVVJQTEUpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMCwxMCxCTFVFLENZQU4pOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIwLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMyxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMiw1LEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNSwgMTIsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEyLDgsQkxVRSxDWUFOKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzNdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSg1LDUsQkxVRSxDWUFOKTsKLQlyYW5nZXNbMl0gPSBnZXRTdHlsZSgxMCw1LEdSRUVOLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTUsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSw1LFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEwLDUsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNSwgMTAsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxMjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTUsUkVELFlFTExPVykpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDUiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxMCw1LEdSRUVOLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTUsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDUsNSxCTFVFLENZQU4pOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDEwLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MTM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MTM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDUsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxMzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDUsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTAsNSxCTFVFLENZQU4pOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDE1LCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsNyxCTFVFLENZQU4pOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDUsIDcsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxNDoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoxNDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxNDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMTAsQkxVRSxDWUFOKSkpOwotCi0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQl0ZXh0U3RyaW5nID0gdGV4dFN0cmluZygpOwotCi0KLQkvKiAKLQkJZGVmYXVsdFN0eWxlcwotCQkKLQkJCSgwLDQ4LFJFRCxZRUxMT1cpLCAKLQkJCSg1OCwxMCxCTFVFLENZQU4pLCAKLQkJCSg2OCwxMCxHUkVFTixQVVJQTEUpCi0JKi8KLQotCi0JLy8gRW5kL0JlZ2lubmluZyBvdmVybGFwCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgzOCwyNSxZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygzOCwgMjUsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMzgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzOCwyNSxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYzLDUsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNjMsMTAsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNjMsIDEwLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsNSxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjMsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg3Myw1LEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIENvbXBsZXRlIG92ZXJsYXAKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw3OCxZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCA3OCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNzgsWUVMTE9XLFJFRCkpKTsKLQotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDY4LFlFTExPVyxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDY4LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDY4LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1OCwyMCxZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1OCwgMjAsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwyMCxZRUxMT1csUkVEKSkpOwotCi0JLy8gMS1OIGNvbXBsZXRlLCBiZWdpbm5pbmcKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoIAotCQluZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSgwLDUsUkVELFJFRCksIGdldFN0eWxlKDUsNSxZRUxMT1csWUVMTE9XKSwKLQkJCWdldFN0eWxlKDEwLDUsQ1lBTixDWUFOKSwgZ2V0U3R5bGUoMTUsNSxCTFVFLEJMVUUpLAotCQkJZ2V0U3R5bGUoMjAsNSxHUkVFTixHUkVFTiksIGdldFN0eWxlKDI1LDUsUFVSUExFLFBVUlBMRSl9Ci0JKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDIzLFlFTExPVyxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDUsIDIzLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIzLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjgsMixQVVJQTEUsUFVSUExFKSkpOwotCQotCS8vIGVuZCwgMS1OIGNvbXBsZXRlLCBiZWdpbm5pbmcKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKCAKLQkJbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMCw1LFJFRCxSRUQpLCBnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVyksCi0JCQlnZXRTdHlsZSgxMCw1LENZQU4sQ1lBTiksIGdldFN0eWxlKDE1LDUsQkxVRSxCTFVFKSwKLQkJCWdldFN0eWxlKDIwLDUsR1JFRU4sR1JFRU4pLCBnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpfQotCSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMTMsMTIsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMTMsIDEyLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzLmxlbmd0aCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMCwzLENZQU4sQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSgxMywxMixZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbNF0uZXF1YWxzKGdldFN0eWxlKDI1LDUsUFVSUExFLFBVUlBMRSkpKTsKLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCS8vIGluc2VydCB3aXRoIG5vIHN0eWxlcwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDUsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTAsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MXhhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0KLQkvLyBpbnNlcnQgYmVmb3JlIDEgc3R5bGUKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDEwLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMyxQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAzLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MXhiOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMyxQVVJQTEUsUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjoxeGI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDMsUkVELFlFTExPVykpKTsKLQotCS8vIGluc2VydCBhZnRlciAxIHN0eWxlCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMyxSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg4LDEsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoOCwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YzoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoxeGM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDMsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MXhjOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoOCwxLFBVUlBMRSxQVVJQTEUpKSk7Ci0KLQkvLyBpbnNlcnQgYmVmb3JlIDIgc3R5bGVzCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMixSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMCwyLFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIwLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDIsMSxQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygyLCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MXhlOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDIsMSxQVVJQTEUsUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjoxeGU6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MXhlOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMixSRUQsWUVMTE9XKSkpOwotCi0JLy8gaW5zZXJ0IGFmdGVyIDIgc3R5bGVzCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMixSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMCwyLFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIwLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEyLDEsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMTIsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MXhmOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDIsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MXhmOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTIsMSxQVVJQTEUsUFVSUExFKSkpOwotCi0JLy8gaW5zZXJ0IG1pZGRsZSAyIHN0eWxlcwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxLDIsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTIsMixSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDMsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNSwgMywgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxeGc6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxLDIsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MXhnOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwzLFBVUlBMRSxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEyLDIsUkVELFlFTExPVykpKTsKLQkKLQkvLyBpbnNlcnQgbWlkZGxlIDMgc3R5bGVzCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzNdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEsMyxSRUQsUFVSUExFKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSg2LDMsUFVSUExFLFlFTExPVyk7Ci0JcmFuZ2VzWzJdID0gZ2V0U3R5bGUoMTIsMyxSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg0LDIsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNCwgMiwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4aDoiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxeGg6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxLDMsUkVELFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MXhoOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNCwyLFBVUlBMRSxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4aDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYsMyxQVVJQTEUsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxeGg6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSgxMiwzLFJFRCxZRUxMT1cpKSk7CQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dC5zZXRUZXh0KCIwIik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEsUFVSUExFLFBVUlBMRSk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMSwxLFJFRCxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MnhiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxLFlFTExPVyxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4YjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEsMSxSRUQsUkVEKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMSxQVVJQTEUsUFVSUExFKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxLDEsUkVELFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMiwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxLDEsWUVMTE9XLFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMSwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4YzoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoyeGM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEsUFVSUExFLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MnhjOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMSwxLFlFTExPVyxZRUxMT1cpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMiIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMSxQVVJQTEUsUFVSUExFKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxLDEsUkVELFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMiwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgyLDEsWUVMTE9XLFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMiwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZDoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoyeGQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEsUFVSUExFLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MnhkOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMSwxLFJFRCxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDIsMSxZRUxMT1csWUVMTE9XKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNCIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzNdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEsMSxQVVJQTEUsUFVSUExFKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgyLDEsUkVELFJFRCk7Ci0JcmFuZ2VzWzJdID0gZ2V0U3R5bGUoMywxLFBVUlBMRSxQVVJQTEUpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMocmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg0LDEsWUVMTE9XLFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNCwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoyeGU6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg0LDEsWUVMTE9XLFlFTExPVykpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg0LDEsWUVMTE9XLFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNCwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyeGY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg0LDEsWUVMTE9XLFlFTExPVykpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg0LDEsWUVMTE9XLFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNCwgMSwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVswXTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg0LCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MnhnOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZXBsYWNlVGV4dFJhbmdlSUlMamF2YV9sYW5nX1N0cmluZygpewotCVN0cmluZyBkZWZhdWx0VGV4dCA9ICJsaW5lMFxuXHJsaW5lMVxuXHJsaW5lMlxuXHIiOwotCWludCBkZWZhdWx0VGV4dExlbmd0aCA9IGRlZmF1bHRUZXh0Lmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25TdGFydCA9IDc7Ci0JaW50IHNlbGVjdGlvbkxlbmd0aCA9IDc7Ci0JaW50IHJlcGxhY2VTdGFydCA9IHNlbGVjdGlvblN0YXJ0ICsgc2VsZWN0aW9uTGVuZ3RoICsgMTsKLQlpbnQgcmVwbGFjZUxlbmd0aCA9IDU7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTdHJpbmcgbmV3VGV4dCA9ICJuZXdsaW5lMFxuXHJuZXdsaW5lMSI7Ci0JaW50IG5ld1RleHRMZW5ndGggPSBuZXdUZXh0Lmxlbmd0aCgpOwotCQkJCi0JLy8gaW5zZXJ0IHRleHQKLQkvLyB3aXRoaW4gcmFuZ2UKLQkvLyBhZnRlciBzZWxlY3Rpb24KLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZShyZXBsYWNlU3RhcnQsIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCQkKLQkvLyBiZWZvcmUgc2VsZWN0aW9uCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGgpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICsgbmV3VGV4dExlbmd0aCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCi0KLQkvLyBpbnRlcnNlY3Rpbmcgc2VsZWN0aW9uCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2Uoc2VsZWN0aW9uU3RhcnQgKyAxLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IGRlZmF1bHRUZXh0TGVuZ3RoICsgbmV3VGV4dExlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgKyAxICsgbmV3VGV4dExlbmd0aCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSAwKTsKLQkJCQkKLQkvLyBvdXQgb2YgcmFuZ2UKLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRyeSB7Ci0JCXRleHQucmVwbGFjZVRleHRSYW5nZSgtMSwgMCwgbmV3VGV4dCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6ZzoiLCBleGNlcHRpb25UaHJvd24pOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpICsgMSwgMCwgbmV3VGV4dCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCBudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQkKLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQlhc3NlcnRUcnVlKCI6aDoiLCBleGNlcHRpb25UaHJvd24pOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IHNlbGVjdGlvbkxlbmd0aCk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCQotCS8vIGFwcGVuZCB0ZXh0Ci0JLy8gYXBwZW5kIGluIGVtcHR5IHdpZGdldAotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCksIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpqOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gbmV3VGV4dExlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOms6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gMCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSAwKTsKLQkJCQotCS8vIGFwcGVuZCBpbiBub24tZW1wdHkgd2lkZ2V0IChzZWxlY3Rpb24gc2hvdWxkIGFsd2F5cyBiZSBwcmVzZXJ2ZWQpCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmw6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGgpOwotCWFzc2VydFRydWUoIjptOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvLyBwbGFjZSBjYXJldCBhdCBlbmQgb2YgdGV4dAotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpLCAwKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCksIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpuOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6bzoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSB0ZXh0LmdldENoYXJDb3VudCgpIC0gbmV3VGV4dExlbmd0aCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSAwKTsKLQotCS8vIHJlcGxhY2UgdGV4dAotCS8vIHdpdGhpbiByYW5nZQotCS8vIGFmdGVyIHNlbGVjdGlvbgotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHJlcGxhY2VTdGFydCwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOnA6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGggLSByZXBsYWNlTGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6cToiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCQkKLQkvLyBiZWZvcmUgc2VsZWN0aW9uCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOnI6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGggLSByZXBsYWNlTGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6czoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCArIG5ld1RleHRMZW5ndGggLSByZXBsYWNlTGVuZ3RoICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IHNlbGVjdGlvbkxlbmd0aCk7Ci0JCi0JLy8gaW50ZXJzZWN0aW5nIHNlbGVjdGlvbgotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMSwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOnQ6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGggLSByZXBsYWNlTGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6dToiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCArIDEgKyBuZXdUZXh0TGVuZ3RoICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IDApOwotCQkJCi0JLy8gb3V0IG9mIHJhbmdlCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0cnkgewotCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoLTEsIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOnY6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSArIDEsIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOnc6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQlhc3NlcnRUcnVlKCI6eDoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEFsbCgpIHsKLQlTdHJpbmcgbGluZSA9ICJMaW5lMVxyTGluZTIiOwotCQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKGxpbmUsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQkKLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQoKSB7Ci0JQ2FyZXQgY2FyZXQgPSBuZXcgQ2FyZXQodGV4dCwgU1dULk5PTkUpOwotCWZpbmFsIGludCBYSU5TRVQgPSBpc0JpZGlDYXJldCgpID8gMiA6IDA7Ci0JCi0JdGV4dC5zZXRDYXJldChjYXJldCk7Ci0JYXNzZXJ0RXF1YWxzKFhJTlNFVCwgdGV4dC5nZXRDYXJldCgpLmdldExvY2F0aW9uKCkueCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXQoKS5nZXRMb2NhdGlvbigpLnkpOwotCi0JdGV4dC5zZXRDYXJldChudWxsKTsJCQotCXRleHQuc2V0VGV4dCgiXHJMaW5lMiIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIpOwotCi0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQl0ZXh0LnNldENhcmV0KGNhcmV0KTsKLQlhc3NlcnRUcnVlKHRleHQuZ2V0Q2FyZXQoKS5nZXRMb2NhdGlvbigpLnggPiAwKTsKLQlhc3NlcnRFcXVhbHModGV4dC5nZXRMaW5lSGVpZ2h0KCksIHRleHQuZ2V0Q2FyZXQoKS5nZXRMb2NhdGlvbigpLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJpZGlDb2xvcmluZ1ooKSB7Ci0JLy8vIHNldEJpZGlDb2xvcmluZyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJpZGlDb2xvcmluZ1ogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDYXJldE9mZnNldEkoKXsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KC0yKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgxKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgwKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0KLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoLTIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDEpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAxKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQotCXRleHQuc2V0Q2FyZXRPZmZzZXQodGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQodGV4dC5nZXRDaGFyQ291bnQoKSArIDEpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDUpOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSA1KTsKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmo6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOms6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmw6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93bjsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gbmV3IFN0eWxlZFRleHRDb250ZW50KCkgewotCQlwdWJsaWMgdm9pZCBhZGRUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIGludCBnZXRDaGFyQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0QXRMaW5lKGludCBsaW5lSW5kZXgpIHsKLQkJCXJldHVybiAwOwotCQl9CQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgcmVwbGFjZUxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQl9OwotCXRleHQuc2V0Q29udGVudChjb250ZW50KTsKLQlhc3NlcnRFcXVhbHMoY29udGVudCwgdGV4dC5nZXRDb250ZW50KCkpOwotCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQuc2V0Q29udGVudChudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaKCl7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdGFibGVaKCl7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKXsKLQlGb250RGF0YSBmb250RGF0YSA9IHRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JaW50IGxpbmVIZWlnaHQ7Ci0JRm9udCBmb250OwotCQotCWZvbnQgPSBuZXcgRm9udCh0ZXh0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCAyMCwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JdGV4dC5zZXRGb250KGZvbnQpOwotCWxpbmVIZWlnaHQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKTsKLQl0ZXh0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZm9udCA9IG5ldyBGb250KHRleHQuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDI1LCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQl0ZXh0LnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRMaW5lSGVpZ2h0KCkgPiBsaW5lSGVpZ2h0ICYmIGZvbnQuZXF1YWxzKHRleHQuZ2V0Rm9udCgpKSk7Ci0JdGV4dC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhvcml6b250YWxJbmRleEkoKXsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMSk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoNTAwKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID4gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwkKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDEpOwkKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQotCS8vIG1ha2Ugc3VyZSB0aGUgd2lkZ2V0IGNhbiBiZSBzY3JvbGxlZAotCXNoZWxsLm9wZW4oKTsKLQl0ZXh0LnNldFNpemUoMTAsIDUwKTsJCi0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhvcml6b250YWxQaXhlbEkoKXsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoMSk7CQotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMSk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoNTAwKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID4gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoLTEpOwkKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKDI1KTsJCi0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAyNSk7CQotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgyKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCi0JLy8gbWFrZSBzdXJlIHRoZSB3aWRnZXQgY2FuIGJlIHNjcm9sbGVkCi0Jc2hlbGwub3BlbigpOwotCXRleHQuc2V0U2l6ZSgxMCwgNTApOwkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoNSk7CQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gNSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluZUJhY2tncm91bmRJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKXsKLQlTdHJpbmcgdGV4dFN0cmluZzsKLQotCXRleHRTdHJpbmcgPSAiTDFcbkwyXG5MM1xuTDQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSw1LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MGE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihHUkVFTikpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCw0LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MGI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBiOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMywxLGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsMSwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBjOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBjOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBjOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gZ2V0Q29sb3IoQkxVRSkpOwotCWFzc2VydFRydWUoIjowYzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDMpID09IGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDYsIiIpOwotCWFzc2VydFRydWUoIjowZDoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6MGQ6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihHUkVFTikpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwzLCIiKTsKLQlhc3NlcnRUcnVlKCI6MGU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MGU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBlOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gZ2V0Q29sb3IoR1JFRU4pKTsKLQotCXRleHRTdHJpbmcgPSAiTDFcbkwyIjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsNCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBhMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCw0LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGIxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxLDEsIiIpOwotCWFzc2VydFRydWUoIjowYzE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MGMxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDUsIiIpOwotCWFzc2VydFRydWUoIjowZDE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsMywiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBlMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjowZTE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBudWxsKTsKLQl0ZXh0U3RyaW5nID0gIkwxXG5MMiI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxLDQsIiIpOwotCWFzc2VydFRydWUoIjowZjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZysiXG4iKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCw2LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGcxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gbnVsbCk7Ci0JCQkJCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwwLGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gbnVsbCk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQkKLQl0ZXh0U3RyaW5nID0gIk5ldyBMaW5lMVxuTmV3IExpbmUyXG5OZXcgTGluZTNcbk5ldyBMaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwyLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwyLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDAsIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjoyOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgzKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDQpID09IGdldENvbG9yKFlFTExPVykpOwotCQotCXRleHRTdHJpbmcgPSAiTmV3IExpbmUxXG5OZXcgTGluZTJcbk5ldyBMaW5lM1xuTmV3IExpbmU0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDIsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDIsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMjAsIiIpOwotCWFzc2VydFRydWUoIjozOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQotCXRleHRTdHJpbmcgPSAiTGluZTFcbkxpbmUyXG5MaW5lM1xuTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwxOCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQotCXRleHRTdHJpbmcgPSAiTGluZTFcbkxpbmUyXG5MaW5lM1xuTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwxOCwiTDFcbkwyXG5MM1xuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6NToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IG51bGwpOwotCWFzc2VydFRydWUoIjo1OiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgzKSA9PSBudWxsKTsKLQotCXRleHRTdHJpbmcgPSAiTGluZTFcbkxpbmUyXG5MaW5lM1xuTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMyw5LCJMMVxuTDJcbiIpOwotCWFzc2VydFRydWUoIjo2YToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjo2YToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IG51bGwpOwotCXRleHRTdHJpbmcgPSAiTGluZTFcbkxpbmUyXG5MaW5lM1xuTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMTEsMTEsIkwzXG5MNCIpOwotCWFzc2VydFRydWUoIjo2YjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDIpID09IG51bGwpOwotCWFzc2VydFRydWUoIjo2YjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDMpID09IG51bGwpOwotCQkKLQl0ZXh0U3RyaW5nID0gIkxpbmUxXG5MaW5lMlxuTGluZTNcbkxpbmU0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMywxLGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMTgsIkwxXG4iKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCWFzc2VydFRydWUoIjo3OiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoR1JFRU4pKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmllbnRhdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE9yaWVudGF0aW9uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JaW50W10gaW52YWxpZCA9IHstMSwgMTAwLCAxMn07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWQubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uKGludmFsaWRbaV0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMTEpOwotCWFzc2VydEVxdWFscygxMSwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZC5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb24oaW52YWxpZFtpXSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JUG9pbnRbXSBpbnZhbGlkUmFuZ2VzID0ge25ldyBQb2ludCgtMSwgMCksIG5ldyBQb2ludCgtMSwgLTEpLCBuZXcgUG9pbnQoMTAwLCAxKSwgCi0JCW5ldyBQb2ludCgxMDAsIC0xKSwgbmV3IFBvaW50KDExLCAxMiksIG5ldyBQb2ludCgxMCwgMTIpfTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb24oaW52YWxpZFJhbmdlc1tpXSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9CQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzLCA3KTsKLQlhc3NlcnRFcXVhbHMoIjM0NTYiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uKGludmFsaWRSYW5nZXNbaV0pOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JSSgpewotCWludFtdW10gaW52YWxpZFJhbmdlcyA9IHt7LTEsIDB9LCB7LTEsIC0xfSwgezEwMCwgMX0sIHsxMDAsIC0xfSwgezExLCAxMn0sIHsxMCwgMTJ9LCB7MiwgLTN9LCB7NTAsIC0xfX07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gaW52YWxpZFJhbmdlc1tpXVswXTsKLQkJaW50IGVuZCA9IGludmFsaWRSYW5nZXNbaV1bMV07Ci0JCi0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihzdGFydCwgZW5kKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMsIDcpOwotCWFzc2VydEVxdWFscygiMzQ1NiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsJCi0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gaW52YWxpZFJhbmdlc1tpXVswXTsKLQkJaW50IGVuZCA9IGludmFsaWRSYW5nZXNbaV1bMV07Ci0JCi0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihzdGFydCwgZW5kKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi19Ci1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCl7Ci0JdGV4dC5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjoxYToiLCB0ZXh0LmdldFNlbGVjdGlvbkJhY2tncm91bmQoKSA9PSAgZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKG51bGwpOwotCWFzc2VydFRydWUoIjoxYjoiLCB0ZXh0LmdldFNlbGVjdGlvbkJhY2tncm91bmQoKS5lcXVhbHModGV4dC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OKSkpOwotfQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpewotCXRleHQuc2V0U2VsZWN0aW9uRm9yZWdyb3VuZChnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgdGV4dC5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCkgPT0gIGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0U2VsZWN0aW9uRm9yZWdyb3VuZChudWxsKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgdGV4dC5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCkuZXF1YWxzKHRleHQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhUKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvblJhbmdlSUkoKXsKLQkvLyBzZXRTZWxlY3Rpb25SYW5nZSBhbHJlYWR5IHRlc3RlZCBpbiB0ZXN0X2dldFNlbGVjdGlvblJhbmdlCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3R5bGVSYW5nZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKXsKLQlTdHlsZVJhbmdlW10gc3R5bGVzOwotCVN0cmluZyB0ZXh0U3RyaW5nID0gdGV4dFN0cmluZygpOwotCi0JLyogCi0JCWRlZmF1bHRTdHlsZXMKLQkJCi0JCQkoMCw0OCxSRUQsWUVMTE9XKSwgCi0JCQkoNTgsMTAsQkxVRSxDWUFOKSwgCi0JCQkoNjgsMTAsR1JFRU4sUFVSUExFKQotCSovCi0KLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQkKLQkvLyBObyBvdmVybGFwIHdpdGggZXhpc3Rpbmcgc3R5bGVzCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCw1LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQ4LDUsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIE92ZXJsYXAgbWlkZGxlIG9mIG9uZSBzdHlsZSAtIHBhcnRpYWwKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDEwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyMCwyOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1s0XS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShudWxsKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQkKLQkvLyBPdmVybGFwIG1pZGRsZSBvZiBvbmUgc3R5bGUgLSBmdWxsCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1OCwxMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCQotCS8vIE92ZXJsYXAgZW5kIG9mIG9uZSBzdHlsZQotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMzgsMTUsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMzgsMTUsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQkvLyBPdmVybGFwIGJlZ2lubmluZyBvZiBvbmUgc3R5bGUKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUwLDEwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUwLDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2MCw4LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIE92ZXJsYXAgY29tcGxldGUgc3R5bGUKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDIwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQ4LDIwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0JCQkKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwyMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHN0eWxlIGJlZm9yZSBpdAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwxMCxSRUQsWUVMTE9XKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDU4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSwxMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHN0eWxlIGFmdGVyIGl0Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDExLDQsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMSwxNCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsMTAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBzdHlsZSBhZnRlciBpdAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDE1LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDEwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDMsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMiw1LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMTAsQkxVRSxDWUFOKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDUsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsUkVELFlFTExPVykpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxNSxSRUQsWUVMTE9XKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsQkxVRSxDWUFOKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDcsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMTAsQkxVRSxDWUFOKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIxMjMgNDU2IDc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0LDMsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDgsMyxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDIsQkxVRSxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg0LDMsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoOCwzLFJFRCxudWxsKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMTIzIDQ1NiA3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNCwzLEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDMsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw0LEJMVUUsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNCw3LEJMVUUsbnVsbCkpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjEyMyA0NTYgNzg5IEFCQyBERUYiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw0LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0LDQsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCw0LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMiw0LFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE2LDMsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMTQsUkVELG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNCxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0LDE1LFJFRCxudWxsKSkpOwotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsMjAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzOCwyMCxudWxsLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMzgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQlpbnQgbGVuZ3RoID0gdGV4dFN0cmluZy5sZW5ndGgoKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDIwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCxsZW5ndGgsbnVsbCxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDMsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDMsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDksOCxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxHUkVFTixQVVJQTEUpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTcsR1JFRU4sUFVSUExFKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDUsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsOSxSRUQsWUVMTE9XKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMixCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg3LDksUkVELFlFTExPVykpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDEwLEdSRUVOLFBVUlBMRSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzLDEwLEdSRUVOLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEzLDIsQkxVRSxDWUFOKSkpOwotCQotCXRleHQuc2V0VGV4dCgicmVkZ3JlZW5ibHVleWVsbG93Y3lhbnB1cnBsZSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDMsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMyw1LEdSRUVOLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCw0LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMiw2LFlFTExPVyxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE4LDQsQ1lBTixudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIyLDYsUFVSUExFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCwxNCxudWxsLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMyw1LEdSRUVOLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg4LDE0LG51bGwsUkVEKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoMjIsNixQVVJQTEUsbnVsbCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KCJyZWRncmVlbmJsdWV5ZWxsb3djeWFucHVycGxlIik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMyxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDUsR1JFRU4sbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDQsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEyLDYsWUVMTE9XLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTgsNCxDWUFOLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMjIsNixQVVJQTEUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDI4LG51bGwsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCi0KLS8qCi0JdGV4dC5zZXRUZXh0KCJUaGlzXHJcbmFcdEFub3RoZXIgbGluZS4iKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMywzLEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg3LDgsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDYsMSxCTFVFLG51bGwpKTsKLQlTdHlsZWRUZXh0RXZlbnQgZXZlbnQgPSBuZXcgU3R5bGVkVGV4dEV2ZW50KCk7Ci0JZXZlbnQuZGV0YWlsID0gNjsKLQlldmVudC50ZXh0ID0gImFcdEFub3RoZXIgbGluZS4iOwotCXRleHQubm90aWZ5TGlzdGVuZXIoU1QuTGluZUdldFN0eWxlLCBldmVudCk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6IiwgZXZlbnQuc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgzLDQsQkxVRSxudWxsKSkpOwotKi8KLQotCi0JdGV4dC5zZXRUZXh0KCIxMjMgNDU2IDc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0LDMsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDgsMyxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDUsQkxVRSxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg0LDYsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMSxSRUQsbnVsbCkpKTsKLQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dFN0cmluZyA9IHRleHRTdHJpbmcoKTsKLQkJCQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDIwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggc3R5bGUgYmVmb3JlIGl0Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDEwLFJFRCxZRUxMT1cpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNTgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsMTAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBzdHlsZSBhZnRlciBpdAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMSw0LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTEsMTQsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSkpOwotCQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDEwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggc3R5bGUgYWZ0ZXIgaXQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwxNSxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsMTAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMyxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEyLDUsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMCwxMCxCTFVFLENZQU4pKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNSxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxSRUQsWUVMTE9XKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDE1LFJFRCxZRUxMT1cpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxCTFVFLENZQU4pKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkCi0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNyxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwxMCxCTFVFLENZQU4pKSk7Ci0KLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHRTdHJpbmcgPSB0ZXh0U3RyaW5nKCk7Ci0KLQotCS8qIAotCQlkZWZhdWx0U3R5bGVzCi0JCQotCQkJKDAsNDgsUkVELFlFTExPVyksIAotCQkJKDU4LDEwLEJMVUUsQ1lBTiksIAotCQkJKDY4LDEwLEdSRUVOLFBVUlBMRSkKLQkqLwotCi0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JCi0JLy8gRW5kL0JlZ2lubmluZyBvdmVybGFwCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzOCwyNSxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDM4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzOCwyNSxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjMsNSxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2MywxMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCw1LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYzLDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg3Myw1LEdSRUVOLFBVUlBMRSkpKTsKLQotCi0JLy8gQ29tcGxldGUgb3ZlcmxhcAotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw3OCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDc4LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDY4LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNjgsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDU4LDIwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDIwLFlFTExPVyxSRUQpKSk7Ci0KLQotCS8vIDEtTiBjb21wbGV0ZSwgYmVnaW5uaW5nCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKCAKLQkJbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMCw1LFJFRCxSRUQpLCBnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVyksCi0JCQlnZXRTdHlsZSgxMCw1LENZQU4sQ1lBTiksIGdldFN0eWxlKDE1LDUsQkxVRSxCTFVFKSwKLQkJCWdldFN0eWxlKDIwLDUsR1JFRU4sR1JFRU4pLCBnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpfQotCSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMjMsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIzLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyOCwyLFBVUlBMRSxQVVJQTEUpKSk7Ci0JCi0JLy8gZW5kLCAxLU4gY29tcGxldGUsIGJlZ2lubmluZwotCXRleHQuc2V0U3R5bGVSYW5nZXMoIAotCQluZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSgwLDUsUkVELFJFRCksIGdldFN0eWxlKDUsNSxZRUxMT1csWUVMTE9XKSwKLQkJCWdldFN0eWxlKDEwLDUsQ1lBTixDWUFOKSwgZ2V0U3R5bGUoMTUsNSxCTFVFLEJMVUUpLAotCQkJZ2V0U3R5bGUoMjAsNSxHUkVFTixHUkVFTiksIGdldFN0eWxlKDI1LDUsUFVSUExFLFBVUlBMRSl9Ci0JKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTMsMTIsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDUpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEwLDMsQ1lBTixDWUFOKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoMTMsMTIsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbNF0uZXF1YWxzKGdldFN0eWxlKDI1LDUsUFVSUExFLFBVUlBMRSkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KCJ4LyIpOwkKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwyLFlFTExPVyxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDIsWUVMTE9XLG51bGwpKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsMCwiLyIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFlFTExPVyxudWxsKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEsWUVMTE9XLG51bGwpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFlFTExPVyxudWxsKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxLDIsUkVELG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMSxZRUxMT1csbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEsMixSRUQsbnVsbCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KCJ4eHgvIik7CQotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDIsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMiwyLFlFTExPVyxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgyLDIsWUVMTE9XLG51bGwpKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDQsMCwiLyIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDIsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMiwyLFlFTExPVyxudWxsKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDEsWUVMTE9XLG51bGwpKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDIsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMiwyLFlFTExPVyxudWxsKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDIsUkVELG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDIsMSxZRUxMT1csbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgzLDIsUkVELG51bGwpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgieHh4LyIpOwkKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMixZRUxMT1csbnVsbCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg0LDAsIi8iKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMSxZRUxMT1csbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDMsUkVELG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxudWxsKSkpOwotCi0KLQl0ZXh0LnNldFRleHQoInh4eC8iKTsJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDIsWUVMTE9XLG51bGwpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNCwwLCIvIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDEsWUVMTE9XLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMSw0LFlFTExPVyxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YzoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0YzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMSxSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NGM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxLDQsWUVMTE9XLG51bGwpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgiTmV3XHJcbiIpOwotCVN0eWxlUmFuZ2Ugc3R5bGUgPSBnZXRTdHlsZSgwLDUsbnVsbCxudWxsKTsKLQlzdHlsZS5mb250U3R5bGUgPSBTV1QuQk9MRDsJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkvLyBzdHlsZXMgKDAsNSxCT0xEKQotCXRleHQucmVwbGFjZVRleHRSYW5nZSgzLDAsImEiKTsgLy8gIk5ld2FcclxuIgotCS8vIHN0eWxlcyAoMCwzLEJPTEQpLCAoNCwyLEJPTEQpCi0Jc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCg0KTsKLQlzdHlsZS5zdGFydCA9IDM7Ci0Jc3R5bGUubGVuZ3RoID0gMTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCS8vIHN0eWxlcyAoMCw2LEJPTEQpCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMCwiYSIpOyAvLyAiYU5ld2FcclxuIgotCS8vIHN0eWxlcyAoMSw2LEJPTEQpCi0Jc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCgxKTsKLQlzdHlsZS5zdGFydCA9IDA7Ci0Jc3R5bGUubGVuZ3RoID0gMTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCS8vIHN0eWxlcyAoMCw3LEJPTEQpCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMSwiIik7IC8vICJOZXdhXHJcbiIKLQkvLyBzdHlsZXMgKDAsNixCT0xEKQotCWZvciAoaW50IGk9MDsgaTw2OyBpKyspIHsKLQkJc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGUuZm9udFN0eWxlID09IFNXVC5CT0xEKTsKLQl9Ci0KLQotCXRleHQuc2V0VGV4dCgiTmV3IEwgMVxyXG5OZXcgTCAyXHJcbiIpOwotCXN0eWxlID0gZ2V0U3R5bGUoMCw5LG51bGwsbnVsbCk7Ci0Jc3R5bGUuZm9udFN0eWxlID0gU1dULkJPTEQ7CQotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JLy8gc3R5bGVzICgwLDksQk9MRCkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNywwLCJhIik7Ci0JLy8gc3R5bGVzICgwLDcsQk9MRCksICg4LDIsQk9MRCkKLQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDgpOwotCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCXN0eWxlLnN0YXJ0ID0gNzsKLQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9Ci0JLy8gc3R5bGVzICgwLDEwLEJPTEQpCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDQsMCwiYSIpOwotCS8vIHN0eWxlcyAoMCw0LEJPTEQpLCAoNSw2LEJPTEQpCi0Jc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCg1KTsKLQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQlzdHlsZS5zdGFydCA9IDQ7Ci0JCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JfQotCS8vIHN0eWxlcyAoMCwxMSxCT0xEKQotCXRleHQucmVwbGFjZVRleHRSYW5nZSgyLDMsIiIpOwotCS8vIHN0eWxlcyAoMCw4LEJPTEQpCi0JZm9yIChpbnQgaT0wOyBpPDg7IGkrKykgewotCQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpOwotCQlhc3NlcnRUcnVlKCI6NWE6Iiwgc3R5bGUuZm9udFN0eWxlID09IFNXVC5CT0xEKTsKLQl9Ci0KLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCQotCS8vCQkJCQkiMDEyMzQ1Njc4OTAxMjMiCi0JdGV4dFN0cmluZyA9IAkJIjEyMzQgMTIzNCAxMjM0IjsKLQotCi0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDIsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsMixZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNiwyLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDQsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgzLDYsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsNCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1YToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo1YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsNixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDEwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjdhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMywxMCxZRUxMT1csUkVEKSkpOwotCi0KLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMixCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MWI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg3LDIsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsMixCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNywyLEJMVUUsQ1lBTikpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDYsMixCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwxLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNiwyLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6M2I6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg4LDEsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsNCxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMyw0LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6NGI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg3LDIsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsNCxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNyw0LEJMVUUsQ1lBTikpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsMTAsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo3YjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo3YjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDMsMTAsQkxVRSxDWUFOKSkpOwotCi0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQkvLwkJCSAJCSIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMiCi0JU3RyaW5nIHRlc3RTdHJpbmc9CSIxMjM0IDEyMzQgMTIzNCAxMjM0IDEyMzQiOwotCQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEyLDIsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEwLDIsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMixZRUxMT1csUkVEKSkpOwotCi0KLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxMiw0LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDEwLDIsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg4LDQsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoOCwyLFlFTExPVyxSRUQpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDgsNiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMTAsNiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoOCwxMiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JCi0JLy8JCQkgCQkJIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMyIKLQkvLwlTdHJpbmcgdGVzdFN0cmluZz0JIjEyMzQgMTIzNCAxMjM0IDEyMzQgMTIzNCI7Ci0JCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg1LDcsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg3LDcsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLEJMVUUsQ1lBTikpKTsKLQotCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgyLDEwLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMiwyLFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg3LDksIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsQkxVRSxDWUFOKSkpOwotCi0KLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDUsOSwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMjoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywxMywiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCi0KLQkvLwkJCSAJCQkiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzIgotCS8vCVN0cmluZyB0ZXN0U3RyaW5nPQkiMTIzNCAxMjM0IDEyMzQgMTIzNCAxMjM0IjsKLQkKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDQsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDcsMTIsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsQkxVRSxDWUFOKSkpOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsNCxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNSwxMiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxNToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxNToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixHUkVFTixQVVJQTEUpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsNCxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoOSwxMCwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxNjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxNjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKSk7Ci0KLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCVN0eWxlUmFuZ2Ugc3R5bGUxID0gZ2V0U3R5bGUoMCwwLG51bGwsbnVsbCk7Ci0KLQotCVN0eWxlUmFuZ2Ugc3R5bGUyID0gZ2V0U3R5bGUoMCwwLFJFRCxZRUxMT1cpOwotCi0KLQlhc3NlcnRUcnVlKCI6MToiLCAhc3R5bGUxLmVxdWFscyhzdHlsZTIpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCAhc3R5bGUxLnNpbWlsYXJUbyhzdHlsZTIpKTsKLQotCi0JYXNzZXJ0VHJ1ZSgiOjE6IiwgIXN0eWxlMi5lcXVhbHMoc3R5bGUxKSk7Ci0KLQotCWFzc2VydFRydWUoIjoxOiIsICFzdHlsZTIuc2ltaWxhclRvKHN0eWxlMSkpOwotCi0KLQotCXN0eWxlMSA9IGdldFN0eWxlKDAsMTAsUkVELFlFTExPVyk7Ci0Jc3R5bGUyID0gZ2V0U3R5bGUoMTEsNSxSRUQsWUVMTE9XKTsKLQotCi0JYXNzZXJ0VHJ1ZSgiOjI6IiwgIXN0eWxlMS5lcXVhbHMoc3R5bGUyKSk7Ci0KLQotCWFzc2VydFRydWUoIjoyOiIsICFzdHlsZTIuZXF1YWxzKHN0eWxlMSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlMS5zaW1pbGFyVG8oc3R5bGUyKSk7Ci0KLQotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlMi5zaW1pbGFyVG8oc3R5bGUxKSk7Ci0KLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFN0eWxlUmFuZ2VzJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTdHlsZVJhbmdlW10gcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbXSB7Ci0JCW5ldyBTdHlsZVJhbmdlKDAsIDEsIGdldENvbG9yKFJFRCksIG51bGwpLCAKLQkJbmV3IFN0eWxlUmFuZ2UoMiwgMSwgZ2V0Q29sb3IoUkVEKSwgbnVsbCl9OwotCQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JdHJ5IHsKLQkJdGV4dC5zZXRTdHlsZVJhbmdlcyhudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotCXRleHQuc2V0U3R5bGVSYW5nZXMocmFuZ2VzKTsKLQlTdHlsZVJhbmdlW10gY3VycmVudFJhbmdlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRFcXVhbHMocmFuZ2VzLmxlbmd0aCwgY3VycmVudFJhbmdlcy5sZW5ndGgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlhc3NlcnRFcXVhbHMocmFuZ2VzW2ldLCBjdXJyZW50UmFuZ2VzW2ldKTsKLQl9Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhuZXcgU3R5bGVSYW5nZVtdIHt9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRTdHlsZVJhbmdlcygpLmxlbmd0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGFic0koKXsKLQl0ZXh0LnNldFRhYnMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUYWJzKCkgPT0gMSk7Ci0JCi0JdGV4dC5zZXRUYWJzKDgpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGFicygpID09IDgpOwotCXRleHQuc2V0VGV4dCgiTGluZVx0MVxyXG4iKTsKLQl0ZXh0LnNldFRhYnMoNyk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUYWJzKCkgPT0gNyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCQotCXRyeSB7Ci0JCXRleHQuc2V0VGV4dChudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQkKLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExpbWl0SSgpewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdGV4dC5zZXRUZXh0TGltaXQoMTApOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gMTApOwotCi0JdGV4dC5zZXRUZXh0TGltaXQoLTEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gLTEpOwotCi0JdHJ5IHsKLQkJdGV4dC5zZXRUZXh0TGltaXQoMCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6YzoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wSW5kZXhJKCl7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMGFcclxuIik7Ci0KLQl0ZXh0LnNldFRvcEluZGV4KC0yKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDEpOwotCXRleHQuc2V0VG9wSW5kZXgoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDIpOwotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMyk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDIpOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldFRvcEluZGV4KDIpOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wUGl4ZWxJKCl7Ci0JaW50IGxpbmVIZWlnaHQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKTsKLQkKLQl0ZXh0LnNldFRvcFBpeGVsKC0xKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BQaXhlbCgxKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0KLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwotCQotCXRleHQuc2V0VG9wUGl4ZWwoLTIpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcFBpeGVsKC0xKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BQaXhlbCgxKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMSk7Ci0JdGV4dC5zZXRUb3BQaXhlbCgyICogbGluZUhlaWdodCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDIgKiBsaW5lSGVpZ2h0KTsKLQl0ZXh0LnNldFRvcFBpeGVsKDApOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcFBpeGVsKDMgKiBsaW5lSGVpZ2h0KTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMiAqIGxpbmVIZWlnaHQpOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldFRvcFBpeGVsKDIgKiBsaW5lSGVpZ2h0KTsKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X3NldFdvcmRXcmFwWigpewotCVN0cmluZyB0ZXN0U3RyaW5nID0gIkxpbmUxXG5MaW5lMiI7Ci0JCi0JdGV4dC5zZXRXb3JkV3JhcCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFdvcmRXcmFwKCkpOwotCXRleHQuc2V0V29yZFdyYXAoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0V29yZFdyYXAoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRXb3JkV3JhcChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRXb3JkV3JhcCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldFdvcmRXcmFwKHRydWUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0V29yZFdyYXAoKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscygiOmU6IiwgdGVzdFN0cmluZywgdGV4dC5nZXRUZXh0KCkpOwotCWFzc2VydEVxdWFscygiOmY6IiwgMiwgdGV4dC5nZXRMaW5lQ291bnQoKSk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dTZWxlY3Rpb24oKSB7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoNSwgMik7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29weSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCaWRpQ29sb3JpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0T2Zmc2V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGFyQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RWRpdGFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhvcml6b250YWxJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SG9yaXpvbnRhbFBpeGVsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRLZXlCaW5kaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUF0T2Zmc2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUJhY2tncm91bmRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVEZWxpbWl0ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZVBpeGVsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhdGlvbkF0T2Zmc2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0T2Zmc2V0QXRMaW5lSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0T2Zmc2V0QXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9yaWVudGF0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSYW5nZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25UZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGVSYW5nZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlUmFuZ2VzSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRhYnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dExpbWl0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0UmFuZ2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcFBpeGVsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXb3JkV3JhcCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludm9rZUFjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Bhc3RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wcmludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dFByaW50T3B0aW9ucyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWRyYXdJSUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3UmFuZ2VJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlcGxhY2VTdHlsZVJhbmdlc0lJJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCaWRpQ29sb3JpbmdaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2FyZXRPZmZzZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFZGl0YWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIb3Jpem9udGFsSW5kZXhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIb3Jpem9udGFsUGl4ZWxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRLZXlCaW5kaW5nSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExpbmVCYWNrZ3JvdW5kSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRPcmllbnRhdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvblJhbmdlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN0eWxlUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTdHlsZVJhbmdlcyRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUYWJzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExpbWl0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcFBpeGVsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V29yZFdyYXBaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRCaWRpU2VnbWVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lciIpKSB0ZXN0X2FkZEJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lciIpKSB0ZXN0X2FkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyIikpIHRlc3RfYWRkTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyIikpIHRlc3RfYWRkVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvcHkiKSkgdGVzdF9jb3B5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jdXQiKSkgdGVzdF9jdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCaWRpQ29sb3JpbmciKSkgdGVzdF9nZXRCaWRpQ29sb3JpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENhcmV0T2Zmc2V0IikpIHRlc3RfZ2V0Q2FyZXRPZmZzZXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoYXJDb3VudCIpKSB0ZXN0X2dldENoYXJDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udGVudCIpKSB0ZXN0X2dldENvbnRlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCIpKSB0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWRpdGFibGUiKSkgdGVzdF9nZXRFZGl0YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhvcml6b250YWxJbmRleCIpKSB0ZXN0X2dldEhvcml6b250YWxJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SG9yaXpvbnRhbFBpeGVsIikpIHRlc3RfZ2V0SG9yaXpvbnRhbFBpeGVsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRLZXlCaW5kaW5nSSIpKSB0ZXN0X2dldEtleUJpbmRpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQXRPZmZzZXRJIikpIHRlc3RfZ2V0TGluZUF0T2Zmc2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUJhY2tncm91bmRJIikpIHRlc3RfZ2V0TGluZUJhY2tncm91bmRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQ291bnQiKSkgdGVzdF9nZXRMaW5lQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVEZWxpbWl0ZXIiKSkgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lSGVpZ2h0IikpIHRlc3RfZ2V0TGluZUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUluZGV4IikpIHRlc3RfZ2V0TGluZUluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lUGl4ZWwiKSkgdGVzdF9nZXRMaW5lUGl4ZWwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2F0aW9uQXRPZmZzZXRJIikpIHRlc3RfZ2V0TG9jYXRpb25BdE9mZnNldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9mZnNldEF0TGluZUkiKSkgdGVzdF9nZXRPZmZzZXRBdExpbmVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPZmZzZXRBdExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X2dldE9mZnNldEF0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPcmllbnRhdGlvbiIpKSB0ZXN0X2dldE9yaWVudGF0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSYW5nZXMiKSkgdGVzdF9nZXRSYW5nZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCIpKSB0ZXN0X2dldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkZvcmVncm91bmQiKSkgdGVzdF9nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25SYW5nZSIpKSB0ZXN0X2dldFNlbGVjdGlvblJhbmdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25UZXh0IikpIHRlc3RfZ2V0U2VsZWN0aW9uVGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGUiKSkgdGVzdF9nZXRTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0SSIpKSB0ZXN0X2dldFN0eWxlUmFuZ2VBdE9mZnNldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlUmFuZ2VzIikpIHRlc3RfZ2V0U3R5bGVSYW5nZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlUmFuZ2VzSUkiKSkgdGVzdF9nZXRTdHlsZVJhbmdlc0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUYWJzIikpIHRlc3RfZ2V0VGFicygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRJSSIpKSB0ZXN0X2dldFRleHRJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dExpbWl0IikpIHRlc3RfZ2V0VGV4dExpbWl0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0UmFuZ2VJSSIpKSB0ZXN0X2dldFRleHRSYW5nZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BJbmRleCIpKSB0ZXN0X2dldFRvcEluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BQaXhlbCIpKSB0ZXN0X2dldFRvcFBpeGVsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXb3JkV3JhcCIpKSB0ZXN0X2dldFdvcmRXcmFwKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnZva2VBY3Rpb25JIikpIHRlc3RfaW52b2tlQWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFzdGUiKSkgdGVzdF9wYXN0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcHJpbnQiKSkgdGVzdF9wcmludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIiKSkgdGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0UHJpbnRPcHRpb25zIikpIHRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0UHJpbnRPcHRpb25zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXciKSkgdGVzdF9yZWRyYXcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd0lJSUlaIikpIHRlc3RfcmVkcmF3SUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd1JhbmdlSUlaIikpIHRlc3RfcmVkcmF3UmFuZ2VJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVwbGFjZVN0eWxlUmFuZ2VzSUkkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpKSB0ZXN0X3JlcGxhY2VTdHlsZVJhbmdlc0lJJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmlkaUNvbG9yaW5nWiIpKSB0ZXN0X3NldEJpZGlDb2xvcmluZ1ooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0IikpIHRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENhcmV0T2Zmc2V0SSIpKSB0ZXN0X3NldENhcmV0T2Zmc2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50IikpIHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpKSB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaIikpIHRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWRpdGFibGVaIikpIHRlc3Rfc2V0RWRpdGFibGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SG9yaXpvbnRhbEluZGV4SSIpKSB0ZXN0X3NldEhvcml6b250YWxJbmRleEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhvcml6b250YWxQaXhlbEkiKSkgdGVzdF9zZXRIb3Jpem9udGFsUGl4ZWxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRLZXlCaW5kaW5nSUkiKSkgdGVzdF9zZXRLZXlCaW5kaW5nSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExpbmVCYWNrZ3JvdW5kSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0TGluZUJhY2tncm91bmRJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpKSB0ZXN0X3NldE9yaWVudGF0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbklJIikpIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25SYW5nZUlJIikpIHRlc3Rfc2V0U2VsZWN0aW9uUmFuZ2VJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3R5bGVSYW5nZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKSkgdGVzdF9zZXRTdHlsZVJhbmdlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3R5bGVSYW5nZXMkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpKSB0ZXN0X3NldFN0eWxlUmFuZ2VzJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRhYnNJIikpIHRlc3Rfc2V0VGFic0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMaW1pdEkiKSkgdGVzdF9zZXRUZXh0TGltaXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcEluZGV4SSIpKSB0ZXN0X3NldFRvcEluZGV4SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wUGl4ZWxJIikpIHRlc3Rfc2V0VG9wUGl4ZWxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXb3JkV3JhcFoiKSkgdGVzdF9zZXRXb3JkV3JhcFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKSkgdGVzdF9zaG93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkiKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotLyoqCi0gKiBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxOTk4NQotICovCi1wcm90ZWN0ZWQgdm9pZCB0ZXN0UnRmQ29weSgpIHsKLQlTdHJpbmcgbGluZXMgPSAiTGluZTBcbkxpbmUxXG5MaW5lMlxuTGluZTNcbkxpbmU0XG5MaW5lNSI7Ci0JZmluYWwgaW50W10gbGluZXNDYWxsZWQgPSBuZXcgaW50W10gezB9OwotCUxpbmVTdHlsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpbmVTdHlsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IChTdHlsZWRUZXh0KSBldmVudC53aWRnZXQ7Ci0JCQlpbnQgbGluZUluZGV4ID0gc3R5bGVkVGV4dC5nZXRMaW5lQXRPZmZzZXQoZXZlbnQubGluZU9mZnNldCk7Ci0JCQlpbnQgbGluZVN0YXJ0ID0gZXZlbnQubGluZU9mZnNldDsKLQkJCWludCBsaW5lRW5kID0gbGluZVN0YXJ0ICsgZXZlbnQubGluZVRleHQubGVuZ3RoKCk7Ci0JCQlTdHlsZVJhbmdlIGdvb2RSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKDAsIDEsIHJlZCwgcmVkKTsKLQkJCQotCQkJZXZlbnQuc3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JCQlzd2l0Y2ggKGxpbmVJbmRleCAlIDYpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCWV2ZW50LnN0eWxlc1swXSA9IGdvb2RSYW5nZTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCwgMSwgcmVkLCByZWQpOwotCQkJCQlsaW5lc0NhbGxlZFswXSsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCWV2ZW50LnN0eWxlc1swXSA9IGdvb2RSYW5nZTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCwgLTEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQlldmVudC5zdHlsZXNbMF0gPSBnb29kUmFuZ2U7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVFbmQgLSAxLCAtMSwgcmVkLCByZWQpOwotCQkJCQlsaW5lc0NhbGxlZFswXSsrOwkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQlldmVudC5zdHlsZXNbMF0gPSBnb29kUmFuZ2U7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVTdGFydCwgLTEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsJCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDoKLQkJCQkJZXZlbnQuc3R5bGVzWzBdID0gbmV3IFN0eWxlUmFuZ2UobGluZVN0YXJ0LCAxLCByZWQsIHJlZCk7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVTdGFydCwgLTEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsJCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNToKLQkJCQkJZXZlbnQuc3R5bGVzWzBdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCAvIDIsIDEsIHJlZCwgcmVkKTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCAvIDIsIC0xLCByZWQsIHJlZCk7Ci0JCQkJCWxpbmVzQ2FsbGVkWzBdKys7CQotCQkJCQlicmVhazsKLQkJCX0JCQkKLQkJfQotCX07Ci0JdGV4dC5zZXRUZXh0KGxpbmVzKTsJCi0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGluZXNDYWxsZWRbMF0gPSAwOwotCXRleHQuY29weSgpOwotCWFzc2VydFRydWUoIm5vdCBhbGwgbGluZXMgdGVzdGVkIGZvciBSVEYgY29weSIsIGxpbmVzQ2FsbGVkWzBdID09IHRleHQuZ2V0TGluZUNvdW50KCkpOwotCQotCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHRleHQuZ2V0RGlzcGxheSgpKTsKLQlSVEZUcmFuc2ZlciBydGZUcmFuZmVyID0gUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQlTdHJpbmcgY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyhydGZUcmFuZmVyKTsKLQlhc3NlcnRUcnVlKCJSVEYgY29weSBmYWlsZWQiLCBjbGlwYm9hcmRUZXh0Lmxlbmd0aCgpID4gMCk7Ci0KLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCXRleHQucmVtb3ZlTGluZVN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnYScsIDAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAzLCBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMTAsIDUwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMWJmYmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dENvbnRlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dENvbnRlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQlpbnQgWElOU0VUID0gMDsKLQotCWNsYXNzIENvbnRlbnRJbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIFN0eWxlZFRleHRDb250ZW50IHsKLQkJU3RyaW5nIHRleHRDb250ZW50ID0gIiI7Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKXsKLQkJfQotCQlwdWJsaWMgaW50IGdldENoYXJDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gImdldExpbmUiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQkJcmV0dXJuICJnZXRMaW5lRGVsaW1pdGVyIjsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldEF0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHRSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiB0ZXh0Q29udGVudDsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVwbGFjZVRleHRSYW5nZShpbnQgc3RhcnQsIGludCByZXBsYWNlTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQkJdGV4dENvbnRlbnQgPSB0ZXh0OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJCXRleHRDb250ZW50ID0gdGV4dDsKLQkJfQotCX0KLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gbmV3IENvbnRlbnRJbXBsZW1lbnRhdGlvbigpOwotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWlmIChpc0JpZGkoKSkgWElOU0VUID0gMjsKLQllbHNlIFhJTlNFVCA9IDA7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzdHlsZWRUZXh0LnNldENvbnRlbnQoY29udGVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyKCkgewotCS8vIGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gdGVzdCwgbm90IGNhbGxlZCBieSBTdHlsZWRUZXh0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hhckNvdW50KCkgewotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlZFRleHQuZ2V0Q2hhckNvdW50KCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUF0T2Zmc2V0SSgpIHsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZWRUZXh0LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lQ291bnQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc3R5bGVkVGV4dC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCkgewotCWFzc2VydFRydWUoIjplOiIsIHN0eWxlZFRleHQuZ2V0TGluZURlbGltaXRlcigpLmVxdWFscygiZ2V0TGluZURlbGltaXRlciIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lSSgpIHsKLQkvLyB3aWxsIGluZGlyZWN0bHkgY2F1c2UgZ2V0TGluZSB0byBiZSBjYWxsZWQKLQlhc3NlcnRUcnVlKCI6YjoiLCBzdHlsZWRUZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCkuZXF1YWxzKG5ldyBQb2ludChYSU5TRVQsMCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPZmZzZXRBdExpbmVJKCkgewotCS8vIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBnZXRPZmZzZXRBdExpbmUgdG8gYmUgY2FsbGVkCi0JYXNzZXJ0VHJ1ZSgiOmY6Iiwgc3R5bGVkVGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApLmVxdWFscyhuZXcgUG9pbnQoWElOU0VULDApKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dFJhbmdlSUkoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmc6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0UmFuZ2UoMCwwKS5lcXVhbHMoIiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JLy8gZG9lcyBub3QgbWFrZSBzZW5zZSB0byB0ZXN0LCBub3QgY2FsbGVkIGJ5IFN0eWxlZFRleHQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZXBsYWNlVGV4dFJhbmdlSUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwwLCJ0ZXN0MSIpOwotCWFzc2VydFRydWUoIjpoOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygidGVzdDEiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLDAsInRlc3QyIik7Ci0JYXNzZXJ0VHJ1ZSgiOmk6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJ0ZXN0MiIpKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGFyQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVBdE9mZnNldEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZURlbGltaXRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9mZnNldEF0TGluZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRSYW5nZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIiKSkgdGVzdF9hZGRUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoYXJDb3VudCIpKSB0ZXN0X2dldENoYXJDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUF0T2Zmc2V0SSIpKSB0ZXN0X2dldExpbmVBdE9mZnNldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVDb3VudCIpKSB0ZXN0X2dldExpbmVDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZURlbGltaXRlciIpKSB0ZXN0X2dldExpbmVEZWxpbWl0ZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVJIikpIHRlc3RfZ2V0TGluZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9mZnNldEF0TGluZUkiKSkgdGVzdF9nZXRPZmZzZXRBdExpbmVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0UmFuZ2VJSSIpKSB0ZXN0X2dldFRleHRSYW5nZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVDdXJzb3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3M2ZjZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVDdXJzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUN1cnNvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUN1cnNvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbHVtbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJvdygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Um93IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUN1cnNvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSb3ciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uIikpIHRlc3RfZ2V0Q29sdW1uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSb3ciKSkgdGVzdF9nZXRSb3coKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbklJIikpIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGQxY2EyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb2x1bW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29sdW1uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29sdW1uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbHVtbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbiIpKSB0ZXN0X2dldENvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbSIpKSB0ZXN0X2dldEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbHVtbkkiKSkgdGVzdF9zZXRDb2x1bW5JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIikpIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKSkgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1ZDNhNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0YWJsZVRyZWUgPSBuZXcgVGFibGVUcmVlKHNoZWxsLCBzdHlsZSA9IFNXVC5NVUxUSSk7Ci0Jc2V0V2lkZ2V0KHRhYmxlVHJlZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kZXNlbGVjdEFsbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUNvdW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUhlaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUhlaWdodCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlUYWJsZVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIFNXVC5OT05FKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogQWZ0ZXIgYWRkaW5nIGl0ZW1zLCBidXQgYmVmb3JlIHNlbGVjdGluZyBhbnkiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9LCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JLy8gZ2V0U2VsZWN0aW9uKCkgaXMgZnVydGhlciB0ZXN0ZWQgaW4gdGVzdF9zZWxlY3RBbGwgYW5kIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlUYWJsZVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIFNXVC5OT05FKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogQWZ0ZXIgYWRkaW5nIGl0ZW1zLCBidXQgYmVmb3JlIHNlbGVjdGluZyBhbnkiLCAwLCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JLy8gZ2V0U2VsZWN0aW9uQ291bnQoKSBpcyBmdXJ0aGVyIHRlc3RlZCBpbiB0ZXN0X3NlbGVjdEFsbCBhbmQgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRhYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUYWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQWxsIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW4oKSB7Ci0JLyogT3ZlcnJpZGluZyB0ZXN0X2dldENoaWxkcmVuIGZyb20gVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUKLQkgKiB0byBkbyBub3RoaW5nLCBiZWNhdXNlIHRoZSBjaGlsZCBvZiBhIFRhYmxlVHJlZSBpcyBhbHdheXMgYSBUYWJsZS4KLQkgKi8KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RBbGwoKSB7Ci0JLyogRlVUVVJFOiBTaG91bGQgYWxzbyBhZGQgc3ViLW5vZGVzLCBhbmQgdGVzdCBib3RoIHNpbmdsZSBhbmQgbXVsdGkgd2l0aCB0aG9zZS4KLQkgKiBpLmUuIHN1Yml0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0oaXRlbXNbaV0sIFNXVC5OT05FKTsgKi8KLQotCXNlbGVjdEFsbF9oZWxwZXIoIkVtcHR5IHRhYmxlIHRyZWUiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQotCWludCBudW1iZXIgPSA4OwotCVRhYmxlVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZVRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgU1dULk5PTkUpOwotCX0KLQlzZWxlY3RBbGxfaGVscGVyKCJzZWxlY3RBbGwoKSIsIGl0ZW1zKTsKLQotCQotCS8qIE5vdyBydW4gdGhlIHNhbWUgdGVzdHMgb24gYSBzaW5nbGUtc2VsZWN0IFRhYmxlVHJlZS4gKi8KLQlzaW5nbGVTZWxlY3QoKTsKLQlzZWxlY3RBbGxfaGVscGVyKCJFbXB0eSB0YWJsZSB0cmVlIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0KLQlpdGVtcyA9IG5ldyBUYWJsZVRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgU1dULk5PTkUpOwotCX0KLQlzZWxlY3RBbGxfaGVscGVyKCJzZWxlY3RBbGwoKSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCkgewotCS8qIEZVVFVSRTogU2hvdWxkIGFsc28gYWRkIHN1Yi1ub2RlcywgYW5kIHRlc3QgYm90aCBzaW5nbGUgYW5kIG11bHRpIHdpdGggdGhvc2UuCi0JICogaS5lLiBzdWJpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKGl0ZW1zW2ldLCBTV1QuTk9ORSk7ICovCi0KLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgbm8gaXRlbXMgaW4gZW1wdHkgdGFibGUgdHJlZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk1VTFRJOiBObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3RpbmcgbnVsbCBpbiBlbXB0eSB0YWJsZSB0cmVlIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JaW50IG51bWJlciA9IDg7Ci0JVGFibGVUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCAwKTsKLQl9Ci0JCi0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IG5vIGl0ZW1zIGluIHRhYmxlIHRyZWUgd2l0aCBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk1VTFRJOiBObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3RpbmcgbnVsbCBpbiB0YWJsZSB0cmVlIHdpdGggaXRlbXMiKTsKLQl9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IGl0ZW0gIiArIGksIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zW2ldfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbaV19KTsKLQl9Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IGl0ZW1zIiwgaXRlbXMsIGl0ZW1zKTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgdGFibGVUcmVlLmdldEl0ZW1zKCkiLCB0YWJsZVRyZWUuZ2V0SXRlbXMoKSwgdGFibGVUcmVlLmdldEl0ZW1zKCkpOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAyIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbMV19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbMV19KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMiBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s2XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s2XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzVdLCBpdGVtc1s3XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s1XSwgaXRlbXNbN119KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyB1bm9yZGVyZWQgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1syXSwgaXRlbXNbM119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgdW5vcmRlcmVkIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNV0sIGl0ZW1zWzJdLCBpdGVtc1s3XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s1XSwgaXRlbXNbN119KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyByZXZlcnNlLW9yZGVyIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XSwgaXRlbXNbM10sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHJldmVyc2Utb3JkZXIgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s3XSwgaXRlbXNbNV0sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzVdLCBpdGVtc1s3XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBzYW1lIGl0ZW0gdHdpY2UiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbNF0sIGl0ZW1zWzBdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMF0sIGl0ZW1zWzRdfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IHNhbWUgaXRlbSBtdWx0aXBsZSB0aW1lcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBtdWx0aXBsZSBpdGVtcyBtdWx0aXBsZSB0aW1lcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1swXSwgaXRlbXNbMl0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1syXSwgaXRlbXNbNF19KTsKLQotCQotCS8qIE5vdyBydW4gdGhlIHNhbWUgdGVzdHMgb24gYSBzaW5nbGUtc2VsZWN0IFRhYmxlVHJlZS4gKi8KLQlzaW5nbGVTZWxlY3QoKTsKLQkKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgbm8gaXRlbXMgaW4gZW1wdHkgdGFibGUgdHJlZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIlNJTkdMRTogTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW5nIG51bGwgaW4gZW1wdHkgdGFibGUgdHJlZSIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWl0ZW1zID0gbmV3IFRhYmxlVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCAwKTsKLQl9Ci0JCi0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IG5vIGl0ZW1zIGluIHRhYmxlIHRyZWUgd2l0aCBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIlNJTkdMRTogTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW5nIG51bGwgaW4gdGFibGUgdHJlZSB3aXRoIGl0ZW1zIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBpdGVtICIgKyBpLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1tpXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zW2ldfSk7Ci0JfQotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBpdGVtcyIsIGl0ZW1zLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgdGFibGVUcmVlLmdldEl0ZW1zKCkiLCB0YWJsZVRyZWUuZ2V0SXRlbXMoKSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDIgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1sxXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAyIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbM10sIGl0ZW1zWzZdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s1XSwgaXRlbXNbN119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyB1bm9yZGVyZWQgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1syXSwgaXRlbXNbM119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyB1bm9yZGVyZWQgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s1XSwgaXRlbXNbMl0sIGl0ZW1zWzddfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgcmV2ZXJzZS1vcmRlciBjb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzNdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHJldmVyc2Utb3JkZXIgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s3XSwgaXRlbXNbNV0sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IHNhbWUgaXRlbSB0d2ljZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgc2FtZSBpdGVtIG11bHRpcGxlIHRpbWVzIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBtdWx0aXBsZSBpdGVtcyBtdWx0aXBsZSB0aW1lcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1swXSwgaXRlbXNbMl0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd1NlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUYWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpKSB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUYWJsZSIpKSB0ZXN0X2dldFRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBbGwiKSkgdGVzdF9yZW1vdmVBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQiKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIikpIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByaXZhdGUgVGFibGVUcmVlIHRhYmxlVHJlZTsKLXByaXZhdGUgaW50IHN0eWxlOwotCi0vKgotICogU2V0cyBhIHNpbmdsZS1zZWxlY3QgVGFibGVUcmVlIGFzIHRoZSB0ZXN0IHdpZGdldC4KLSAqIE5vdGU6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhhdCB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdC4KLSAqLwotcHJpdmF0ZSB2b2lkIHNpbmdsZVNlbGVjdCgpIHsKLQl0YWJsZVRyZWUuZGlzcG9zZSgpOwotCXRhYmxlVHJlZSA9IG5ldyBUYWJsZVRyZWUoc2hlbGwsIHN0eWxlID0gU1dULlNJTkdMRSk7Ci0Jc2V0V2lkZ2V0KHRhYmxlVHJlZSk7Ci19Ci0KLS8qCi0gKiBVc2VkIGluIHRlc3Rfc2VsZWN0QWxsLgotICogTm90ZTogVGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0LgotICovCi1wcml2YXRlIHZvaWQgc2VsZWN0QWxsX2hlbHBlcihTdHJpbmcgbWVzc2FnZSwgVGFibGVUcmVlSXRlbVtdIGV4cGVjdGVkU2VsZWN0aW9uKSB7Ci0JdGFibGVUcmVlLnNlbGVjdEFsbCgpOwotCW1lc3NhZ2UgPSAoc3R5bGUgPT0gU1dULk1VTFRJID8gIk1VTFRJIiA6ICJTSU5HTEUiKSArICI6ICIgKyBtZXNzYWdlOwotCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFNlbGVjdGlvbi5sZW5ndGgsIHRhYmxlVHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQlhc3NlcnRTYW1lKG1lc3NhZ2UsIGV4cGVjdGVkU2VsZWN0aW9uLCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotfQotCi0vKgotICogVXNlZCBpbiB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLgotICogTm90ZTogVGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0LgotICovCi1wcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uX2hlbHBlcihTdHJpbmcgbWVzc2FnZSwgVGFibGVUcmVlSXRlbVtdIGl0ZW1zVG9TZWxlY3QsIFRhYmxlVHJlZUl0ZW1bXSBleHBlY3RlZFNlbGVjdGlvbikgewotCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oaXRlbXNUb1NlbGVjdCk7Ci0JbWVzc2FnZSA9IChzdHlsZSA9PSBTV1QuTVVMVEkgPyAiTVVMVEkiIDogIlNJTkdMRSIpICsgIjogIiArIG1lc3NhZ2U7Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkU2VsZWN0aW9uLmxlbmd0aCwgdGFibGVUcmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCWFzc2VydFNhbWUobWVzc2FnZSwgZXhwZWN0ZWRTZWxlY3Rpb24sIHRhYmxlVHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVGFibGVUcmVlKFZlY3RvciBldmVudHMsIGJvb2xlYW4gdHJhdmVyc2UpIHsKLSAgICBTdHJpbmcgdGVzdCA9IGdldFRlc3ROYW1lKCk7Ci0gICAgdGFibGVUcmVlID0gbmV3IFRhYmxlVHJlZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZVRyZWUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sICIgKyBjb2wpOwotCQljb2x1bW4uc2V0V2lkdGgoNzApOwotCQlob29rRXhwZWN0ZWRFdmVudHMoY29sdW1uLCB0ZXN0LCBldmVudHMpOwotCX0KLQlmb3IgKGludCBub2RlID0gMDsgbm9kZSA8IDQ7IG5vZGUrKykgewotCQlUYWJsZVRyZWVJdGVtIGl0ZW0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgY29sID0gMDsgY29sIDwgMzsgY29sKyspIHsKLQkJCWl0ZW0uc2V0VGV4dChjb2wsICJUVEl0ZW0iICsgbm9kZSArIGNvbCk7Ci0JCX0KLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIHRlc3QsIGV2ZW50cyk7Ci0JCVRhYmxlVHJlZUl0ZW0gc3ViaXRlbSA9IG5ldyBUYWJsZVRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgY29sID0gMDsgY29sIDwgMzsgY29sKyspIHsKLQkJCXN1Yml0ZW0uc2V0VGV4dChjb2wsICJUVFN1YiIgKyBub2RlICsgY29sKTsKLQkJfQotCQlob29rRXhwZWN0ZWRFdmVudHMoc3ViaXRlbSwgdGVzdCwgZXZlbnRzKTsKLQl9Ci0JU3RyaW5nW10gdHlwZXMgPSAoU3RyaW5nW10pQ29uc2lzdGVuY3lVdGlsaXR5LmV2ZW50T3JkZXJpbmcuZ2V0KCJUYWJsZVRyZWVUYWJsZSIpOwotCWlmKCF0cmF2ZXJzZSkgewotCSAgICBTdHJpbmdbXSB0ZW1wID0gbmV3IFN0cmluZ1t0eXBlcy5sZW5ndGggLTFdOwotCSAgICBTeXN0ZW0uYXJyYXljb3B5KHR5cGVzLCAwLCB0ZW1wLCAwLCB0eXBlcy5sZW5ndGgtMSk7Ci0JICAgIHR5cGVzID0gdGVtcDsKLQl9Ci0JaG9va0V4cGVjdGVkRXZlbnRzKHRhYmxlVHJlZS5nZXRUYWJsZSgpLCB0eXBlcywgZXZlbnRzKTsKLQlzZXRXaWRnZXQodGFibGVUcmVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BUlJPV19ET1dOLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMzAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTEsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgdGFibGVUcmVlLnNldFNlbGVjdGlvbihuZXcgVGFibGVUcmVlSXRlbVtdIHsgdGFibGVUcmVlLmdldEl0ZW1zKClbMF19KTsKLSAgICBpbnQgY29kZT1TV1QuQVJST1dfUklHSFQ7Ci0gICAgaWYoU3d0SnVuaXQuaXNHVEspCi0gICAgICAgIGNvZGUgPSBTV1QuS0VZUEFEX0FERDsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIGNvZGUsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2sgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDIwLCB0YWJsZVRyZWUuZ2V0SXRlbUhlaWdodCgpKjIsIDEsIDAsIAotICAgICAgICAgICAgCSAgICAgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIGZhbHNlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEzLCAxMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCAyNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMjAsIDUwLCAzMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZDEwNzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVFZGl0b3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlRWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29sdW1uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbHVtbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbHVtbkkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb2x1bW5JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvci5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW4iKSkgdGVzdF9nZXRDb2x1bW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW0iKSkgdGVzdF9nZXRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb2x1bW5JIikpIHRlc3Rfc2V0Q29sdW1uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSIpKSB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIikpIHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlYzRkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi0JVGFibGVUcmVlIHRhYmxlVHJlZTsKLQlUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW07Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRhYmxlVHJlZSA9IG5ldyBUYWJsZVRyZWUoc2hlbGwsIDApOwotCXRhYmxlVHJlZUl0ZW0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIDApOwotCXNldFdpZGdldCh0YWJsZVRyZWVJdGVtKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QmFja2dyb3VuZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kc0koKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJvdW5kc0kgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGVja2VkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGVja2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RXhwYW5kZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEV4cGFuZGVkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9yZWdyb3VuZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEdyYXllZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0R3JheWVkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbWFnZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Db3VudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50SXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRleHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGV4dEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDaGVja2VkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q2hlY2tlZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFeHBhbmRlZFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEV4cGFuZGVkWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEdyYXllZFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEdyYXllZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hlY2tlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RXhwYW5kZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEdyYXllZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDaGVja2VkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RXhwYW5kZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0R3JheWVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHNJIikpIHRlc3RfZ2V0Qm91bmRzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hlY2tlZCIpKSB0ZXN0X2dldENoZWNrZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEV4cGFuZGVkIikpIHRlc3RfZ2V0RXhwYW5kZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRHcmF5ZWQiKSkgdGVzdF9nZXRHcmF5ZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlIikpIHRlc3RfZ2V0SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlSSIpKSB0ZXN0X2dldEltYWdlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudEl0ZW0iKSkgdGVzdF9nZXRQYXJlbnRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dEkiKSkgdGVzdF9nZXRUZXh0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2hlY2tlZFoiKSkgdGVzdF9zZXRDaGVja2VkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RXhwYW5kZWRaIikpIHRlc3Rfc2V0RXhwYW5kZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRHcmF5ZWRaIikpIHRlc3Rfc2V0R3JheWVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0OWU5Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5nZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlpbnQgdmVyaWZ5ID0gLTE7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dENoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBzdHlsZWRUZXh0LmdldENvbnRlbnQoKTsKLQlUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGV4dENoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKHZlcmlmeSkgewotCQkJCWNhc2UgMSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJcbnRlc3RpbmciKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiYSIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMyA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJcblxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA0OiB7Ci0JCQkJCWFzc2VydFRydWUoIjo0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJcckxpbmUgMVxyXG5MaW5lIDIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDYgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDMiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDcgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiVGhpc1xuXHIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDggOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiXG5MMVxyXG5MMiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJMMXRlc3QiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEwOnsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTE6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjExOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTI6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiTDFcclxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTM6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJMMVxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE0OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE1OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIkwxdGVzdFxuXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE2OnsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE2OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTc6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE3OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTg6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiTDFcclxudGVzdFxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE5OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIkwxdGVzdFxyXHJcclxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyMDogewotCQkJCQlhc3NlcnRUcnVlKCI6MjA6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dENoYW5naW5nKFRleHRDaGFuZ2luZ0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dFNldChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCWNvbnRlbnQuYWRkVGV4dENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkKLQlib29sZWFuIGV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCXZlcmlmeSA9IDE7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlxuXG4iKTsKLQl2ZXJpZnkgPSAyOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAyLCAiYSIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoImEiKTsKLQl2ZXJpZnkgPSAzOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiXG5cbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDQ7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6NDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTGluZSAxXHJcbkxpbmUgMiIpOwotCXZlcmlmeSA9IDU7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKTsKLQl2ZXJpZnkgPSA2OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyMSwgNywgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JdmVyaWZ5ID0gNzsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNSwgOSwgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlxuTDFcclxuTDJcclxuIik7Ci0JdmVyaWZ5ID0gODsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNywgMiwgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDk7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0Iik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTA7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgIiIpO30gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl2ZXJpZnkgPSAxMTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAiIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxMTogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcciIpOwotCXZlcmlmeSA9IDEyOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxuIik7Ci0JdmVyaWZ5ID0gMTM7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDE0OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJ0ZXN0Iik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTU7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0XG5cbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDE2OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XHJcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTY6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDE3OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICJ0ZXN0XG5cbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTc6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLSAJc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyIik7Ci0JdmVyaWZ5ID0gMTg7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbnRlc3RcclxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcbiIpOwotCXZlcmlmeSA9IDE5OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAidGVzdFxyXHJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDIwOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjIwOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQljb250ZW50LnJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dENoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IHN0eWxlZFRleHQuZ2V0Q29udGVudCgpOwotCVRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2luZyhUZXh0Q2hhbmdpbmdFdmVudCBldmVudCkgewotCQkJc3dpdGNoKHZlcmlmeSkgewotCQkJCWNhc2UgMSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjFhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoxYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDIpOwotCQkJCQlhc3NlcnRUcnVlKCI6MmI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAzIDogewotCQkJCQlhc3NlcnRUcnVlKCI6M2E6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjNiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNDogewotCQkJCQlhc3NlcnRUcnVlKCI6NDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDUgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo1YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6NWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA2IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NmE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjZiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNyA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjdhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjo3YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDggOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo4YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6OGI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA5IDogewotCQkJCQlhc3NlcnRUcnVlKCI6OWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjliOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTA6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTA6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTE6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMjogewotCQkJCQlhc3NlcnRUcnVlKCI6MTJhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoxMmI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTNhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoxM2I6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNDogewotCQkJCQlhc3NlcnRUcnVlKCI6MTQ6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTVhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjoxNWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNjp7Ci0JCQkJCWFzc2VydFRydWUoIjoxNjoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE3OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNzoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE4OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOGE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE5OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE5YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIwOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyMDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dFNldChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCWNvbnRlbnQuYWRkVGV4dENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCWJvb2xlYW4gZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwkKLQl2ZXJpZnkgPSAxOwotCXN0eWxlZFRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDI7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJcblxuIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDIsICJhIik7Ci0KLQl2ZXJpZnkgPSAzOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiYSIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiXG5cbiIpOwotCi0JdmVyaWZ5ID0gNDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjQ6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gNTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkxpbmUgMVxyXG5MaW5lIDIiKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSA2OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyMSwgNywgIiIpOwotCi0JdmVyaWZ5ID0gNzsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDUsIDksICIiKTsKLQotCXZlcmlmeSA9IDg7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJcbkwxXHJcbkwyXHJcbiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0KLQl2ZXJpZnkgPSA5OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0Iik7Ci0KLQl2ZXJpZnkgPSAxMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICIiKTt9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxMDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAxMTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICIiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjExOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDEyOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcciIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDEzOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcbiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAiXHIiKTsKLQotCXZlcmlmeSA9IDE0OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgInRlc3QiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDE1OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0XG5cbiIpOwotCi0JdmVyaWZ5ID0gMTY7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxyXG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE2OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDE3OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgInRlc3RcblxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNzogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAxODsKLSAJc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbnRlc3RcclxuIik7Ci0KLQl2ZXJpZnkgPSAxOTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXG4iKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgInRlc3RcclxyXHIiKTsKLQl2ZXJpZnkgPSAyMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjIwOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQljb250ZW50LnJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dFNldExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IHN0eWxlZFRleHQuZ2V0Q29udGVudCgpOwotCVRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2luZyhUZXh0Q2hhbmdpbmdFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2VkKFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCB0ZXh0U2V0KFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAodmVyaWZ5KSB7Ci0JCQkJY2FzZSAxIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoInRlc3RpbmciKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiXG5cbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMyA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJhIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA0IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQljb250ZW50LmFkZFRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCi0JdmVyaWZ5ID0gMTsKLQlzdHlsZWRUZXh0LnNldFRleHQoInRlc3RpbmciKTsKLQotCXZlcmlmeSA9IDI7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJcblxuIik7Ci0KLQl2ZXJpZnkgPSAzOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiYSIpOwotCQotCXZlcmlmeSA9IDQ7Ci0JdHJ5IHtzdHlsZWRUZXh0LnNldFRleHQobnVsbCk7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6NDoiLCB0cnVlKTt9CQotCWNvbnRlbnQucmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRDaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dENoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRTZXRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRDaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCIpKSB0ZXN0X3RleHRDaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dENoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQiKSkgdGVzdF90ZXh0Q2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dFNldExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQiKSkgdGVzdF90ZXh0U2V0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDg2NjkyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2VkRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5nZWRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCgpIHsKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0ZWQgYnkgb3RoZXIgdGVzdCBjbGFzc2VzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDU2OTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2luZ0V2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2luZ0V2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoKSB7Ci0JLy8gdGhpcyBtZXRob2QgdGVzdGVkIGJ5IG90aGVyIHRlc3QgY2xhc3NlcwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UcmVlRWRpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UcmVlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4Y2E3YzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVHJlZUVkaXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UcmVlRWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UcmVlRWRpdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UcmVlRWRpdG9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtIikpIHRlc3RfZ2V0SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKSkgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpKSB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWQxNDBlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmVyaWZ5S2V5TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmVyaWZ5S2V5TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQlTaGVsbCBzaGVsbDsKLQlTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0JaW50IHZlcmlmeSA9IC0xOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2hlbGwub3BlbigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ZlcmlmeUtleUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50KCkgewotCVZlcmlmeUtleUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZlcmlmeUtleUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlLZXkoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWlmICh2ZXJpZnkgIT0gMSkge2V2ZW50LmRvaXQgPSBmYWxzZTt9Ci0JCX0KLQl9OwotCXN0eWxlZFRleHQuYWRkVmVyaWZ5S2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCXZlcmlmeSA9IDE7Ci0JRXZlbnQgZSA9IG5ldyBFdmVudCgpOwotCWUuY2hhcmFjdGVyID0gJ2EnOwotCXN0eWxlZFRleHQubm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlEb3duLCBlKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoImEiKSk7Ci0KLQl2ZXJpZnkgPSAyOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiIik7Ci0JZSA9IG5ldyBFdmVudCgpOwotCWUuY2hhcmFjdGVyID0gJ2EnOwotCXN0eWxlZFRleHQubm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlEb3duLCBlKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQlzdHlsZWRUZXh0LnJlbW92ZVZlcmlmeUtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3ZlcmlmeUtleUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3ZlcmlmeUtleUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50IikpIHRlc3RfdmVyaWZ5S2V5TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGI2ZjFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wQ2VudGVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb3BDZW50ZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BMZWZ0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb3BMZWZ0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wUmlnaHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvcFJpZ2h0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbGF5b3V0WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvcmRlclZpc2libGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCb3JkZXJWaXNpYmxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BDZW50ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9wQ2VudGVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BDZW50ZXJTZXBhcmF0ZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcENlbnRlclNlcGFyYXRlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcExlZnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9wTGVmdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wQ2VudGVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BMZWZ0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BSaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF5b3V0WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wQ2VudGVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcENlbnRlclNlcGFyYXRlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wTGVmdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250ZW50IikpIHRlc3RfZ2V0Q29udGVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wQ2VudGVyIikpIHRlc3RfZ2V0VG9wQ2VudGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BMZWZ0IikpIHRlc3RfZ2V0VG9wTGVmdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wUmlnaHQiKSkgdGVzdF9nZXRUb3BSaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGF5b3V0WiIpKSB0ZXN0X2xheW91dFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIikpIHRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQiKSkgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BDZW50ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldFRvcENlbnRlckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BDZW50ZXJTZXBhcmF0ZVoiKSkgdGVzdF9zZXRUb3BDZW50ZXJTZXBhcmF0ZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcExlZnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldFRvcExlZnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGQ1OWQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2ZlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN1cHBvcnRlZFR5cGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN1cHBvcnRlZFR5cGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMiKSkgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDU4M2FjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBdmFpbGFibGVUeXBlTmFtZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBdmFpbGFibGVUeXBlcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QXZhaWxhYmxlVHlwZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250ZW50c0xvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250ZW50c0xvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNEaXNwb3NlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRlbnRzJExqYXZhX2xhbmdfT2JqZWN0JExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb250ZW50cyRMamF2YV9sYW5nX09iamVjdCRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QXZhaWxhYmxlVHlwZU5hbWVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBdmFpbGFibGVUeXBlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udGVudHNMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udGVudHMkTGphdmFfbGFuZ19PYmplY3QkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBdmFpbGFibGVUeXBlTmFtZXMiKSkgdGVzdF9nZXRBdmFpbGFibGVUeXBlTmFtZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEF2YWlsYWJsZVR5cGVzIikpIHRlc3RfZ2V0QXZhaWxhYmxlVHlwZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRlbnRzTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKSkgdGVzdF9nZXRDb250ZW50c0xvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udGVudHMkTGphdmFfbGFuZ19PYmplY3QkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKSkgdGVzdF9zZXRDb250ZW50cyRMamF2YV9sYW5nX09iamVjdCRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRE5ELmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU4YTI5MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRE5EKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcnJvckkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Vycm9ySSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Vycm9ySUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Vycm9ySUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcnJvcklJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Vycm9ySSIpKSB0ZXN0X2Vycm9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXJyb3JJSSIpKSB0ZXN0X2Vycm9ySUkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0NWE5My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2UKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZERyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUcmFuc2ZlciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZURyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGREcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRyYW5zZmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVEcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIikpIHRlc3RfYWRkRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250cm9sIikpIHRlc3RfZ2V0Q29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VHJhbnNmZXIiKSkgdGVzdF9nZXRUcmFuc2ZlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpKSB0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3YzZhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpKSB0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKSkgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IikpIHRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGE0YWE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOWY0MzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpKSB0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKSkgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IikpIHRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTM4NmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGREcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZERyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc2ZlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VHJhbnNmZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVEcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZERyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VHJhbnNmZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZURyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGREcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIiKSkgdGVzdF9hZGREcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUcmFuc2ZlciIpKSB0ZXN0X2dldFRyYW5zZmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpKSB0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyZDM0Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZTYyYWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxZTk0MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRmlsZVRyYW5zZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwYjA5OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0ZpbGVUcmFuc2ZlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEluc3RhbmNlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRmlsZVRyYW5zZmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEluc3RhbmNlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2Zlci5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEluc3RhbmNlIikpIHRlc3RfZ2V0SW5zdGFuY2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMTAxOGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLlJURlRyYW5zZmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLlJURlRyYW5zZmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW5zdGFuY2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5zdGFuY2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbnN0YW5jZSIpKSB0ZXN0X2dldEluc3RhbmNlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RleHRUcmFuc2Zlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjFmNzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UZXh0VHJhbnNmZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbnN0YW5jZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UZXh0VHJhbnNmZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5zdGFuY2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5zdGFuY2UiKSkgdGVzdF9nZXRJbnN0YW5jZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2Zlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlMzhhMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN1cHBvcnRlZFR5cGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVnaXN0ZXJUeXBlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlZ2lzdGVyVHlwZUxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN1cHBvcnRlZFR5cGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZ2lzdGVyVHlwZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN1cHBvcnRlZFR5cGVzIikpIHRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVnaXN0ZXJUeXBlTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9yZWdpc3RlclR5cGVMamF2YV9sYW5nX1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1YjY1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyNTUyYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQXJtRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQXJtRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBBcm1FdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxNjVlYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkFybUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkFybUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldEFybWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldEFybWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aWRnZXRBcm1lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldEFybWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQiKSkgdGVzdF93aWRnZXRBcm1lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1MDVkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IikpIHRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpKSB0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjJiZWM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IENvbnRyb2xFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjgxYzAyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpKSB0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKSkgdGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0NzczOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBEaXNwb3NlRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3Y2ZlOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2lkZ2V0RGlzcG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldERpc3Bvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpZGdldERpc3Bvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldERpc3Bvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50IikpIHRlc3Rfd2lkZ2V0RGlzcG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NGVjZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0FkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0FkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpKSB0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpKSB0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3ZDZkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBGb2N1c0V2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkZjZkYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKSkgdGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKSkgdGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDA3ZGFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IEhlbHBFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWI4Y2ZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oZWxwUmVxdWVzdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9oZWxwUmVxdWVzdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hlbHBSZXF1ZXN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGVscFJlcXVlc3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudCIpKSB0ZXN0X2hlbHBSZXF1ZXN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmNmE4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5QWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5QWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IikpIHRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IikpIHRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMmJjNTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgS2V5RXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTEzODMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IikpIHRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IikpIHRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGIyNDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKSkgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKSkgdGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTFiYWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgTWVudUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjI2MWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpKSB0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpKSB0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZWRiMjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgTW9kaWZ5RXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDE4OTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vZGlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vZGlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQiKSkgdGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZGUzOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzYxNmI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IE1vdXNlRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjlmYTU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYzA3MTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZU1vdmVMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZU1vdmVMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VNb3ZlTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZU1vdmVMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VNb3ZlTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0FkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZmRlMTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0FkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0FkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiN2NjMTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZUV4aXRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzcxZjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgUGFpbnRFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzdiYTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFpbnRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcGFpbnRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFpbnRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYWludENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50IikpIHRlc3RfcGFpbnRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjMxMzdkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25BZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKSkgdGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpKSB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDQwNTU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFNlbGVjdGlvbkV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGU4NDA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpKSB0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IikpIHRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcwZDZiMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWZjOTg0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFNoZWxsRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjZjODE2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3NmQ4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFRyYXZlcnNlRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTEwNzhkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2tleVRyYXZlcnNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2tleVRyYXZlcnNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2tleVRyYXZlcnNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfa2V5VHJhdmVyc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCIpKSB0ZXN0X2tleVRyYXZlcnNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTk0MmY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IikpIHRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IikpIHRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzdkYjk4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgVHJlZUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3N2YxYmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpKSB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpKSB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzk1YTIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHlwZWRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UeXBlZEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0JRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQlldmVudC53aWRnZXQgPSBzaGVsbDsKLQlUeXBlZEV2ZW50IHR5cGVkRXZlbnQgPSBuZXdUeXBlZEV2ZW50KGV2ZW50KTsKLQlhc3NlcnROb3ROdWxsKHR5cGVkRXZlbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JZXZlbnQud2lkZ2V0ID0gc2hlbGw7Ci0JVHlwZWRFdmVudCB0eXBlZEV2ZW50ID0gbmV3VHlwZWRFdmVudChldmVudCk7Ci0JYXNzZXJ0Tm90TnVsbCh0eXBlZEV2ZW50LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUodHlwZWRFdmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLQotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgVHlwZWRFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyZGRkOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFZlcmlmeUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDgxMGY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdmVyaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF92ZXJpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF92ZXJpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdmVyaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50IikpIHRlc3RfdmVyaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTY1NTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSUkoKSB7Ci0JLy8gVGVzdCBuZXcgQ29sb3IoRGV2aWNlIGRldmljZSwgaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSkKLQkvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHJlZCwgZ3JlZW4gb3IgYmx1ZSBhcmd1bWVudCBpcyBub3QgYmV0d2VlbiAwIGFuZCAyNTUKLQotCS8vIHZhbGlkIGNvbG9yIChibGFjaykKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAwKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gdmFsaWQgY29sb3IgKHdoaXRlKQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyNTUpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyB2YWxpZCBjb2xvciAocmFuZG9tIGdyZXkpCi0JY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjAsIDIwLCAyMCk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgY29sb3IgKHJhbmRvbSkKLQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxMDIsIDI1NSwgMCk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIGRldmljZSA9PSBudWxsICh2YWxpZCkKLQljb2xvciA9IG5ldyBDb2xvcihudWxsLCAwLCAwLCAwKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgcmdiIDwgMAotCXRyeSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIC0xMCwgLTEwLCAtMTApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIHJnYiA+IDI1NQotCXRyeSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEwMDAsIDIwMDAsIDMwMDApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiA+IDI1NSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGJsdWUgPiAyNTUKLQl0cnkgewotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxMCwgMTAsIDI1Nik7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYmx1ZSA+IDI1NSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpIHsKLQkvLyBUZXN0IG5ldyBDb2xvcihEZXZpY2UgZGV2aWNlLCBSR0IgcmdiKQotCS8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcmVkLCBncmVlbiBvciBibHVlIGFyZ3VtZW50IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIDI1NTsgb3IgcmdiIGlzIG51bGwKLQkKLQkvLyB2YWxpZCBjb2xvciAoYmxhY2spCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigwLCAwLCAwKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIHZhbGlkIGNvbG9yICh3aGl0ZSkKLQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gdmFsaWQgY29sb3IgKHJhbmRvbSBncmV5KQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMTAsIDEwLCAxMCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyB2YWxpZCBjb2xvciAocmFuZG9tKQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMTAyLCAyNTUsIDApKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gZGV2aWNlID09IG51bGwgKHZhbGlkKQotCWNvbG9yID0gbmV3IENvbG9yKG51bGwsIG5ldyBSR0IoMCwgMCwgMCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCByZ2IgPCAwCi0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigtMTAsIC0xMCwgLTEwKSk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmdiIDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gaWxsZWdhbCBhcmd1bWVudCwgcmdiID4gMjU1Ci0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxMDAwLCAyMDAwLCAzMDAwKSk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmdiID4gMjU1Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBibHVlID4gMjU1Ci0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxMCwgMTAsIDI1NikpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJsdWUgPiAyNTUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgcmdiID09IG51bGwKLQl0cnkgewotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBudWxsKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZ2IgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9pc0Rpc3Bvc2VkCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMSwgMiwgMyk7Ci0JQ29sb3Igc2FtZUNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEsIDIsIDMpOwotCUNvbG9yIHNhbWVDb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxLCAyLCAzKSk7Ci0JQ29sb3Igb3RoZXJDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCA1LCA2LCA3KTsKLQl0cnkgewotCQkvLyBUZXN0IENvbG9yLmVxdWFscyhPYmplY3QpCi0JCWFzc2VydFRydWUoIiFjb2xvci5lcXVhbHMoKE9iamVjdCludWxsKSIsICFjb2xvci5lcXVhbHMoKE9iamVjdCludWxsKSk7Ci0KLQkJLy8gVGVzdCBDb2xvci5lcXVhbHMoQ29sb3IpCi0JCWFzc2VydFRydWUoIiFjb2xvci5lcXVhbHMoKENvbG9yKW51bGwpIiwgIWNvbG9yLmVxdWFscygoQ29sb3IpbnVsbCkpOwotCQlhc3NlcnRUcnVlKCJjb2xvci5lcXVhbHMoY29sb3IpIiwgY29sb3IuZXF1YWxzKGNvbG9yKSk7Ci0JCWFzc2VydFRydWUoImNvbG9yLmVxdWFscyhzYW1lQ29sb3IpIiwgY29sb3IuZXF1YWxzKHNhbWVDb2xvcikpOwotCQlhc3NlcnRUcnVlKCJjb2xvci5lcXVhbHMoc2FtZUNvbG9yMikiLCBjb2xvci5lcXVhbHMoc2FtZUNvbG9yMikpOwotCQlhc3NlcnRUcnVlKCIhY29sb3IuZXF1YWxzKG90aGVyQ29sb3IpIiwgIWNvbG9yLmVxdWFscyhvdGhlckNvbG9yKSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlzYW1lQ29sb3IuZGlzcG9zZSgpOwotCQlzYW1lQ29sb3IyLmRpc3Bvc2UoKTsKLQkJb3RoZXJDb2xvci5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJsdWUoKSB7Ci0JLy8gVGVzdCBDb2xvci5nZXRCbHVlKCkKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAyNTUpOwotCXRyeSB7Ci0JCWFzc2VydEVxdWFscygiY29sb3IuZ2V0Qmx1ZSgpIiwgY29sb3IuZ2V0Qmx1ZSgpLCAyNTUpOwotCX0gZmluYWxseSB7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JlZW4oKSB7Ci0JLy8gVGVzdCBDb2xvci5nZXRHcmVlbigpCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMjU1LCAwKTsKLQl0cnkgewotCQlhc3NlcnRFcXVhbHMoImNvbG9yLmdldEdyZWVuKCkiLCBjb2xvci5nZXRHcmVlbigpLCAyNTUpOwotCX0gZmluYWxseSB7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyNTUpOwotCWFzc2VydE5vdE51bGwoY29sb3IuZ2V0UkdCKCkpOwotCWFzc2VydEVxdWFscyhuZXcgUkdCKDI1NSwgMjU1LCAyNTUpLCBjb2xvci5nZXRSR0IoKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJlZCgpIHsKLQkvLyBUZXN0IENvbG9yLmdldFJlZCgpCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQl0cnkgewotCQlhc3NlcnRFcXVhbHMoImNvbG9yLmdldFJlZCgpIiwgY29sb3IuZ2V0UmVkKCksIDI1NSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29sb3IuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxMiwgMzQsIDU2KTsKLQlDb2xvciBvdGhlckNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEyLCAzNCwgNTYpOwotCWlmIChjb2xvci5lcXVhbHMob3RoZXJDb2xvcikpIHsKLQkJYXNzZXJ0RXF1YWxzKCJIYXNoIGNvZGVzIG9mIGVxdWFsIG9iamVjdHMgc2hvdWxkIGJlIGVxdWFsIiwgY29sb3IuaGFzaENvZGUoKSwgb3RoZXJDb2xvci5oYXNoQ29kZSgpKTsKLQl9Ci0JY29sb3IuZGlzcG9zZSgpOwotCW90aGVyQ29sb3IuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JLy8gVGVzdCBDb2xvci5pc0Rpc3Bvc2VkKCkgZmFsc2UKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAzNCwgNjcsIDk4KTsKLQl0cnkgewotCQlhc3NlcnRUcnVlKCJDb2xvciBzaG91bGQgbm90IGJlIGRpc3Bvc2VkIiwgIWNvbG9yLmlzRGlzcG9zZWQoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gVGVzdCBDb2xvci5pc0Rpc3Bvc2VkKCkgdHJ1ZQotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWFzc2VydFRydWUoIkNvbG9yIHNob3VsZCBiZSBkaXNwb3NlZCIsIGNvbG9yLmlzRGlzcG9zZWQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDI1NSk7Ci0JdHJ5IHsKLQkJYXNzZXJ0Tm90TnVsbChjb2xvci50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZShjb2xvci50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci0JCWFzc2VydEVxdWFscygiQ29sb3IgezAsIDAsIDI1NX0iLCBjb2xvci50b1N0cmluZygpKTsKLQl9IGZpbmFsbHkgewotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3MgcGxhdGZvcm0gb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCbHVlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmVlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCbHVlIikpIHRlc3RfZ2V0Qmx1ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0R3JlZW4iKSkgdGVzdF9nZXRHcmVlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UkdCIikpIHRlc3RfZ2V0UkdCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSZWQiKSkgdGVzdF9nZXRSZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKTsKLX0KLQotLyogY3VzdG9tICovCi1EaXNwbGF5IGRpc3BsYXk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3OGJiNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpIHsKLQkvLyBUZXN0IG5ldyBDdXJzb3IoRGV2aWNlIGRldmljZSwgaW50IHN0eWxlKQotCS8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIGFuIHVua25vd24gc3R5bGUgaXMgc3BlY2lmaWVkCi0KLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0FSUk9XKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQ1JPU1MpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQVBQU1RBUlRJTkcpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfSEVMUCk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFQUxMKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVORVNXKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVOUyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFTldTRSk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFV0UpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU4pOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRVMpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRUUpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRVcpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU5FKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVTRSk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFU1cpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU5XKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1VQQVJST1cpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfSUJFQU0pOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfTk8pOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfSEFORCk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCS8vIGRldmljZSA9PSBudWxsICh2YWxpZCkKLQljdXJzb3IgPSBuZXcgQ3Vyc29yKG51bGwsIFNXVC5DVVJTT1JfQVJST1cpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBzdHlsZSA+IFNXVC5DVVJTT1JfSEFORCAoMjEpCi0JdHJ5IHsKLQkJY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCAxMDApOwotCQljdXJzb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHlsZSA+IFNXVC5DVVJTT1JfSEFORCAoMjEpIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBzdHlsZSA8IDAKLQl0cnkgewotCQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIC0xMDApOwotCQljdXJzb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHlsZSA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJKCkgewotCS8vIFRlc3QgbmV3IEN1cnNvcihEZXZpY2UgZGV2aWNlLCBJbWFnZURhdGEgc291cmNlLCBJbWFnZURhdGEgbWFzaywgaW50IGhvdHNwb3RYLCBpbnQgaG90c3BvdFkpCi0JaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdOwotCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQlJbWFnZURhdGEgc291cmNlID0gbG9hZGVyLmxvYWQoc3RyZWFtKVswXTsKLQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQlpZiAobWFzayAhPSBudWxsICYmIChzb3VyY2UuZGVwdGggPT0gMSkpIHsKLQkJCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZSwgbWFzaywgMCwgMCk7Ci0JCQljdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gY29udGludWU7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfaXNEaXNwb3NlZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCS8qIE5vdGU6IFR3byBjdXJzb3JzIGFyZSBvbmx5IGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhlaXIgaGFuZGxlcyBhcmUgZXF1YWwuCi0JICogU28gc2luY2UgV2luZG93cyByZXVzZXMgY3Vyc29yIGhhbmRsZXMsIGFuZCBvdGhlciBwbGF0Zm9ybXMgZG8gbm90LAotCSAqIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gdGVzdCB3aGV0aGVyIGN1cnNvci5lcXVhbHMoc2FtZUN1cnNvcikuCi0JICovCi0JQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQlDdXJzb3Igb3RoZXJDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQ1JPU1MpOwotCXRyeSB7Ci0JCS8vIFRlc3QgQ3Vyc29yLmVxdWFscyhPYmplY3QpCi0JCWFzc2VydFRydWUoIiFjdXJzb3IuZXF1YWxzKChPYmplY3QpbnVsbCkiLCAhY3Vyc29yLmVxdWFscygoT2JqZWN0KW51bGwpKTsKLQotCQkvLyBUZXN0IEN1cnNvci5lcXVhbHMoQ3Vyc29yKQotCQlhc3NlcnRUcnVlKCIhY3Vyc29yLmVxdWFscygoQ3Vyc29yKW51bGwpIiwgIWN1cnNvci5lcXVhbHMoKEN1cnNvciludWxsKSk7Ci0JCWFzc2VydFRydWUoImN1cnNvci5lcXVhbHMoY3Vyc29yKSIsIGN1cnNvci5lcXVhbHMoY3Vyc29yKSk7Ci0JCWFzc2VydFRydWUoIiFjdXJzb3IuZXF1YWxzKG90aGVyQ3Vyc29yKSIsICFjdXJzb3IuZXF1YWxzKG90aGVyQ3Vyc29yKSk7Ci0JfSBmaW5hbGx5IHsKLQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJb3RoZXJDdXJzb3IuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaGFzaENvZGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCS8vIFRlc3QgQ3Vyc29yLmlzRGlzcG9zZWQoKSBmYWxzZQotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZSgiQ3Vyc29yIHNob3VsZCBub3QgYmUgZGlzcG9zZWQiLCAhY3Vyc29yLmlzRGlzcG9zZWQoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gVGVzdCBDdXJzb3IuaXNEaXNwb3NlZCgpIHRydWUKLQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiQ3Vyc29yIHNob3VsZCBiZSBkaXNwb3NlZCIsIGN1cnNvci5pc0Rpc3Bvc2VkKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCXRyeSB7Ci0JCWFzc2VydE5vdE51bGwoY3Vyc29yLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKGN1cnNvci50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBvbmx5Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKTsKLX0KLQotLyogY3VzdG9tICovCi1EaXNwbGF5IGRpc3BsYXk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyZjZiYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDbGllbnRBcmVhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RFBJKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREUEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZXB0aCgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGVwdGggbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZXZpY2VEYXRhKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREZXZpY2VEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1ooKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvbnRMaXN0TGphdmFfbGFuZ19TdHJpbmdaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3lzdGVtQ29sb3JJKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTeXN0ZW1Db2xvckkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTeXN0ZW1Gb250KCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTeXN0ZW1Gb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2FybmluZ3MoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFdhcm5pbmdzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzRGlzcG9zZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXYXJuaW5nc1ooKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdhcm5pbmdzWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREUEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlcHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZXZpY2VEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250TGlzdExqYXZhX2xhbmdfU3RyaW5nWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3lzdGVtQ29sb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTeXN0ZW1Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXYXJuaW5ncyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFdhcm5pbmdzWiIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGllbnRBcmVhIikpIHRlc3RfZ2V0Q2xpZW50QXJlYSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RFBJIikpIHRlc3RfZ2V0RFBJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZXB0aCIpKSB0ZXN0X2dldERlcHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZXZpY2VEYXRhIikpIHRlc3RfZ2V0RGV2aWNlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1oiKSkgdGVzdF9nZXRGb250TGlzdExqYXZhX2xhbmdfU3RyaW5nWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3lzdGVtQ29sb3JJIikpIHRlc3RfZ2V0U3lzdGVtQ29sb3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTeXN0ZW1Gb250IikpIHRlc3RfZ2V0U3lzdGVtRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2FybmluZ3MiKSkgdGVzdF9nZXRXYXJuaW5ncygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXYXJuaW5nc1oiKSkgdGVzdF9zZXRXYXJuaW5nc1ooKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzYwMTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZURhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2VEYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JRGV2aWNlRGF0YSBkYXRhID0gbmV3IERldmljZURhdGEoKTsKLQlkYXRhLmRlYnVnID0gdHJ1ZTsKLQlkYXRhLnRyYWNraW5nID0gdHJ1ZTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ODI1ZWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRHJhd2FibGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EcmF3YWJsZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ3MDY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotRGlzcGxheSBkaXNwbGF5OwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpIHsKLQkKLQkvLyBudWxsICBkZXZpY2UgYXJndW1lbnQKLQkKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCUZvbnREYXRhW10gZGF0YSA9IG5ldyBGb250RGF0YVsxXTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQobnVsbCxkYXRhKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9IAotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyBudWxsIGRhdGEgYXJndW1lbnQKLQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlGb250RGF0YVtdIGRhdGEgPSBudWxsOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LGRhdGEpOwotCQlmb250LmRpc3Bvc2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0gCi0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JLy8gemVybyBsZW5ndGggZGF0YSBhcnJheQotCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCUZvbnREYXRhW10gZGF0YSA9IG5ldyBGb250RGF0YVswXTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSxkYXRhKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9IAotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyBudWxsIGRhdGEgZWxlbWVudAotCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCUZvbnREYXRhW10gZGF0YSA9IHsKLQkJCW51bGwsCi0JCQluZXcgRm9udERhdGEoKQotCQl9OwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LGRhdGEpOwotCQlmb250LmRpc3Bvc2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0gCi0JYXNzZXJ0VHJ1ZSgibnVsbCBkYXRhIGVsZW1lbnQgMCIsZXhjZXB0aW9uVGhyb3duKTsKLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCUZvbnREYXRhW10gZGF0YSA9IHsKLQkJCW5ldyBGb250RGF0YSgpLAotCQkJbnVsbAotCQl9OwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LGRhdGEpOwotCQlmb250LmRpc3Bvc2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0gCi0JYXNzZXJ0VHJ1ZSgibnVsbCBkYXRhIGVsZW1lbnQgMSIsZXhjZXB0aW9uVGhyb3duKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKSB7Ci0JLy8gVGVzdCBuZXcgRm9udChEZXZpY2UgZGV2aWNlLCBGb250RGF0YSBmZCkKLQkvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZkIGFyZ3VtZW50IGlzIG51bGwKLQkvLyBTV1RFcnJvcjogRVJST1JfTk9fSEFORExFUywgaWYgYSBmb250IGNvdWxkIG5vdCBiZSBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIGZvbnQgZGF0YQotCi0JLy8gdmFsaWQgZm9udCB3aXRoIG5vIG5hbWUgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YSgiIiwgMTAsIFNXVC5OT1JNQUwpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGZvbnQgd2l0aCB1bmtub3duIG5hbWUgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoImJhZC1mb250IiwgMTAsIFNXVC5OT1JNQUwpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGZvbnQgd2l0aCAwIGhlaWdodCAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDAsIFNXVC5OT1JNQUwpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIG5vcm1hbCAxMDAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMDAsIFNXVC5OT1JNQUwpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIG5vcm1hbCAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBib2xkIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBpdGFsaWMgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULklUQUxJQykpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgYm9sZCBpdGFsaWMgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBmb250RGF0YSA9PSBudWxsCi0JdHJ5IHsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIChGb250RGF0YSludWxsKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGZvbnREYXRhID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIG5hbWUgPT0gbnVsbAotCXRyeSB7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEobnVsbCwgMTAsIFNXVC5OT1JNQUwpKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG5hbWUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgaGVpZ2h0IDwgMAotCXRyeSB7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAtMTAsIFNXVC5OT1JNQUwpKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmdJSSgpIHsKLQkvLyBUZXN0IG5ldyBGb250KERldmljZSBkZXZpY2UsIFN0cmluZyBuYW1lLCBpbnQgaGVpZ2h0LCBpbnQgc3R5bGUpCi0JLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGFyZ3VtZW50IGlzIG51bGwgb3IgdGhlIGhlaWdodCBpcyBuZWdhdGl2ZQotCS8vIFNXVEVycm9yOiBFUlJPUl9OT19IQU5ETEVTLCBpZiBhIGZvbnQgY291bGQgbm90IGJlIGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnRzCi0KLQkvLyB2YWxpZCBmb250IHdpdGggbm8gbmFtZSAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgIiIsIDEwLCBTV1QuTk9STUFMKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGZvbnQgd2l0aCB1bmtub3duIG5hbWUgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiYmFkLWZvbnQiLCAxMCwgU1dULk5PUk1BTCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBmb250IHdpdGggMCBoZWlnaHQgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDAsIFNXVC5OT1JNQUwpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgbm9ybWFsIDEwMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAwLCBTV1QuTk9STUFMKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIG5vcm1hbCAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgYm9sZCAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGl0YWxpYyAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5JVEFMSUMpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgYm9sZCBpdGFsaWMgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gZGV2aWNlID09IG51bGwgKHZhbGlkKQotCWZvbnQgPSBuZXcgRm9udChudWxsLCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIG5hbWUgPT0gbnVsbAotCXRyeSB7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBudWxsLCAxMCwgU1dULk5PUk1BTCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGhlaWdodCA8IDAKLQl0cnkgewotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAtMTAsIFNXVC5OT1JNQUwpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JYXNzZXJ0RmFsc2UoZm9udC5pc0Rpc3Bvc2VkKCkpOwotCWZvbnQuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoZm9udC5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCS8vIEZvbnRzIGFyZSBvbmx5IGVxdWFsIGlmIHRoZWlyIGhhbmRsZXMgYXJlIHRoZSBzYW1lICg/ISkKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlGb250IG90aGVyRm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMjAsIFNXVC5OT1JNQUwpOwotCXRyeSB7Ci0JCS8vIFRlc3QgRm9udC5lcXVhbHMoT2JqZWN0KQotCQlhc3NlcnRUcnVlKCIhZm9udC5lcXVhbHMoKE9iamVjdCludWxsKSIsICFmb250LmVxdWFscygoT2JqZWN0KW51bGwpKTsKLQotCQkvLyBUZXN0IEZvbnQuZXF1YWxzKEZvbnQpCi0JCWFzc2VydFRydWUoIiFmb250LmVxdWFscygoRm9udCludWxsKSIsICFmb250LmVxdWFscygoRm9udCludWxsKSk7Ci0JCWFzc2VydFRydWUoImZvbnQuZXF1YWxzKGZvbnQpIiwgZm9udC5lcXVhbHMoZm9udCkpOwotCQlhc3NlcnRUcnVlKCIhZm9udC5lcXVhbHMob3RoZXJGb250KSIsICFmb250LmVxdWFscyhvdGhlckZvbnQpKTsKLQl9IGZpbmFsbHkgewotCQlmb250LmRpc3Bvc2UoKTsKLQkJb3RoZXJGb250LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udERhdGEoKSB7Ci0JLy8gVGVzdCBGb250LmdldEZvbnREYXRhKCkKLQkvLyB2YWxpZCBub3JtYWwgMTAtcG9pbnQgZm9udAotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCXRyeSB7Ci0JCUZvbnREYXRhIGZvbnREYXRhW10gPSBmb250LmdldEZvbnREYXRhKCk7Ci0JCWFzc2VydFRydWUoIk5vIGZvbnQgZGF0YSIsIGZvbnREYXRhICE9IG51bGwgJiYgZm9udERhdGEubGVuZ3RoID4gMCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBuYW1lIiwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCBmb250RGF0YVswXS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgaGVpZ2h0IiwgMTAsIGZvbnREYXRhWzBdLmdldEhlaWdodCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IHN0eWxlIiwgU1dULk5PUk1BTCwgZm9udERhdGFbMF0uZ2V0U3R5bGUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfQotCi0JLy8gdmFsaWQgYm9sZCAyMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMjAsIFNXVC5CT0xEKTsKLQl0cnkgewotCQlGb250RGF0YSBmb250RGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlhc3NlcnRUcnVlKCJObyBmb250IGRhdGEiLCBmb250RGF0YSAhPSBudWxsICYmIGZvbnREYXRhLmxlbmd0aCA+IDApOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgbmFtZSIsIFN3dEp1bml0LnRlc3RGb250TmFtZSwgZm9udERhdGFbMF0uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IGhlaWdodCIsIDIwLCBmb250RGF0YVswXS5nZXRIZWlnaHQoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBzdHlsZSIsIFNXVC5CT0xELCBmb250RGF0YVswXS5nZXRTdHlsZSgpKTsKLQl9IGZpbmFsbHkgewotCQlmb250LmRpc3Bvc2UoKTsKLQl9Ci0KLQkvLyB2YWxpZCBpdGFsaWMgMzAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDMwLCBTV1QuSVRBTElDKTsKLQl0cnkgewotCQlGb250RGF0YSBmb250RGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlhc3NlcnRUcnVlKCJObyBmb250IGRhdGEiLCBmb250RGF0YSAhPSBudWxsICYmIGZvbnREYXRhLmxlbmd0aCA+IDApOwotLy8JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBuYW1lIiwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCBmb250RGF0YVswXS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgaGVpZ2h0IiwgMzAsIGZvbnREYXRhWzBdLmdldEhlaWdodCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IHN0eWxlIiwgU1dULklUQUxJQywgZm9udERhdGFbMF0uZ2V0U3R5bGUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfQotCi0JLy8gdmFsaWQgYm9sZCBpdGFsaWMgNDAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDQwLCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCXRyeSB7Ci0JCUZvbnREYXRhIGZvbnREYXRhW10gPSBmb250LmdldEZvbnREYXRhKCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlhc3NlcnRUcnVlKCJObyBmb250IGRhdGEiLCBmb250RGF0YSAhPSBudWxsICYmIGZvbnREYXRhLmxlbmd0aCA+IDApOwotLy8JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBuYW1lIiwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCBmb250RGF0YVswXS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgaGVpZ2h0IiwgNDAsIGZvbnREYXRhWzBdLmdldEhlaWdodCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IHN0eWxlIiwgU1dULkJPTEQgfCBTV1QuSVRBTElDLCBmb250RGF0YVswXS5nZXRTdHlsZSgpKTsKLQl9IGZpbmFsbHkgewotCQlmb250LmRpc3Bvc2UoKTsKLQl9Ci0KLQkvLyB2YWxpZCAxMC1wb2ludCBmb250IHdpdGggdW5rbm93biBuYW1lCi0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJiYWQtZm9udCIsIDEwLCBTV1QuTk9STUFMKTsKLQl0cnkgewotCQlGb250RGF0YSBmb250RGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlhc3NlcnRUcnVlKCJObyBmb250IGRhdGEiLCBmb250RGF0YSAhPSBudWxsICYmIGZvbnREYXRhLmxlbmd0aCA+IDApOwotLy8JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBuYW1lIiwgImJhZC1mb250IiwgZm9udERhdGFbMF0uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IGhlaWdodCIsIDEwLCBmb250RGF0YVswXS5nZXRIZWlnaHQoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBzdHlsZSIsIFNXVC5OT1JNQUwsIGZvbnREYXRhWzBdLmdldFN0eWxlKCkpOwotCX0gZmluYWxseSB7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlhc3NlcnRFcXVhbHMoZm9udCxmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udC5oYXNoQ29kZSgpLGZvbnQuaGFzaENvZGUoKSk7Ci0JRm9udCBib2xkRm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEKTsKLQlhc3NlcnRGYWxzZShmb250Lmhhc2hDb2RlKCkgPT0gYm9sZEZvbnQuaGFzaENvZGUoKSk7Ci0JYm9sZEZvbnQuZGlzcG9zZSgpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JLy8gVGVzdCBGb250LmlzRGlzcG9zZWQoKSBmYWxzZQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCXRyeSB7Ci0JCWFzc2VydFRydWUoIkZvbnQgc2hvdWxkIG5vdCBiZSBkaXNwb3NlZCIsICFmb250LmlzRGlzcG9zZWQoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gVGVzdCBGb250LmlzRGlzcG9zZWQoKSB0cnVlCi0JCWZvbnQuZGlzcG9zZSgpOwotCQlhc3NlcnRUcnVlKCJGb250IHNob3VsZCBiZSBkaXNwb3NlZCIsIGZvbnQuaXNEaXNwb3NlZCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JYXNzZXJ0Tm90TnVsbChmb250LnRvU3RyaW5nKCkpOwotCQotCWZvbnQuZGlzcG9zZSgpOwotCWFzc2VydE5vdE51bGwoZm9udC50b1N0cmluZygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmdJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZ0lJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250RGF0YSIpKSB0ZXN0X2dldEZvbnREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmE2OWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCS8vIFRlc3QgbmV3IEZvbnREYXRhKCkKLQluZXcgRm9udERhdGEoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCS8vIFRlc3QgbmV3IEZvbnREYXRhKFN0cmluZyBzdHJpbmcpCi0JRm9udERhdGEgZmQgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JRm9udERhdGEgcmVjb25zdHJ1Y3RlZEZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZkLnRvU3RyaW5nKCkpOwotCWFzc2VydEVxdWFscyhmZCwgcmVjb25zdHJ1Y3RlZEZvbnREYXRhKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUkoKSB7Ci0JLy8gVGVzdCBuZXcgRm9udERhdGEoU3RyaW5nIG5hbWUsIGludCBoZWlnaHQsIGludCBzdHlsZSkKLQkvLyB2YWxpZCBmb250IGRhdGEgd2l0aCBubyBuYW1lIChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQluZXcgRm9udERhdGEoIiIsIDEwLCBTV1QuTk9STUFMKTsKLQotCS8vIHZhbGlkIGZvbnQgZGF0YSB3aXRoIHVua25vd24gbmFtZSAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JbmV3IEZvbnREYXRhKCJiYWQtZm9udCIsIDEwLCBTV1QuTk9STUFMKTsKLQotCS8vIHZhbGlkIGZvbnQgZGF0YSB3aXRoIDAgaGVpZ2h0IChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQluZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAwLCBTV1QuTk9STUFMKTsKLQotCS8vIHZhbGlkIGZvbnQgZGF0YSB3aXRoIDEwMDAgaGVpZ2h0IChwcmV0dHkgYmlnLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQkKLQotCS8vIHZhbGlkIG5vcm1hbCAxMC1wb2ludCBmb250IGRhdGEKLQluZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0KLQkvLyB2YWxpZCBib2xkIDEwLXBvaW50IGZvbnQgZGF0YQotCW5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCk7Ci0KLQkvLyB2YWxpZCBpdGFsaWMgMTAtcG9pbnQgZm9udCBkYXRhCi0JbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5JVEFMSUMpOwotCi0JLy8gdmFsaWQgYm9sZCBpdGFsaWMgMTAtcG9pbnQgZm9udCBkYXRhCi0JbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBuYW1lID09IG51bGwKLQl0cnkgewotCQluZXcgRm9udERhdGEobnVsbCwgMTAsIFNXVC5OT1JNQUwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGhlaWdodCA8IDAKLQl0cnkgewotCQluZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAtMTAsIFNXVC5OT1JNQUwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JRm9udERhdGEgZmQxID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCUZvbnREYXRhIGZkMiA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlhc3NlcnRFcXVhbHMoZmQxLGZkMSk7Ci0JYXNzZXJ0RXF1YWxzKGZkMSxmZDIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlaWdodCgpIHsKLQkvLyBGb250LmdldEhlaWdodCgpIHRlc3RlZCBpbiB0ZXN0X3NldEhlaWdodEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhbGUoKSB7Ci0JLy8gRm9udERhdGEuZ2V0TG9jYWxlKCkgdGVzdGVkIGluIHRlc3Rfc2V0TG9jYWxlTGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewotCS8vIEZvbnQuZ2V0TmFtZSgpIHRlc3RlZCBpbiB0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlKCkgewotCS8vIEZvbnQuZ2V0U3R5bGUoKSB0ZXN0ZWQgaW4gdGVzdF9zZXRTdHlsZUkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlGb250RGF0YSBmZDEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JRm9udERhdGEgZmQyID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWFzc2VydEVxdWFscyhmZDEsZmQyKTsKLQlhc3NlcnRFcXVhbHMoZmQxLmhhc2hDb2RlKCksZmQyLmhhc2hDb2RlKCkpOwotCUZvbnREYXRhIGZkMyA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCk7Ci0JYXNzZXJ0RmFsc2UoZmQxLmhhc2hDb2RlKCkgPT0gZmQzLmhhc2hDb2RlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhlaWdodEkoKSB7Ci0JLy8gVGVzdCBGb250LnNldEhlaWdodChpbnQgIGhlaWdodCkKLQkvLyB2YWxpZCBub3JtYWwgZm9udCBkYXRhIGZvciB2YXJpb3VzIGhlaWdodHMKLQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsJCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJZm9udERhdGEuc2V0SGVpZ2h0KGhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgaGVpZ2h0IiwgZm9udERhdGEuZ2V0SGVpZ2h0KCksIGhlaWdodCk7Ci0JfQotCi0JLy8gdmFsaWQgYm9sZCBmb250IGRhdGEgZm9yIHZhcmlvdXMgaGVpZ2h0cwotCWZvbnREYXRhID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEKTsJCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJZm9udERhdGEuc2V0SGVpZ2h0KGhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgaGVpZ2h0IiwgZm9udERhdGEuZ2V0SGVpZ2h0KCksIGhlaWdodCk7Ci0JfQotCi0JLy8gdmFsaWQgaXRhbGljIGZvbnQgZGF0YSBmb3IgdmFyaW91cyBoZWlnaHRzCi0JZm9udERhdGEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULklUQUxJQyk7CQotCWZvciAoaW50IGhlaWdodCA9IDA7IGhlaWdodCA8IDEwMDA7IGhlaWdodCsrKSB7Ci0JCWZvbnREYXRhLnNldEhlaWdodChoZWlnaHQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGhlaWdodCIsIGZvbnREYXRhLmdldEhlaWdodCgpLCBoZWlnaHQpOwotCX0KLQotCS8vIHZhbGlkIGJvbGQgaXRhbGljIGZvbnQgZGF0YSBmb3IgdmFyaW91cyBoZWlnaHRzCi0JZm9udERhdGEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsJCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJZm9udERhdGEuc2V0SGVpZ2h0KGhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgaGVpZ2h0IiwgZm9udERhdGEuZ2V0SGVpZ2h0KCksIGhlaWdodCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2FsZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCUZvbnREYXRhIGZkID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuRU5HTElTSDsKLQlmZC5zZXRMb2NhbGUobG9jYWxlLnRvU3RyaW5nKCkpOwotCWFzc2VydEVxdWFscyhMb2NhbGUuRU5HTElTSC50b1N0cmluZygpLGZkLmdldExvY2FsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXROYW1lTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JLy8gVGVzdCBGb250LnNldE5hbWUoU3RyaW5nIG5hbWUpCi0JLy8gdmFsaWQgbmFtZQotCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsIGZvbnREYXRhLmdldE5hbWUoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lKTsKLQotCS8vIHZhbGlkIG5hbWUgKHVua25vd24gbmFtZSwgYnV0IHZhbGlkKQotCWZvbnREYXRhLnNldE5hbWUoImJhZC1mb250Iik7Ci0JYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgZm9udERhdGEuZ2V0TmFtZSgpLCAiYmFkLWZvbnQiKTsKLQotCS8vIHZhbGlkIG5hbWUgKGVtcHR5IHN0cmluZywgYnV0IHZhbGlkKQotCS8vIG9ubHkgb24gd2luZG93cyBzaW5jZSBtb3RpZiBzdXBwb3J0cyBzZXBhcmF0ZSBmb250IGZvdW5kcmllcwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJZm9udERhdGEuc2V0TmFtZSgiIik7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsIGZvbnREYXRhLmdldE5hbWUoKSwgIiIpOwotCX0KLQotCS8vIHZhbGlkIG5hbWUKLQlmb250RGF0YS5zZXROYW1lKFN3dEp1bml0LnRlc3RGb250TmFtZSk7CQotCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsIGZvbnREYXRhLmdldE5hbWUoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lKTsKLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBuYW1lID09IG51bGwKLQl0cnkgewotCQlmb250RGF0YS5zZXROYW1lKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTdHlsZUkoKSB7Ci0JLy8gVGVzdCBGb250LnNldFN0eWxlKGludCAgc3R5bGUpCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJLy8gdmFsaWQgbm9ybWFsIGZvbnQgZGF0YQotCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIGhlaWdodCwgU1dULk5PUk1BTCk7CQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULk5PUk1BTCk7Ci0KLQkJLy8gdmFsaWQgYm9sZCBmb250IGRhdGEKLQkJZm9udERhdGEuc2V0U3R5bGUoU1dULkJPTEQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULkJPTEQpOwotCi0JCS8vIHZhbGlkIGl0YWxpYyBmb250IGRhdGEKLQkJZm9udERhdGEuc2V0U3R5bGUoU1dULklUQUxJQyk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3R5bGUiLCBmb250RGF0YS5nZXRTdHlsZSgpLCBTV1QuSVRBTElDKTsKLQkJCi0JCS8vIHZhbGlkIGJvbGQgaXRhbGljIGZvbnQgZGF0YQotCQlmb250RGF0YS5zZXRTdHlsZShTV1QuSVRBTElDIHwgU1dULkJPTEQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQotCQkvLyB2YWxpZCBub3JtYWwgZm9udCBkYXRhCi0JCWZvbnREYXRhLnNldFN0eWxlKFNXVC5OT1JNQUwpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULk5PUk1BTCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUZvbnREYXRhIGRhdGEgPSBuZXcgRm9udERhdGEoKTsKLQlhc3NlcnROb3ROdWxsKGRhdGEudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRJKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBvbmx5Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2FsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TmFtZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIZWlnaHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhbGVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TmFtZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTdHlsZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlaWdodCIpKSB0ZXN0X2dldEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYWxlIikpIHRlc3RfZ2V0TG9jYWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXROYW1lIikpIHRlc3RfZ2V0TmFtZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGUiKSkgdGVzdF9nZXRTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SGVpZ2h0SSIpKSB0ZXN0X3NldEhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2FsZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0TG9jYWxlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3R5bGVJIikpIHRlc3Rfc2V0U3R5bGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05USSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTk4MDVmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3MKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljcwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWdjID0gbmV3IEdDKHNoZWxsKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JZ2MuZGlzcG9zZSgpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCUZvbnRNZXRyaWNzIGZtMSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JRm9udE1ldHJpY3MgZm0yID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlhc3NlcnRUcnVlKGZtMS5lcXVhbHMoZm0yKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QXNjZW50KCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXRBc2NlbnQoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBdmVyYWdlQ2hhcldpZHRoKCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY2VudCgpIHsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZm0uZ2V0RGVzY2VudCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlaWdodCgpIHsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZm0uZ2V0SGVpZ2h0KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGVhZGluZygpIHsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZm0uZ2V0TGVhZGluZygpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCUZvbnRNZXRyaWNzIGZtMSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JRm9udE1ldHJpY3MgZm0yID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlpZiAoZm0xLmVxdWFscyhmbTIpKSB7Ci0JCWFzc2VydEVxdWFscyhmbTEuaGFzaENvZGUoKSwgZm0yLmhhc2hDb2RlKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUMoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFzY2VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QXZlcmFnZUNoYXJXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVzY2VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMZWFkaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFzY2VudCIpKSB0ZXN0X2dldEFzY2VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QXZlcmFnZUNoYXJXaWR0aCIpKSB0ZXN0X2dldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlc2NlbnQiKSkgdGVzdF9nZXREZXNjZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWlnaHQiKSkgdGVzdF9nZXRIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExlYWRpbmciKSkgdGVzdF9nZXRMZWFkaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUMiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUMoKTsKLX0KLQotLyogY3VzdG9tICovCi0JRGlzcGxheSBkaXNwbGF5OwotCVNoZWxsIHNoZWxsOwotCUdDIGdjOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjJhMmU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0MgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygwLDMwLDI0MCwyOTApOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDIwMCwgMjAwKTsKLQlnYyA9IG5ldyBHQyhpbWFnZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCWdjLmRpc3Bvc2UoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZSgpIHsKLQl0cnkgewotCQlHQyBnYyA9IG5ldyBHQyhudWxsKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkcmF3YWJsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZHJhd2FibGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JCi0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCUdDIGdjMSA9IG51bGwsIGdjMiA9IG51bGw7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQkJZ2MxID0gbmV3IEdDKGltYWdlKTsKLQkJZ2MyID0gbmV3IEdDKGltYWdlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgaW1hZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBpbWFnZSIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9IGZpbmFsbHkgewotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQlpZiAoZ2MxICE9IG51bGwpIGdjMS5kaXNwb3NlKCk7Ci0JCWlmIChnYzIgIT0gbnVsbCkgZ2MyLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlSSgpIHsKLQl0cnkgewotCQlHQyBnYyA9IG5ldyBHQyhudWxsLCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZHJhd2FibGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRyYXdhYmxlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCUdDIGdjMSA9IG51bGwsIGdjMiA9IG51bGw7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQkJZ2MxID0gbmV3IEdDKGltYWdlLCBTV1QuUklHSFRfVE9fTEVGVCk7Ci0JCWdjMiA9IG5ldyBHQyhpbWFnZSwgU1dULkxFRlRfVE9fUklHSFQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBpbWFnZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1vcmUgdGhhbiBvbmUgR0Mgb24gb25lIGltYWdlIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0gZmluYWxseSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCWlmIChnYzEgIT0gbnVsbCkgZ2MxLmRpc3Bvc2UoKTsKLQkJaWYgKGdjMiAhPSBudWxsKSBnYzIuZGlzcG9zZSgpOwotCX0KLQotCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTlVMTCk7Ci0JR0MgdGVzdEdDID0gbmV3IEdDKGNhbnZhcywgU1dULlJJR0hUX1RPX0xFRlQpOwotCXRlc3RHQy5kaXNwb3NlKCk7Ci0JdGVzdEdDID0gbmV3IEdDKGNhbnZhcywgU1dULkxFRlRfVE9fUklHSFQpOwotCXRlc3RHQy5kaXNwb3NlKCk7Ci0JY2FudmFzLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb3B5QXJlYUlJSUlJSSgpIHsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JUkdCIHdoaXRlUkdCID0gZ2V0UmVhbFJHQih3aGl0ZSk7Ci0JUkdCIGJsdWVSR0IgPSBnZXRSZWFsUkdCKGJsdWUpOwotCWludCB3aWR0aCA9IDIwOwotCWludCBoZWlnaHQgPSAyMDsKLQlpbnQgZGVzdFggPSAxMDsKLQlpbnQgZGVzdFkgPSA1MDsKLQotCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCWdjLmZpbGxSZWN0YW5nbGUoaW1hZ2UuZ2V0Qm91bmRzKCkpOwotCWdjLnNldEJhY2tncm91bmQoYmx1ZSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSg1LCAwLCA2LCAxKTsKLQlnYy5jb3B5QXJlYSgwLCAwLCB3aWR0aCwgaGVpZ2h0LCBkZXN0WCwgZGVzdFkpOwotCi0JSW1hZ2VEYXRhIGltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBpbWFnZURhdGEucGFsZXR0ZTsgCi0JaW50IHBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKGRlc3RYICsgNCwgZGVzdFkpOwotCWFzc2VydEVxdWFscygiOmE6Iiwgd2hpdGVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7Ci0JcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoZGVzdFggKyA1LCBkZXN0WSk7Ci0gCWFzc2VydEVxdWFscygiOmI6IiwgYmx1ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsJCi0JcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoZGVzdFggKyAxMCwgZGVzdFkpOwotCWFzc2VydEVxdWFscygiOmM6IiwgYmx1ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsJCi0JcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoZGVzdFggKyAxMSwgZGVzdFkpOwotCWFzc2VydEVxdWFscygiOmQ6Iiwgd2hpdGVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29weUFyZWFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkoKSB7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCVJHQiB3aGl0ZVJHQiA9IGdldFJlYWxSR0Iod2hpdGUpOwotCVJHQiBibHVlUkdCID0gZ2V0UmVhbFJHQihibHVlKTsKLQkKLQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlLmdldEJvdW5kcygpKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGJsdWUpOwotCWdjLmZpbGxSZWN0YW5nbGUoNSwgMCwgNiwgMSk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTIsIDEyKTsKLQlnYy5jb3B5QXJlYShpbWFnZSwgMCwgMCk7Ci0JSW1hZ2VEYXRhIGltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBpbWFnZURhdGEucGFsZXR0ZTsgCi0JaW50IHBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKDQsIDApOwotCWFzc2VydEVxdWFscygiOmE6Iiwgd2hpdGVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7Ci0JcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoNSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCBibHVlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKDEwLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIGJsdWVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7CQotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKDExLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjpkOiIsIHdoaXRlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCWdjLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3QXJjSUlJSUlJKCkgewotCWdjLmRyYXdBcmMoMTAsIDIwLCA1MCwgMjUsIDkwLCA5MCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdGb2N1c0lJSUkoKSB7Ci0JZ2MuZHJhd0ZvY3VzKDEsIDEsIDUwLCAyNSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSgpIHsKLQlDb2xvciBjMSA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCUNvbG9yIGMyID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDApOwotCUNvbG9yIGMzID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAwKTsKLQkKLQlQYWxldHRlRGF0YSBwYWxldHRlRGF0YSA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge2MxLmdldFJHQigpLCBjMi5nZXRSR0IoKSwgYzMuZ2V0UkdCKCl9KTsKLQlJbWFnZURhdGEgZGF0YSA9IG5ldyBJbWFnZURhdGEoMzAsMzAsIDgsIHBhbGV0dGVEYXRhKTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCWlmICh4ID4geSkgZGF0YS5zZXRQaXhlbCh4LCB5LCBwYWxldHRlRGF0YS5nZXRQaXhlbChjMS5nZXRSR0IoKSkpOwotCQkJZWxzZSBpZiAoeCA8IHkpIGRhdGEuc2V0UGl4ZWwoeCwgeSwgcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzIuZ2V0UkdCKCkpKTsKLQkJCWVsc2UgZGF0YS5zZXRQaXhlbCh4LCB5LCBwYWxldHRlRGF0YS5nZXRQaXhlbChjMy5nZXRSR0IoKSkpOwotCQl9Ci0JfQotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCWRhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlkYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSBwYWxldHRlRGF0YS5nZXRQaXhlbChjMS5nZXRSR0IoKSk7Ci0JSW1hZ2UgaW1hZ2VUcmFuc3BhcmVudCA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQlkYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAtMTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCWRhdGEuc2V0QWxwaGEoeCwgeSwgMTI3KTsKLQkJfQotCX0JCQotCUltYWdlIGltYWdlQWxwaGEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JCQkJCQkJCi0JZ2MuZHJhd0ltYWdlKGltYWdlLCAxMDAsIDEwMCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlVHJhbnNwYXJlbnQsIDEzMCwgMTAwKTsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2VBbHBoYSwgMTYwLCAxMDApOwotCXRyeSB7Ci0JCWdjLmRyYXdJbWFnZShudWxsLCAxMDAsIDEwMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWltYWdlLmRpc3Bvc2UoKTsKLQlpbWFnZVRyYW5zcGFyZW50LmRpc3Bvc2UoKTsKLQlpbWFnZUFscGhhLmRpc3Bvc2UoKTsKLQljMS5kaXNwb3NlKCk7Ci0JYzIuZGlzcG9zZSgpOwotCWMzLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUlJSUlJSUkoKSB7Ci0JQ29sb3IgYzEgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQlDb2xvciBjMiA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAwKTsKLQlDb2xvciBjMyA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMCk7Ci0JCi0JUGFsZXR0ZURhdGEgcGFsZXR0ZURhdGEgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtjMS5nZXRSR0IoKSwgYzIuZ2V0UkdCKCksIGMzLmdldFJHQigpfSk7Ci0JSW1hZ2VEYXRhIGRhdGEgPSBuZXcgSW1hZ2VEYXRhKDMwLDMwLCA4LCBwYWxldHRlRGF0YSk7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBkYXRhLmhlaWdodDsgeSsrKSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQlpZiAoeCA+IHkpIGRhdGEuc2V0UGl4ZWwoeCwgeSwgcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzEuZ2V0UkdCKCkpKTsKLQkJCWVsc2UgaWYgKHggPCB5KSBkYXRhLnNldFBpeGVsKHgsIHksIHBhbGV0dGVEYXRhLmdldFBpeGVsKGMyLmdldFJHQigpKSk7Ci0JCQllbHNlIGRhdGEuc2V0UGl4ZWwoeCwgeSwgcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzMuZ2V0UkdCKCkpKTsKLQkJfQotCX0KLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQlkYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JZGF0YS50cmFuc3BhcmVudFBpeGVsID0gcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzEuZ2V0UkdCKCkpOwotCUltYWdlIGltYWdlVHJhbnNwYXJlbnQgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JZGF0YS50cmFuc3BhcmVudFBpeGVsID0gLTE7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBkYXRhLmhlaWdodDsgeSsrKSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQlkYXRhLnNldEFscGhhKHgsIHksIDEyNyk7Ci0JCX0KLQl9CQkKLQlJbWFnZSBpbWFnZUFscGhhID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCQkJCQkJCQotCWdjLmRyYXdJbWFnZShpbWFnZSwgMTAsIDUsIDIwLCAxNSwgMTAwLCAxMjAsIDUwLCA2MCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlVHJhbnNwYXJlbnQsIDEwLCA1LCAyMCwgMTUsIDEwMCwgMTIwLCAxMCwgMTApOwotCWdjLmRyYXdJbWFnZShpbWFnZUFscGhhLCAxMCwgNSwgMjAsIDE1LCAxMDAsIDEyMCwgMjAsIDE1KTsKLQl0cnkgewotCQlnYy5kcmF3SW1hZ2UobnVsbCwgMTAsIDUsIDIwLCAxNSwgMTAwLCAxMjAsIDUwLCA2MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsgLy9zaG91bGQgbmV2ZXIgZ2V0IGhlcmUKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWltYWdlLmRpc3Bvc2UoKTsKLQlpbWFnZUFscGhhLmRpc3Bvc2UoKTsKLQlpbWFnZVRyYW5zcGFyZW50LmRpc3Bvc2UoKTsKLQljMS5kaXNwb3NlKCk7Ci0JYzIuZGlzcG9zZSgpOwotCWMzLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3TGluZUlJSUkoKSB7Ci0JZ2MuZHJhd0xpbmUoMCwwLDAsMjApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdPdmFsSUlJSSgpIHsKLQlnYy5kcmF3T3ZhbCgxMCwgMCwgMjAsIDMwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1BvaW50SUkoKSB7Ci0JZ2MuZHJhd1BvaW50KDEwLCAxMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1BvbHlnb24kSSgpIHsKLQlnYy5kcmF3UG9seWdvbihuZXcgaW50W10gezAsMCwgNSwxMCwgMCwyMH0pOwkJCQkKLQlnYy5kcmF3UG9seWdvbihuZXcgaW50W10gezAsMH0pOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3UG9seWxpbmUkSSgpIHsKLQlnYy5kcmF3UG9seWxpbmUobmV3IGludFtdIHswLDAsIDUsMTAsIDAsMjB9KTsJCQkJCi0JZ2MuZHJhd1BvbHlsaW5lKG5ldyBpbnRbXSB7MCwwfSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdSZWN0YW5nbGVJSUlJKCkgewotCWdjLmRyYXdSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCk7CQkJCQotCWdjLmRyYXdSZWN0YW5nbGUoMCwgMCwgMCwgMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlnYy5kcmF3UmVjdGFuZ2xlKG5ldyBSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCkpOwkJCQkKLQlnYy5kcmF3UmVjdGFuZ2xlKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3Um91bmRSZWN0YW5nbGVJSUlJSUkoKSB7Ci0JZ2MuZHJhd1JvdW5kUmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzAsIDMsIDMpOwkJCQkKLQlnYy5kcmF3Um91bmRSZWN0YW5nbGUoMCwgMCwgMCwgMCwgMCwgMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJKCkgewotCWdjLmRyYXdTdHJpbmcoInRlc3QiLCA1LCA1KTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUlaKCkgewotCWdjLmRyYXdTdHJpbmcoInRlc3QiLCA1LCA1LCB0cnVlKTsJCQkJCi0JZ2MuZHJhd1N0cmluZygidGVzdCIsIDUsIDUsIGZhbHNlKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJKCkgewotCWdjLmRyYXdUZXh0KCJ0ZXN0IiwgNSwgNSk7CQkJCQotCWdjLmRyYXdUZXh0KCIiLCAwLCAwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJSSgpIHsJCQkKLQlnYy5kcmF3VGV4dCgiYWJjIiwgNSwgNSwgMCk7Ci0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIFNXVC5EUkFXX1RSQU5TUEFSRU5UKTsKLQlnYy5kcmF3VGV4dCgiYWJjIiwgNSwgNSwgU1dULkRSQVdfREVMSU1JVEVSKTsKLQlnYy5kcmF3VGV4dCgiYWJjIiwgNSwgNSwgU1dULkRSQVdfTU5FTU9OSUMpOwotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCBTV1QuRFJBV19UQUIpOwotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCAwKTsKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCwgU1dULkRSQVdfVFJBTlNQQVJFTlQpOwkJCQkKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCwgU1dULkRSQVdfREVMSU1JVEVSKTsJCQkJCi0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIFNXVC5EUkFXX01ORU1PTklDKTsJCQkJCi0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIFNXVC5EUkFXX1RBQik7CQkJCQotCWdjLmRyYXdUZXh0KCJcdFxyXG5hJmJjJiIsIDUsIDUsIDApOwotCWdjLmRyYXdUZXh0KCJcdFxyXG5hJmJjJiIsIDUsIDUsIFNXVC5EUkFXX1RSQU5TUEFSRU5UKTsKLQlnYy5kcmF3VGV4dCgiXHRcclxuYSZiYyYiLCA1LCA1LCBTV1QuRFJBV19ERUxJTUlURVIpOwotCWdjLmRyYXdUZXh0KCJcdFxyXG5hJmJjJiIsIDUsIDUsIFNXVC5EUkFXX01ORU1PTklDKTsKLQlnYy5kcmF3VGV4dCgiXHRcclxuYSZiYyYiLCA1LCA1LCBTV1QuRFJBV19UQUIpOwotCWdjLmRyYXdUZXh0KCJcciIsIDUsIDUsIFNXVC5EUkFXX0RFTElNSVRFUik7Ci0JZ2MuZHJhd1RleHQoIlxuIiwgNSwgNSwgU1dULkRSQVdfREVMSU1JVEVSKTsKLQlnYy5kcmF3VGV4dCgiJiIsIDUsIDUsIFNXVC5EUkFXX01ORU1PTklDKTsKLQlnYy5kcmF3VGV4dCgiXHQiLCA1LCA1LCBTV1QuRFJBV19UQUIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSVooKSB7Ci0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIHRydWUpOwkJCQkKLQlnYy5kcmF3VGV4dCgiYWJjIiwgNSwgNSwgZmFsc2UpOwkJCQkKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCwgdHJ1ZSk7CQkJCQotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCBmYWxzZSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCWFzc2VydFRydWUoZ2MuZXF1YWxzKGdjKSk7Ci0JQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5OVUxMKTsKLQlHQyB0ZXN0R0MgPSBuZXcgR0MoY2FudmFzKTsKLQlhc3NlcnRGYWxzZSh0ZXN0R0MuZXF1YWxzKGdjKSk7Ci0JdGVzdEdDLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maWxsQXJjSUlJSUlJKCkgewotCWdjLmZpbGxBcmMoMTAsIDIwLCA1MCwgMjUsIDkwLCA5MCk7CQkJCQotCWdjLmZpbGxBcmMoMTAsIDIwLCA1MCwgMjUsIC0xMCwgLTEwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbEdyYWRpZW50UmVjdGFuZ2xlSUlJSVooKSB7Ci0JZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzAsIHRydWUpOwkJCQkKLQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMCwgMCwgMCwgMCwgdHJ1ZSk7CQkJCQotCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwLCBmYWxzZSk7CQkJCQotCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgwLCAwLCAwLCAwLCBmYWxzZSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxPdmFsSUlJSSgpIHsKLQlnYy5maWxsT3ZhbCgxMCwgMCwgMjAsIDMwKTsJCQkJCi0JZ2MuZmlsbE92YWwoLTEsIC0xLCAtMSwgLTEpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maWxsUG9seWdvbiRJKCkgewotCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnRbXSB7MCwwLCA1LDEwLCAwLDIwfSk7CQkJCQotCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnRbXSB7MCwwfSk7CQkJCQotCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnRbXSB7LTEsIC0xfSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxSZWN0YW5nbGVJSUlJKCkgewotCWdjLmZpbGxSZWN0YW5nbGUobmV3IFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwKSk7CQkJCQotCWdjLmZpbGxSZWN0YW5nbGUobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSk7CQkJCQotCWdjLmZpbGxSZWN0YW5nbGUobmV3IFJlY3RhbmdsZSgtMSwgLTEsIC0xLCAtMSkpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maWxsUmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JZ2MuZmlsbFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwKTsJCQkJCi0JZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAwLCAwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbFJvdW5kUmVjdGFuZ2xlSUlJSUlJKCkgewotCWdjLmZpbGxSb3VuZFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwLCAzLCAzKTsJCQkJCi0JZ2MuZmlsbFJvdW5kUmVjdGFuZ2xlKDAsIDAsIDAsIDAsIDAsIDApOwkJCQkKLQlnYy5maWxsUm91bmRSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCwgLTEwLCAtMTApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBZHZhbmNlV2lkdGhDKCkgewotCWludCB3ID0gZ2MuZ2V0QWR2YW5jZVdpZHRoKCdhJyk7Ci0JYXNzZXJ0VHJ1ZSh3ID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0QmFja2dyb3VuZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGFyV2lkdGhDKCkgewotCWludCB3ID0gZ2MuZ2V0Q2hhcldpZHRoKCdhJyk7Ci0JYXNzZXJ0VHJ1ZSh3ID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpcHBpbmcoKSB7Ci0JLy8gdGVzdGVkIGluIHNldENsaXBwaW5nIG1ldGhvZHMKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0Rm9udCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250TWV0cmljcygpIHsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JYXNzZXJ0VHJ1ZShmbS5nZXRIZWlnaHQoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvcmVncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldEZvcmVncm91bmQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZVN0eWxlKCkgewotCS8vIHRlc3RlZCBpbiBzZXRMaW5lU3R5bGUgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZVdpZHRoKCkgewotCS8vIHRlc3RlZCBpbiBzZXRMaW5lV2lkdGggbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGUoKSB7Ci0JQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5OVUxMKTsKLQlHQyB0ZXN0R0MgPSBuZXcgR0MoY2FudmFzLCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JaW50IHN0eWxlID0gdGVzdEdDLmdldFN0eWxlKCk7Ci0JYXNzZXJ0VHJ1ZSgoc3R5bGUgJiBTV1QuTEVGVF9UT19SSUdIVCkgIT0gMCk7Ci0JdGVzdEdDLmRpc3Bvc2UoKTsKLQl0ZXN0R0MgPSBuZXcgR0MoY2FudmFzKTsKLQlzdHlsZSA9IHRlc3RHQy5nZXRTdHlsZSgpOwotCWFzc2VydFRydWUoKHN0eWxlICYgU1dULkxFRlRfVE9fUklHSFQpICE9IDApOwotCXRlc3RHQy5kaXNwb3NlKCk7Ci0JdGVzdEdDID0gbmV3IEdDKGNhbnZhcywgU1dULlJJR0hUX1RPX0xFRlQpOwotCXN0eWxlID0gdGVzdEdDLmdldFN0eWxlKCk7Ci0JYXNzZXJ0VHJ1ZSgoc3R5bGUgJiAgU1dULlJJR0hUX1RPX0xFRlQpICE9IDApOwotCXRlc3RHQy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0WE9STW9kZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0WE9STW9kZSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlhc3NlcnRUcnVlKGdjLmhhc2hDb2RlKCkgPT0gZ2MuaGFzaENvZGUoKSk7Ci0JR0MgZ2MyID0gbmV3IEdDKHNoZWxsKTsKLQlhc3NlcnRGYWxzZShnYy5oYXNoQ29kZSgpID09IGdjMi5oYXNoQ29kZSgpKTsKLQlnYzIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzQ2xpcHBlZCgpIHsKLQlhc3NlcnRGYWxzZShnYy5pc0NsaXBwZWQoKSk7Ci0JZ2Muc2V0Q2xpcHBpbmcoNSwxMCwxNSwyMCk7Ci0JYXNzZXJ0VHJ1ZShnYy5pc0NsaXBwZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQlhc3NlcnRGYWxzZShnYy5pc0Rpc3Bvc2VkKCkpOwotCWdjLmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKGdjLmlzRGlzcG9zZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3Ioc2hlbGwuZ2V0RGlzcGxheSgpLCAyNTUsIDAsIDApOwotCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgZ2MuZ2V0QmFja2dyb3VuZCgpKTsKLQl0cnkgeyAKLQkJZ2Muc2V0QmFja2dyb3VuZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbnVsbCBjb2xvciIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGdjLmdldEJhY2tncm91bmQoKSxnYy5nZXRCYWNrZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yIGRpc3Bvc2VkIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDbGlwcGluZ0lJSUkoKSB7Ci0JLy8gaW50ZXJtaXR0ZW50bHkgZmFpbHMgb24gWFAgZm9yIHJlYXNvbnMgdW5rbm93biwgY29tbWVudCBvdXQgdGhlIHRlc3QgY2FzZQotCS8vIHVudGlsIHRoZSBwcm9ibGVtIGlzIGZpZ3VyZWQgb3V0Ci0vLwlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULkJPUkRFUik7Ci0vLwlzaGVsbC5zZXRTaXplKDExMCwxMTApOwotLy8JY2FudmFzLnNldFNpemUoMTAwLDEwMCk7Ci0vLwlzaGVsbC5vcGVuKCk7Ci0vLwlHQyB0ZXN0R2MgPSBuZXcgR0MoY2FudmFzKTsKLS8vCXRlc3RHYy5zZXRDbGlwcGluZygwLDUsMTAsMjApOwotLy8JUmVjdGFuZ2xlIHJlY3QgPSB0ZXN0R2MuZ2V0Q2xpcHBpbmcoKTsKLS8vCWFzc2VydFRydWUocmVjdC54ID09IDApOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LnkgPT0gNSk7Ci0vLwlhc3NlcnRUcnVlKHJlY3Qud2lkdGggPT0gMTApOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LmhlaWdodCA9PSAyMCk7Ci0vLwl0ZXN0R2MuZGlzcG9zZSgpOwotLy8JY2FudmFzLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCS8vIGludGVybWl0dGVudGx5IGZhaWxzIG9uIFhQIGZvciByZWFzb25zIHVua25vd24sIGNvbW1lbnQgb3V0IHRoZSB0ZXN0IGNhc2UKLQkvLyB1bnRpbCB0aGUgcHJvYmxlbSBpcyBmaWd1cmVkIG91dAotLy8JQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5CT1JERVIpOwotLy8Jc2hlbGwuc2V0U2l6ZSgxMTAsMTEwKTsKLS8vCWNhbnZhcy5zZXRTaXplKDEwMCwxMDApOwotLy8Jc2hlbGwub3BlbigpOwotLy8JR0MgdGVzdEdjID0gbmV3IEdDKGNhbnZhcyk7Ci0vLwl0ZXN0R2Muc2V0Q2xpcHBpbmcobmV3IFJlY3RhbmdsZSgwLDUsMTAsMjApKTsKLS8vCVJlY3RhbmdsZSByZWN0ID0gdGVzdEdjLmdldENsaXBwaW5nKCk7Ci0vLwlhc3NlcnRUcnVlKHJlY3QueCA9PSAwKTsKLS8vCWFzc2VydFRydWUocmVjdC55ID09IDUpOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LndpZHRoID09IDEwKTsKLS8vCWFzc2VydFRydWUocmVjdC5oZWlnaHQgPT0gMjApOwotLy8JdGVzdEdjLmRpc3Bvc2UoKTsKLS8vCWNhbnZhcy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JZ2Muc2V0Rm9udChzaGVsbC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtRm9udCgpKTsKLQlGb250IGZvbnQgPSBnYy5nZXRGb250KCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyhzaGVsbC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtRm9udCgpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3Ioc2hlbGwuZ2V0RGlzcGxheSgpLCAyNTUsIDAsIDApOwotCWdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgZ2MuZ2V0Rm9yZWdyb3VuZCgpKTsKLQl0cnkgeyAKLQkJZ2Muc2V0Rm9yZWdyb3VuZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbnVsbCBjb2xvciIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGdjLmdldEZvcmVncm91bmQoKSxnYy5nZXRGb3JlZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yIGRpc3Bvc2VkIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lU3R5bGVJKCkgewotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRMaW5lU3R5bGUoKSA9PSBTV1QuTElORV9TT0xJRCk7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RBU0gpOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVN0eWxlKCkgPT0gU1dULkxJTkVfREFTSCk7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RPVCk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRMaW5lU3R5bGUoKSA9PSBTV1QuTElORV9ET1QpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIRE9UKTsKLQlhc3NlcnRUcnVlKGdjLmdldExpbmVTdHlsZSgpID09IFNXVC5MSU5FX0RBU0hET1QpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIRE9URE9UKTsKLQlhc3NlcnRUcnVlKGdjLmdldExpbmVTdHlsZSgpID09IFNXVC5MSU5FX0RBU0hET1RET1QpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExpbmVXaWR0aEkoKSB7Ci0JZ2Muc2V0TGluZVdpZHRoKDEwKTsKLQlhc3NlcnRUcnVlKGdjLmdldExpbmVXaWR0aCgpID09IDEwKTsKLQlnYy5zZXRMaW5lV2lkdGgoMCk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRMaW5lV2lkdGgoKSA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRYT1JNb2RlWigpIHsKLQlnYy5zZXRYT1JNb2RlKHRydWUpOwotCWFzc2VydFRydWUoZ2MuZ2V0WE9STW9kZSgpKTsKLQlnYy5zZXRYT1JNb2RlKGZhbHNlKTsKLQlhc3NlcnRGYWxzZShnYy5nZXRYT1JNb2RlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0cmluZ0V4dGVudExqYXZhX2xhbmdfU3RyaW5nKCkgewotCVBvaW50IHB0ID0gZ2Muc3RyaW5nRXh0ZW50KCJhYmMiKTsKLQlhc3NlcnRUcnVlKHB0LnggPiAwKTsKLQlhc3NlcnRUcnVlKHB0LnkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90ZXh0RXh0ZW50TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JUG9pbnQgcHQgPSBnYy50ZXh0RXh0ZW50KCJhYmMiKTsKLQlhc3NlcnRUcnVlKHB0LnggPiAwKTsKLQlhc3NlcnRUcnVlKHB0LnkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90ZXh0RXh0ZW50TGphdmFfbGFuZ19TdHJpbmdJKCkgewotCVBvaW50IHB0ID0gZ2MudGV4dEV4dGVudCgiYWJjIiwgMCk7Ci0JYXNzZXJ0VHJ1ZShwdC54ID4gMCk7Ci0JYXNzZXJ0VHJ1ZShwdC55ID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JU3RyaW5nIHMgPSBnYy50b1N0cmluZygpOwotCWFzc2VydE5vdE51bGwocyk7Ci0JYXNzZXJ0VHJ1ZShzLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBvbmx5Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBvbmx5Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29weUFyZWFJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvcHlBcmVhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3QXJjSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3Rm9jdXNJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSUlJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd0xpbmVJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3T3ZhbElJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdQb2ludElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3UG9seWdvbiRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3UG9seWxpbmUkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1JlY3RhbmdsZUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1JvdW5kUmVjdGFuZ2xlSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maWxsQXJjSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maWxsR3JhZGllbnRSZWN0YW5nbGVJSUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbE92YWxJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maWxsUG9seWdvbiRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maWxsUmVjdGFuZ2xlSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbFJlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maWxsUm91bmRSZWN0YW5nbGVJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFkdmFuY2VXaWR0aEMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoYXJXaWR0aEMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaXBwaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250TWV0cmljcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZVN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lV2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRYT1JNb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNDbGlwcGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2xpcHBpbmdJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGluZVN0eWxlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGluZVdpZHRoSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0WE9STW9kZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N0cmluZ0V4dGVudExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0RXh0ZW50TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZ0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb3B5QXJlYUlJSUlJSSIpKSB0ZXN0X2NvcHlBcmVhSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb3B5QXJlYUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSIpKSB0ZXN0X2NvcHlBcmVhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd0FyY0lJSUlJSSIpKSB0ZXN0X2RyYXdBcmNJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdGb2N1c0lJSUkiKSkgdGVzdF9kcmF3Rm9jdXNJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkiKSkgdGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSUlJSUlJSSIpKSB0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSUlJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd0xpbmVJSUlJIikpIHRlc3RfZHJhd0xpbmVJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3T3ZhbElJSUkiKSkgdGVzdF9kcmF3T3ZhbElJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdQb2ludElJIikpIHRlc3RfZHJhd1BvaW50SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdQb2x5Z29uJEkiKSkgdGVzdF9kcmF3UG9seWdvbiRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3UG9seWxpbmUkSSIpKSB0ZXN0X2RyYXdQb2x5bGluZSRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3UmVjdGFuZ2xlSUlJSSIpKSB0ZXN0X2RyYXdSZWN0YW5nbGVJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3UmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9kcmF3UmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdSb3VuZFJlY3RhbmdsZUlJSUlJSSIpKSB0ZXN0X2RyYXdSb3VuZFJlY3RhbmdsZUlJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUkiKSkgdGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUlaIikpIHRlc3RfZHJhd1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUkiKSkgdGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSUkiKSkgdGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlaIikpIHRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmlsbEFyY0lJSUlJSSIpKSB0ZXN0X2ZpbGxBcmNJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbGxHcmFkaWVudFJlY3RhbmdsZUlJSUlaIikpIHRlc3RfZmlsbEdyYWRpZW50UmVjdGFuZ2xlSUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbGxPdmFsSUlJSSIpKSB0ZXN0X2ZpbGxPdmFsSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmlsbFBvbHlnb24kSSIpKSB0ZXN0X2ZpbGxQb2x5Z29uJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbGxSZWN0YW5nbGVJSUlJIikpIHRlc3RfZmlsbFJlY3RhbmdsZUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbGxSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ZpbGxSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmlsbFJvdW5kUmVjdGFuZ2xlSUlJSUlJIikpIHRlc3RfZmlsbFJvdW5kUmVjdGFuZ2xlSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBZHZhbmNlV2lkdGhDIikpIHRlc3RfZ2V0QWR2YW5jZVdpZHRoQygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZCIpKSB0ZXN0X2dldEJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoYXJXaWR0aEMiKSkgdGVzdF9nZXRDaGFyV2lkdGhDKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGlwcGluZyIpKSB0ZXN0X2dldENsaXBwaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIikpIHRlc3RfZ2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udCIpKSB0ZXN0X2dldEZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnRNZXRyaWNzIikpIHRlc3RfZ2V0Rm9udE1ldHJpY3MoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lU3R5bGUiKSkgdGVzdF9nZXRMaW5lU3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVXaWR0aCIpKSB0ZXN0X2dldExpbmVXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGUiKSkgdGVzdF9nZXRTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0WE9STW9kZSIpKSB0ZXN0X2dldFhPUk1vZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzQ2xpcHBlZCIpKSB0ZXN0X2lzQ2xpcHBlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENsaXBwaW5nSUlJSSIpKSB0ZXN0X3NldENsaXBwaW5nSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKSkgdGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGluZVN0eWxlSSIpKSB0ZXN0X3NldExpbmVTdHlsZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExpbmVXaWR0aEkiKSkgdGVzdF9zZXRMaW5lV2lkdGhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRYT1JNb2RlWiIpKSB0ZXN0X3NldFhPUk1vZGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdHJpbmdFeHRlbnRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3N0cmluZ0V4dGVudExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90ZXh0RXh0ZW50TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF90ZXh0RXh0ZW50TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF90ZXh0RXh0ZW50TGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF93aW4zMl9uZXdJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotfQotCi0vKiBjdXN0b20gKi8KLURpc3BsYXkgZGlzcGxheTsKLVNoZWxsIHNoZWxsOwotSW1hZ2UgaW1hZ2U7Ci1HQyBnYzsKLQotLyoqCi0gKiBSZXR1cm4gdGhlIGFjdHVhbCBSR0IgdmFsdWUgdXNlZCBmb3IgcmVuZGVyaW5nIGZvciB0aGUgZ2l2ZW4gQ29sb3IuCi0gKiBUaGlzIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgQ29sb3IncyBSR0IgdmFsdWUgb24gbG93ZXItY29sb3IgZGlzcGxheXMgCi0gKiAoMTZicHAgb3IgbGVzcykuCi0gKi8KLVJHQiBnZXRSZWFsUkdCKENvbG9yIGNvbG9yKSB7Ci0JSW1hZ2UgY29sb3JJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCUdDIGltYWdlR2MgPSBuZXcgR0MoY29sb3JJbWFnZSk7Ci0JSW1hZ2VEYXRhIGltYWdlRGF0YTsKLQlQYWxldHRlRGF0YSBwYWxldHRlOwotCWludCBwaXhlbDsKLQkKLQlpbWFnZUdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCWltYWdlR2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JaW1hZ2VHYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDEwLCAxMCk7Ci0JaW1hZ2VEYXRhID0gY29sb3JJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlwYWxldHRlID0gaW1hZ2VEYXRhLnBhbGV0dGU7Ci0JaW1hZ2VHYy5kaXNwb3NlKCk7Ci0JY29sb3JJbWFnZS5kaXNwb3NlKCk7Ci0JcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoMCwgMCk7Ci0JcmV0dXJuIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzkxZmQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzN2I3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJKCkgewotCUltYWdlIGltYWdlOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIC0xLCAxMCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPD0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoIDw9IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMCwgMTApOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoIDw9IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8PSAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAtMjApOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDw9IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDApOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDw9IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgMTAsIDEwKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0KLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCWltYWdlLmRpc3Bvc2UoKTsKLQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JSW1hZ2UgaW1hZ2U7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IG51bGw7Ci0KLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAtMSwgMTApOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMTApOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPT0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoID09IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxMCwgLTEpOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxMCwgMCk7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPT0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA9PSAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCS8vIHZhbGlkIGltYWdlcwotCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoLTEsIC0xMCwgMTAsIDEwKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQotCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMTAsIDEwKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShudWxsLCBib3VuZHMpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQkKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEoKSB7Ci0JSW1hZ2VEYXRhIGRhdGEgPSBudWxsOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQkKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQotLy8JUGxhdGZvcm0tc3BlY2lmaWMgdGVzdC4gIAotLy8JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4MDBmZjAwLCAweDAwMDBmZikpOwotLy8JdHJ5IHsKLS8vCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLS8vCQlpbWFnZS5kaXNwb3NlKCk7Ci0vLwkJZmFpbCgiVW5zdXBwb3J0ZWQgY29sb3IgZGVwdGgiKTsKLS8vCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0vLwl9Ci0KLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgZGF0YSk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQkKLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDgsIG5ldyBQYWxldHRlRGF0YSgweDMwLCAweDBDLCAweDAzKSk7Ci0JLy8gc2V0IHJlZCBwaXhlbCBhdCB4PTksIHk9OQotCWRhdGEuc2V0UGl4ZWwoOSwgOSwgMHgzMCk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JSW1hZ2UgZ2NJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCUdDIGdjID0gbmV3IEdDKGdjSW1hZ2UpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JSW1hZ2VEYXRhIGdjSW1hZ2VEYXRhID0gZ2NJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlpbnQgcmVkUGl4ZWwgPSBnY0ltYWdlRGF0YS5nZXRQaXhlbCg5LCA5KTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIGdldFJlYWxSR0IoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSksIGdjSW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKHJlZFBpeGVsKSk7Ci0JZ2MuZGlzcG9zZSgpOwotCWdjSW1hZ2UuZGlzcG9zZSgpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgpIHsKLQlJbWFnZURhdGEgZGF0YSA9IG51bGw7Ci0JSW1hZ2VEYXRhIGRhdGExID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWRhdGExID0gbnVsbDsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIG1hc2sgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSBtYXNrID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWRhdGExID0gbmV3IEltYWdlRGF0YSgxLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIHNvdXJjZSB3aWR0aCAhPSBJbWFnZURhdGEgbWFzayB3aWR0aCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSBzb3VyY2Ugd2lkdGggIT0gSW1hZ2VEYXRhIG1hc2sgd2lkdGgiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIHNvdXJjZSBoZWlnaHQgIT0gSW1hZ2VEYXRhIG1hc2sgaGVpZ2h0Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIHNvdXJjZSBoZWlnaHQgIT0gSW1hZ2VEYXRhIG1hc2sgaGVpZ2h0IiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCWRhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQlkYXRhMSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsgLy8gSW1hZ2Ugbm93IGFjY2VwdHMgbWFza3Mgd2hlcmUgZGVwdGggIT0gMQotCWltYWdlLmRpc3Bvc2UoKTsKLQotCWRhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgOCwgbmV3IFBhbGV0dGVEYXRhKDB4MzAsIDB4MEMsIDB4MDMpKTsKLQkvLyBzZXQgb3BhcXVlIHJlZCBwaXhlbCBhdCB4PTksIHk9OQotCWRhdGEuc2V0UGl4ZWwoOSwgOSwgMHgzMCk7Ci0JZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlkYXRhMS5zZXRQaXhlbCg5LCA5LCAxKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JSW1hZ2UgZ2NJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCUdDIGdjID0gbmV3IEdDKGdjSW1hZ2UpOwotCUNvbG9yIGJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOyAKLQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAxMCwgMTApOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JSW1hZ2VEYXRhIGdjSW1hZ2VEYXRhID0gZ2NJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlpbnQgcmVkUGl4ZWwgPSBnY0ltYWdlRGF0YS5nZXRQaXhlbCg5LCA5KTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIGdldFJlYWxSR0IoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSksIGdjSW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKHJlZFBpeGVsKSk7Ci0JaW50IGJsdWVQaXhlbCA9IGdjSW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApOwotCWFzc2VydEVxdWFscygiOmI6IiwgZ2V0UmVhbFJHQihiYWNrZ3JvdW5kQ29sb3IpLCBnY0ltYWdlRGF0YS5wYWxldHRlLmdldFJHQihibHVlUGl4ZWwpKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZ2NJbWFnZS5kaXNwb3NlKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQl0cnkgewotCQl0cnkgewotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyZWFtKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIElucHV0U3RyZWFtID09IG51bGwiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIElucHV0U3RyZWFtID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImVtcHR5LnR4dCIpOwotCQl0cnkgewotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyZWFtKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBJbnB1dFN0cmVhbSIpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBJbnB1dFN0cmVhbSIsIFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQsIGUpOwotCQl9Ci0KLQkJaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbnZhbGlkSW1hZ2VGaWxlbmFtZXNbMF07Ci0JCURpc3BsYXlbXSBkaXNwbGF5cyA9IHtkaXNwbGF5LCBudWxsfTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5cy5sZW5ndGg7IGorKykgewotLy8JCQlEaXNwbGF5IHRlbXBEaXNwbGF5ID0gZGlzcGxheXNbal07Ci0JCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQotCQkJCXRyeSB7Ci0JCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHN0cmVhbSk7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIElucHV0U3RyZWFtIik7Ci0JCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLS8vIEJ1ZyA3MDE2NyAtIEltYWdlKERldmljZSwgSW5wdXRTdHJlYW0pIHRocm93cyBpbmNvcnJlY3QgZXhjZXB0aW9uIGZvciBiYWQgUE5HCi0vLyByZW1vdmUgY29tbWVudCB3aGVuIGJ1ZyBpcyBmaXhlZC4KLS8vCQkJCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGltYWdlIElucHV0U3RyZWFtIiwgU1dULkVSUk9SX0lOVkFMSURfSU1BR0UsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oU3d0VGVzdENhc2UuaW52YWxpZEltYWdlRmlsZW5hbWVzWzFdKTsKLQkJdHJ5IHsKLQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHN0cmVhbSk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgSW5wdXRTdHJlYW0iKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgaW1hZ2UgSW5wdXRTdHJlYW0iLCBTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSwgZSk7Ci0JCX0JCQotCi0JCS8vIGNyZWF0ZSB2YWxpZCBpbWFnZXMKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5cy5sZW5ndGg7IGorKykgewotCQkJRGlzcGxheSB0ZW1wRGlzcGxheSA9IGRpc3BsYXlzW2pdOwotCQkJaW50IG51bUZpbGVOYW1lcyA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGs9MDsgazxudW1GaWxlTmFtZXM7IGsrKykgewotCQkJCWZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNba107CQkKLQkJCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQkJCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCQkJCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQkJCQlpbWFnZSA9IG5ldyBJbWFnZSh0ZW1wRGlzcGxheSwgc3RyZWFtKTsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQl0cnkgewotCQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCXRyeSB7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGZpbGVOYW1lKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBmaWxlIG5hbWUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGZpbGUgbmFtZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlTdHJpbmcgcGF0aE5hbWUgPSAibm9uZXhpc3RlbnQudHh0IjsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcGF0aE5hbWUpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG5vbi1leGlzdGVudCBmaWxlIG5hbWUiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBub24tZXhpc3RlbnQgZmlsZSBuYW1lIiwgU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JLy8gajJzZSBhbmQgajJtZShjZGMpIGNhbiBsb2FkIGZyb20gYSBmaWxlIG5hbWUgYnV0LCBqMm1lKGNsZGMpIHRocm93cyBhbiBleGNlcHRpb24KLQlpZiAoIWlzSjJNRSgpKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRQYXRoKCJlbXB0eS50eHQiKTsKLQkJCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHBhdGhOYW1lKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZmlsZSBuYW1lIik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGZpbGUgbmFtZSIsIFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQsIGUpOwotCQl9Ci0JCi0JCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQkJZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbnZhbGlkSW1hZ2VGaWxlbmFtZXNbMF07Ci0JCURpc3BsYXlbXSBkaXNwbGF5cyA9IHtkaXNwbGF5LCBudWxsfTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5cy5sZW5ndGg7IGorKykgewotLy8JCQlEaXNwbGF5IHRlbXBEaXNwbGF5ID0gZGlzcGxheXNbal07Ci0JCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRQYXRoKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcGF0aE5hbWUpOwotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZmlsZSBuYW1lIik7Ci0JCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLS8vCQkJCQkgQnVnIDcwMTY3IC0gSW1hZ2UoRGV2aWNlLCBJbnB1dFN0cmVhbSkgdGhyb3dzIGluY29ycmVjdCBleGNlcHRpb24gZm9yIGJhZCBQTkcKLS8vCQkJCQkgcmVtb3ZlIGNvbW1lbnQgd2hlbiBidWcgaXMgZml4ZWQuCi0vLwkJCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBpbWFnZSBmaWxlIG5hbWUiLCBTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRQYXRoKFN3dFRlc3RDYXNlLmludmFsaWRJbWFnZUZpbGVuYW1lc1sxXSk7Ci0JCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBwYXRoTmFtZSk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGZpbGUgbmFtZSIpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBpbWFnZSBmaWxlIG5hbWUiLCBTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSwgZSk7Ci0JCX0JCQotCQotCQkvLyBjcmVhdGUgdmFsaWQgaW1hZ2VzCi0JCWZvciAoaW50IGogPSAwOyBqIDwgZGlzcGxheXMubGVuZ3RoOyBqKyspIHsKLS8vCQkJRGlzcGxheSB0ZW1wRGlzcGxheSA9IGRpc3BsYXlzW2pdOwotCQkJaW50IG51bUZpbGVOYW1lcyA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGs9MDsgazxudW1GaWxlTmFtZXM7IGsrKykgewotCQkJCWZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNba107Ci0JCQkJZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQkJCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQkJCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRQYXRoKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcGF0aE5hbWUpOwotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIGlzRGlzcG9zZWQoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JSW1hZ2UgaW1hZ2UxID0gbnVsbDsKLQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JCWltYWdlMSA9IGltYWdlOwotCQotCQlhc3NlcnRGYWxzZSgiOmE6IiwgaW1hZ2UuZXF1YWxzKG51bGwpKTsKLQkJCi0JCWFzc2VydFRydWUoIjpiOiIsIGltYWdlLmVxdWFscyhpbWFnZTEpKTsKLQkJCi0JCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQlpbWFnZTEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJYXNzZXJ0RmFsc2UoIjpjOiIsIGltYWdlLmVxdWFscyhpbWFnZTEpKTsKLQl9IGZpbmFsbHkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlMS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJaW1hZ2UuZ2V0QmFja2dyb3VuZCgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIiwgU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQsIGUpOwotCX0KLQkvLyByZW1haW5kZXIgdGVzdGVkIGluIHNldEJhY2tncm91bmQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCVJlY3RhbmdsZSBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEwLCAyMCk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiLCBTV1QuRVJST1JfR1JBUEhJQ19ESVNQT1NFRCwgZSk7Ci0JfQotCQkKLQkvLyBjcmVhdGVzIGJpdG1hcCBpbWFnZQotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JUmVjdGFuZ2xlIGJvdW5kczEgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBib3VuZHMsIGJvdW5kczEpOwotCi0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQlib3VuZHMxID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmI6IiwgYm91bmRzLCBib3VuZHMxKTsKLQotCS8vIGNyZWF0ZSBpY29uIGltYWdlCi0JSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JYm91bmRzMSA9IGltYWdlLmdldEJvdW5kcygpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIGJvdW5kcywgYm91bmRzMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VEYXRhKCkgewkKLQlnZXRJbWFnZURhdGExKCk7Ci0JZ2V0SW1hZ2VEYXRhMigyNCwgbmV3IFBhbGV0dGVEYXRhKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpKTsJCQotCWdldEltYWdlRGF0YTIoMzIsIG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHhmZjAwLCAweGZmKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCUltYWdlIGltYWdlMSA9IG51bGw7Ci0KLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCQlpbWFnZTEgPSBpbWFnZTsKLQkKLQkJYXNzZXJ0RXF1YWxzKCI6YToiLCBpbWFnZTEuaGFzaENvZGUoKSwgaW1hZ2UuaGFzaENvZGUoKSk7Ci0JCQotCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJaW1hZ2UxID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCWJvb2xlYW4gZXF1YWxzID0gKGltYWdlMS5oYXNoQ29kZSgpID09IGltYWdlLmhhc2hDb2RlKCkpOwotCQlhc3NlcnRGYWxzZSgiOmI6IiwgZXF1YWxzKTsKLQl9IGZpbmFsbHkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlMS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGphdmFkb2Mgc3RhdGVzOgotCS8vIDxiPklNUE9SVEFOVDo8L2I+IFRoaXMgbWV0aG9kIGlzIDxlbT5ub3Q8L2VtPiBwYXJ0IG9mIHRoZSBwdWJsaWMKLQkvLyBBUEkgZm9yIDxjb2RlPkltYWdlPC9jb2RlPgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gamF2YWRvYyBzdGF0ZXM6Ci0JLy8gPGI+SU1QT1JUQU5UOjwvYj4gVGhpcyBtZXRob2QgaXMgPGVtPm5vdDwvZW0+IHBhcnQgb2YgdGhlIHB1YmxpYwotCS8vIEFQSSBmb3IgPGNvZGU+SW1hZ2U8L2NvZGU+Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCWFzc2VydEZhbHNlKCI6YToiLCBpbWFnZS5pc0Rpc3Bvc2VkKCkpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBpbWFnZS5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0KLQl0cnkgewotCQlpbWFnZS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9IGZpbmFsbHkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JfQotCi0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMjU1KTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJaW1hZ2Uuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGNvbG9yIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgY29sb3IiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfSBmaW5hbGx5IHsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCX0KLQotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyNTUpOwotCXRyeSB7Ci0JCWltYWdlLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIiwgU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQsIGUpOwotCX0gZmluYWxseSB7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLy8gdGhpcyBpbWFnZSBkb2VzIG5vdCBoYXZlIGEgdHJhbnNwYXJlbnQgcGl4ZWwgYnkgZGVmYXVsdCBzbyBzZXRCYWNrZ3JvdW5kIGhhcyBubyBlZmZlY3QKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCWltYWdlLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQljb2xvciA9IGltYWdlLmdldEJhY2tncm91bmQoKTsKLQlhc3NlcnROdWxsKCJiYWNrZ3JvdW5kIGNvbG9yIHNob3VsZCBiZSBudWxsIGZvciBub24tdHJhbnNwYXJlbnQgaW1hZ2UiLCBjb2xvcik7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCQotCS8vIGNyZWF0ZSBhbiBpbWFnZSB3aXRoIHRyYW5zcGFyZW5jeSBhbmQgdGhlbiBzZXQgdGhlIGJhY2tncm91bmQgY29sb3IKLQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDIsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSksIG5ldyBSR0IoNTAsIDEwMCwgMTUwKX0pKTsKLQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IDA7IC8vIHRyYW5zcGFyZW50IHBpeGVsIGlzIGN1cnJlbnRseSBibGFjawotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JaW1hZ2Uuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCWNvbG9yID0gaW1hZ2UuZ2V0QmFja2dyb3VuZCgpOwotCWFzc2VydEVxdWFscygiYmFja2dyb3VuZCBjb2xvciBzaG91bGQgaGF2ZSBiZWVuIHNldCB0byBncmVlbiIsIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSwgY29sb3IpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCXRyeSB7Ci0JCWFzc2VydE5vdE51bGwoaW1hZ2UudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoaW1hZ2UudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotCX0gZmluYWxseSB7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9pb19JbnB1dFN0cmVhbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9pb19JbnB1dFN0cmVhbSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9pb19JbnB1dFN0cmVhbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZCIpKSB0ZXN0X2dldEJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VEYXRhIikpIHRlc3RfZ2V0SW1hZ2VEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJKCk7Ci19Ci0vKiBjdXN0b20gKi8KLURpc3BsYXkgZGlzcGxheTsKLQotLyoqIFRlc3QgaW1wbGVtZW50YXRpb24gKiovCi0KLXZvaWQgZ2V0SW1hZ2VEYXRhMSgpIHsKLQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JU3RyaW5nIGZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbMF07Ci0JZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJSW1hZ2VEYXRhIGRhdGExID0gbmV3IEltYWdlRGF0YShzdHJlYW0pOwotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhMSk7Ci0JCUltYWdlRGF0YSBkYXRhMiA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiSW1hZ2Ugd2lkdGggc2hvdWxkIGJlIHRoZSBzYW1lIiwgZGF0YTEud2lkdGgsIGRhdGEyLndpZHRoKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbWFnZSBoZWlnaHQgc2hvdWxkIGJlIHRoZSBzYW1lIiwgZGF0YTEuaGVpZ2h0LCBkYXRhMi5oZWlnaHQpOwotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNvbnRpbnVlOwotCQl9Ci0JfQotfQotCi0vKgotICogVmVyaWZ5IEltYWdlLmdldEltYWdlRGF0YSByZXR1cm5zIHBpeGVscyB3aXRoIHRoZSBzYW1lIFJHQiB2YWx1ZSBhcyB0aGUKLSAqIHNvdXJjZSBpbWFnZS4gVGhpcyB0ZXN0IG9ubHkgbWFrZXMgc2Vuc2Ugd2l0aCBkZXB0aCBvZiAyNCBhbmQgMzIgYml0cy4KLSAqLwotdm9pZCBnZXRJbWFnZURhdGEyKGludCBkZXB0aCwgUGFsZXR0ZURhdGEgcGFsZXR0ZSkgewotCWludCB3aWR0aCA9IDEwOwotCWludCBoZWlnaHQgPSAxMDsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAweGZmLCAwKTsKLQlSR0IgY29sb3JSR0IgPSBjb2xvci5nZXRSR0IoKTsKLQotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBwYWxldHRlKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQkKLQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAxMCwgMTApOwotCQkKLQlJbWFnZURhdGEgbmV3RGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCVBhbGV0dGVEYXRhIG5ld1BhbGV0dGUgPSBuZXdEYXRhLnBhbGV0dGU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKLQkJCWludCBwaXhlbCA9IG5ld0RhdGEuZ2V0UGl4ZWwoaSwgaik7Ci0JCQlSR0IgcmdiID0gbmV3UGFsZXR0ZS5nZXRSR0IocGl4ZWwpOwotCQkJYXNzZXJ0VHJ1ZSgicmdiLmVxdWFscyhjb2xvclJHQikiLCByZ2IuZXF1YWxzKGNvbG9yUkdCKSk7Ci0JCX0KLQl9Ci0JY29sb3IuZGlzcG9zZSgpOwotCWdjLmRpc3Bvc2UoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci1TdHJpbmcgZ2V0UGF0aChTdHJpbmcgZmlsZU5hbWUpIHsKLQlTdHJpbmcgdXJsUGF0aDsKLQkKLQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQl9Ci0JaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgewotCQlVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKGZpbGVOYW1lKTsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQlmYWlsKCJVUkwgPT0gbnVsbCBmb3IgZmlsZSAiICsgZmlsZU5hbWUpOwotCQl9Ci0JCXVybFBhdGggPSB1cmwuZ2V0RmlsZSgpOwotCX0gZWxzZSB7Ci0JCXVybFBhdGggPSBwbHVnaW5QYXRoICsgIi9kYXRhLyIgKyBmaWxlTmFtZTsKLQl9Ci0JCi0JaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHVybFBhdGggPSB1cmxQYXRoLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwkKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzICYmIHVybFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpID09IDApIHVybFBhdGggPSB1cmxQYXRoLnN1YnN0cmluZygxKTsKLQl1cmxQYXRoID0gdXJsUGF0aC5yZXBsYWNlQWxsKCIlMjAiLCAiICIpOwkKLQkKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc29sdmVkIGZpbGUgbmFtZSBmb3IgIiArIGZpbGVOYW1lICsgIiA9ICIgKyB1cmxQYXRoKTsKLQl9Ci0JcmV0dXJuIHVybFBhdGg7Ci19Ci1SR0IgZ2V0UmVhbFJHQihDb2xvciBjb2xvcikgewotCUltYWdlIGNvbG9ySW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlHQyBpbWFnZUdjID0gbmV3IEdDKGNvbG9ySW1hZ2UpOwotCUltYWdlRGF0YSBpbWFnZURhdGE7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZTsKLQlpbnQgcGl4ZWw7Ci0JCi0JaW1hZ2VHYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlpbWFnZUdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCWltYWdlR2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAxMCwgMTApOwotCWltYWdlRGF0YSA9IGNvbG9ySW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JcGFsZXR0ZSA9IGltYWdlRGF0YS5wYWxldHRlOwotCWltYWdlR2MuZGlzcG9zZSgpOwotCWNvbG9ySW1hZ2UuZGlzcG9zZSgpOwotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApOwotCXJldHVybiBwYWxldHRlLmdldFJHQihwaXhlbCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2YmM2NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhKCkgewotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoLTEsIDEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAtMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCAxLCBudWxsLCAwLCBuZXcgYnl0ZVtdIHswLCAweDRmLCAweDRmLCAwfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhbGV0dGVEYXRhID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgMywgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdW5zdXBwb3J0ZWQgZGVwdGgiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlpbnRbXSB2YWxpZERlcHRocyA9IHsxLCAyLCA0LCA4LCAxNiwgMjQsIDMyfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkRGVwdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgdmFsaWREZXB0aHNbaV0sIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQigpIHsKLQlieXRlW10gdmFsaWREYXRhID0gbmV3IGJ5dGVbXSB7MCwgMHg0ZiwgMHg0ZiwgMH07Ci0JCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgtMSwgMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCB2YWxpZERhdGEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgLTEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgdmFsaWREYXRhKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCAxLCBudWxsLCAwLCB2YWxpZERhdGEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYWxldHRlRGF0YSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRhdGEgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIG5ldyBieXRlW10ge30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkYXRhIGFycmF5IHRvbyBzbWFsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCAxNiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCBuZXcgYnl0ZVtdIHsweDRmfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRhdGEgYXJyYXkgdG9vIHNtYWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDMyLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIG5ldyBieXRlW10gezB4NGYsIDB4NGZ9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGF0YSBhcnJheSB0b28gc21hbGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMiwgMiwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCBuZXcgYnl0ZVtdIHsweDRmLCAweDRmLCAweDRmfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRhdGEgYXJyYXkgdG9vIHNtYWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDMsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgdmFsaWREYXRhKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdW5zdXBwb3J0ZWQgZGVwdGgiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvLyB2ZXJpZnkgYWxsIHZhbGlkIGRlcHRocwotCWludFtdIHZhbGlkRGVwdGhzID0gezEsIDIsIDQsIDgsIDE2LCAyNCwgMzJ9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWREZXB0aHMubGVuZ3RoOyBpKyspIHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCB2YWxpZERlcHRoc1tpXSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCB2YWxpZERhdGEpOwotCX0KLQkKLQkvLyB2ZXJpZnkgbm8gZGl2aWRlIGJ5IHplcm8gZXhjZXB0aW9uIGlmIHNjYW5saW5lUGFkID09IDAKLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMCwgdmFsaWREYXRhKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2NhbmxpbmVQYWQgPT0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQl0cnkgewotCQkJbmV3IEltYWdlRGF0YShzdHJlYW0pOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW5wdXRTdHJlYW0gPT0gbnVsbCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCQotCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlbXB0eS50eHQiKTsKLQkJdHJ5IHsKLQkJCW5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgSW5wdXRTdHJlYW0iKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJfQotCQotCQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdOwotCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQluZXcgSW1hZ2VEYXRhKHN0cmVhbSk7Ci0JCX0KLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoZmlsZW5hbWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBmaWxlbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gajJzZSBhbmQgajJtZShjZGMpIGNhbiBsb2FkIGZyb20gYSBmaWxlbmFtZSBidXQsIGoybWUoY2xkYykgdGhyb3dzIGFuIGV4Y2VwdGlvbgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewotCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JdHJ5IHsKLQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1swXSArICIuIiArIFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1swXSk7Ci0JCUltYWdlRGF0YSBkYXRhMSA9IG5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJSW1hZ2VEYXRhIGRhdGEyID0gKEltYWdlRGF0YSkgZGF0YTEuY2xvbmUoKTsKLQkJLy8gaW1hZ2VEYXRhIGRvZXMgbm90IGltcGxlbWVudCBhbiBlcXVhbHMoT2JqZWN0KSBtZXRob2QKLQkJYXNzZXJ0RXF1YWxzKCI6YToiLCBkYXRhMS5hbHBoYSwgZGF0YTIuYWxwaGEpOwotCQlhc3NlcnRFcXVhbHMoIjpiOiIsIGRhdGExLmFscGhhRGF0YSwgZGF0YTIuYWxwaGFEYXRhKTsKLQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCBkYXRhMS5ieXRlc1BlckxpbmUsIGRhdGEyLmJ5dGVzUGVyTGluZSk7Ci0JCWFzc2VydEVxdWFscygiOmQ6IiwgZGF0YTEuZGF0YSwgZGF0YTIuZGF0YSk7Ci0JCWFzc2VydEVxdWFscygiOmU6IiwgZGF0YTEuZGVsYXlUaW1lLCBkYXRhMi5kZWxheVRpbWUpOwotCQlhc3NlcnRFcXVhbHMoIjpmOiIsIGRhdGExLmRlcHRoLCBkYXRhMi5kZXB0aCk7Ci0JCWFzc2VydEVxdWFscygiOmc6IiwgZGF0YTEuZGlzcG9zYWxNZXRob2QsIGRhdGEyLmRpc3Bvc2FsTWV0aG9kKTsKLQkJYXNzZXJ0RXF1YWxzKCI6aDoiLCBkYXRhMS5oZWlnaHQsIGRhdGEyLmhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiOmk6IiwgZGF0YTEubWFza0RhdGEsIGRhdGEyLm1hc2tEYXRhKTsKLQkJYXNzZXJ0RXF1YWxzKCI6ajoiLCBkYXRhMS5tYXNrUGFkLCBkYXRhMi5tYXNrUGFkKTsKLQkJYXNzZXJ0RXF1YWxzKCI6azoiLCBkYXRhMS5wYWxldHRlLCBkYXRhMi5wYWxldHRlKTsKLQkJYXNzZXJ0RXF1YWxzKCI6bDoiLCBkYXRhMS5zY2FubGluZVBhZCwgZGF0YTIuc2NhbmxpbmVQYWQpOwotCQlhc3NlcnRFcXVhbHMoIjptOiIsIGRhdGExLnRyYW5zcGFyZW50UGl4ZWwsIGRhdGEyLnRyYW5zcGFyZW50UGl4ZWwpOwotCQlhc3NlcnRFcXVhbHMoIjpuOiIsIGRhdGExLnR5cGUsIGRhdGEyLnR5cGUpOwotCQlhc3NlcnRFcXVhbHMoIjpvOiIsIGRhdGExLndpZHRoLCBkYXRhMi53aWR0aCk7Ci0JCWFzc2VydEVxdWFscygiOnA6IiwgZGF0YTEueCwgZGF0YTIueCk7Ci0JCWFzc2VydEVxdWFscygiOnE6IiwgZGF0YTEueSwgZGF0YTIueSk7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFscGhhSUkoKSB7Ci0JaW50IHZhbHVlOwotCQotCWFzc2VydEVxdWFscygiOmE6IiwgMjU1LCBpbWFnZURhdGEuZ2V0QWxwaGEoMCwgMCkpOwotCXZhbHVlID0gMHhBQTsKLQlpbWFnZURhdGEuc2V0QWxwaGEoMCwgMCwgdmFsdWUpOwotCWFzc2VydEVxdWFscygiOmI6IiwgdmFsdWUsIGltYWdlRGF0YS5nZXRBbHBoYSgwLCAwKSk7Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGEoLTEsIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYShJTUFHRV9ESU1FTlNJT04sIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYSgwLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhKDAsIElNQUdFX0RJTUVOU0lPTik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxwaGFzSUlJJEJJKCkgewotCWJ5dGUgdmFsdWU7Ci0JZmluYWwgaW50IFNJWkUgPSAyMDsgCi0JZmluYWwgaW50IEdFVF9XSURUSCA9IDEwOwotCWZpbmFsIGludCBPRkZTRVQgPSAxMDsKLQlieXRlW10gYWxwaGFEYXRhID0gbmV3IGJ5dGVbU0laRV07Ci0JCi0JaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFscGhhRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmE6IiwgMCwgYWxwaGFEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgKGJ5dGUpIDI1NSwgYWxwaGFEYXRhW2ldKTsKLQkJfQotCX0KLQotCXZhbHVlID0gKGJ5dGUpIDB4QUE7Ci0JYnl0ZVtdIHZhbHVlcyA9IG5ldyBieXRlW10ge3ZhbHVlLCAoYnl0ZSkgKHZhbHVlKzEpLCAoYnl0ZSkgKHZhbHVlKzIpLCAoYnl0ZSkgKHZhbHVlKzMpLCAoYnl0ZSkgKHZhbHVlKzQpfTsKLQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFscGhhRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCAwLCBhbHBoYURhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpkOiIsIChieXRlKSB2YWx1ZXNbaS1PRkZTRVRdLCBhbHBoYURhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZToiLCAwLCBhbHBoYURhdGFbaV0pOwotCQl9Ci0JfQotCQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgR0VUX1dJRFRIKkdFVF9XSURUSCwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBnZXRXaWR0aCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgR0VUX1dJRFRILCAoYnl0ZVtdKSBudWxsLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhbHBoYXMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFscGhhcyA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGFzKC0xLCAxLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGFzKElNQUdFX0RJTUVOU0lPTiwgMSwgR0VUX1dJRFRILCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhcygwLCAtMSwgR0VUX1dJRFRILCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhcygwLCBJTUFHRV9ESU1FTlNJT04sIEdFVF9XSURUSCwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgLTEsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGl4ZWxJSSgpIHsKLQlpbnQgdmFsdWU7Ci0JCi0JYXNzZXJ0RXF1YWxzKCI6YToiLCAwLCBpbWFnZURhdGEuZ2V0UGl4ZWwoMCwgMCkpOwotCXZhbHVlID0gMHhBQTsKLQlpbWFnZURhdGEuc2V0UGl4ZWwoMCwgMCwgdmFsdWUpOwotCWFzc2VydEVxdWFscygiOmI6IiwgdmFsdWUsIGltYWdlRGF0YS5nZXRQaXhlbCgwLCAwKSk7Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWwoLTEsIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbChJTUFHRV9ESU1FTlNJT04sIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbCgwLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVsKDAsIElNQUdFX0RJTUVOU0lPTik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JaW50IHdpZHRoID0gMzsKLQlpbnQgaGVpZ2h0ID0gMzsKLQlpbnQgZGVwdGggPSA0OwotCWJ5dGUgcGl4ZWxWYWx1ZSA9IDE7Ci0JYnl0ZVtdIGRhdGEgPSB7KGJ5dGUpICgocGl4ZWxWYWx1ZSA8PCA0KSArIHBpeGVsVmFsdWUpLCAoYnl0ZSkgKHBpeGVsVmFsdWUgPDwgNCksIChieXRlKSAoKHBpeGVsVmFsdWUgPDwgNCkgKyBwaXhlbFZhbHVlKSwgKGJ5dGUpIChwaXhlbFZhbHVlIDw8IDQpLCAoYnl0ZSkgKChwaXhlbFZhbHVlIDw8IDQpICsgcGl4ZWxWYWx1ZSksIChieXRlKSAocGl4ZWxWYWx1ZSA8PCA0KX07IAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgZGVwdGgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMjU1KSwgbmV3IFJHQigxMTEsIDExMSwgMTExKX0pLCAxLCBkYXRhKTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewotCQkJaW50IHBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKHgsIHkpOwotCQkJYXNzZXJ0RXF1YWxzKCJCYWQgcGl4ZWwgZGF0YSIsIHBpeGVsVmFsdWUsIHBpeGVsKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQaXhlbHNJSUkkQkkoKSB7Ci0JZmluYWwgaW50IFNJWkUgPSAyMDsgCi0JZmluYWwgaW50IEdFVF9XSURUSCA9IDEwOwotCWZpbmFsIGludCBPRkZTRVQgPSAxMDsKLQlieXRlW10gcGl4ZWxEYXRhID0gbmV3IGJ5dGVbU0laRV07Ci0KLQkvLyB0ZXN0IDEgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOmE6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQlieXRlW10gdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDIsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjplOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MiwgMHgzLCAweDIsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmY6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZzoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmg6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA0LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6aToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDIsIDB4MywgMHg0LCAweEZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpqOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOms6IiwgKGJ5dGUpIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpsOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDggYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOm06IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgyLCAweDMsIDB4RiwgKGJ5dGUpMHhGRn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOm46IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bzoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOnA6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQkKLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCpHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgKGJ5dGVbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygtMSwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgLTEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7CQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZGVwdGgiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGRlcHRoIiwgU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRILCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGl4ZWxzSUlJJElJKCkgewotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBHRVRfV0lEVEggPSAxMDsKLQlmaW5hbCBpbnQgT0ZGU0VUID0gMTA7Ci0JaW50W10gcGl4ZWxEYXRhID0gbmV3IGludFtTSVpFXTsKLQotCS8vIHRlc3QgMSBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6YToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCWludFtdIHZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpkOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOmU6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDIsIDB4MywgMHgyLCAweDF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpmOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmc6IiwgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmg6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA0LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6aToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MiwgMHgzLCAweDQsIDB4Rn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmo6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6azoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA4IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjptOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgyLCAweDMsIDB4RiwgMHhGRn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOm46IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bzoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6cDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAxNiBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxNiwgbmV3IFBhbGV0dGVEYXRhKDB4RjgwMCwgMHg3RTAsIDB4MUYpKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjpxOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGludFtdezAsIDB4MiwgMHhGLCAweEZGLCAweEZGQUF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpyOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOnM6IiwgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOnQ6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMjQgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMjQsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6dToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweEZGLCAweEZGQUEsIDB4RkYwMEFBfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6djoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjp3OiIsIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjp4OiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDMyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDMyLCBuZXcgUGFsZXR0ZURhdGEoMHhGRjAwMDAwMCwgMHhGRjAwLCAweEZGKSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6eToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweEZGLCAweEZGQUEsIDB4RkYwMEFBMDB9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjp6OiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmFhOiIsIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphYjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgqR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIChpbnRbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygtMSwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgLTEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCcygpIHsKLQlhc3NlcnROdWxsKCI6YToiLCBpbWFnZURhdGEuZ2V0UkdCcygpKTsKLQlSR0JbXSByZ2JzID0gbmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9OwotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDgsIG5ldyBQYWxldHRlRGF0YShyZ2JzKSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCByZ2JzLCBpbWFnZURhdGEuZ2V0UkdCcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc3BhcmVuY3lNYXNrKCkgewotLy8JQnVnIDcxNDcyIC0gdHJhbnNwYXJlbmN5IG1hc2sgc2hvdWxkIGJlIG51bGwJCi0vLwlhc3NlcnROdWxsKCI6YToiLCBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzaygpKTsKLQotCUlucHV0U3RyZWFtIHN0cmVhbSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh0cmFuc3BhcmVudEltYWdlRmlsZW5hbWVzWzBdKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldERlZmF1bHQoKSwgc3RyZWFtKTsKLQl0cnkgewotCQlzdHJlYW0uY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCWltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCUltYWdlRGF0YSBtYXNrRGF0YSA9IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JYXNzZXJ0Tm90TnVsbCgiOmI6IiwgbWFza0RhdGEpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQotLy8JQnVnIDcxNDcyIC0gdHJhbnNwYXJlbmN5IG1hc2sgc2hvdWxkIGJlIG51bGwJCi0vKglpbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldERlZmF1bHQoKSwgZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGltYWdlRmlsZW5hbWVzWzBdICsgJy4nICsgaW1hZ2VGb3JtYXRzW2ltYWdlRm9ybWF0cy5sZW5ndGgtMV0pKTsKLQlpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQltYXNrRGF0YSA9IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JYXNzZXJ0TnVsbCgiOmM6IiwgbWFza0RhdGEpOwotKi8JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VHJhbnNwYXJlbmN5VHlwZSgpIHsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIFNXVC5UUkFOU1BBUkVOQ1lfTk9ORSwgaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSk7Ci0KLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0odHJhbnNwYXJlbnRJbWFnZUZpbGVuYW1lc1swXSk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXREZWZhdWx0KCksIHN0cmVhbSk7Ci0JdHJ5IHsKLQkJc3RyZWFtLmNsb3NlKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQlpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlhc3NlcnRGYWxzZSgiOmI6IiwgU1dULlRSQU5TUEFSRU5DWV9OT05FID09IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lUeXBlKCkpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQkKLQlzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oaW1hZ2VGaWxlbmFtZXNbMF0gKyAnLicgKyBpbWFnZUZvcm1hdHNbaW1hZ2VGb3JtYXRzLmxlbmd0aC0xXSk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXREZWZhdWx0KCksIHN0cmVhbSk7Ci0JdHJ5IHsKLQkJc3RyZWFtLmNsb3NlKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQlpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIFNXVC5UUkFOU1BBUkVOQ1lfTk9ORSwgaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld0lJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEJJJEIkQklJSUlJSUkoKSB7Ci0JLy8gZG8gbm90IHRlc3QgaW50ZXJuYWwgQVBJCi0JLy8gamF2YWRvYyBzdGF0ZXM6Ci0JLy8gPGI+SU1QT1JUQU5UOjwvYj4gVGhpcyBtZXRob2QgaXMgPGVtPm5vdDwvZW0+IHBhcnQgb2YgdGhlIHB1YmxpYwotCS8vIEFQSSBmb3IgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPi4gSXQgaXMgbWFya2VkIHB1YmxpYyBvbmx5IHNvIHRoYXQgaXQKLQkvLyBjYW4gYmUgc2hhcmVkIHdpdGhpbiB0aGUgcGFja2FnZXMgcHJvdmlkZWQgYnkgU1dULiBJdCBpcyBzdWJqZWN0Ci0JLy8gdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmcm9tCi0JLy8gYXBwbGljYXRpb24gY29kZS4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zY2FsZWRUb0lJKCkgewotCWZpbmFsIGludCBpbWFnZURpbWVuc2lvbiA9IDg7Ci0JUkdCW10gcmdicyA9IG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfTsKLQlieXRlW10gcGl4ZWxEYXRhID0gbmV3IGJ5dGVbKGltYWdlRGltZW5zaW9uKmltYWdlRGltZW5zaW9uKSAvIDhdOwotCQotCXBpeGVsRGF0YVswXSA9IDB4NEY7Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShpbWFnZURpbWVuc2lvbiwgaW1hZ2VEaW1lbnNpb24sIDEsIG5ldyBQYWxldHRlRGF0YShyZ2JzKSwgMSwgcGl4ZWxEYXRhKTsKLQotCUltYWdlRGF0YSBzY2FsZWRJbWFnZURhdGEgPSBpbWFnZURhdGEuc2NhbGVkVG8oLWltYWdlRGltZW5zaW9uLCAtaW1hZ2VEaW1lbnNpb24pOwotCWJ5dGVbXSBzY2FsZWRQaXhlbERhdGEgPSBuZXcgYnl0ZVtpbWFnZURpbWVuc2lvbl07Ci0Jc2NhbGVkSW1hZ2VEYXRhLmdldFBpeGVscygwLCBpbWFnZURpbWVuc2lvbiAtIDEsIHNjYWxlZFBpeGVsRGF0YS5sZW5ndGgsIHNjYWxlZFBpeGVsRGF0YSwgMCk7CQotCWJ5dGVbXSBleHBlY3RlZFBpeGVsRGF0YSA9IG5ldyBieXRlW10gezB4MSwgMHgxLCAweDEsIDB4MSwgMCwgMCwgMHgxLCAwfTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIGV4cGVjdGVkUGl4ZWxEYXRhLCBzY2FsZWRQaXhlbERhdGEpOwotCi0Jc2NhbGVkSW1hZ2VEYXRhID0gaW1hZ2VEYXRhLnNjYWxlZFRvKGltYWdlRGltZW5zaW9uICogMTAsIGltYWdlRGltZW5zaW9uKTsKLQlzY2FsZWRQaXhlbERhdGEgPSBuZXcgYnl0ZVtpbWFnZURpbWVuc2lvbiAqIDEwXTsKLQlzY2FsZWRJbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDAsIHNjYWxlZFBpeGVsRGF0YS5sZW5ndGgsIHNjYWxlZFBpeGVsRGF0YSwgMCk7CQotCWFzc2VydEVxdWFscygiOmI6IiwgMCwgc2NhbGVkUGl4ZWxEYXRhWzBdKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIDAsIHNjYWxlZFBpeGVsRGF0YVsxXSk7Ci0KLQlzY2FsZWRJbWFnZURhdGEgPSBpbWFnZURhdGEuc2NhbGVkVG8oaW1hZ2VEaW1lbnNpb24sIGltYWdlRGltZW5zaW9uICogMTApOwotCXNjYWxlZFBpeGVsRGF0YSA9IG5ldyBieXRlW2ltYWdlRGltZW5zaW9uXTsKLQlzY2FsZWRJbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDAsIHNjYWxlZFBpeGVsRGF0YS5sZW5ndGgsIHNjYWxlZFBpeGVsRGF0YSwgMCk7CQotCWV4cGVjdGVkUGl4ZWxEYXRhID0gbmV3IGJ5dGVbXSB7MCwgMHgxLCAwLCAwLCAweDEsIDB4MSwgMHgxLCAweDF9OwotCWFzc2VydEVxdWFscygiOmQ6IiwgZXhwZWN0ZWRQaXhlbERhdGEsIHNjYWxlZFBpeGVsRGF0YSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxwaGFJSUkoKSB7Ci0JaW50IHZhbHVlOwotCQotCXZhbHVlID0gMHhBQTsKLQlpbWFnZURhdGEuc2V0QWxwaGEoMCwgMCwgdmFsdWUpOwotCWFzc2VydEVxdWFscygiOmE6IiwgdmFsdWUsIGltYWdlRGF0YS5nZXRBbHBoYSgwLCAwKSk7Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGEoLTEsIDEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGEoSU1BR0VfRElNRU5TSU9OLCAxLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhKDAsIC0xLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhKDAsIElNQUdFX0RJTUVOU0lPTiwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFscGhhc0lJSSRCSSgpIHsKLQlieXRlIHZhbHVlOwotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBPRkZTRVQgPSAxOwotCWJ5dGVbXSBhbHBoYURhdGEgPSBuZXcgYnl0ZVtTSVpFXTsKLQkKLQl2YWx1ZSA9IChieXRlKSAweEFBOwotCWJ5dGVbXSB2YWx1ZXMgPSBuZXcgYnl0ZVtdIHt2YWx1ZSwgKGJ5dGUpICh2YWx1ZSsxKSwgKGJ5dGUpICh2YWx1ZSsyKSwgKGJ5dGUpICh2YWx1ZSszKSwgKGJ5dGUpICh2YWx1ZSs0KX07Ci0JaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYURhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphOiIsIChieXRlKSB2YWx1ZXNbaSArIE9GRlNFVF0sIGFscGhhRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpiOiIsIDAsIGFscGhhRGF0YVtpXSk7Ci0JCX0KLQl9Ci0JCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCBJTUFHRV9ESU1FTlNJT04qSU1BR0VfRElNRU5TSU9OLCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIChieXRlW10pIG51bGwsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFscGhhcyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgYWxwaGFzID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYXMoLTEsIDEsIElNQUdFX0RJTUVOU0lPTiwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYXMoSU1BR0VfRElNRU5TSU9OLCAxLCBJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIC0xLCBJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCAtMSwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCA8IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQaXhlbElJSSgpIHsKLQlpbnQgdmFsdWU7Ci0JCi0JdmFsdWUgPSAweEFBOwotCWltYWdlRGF0YS5zZXRQaXhlbCgwLCAwLCB2YWx1ZSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCB2YWx1ZSwgaW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApKTsKLQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbCgtMSwgMSwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbChJTUFHRV9ESU1FTlNJT04sIDEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWwoMCwgLTEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWwoMCwgSU1BR0VfRElNRU5TSU9OLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGl4ZWxzSUlJJEJJKCkgewotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBPRkZTRVQgPSAxOwotCWJ5dGVbXSBwaXhlbERhdGEgPSBuZXcgYnl0ZVtTSVpFXTsKLQotCS8vIHRlc3QgMSBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JYnl0ZVtdIHZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDEsIDB4MSwgMHgxLCAweDF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YToiLCAoYnl0ZSkgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6YjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDIsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQl2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgyLCAweDMsIDB4MiwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmM6IiwgKGJ5dGUpIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmQ6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA0LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MiwgMHgzLCAweDQsIDB4Rn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjplOiIsIChieXRlKSB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpmOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDggYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCXZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDIsIDB4MywgMHhGLCAoYnl0ZSkweEZGfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmc6IiwgKGJ5dGUpIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmg6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQkKLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTipJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgKGJ5dGVbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygtMSwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgLTEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7CQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZGVwdGgiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGRlcHRoIiwgU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRILCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGl4ZWxzSUlJJElJKCkgewotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBPRkZTRVQgPSAxOwotCWludFtdIHBpeGVsRGF0YSA9IG5ldyBpbnRbU0laRV07Ci0KLQkvLyB0ZXN0IDEgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWludFtdIHZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphOiIsIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMiBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAyLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgyLCAweDMsIDB4MiwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmM6IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA0IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDQsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDIsIDB4MywgMHg0LCAweEZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZToiLCB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpmOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDggYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCXZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MiwgMHgzLCAweEYsIDB4RkZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZzoiLCB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpoOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDE2IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDE2LCBuZXcgUGFsZXR0ZURhdGEoMHhGODAwLCAweDdFMCwgMHgxRikpOwotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweDIsIDB4RiwgMHhGRiwgMHhGRkFBfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmk6IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6ajoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAyNCwgbmV3IFBhbGV0dGVEYXRhKDB4RkYwMDAwLCAweEZGMDAsIDB4RkYpKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MCwgMHhGRiwgMHhGRkFBLCAweEZGMDBBQX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjprOiIsIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmw6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMzIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMDAwLCAweEZGMDAsIDB4RkYpKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MCwgMHhGRiwgMHhGRkFBLCAweEZGMDBBQTAwfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOm06IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6bjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04qSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIChpbnRbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygtMSwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgLTEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvbmUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFscGhhSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFscGhhc0lJSSRCSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGl4ZWxJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGl4ZWxzSUlJJEJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQaXhlbHNJSUkkSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJHQnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRyYW5zcGFyZW5jeU1hc2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRyYW5zcGFyZW5jeVR5cGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld0lJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEJJJEIkQklJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NjYWxlZFRvSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFscGhhSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbHBoYXNJSUkkQkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFBpeGVsSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQaXhlbHNJSUkkQkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFBpeGVsc0lJSSRJSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQiIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9uZSIpKSB0ZXN0X2Nsb25lKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBbHBoYUlJIikpIHRlc3RfZ2V0QWxwaGFJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxwaGFzSUlJJEJJIikpIHRlc3RfZ2V0QWxwaGFzSUlJJEJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQaXhlbElJIikpIHRlc3RfZ2V0UGl4ZWxJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGl4ZWxzSUlJJEJJIikpIHRlc3RfZ2V0UGl4ZWxzSUlJJEJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQaXhlbHNJSUkkSUkiKSkgdGVzdF9nZXRQaXhlbHNJSUkkSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQnMiKSkgdGVzdF9nZXRSR0JzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUcmFuc3BhcmVuY3lNYXNrIikpIHRlc3RfZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VHJhbnNwYXJlbmN5VHlwZSIpKSB0ZXN0X2dldFRyYW5zcGFyZW5jeVR5cGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld0lJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEJJJEIkQklJSUlJSUkiKSkgdGVzdF9pbnRlcm5hbF9uZXdJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhSSRCSSRCJEJJSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zY2FsZWRUb0lJIikpIHRlc3Rfc2NhbGVkVG9JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxwaGFJSUkiKSkgdGVzdF9zZXRBbHBoYUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxwaGFzSUlJJEJJIikpIHRlc3Rfc2V0QWxwaGFzSUlJJEJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQaXhlbElJSSIpKSB0ZXN0X3NldFBpeGVsSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQaXhlbHNJSUkkQkkiKSkgdGVzdF9zZXRQaXhlbHNJSUkkQkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBpeGVsc0lJSSRJSSIpKSB0ZXN0X3NldFBpeGVsc0lJSSRJSSgpOwotfQotLyogY3VzdG9tICovCi1JbWFnZURhdGEgaW1hZ2VEYXRhOwotZmluYWwgaW50IElNQUdFX0RJTUVOU0lPTiA9IDEwOwotCi12b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgYnl0ZSBleHBlY3RlZFtdLCBieXRlIGFjdHVhbFtdKSB7Ci0JaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpCi0JCXJldHVybjsKLQlib29sZWFuIGVxdWFsID0gZmFsc2U7Ci0JaWYgKGV4cGVjdGVkICE9IG51bGwgJiYgYWN0dWFsICE9IG51bGwgJiYgZXhwZWN0ZWQubGVuZ3RoID09IGFjdHVhbC5sZW5ndGgpIHsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQllcXVhbCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChleHBlY3RlZFtpXSAhPSBhY3R1YWxbaV0pIHsKLQkJCQllcXVhbCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCWlmICghZXF1YWwpIHsKLQkJU3RyaW5nIGZvcm1hdHRlZD0gIiI7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpCi0JCQlmb3JtYXR0ZWQ9IG1lc3NhZ2UrIiAiOwotCQlmYWlsKGZvcm1hdHRlZCsiZXhwZWN0ZWQ6PCIrZXhwZWN0ZWQrIj4gYnV0IHdhczo8IithY3R1YWwrIj4iKTsKLQl9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyODkwZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCW5ldyBJbWFnZUxvYWRlcigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIoKSB7Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JSW1hZ2VMb2FkZXJMaXN0ZW5lciBsb2FkZXJMaXN0ZW5lciA9IG5ldyBJbWFnZUxvYWRlckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBpbWFnZURhdGFMb2FkZWQoSW1hZ2VMb2FkZXJFdmVudCBlKSB7Ci0JCQlsb2FkZXJMaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCWxvYWRlci5hZGRJbWFnZUxvYWRlckxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRJbWFnZUxvYWRlckxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RmFsc2UoIjphOiIsIGxvYWRlci5oYXNMaXN0ZW5lcnMoKSk7Ci0JbG9hZGVyLmFkZEltYWdlTG9hZGVyTGlzdGVuZXIobG9hZGVyTGlzdGVuZXIpOwotCWFzc2VydFRydWUoIjpiOiIsIGxvYWRlci5oYXNMaXN0ZW5lcnMoKSk7Ci0KLQlsb2FkZXJMaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCUlucHV0U3RyZWFtIHN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImludGVybGFjZWRfdGFyZ2V0LnBuZyIpOwkKLQlsb2FkZXIubG9hZChzdHJlYW0pOwotCXRyeSB7Ci0JCXN0cmVhbS5jbG9zZSgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgbG9hZGVyTGlzdGVuZXJDYWxsZWQpOwotCi0JbG9hZGVyTGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ0YXJnZXQucG5nIik7CQotCWxvYWRlci5sb2FkKHN0cmVhbSk7Ci0JdHJ5IHsKLQkJc3RyZWFtLmNsb3NlKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQlhc3NlcnRGYWxzZSgiOmQ6IiwgbG9hZGVyTGlzdGVuZXJDYWxsZWQpOwotCi0JbG9hZGVyTGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlsb2FkZXIubm90aWZ5TGlzdGVuZXJzKG5ldyBJbWFnZUxvYWRlckV2ZW50KGxvYWRlciwgbG9hZGVyLmRhdGFbMF0sIDAsIHRydWUpKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBsb2FkZXJMaXN0ZW5lckNhbGxlZCk7Ci0KLQlsb2FkZXIucmVtb3ZlSW1hZ2VMb2FkZXJMaXN0ZW5lcihsb2FkZXJMaXN0ZW5lcik7Ci0JYXNzZXJ0RmFsc2UoIjpmOiIsIGxvYWRlci5oYXNMaXN0ZW5lcnMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzTGlzdGVuZXJzKCkgewotCS8vIHRlc3RlZCBpbiBhZGRJbWFnZUxvYWRlckxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xvYWRMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKLQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIubG9hZChzdHJlYW0pOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbG9hZCBpbnB1dFN0cmVhbSA9PSBudWxsIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImVtcHR5LnR4dCIpOwotCQl0cnkgewotCQkJbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbG9hZCBmcm9tIGludmFsaWQgaW5wdXRTdHJlYW0iKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJfQotCQotCQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdOwotCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQlsb2FkZXIubG9hZChzdHJlYW0pOwotCQkJdHJ5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbG9hZExqYXZhX2xhbmdfU3RyaW5nKCkgewotCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCVN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JdHJ5IHsKLQkJbG9hZGVyLmxvYWQoZmlsZW5hbWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsb2FkIGZpbGVuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyBqMnNlIGFuZCBqMm1lKGNkYykgY2FuIGxvYWQgZnJvbSBhIGZpbGVuYW1lIGJ1dCwgajJtZShjbGRjKSB0aHJvd3MgYW4gZXhjZXB0aW9uCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfbm90aWZ5TGlzdGVuZXJzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50KCkgewotCS8vIHRlc3RlZCBpbiBhZGRJbWFnZUxvYWRlckxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZEltYWdlTG9hZGVyTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2F2ZUxqYXZhX2lvX091dHB1dFN0cmVhbUkoKSB7Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG51bGw7Ci0JSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIuc2F2ZShvdXRTdHJlYW0sIDApOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2F2ZSBvdXRwdXRTdHJlYW0gPT0gbnVsbCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCi0JCW91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCWxvYWRlci5zYXZlKG91dFN0cmVhbSwgLTEpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2F2ZSB0byBpbnZhbGlkIG91dHB1dFN0cmVhbSBmb3JtYXQiKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJfQotCQlib29sZWFuIGpwZ1N1cHBvcnRlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpPTA7IGk8aW1hZ2VGb3JtYXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaW1hZ2VGb3JtYXRzW2ldLmVxdWFscygianBnIikpIHsKLQkJCQlqcGdTdXBwb3J0ZWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChqcGdTdXBwb3J0ZWQpIHsKLQkJCVN0cmluZyBmaWxlbmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdOwotCQkJLy8gbXVzdCB1c2UganBnIHNpbmNlIHNhdmUgaXMgbm90IGltcGxlbWVudGVkIHlldCBpbiBwbmcgZm9ybWF0CQkKLQkJCVN0cmluZyBmaWxldHlwZSA9ICJqcGciOwotCQkJaW5TdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVuYW1lICsgIi4iICsgZmlsZXR5cGUpOwkKLQkJCWxvYWRlci5sb2FkKGluU3RyZWFtKTsKLQkJCXRyeSB7Ci0JCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlRm9ybWF0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpbWFnZUZvcm1hdHNbaV0uZXF1YWxzKGZpbGV0eXBlKSkgewotCQkJCQkvLyBzYXZlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQKLQkJCQkJbG9hZGVyLnNhdmUob3V0U3RyZWFtLCBpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCW91dFN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NhdmVMamF2YV9sYW5nX1N0cmluZ0koKSB7Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKLQl0cnkgewotCQlsb2FkZXIuc2F2ZShmaWxlbmFtZSwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNhdmUgZmlsZW5hbWUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIGoyc2UgYW5kIGoybWUoY2RjKSBjYW4gbG9hZCBmcm9tIGEgZmlsZW5hbWUgYnV0LCBqMm1lKGNsZGMpIHRocm93cyBhbiBleGNlcHRpb24KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc0xpc3RlbmVycyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbG9hZExqYXZhX2lvX0lucHV0U3RyZWFtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sb2FkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25vdGlmeUxpc3RlbmVyc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2F2ZUxqYXZhX2lvX091dHB1dFN0cmVhbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NhdmVMamF2YV9sYW5nX1N0cmluZ0kiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lciIpKSB0ZXN0X2FkZEltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc0xpc3RlbmVycyIpKSB0ZXN0X2hhc0xpc3RlbmVycygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbG9hZExqYXZhX2lvX0lucHV0U3RyZWFtIikpIHRlc3RfbG9hZExqYXZhX2lvX0lucHV0U3RyZWFtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sb2FkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9sb2FkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25vdGlmeUxpc3RlbmVyc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCIpKSB0ZXN0X25vdGlmeUxpc3RlbmVyc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NhdmVMamF2YV9pb19PdXRwdXRTdHJlYW1JIikpIHRlc3Rfc2F2ZUxqYXZhX2lvX091dHB1dFN0cmVhbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NhdmVMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9zYXZlTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci19Ci0vKiBjdXN0b20gKi8KLWJvb2xlYW4gbG9hZGVyTGlzdGVuZXJDYWxsZWQ7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM4ODMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlckV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJWigpIHsKLQl0cnkgewotCQluZXcgSW1hZ2VMb2FkZXJFdmVudChudWxsLCBudWxsLCAwLCB0cnVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VMb2FkZXIgc291cmNlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQluZXcgSW1hZ2VMb2FkZXJFdmVudChuZXcgSW1hZ2VMb2FkZXIoKSwgbnVsbCwgMCwgdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JSW1hZ2VMb2FkZXJFdmVudCBldmVudCA9IG5ldyBJbWFnZUxvYWRlckV2ZW50KG5ldyBJbWFnZUxvYWRlcigpLCBudWxsLCAwLCB0cnVlKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoZXZlbnQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSVoiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njg3M2M5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXJMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbWFnZURhdGFMb2FkZWRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ltYWdlRGF0YUxvYWRlZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbWFnZURhdGFMb2FkZWRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW1hZ2VEYXRhTG9hZGVkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50IikpIHRlc3RfaW1hZ2VEYXRhTG9hZGVkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjY5OWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvciRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpIHsKLQl0cnkgewotCQluZXcgUGFsZXR0ZURhdGEobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCVBhbGV0dGVEYXRhIGRhdGEgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHt9KTsKLQlhc3NlcnRGYWxzZSgiOmE6IiwgZGF0YS5pc0RpcmVjdCk7Ci0KLQluZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtudWxsLCBudWxsfSk7Ci0JYXNzZXJ0RmFsc2UoIjpiOiIsIGRhdGEuaXNEaXJlY3QpOwotCi0JbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pOwotCWFzc2VydEZhbHNlKCI6YzoiLCBkYXRhLmlzRGlyZWN0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSSgpIHsKLQlQYWxldHRlRGF0YSBkYXRhID0gbmV3IFBhbGV0dGVEYXRhKDAsIDAsIDApOwotCWFzc2VydFRydWUoIjphOiIsIGRhdGEuaXNEaXJlY3QpOwotCi0JZGF0YSA9IG5ldyBQYWxldHRlRGF0YSgtMSwgLTEsIC0xKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBkYXRhLmlzRGlyZWN0KTsKLQotCWRhdGEgPSBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4MDBmZjAwLCAweDAwMDBmZik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgZGF0YS5pc0RpcmVjdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGl4ZWxMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpIHsKLQkvLyBpbmRleGVkIHBhbGV0dGUgdGVzdHMJCi0JUkdCW10gcmdicyA9IHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpLCBuZXcgUkdCKDUwLCAxMDAsIDE1MCl9OwotCVBhbGV0dGVEYXRhIGRhdGEgPSBuZXcgUGFsZXR0ZURhdGEocmdicyk7Ci0JCi0JdHJ5IHsKLQkJZGF0YS5nZXRQaXhlbChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXhlZCBwYWxldHRlIHdpdGggcmdiID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCWRhdGEuZ2V0UGl4ZWwobmV3IFJHQigwLCAwLCAxKSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiBub3QgZm91bmQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKCI6YToiLCByZ2JzLmxlbmd0aC0xLCBkYXRhLmdldFBpeGVsKHJnYnNbcmdicy5sZW5ndGgtMV0pKTsKLQkKLQkvLyBkaXJlY3QgcGFsZXR0ZSB0ZXN0cwkKLQlSR0IgcmdiID1uZXcgUkdCKDB4MzIsIDB4NjQsIDB4OTYpOwotCWRhdGEgPSBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4MDBmZjAwLCAweDAwMDBmZik7Ci0JCi0JdHJ5IHsKLQkJZGF0YS5nZXRQaXhlbChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlyZWN0IHBhbGV0dGUgd2l0aCByZ2IgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoIjpiOiIsIDB4MzI2NDk2LCBkYXRhLmdldFBpeGVsKHJnYikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJHQkkoKSB7Ci0JLy8gaW5kZXhlZCBwYWxldHRlIHRlc3RzCQotCVJHQltdIHJnYnMgPSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KSwgbmV3IFJHQig1MCwgMTAwLCAxNTApfTsKLQlQYWxldHRlRGF0YSBkYXRhID0gbmV3IFBhbGV0dGVEYXRhKHJnYnMpOwotCi0JdHJ5IHsKLQkJZGF0YS5nZXRSR0Iocmdicy5sZW5ndGgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBub25leGlzdGVudCBwaXhlbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoIjphOiIsIHJnYnNbcmdicy5sZW5ndGgtMV0sIGRhdGEuZ2V0UkdCKHJnYnMubGVuZ3RoLTEpKTsKLQotCS8vIGRpcmVjdCBwYWxldHRlIHRlc3RzCQotCVJHQiByZ2IgPW5ldyBSR0IoMHgzMiwgMHg2NCwgMHg5Nik7Ci0JZGF0YSA9IG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHgwMGZmMDAsIDB4MDAwMGZmKTsKLQkKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIHJnYiwgZGF0YS5nZXRSR0IoMHgzMjY0OTYpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSR0JzKCkgewotCS8vIGluZGV4ZWQgcGFsZXR0ZSB0ZXN0cwkKLQlSR0JbXSByZ2JzID0ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9OwotCVBhbGV0dGVEYXRhIGRhdGEgPSBuZXcgUGFsZXR0ZURhdGEocmdicyk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCI6YToiLCByZ2JzLCBkYXRhLmdldFJHQnMoKSk7Ci0JCi0JLy8gZGlyZWN0IHBhbGV0dGUgdGVzdHMJCi0JZGF0YSA9IG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHgwMGZmMDAsIDB4MDAwMGZmKTsKLQkKLQlhc3NlcnROdWxsKCI6YjoiLCBkYXRhLmdldFJHQnMoKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGl4ZWxMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UkdCSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UkdCcyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpKSB0ZXN0X0NvbnN0cnVjdG9yJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQaXhlbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIikpIHRlc3RfZ2V0UGl4ZWxMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UkdCSSIpKSB0ZXN0X2dldFJHQkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQnMiKSkgdGVzdF9nZXRSR0JzKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NWI1ZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJKCkgewotCS8vIFRlc3QgbmV3IFBvaW50IChpbnQgeCwgaW50IHkpCi0JUG9pbnQgcCA9IG5ldyBQb2ludCgzLCA0KTsKLQlhc3NlcnRFcXVhbHMoMywgcC54KTsKLQlhc3NlcnRFcXVhbHMoNCwgcC55KTsKLQotCXAgPSBuZXcgUG9pbnQoLTQsIC0zKTsKLQlhc3NlcnRFcXVhbHMoLTQsIHAueCk7Ci0JYXNzZXJ0RXF1YWxzKC0zLCBwLnkpOwotCi0JcCA9IG5ldyBQb2ludCg1MDAwMDAsIDcwMDAwMCk7Ci0JYXNzZXJ0RXF1YWxzKDUwMDAwMCwgcC54KTsKLQlhc3NlcnRFcXVhbHMoNzAwMDAwLCBwLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCVBvaW50IHAxID0gbmV3IFBvaW50KDUsIDUpOwotCVBvaW50IHAyID0gbmV3IFBvaW50KDUsIDUpOwotCWFzc2VydFRydWUoIlBvaW50cyBzaG91bGQgYmUgZXF1YWwiLCBwMS5lcXVhbHMocDIpKTsKLQotCXAxID0gbmV3IFBvaW50KC01LCAtNSk7Ci0JcDIgPSBuZXcgUG9pbnQoLTUsIC01KTsKLQlhc3NlcnRUcnVlKCJQb2ludHMgc2hvdWxkIGJlIGVxdWFsIiwgcDEuZXF1YWxzKHAyKSk7Ci0KLQlwMiA9IG5ldyBQb2ludCgzLCA0KTsKLQlhc3NlcnRUcnVlKCJQb2ludHMgc2hvdWxkIG5vdCBiZSBlcXVhbCIsICFwMS5lcXVhbHMocDIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlQb2ludCBwMSA9IG5ldyBQb2ludCg1LCA1KTsKLQlQb2ludCBwMiA9IG5ldyBQb2ludCg1LCA1KTsKLQlhc3NlcnRUcnVlKCJQb2ludHMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaENvZGUiLCBwMS5oYXNoQ29kZSgpID09IHAyLmhhc2hDb2RlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVBvaW50IHAgPSBuZXcgUG9pbnQoMywgNCk7Ci0JYXNzZXJ0Tm90TnVsbChwLnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUocC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci0JYXNzZXJ0RXF1YWxzKCJQb2ludCB7MywgNH0iLCBwLnRvU3RyaW5nKCkpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyYzU2YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSSgpIHsKLQkvLyBUZXN0IFJHQihpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKQotCW5ldyBSR0IoMjAsMTAwLDIwMCk7Ci0JCi0JbmV3IFJHQigwLDAsMCk7Ci0KLQkKLQotCXRyeSB7Ci0JCW5ldyBSR0IoLTEsIDIwLCA1MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlZCA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCW5ldyBSR0IoMjU2LCAyMCwgNTApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWQgPiAyNTUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCW5ldyBSR0IoMjAsIC0xLCA1MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdyZWVuIDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJbmV3IFJHQigyMCwgMjU2LCA1MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdyZWVuID4gMjU1Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBSR0IoMjAsIDUwLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJsdWUgPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQluZXcgUkdCKDIwLCA1MCwgMjU2KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYmx1ZSA+IDI1NSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckZGRigpIHsKLQotCW5ldyBSR0IoMGYsMGYsMGYpOwotCQotCW5ldyBSR0IoMGYsMWYsMGYpOwotCW5ldyBSR0IoMGYsMGYsMWYpOwotCW5ldyBSR0IoMGYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDFmLDBmLDFmKTsKLQluZXcgUkdCKDFmLDFmLDFmKTsKLQluZXcgUkdCKDFmLDBmLDFmKTsKLQluZXcgUkdCKDFmLDFmLDBmKTsKLQluZXcgUkdCKDFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQig1OWYsMGYsMWYpOwotCW5ldyBSR0IoNTlmLDFmLDFmKTsKLQluZXcgUkdCKDU5ZiwwZiwxZik7Ci0JbmV3IFJHQig1OWYsMWYsMGYpOwotCW5ldyBSR0IoNTlmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQig2MGYsMGYsMWYpOwotCW5ldyBSR0IoNjBmLDFmLDFmKTsKLQluZXcgUkdCKDYwZiwwZiwxZik7Ci0JbmV3IFJHQig2MGYsMWYsMGYpOwotCW5ldyBSR0IoNjBmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQig2MWYsMGYsMWYpOwotCW5ldyBSR0IoNjFmLDFmLDFmKTsKLQluZXcgUkdCKDYxZiwwZiwxZik7Ci0JbmV3IFJHQig2MWYsMWYsMGYpOwotCW5ldyBSR0IoNjFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigxMTlmLDBmLDFmKTsKLQluZXcgUkdCKDExOWYsMWYsMWYpOwotCW5ldyBSR0IoMTE5ZiwwZiwxZik7Ci0JbmV3IFJHQigxMTlmLDFmLDBmKTsKLQluZXcgUkdCKDExOWYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDEyMGYsMGYsMWYpOwotCW5ldyBSR0IoMTIwZiwxZiwxZik7Ci0JbmV3IFJHQigxMjBmLDBmLDFmKTsKLQluZXcgUkdCKDEyMGYsMWYsMGYpOwotCW5ldyBSR0IoMTIwZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMTIxZiwwZiwxZik7Ci0JbmV3IFJHQigxMjFmLDFmLDFmKTsKLQluZXcgUkdCKDEyMWYsMGYsMWYpOwotCW5ldyBSR0IoMTIxZiwxZiwwZik7Ci0JbmV3IFJHQigxMjFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigxNzlmLDBmLDFmKTsKLQluZXcgUkdCKDE3OWYsMWYsMWYpOwotCW5ldyBSR0IoMTc5ZiwwZiwxZik7Ci0JbmV3IFJHQigxNzlmLDFmLDBmKTsKLQluZXcgUkdCKDE3OWYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDE4MGYsMGYsMWYpOwotCW5ldyBSR0IoMTgwZiwxZiwxZik7Ci0JbmV3IFJHQigxODBmLDBmLDFmKTsKLQluZXcgUkdCKDE4MGYsMWYsMGYpOwotCW5ldyBSR0IoMTgwZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMTgxZiwwZiwxZik7Ci0JbmV3IFJHQigxODFmLDFmLDFmKTsKLQluZXcgUkdCKDE4MWYsMGYsMWYpOwotCW5ldyBSR0IoMTgxZiwxZiwwZik7Ci0JbmV3IFJHQigxODFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigyMzlmLDBmLDFmKTsKLQluZXcgUkdCKDIzOWYsMWYsMWYpOwotCW5ldyBSR0IoMjM5ZiwwZiwxZik7Ci0JbmV3IFJHQigyMzlmLDFmLDBmKTsKLQluZXcgUkdCKDIzOWYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDI0MGYsMGYsMWYpOwotCW5ldyBSR0IoMjQwZiwxZiwxZik7Ci0JbmV3IFJHQigyNDBmLDBmLDFmKTsKLQluZXcgUkdCKDI0MGYsMWYsMGYpOwotCW5ldyBSR0IoMjQwZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMjQxZiwwZiwxZik7Ci0JbmV3IFJHQigyNDFmLDFmLDFmKTsKLQluZXcgUkdCKDI0MWYsMGYsMWYpOwotCW5ldyBSR0IoMjQxZiwxZiwwZik7Ci0JbmV3IFJHQigyNDFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigyOTlmLDBmLDFmKTsKLQluZXcgUkdCKDI5OWYsMWYsMWYpOwotCW5ldyBSR0IoMjk5ZiwwZiwxZik7Ci0JbmV3IFJHQigyOTlmLDFmLDBmKTsKLQluZXcgUkdCKDI5OWYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDMwMGYsMGYsMWYpOwotCW5ldyBSR0IoMzAwZiwxZiwxZik7Ci0JbmV3IFJHQigzMDBmLDBmLDFmKTsKLQluZXcgUkdCKDMwMGYsMWYsMGYpOwotCW5ldyBSR0IoMzAwZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMzAxZiwwZiwxZik7Ci0JbmV3IFJHQigzMDFmLDFmLDFmKTsKLQluZXcgUkdCKDMwMWYsMGYsMWYpOwotCW5ldyBSR0IoMzAxZiwxZiwwZik7Ci0JbmV3IFJHQigzMDFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigzNTlmLDBmLDFmKTsKLQluZXcgUkdCKDM1OWYsMWYsMWYpOwotCW5ldyBSR0IoMzU5ZiwwZiwxZik7Ci0JbmV3IFJHQigzNTlmLDFmLDBmKTsKLQluZXcgUkdCKDM1OWYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDM2MGYsMGYsMWYpOwotCW5ldyBSR0IoMzYwZiwxZiwxZik7Ci0JbmV3IFJHQigzNjBmLDBmLDFmKTsKLQluZXcgUkdCKDM2MGYsMWYsMGYpOwotCW5ldyBSR0IoMzYwZiwwLjZmLDAuNGYpOwotCQotCXRyeSB7Ci0JCW5ldyBSR0IoNDAwZiwgMC41ZiwgMC41Zik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGh1ZSA+IDM2MCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJbmV3IFJHQigtNWYsIDAuNWYsIDAuNWYpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBodWUgPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQluZXcgUkdCKDIwMGYsIC0wLjVmLCAwLjVmKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2F0dXJhdGlvbiA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCW5ldyBSR0IoMjAwZiwgMzAwZiwgMC41Zik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNhdHVyYXRpb24gPiAxIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQluZXcgUkdCKDIwMGYsIDAuNWYsIC0wLjVmKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYnJpZ2h0bmVzcyA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCW5ldyBSR0IoMjAwZiwgMC41ZiwgNDAwZik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJyaWdodG5lc3MgPiAxIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlpbnQgciA9IDAsIGcgPSAxMjcsIGIgPSAyNTQ7Ci0JUkdCIHJnYjEgPSBuZXcgUkdCKHIsIGcsIGIpOwotCVJHQiByZ2IyOwotCQotCXJnYjIgPSByZ2IxOwotCWlmICghcmdiMS5lcXVhbHMocmdiMikpIHsKLQkJZmFpbCgiVHdvIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgUkdCIGluc3RhbmNlIG5vdCBmb3VuZCBlcXVhbCIpOwotCX0KLQkKLQlyZ2IyID0gbmV3IFJHQihyLCBnLCBiKTsKLQlpZiAoIXJnYjEuZXF1YWxzKHJnYjIpKSB7Ci0JCWZhaWwoIlJlZmVyZW5jZXMgdG8gdHdvIGRpZmZlcmVudCBSR0IgaW5zdGFuY2VzIHdpdGggc2FtZSBSIEcgQiBwYXJhbWV0ZXJzIG5vdCBmb3VuZCBlcXVhbCIpOwotCX0KLQkKLQlpZiAocmdiMS5lcXVhbHMobmV3IFJHQihyKzEsIGcsIGIpKSB8fAotCSAgICByZ2IxLmVxdWFscyhuZXcgUkdCKHIsIGcrMSwgYikpIHx8Ci0JICAgIHJnYjEuZXF1YWxzKG5ldyBSR0IociwgZywgYisxKSkgfHwKLQkgICAgcmdiMS5lcXVhbHMobmV3IFJHQihyKzEsIGcrMSwgYisxKSkpIHsKLQkJZmFpbCgiQ29tcGFyaW5nIHR3byBSR0IgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbWJpbmF0aW9uIG9mIFIgRyBCIHBhcmFtZXRlcnMgZm91bmQgZXF1YWwiKTsgICAgCQotCX0KLQotCWZsb2F0IGh1ZSA9IDIyMGYsIHNhdCA9IDAuNmYsIGJyaWdodCA9IDAuN2Y7Ci0JcmdiMSA9IG5ldyBSR0IoaHVlLCBzYXQsIGJyaWdodCk7Ci0JcmdiMiA9IHJnYjE7Ci0JaWYgKCFyZ2IxLmVxdWFscyhyZ2IyKSkgewotCQlmYWlsKCJUd28gcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBSR0IgaW5zdGFuY2Ugbm90IGZvdW5kIGVxdWFsIik7Ci0JfQotCQotCXJnYjIgPSBuZXcgUkdCKGh1ZSwgc2F0LCBicmlnaHQpOwotCWlmICghcmdiMS5lcXVhbHMocmdiMikpIHsKLQkJZmFpbCgiUmVmZXJlbmNlcyB0byB0d28gZGlmZmVyZW50IFJHQiBpbnN0YW5jZXMgd2l0aCBzYW1lIEggUyBCIHBhcmFtZXRlcnMgbm90IGZvdW5kIGVxdWFsIik7Ci0JfQotCQotCWlmIChyZ2IxLmVxdWFscyhuZXcgUkdCKGh1ZSsxLCBzYXQsIGJyaWdodCkpIHx8Ci0JICAgIHJnYjEuZXF1YWxzKG5ldyBSR0IoaHVlLCBzYXQrMC4xZiwgYnJpZ2h0KSkgfHwKLQkgICAgcmdiMS5lcXVhbHMobmV3IFJHQihodWUsIHNhdCwgYnJpZ2h0KzAuMWYpKSB8fAotCSAgICByZ2IxLmVxdWFscyhuZXcgUkdCKGh1ZSsxLCBzYXQrMC4xZiwgYnJpZ2h0KzAuMWYpKSkgewotCQlmYWlsKCJDb21wYXJpbmcgdHdvIFJHQiBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29tYmluYXRpb24gb2YgSCBTIEIgcGFyYW1ldGVycyBmb3VuZCBlcXVhbCIpOyAgICAJCi0JfQotfQotcHVibGljIHZvaWQgdGVzdF9nZXRIU0IoKSB7Ci0JZmxvYXRbXSBoc2IgPSBuZXcgZmxvYXRbXSB7Ci0JCQkJMGYsMGYsMGYsCi0JCQkJMGYsMWYsMWYsCi0JCQkJMGYsMWYsMGYsCi0JCQkJMGYsMGYsMWYsCi0JCQkJMGYsMC42ZiwwLjRmLAotCQkJCTFmLDBmLDFmLAotCQkJCTFmLDFmLDFmLAotCQkJCTFmLDBmLDFmLAotCQkJCTFmLDFmLDBmLAotCQkJCTFmLDAuNmYsMC40ZiwKLQkJCQk1OWYsMGYsMWYsCi0JCQkJNTlmLDFmLDFmLAotCQkJCTU5ZiwwZiwxZiwKLQkJCQk1OWYsMWYsMGYsCi0JCQkJNTlmLDAuNmYsMC40ZiwKLQkJCQk2MGYsMGYsMWYsCi0JCQkJNjBmLDFmLDFmLAotCQkJCTYwZiwwZiwxZiwKLQkJCQk2MGYsMWYsMGYsCi0JCQkJNjBmLDAuNmYsMC40ZiwKLQkJCQk2MWYsMGYsMWYsCi0JCQkJNjFmLDFmLDFmLAotCQkJCTYxZiwwZiwxZiwKLQkJCQk2MWYsMWYsMGYsCi0JCQkJNjFmLDAuNmYsMC40ZiwKLQkJCQkxMTlmLDBmLDFmLAotCQkJCTExOWYsMWYsMWYsCi0JCQkJMTE5ZiwwZiwxZiwKLQkJCQkxMTlmLDFmLDBmLAotCQkJCTExOWYsMC42ZiwwLjRmLAotCQkJCTEyMGYsMGYsMWYsCi0JCQkJMTIwZiwxZiwxZiwKLQkJCQkxMjBmLDBmLDFmLAotCQkJCTEyMGYsMWYsMGYsCi0JCQkJMTIwZiwwLjZmLDAuNGYsCi0JCQkJMTIxZiwwZiwxZiwKLQkJCQkxMjFmLDFmLDFmLAotCQkJCTEyMWYsMGYsMWYsCi0JCQkJMTIxZiwxZiwwZiwKLQkJCQkxMjFmLDAuNmYsMC40ZiwKLQkJCQkxNzlmLDBmLDFmLAotCQkJCTE3OWYsMWYsMWYsCi0JCQkJMTc5ZiwwZiwxZiwKLQkJCQkxNzlmLDFmLDBmLAotCQkJCTE3OWYsMC42ZiwwLjRmLAotCQkJCTE4MGYsMGYsMWYsCi0JCQkJMTgwZiwxZiwxZiwKLQkJCQkxODBmLDBmLDFmLAotCQkJCTE4MGYsMWYsMGYsCi0JCQkJMTgwZiwwLjZmLDAuNGYsCi0JCQkJMTgxZiwwZiwxZiwKLQkJCQkxODFmLDFmLDFmLAotCQkJCTE4MWYsMGYsMWYsCi0JCQkJMTgxZiwxZiwwZiwKLQkJCQkxODFmLDAuNmYsMC40ZiwKLQkJCQkyMzlmLDBmLDFmLAotCQkJCTIzOWYsMWYsMWYsCi0JCQkJMjM5ZiwwZiwxZiwKLQkJCQkyMzlmLDFmLDBmLAotCQkJCTIzOWYsMC42ZiwwLjRmLAotCQkJCTI0MGYsMGYsMWYsCi0JCQkJMjQwZiwxZiwxZiwKLQkJCQkyNDBmLDBmLDFmLAotCQkJCTI0MGYsMWYsMGYsCi0JCQkJMjQwZiwwLjZmLDAuNGYsCi0JCQkJMjQxZiwwZiwxZiwKLQkJCQkyNDFmLDFmLDFmLAotCQkJCTI0MWYsMGYsMWYsCi0JCQkJMjQxZiwxZiwwZiwKLQkJCQkyNDFmLDAuNmYsMC40ZiwKLQkJCQkyOTlmLDBmLDFmLAotCQkJCTI5OWYsMWYsMWYsCi0JCQkJMjk5ZiwwZiwxZiwKLQkJCQkyOTlmLDFmLDBmLAotCQkJCTI5OWYsMC42ZiwwLjRmLAotCQkJCTMwMGYsMGYsMWYsCi0JCQkJMzAwZiwxZiwxZiwKLQkJCQkzMDBmLDBmLDFmLAotCQkJCTMwMGYsMWYsMGYsCi0JCQkJMzAwZiwwLjZmLDAuNGYsCi0JCQkJMzAxZiwwZiwxZiwKLQkJCQkzMDFmLDFmLDFmLAotCQkJCTMwMWYsMGYsMWYsCi0JCQkJMzAxZiwxZiwwZiwKLQkJCQkzMDFmLDAuNmYsMC40ZiwKLQkJCQkzNTlmLDBmLDFmLAotCQkJCTM1OWYsMWYsMWYsCi0JCQkJMzU5ZiwwZiwxZiwKLQkJCQkzNTlmLDFmLDBmLAotCQkJCTM1OWYsMC42ZiwwLjRmLAotCQkJCTM2MGYsMGYsMWYsCi0JCQkJMzYwZiwxZiwxZiwKLQkJCQkzNjBmLDBmLDFmLAotCQkJCTM2MGYsMWYsMGYsCi0JCQkJMzYwZiwwLjZmLDAuNGYsCi0JCQkJMjIwZiwwLjZmLDAuN2Z9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgaHNiLmxlbmd0aDsgaSs9MykgewotCQlSR0IgcmdiMSA9IG5ldyBSR0IoaHNiW2ldLCBoc2JbaSsxXSwgaHNiW2krMl0pOwotCQlmbG9hdFtdIGhzYjIgPSByZ2IxLmdldEhTQigpOwotCQlSR0IgcmdiMiA9IG5ldyBSR0IoaHNiMlswXSwgaHNiMlsxXSwgaHNiMlsyXSk7Ci0JCWlmICghcmdiMS5lcXVhbHMocmdiMikpIHsKLQkJCWZhaWwoIlR3byByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIFJHQiB1c2luZyBnZXRIU0IoKSBmdW5jdGlvbiBub3QgZm91bmQgZXF1YWwiKTsKLQkJfQotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JaW50IHIgPSAyNTUsIGcgPSAxMDAsIGIgPSAwOwotCVJHQiByZ2IxID0gbmV3IFJHQihyLCBnLCBiKTsKLQlSR0IgcmdiMiA9IG5ldyBSR0IociwgZywgYik7Ci0JCi0JaW50IGhhc2gxID0gcmdiMS5oYXNoQ29kZSgpOwotCWludCBoYXNoMiA9IHJnYjIuaGFzaENvZGUoKTsKLQkKLQlpZiAoaGFzaDEgIT0gaGFzaDIpIHsKLQkJZmFpbCgiVHdvIFJHQiBpbnN0YW5jZXMgd2l0aCBzYW1lIFIgRyBCIHBhcmFtZXRlcnMgcmV0dXJuZWQgZGlmZmVyZW50IGhhc2ggY29kZXMiKTsKLQl9Ci0JCi0JaWYgKHJnYjEuaGFzaENvZGUoKSA9PSBuZXcgUkdCKGcsIGIsIHIpLmhhc2hDb2RlKCkgfHwKLQkJcmdiMS5oYXNoQ29kZSgpID09IG5ldyBSR0IoYiwgciwgZykuaGFzaENvZGUoKSkgewotCQlmYWlsKCJUd28gUkdCIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBSIEcgQiBwYXJhbWV0ZXJzIHJldHVybmVkIHRoZSBzYW1lIGhhc2ggY29kZSIpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JUkdCIHJnYiA9IG5ldyBSR0IoMCwgMTAwLCAyMDApOwotCi0JU3RyaW5nIHMgPSByZ2IudG9TdHJpbmcoKTsKLQkKLQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgewotCQlmYWlsKCJSR0IudG9TdHJpbmcgcmV0dXJucyBhIG51bGwgb3IgZW1wdHkgU3RyaW5nIik7Ci0JfQotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckZGRiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhTQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlJIikpIHRlc3RfQ29uc3RydWN0b3JJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yRkZGIikpIHRlc3RfQ29uc3RydWN0b3JGRkYoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhTQiIpKSB0ZXN0X2dldEhTQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNjQxNDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSUkoKSB7Ci0JLy8gVGVzdCBuZXcgUmVjdGFuZ2xlIChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKLQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoMywgNCwgNSwgNik7Ci0JYXNzZXJ0RXF1YWxzKDMsIHIueCk7Ci0JYXNzZXJ0RXF1YWxzKDQsIHIueSk7Ci0JYXNzZXJ0RXF1YWxzKDUsIHIud2lkdGgpOwotCWFzc2VydEVxdWFscyg2LCByLmhlaWdodCk7Ci0KLQlyID0gbmV3IFJlY3RhbmdsZSgtNCwgLTMsIC0yLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKC00LCByLngpOwotCWFzc2VydEVxdWFscygtMywgci55KTsKLQlhc3NlcnRFcXVhbHMoLTIsIHIud2lkdGgpOwotCWFzc2VydEVxdWFscygtMSwgci5oZWlnaHQpOwotCi0JciA9IG5ldyBSZWN0YW5nbGUoNTAwMDAwLCA3MDAwMDAsIDIwMDAwMCwgMTAwMDAwKTsKLQlhc3NlcnRFcXVhbHMoNTAwMDAwLCByLngpOwotCWFzc2VydEVxdWFscyg3MDAwMDAsIHIueSk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDAwMCwgci53aWR0aCk7Ci0JYXNzZXJ0RXF1YWxzKDEwMDAwMCwgci5oZWlnaHQpOwotfQotCi0vKioKLSAqIERlc3RydWN0aXZlbHkgcmVwbGFjZXMgdGhlIHgsIHksIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzCi0gKiBpbiB0aGUgcmVjZWl2ZXIgd2l0aCBvbmVzIHdoaWNoIHJlcHJlc2VudCB0aGUgdW5pb24gb2YgdGhlCi0gKiByZWN0YW5nbGVzIHNwZWNpZmllZCBieSB0aGUgcmVjZWl2ZXIgYW5kIHRoZSBnaXZlbiByZWN0YW5nbGUuCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAyLCAyKTsKLQlyMS5hZGQocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGFkZCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDQsIDQpLCByMSk7Ci0KLQlyMS5hZGQocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGFkZCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDQsIDQpLCByMSk7Ci0JCi0JcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKTsKLQlyMS5hZGQocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGFkZCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpLCByMSk7Ci0KLQlyMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JcjIgPSBuZXcgUmVjdGFuZ2xlKDYsIDYsIDAsIDApOwotCXIxLmFkZChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgYWRkIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgNSwgNCksIHIxKTsKLQotCXRyeSB7Ci0JCXIxLmFkZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcG9pbnQgc3BlY2lmaWVkIGJ5IHRoZQotICogYXJndW1lbnRzIGlzIGluc2lkZSB0aGUgYXJlYSBzcGVjaWZpZWQgYnkgdGhlIHJlY2VpdmVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zSUkoKSB7Ci0JUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMSwgMikiLCByLmNvbnRhaW5zKDEsIDIpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMywgNCkiLCByLmNvbnRhaW5zKDMsIDQpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMywgNSkiLCByLmNvbnRhaW5zKDMsIDUpKTsKLQotLy8JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIHBvaW50ICgzLCA2KSIsIHIuY29udGFpbnMoMywgNikpOwotLy8KLS8vCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoNCwgNSkiLCByLmNvbnRhaW5zKDQsIDUpKTsKLS8vCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDQsIDYpIiwgci5jb250YWlucyg0LCA2KSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIG5vdCBjb250YWluIHBvaW50ICg5LCAxMCkiLCAhci5jb250YWlucyg5LCAxMCkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBub3QgY29udGFpbiBwb2ludCAoLTEsIC0xKSIsICFyLmNvbnRhaW5zKC0xLCAtMSkpOwotfQotCi0vKioKLSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBvaW50IGlzIGluc2lkZSB0aGUKLSAqIGFyZWEgc3BlY2lmaWVkIGJ5IHRoZSByZWNlaXZlci4KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gUG9pbnQoMSwgMikiLCByLmNvbnRhaW5zKG5ldyBQb2ludCgxLCAyKSkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIFBvaW50KDMsIDQpIiwgci5jb250YWlucyhuZXcgUG9pbnQoMywgNCkpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMywgNSkiLCByLmNvbnRhaW5zKG5ldyBQb2ludCgzLCA1KSkpOwotCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDMsIDYpIiwgci5jb250YWlucyhuZXcgUG9pbnQoMywgNikpKTsKLS8vCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDQsIDUpIiwgci5jb250YWlucyhuZXcgUG9pbnQoNCwgNSkpKTsKLS8vCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gUG9pbnQoNCwgNikiLCByLmNvbnRhaW5zKG5ldyBQb2ludCg0LCA2KSkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBub3QgY29udGFpbiBQb2ludCg5LCAxMCkiLCAhci5jb250YWlucyhuZXcgUG9pbnQoOSwgMTApKSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIG5vdCBjb250YWluIHBvaW50ICgtMSwgLTEpIiwgIXIuY29udGFpbnMobmV3IFBvaW50KC0xLCAtMSkpKTsKLQotCXRyeSB7Ci0JCXIuY29udGFpbnMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoNSwgNCwgMywgMik7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSg1LCA0LCAzLCAyKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGVzIHNob3VsZCBiZSBlcXVhbCIsIHIxLmVxdWFscyhyMikpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDQsIDUsIDYpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZXMgc2hvdWxkIG5vdCBiZSBlcXVhbCIsICFyMS5lcXVhbHMocjIpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgyLCAzLCA0LCA1KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGVzIHNob3VsZCBub3QgYmUgZXF1YWwiLCAhcjEuZXF1YWxzKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoNSwgNCwgMiwgMyk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlcyBzaG91bGQgbm90IGJlIGVxdWFsIiwgIXIxLmVxdWFscyhyMikpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDQsIDUsIDMsIDIpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZXMgc2hvdWxkIG5vdCBiZSBlcXVhbCIsICFyMS5lcXVhbHMocjIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDUsIDQsIDMsIDIpOwotCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoNSwgNCwgMywgMik7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBoYXNoQ29kZSIsIHIxLmhhc2hDb2RlKCkgPT0gcjIuaGFzaENvZGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDIsIDIpOwotCQotCXIxLmludGVyc2VjdChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgaW50ZXJzZWN0IGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMywgMywgMSwgMiksIHIxKTsKLQotCXIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCk7Ci0JcjEuaW50ZXJzZWN0KHIyKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3QgaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKSwgcjEpOwotCi0JcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpOwotCXIxLmludGVyc2VjdChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgaW50ZXJzZWN0IGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHIxKTsKLQotCXRyeSB7Ci0JCXIxLmludGVyc2VjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDIsIDIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGludGVyc2VjdGlvbiBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDMsIDMsIDEsIDIpLCByMS5pbnRlcnNlY3Rpb24ocjIpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKSwgcjEuaW50ZXJzZWN0aW9uKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgcjEuaW50ZXJzZWN0aW9uKHIyKSk7Ci0KLQl0cnkgewotCQlyMS5pbnRlcnNlY3Rpb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdHNJSUlJKCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSgyLCAzLCA3LCA4KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMiwgMywgNywgOCkiLCByMS5pbnRlcnNlY3RzKDIsIDMsIDcsIDgpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMiwgMywgNywgOCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCByMi5pbnRlcnNlY3RzKDEsIDIsIDMsIDQpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMjAwLCAzMDAsIDQwMCwgNTAwKSIsICFyMS5pbnRlcnNlY3RzKDIwMCwgMzAwLCA0MDAsIDUwMCkpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsICFyMi5pbnRlcnNlY3RzKDEsIDIsIDMsIDQpKTsKLQkKLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDMsIDMsIDAsIDApIiwgcjEuaW50ZXJzZWN0cygzLCAzLCAwLCAwKSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDMsIDMsIDAsIDApIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIiwgcjIuaW50ZXJzZWN0cygxLCAyLCAzLCA0KSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSkiLCAhcjEuaW50ZXJzZWN0cygzLCAzLCAtMSwgLTEpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMywgMywgLTEsIC0xKSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCAhcjIuaW50ZXJzZWN0cygxLCAyLCAzLCA0KSk7Ci0KLQl0cnkgewotCQlyMS5pbnRlcnNlY3RzKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDIsIDMsIDcsIDgpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgyLCAzLCA3LCA4KSIsIHIxLmludGVyc2VjdHMocjIpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMiwgMywgNywgOCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCByMi5pbnRlcnNlY3RzKHIxKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMjAwLCAzMDAsIDQwMCwgNTAwKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDIwMCwgMzAwLCA0MDAsIDUwMCkiLCAhcjEuaW50ZXJzZWN0cyhyMikpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsICFyMi5pbnRlcnNlY3RzKHIxKSk7Ci0JCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgzLCAzLCAwLCAwKSIsIHIxLmludGVyc2VjdHMocjIpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMywgMywgMCwgMCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCByMi5pbnRlcnNlY3RzKHIxKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSkiLCAhcjEuaW50ZXJzZWN0cyhyMikpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsICFyMi5pbnRlcnNlY3RzKHIxKSk7Ci0KLQl0cnkgewotCQlyMS5pbnRlcnNlY3RzKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VtcHR5KCkgewotCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAwLCAwKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgaXMgZW1wdHkiLCByLmlzRW1wdHkoKSk7Ci0KLQlyID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAtMywgLTQpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBpcyBlbXB0eSIsIHIuaXNFbXB0eSgpKTsKLQotCXIgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBpcyBub3QgZW1wdHkiLCAhci5pc0VtcHR5KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgzLCA0LCA1LCA2KTsKLQlhc3NlcnROb3ROdWxsKHIudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSB7MywgNCwgNSwgNn0iLCByLnRvU3RyaW5nKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3VuaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDIsIDIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIHVuaW9uIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgNCwgNCksIHIxLnVuaW9uKHIyKSk7Ci0JCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIHVuaW9uIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCksIHIxLnVuaW9uKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSB1bmlvbiBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpLCByMS51bmlvbihyMikpOwotCi0JdHJ5IHsKLQkJcjEudW5pb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0c0lJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbXB0eSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3VuaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUlJIikpIHRlc3RfQ29uc3RydWN0b3JJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250YWluc0lJIikpIHRlc3RfY29udGFpbnNJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ludGVyc2VjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RzSUlJSSIpKSB0ZXN0X2ludGVyc2VjdHNJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW1wdHkiKSkgdGVzdF9pc0VtcHR5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF91bmlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfdW5pb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmRiNGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlZ2lvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlZ2lvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JLy8gdGVzdCBSZWdpb24oKQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKCk7Ci0JaWYgKHJlZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJZmFpbCgiQ29uc3RydWN0b3IgZm9yIFJlZ2lvbiBkaWRuJ3QgaW5pdGlhbGl6ZSIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaWYgKHJlZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJZmFpbCgiQ29uc3RydWN0b3IgZm9yIFJlZ2lvbiBkaWRuJ3QgaW5pdGlhbGl6ZSIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZCRJKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXRyeSB7Ci0JCXJlZy5hZGQoKGludFtdKW51bGwpOwotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgYSBudWxsIHJlY3RhbmdsZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9CQotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLmFkZChuZXcgaW50W117fSk7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLQlyZWcuZGlzcG9zZSgpOwotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChuZXcgaW50W10gezAsMCwgNTAsMCwgNTAsMjUsIDAsMjV9KTsKLQlSZWN0YW5nbGUgYm94ID0gcmVnLmdldEJvdW5kcygpOwotCXJlZy5kaXNwb3NlKCk7Ci0JUmVjdGFuZ2xlIGV4cGVjdGVkID0gbmV3IFJlY3RhbmdsZSAoMCwwLDUwLDI1KTsKLQlpZiAoIWJveC5lcXVhbHMoZXhwZWN0ZWQpKSB7Ci0JCWZhaWwoImFkZCAxIGZhaWxlZCAtIGV4cGVjdGVkOiAiK2V4cGVjdGVkKyIgYWN0dWFsOiAiK2JveCk7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChuZXcgaW50W10gezAsMCwgNTAsMCwgNTAsMjUsIDAsMjV9KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwyNSwgNTAsMjUsIDUwLDQwLCAwLDQwfSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCXJlZy5kaXNwb3NlKCk7Ci0JZXhwZWN0ZWQgPSBuZXcgUmVjdGFuZ2xlICgwLDAsNTAsNDApOwotCWlmICghYm94LmVxdWFscyhleHBlY3RlZCkpIHsKLQkJZmFpbCgiYWRkIDIgZmFpbGVkIC0gZXhwZWN0ZWQ6ICIrZXhwZWN0ZWQrIiBhY3R1YWw6ICIrYm94KTsKLQl9Ci0JCi0vLwlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotLy8JcmVnLmFkZChuZXcgaW50W10gezEwLDEwLCA0MCwzMCwgMjAsNjAsIDUsNTV9KTsKLS8vCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLS8vCXJlZy5kaXNwb3NlKCk7Ci0vLwlleHBlY3RlZCA9IG5ldyBSZWN0YW5nbGUgKDUsMTAsMzUsNTApOwotLy8JaWYgKCFib3guZXF1YWxzKGV4cGVjdGVkKSkgewotLy8JCWZhaWwoImFkZCAzIGZhaWxlZCAtIGV4cGVjdGVkOiAiK2V4cGVjdGVkKyIgYWN0dWFsOiAiK2JveCk7Ci0vLwl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JLy8gYWRkIGEgcmVjdGFuZ2xlCi0JcmVnLmFkZChuZXcgUmVjdGFuZ2xlKDAsIDAsIDEwMCwgNTApKTsKLQkvLyBhZGQgYSBzZWNvbmQgcmVjdGFuZ2xlCi0JcmVnLmFkZChuZXcgUmVjdGFuZ2xlKDIwMCwgMjAwLCAxMCwxMCkpOwkKLQotCXRyeSB7Ci0JCXJlZy5hZGQoKFJlY3RhbmdsZSludWxsKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkaW5nIGEgbnVsbCByZWN0YW5nbGUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZy5kaXNwb3NlKCk7Ci0JCi0JdHJ5IHsKLQkJcmVnLmFkZChuZXcgUmVjdGFuZ2xlKDIwLDMwLDEwLDUpKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkaW5nIGEgcmVjdGFuZ2xlIGFmdGVyIFJlZ2lvbiBnb3QgZGlzcG9zZWQiKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCkgewotCVJlZ2lvbiByZWcxID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkvLyBtYWtlIGEgc2Vjb25kIHJlZ2lvbiBhbmQgYWRkIGl0IHRvIHRoZSBmaXJzdCBvbmUKLQlSZWdpb24gcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMi5hZGQobmV3IFJlY3RhbmdsZSg0MCwgNTAsIDEwLCAyMCkpOwotCXJlZzEuYWRkKHJlZzIpOwotCXJlZzIuZGlzcG9zZSgpOwotCi0JdHJ5IHsKLQkJcmVnMS5hZGQoKFJlZ2lvbiludWxsKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkaW5nIGEgbnVsbCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JCXJlZzIuYWRkKG5ldyBSZWN0YW5nbGUoMSwxLDEwMCwyMDApKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCXJlZzEuYWRkKHJlZzIpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgdG8gYSBSZWdpb24gYSBSZWdpb24gd2hpY2ggZ290IGRpc3Bvc2VkIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcxLmRpc3Bvc2UoKTsKLQkKLQl0cnkgewotCQlyZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkJcmVnMi5hZGQobmV3IFJlY3RhbmdsZSgxLDEsMTAwLDIwMCkpOwotCQlyZWcxLmFkZChyZWcyKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkaW5nIGEgUmVnaW9uIHRvIGEgUmVnaW9uIHdoaWNoIGdvdCBkaXNwb3NlZCIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9IGZpbmFsbHkgewotCQlpZiAocmVnMiAhPSBudWxsKSByZWcyLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNJSSgpIHsKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDEwLDEwLDIwMCwxMDApOwotCVBvaW50IHBvaW50SW5SZWN0MSA9IG5ldyBQb2ludCgxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSg1MCw1MCwxMDAwLDEwMDApOwotCVBvaW50IHBvaW50SW5SZWN0MiA9IG5ldyBQb2ludCgxMDQ5LDEwMDkpOwotCVBvaW50IHBvaW50Tm90SW5SZWN0MTIgPSBuZXcgUG9pbnQoNDksMTEwKTsKLQkKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5jb250YWlucyhwb2ludEluUmVjdDEueCwgcG9pbnRJblJlY3QxLnkpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlpZiAocmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MS54LCBwb2ludEluUmVjdDEueSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiRW1wdHkgcmVnaW9uIHNob3VsZCBub3QgY29udGFpbiBwb2ludCIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlpZiAoIXJlZy5jb250YWlucyhwb2ludEluUmVjdDEueCwgcG9pbnRJblJlY3QxLnkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIlJlZ2lvbiBzaG91bGQgY29udGFpbiBwb2ludCIpOwotCX0KLQlyZWcuYWRkKHJlY3QyKTsKLQlpZiAoIXJlZy5jb250YWlucyhwb2ludEluUmVjdDEueCwgcG9pbnRJblJlY3QxLnkpIHx8Ci0JCSFyZWcuY29udGFpbnMocG9pbnRJblJlY3QyLngsIHBvaW50SW5SZWN0Mi55KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJSZWdpb24gc2hvdWxkIGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JaWYgKHJlZy5jb250YWlucyhwb2ludE5vdEluUmVjdDEyLngsIHBvaW50Tm90SW5SZWN0MTIueSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBub3QgY29udGFpbiBwb2ludCIpOwotCX0JCi0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb250YWluc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgxMCwxMCwyMDAsMTAwKTsKLQlQb2ludCBwb2ludEluUmVjdDEgPSBuZXcgUG9pbnQoMTAsMTApOwotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoNTAsNTAsMTAwMCwxMDAwKTsKLQlQb2ludCBwb2ludEluUmVjdDIgPSBuZXcgUG9pbnQoMTA0OSwxMDA5KTsKLQlQb2ludCBwb2ludE5vdEluUmVjdDEyID0gbmV3IFBvaW50KDQ5LDExMCk7Ci0JCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuY29udGFpbnMocG9pbnRJblJlY3QxKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaWYgKHJlZy5jb250YWlucyhwb2ludEluUmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIkVtcHR5IHJlZ2lvbiBzaG91bGQgbm90IGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JcmVnLmFkZChyZWN0MSk7Ci0JaWYgKCFyZWcuY29udGFpbnMocG9pbnRJblJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJSZWdpb24gc2hvdWxkIGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JcmVnLmFkZChyZWN0Mik7Ci0JaWYgKCFyZWcuY29udGFpbnMocG9pbnRJblJlY3QxKSB8fAotCQkhcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MikpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBjb250YWluIHBvaW50Iik7Ci0JfQotCWlmIChyZWcuY29udGFpbnMocG9pbnROb3RJblJlY3QxMikpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBub3QgY29udGFpbiBwb2ludCIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChuZXcgUmVjdGFuZ2xlKDEsMSw1MCwxMDApKTsKLQlpZiAocmVnLmlzRGlzcG9zZWQoKSkgewotCQlmYWlsKCJSZWdpb24gc2hvdWxkIG5vdCBiZSBpbiB0aGUgZGlzcG9zZWQgc3RhdGUiKTsKLQl9Ci0JCi0JLy8gZGlzcG9zZSB0d2ljZSBhcyB0aGlzIGlzIGFsbG93ZWQKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQlyZWcuZGlzcG9zZSgpOwotCQlpZiAoIXJlZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZhaWwoIlJlZ2lvbiBzaG91bGQgYmUgaW4gdGhlIGRpc3Bvc2VkIHN0YXRlIik7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgyNSwgMTAwLCAyMDAsIDc4MCk7Ci0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSgzMCwgMTA1LCAyMDUsIDc4NSk7Ci0JCi0JUmVnaW9uIHJlZzEgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzEuYWRkKHJlY3QxKTsKLQotCVJlZ2lvbiByZWcyID0gcmVnMTsKLQkKLQlpZiAoIXJlZzEuZXF1YWxzKHJlZzIpKSB7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJZmFpbCgicmVmZXJlbmNlcyB0byB0aGUgc2FtZSBpbnN0YW5jZSBvZiBSZWdpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1YWwiKTsKLQl9Ci0JCi0JcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMi5hZGQocmVjdDEpOwotCQotLy8gQ3VycmVudGx5LCBSZWdpb25zIGFyZSBvbmx5ICJlcXVhbCIgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGhhbmRsZS4KLS8vIFRoaXMgaXMgc28gdGhhdCBpZGVudGljYWwgb2JqZWN0cyBhcmUgcHJvcGVybHkgaGFzaGVkLgotLy8gV2UgYXJlIGNvbnNpZGVyaW5nIGFkZGluZyBhIG5ldyBtZXRob2QgdGhhdCB3aWxsIGNvbXBhcmUgUmVnaW9ucyBmb3IgdGhlIHNhbWUgYXJlYS4KLS8vCWlmICghcmVnMS5lcXVhbHMocmVnMikpIHsKLS8vCQlyZWcxLmRpc3Bvc2UoKTsKLS8vCQlyZWcyLmRpc3Bvc2UoKTsKLS8vCQlmYWlsKCJ0d28gaW5zdGFuY2VzIG9mIFJlZ2lvbiByZXByZXNlbnRpbmcgdGhlIHNhbWUgYXJlYSBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVhbCIpOwotLy8JfQkJCi0JCi0JcmVnMi5kaXNwb3NlKCk7Ci0JcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaWYgKHJlZzEuZXF1YWxzKHJlZzIpKSB7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm9uIGVtcHR5IHJlZ2lvbiBjb25zaWRlcmVkIGVxdWFsIHRvIGVtcHR5IG9uZSIpOwotCX0KLQkKLQlyZWcyLmFkZChyZWN0Mik7Ci0JaWYgKHJlZzEuZXF1YWxzKHJlZzIpKSB7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJZmFpbCgidHdvIGRpZmZlcmVudCByZWdpb25zIGNvbnNpZGVyZWQgZXF1YWwiKTsKLQl9Ci0JCi0JcmVnMS5kaXNwb3NlKCk7Ci0JcmVnMi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JCi0JdHJ5IHsKLQkJcmVnLmdldEJvdW5kcygpOwotCQlmYWlsKCJSZWdpb24gZGlzcG9zZWQgc2hvdWxkIHRocm93IEV4Y2VwdGlvbiIpOwotCX0KLQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDEwLDEwLDUwLDMwKTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDEwMCwxMDAsMTAsMTApOwotCS8vIHRoZSByZWN0YW5nbGUgZW5jbG9zaW5nIHRoZSB0d28gcHJlY2VkaW5nIHJlY3RhbmdsZXMKLQlSZWN0YW5nbGUgcmVjdDEyQm91bmRzID0gbmV3IFJlY3RhbmdsZSgxMCwxMCwxMDAsMTAwKTsKLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQocmVjdDEpOwotCVJlY3RhbmdsZSByZWN0MUJpcyA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAocmVjdDFCaXMueCAhPSByZWN0MS54IHx8IHJlY3QxQmlzLnkgIT0gcmVjdDEueSB8fCAKLQkJcmVjdDFCaXMuaGVpZ2h0ICE9IHJlY3QxLmhlaWdodCB8fCByZWN0MUJpcy53aWR0aCAhPSByZWN0MS53aWR0aCkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJnZXRCb3VuZHMgZG9lc24ndCByZXR1cm4gdGhlIGJvcmRlcnMgb2YgdGhlIHJlY3RhbmdsZSBhcmVhIHdoaWNoIHdhcyBzZXQgdXAiKTsKLQl9Ci0JCi0JcmVnLmFkZChyZWN0Mik7Ci0JUmVjdGFuZ2xlIHJlY3QxMiA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAocmVjdDEyLnggIT0gcmVjdDEyQm91bmRzLnggfHwgcmVjdDEyLnkgIT0gcmVjdDEyQm91bmRzLnkgfHwgCi0JCXJlY3QxMi5oZWlnaHQgIT0gcmVjdDEyQm91bmRzLmhlaWdodCB8fCByZWN0MTIud2lkdGggIT0gcmVjdDEyQm91bmRzLndpZHRoKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImdldEJvdW5kcyBkb2Vzbid0IHJldHVybiB0aGUgYm9yZGVycyBvZiB0aGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBhcmVhIHdoaWNoIHdhcyBzZXQgdXAiKTsKLQl9Ci0JCi0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlSZWdpb24gcmVnMSA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JUmVnaW9uIHJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCQkKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDI1LCAxMDAsIDIwMCwgNzgwKTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDMwLCAxMDUsIDIwNSwgNzg1KTsKLQkKLQlyZWcxLmFkZChyZWN0MSk7Ci0JcmVnMi5hZGQocmVjdDIpOwotCQotCWlmIChyZWcxLmhhc2hDb2RlKCkgPT0gcmVnMi5oYXNoQ29kZSgpKSB7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJZmFpbCgidHdvIGRpZmZlcmVudCByZWdpb25zIHNob3VsZCBoYXZlIGRpZmZlcmVudCBoYXNoQ29kZSIpOwotCX0KLQlyZWcyLmRpc3Bvc2UoKTsJCi0KLQlyZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcyLmFkZChyZWN0MSk7Ci0KLQotLy8gQlVHOiB0aGlzIHNob3VsZCBwYXNzCQotLy8JaWYgKHJlZzEuaGFzaENvZGUoKSAhPSByZWcyLmhhc2hDb2RlKCkpIHsKLS8vCQlyZWcxLmRpc3Bvc2UoKTsKLS8vCQlyZWcyLmRpc3Bvc2UoKTsKLS8vCQlmYWlsKCJ0d28gcmVnaW9ucyByZXByZXNlbnRpbmcgc2FtZSBhcmVhIHNob3VsZCBoYXZlIHNhbWUgaGFzaENvZGUiKTsKLS8vCX0KLQkKLQlyZWcxLmRpc3Bvc2UoKTsKLQlyZWcyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSk7Ci0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpOwotCVJlY3RhbmdsZSByZWN0MyA9IG5ldyBSZWN0YW5nbGUoMTAsMTAsMTAsMTApOwotCVJlY3RhbmdsZSByZWN0NCA9IG5ldyBSZWN0YW5nbGUoNTAsMjUsMTAsMTApOwotCVJlY3RhbmdsZSByZWN0NSA9IG5ldyBSZWN0YW5nbGUoMjUsMjAsMjUsMTApOwotCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuaW50ZXJzZWN0KHJlY3QxKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmludGVyc2VjdChyZWN0MSk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgZm9yIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlyZWcuaW50ZXJzZWN0KHJlY3QyKTsKLQlSZWN0YW5nbGUgYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWN0MSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCAxIik7Ci0JfQotCXJlZy5pbnRlcnNlY3QocmVjdDMpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVjdDMpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgMiIpOwotCX0KLQlyZWcuaW50ZXJzZWN0KHJlY3Q0KTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCAzIik7Ci0JfQotCXJlZy5hZGQocmVjdDEudW5pb24ocmVjdDQpKTsKLQlyZWcuaW50ZXJzZWN0KHJlY3Q1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlY3Q1KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDQiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChyZWN0MSk7Ci0JcmVnLmFkZChyZWN0NCk7Ci0JcmVnLmludGVyc2VjdChyZWN0NSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhuZXcgUmVjdGFuZ2xlKDI1LDIwLDI1LDUpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDUiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlSZWdpb24gcmVnMSA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMS5hZGQobmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpKTsKLQotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLmludGVyc2VjdChyZWcxKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5pbnRlcnNlY3QocmVnMSk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIGZvciBlbXB0eSByZWdpb24iKTsKLQl9Ci0JCi0JUmVnaW9uIHJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzIuYWRkKG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KSk7Ci0KLQlyZWcuYWRkKHJlZzEpOwotCXJlZy5pbnRlcnNlY3QocmVnMik7Ci0JUmVjdGFuZ2xlIGJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVnMS5nZXRCb3VuZHMoKSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzIuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDEiKTsKLQl9Ci0JcmVnMi5kaXNwb3NlKCk7Ci0JCi0JUmVnaW9uIHJlZzMgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzMuYWRkKG5ldyBSZWN0YW5nbGUoMTAsMTAsMTAsMTApKTsKLQkKLQlyZWcuaW50ZXJzZWN0KHJlZzMpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVnMy5nZXRCb3VuZHMoKSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzMuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDIiKTsKLQl9Ci0JcmVnMy5kaXNwb3NlKCk7Ci0JCi0JUmVnaW9uIHJlZzQgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzQuYWRkKG5ldyBSZWN0YW5nbGUoNTAsMjUsMTAsMTApKTsKLQotCXJlZy5pbnRlcnNlY3QocmVnNCk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWc0LmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCAzIik7Ci0JfQotCQotCVJlZ2lvbiByZWc1ID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWc1LmFkZChuZXcgUmVjdGFuZ2xlKDI1LDIwLDI1LDEwKSk7Ci0JCi0JcmVnLmFkZChyZWcxLmdldEJvdW5kcygpLnVuaW9uKHJlZzQuZ2V0Qm91bmRzKCkpKTsKLQlyZWcuaW50ZXJzZWN0KHJlZzUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVnNS5nZXRCb3VuZHMoKSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzQuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDQiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChyZWcxKTsKLQlyZWcuYWRkKHJlZzQpOwotCXJlZy5pbnRlcnNlY3QocmVnNSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhuZXcgUmVjdGFuZ2xlKDI1LDIwLDI1LDUpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnNC5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgNSIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotCXJlZzEuZGlzcG9zZSgpOwotCXJlZzQuZGlzcG9zZSgpOwotCXJlZzUuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdHNJSUlJKCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMjAsNTAsMzApOwotCVJlY3RhbmdsZSByZWN0SW50ZXIxID0gbmV3IFJlY3RhbmdsZSg1OSw0OSwxMCwyMCk7Ci0JUmVjdGFuZ2xlIHJlY3ROb3RJbnRlcjEgPSBuZXcgUmVjdGFuZ2xlKDAsNSwxMCwxNSk7Ci0JCi0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSgzMCw0MCwxMCwxMDApOwotCVJlY3RhbmdsZSByZWN0SW50ZXIyID0gbmV3IFJlY3RhbmdsZSgzOSwxMzksMSw1KTsKLQlSZWN0YW5nbGUgcmVjdE5vdEludGVyMTIgPSBuZXcgUmVjdGFuZ2xlKDQwLDUwLDUsMTUpOwotCQotCQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLmludGVyc2VjdHMocmVjdEludGVyMS54LCByZWN0SW50ZXIxLnksIHJlY3RJbnRlcjEud2lkdGgsIHJlY3RJbnRlcjEuaGVpZ2h0KTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaWYgKHJlZy5pbnRlcnNlY3RzKHJlY3QxLngsIHJlY3QxLnksIHJlY3QxLndpZHRoLCByZWN0MS5oZWlnaHQpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgY2FuJ3QgcmV0dXJuIHRydWUgb24gZW1wdHkgcmVnaW9uIik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCWlmICghcmVnLmludGVyc2VjdHMocmVjdDEueCwgcmVjdDEueSwgcmVjdDEud2lkdGgsIHJlY3QxLmhlaWdodCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUiKTsKLQl9Ci0JaWYgKCFyZWcuaW50ZXJzZWN0cyhyZWN0SW50ZXIxLngsIHJlY3RJbnRlcjEueSwgcmVjdEludGVyMS53aWR0aCwgcmVjdEludGVyMS5oZWlnaHQpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlICIpOwotCX0KLQlpZiAocmVnLmludGVyc2VjdHMocmVjdE5vdEludGVyMS54LCByZWN0Tm90SW50ZXIxLnksIHJlY3ROb3RJbnRlcjEud2lkdGgsIHJlY3ROb3RJbnRlcjEuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIHJldHVybiB0cnVlIG9uIHJlY3RhbmdsZSBub3QgaW50ZXJzZWN0aW5nIHdpdGggcmVnaW9uIik7Ci0JfQotCQotCXJlZy5hZGQocmVjdDIpOwotCWlmICghcmVnLmludGVyc2VjdHMocmVjdDIueCwgcmVjdDIueSwgcmVjdDIud2lkdGgsIHJlY3QyLmhlaWdodCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUiKTsKLQl9Ci0JaWYgKCFyZWcuaW50ZXJzZWN0cyhyZWN0SW50ZXIyLngsIHJlY3RJbnRlcjIueSwgcmVjdEludGVyMi53aWR0aCwgcmVjdEludGVyMi5oZWlnaHQpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlICIpOwotCX0KLQlpZiAocmVnLmludGVyc2VjdHMocmVjdE5vdEludGVyMTIueCwgcmVjdE5vdEludGVyMTIueSwgcmVjdE5vdEludGVyMTIud2lkdGgsIHJlY3ROb3RJbnRlcjEyLmhlaWdodCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyByZXR1cm4gdHJ1ZSBvbiByZWN0YW5nbGUgbm90IGludGVyc2VjdGluZyB3aXRoIHJlZ2lvbiIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDEwLDIwLDUwLDMwKTsKLQlSZWN0YW5nbGUgcmVjdEludGVyMSA9IG5ldyBSZWN0YW5nbGUoNTksNDksMTAsMjApOwotCVJlY3RhbmdsZSByZWN0Tm90SW50ZXIxID0gbmV3IFJlY3RhbmdsZSgwLDUsMTAsMTUpOwotCQotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoMzAsNDAsMTAsMTAwKTsKLQlSZWN0YW5nbGUgcmVjdEludGVyMiA9IG5ldyBSZWN0YW5nbGUoMzksMTM5LDEsNSk7Ci0JUmVjdGFuZ2xlIHJlY3ROb3RJbnRlcjEyID0gbmV3IFJlY3RhbmdsZSg0MCw1MCw1LDE1KTsKLQkKLQkKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjEpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlpZiAocmVnLmludGVyc2VjdHMocmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgY2FuJ3QgcmV0dXJuIHRydWUgb24gZW1wdHkgcmVnaW9uIik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCWlmICghcmVnLmludGVyc2VjdHMocmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlIik7Ci0JfQotCWlmICghcmVnLmludGVyc2VjdHMocmVjdEludGVyMSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUgIik7Ci0JfQotCWlmIChyZWcuaW50ZXJzZWN0cyhyZWN0Tm90SW50ZXIxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIHJldHVybiB0cnVlIG9uIHJlY3RhbmdsZSBub3QgaW50ZXJzZWN0aW5nIHdpdGggcmVnaW9uIik7Ci0JfQotCQotCXJlZy5hZGQocmVjdDIpOwotCWlmICghcmVnLmludGVyc2VjdHMocmVjdDIpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlIik7Ci0JfQotCWlmICghcmVnLmludGVyc2VjdHMocmVjdEludGVyMikpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUgIik7Ci0JfQotCWlmIChyZWcuaW50ZXJzZWN0cyhyZWN0Tm90SW50ZXIxMikpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyByZXR1cm4gdHJ1ZSBvbiByZWN0YW5nbGUgbm90IGludGVyc2VjdGluZyB3aXRoIHJlZ2lvbiIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JLy8gdGVzdCBpbiBkaXNwb3NlKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VtcHR5KCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCVJlY3RhbmdsZSBlbXB0eVJlY3QxID0gbmV3IFJlY3RhbmdsZSgxMCwyMCwwLDIwMCk7Ci0JUmVjdGFuZ2xlIGVtcHR5UmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDEwLDIwLDEwLDApOwotCVJlY3RhbmdsZSByZWN0ID0gbmV3IFJlY3RhbmdsZSgxMCwyMCw1MCwxMDApOwotCQotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpc0VtcHR5IGRpZG4ndCByZXR1cm4gdHJ1ZSBvbiBlbXB0eSByZWdpb24iKTsKLQl9Ci0JCi0JcmVnLmFkZChlbXB0eVJlY3QxKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaXNFbXB0eSBkaWRuJ3QgcmV0dXJuIHRydWUgb24gZW1wdHkgcmVnaW9uIik7Ci0JfQotCi0JcmVnLmFkZChlbXB0eVJlY3QyKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaXNFbXB0eSBkaWRuJ3QgcmV0dXJuIHRydWUgb24gZW1wdHkgcmVnaW9uIik7Ci0JfQotCi0JcmVnLmFkZChyZWN0KTsKLQlpZiAocmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpc0VtcHR5IHJldHVybmVkIHRydWUgb24gbm9uIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQkKLQlyZWcuZGlzcG9zZSgpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdWJ0cmFjdCRJKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXRyeSB7Ci0JCXJlZy5zdWJ0cmFjdCgoaW50W10pbnVsbCk7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN1YnRyYWN0IGEgbnVsbCBhcnJheSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9CQotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLnN1YnRyYWN0KG5ldyBpbnRbXXt9KTsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwwLCA1MCwwLCA1MCwyNSwgMCwyNX0pOwotCXJlZy5zdWJ0cmFjdChuZXcgaW50W10gezAsMCwgNTAsMCwgNTAsMjAsIDAsMjB9KTsKLQlSZWN0YW5nbGUgYm94ID0gcmVnLmdldEJvdW5kcygpOwotCXJlZy5kaXNwb3NlKCk7Ci0JUmVjdGFuZ2xlIGV4cGVjdGVkID0gbmV3IFJlY3RhbmdsZSAoMCwyMCw1MCw1KTsKLQlpZiAoIWJveC5lcXVhbHMoZXhwZWN0ZWQpKSB7Ci0JCWZhaWwoInN1YnRyYWN0IDEgZmFpbGVkIC0gZXhwZWN0ZWQ6ICIrZXhwZWN0ZWQrIiBhY3R1YWw6ICIrYm94KTsKLQl9Ci0JCi0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwwLCA1MCwwLCA1MCwyNSwgMCwyNX0pOwotCXJlZy5hZGQobmV3IGludFtdIHswLDI1LCA1MCwyNSwgNTAsNDAsIDAsNDB9KTsKLQlyZWcuc3VidHJhY3QobmV3IGludFtdIHswLDI1LCA1MCwyNSwgNTAsNDAsIDAsNDB9KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQlleHBlY3RlZCA9IG5ldyBSZWN0YW5nbGUgKDAsMCw1MCwyNSk7Ci0JaWYgKCFib3guZXF1YWxzKGV4cGVjdGVkKSkgewotCQlmYWlsKCJzdWJ0cmFjdCAyIGZhaWxlZCAtIGV4cGVjdGVkOiAiK2V4cGVjdGVkKyIgYWN0dWFsOiAiK2JveCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpOwotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KTsKLQlSZWN0YW5nbGUgcmVjdDMgPSBuZXcgUmVjdGFuZ2xlKDEwLDEwLDEwLDEwKTsKLQlSZWN0YW5nbGUgcmVjdDQgPSBuZXcgUmVjdGFuZ2xlKDUwLDI1LDEwLDEwKTsKLQlSZWN0YW5nbGUgcmVjdDUgPSBuZXcgUmVjdGFuZ2xlKDAsMCw2MCwyMCk7Ci0KLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5zdWJ0cmFjdChyZWN0MSk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5zdWJ0cmFjdChyZWN0MSk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCBmb3IgZW1wdHkgcmVnaW9uIik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCXJlZy5zdWJ0cmFjdChyZWN0Mik7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCAxIik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCXJlZy5zdWJ0cmFjdChyZWN0Myk7Ci0JUmVjdGFuZ2xlIGJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCAyIik7Ci0JfQotCXJlZy5zdWJ0cmFjdChyZWN0NCk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWN0MSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDMiKTsKLQl9Ci0JcmVnLmFkZChyZWN0MS51bmlvbihyZWN0NCkpOwotCXJlZy5zdWJ0cmFjdChyZWN0NSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsMjAsNjAsMTUpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgNCIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKHJlY3QxKTsKLQlyZWcuYWRkKHJlY3Q0KTsKLQlyZWcuc3VidHJhY3QocmVjdDUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLDIwLDYwLDE1KSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDUiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCkgewotCVJlZ2lvbiByZWcxID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcxLmFkZChuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSkpOwotCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuc3VidHJhY3QocmVnMSk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuc3VidHJhY3QocmVnMSk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgZm9yIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQkKLQlSZWdpb24gcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMi5hZGQobmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpKTsKLQkKLQlyZWcuYWRkKHJlZzEpOwotCXJlZy5zdWJ0cmFjdChyZWcyKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzIuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgMSIpOwotCX0KLQlyZWcyLmRpc3Bvc2UoKTsKLQkKLQlSZWdpb24gcmVnMyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMy5hZGQobmV3IFJlY3RhbmdsZSgxMCwxMCwxMCwxMCkpOwotCQotCXJlZy5hZGQocmVnMSk7Ci0JcmVnLnN1YnRyYWN0KHJlZzMpOwotCVJlY3RhbmdsZSBib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlZzEuZ2V0Qm91bmRzKCkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWczLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDIiKTsKLQl9Ci0JcmVnMy5kaXNwb3NlKCk7Ci0JCi0JUmVnaW9uIHJlZzQgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzQuYWRkKG5ldyBSZWN0YW5nbGUoNTAsMjUsMTAsMTApKTsKLQkKLQlyZWcuc3VidHJhY3QocmVnNCk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWcxLmdldEJvdW5kcygpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnNC5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCAzIik7Ci0JfQotCi0JUmVnaW9uIHJlZzUgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzUuYWRkKG5ldyBSZWN0YW5nbGUoMCwwLDYwLDIwKSk7Ci0JCi0JcmVnLmFkZChyZWcxLmdldEJvdW5kcygpLnVuaW9uKHJlZzQuZ2V0Qm91bmRzKCkpKTsKLQlyZWcuc3VidHJhY3QocmVnNSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsMjAsNjAsMTUpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnNC5kaXNwb3NlKCk7Ci0JCXJlZzUuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgNCIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKHJlZzEpOwotCXJlZy5hZGQocmVnNCk7Ci0JcmVnLnN1YnRyYWN0KHJlZzUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLDIwLDYwLDE1KSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzQuZGlzcG9zZSgpOwotCQlyZWc1LmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDUiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQlyZWcxLmRpc3Bvc2UoKTsKLQlyZWc0LmRpc3Bvc2UoKTsKLQlyZWc1LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkKLQlTdHJpbmcgcyA9IHJlZy50b1N0cmluZygpOwotCQotCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCWZhaWwoInRvU3RyaW5nIHJldHVybnMgbnVsbCBvciBlbXB0eSBzdHJpbmciKTsKLQl9Ci0JCi0JcmVnLmFkZChuZXcgUmVjdGFuZ2xlKDEsMSwxMCwyMCkpOwotCXMgPSByZWcudG9TdHJpbmcoKTsKLQkKLQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgewotCQlmYWlsKCJ0b1N0cmluZyByZXR1cm5zIG51bGwgb3IgZW1wdHkgc3RyaW5nIik7Ci0JfQotCi0JcmVnLmRpc3Bvc2UoKTsKLQlzID0gcmVnLnRvU3RyaW5nKCk7Ci0JCi0JaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKLQkJZmFpbCgidG9TdHJpbmcgcmV0dXJucyBudWxsIG9yIGVtcHR5IHN0cmluZyIpOwotCX0JCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCkgewotCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsKLQkJd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSBub3Qgd3JpdHRlbiIpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRfaW50QXJyYXkoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaW50W10gcG9pbnRzID0gbmV3IGludFtdIHsxfTsKLQlyZWcuYWRkKHBvaW50cyk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQkKLQlSZWdpb24gcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcG9pbnRzID0gbmV3IGludFtdIHsxLDJ9OwotCXJlZzIuYWRkKHBvaW50cyk7Ci0JcmVnMi5kaXNwb3NlKCk7Ci0JCi0JUmVnaW9uIHJlZzMgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXBvaW50cyA9IG5ldyBpbnRbXSB7MSwyLDN9OwotCXJlZzMuYWRkKHBvaW50cyk7Ci0JcmVnMy5kaXNwb3NlKCk7Ci0JCi0JUmVnaW9uIHJlZzQgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXBvaW50cyA9IG5ldyBpbnRbXSB7MSwyLDMsNH07Ci0JcmVnNC5hZGQocG9pbnRzKTsKLQlyZWc0LmRpc3Bvc2UoKTsKLQkKLQlSZWdpb24gcmVnNSA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcG9pbnRzID0gbmV3IGludFtdIHsxLDIsMyw0LDV9OwotCXJlZzUuYWRkKHBvaW50cyk7Ci0JcmVnNS5kaXNwb3NlKCk7Ci0JCi0JUmVnaW9uIHJlZzYgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXBvaW50cyA9IG5ldyBpbnRbXSB7MSwyLDMsNCw1LDZ9OwotCXJlZzYuYWRkKHBvaW50cyk7Ci0JcmVnNi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3RzSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0c0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VtcHR5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdWJ0cmFjdCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRfaW50QXJyYXkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZCRJIikpIHRlc3RfYWRkJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIikpIHRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRhaW5zSUkiKSkgdGVzdF9jb250YWluc0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250YWluc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9jb250YWluc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIikpIHRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdHNJSUlJIikpIHRlc3RfaW50ZXJzZWN0c0lJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW1wdHkiKSkgdGVzdF9pc0VtcHR5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdWJ0cmFjdCRJIikpIHRlc3Rfc3VidHJhY3QkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3VidHJhY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKSkgdGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZF9pbnRBcnJheSIpKSB0ZXN0X2FkZF9pbnRBcnJheSgpOwotfQotCi0vKiBjdXN0b20gKi8KLQlEaXNwbGF5IGRpc3BsYXk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWI0MDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRmlsbExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRmlsbExheW91dCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRmlsbExheW91dCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtQXR0YWNobWVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUF0dGFjaG1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkZmQwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtQXR0YWNobWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1BdHRhY2htZW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1BdHRhY2htZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JRm9ybUF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDEwKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDEwMCwgMTApOwotCWFzc2VydE5vdE51bGwoYXR0YWNobWVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2hlbGwsIDEwKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSgpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KHNoZWxsLCAxMCwgU1dULkxFRlQpOwotCWFzc2VydE5vdE51bGwoYXR0YWNobWVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JRm9ybUF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoYXR0YWNobWVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1BdHRhY2htZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFNoZWxsIHNoZWxsOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMmM1Y2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJIikpIHRlc3RfQ29uc3RydWN0b3JJSSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUxheW91dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTVjNTk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtTGF5b3V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtTGF5b3V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWREYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGRkMmU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCWFzc2VydE5vdE51bGwoZGF0YSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID09IEdyaWREYXRhLkNFTlRFUik7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPT0gR3JpZERhdGEuQkVHSU5OSU5HKTsKLQlhc3NlcnRUcnVlKGRhdGEud2lkdGhIaW50ID09IFNXVC5ERUZBVUxUKTsKLQlhc3NlcnRUcnVlKGRhdGEuaGVpZ2h0SGludCA9PSBTV1QuREVGQVVMVCk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmhvcml6b250YWxJbmRlbnQgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmhvcml6b250YWxTcGFuID09IDEpOwotCWFzc2VydFRydWUoZGF0YS52ZXJ0aWNhbFNwYW4gPT0gMSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPT0gZmFsc2UpOwotCWFzc2VydFRydWUoZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlhc3NlcnROb3ROdWxsKGRhdGEpOwotCWFzc2VydFRydWUoZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9PSBHcmlkRGF0YS5GSUxMKTsKLQlhc3NlcnRUcnVlKGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9PSBHcmlkRGF0YS5GSUxMKTsKLQlhc3NlcnRUcnVlKGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9PSB0cnVlKTsKLQlhc3NlcnRUcnVlKGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSSgpIHsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKDEwMCwgMTAwKTsKLQlhc3NlcnROb3ROdWxsKGRhdGEpOwotCWFzc2VydFRydWUoZGF0YS53aWR0aEhpbnQgPT0gMTAwKTsKLQlhc3NlcnRUcnVlKGRhdGEuaGVpZ2h0SGludCA9PSAxMDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZERhdGEoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjUxMTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZExheW91dCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvcklaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklaIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJWiIpKSB0ZXN0X0NvbnN0cnVjdG9ySVooKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1YjRlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0RhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dEYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMTljNWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3Rvckkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09MRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmYwYWI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09MRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9MRQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PTEUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09MRShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXJyb3JJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9lcnJvckkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcnJvcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9lcnJvcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmluZFByb2dyYW1JRExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9maW5kUHJvZ3JhbUlETGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc09sZUZpbGVMamF2YV9pb19GaWxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc09sZUZpbGVMamF2YV9pb19GaWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09MRSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcnJvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Vycm9ySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbmRQcm9ncmFtSURMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNPbGVGaWxlTGphdmFfaW9fRmlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Vycm9ySSIpKSB0ZXN0X2Vycm9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXJyb3JJSSIpKSB0ZXN0X2Vycm9ySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbmRQcm9ncmFtSURMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2ZpbmRQcm9ncmFtSURMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNPbGVGaWxlTGphdmFfaW9fRmlsZSIpKSB0ZXN0X2lzT2xlRmlsZUxqYXZhX2lvX0ZpbGUoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4MDZkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUF1dG9tYXRpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQXV0b21hdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24gZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RG9jdW1lbnRhdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERvY3VtZW50YXRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZ1bmN0aW9uRGVzY3JpcHRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVscEZpbGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRIZWxwRmlsZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJRHNPZk5hbWVzJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJRHNPZk5hbWVzJExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGFzdEVycm9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRMYXN0RXJyb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TmFtZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lc0lJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXROYW1lc0lJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvcGVydHlEZXNjcmlwdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFByb3BlcnR5RGVzY3JpcHRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvcGVydHlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcm9wZXJ0eUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZUluZm9BdHRyaWJ1dGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUeXBlSW5mb0F0dHJpYnV0ZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VOb1JlcGx5SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW52b2tlTm9SZXBseUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERvY3VtZW50YXRpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGdW5jdGlvbkRlc2NyaXB0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVscEZpbGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJRHNPZk5hbWVzJExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMYXN0RXJyb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE5hbWVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXROYW1lc0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9wZXJ0eURlc2NyaXB0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJvcGVydHlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VHlwZUluZm9BdHRyaWJ1dGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VOb1JlcGx5SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERvY3VtZW50YXRpb25JIikpIHRlc3RfZ2V0RG9jdW1lbnRhdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZ1bmN0aW9uRGVzY3JpcHRpb25JIikpIHRlc3RfZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlbHBGaWxlSSIpKSB0ZXN0X2dldEhlbHBGaWxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SURzT2ZOYW1lcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2dldElEc09mTmFtZXMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExhc3RFcnJvciIpKSB0ZXN0X2dldExhc3RFcnJvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZUkiKSkgdGVzdF9nZXROYW1lSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZXNJSSIpKSB0ZXN0X2dldE5hbWVzSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb3BlcnR5RGVzY3JpcHRpb25JIikpIHRlc3RfZ2V0UHJvcGVydHlEZXNjcmlwdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb3BlcnR5SSIpKSB0ZXN0X2dldFByb3BlcnR5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKSkgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpKSB0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFR5cGVJbmZvQXR0cmlidXRlcyIpKSB0ZXN0X2dldFR5cGVJbmZvQXR0cmlidXRlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlSSIpKSB0ZXN0X2ludm9rZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkiKSkgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlTm9SZXBseUkiKSkgdGVzdF9pbnZva2VOb1JlcGx5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpKSB0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKSkgdGVzdF9zZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X3NldFByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0NTAxNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUNsaWVudFNpdGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2lvX0ZpbGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9pb19GaWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmdMamF2YV9pb19GaWxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmdMamF2YV9pb19GaWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVhY3RpdmF0ZUluUGxhY2VDbGllbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RlYWN0aXZhdGVJblBsYWNlQ2xpZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZG9WZXJiSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZG9WZXJiSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2V4ZWNJSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9leGVjSUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluZGVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW5kZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvZ3JhbUlEKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcm9ncmFtSUQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0RpcnR5KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc0RpcnR5IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb2N1c0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzRm9jdXNDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcXVlcnlTdGF0dXNJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9xdWVyeVN0YXR1c0kgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zYXZlTGphdmFfaW9fRmlsZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NhdmVMamF2YV9pb19GaWxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluZGVudExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbmRlbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dQcm9wZXJ0aWVzTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dQcm9wZXJ0aWVzTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9pb19GaWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2lvX0ZpbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RlYWN0aXZhdGVJblBsYWNlQ2xpZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kb1ZlcmJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9leGVjSUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5kZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9ncmFtSUQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlydHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRm9jdXNDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9xdWVyeVN0YXR1c0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NhdmVMamF2YV9pb19GaWxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5kZW50TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dQcm9wZXJ0aWVzTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9pb19GaWxlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2lvX0ZpbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfaW9fRmlsZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2lvX0ZpbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RlYWN0aXZhdGVJblBsYWNlQ2xpZW50IikpIHRlc3RfZGVhY3RpdmF0ZUluUGxhY2VDbGllbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RvVmVyYkkiKSkgdGVzdF9kb1ZlcmJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9leGVjSUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X2V4ZWNJSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbmRlbnQiKSkgdGVzdF9nZXRJbmRlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb2dyYW1JRCIpKSB0ZXN0X2dldFByb2dyYW1JRCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXJ0eSIpKSB0ZXN0X2lzRGlydHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRm9jdXNDb250cm9sIikpIHRlc3RfaXNGb2N1c0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3F1ZXJ5U3RhdHVzSSIpKSB0ZXN0X3F1ZXJ5U3RhdHVzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2F2ZUxqYXZhX2lvX0ZpbGVaIikpIHRlc3Rfc2F2ZUxqYXZhX2lvX0ZpbGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbmRlbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3NldEluZGVudExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93UHJvcGVydGllc0xqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2hvd1Byb3BlcnRpZXNMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ29udHJvbFNpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNvbnRyb2xTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMjdkOTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ29udHJvbFNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ29udHJvbFNpdGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ29udHJvbFNpdGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZEV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJhY2tncm91bmQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9yZWdyb3VuZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNpdGVQcm9wZXJ0eUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNpdGVQcm9wZXJ0eUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlESUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpdGVQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTaXRlUHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNpdGVQcm9wZXJ0eUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l0ZVByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X2FkZEV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIikpIHRlc3RfYWRkRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKSkgdGVzdF9hZGRQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udCIpKSB0ZXN0X2dldEZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaXRlUHJvcGVydHlJIikpIHRlc3RfZ2V0U2l0ZVByb3BlcnR5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRElMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRElMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXRlUHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X3NldFNpdGVQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiZjc4Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnJhbWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNzczYzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVGcmFtZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVGcmFtZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGFpbmVyTWVudXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRhaW5lck1lbnVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsZU1lbnVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGaWxlTWVudXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRXaW5kb3dNZW51cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0V2luZG93TWVudXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250YWluZXJNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbnRhaW5lck1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZpbGVNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZpbGVNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXaW5kb3dNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdpbmRvd01lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRhaW5lck1lbnVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWxlTWVudXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFdpbmRvd01lbnVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250YWluZXJNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbGVNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFdpbmRvd01lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRhaW5lck1lbnVzIikpIHRlc3RfZ2V0Q29udGFpbmVyTWVudXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbGVNZW51cyIpKSB0ZXN0X2dldEZpbGVNZW51cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2luZG93TWVudXMiKSkgdGVzdF9nZXRXaW5kb3dNZW51cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udGFpbmVyTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3Rfc2V0Q29udGFpbmVyTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWxlTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3Rfc2V0RmlsZU1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2luZG93TWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3Rfc2V0V2luZG93TWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzU3NmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZ1bmN0aW9uRGVzY3JpcHRpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnVuY3Rpb25EZXNjcmlwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZ1bmN0aW9uRGVzY3JpcHRpb24gZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZ1bmN0aW9uRGVzY3JpcHRpb24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDdkZjdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50IikpIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjODIxMzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVByb3BlcnR5RGVzY3JpcHRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVByb3BlcnR5RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiOTM4OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQcm9wZXJ0eURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlUHJvcGVydHlEZXNjcmlwdGlvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVQcm9wZXJ0eURlc2NyaXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUHJvcGVydHlEZXNjcmlwdGlvbiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQcm9wZXJ0eURlc2NyaXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUHJvcGVydHlEZXNjcmlwdGlvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTRkZWIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuVmFyaWFudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5WYXJpYW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckYoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yRiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJUygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JJUyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lEaXNwYXRjaCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGlzcGF0Y2ggbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lVbmtub3duKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lVbmtub3duIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvclMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yUyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEF1dG9tYXRpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEF1dG9tYXRpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb29sZWFuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb29sZWFuIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QnlSZWYoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJ5UmVmIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzcGF0Y2goKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERpc3BhdGNoIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmxvYXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZsb2F0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaG9ydCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2hvcnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFR5cGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRVbmtub3duKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRVbmtub3duIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QnlSZWZGKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCeVJlZkYgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCeVJlZkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJ5UmVmSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJ5UmVmUygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QnlSZWZTIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QnlSZWZaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCeVJlZlogbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckYiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJUyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGlzcGF0Y2giKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVVua25vd24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JTIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcloiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEF1dG9tYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvb2xlYW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJ5UmVmIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREaXNwYXRjaCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmxvYXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2hvcnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VHlwZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VW5rbm93biIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QnlSZWZGIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCeVJlZkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJ5UmVmUyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QnlSZWZaIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JGIikpIHRlc3RfQ29uc3RydWN0b3JGKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySVMiKSkgdGVzdF9Db25zdHJ1Y3RvcklTKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGlzcGF0Y2giKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lEaXNwYXRjaCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVW5rbm93biIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVVua25vd24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbiIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JTIikpIHRlc3RfQ29uc3RydWN0b3JTKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcloiKSkgdGVzdF9Db25zdHJ1Y3RvclooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBdXRvbWF0aW9uIikpIHRlc3RfZ2V0QXV0b21hdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm9vbGVhbiIpKSB0ZXN0X2dldEJvb2xlYW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJ5UmVmIikpIHRlc3RfZ2V0QnlSZWYoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERpc3BhdGNoIikpIHRlc3RfZ2V0RGlzcGF0Y2goKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZsb2F0IikpIHRlc3RfZ2V0RmxvYXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEludCIpKSB0ZXN0X2dldEludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2hvcnQiKSkgdGVzdF9nZXRTaG9ydCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3RyaW5nIikpIHRlc3RfZ2V0U3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUeXBlIikpIHRlc3RfZ2V0VHlwZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VW5rbm93biIpKSB0ZXN0X2dldFVua25vd24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJ5UmVmRiIpKSB0ZXN0X3NldEJ5UmVmRigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QnlSZWZJIikpIHRlc3Rfc2V0QnlSZWZJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCeVJlZlMiKSkgdGVzdF9zZXRCeVJlZlMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJ5UmVmWiIpKSB0ZXN0X3NldEJ5UmVmWigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjNiMGMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludERpYWxvZwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50RGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JcHJpbnREaWFsb2cgPSBuZXcgUHJpbnREaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQlzZXREaWFsb2cocHJpbnREaWFsb2cpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCkgewotCW5ldyBQcmludERpYWxvZyhzaGVsbCk7Ci0JCi0JdHJ5IHsKLQkJbmV3IFByaW50RGlhbG9nKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCW5ldyBQcmludERpYWxvZyhzaGVsbCwgU1dULk5PTkUpOwotCQotCXRyeSB7Ci0JCW5ldyBQcmludERpYWxvZyhudWxsLCBTV1QuTk9ORSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmRQYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRFbmRQYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbnRUb0ZpbGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFByaW50VG9GaWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2NvcGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNjb3BlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3RhcnRQYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdGFydFBhZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9vcGVuIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5kUGFnZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEVuZFBhZ2VJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJpbnRUb0ZpbGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRQcmludFRvRmlsZVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTY29wZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNjb3BlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFN0YXJ0UGFnZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFN0YXJ0UGFnZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2coKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5kUGFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJpbnRUb0ZpbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNjb3BlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdGFydFBhZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVuZFBhZ2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQcmludFRvRmlsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNjb3BlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U3RhcnRQYWdlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RW5kUGFnZSIpKSB0ZXN0X2dldEVuZFBhZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByaW50VG9GaWxlIikpIHRlc3RfZ2V0UHJpbnRUb0ZpbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNjb3BlIikpIHRlc3RfZ2V0U2NvcGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0YXJ0UGFnZSIpKSB0ZXN0X2dldFN0YXJ0UGFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuZFBhZ2VJIikpIHRlc3Rfc2V0RW5kUGFnZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFByaW50VG9GaWxlWiIpKSB0ZXN0X3NldFByaW50VG9GaWxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2NvcGVJIikpIHRlc3Rfc2V0U2NvcGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTdGFydFBhZ2VJIikpIHRlc3Rfc2V0U3RhcnRQYWdlSSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLQlQcmludERpYWxvZyBwcmludERpYWxvZzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2N2ViNDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVN0cmluZyBkZXRhaWwgPSAiIjsKLQlpZiAoUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKSA9PSBudWxsKSB7Ci0JCS8qIFRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIHNvIHZlcmlmeSB0aGF0IHRoZQotCQkgKiBjb25zdHJ1Y3RvciB0aHJvd3MgYW4gRVJST1JfTk9fSEFORExFUyBTV1RFcnJvci4KLQkJICovCi0JCXRyeSB7Ci0JCQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcigpOwotCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGV4KSB7Ci0JCQlpZiAoZXguY29kZSA9PSBTV1QuRVJST1JfTk9fSEFORExFUykgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJFUlJPUl9OT19IQU5ETEVTIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCX0gZWxzZSB7Ci0JCS8qIFRoZXJlIGlzIGF0IGxlYXN0IGEgZGVmYXVsdCBwcmludGVyLCBzbyB2ZXJpZnkgdGhhdAotCQkgKiB0aGUgY29uc3RydWN0b3IgZG9lcyBub3QgdGhyb3cgYW55IGV4Y2VwdGlvbnMuCi0JCSAqLwotCQl0cnkgewotCQkJUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoKTsKLQkJCXByaW50ZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCQlkZXRhaWwgPSBleC5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UoIkV4Y2VwdGlvbiB0aHJvd246ICIgKyBkZXRhaWwsIGV4Y2VwdGlvblRocm93bik7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVN0cmluZyBkZXRhaWwgPSAiIjsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCS8qIFRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIHNvIHZlcmlmeSB0aGF0IHRoZQotCQkgKiBjb25zdHJ1Y3RvciB0aHJvd3MgYW4gRVJST1JfTk9fSEFORExFUyBTV1RFcnJvci4KLQkJICovCi0JCXRyeSB7Ci0JCQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQkJCXByaW50ZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChTV1RFcnJvciBleCkgewotCQkJaWYgKGV4LmNvZGUgPT0gU1dULkVSUk9SX05PX0hBTkRMRVMpIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiRVJST1JfTk9fSEFORExFUyBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9IGVsc2UgewotCQkvKiBUaGVyZSBpcyBhdCBsZWFzdCBhIGRlZmF1bHQgcHJpbnRlciwgc28gdmVyaWZ5IHRoYXQKLQkJICogdGhlIGNvbnN0cnVjdG9yIGRvZXMgbm90IHRocm93IGFueSBleGNlcHRpb25zLgotCQkgKi8KLQkJdHJ5IHsKLQkJCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJCWRldGFpbCA9IGV4LmdldE1lc3NhZ2UoKTsKLQkJfQotCQlhc3NlcnRGYWxzZSgiRXhjZXB0aW9uIHRocm93bjogIiArIGRldGFpbCwgZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2FuY2VsSm9iKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jYW5jZWxKb2Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JLy8gaWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgZG9uJ3QgZG8gdGhpcyB0ZXN0Ci0JaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAxMCwgMTApOwotCWFzc2VydFRydWUoInRyaW0gd2lkdGggb3IgaGVpZ2h0IGlzIGluY29ycmVjdCIsIHRyaW0ud2lkdGggPj0gMTAgJiYgdHJpbS5oZWlnaHQgPj0gMTApOwotCXByaW50ZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VuZEpvYigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZW5kSm9iIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZW5kUGFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZW5kUGFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQkvLyBpZiB0aGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBkb24ndCBkbyB0aGlzIHRlc3QKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHByaW50ZXIuZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiYm91bmRzIHdpZHRoIG9yIGhlaWdodCBpcyB6ZXJvIiwgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQkvLyBpZiB0aGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBkb24ndCBkbyB0aGlzIHRlc3QKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBwcmludGVyLmdldENsaWVudEFyZWEoKTsKLQlhc3NlcnRUcnVlKCJjbGllbnRBcmVhIHdpZHRoIG9yIGhlaWdodCBpcyB6ZXJvIiwgY2xpZW50QXJlYS53aWR0aCA+IDAgJiYgY2xpZW50QXJlYS5oZWlnaHQgPiAwKTsKLQlwcmludGVyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREUEkoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JLy8gaWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgZG9uJ3QgZG8gdGhpcyB0ZXN0Ci0JaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCVBvaW50IGRwaSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JYXNzZXJ0VHJ1ZSgiZHBpIHggb3IgeSBpcyB6ZXJvIiwgZHBpLnggPiAwICYmIGRwaS55ID4gMCk7Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCkgewotCS8vIFRlc3RlZCBpbiB0ZXN0X2dldFByaW50ZXJEYXRhLgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByaW50ZXJEYXRhKCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChkYXRhID09IG51bGwpIHJldHVybjsKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQlhc3NlcnRUcnVlKCJnZXRQcmludGVyRGF0YSAhPSBkYXRhIHVzZWQgaW4gY29uc3RydWN0b3IiLAotCQkJZGF0YSA9PSBwcmludGVyLmdldFByaW50ZXJEYXRhKCkpOwotCXByaW50ZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByaW50ZXJMaXN0KCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCWlmIChkYXRhID09IG51bGwpIHsKLQkJLyogSWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgdmVyaWZ5IHRoYXQgdGhlCi0JCSAqIHByaW50ZXIgbGlzdCBpcyBlbXB0eS4KLQkJICovCi0JCVByaW50ZXJEYXRhIGxpc3RbXSA9IFByaW50ZXIuZ2V0UHJpbnRlckxpc3QoKTsKLQkJaWYgKGxpc3QubGVuZ3RoICA9PSAxKSB7Ci0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJndGsiKSkgewotCQkJCS8qIEV2ZW4gdGhvdWdoIHRoZXJlIGlzIG5vIGRlZmF1bHQgcHJpbnRlciBkYXRhLCAKLQkJCQkgKiBvbiBHVEsgaXQgaXMgc3RpbGwgcG9zc2libGUgdG8gaGF2ZSBhIHByaW50IAotCQkJCSAqIHRvIGZpbGUgYmFja2VuZAotCQkJCSAqLwotCQkJCWFzc2VydFRydWUobGlzdFswXS5kcml2ZXIuZXF1YWxzKCJHdGtQcmludEJhY2tlbmRGaWxlIikpOwotCQkJfQotCQl9IGVsc2UgewotCQlhc3NlcnRUcnVlKCJwcmludGVyIGxpc3QgY29udGFpbnMgaXRlbXMgZXZlbiB0aG91Z2ggdGhlcmUgYXJlIG5vIHByaW50ZXJzIiwKLQkJCQlsaXN0Lmxlbmd0aCA9PSAwKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIElmIHRoZXJlIGlzIGF0IGxlYXN0IGEgZGVmYXVsdCBwcmludGVyLCB2ZXJpZnkKLQkJICogdGhhdCB0aGUgcHJpbnRlciBsaXN0IGlzIG5vdCBlbXB0eS4KLQkJICovCi0JCVByaW50ZXJEYXRhIGxpc3RbXSA9IFByaW50ZXIuZ2V0UHJpbnRlckxpc3QoKTsKLQkJYXNzZXJ0VHJ1ZSgicHJpbnRlciBsaXN0IGlzIGVtcHR5IiwgbGlzdC5sZW5ndGggPiAwKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0YXJ0Sm9iTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3N0YXJ0Sm9iTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdGFydFBhZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3N0YXJ0UGFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotLy8JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotLy8JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEiKTsKLS8vCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2FuY2VsSm9iIik7Ci0vLwltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotLy8JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lbmRKb2IiKTsKLS8vCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZW5kUGFnZSIpOwotLy8JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLS8vCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotLy8JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREUEkiKTsKLS8vCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdFByaW50ZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcmludGVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJpbnRlckxpc3QiKTsKLS8vCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotLy8JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotLy8JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdGFydEpvYkxqYXZhX2xhbmdfU3RyaW5nIik7Ci0vLwltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N0YXJ0UGFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NhbmNlbEpvYiIpKSB0ZXN0X2NhbmNlbEpvYigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVRyaW1JSUlJIikpIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lbmRKb2IiKSkgdGVzdF9lbmRKb2IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VuZFBhZ2UiKSkgdGVzdF9lbmRQYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREUEkiKSkgdGVzdF9nZXREUEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlZmF1bHRQcmludGVyRGF0YSIpKSB0ZXN0X2dldERlZmF1bHRQcmludGVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJpbnRlckRhdGEiKSkgdGVzdF9nZXRQcmludGVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJpbnRlckxpc3QiKSkgdGVzdF9nZXRQcmludGVyTGlzdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0YXJ0Sm9iTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zdGFydEpvYkxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdGFydFBhZ2UiKSkgdGVzdF9zdGFydFBhZ2UoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhMTcxNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXJEYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCW5ldyBQcmludGVyRGF0YSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKLQluZXcgUHJpbnRlckRhdGEoImhlbGxvIiwgInRoZXJlIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IG5ldyBQcmludGVyRGF0YSgpOwotCWFzc2VydE5vdE51bGwoZGF0YS50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGRhdGEudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcm9ncmFtX1Byb2dyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhOWIzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uUHJvZ3JhbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uUHJvZ3JhbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JRGlzcGxheS5nZXREZWZhdWx0KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb25zW2ldKTsKLQkJCWlmIChwcm9ncmFtICE9IG51bGwpIHsKLQkJCQlhc3NlcnRUcnVlKHByb2dyYW0uZXF1YWxzKHByb2dyYW0pKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JCi0JLy8gVGhpcyB0ZXN0IGlzIGluY29tcGxldGUgYmVjYXVzZSBhIHRydWUgdGVzdCBvZiBleGVjdXRlIHdvdWxkIG9wZW4KLQkvLyBhbiBhcHBsaWNhdGlvbiB0aGF0IGNhbm5vdCBiZSBwcm9ncmFtbWF0aWNhbGx5IGNsb3NlZC4KLQkKLQl0cnkgewotCQlQcm9ncmFtW10gcHJvZ3JhbXMgPSBQcm9ncmFtLmdldFByb2dyYW1zKCk7Ci0JCWlmIChwcm9ncmFtcyAhPSBudWxsICYmIHByb2dyYW1zLmxlbmd0aCA+IDApIHsKLQotCQkJLy8gQ2Fubm90IHRlc3QgZW1wdHkgc3RyaW5nIGFyZ3VtZW50IGJlY2F1c2UgaXQgbWF5IGxhdW5jaCBzb21ldGhpbmcuCi0JCQkvL2Jvb2xlYW4gcmVzdWx0ID0gcHJvZ3JhbXNbMF0uZXhlY3V0ZSgiIik7Ci0JCQkvL2Fzc2VydEZhbHNlKHJlc3VsdCk7Ci0JCQkKLQkJCS8vIHRlc3QgbnVsbCBhcmd1bWVudAotCQkJCQotCQkJcHJvZ3JhbXNbMF0uZXhlY3V0ZShudWxsKTsKLQkJCWZhaWwoIkZhaWxlZCB0byB0aHJvdyBFUlJPUl9OVUxMX0FSR1VNRU5UIik7Ci0JCX0KLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byB0aHJvdyBFUlJPUl9OVUxMX0FSR1VNRU5UIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9maW5kUHJvZ3JhbUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSBQcm9ncmFtLmdldEV4dGVuc2lvbnMoKTsKLQkvLyBObyBhc3NlcnRpb24gaGVyZSBiZWNhdXNlIHRoZSBkb2MgZG9lcyBub3QgZ3VhcmFudGVlIGEgbm9uLW51bGwgcmVzdWx0LgotCWlmIChleHRlbnNpb25zICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2dyYW0uZmluZFByb2dyYW0oZXh0ZW5zaW9uc1tpXSk7Ci0JCQkvLyBObyBhc3NlcnRpb24gaGVyZSBiZWNhdXNlIGEgbnVsbCByZXN1bHQgaXMgYWxsb3dlZC4KLQkJfQotCX0KLQkKLQl0cnkgewotCQlQcm9ncmFtLmZpbmRQcm9ncmFtKG51bGwpOwotCQlmYWlsKCJGYWlsZWQgdG8gdGhyb3cgRVJST1JfTlVMTF9BUkdVTUVOVCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIHRocm93IEVSUk9SX05VTExfQVJHVU1FTlQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJZmFpbCgiSW52YWxpZCBFeGNlcHRpb24gdGhyb3duIG9mIHR5cGUgIitlLmdldENsYXNzKCkpOwotCX0gY2F0Y2ggKEVycm9yIGUpIHsKLQkJZmFpbCgiSW52YWxpZCBFcnJvciB0aHJvd24gb2YgdHlwZSAiK2UuZ2V0Q2xhc3MoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEV4dGVuc2lvbnMoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0Tm90TnVsbChleHRlbnNpb25zW2ldKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZURhdGEoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb25zW2ldKTsKLQkJCWlmIChwcm9ncmFtICE9IG51bGwpIHsKLQkJCQlwcm9ncmFtLmdldEltYWdlRGF0YSgpOwotCQkJCS8vIE5vdGhpbmcgdG8gZG8uCi0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKLQlTdHJpbmdbXSBleHRlbnNpb25zID0gUHJvZ3JhbS5nZXRFeHRlbnNpb25zKCk7Ci0JLy8gTm8gYXNzZXJ0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZG9jIGRvZXMgbm90IGd1YXJhbnRlZSBhIG5vbi1udWxsIHJlc3VsdC4KLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9ncmFtIHByb2dyYW0gPSBQcm9ncmFtLmZpbmRQcm9ncmFtKGV4dGVuc2lvbnNbaV0pOwotCQkJaWYgKHByb2dyYW0gIT0gbnVsbCkgewotCQkJCVN0cmluZyBuYW1lID0gcHJvZ3JhbS5nZXROYW1lKCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiUHJvZ3JhbSBoYXMgbnVsbCBuYW1lIixuYW1lKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcm9ncmFtcygpIHsKLQlQcm9ncmFtW10gcHJvZ3JhbXMgPSBQcm9ncmFtLmdldFByb2dyYW1zKCk7Ci0JCi0JLy8gVGhlIHJlc3VsdCBpcyBub3Qgd2VsbC1kb2N1bWVudGVkLCBidXQgaXQgc2hvdWxkIAotCS8vIGJlIG5vbi1udWxsIGFuZCBjb250YWluIG5vIG51bGwgZW50cmllcy4KLQkKLQlhc3NlcnROb3ROdWxsKHByb2dyYW1zKTsKLQkKLQlIYXNodGFibGUgbG9va3VwID0gbmV3IEhhc2h0YWJsZSgpOwotCWZvciAoaW50IGk9MDsgaTxwcm9ncmFtcy5sZW5ndGg7IGkrKykgewotCQkKLQkJLy8gdGVzdCBub24tbnVsbCBlbnRyeQotCQlhc3NlcnROb3ROdWxsKHByb2dyYW1zW2ldKTsKLQkJCi0JCS8vIHRlc3QgdW5pcXVlIGhhc2ggY29kZQotCQlpbnQgaGFzaENvZGUgPSBwcm9ncmFtc1tpXS5oYXNoQ29kZSgpOwotCQlJbnRlZ2VyIGtleSA9IG5ldyBJbnRlZ2VyKGhhc2hDb2RlKTsKLQkJaWYgKGxvb2t1cC5jb250YWlucyhrZXkpKSB7Ci0JCQlmYWlsKCJEdXBsaWNhdGUgaGFzaCBjb2RlIGZvciAiK3Byb2dyYW1zW2ldKyIgKHNhbWUgYXMgIitsb29rdXAuZ2V0KGtleSkrIikiKTsKLQkJfQotCQllbHNlIHsKLQkJCWxvb2t1cC5wdXQoa2V5LHByb2dyYW1zW2ldKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9nZXRQcm9ncmFtcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xhdW5jaExqYXZhX2xhbmdfU3RyaW5nKCkgewotCi0JLy8gVGhpcyB0ZXN0IGlzIGluY29tcGxldGUgYmVjYXVzZSBhIHRydWUgdGVzdCBvZiBsYXVuY2ggd291bGQgb3BlbgotCS8vIGFuIGFwcGxpY2F0aW9uIHRoYXQgY2Fubm90IGJlIHByb2dyYW1tYXRpY2FsbHkgY2xvc2VkLgotCQotCS8vIENhbm5vdCB0ZXN0IGVtcHR5IHN0cmluZyBhcmd1bWVudCBiZWNhdXNlIGl0IG1heSBsYXVuY2ggc29tZXRoaW5nLgotCQotCS8vIHRlc3QgbnVsbCBhcmd1bWVudAotCQotCXRyeSB7Ci0JCVByb2dyYW0ubGF1bmNoKG51bGwpOwotCQlmYWlsKCJGYWlsZWQgdG8gdGhyb3cgRVJST1JfTlVMTF9BUkdVTUVOVCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIHRocm93IEVSUk9SX05VTExfQVJHVU1FTlQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSBQcm9ncmFtLmdldEV4dGVuc2lvbnMoKTsKLQkvLyBObyBhc3NlcnRpb24gaGVyZSBiZWNhdXNlIHRoZSBkb2MgZG9lcyBub3QgZ3VhcmFudGVlIGEgbm9uLW51bGwgcmVzdWx0LgotCWlmIChleHRlbnNpb25zICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2dyYW0gcHJvZ3JhbSA9IFByb2dyYW0uZmluZFByb2dyYW0oZXh0ZW5zaW9uc1tpXSk7Ci0JCQlpZiAocHJvZ3JhbSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHN0cmluZyA9IHByb2dyYW0udG9TdHJpbmcoKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJ0b1N0cmluZyByZXR1cm5lZCBudWxsIixzdHJpbmcpOwotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcm9ncmFtX1Byb2dyYW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2V4ZWN1dGVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RXh0ZW5zaW9ucyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmluZFByb2dyYW1MamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXROYW1lIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9ncmFtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xhdW5jaExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbmRQcm9ncmFtTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9maW5kUHJvZ3JhbUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFeHRlbnNpb25zIikpIHRlc3RfZ2V0RXh0ZW5zaW9ucygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VEYXRhIikpIHRlc3RfZ2V0SW1hZ2VEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXROYW1lIikpIHRlc3RfZ2V0TmFtZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJvZ3JhbXMiKSkgdGVzdF9nZXRQcm9ncmFtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGF1bmNoTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9sYXVuY2hMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWZjMGE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b24KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIHsKLQotQnV0dG9uIGJ1dHRvbjsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0Jc2V0V2lkZ2V0KGJ1dHRvbik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQkvLyBUZXN0IEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpCi0JbmV3IEJ1dHRvbihzaGVsbCwgU1dULk5VTEwpOwotCi0JbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCi0JbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLQotCW5ldyBCdXR0b24oc2hlbGwsIFNXVC5UT0dHTEUpOwotCi0JbmV3IEJ1dHRvbihzaGVsbCwgU1dULkFSUk9XKTsKLQotCW5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIIHwgU1dULkNIRUNLKTsKLQotCXRyeSB7Ci0JCW5ldyBCdXR0b24obnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZFNlbGVjdGlvbkxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JYnV0dG9uLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJYnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JYnV0dG9uLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCWJ1dHRvbi5jb21wdXRlU2l6ZSgwLCAwKTsKLQotCWJ1dHRvbi5jb21wdXRlU2l6ZSgwLCAwLCBmYWxzZSk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoLTEwLCAtMTApOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKC0xMCwgLTEwLCBmYWxzZSk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoMTAsIDEwKTsKLQotCWJ1dHRvbi5jb21wdXRlU2l6ZSgxMCwgMTAsIGZhbHNlKTsKLQotCWJ1dHRvbi5jb21wdXRlU2l6ZSgxMDAwMCwgMTAwMDApOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKDEwMDAwLCAxMDAwMCwgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFsaWdubWVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRBbGlnbm1lbnRJKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0U2VsZWN0aW9uWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JLy8gdGVzdGVkIGluICB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBbGlnbm1lbnRJKCkgewotCWJ1dHRvbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCWFzc2VydEVxdWFscyhTV1QuTEVGVCwgYnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWJ1dHRvbi5zZXRBbGlnbm1lbnQoU1dULlJJR0hUKTsKLQlhc3NlcnRFcXVhbHMoU1dULlJJR0hULCBidXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYnV0dG9uLnNldEFsaWdubWVudChTV1QuQ0VOVEVSKTsKLQlhc3NlcnRFcXVhbHMoU1dULkNFTlRFUiwgYnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWJ1dHRvbi5zZXRBbGlnbm1lbnQoU1dULlVQKTsgLy8gYmFkIHZhbHVlIGZvciBwdXNoIGJ1dHRvbgotCWFzc2VydFRydWUoU1dULlVQICE9IGJ1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlCdXR0b24gYXJyb3dCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQVJST1cpOwotCWFycm93QnV0dG9uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5MRUZULCBhcnJvd0J1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlhcnJvd0J1dHRvbi5zZXRBbGlnbm1lbnQoU1dULlJJR0hUKTsKLQlhc3NlcnRFcXVhbHMoU1dULlJJR0hULCBhcnJvd0J1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlhcnJvd0J1dHRvbi5zZXRBbGlnbm1lbnQoU1dULlVQKTsKLQlhc3NlcnRFcXVhbHMoU1dULlVQLCBhcnJvd0J1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlhcnJvd0J1dHRvbi5zZXRBbGlnbm1lbnQoU1dULkRPV04pOwotCWFzc2VydEVxdWFscyhTV1QuRE9XTiwgYXJyb3dCdXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYXJyb3dCdXR0b24uc2V0QWxpZ25tZW50KFNXVC5DRU5URVIpOyAvLyBiYWQgdmFsdWUgZm9yIGFycm93IGJ1dHRvbgotCWFzc2VydFRydWUoU1dULkNFTlRFUiAhPSBhcnJvd0J1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0JYXJyb3dCdXR0b24uZGlzcG9zZSgpOwotCi0JaW50IGFsaWdubWVudCA9IDU1OyAvLyBzb21lIGJvZ3VzIG51bWJlcgotCWJ1dHRvbi5zZXRBbGlnbm1lbnQoYWxpZ25tZW50KTsKLQlhc3NlcnRUcnVlKGFsaWdubWVudCAhPSBidXR0b24uZ2V0QWxpZ25tZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvY3VzKCkgewotCUJ1dHRvbiBidG4gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQVJST1cpOwotCWJ0bi5zZXRGb2N1cygpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlJbWFnZSBpbWFnZSA9IGJ1dHRvbi5nZXRJbWFnZSgpOwotCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlLCBidXR0b24uZ2V0SW1hZ2UoKSk7Ci0KLQlidXR0b24uc2V0SW1hZ2UobnVsbCk7Ci0JYXNzZXJ0TnVsbChidXR0b24uZ2V0SW1hZ2UoKSk7Ci0KLQlpbWFnZSA9IG5ldyBJbWFnZShzaGVsbC5nZXREaXNwbGF5KCksIDEwLCAxMCk7Ci0JYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2UsIGJ1dHRvbi5nZXRJbWFnZSgpKTsKLQotCWJ1dHRvbi5zZXRJbWFnZShudWxsKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQkJYnV0dG9uLnNldEltYWdlKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvblooKSB7Ci0JLy8gdGVzdCBzZXRTZWxlY3Rpb24gZm9yIGNoZWNrIGJveAotCWJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5DSEVDSyk7Ci0JYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlhc3NlcnRUcnVlKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JYnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotCS8vIHRlc3Qgc2V0U2VsZWN0aW9uIGZvciBhcnJvdyBidXR0b24KLQlCdXR0b24gbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkFSUk9XKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWFzc2VydFRydWUoIW5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghbmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uZGlzcG9zZSgpOwotCi0JLy8gdGVzdCBzZXRTZWxlY3Rpb24gZm9yIHB1c2ggYnV0dG9uCi0JbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSghbmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5kaXNwb3NlKCk7Ci0KLQkvLyB0ZXN0IHNldFNlbGVjdGlvbiBmb3IgcmFkaW8gYnV0dG9uCi0JbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlJBRElPKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWFzc2VydFRydWUobmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5kaXNwb3NlKCk7Ci0KLQkvLyB0ZXN0IHNldFNlbGVjdGlvbiBmb3IgdG9nZ2xlIGJ1dHRvbgotCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5UT0dHTEUpOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCWFzc2VydFRydWUoIW5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nW10gY2FzZXMgPSB7IiIsICJzb21lIHRleHQiLCAibGRrYXNoZG9laHVmd2VvdmNuaHNsdmhyZWdvamViY2tyZWF2Ymt1aHhiaXVmdmN5aGJpZnV5ZXd2Yml1cmV5ZC4sY21uZXNsamxpZXdqZmNodmJ3b2lmaXZiZXdvcml4dWlldXJ2Yml1dmJvaGZsa3NqZWFoZmNsaXVyZWFmZ3ljaWFiZWxpdHZ5cnd0bGljdXlydGxpdXJleWJjbGl1eXJldWNleXZibGl1cmV5YmN0IiwgIlxuIFxuIFxiIFx0ICIsICJcMCJ9OwotCWludCBnb29kQ2FzZXMgPSA0OwotCWZvciAoaW50IGk9MDsgaTxnb29kQ2FzZXM7IGkrKyl7Ci0JCWJ1dHRvbi5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiZ29vZCBjYXNlOiAiICsgU3RyaW5nLnZhbHVlT2YoaSksIGJ1dHRvbi5nZXRUZXh0KCkuZXF1YWxzKGNhc2VzW2ldKSk7Ci0JfQotCi0JdHJ5IHsKLQkJYnV0dG9uLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRleHQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlidXR0b24uc2V0VGV4dCgiIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbGlnbm1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFsaWdubWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbloiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFsaWdubWVudCIpKSB0ZXN0X2dldEFsaWdubWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2UiKSkgdGVzdF9nZXRJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFsaWdubWVudEkiKSkgdGVzdF9zZXRBbGlnbm1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb2N1cyIpKSB0ZXN0X3NldEZvY3VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbloiKSkgdGVzdF9zZXRTZWxlY3Rpb25aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vL2N1c3RvbQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcChpbnQgc3R5bGUpIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIHN0eWxlKTsKLSAgICBzZXRXaWRnZXQoYnV0dG9uKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DSEVDSyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlJBRElPKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuVE9HR0xFKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQVJST1cpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQ0hFQ0spOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5SQURJTyk7Ci0gICAgYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuVE9HR0xFKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQVJST1cpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0vLyAgICBkaWZmZXJlbmNlcyBiZXR3ZWVuIHB1c2ggYW5kIHRoZSByZXN0IG9mIHRoZSBidXR0b25zCi0vLwkgIGRpZmZlcmVudCBhY3Jvc3MgcGxhdGZvcm1zCi0vLyAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQ0hFQ0spOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEzLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5SQURJTyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTMsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlRPR0dMRSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTMsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkFSUk9XKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQ0hFQ0spOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuUkFESU8pOwotICAgIGJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5UT0dHTEUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICAvL2Fycm93IGRvZXMgbm90IHByb2R1Y2UgYSB0cmF2ZXJzZSBtbmVtb25pYyBvbiB4cAotICAgIHNldFVwKFNXVC5BUlJPVyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMjAsIDIwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQ0hFQ0spOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMTUsIDE1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuUkFESU8pOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMTUsIDE1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuVE9HR0xFKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDE1LCAxNSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkFSUk9XKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDE1LCAxNSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0MzY0ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhcwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotQ2FudmFzIGNhbnZhczsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCAwKTsKLQlzdXBlci5zZXRXaWRnZXQoY2FudmFzKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0JaWYgKCFjYW52YXMuaXNEaXNwb3NlZCgpKQotCQljYW52YXMuZGlzcG9zZSgpOwotCWNhbnZhcyA9IChDYW52YXMpdzsKLQlzdXBlci5zZXRXaWRnZXQodyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQluZXcgQ2FudmFzKG51bGwsIFNXVC5OT05FKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENhcmV0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2Nyb2xsSUlJSUlJWigpIHsKLQljYW52YXMuc2Nyb2xsKDEwMCwgMTAwLCAwLCAwLCA1MCwgNTAsIGZhbHNlKTsKLQljYW52YXMuc2Nyb2xsKDEwMCwgMTAwLCAwLCAwLCA1MCwgNTAsIHRydWUpOwotCi0JY2FudmFzLnNjcm9sbCgxMDAwMCwgMTAwMDAsIDEwMCwgMTAwLCA1MDAsIDUwMCwgZmFsc2UpOwotCWNhbnZhcy5zY3JvbGwoMTAwMDAsIDEwMDAwLCAxMDAsIDEwMCwgNTAwLCA1MDAsIHRydWUpOwotCi0JY2FudmFzLnNjcm9sbCgtMTAwLCAtMTAwLCAxMCwgMTAsIDMwLCAzMCwgZmFsc2UpOwotCWNhbnZhcy5zY3JvbGwoLTEwMCwgLTEwMCwgMTAsIDEwLCAzMCwgMzAsIHRydWUpOwotCi0JY2FudmFzLnNjcm9sbCgxMCwgMTAsIC0yMDAsIC0yMDAsIDEwMCwgMTAwLCBmYWxzZSk7Ci0JY2FudmFzLnNjcm9sbCgxMCwgMTAsIC0yMDAsIC0yMDAsIDEwMCwgMTAwLCB0cnVlKTsKLQotCWNhbnZhcy5zY3JvbGwoMTAwLCAxMDAsIDUwLCA1MCwgLTUwLCAtNTAsIGZhbHNlKTsKLQljYW52YXMuc2Nyb2xsKDEwMCwgMTAwLCA1MCwgNTAsIC01MCwgLTUwLCB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlDYXJldFtdIGNhcmV0cyA9IG5ldyBDYXJldFtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY2FyZXRzW2ldID0gbmV3IENhcmV0KGNhbnZhcywgU1dULk5PTkUpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNhbnZhcy5zZXRDYXJldChjYXJldHNbaV0pOwotCQlhc3NlcnRFcXVhbHMoIkNhcmV0ICMgIiArIGkgKyAibm90IHNldCBwcm9wZXJseSIsIGNhbnZhcy5nZXRDYXJldCgpLCBjYXJldHNbaV0pOwotCX0KLQotCWNhbnZhcy5zZXRDYXJldChudWxsKTsKLQlhc3NlcnROdWxsKCJDYXJldCBzaG91bGQgYmUgbnVsbCIgLCBjYW52YXMuZ2V0Q2FyZXQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlGb250RGF0YSBmb250RGF0YSA9IGNhbnZhcy5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlGb250IGZvbnQgPSBuZXcgRm9udChjYW52YXMuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDgsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCWNhbnZhcy5zZXRGb250KGZvbnQpOwotCWFzc2VydFRydWUoIjphOiIsIGNhbnZhcy5nZXRGb250KCkuZXF1YWxzKGZvbnQpKTsKLQljYW52YXMuc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2FyZXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Njcm9sbElJSUlJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENhcmV0IikpIHRlc3RfZ2V0Q2FyZXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Njcm9sbElJSUlJSVoiKSkgdGVzdF9zY3JvbGxJSUlJSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCIpKSB0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSovCi0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAyMCwgMjAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhkYTcyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYXJldAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FyZXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCB7Ci0KLUNhbnZhcyBjYW52YXM7Ci1DYXJldCBjYXJldDsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5OVUxMKTsKLQljYXJldCA9IG5ldyBDYXJldChjYW52YXMsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQoY2FyZXQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhc0koKSB7Ci0JdHJ5IHsKLQkJbmV3IENhcmV0KG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCVJlY3RhbmdsZSByZWN0ID0gbmV3IFJlY3RhbmdsZSgwLDAsMzAsMzApOwotCWNhcmV0LnNldEJvdW5kcyhyZWN0KTsKLQlhc3NlcnRUcnVlKGNhcmV0LmdldEJvdW5kcygpLmVxdWFscyhyZWN0KSk7Ci0KLQlyZWN0ID0gbmV3IFJlY3RhbmdsZSgwLDAsMzAsMzApOwotCWNhcmV0LnNldEJvdW5kcyhyZWN0KTsKLQlhc3NlcnRUcnVlKCFjYXJldC5nZXRCb3VuZHMoKS5lcXVhbHMobmV3IFJlY3RhbmdsZSAoMCwwLDYwLDcwKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRMb2NhdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHMoY2FudmFzLCBjYXJldC5nZXRQYXJlbnQoKSk7Ci0KLQlhc3NlcnRUcnVlKGNhcmV0LmdldERpc3BsYXkoKT09c2hlbGwuZ2V0RGlzcGxheSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTaXplIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRWaXNpYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzVmlzaWJsZSgpIHsKLQljYXJldC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoIWNhcmV0LmlzVmlzaWJsZSgpKTsgLy9iZWNhdXNlIHRoZSBzaGVsbCBpcyBub3QgdmlzaWJsZQotCi0JY2FyZXQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY2FyZXQuaXNWaXNpYmxlKCkpOwotCi0JY2FyZXQuc2V0VmlzaWJsZSh0cnVlKTsKLQljYW52YXMuc2V0VmlzaWJsZSh0cnVlKTsKLQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoY2FyZXQuZ2V0VmlzaWJsZSgpID09IHRydWUpOwotCWNhbnZhcy5zZXRWaXNpYmxlKGZhbHNlKTsKLQlpZiAoZkNoZWNrVmlzaWJpbGl0eSkgewotCQlhc3NlcnRUcnVlKCFjYXJldC5nZXRWaXNpYmxlKCkpOwotCX0KLQotCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCWNhbnZhcy5zZXRWaXNpYmxlKGZhbHNlKTsKLQljYXJldC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFjYXJldC5nZXRWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0lJSUkoKSB7Ci0JY2FyZXQuc2V0Qm91bmRzKDAsIDAsIDMwLCAzMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JY2FyZXQuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMCwwLDMwLDMwKSk7Ci0KLQl0cnkgewotCQljYXJldC5zZXRCb3VuZHMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJvdW5kcyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnQgZm9udCA9IGNhcmV0LmdldEZvbnQoKTsKLQljYXJldC5zZXRGb250KGZvbnQpOwotCWFzc2VydEVxdWFscyhmb250LCBjYXJldC5nZXRGb250KCkpOwotCWNhcmV0LnNldEZvbnQobnVsbCk7Ci0JCi0JZm9udCA9IG5ldyBGb250KGNhcmV0LmdldERpc3BsYXkoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JY2FyZXQuc2V0Rm9udChmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udCwgY2FyZXQuZ2V0Rm9udCgpKTsKLQotCWNhcmV0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJY2FyZXQuc2V0Rm9udChmb250KTsKLQkJY2FyZXQuc2V0Rm9udChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlJbWFnZSBpbWFnZSA9IGNhcmV0LmdldEltYWdlKCk7Ci0JY2FyZXQuc2V0SW1hZ2UoaW1hZ2UpOwotCWFzc2VydEVxdWFscyhpbWFnZSwgY2FyZXQuZ2V0SW1hZ2UoKSk7Ci0KLQljYXJldC5zZXRJbWFnZShudWxsKTsKLQlhc3NlcnROdWxsKGNhcmV0LmdldEltYWdlKCkpOwotCi0JaW1hZ2UgPSBuZXcgSW1hZ2Uoc2hlbGwuZ2V0RGlzcGxheSgpLCAxMCwgMTApOwotCWNhcmV0LnNldEltYWdlKGltYWdlKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2UsIGNhcmV0LmdldEltYWdlKCkpOwotCi0JY2FyZXQuc2V0SW1hZ2UobnVsbCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWNhcmV0LnNldEltYWdlKGltYWdlKTsKLQkJY2FyZXQuc2V0SW1hZ2UobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYXRpb25JSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TG9jYXRpb25JSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTaXplSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWaXNpYmxlWigpIHsKLQljYXJldC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoIkNhcmV0IHNob3VsZCBiZSB2aXNpYmxlIiwgY2FyZXQuZ2V0VmlzaWJsZSgpPT10cnVlKTsKLQotCWNhcmV0LnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIkNhcmV0IHNob3VsZCBub3QgYmUgdmlzaWJsZSIsIGNhcmV0LmdldFZpc2libGUoKT09ZmFsc2UpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFZpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TG9jYXRpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhc0kiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbiIpKSB0ZXN0X2dldExvY2F0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNpemUiKSkgdGVzdF9nZXRTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWaXNpYmxlIikpIHRlc3RfZ2V0VmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNWaXNpYmxlIikpIHRlc3RfaXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCb3VuZHNJSUlJIikpIHRlc3Rfc2V0Qm91bmRzSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9jYXRpb25JSSIpKSB0ZXN0X3NldExvY2F0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l6ZUlJIikpIHRlc3Rfc2V0U2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWRhMDFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbG9yRGlhbG9nCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db2xvckRpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQotQ29sb3JEaWFsb2cgY29sb3JEaWFsb2c7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhzaGVsbCwgU1dULk5VTEwpOwotCXNldERpYWxvZyhjb2xvckRpYWxvZyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0JbmV3IENvbG9yRGlhbG9nKHNoZWxsKTsKLQkKLQl0cnkgewotCQluZXcgQ29sb3JEaWFsb2cobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0JbmV3IENvbG9yRGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCi0JdHJ5IHsKLQkJbmV3IENvbG9yRGlhbG9nKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJHQigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X29wZW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpIHsKLQlSR0IgcmdiID0gbmV3IFJHQigwLCAwLCAwKTsKLQotCWFzc2VydFRydWUoIjphOiIsIGNvbG9yRGlhbG9nLmdldFJHQigpID09IG51bGwpOwkKLQkJCi0JY29sb3JEaWFsb2cuc2V0UkdCKHJnYik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgY29sb3JEaWFsb2cuZ2V0UkdCKCkgPT0gcmdiKTsKLQotCWNvbG9yRGlhbG9nLnNldFJHQihudWxsKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBjb2xvckRpYWxvZy5nZXRSR0IoKSA9PSBudWxsKTsJCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2coKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UkdCIikpIHRlc3RfZ2V0UkdCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKSkgdGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3NzkyYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotCUNvbWJvIGNvbWJvOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwsIDApOwotCXNldFdpZGdldChjb21ibyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQljb21ibyA9IG5ldyBDb21ibyhudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7U1dULkRST1BfRE9XTiwgU1dULlNJTVBMRX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQljb21ibyA9IG5ldyBDb21ibyhzaGVsbCwgY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCI6YToiICsgU3RyaW5nLnZhbHVlT2YoaSksIChjb21iby5nZXRTdHlsZSgpICYgY2FzZXNbaV0pID09IGNhc2VzW2ldKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uYWRkKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8uYWRkKCIiKTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIG5ldyBTdHJpbmdbXXsiIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLmFkZCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCBuZXcgU3RyaW5nW117IiIsICIifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8uYWRkKCJmcmVkIik7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBuZXcgU3RyaW5nW117IiIsICIiLCAiZnJlZCJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQl0cnkgewotCQljb21iby5hZGQobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQljb21iby5hZGQoInN0cmluZyIsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbWJvLmFkZCgic3RyaW5nMCIsIDApOwotCXRyeSB7Ci0JCWNvbWJvLmFkZCgic3RyaW5nMSIsIDIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA+IHNpemUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCQotCWNvbWJvLmFkZCgiZnJlZCIsIDApOwotCWFzc2VydEVxdWFscygiZnJlZCIsIG5ldyBTdHJpbmdbXXsiZnJlZCJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQljb21iby5hZGQoImZyZWQiLCAwKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQgZnJlZCIsIG5ldyBTdHJpbmdbXXsiZnJlZCIsICJmcmVkIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLmFkZCgiZnJlZCIpOwotCWFzc2VydEVxdWFscygiZnJlZCBmcmVkIGZyZWQiLCBuZXcgU3RyaW5nW117ImZyZWQiLCAiZnJlZCIsICJmcmVkIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLnJlbW92ZUFsbCgpOwotCQotCWludCBudW1iZXIgPSAzOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQljb21iby5hZGQoImZyZWQiLCBudW1iZXIpOwotCWFzc2VydEVxdWFscygiZnJlZDAgZnJlZDEgZnJlZDIgZnJlZCIsIG5ldyBTdHJpbmdbXXsiZnJlZDAiLCAiZnJlZDEiLCAiZnJlZDIiLCAiZnJlZCJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCW51bWJlciA9IDM7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLmFkZCgiZnJlZCIsIDEpOwotCWFzc2VydEVxdWFscygiZnJlZDAgZnJlZCBmcmVkMSBmcmVkMiIsIG5ldyBTdHJpbmdbXXsiZnJlZDAiLCAiZnJlZCIsICJmcmVkMSIsICJmcmVkMiJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQljb21iby5hZGQoImZyZWQiLCAwKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQgZnJlZDAgZnJlZCBmcmVkMSBmcmVkMiIsIG5ldyBTdHJpbmdbXXsiZnJlZCIsICJmcmVkMCIsICJmcmVkIiwgImZyZWQxIiwgImZyZWQyIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLmFkZCgiZnJlZCIsIDQpOwotCWFzc2VydEVxdWFscygiZnJlZCBmcmVkMCBmcmVkIGZyZWQxIGZyZWQgZnJlZDIiLCBuZXcgU3RyaW5nW117ImZyZWQiLCAiZnJlZDAiLCAiZnJlZCIsICJmcmVkMSIsICJmcmVkIiwgImZyZWQyIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQl0cnkgewotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQkvLyB0ZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnQgbW9kaWZ5aW5nIEFQSSBtZXRob2RzIHNlbmQgYSBNb2RpZnkgZXZlbnQJCi0JY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JY29tYm8uc2V0VGV4dCgibmV3IHRleHQiKTsJCi0JYXNzZXJ0VHJ1ZSgic2V0VGV4dCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JY29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQljb21iby5zZXRUZXh0KCJsaW5lIik7CQotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQl0cnkgewotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JY29tYm8uc2VsZWN0KDApOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQljb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xlYXJTZWxlY3Rpb24oKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgwLCAwKSkpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgNSkpOwotCWFzc2VydFRydWUoIjpiOiIsIGNvbWJvLmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMCwgMCkpKTsgIC8vbm90aGluZyBpcyBzZWxlY3RlZAotCWNvbWJvLnNldFRleHQoInNvbWUgdGV4dCIpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgNSkpOwotCWFzc2VydFRydWUoIjpjOiIsIGNvbWJvLmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMCwgNSkpKTsKLQljb21iby5jbGVhclNlbGVjdGlvbigpOwotCWFzc2VydFRydWUoIjpkOiIsIGNvbWJvLmdldFNlbGVjdGlvbigpLng9PWNvbWJvLmdldFNlbGVjdGlvbigpLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIHN1cGVyIGNsYXNzIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvcHkoKSB7Ci0JY29tYm8uc2V0VGV4dCgiMTIzNDU2Iik7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgxLDMpKTsKLQljb21iby5jb3B5KCk7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLDApKTsKLQljb21iby5wYXN0ZSgpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoIjIzMTIzNDU2IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2N1dCgpIHsKLQljb21iby5zZXRUZXh0KCIxMjM0NTYiKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDEsMykpOwotCWNvbWJvLmN1dCgpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoIjE0NTYiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RBbGwoKSB7Ci0JY29tYm8uYWRkKCIxMjMiKTsKLQljb21iby5hZGQoIjQ1NiIpOwotCWNvbWJvLmFkZCgiNzg5Iik7Ci0JY29tYm8uc2VsZWN0KDApOwotCWNvbWJvLnNlbGVjdCgyKTsKLQljb21iby5kZXNlbGVjdEFsbCgpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk9PSAtMSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0SSgpIHsKLQkvLyBpbmRpY2VzIG91dCBvZiByYW5nZSBhcmUgaWdub3JlZAotCVN0cmluZ1tdIGl0ZW1zID0geyJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiJ9OwotCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQljb21iby5zZWxlY3QoMSk7Ci0JY29tYm8uZGVzZWxlY3QoMTApOwotCWFzc2VydEVxdWFscygxLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQljb21iby5yZW1vdmVBbGwoKTsKLQkKLQljb21iby5kZXNlbGVjdCgyKTsKLQotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5zZWxlY3QoaSk7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpPT1pKTsKLQkJY29tYm8uZGVzZWxlY3QoaSk7Ci0JCWFzc2VydFRydWUoIjpiOiIgKyBpLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpPT0tMSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkcmVuKCkgewotCS8vIENvbWJvIGNhbm5vdCBoYXZlIGNoaWxkcmVuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCBjb21iby5nZXRJdGVtQ291bnQoKSA9PSBpKTsKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCX0KLQlhc3NlcnRUcnVlKCI6YWE6IiwgY29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gbnVtYmVyKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpID09IG51bWJlci1pKTsKLQkJY29tYm8ucmVtb3ZlKDApOwotCX0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBjb21iby5nZXRJdGVtQ291bnQoKSA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSGVpZ2h0KCkgewotCWNvbWJvLmdldEl0ZW1IZWlnaHQoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQl0cnkgewotCQljb21iby5nZXRJdGVtKDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZShjb21iby5nZXRJdGVtKGkpLmVxdWFscygiZnJlZCIgKyBpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JY29tYm8uYWRkKCIxIik7Ci0JY29tYm8uYWRkKCIyIik7Ci0JY29tYm8uYWRkKCIzIik7Ci0JU3RyaW5nW10gaXRlbXMgPSBjb21iby5nZXRJdGVtcygpOwotCWFzc2VydFRydWUoIjphOiIsIGl0ZW1zLmxlbmd0aD09Myk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgaXRlbXNbMF0uZXF1YWxzKCIxIikpOwotCWFzc2VydFRydWUoIjphOiIsIGl0ZW1zWzFdLmVxdWFscygiMiIpKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBpdGVtc1syXS5lcXVhbHMoIjMiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T3JpZW50YXRpb24oKSB7Ci0JLy8gdGVzdGVkIGluIHNldE9yaWVudGF0aW9uCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCWNvbWJvLnNldFRleHQoIjEyMzQ1NiIpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMSwzKSk7Ci0JY29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgxLDMpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKC0xLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLnNlbGVjdChpKTsKLQkJYXNzZXJ0RXF1YWxzKGksIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWFzc2VydEVxdWFscygtMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5zZWxlY3QoaSk7Ci0JCWNvbWJvLmRlc2VsZWN0KGkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCVN0cmluZ1tdIGNhc2VzID0geyIiLCAiZnJlZCIsICJmcmVkZnJlZCJ9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJY29tYm8uc2V0VGV4dChjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBTdHJpbmcudmFsdWVPZihpKSwgY2FzZXNbaV0uZXF1YWxzKGNvbWJvLmdldFRleHQoKSkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0SGVpZ2h0KCkgewotCWNvbWJvLmdldFRleHRIZWlnaHQoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0TGltaXQoKSB7Ci0JY29tYm8uc2V0VGV4dExpbWl0KDMpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFRleHRMaW1pdCgpPT0zKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNGb2N1cygpIHsKLQkvLyBub3QgcHVibGljIGFwaQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpIHsKLQljb21iby5hZGQoInN0cmluZzAiKTsKLQl0cnkgewotCQljb21iby5pbmRleE9mKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCi0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydEVxdWFscyhpLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGkpKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSkpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLnJlbW92ZSgiZnJlZDMiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSkpOwotCWFzc2VydEVxdWFscygtMSwgY29tYm8uaW5kZXhPZigiZnJlZDMiKSk7Ci0JZm9yIChpbnQgaSA9IDQ7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGkpKTsKLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQljb21iby5yZW1vdmUoMik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspCi0JCWFzc2VydEVxdWFscyhpLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGkpKTsKLQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmluZGV4T2YoImZyZWQyIikpOwotCWZvciAoaW50IGkgPSAzOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydEVxdWFscyhpIC0gMSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQljb21iby5hZGQoInN0cmluZzAiKTsKLQl0cnkgewotCQljb21iby5pbmRleE9mKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKC0xLCBjb21iby5pbmRleE9mKCJzdHJpbmcwIiwgLTEpKTsKLQljb21iby5yZW1vdmVBbGwoKTsKLQkKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSwgMCkgPT0gaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSwgaSArIDEpID09IC0xKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSwgMCkgPT0gaSk7Ci0JZm9yIChpbnQgaSA9IDM7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSwgMykgPT0gaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSwgaSkgPT0gaSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFzdGUoKSB7Ci0JY29tYm8uc2V0VGV4dCgiMTIzNDU2Iik7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgxLDMpKTsKLQljb21iby5jdXQoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRUZXh0KCkuZXF1YWxzKCIxNDU2IikpOwotCWNvbWJvLnBhc3RlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMTIzNDU2IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFsbCgpIHsKLQljb21iby5hZGQoIjEiKTsKLQljb21iby5hZGQoIjIiKTsKLQljb21iby5yZW1vdmVBbGwoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRJdGVtcygpLmxlbmd0aD09MCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSSgpIHsKLQl0cnkgewotCQljb21iby5yZW1vdmUoMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlKDMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbWJvLmFkZCgic3RyaW5nMCIpOwotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCi0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgaXRlbXMiLCBudW1iZXIgLSBpLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWNvbWJvLnJlbW92ZSgwKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOyAgLy8gYWxsIGl0ZW1zIHRoZSBzYW1lCi0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgaXRlbXMiLCBudW1iZXIgLSBpLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWNvbWJvLnJlbW92ZSgwKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsgLy8gZGlmZmVyZW50IGl0ZW1zCi0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCAiICsgaSwgbnVtYmVyIC0gaSwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCQljb21iby5zZWxlY3QoMCk7Ci0JCWFzc2VydEVxdWFscygiaW5kZXggIiArIGksIDAsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQljb21iby5yZW1vdmUoMCk7Ci0JCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MgfHwgU3d0SnVuaXQuaXNHVEsgfHwgU3d0SnVuaXQuaXNDYXJib24pIHsKLQkJCS8vIFRoZSBiZWhhdmlvciBvbiBXaW5kb3dzIGFuZCBHVEsgd2hlbiB0aGUgc2VsZWN0ZWQgaXRlbSBpcyByZW1vdmVkCi0JCQkvLyBpcyB0byBzaW1wbHkgc2F5IHRoYXQgbm8gaXRlbXMgYXJlIHNlbGVjdGVkLgotCQkJYXNzZXJ0RXF1YWxzKCJpbmRleCAiICsgaSwgLTEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQl9IGVsc2UgewotCQkJLy8gVGhlIGJlaGF2aW9yIG9uIG90aGVyIHBsYXRmb3JtcyB3aGVuIHRoZSBzZWxlY3RlZCBpdGVtIGlzIHJlbW92ZWQKLQkJCS8vIGlzIHRvIHNlbGVjdCB0aGUgaXRlbSB0aGF0IGlzIG5vdyBhdCB0aGUgc2FtZSBpbmRleCwgYW5kIHNlbmQgYQotCQkJLy8gc2VsZWN0aW9uIGV2ZW50LiBJZiB0aGVyZSBpcyBubyBpdGVtIGF0IHRoZSBzZWxlY3RlZCBpbmRleCwgdGhlbgotCQkJLy8gdGhlIHBsYXRmb3JtIHNheXMgdGhhdCBubyBpdGVtcyBhcmUgc2VsZWN0ZWQuCi0JCQlpZiAoaSA8IG51bWJlciAtIDEpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImluZGV4ICIgKyBpLCAwLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpbmRleCAiICsgaSwgLTEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOyAvLyBkaWZmZXJlbnQgaXRlbXMKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygiaW5kZXggIiArIGksIG51bWJlciAtIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQkJY29tYm8ucmVtb3ZlKG51bWJlci1pLTEpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQljb21iby5yZW1vdmUoMCwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWNvbWJvLnJlbW92ZSgwLCAyKTsKLQlhc3NlcnRFcXVhbHMoMiwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JY29tYm8ucmVtb3ZlKDIsIDQpOwotCWFzc2VydEVxdWFscygyLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQljb21iby5yZW1vdmUoMywgMik7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0KLQl0cnkgewotCQljb21iby5yZW1vdmUoMiwgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQljb21iby5yZW1vdmUoLTEsIG51bWJlci0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RhcnQgaW5kZXggPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhudW1iZXIgLSBpLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWNvbWJvLnJlbW92ZSgiZnJlZCIgKyBpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhudW1iZXIgLSBpLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWNvbWJvLnJlbW92ZSgiZnJlZCIpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQl0cnkgewkKLQkJY29tYm8ucmVtb3ZlKCJmcmVkIik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gbm90IGZvdW5kIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkTW9kaWZ5TGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEkoKSB7Ci0JY29tYm8uYWRkKCIxMjMiKTsKLQljb21iby5hZGQoIjQ1NiIpOwotCWNvbWJvLmFkZCgiNzg5Iik7Ci0JY29tYm8uc2VsZWN0KDEpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk9PSAxKTsKLQkKLQkvLyBpbmRpY2VzIG91dCBvZiByYW5nZSBhcmUgaWdub3JlZAotCWNvbWJvLnNlbGVjdCgxMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbSgwLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWNvbWJvLnNldEl0ZW0oMywgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbSgwLCAiZnJlZCIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQljb21iby5hZGQoInN0cmluZzAiKTsKLQl0cnkgewotCQljb21iby5zZXRJdGVtKDAsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbSgtMSwgIm5ldyB2YWx1ZSIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWNvbWJvLmFkZCgiam9lIik7Ci0JY29tYm8uc2V0SXRlbSgwLCAiZnJlZCIpOwkKLQlhc3NlcnRUcnVlKCJmcmVkIiwgY29tYm8uZ2V0SXRlbSgwKS5lcXVhbHMoImZyZWQiKSk7Ci0KLQl0cnkgewotCQljb21iby5zZXRJdGVtKDQsICJmcmVkIik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uc2V0SXRlbShpLCAiZnJlZCIgKyBpKTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIG5ldyBTdHJpbmdbXXsiZnJlZDAiLCAiZnJlZDEiLCAiZnJlZDIiLCAiZnJlZDMiLCAiZnJlZDQifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbXMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW1zID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JU3RyaW5nW11bXSBpdGVtcyA9IHt7fSwgeyIifSwgeyIiLCAiIn0sIHsiZnJlZCJ9LCB7ImZyZWQwIiwgImZyZWQwIn0sIHsiZnJlZCIsICJmcmVkIn19OwotCi0JZm9yIChpbnQgaSA9IDAgOyBpPCBpdGVtcy5sZW5ndGg7IGkrKyl7Ci0JCWNvbWJvLnNldEl0ZW1zKGl0ZW1zW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKCI6YToiICsgaSwgaXRlbXNbaV0sIGNvbWJvLmdldEl0ZW1zKCkpO30KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmllbnRhdGlvbkkoKSB7Ci0JY29tYm8uc2V0T3JpZW50YXRpb24oU1dULlJJR0hUX1RPX0xFRlQpOwotCWlmICgoY29tYm8uZ2V0U3R5bGUoKSAmIFNXVC5NSVJST1JFRCkgIT0gMCkgewotCQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRPcmllbnRhdGlvbigpPT1TV1QuUklHSFRfVE9fTEVGVCk7Ci0JfQotCWNvbWJvLnNldE9yaWVudGF0aW9uKFNXVC5MRUZUX1RPX1JJR0hUKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBjb21iby5nZXRPcmllbnRhdGlvbigpPT1TV1QuTEVGVF9UT19SSUdIVCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl0cnkgewotCQljb21iby5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBvaW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIDUpKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDAsIDApKSk7Ci0JY29tYm8uc2V0VGV4dCgic29tZSB0ZXh0Iik7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCA1KSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgwLCA1KSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMaW1pdEkoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uc2V0VGV4dExpbWl0KDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaW1pdCA9PSAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbWJvLnNldFRleHRMaW1pdCgzKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRUZXh0TGltaXQoKT09Myk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCWNvbWJvLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRleHQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JU3RyaW5nW10gY2FzZXMgPSB7IiIsICJmcmVkIiwgImZyZWQwIn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQljb21iby5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoY2FzZXNbaV0pKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJY29tYm8uc2V0VGV4dChjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoIjpiOiIgKyBpLCBjb21iby5nZXRUZXh0KCkuZXF1YWxzKGNhc2VzW2ldKSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQljb21iby5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiOmM6IiArIGksIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoY2FzZXNbaV0pKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xlYXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb3B5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPcmllbnRhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dEhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dExpbWl0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Bhc3RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExpbWl0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xlYXJTZWxlY3Rpb24iKSkgdGVzdF9jbGVhclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weSIpKSB0ZXN0X2NvcHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2N1dCIpKSB0ZXN0X2N1dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJIikpIHRlc3RfZGVzZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKSkgdGVzdF9nZXRJdGVtSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPcmllbnRhdGlvbiIpKSB0ZXN0X2dldE9yaWVudGF0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SGVpZ2h0IikpIHRlc3RfZ2V0VGV4dEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dExpbWl0IikpIHRlc3RfZ2V0VGV4dExpbWl0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYXN0ZSIpKSB0ZXN0X3Bhc3RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBbGwiKSkgdGVzdF9yZW1vdmVBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUkiKSkgdGVzdF9yZW1vdmVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJSSIpKSB0ZXN0X3JlbW92ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEkiKSkgdGVzdF9zZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0T3JpZW50YXRpb25JIikpIHRlc3Rfc2V0T3JpZW50YXRpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExpbWl0SSIpKSB0ZXN0X3NldFRleHRMaW1pdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0lJSUkoKSB7Ci0JY29tYm8uc2V0Qm91bmRzKDEwLCAyMCwgMzAsIDQwKTsKLQkvLyBvbmx5IGNoZWNrIHgsIHksIGFuZCB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRCb3VuZHMoKS54ID09IDEwKTsKLQlhc3NlcnRUcnVlKGNvbWJvLmdldEJvdW5kcygpLnkgPT0gMjApOwotCWFzc2VydFRydWUoY29tYm8uZ2V0Qm91bmRzKCkud2lkdGggPT0gMzApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCWNvbWJvLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMzAsIDQwKSk7Ci0JLy8gb25seSBjaGVjayB4LCB5LCBhbmQgd2lkdGggLSB5b3UgY2FuJ3Qgc2V0IHRoZSBoZWlnaHQgb2YgYSBjb21ibwotCWFzc2VydFRydWUoY29tYm8uZ2V0Qm91bmRzKCkueCA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZShjb21iby5nZXRCb3VuZHMoKS55ID09IDIwKTsKLQlhc3NlcnRUcnVlKGNvbWJvLmdldEJvdW5kcygpLndpZHRoID09IDMwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplSUkoKSB7Ci0JY29tYm8uc2V0U2l6ZSgzMCwgNDApOwotCS8vIG9ubHkgY2hlY2sgdGhlIHdpZHRoIC0geW91IGNhbid0IHNldCB0aGUgaGVpZ2h0IG9mIGEgY29tYm8KLQlhc3NlcnRUcnVlKGNvbWJvLmdldFNpemUoKS54ID09IDMwKTsKLQotCWNvbWJvLnNldFNpemUoMzIsIDQzKTsKLQkvLyBvbmx5IGNoZWNrIHRoZSB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRTaXplKCkueCA9PSAzMik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JY29tYm8uc2V0U2l6ZShuZXcgUG9pbnQoMzAsIDQwKSk7Ci0JLy8gb25seSBjaGVjayB0aGUgd2lkdGggLSB5b3UgY2FuJ3Qgc2V0IHRoZSBoZWlnaHQgb2YgYSBjb21ibwotCWFzc2VydFRydWUoY29tYm8uZ2V0U2l6ZSgpLnggPT0gMzApOwotCi0JY29tYm8uc2V0Qm91bmRzKDMyLCA0MywgMzMsIDQ0KTsKLQkvLyBvbmx5IGNoZWNrIHRoZSB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRTaXplKCkueCA9PSAzMyk7Ci0KLQljb21iby5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWNvbWJvLnNldExvY2F0aW9uKDExLCAyMik7Ci0JY29tYm8uc2V0U2l6ZShuZXcgUG9pbnQoMzIsIDQzKSk7Ci0JLy8gb25seSBjaGVjayB0aGUgd2lkdGggLSB5b3UgY2FuJ3Qgc2V0IHRoZSBoZWlnaHQgb2YgYSBjb21ibwotCWFzc2VydFRydWUoY29tYm8uZ2V0U2l6ZSgpLnggPT0gMzIpOwotfQotCi1wcml2YXRlIHZvaWQgYWRkKCkgewotICAgIGNvbWJvLmFkZCgidGhpcyIpOwotICAgIGNvbWJvLmFkZCgiaXMiKTsKLSAgICBjb21iby5hZGQoIlNXVCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoY29tYm8uZ2V0U2l6ZSgpLngtMTAsIDUsIDMwLCBjb21iby5nZXRJdGVtSGVpZ2h0KCkqMiwgCi0gICAgICAgICAgICAJCSBDb25zaXN0ZW5jeVV0aWxpdHkuU0VMRUNUSU9OKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICAvL29uIGFycm93Ci0gICAgY29uc2lzdGVuY3lFdmVudChjb21iby5nZXRTaXplKCkueC0xMCwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICAvL29uIHRleHQKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAzLCBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMjAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OGM1MjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUgewotCi1Db21wb3NpdGUgY29tcG9zaXRlOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIDApOwotCXN1cGVyLnNldFdpZGdldChjb21wb3NpdGUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHtTV1QuSF9TQ1JPTEwsIFNXVC5WX1NDUk9MTCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW4oKSB7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBuZXcgQ29udHJvbFtde30sIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpKTsKLQlDb21wb3NpdGUgYzEgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCBuZXcgQ29udHJvbFtde2MxfSwgY29tcG9zaXRlLmdldENoaWxkcmVuKCkpOwotCi0JTGlzdCBjMiA9IG5ldyBMaXN0KGNvbXBvc2l0ZSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBuZXcgQ29udHJvbFtde2MxLCBjMn0sIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpKTsKLQotCUJ1dHRvbiBjMyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjpkOiIsIG5ldyBDb250cm9sW117YzEsIGMyLCBjM30sIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpKTsKLQotCWMyLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoIjplOiIsIG5ldyBDb250cm9sW117YzEsIGMzfSwgY29tcG9zaXRlLmdldENoaWxkcmVuKCkpOwotCQotCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCWNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLQotCWFzc2VydEVxdWFscygiOmY6IiwgbmV3IENvbnRyb2xbXXt9LCBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGF5b3V0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUYWJMaXN0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRhYkxpc3QkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wKLX0KLQotcHVibGljIHZvaWQgdGVzdF9sYXlvdXQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfbGF5b3V0WgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xheW91dFooKSB7Ci0JLy8gdGVzdGVkIGluIHNwZWNpZmljIExheW91dCBjbGFzc2VzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc3BlY2lmaWMgTGF5b3V0IGNsYXNzZXMKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUYWJMaXN0JExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JQ29udHJvbFtdIHRhYmxpc3QgPSBuZXcgQ29udHJvbFtdIHtidXR0b24xLCBidXR0b24yfTsKLQljb21wb3NpdGUuc2V0VGFiTGlzdCh0YWJsaXN0KTsKLQlhc3NlcnRFcXVhbHModGFibGlzdCwgY29tcG9zaXRlLmdldFRhYkxpc3QoKSk7Ci0JYnV0dG9uMS5kaXNwb3NlKCk7Ci0JYnV0dG9uMi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkcmVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMYXlvdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRhYkxpc3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF5b3V0WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGFiTGlzdCRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRyZW4iKSkgdGVzdF9nZXRDaGlsZHJlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGF5b3V0IikpIHRlc3RfZ2V0TGF5b3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUYWJMaXN0IikpIHRlc3RfZ2V0VGFiTGlzdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGF5b3V0IikpIHRlc3RfbGF5b3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXRaIikpIHRlc3RfbGF5b3V0WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpKSB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRhYkxpc3QkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRUYWJMaXN0JExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0JaWYgKGNvbXBvc2l0ZSAhPSBudWxsKQotCQljb21wb3NpdGUuZGlzcG9zZSgpOwotCWNvbXBvc2l0ZSA9IChDb21wb3NpdGUpdzsKLQlzdXBlci5zZXRXaWRnZXQodyk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkMWRjMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JLy8gYWJzdHJhY3QgY2xhc3MKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0JQ29udHJvbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQl9OwotCWNvbnRyb2wuYWRkQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdmUsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuUmVzaXplLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZUNvbnRyb2xMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKSB7Ci0JRm9jdXNMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBGb2N1c0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQljb250cm9sLmFkZEZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuRm9jdXNJbiwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c091dCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVGb2N1c0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKSB7Ci0JSGVscExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEhlbHBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGVscFJlcXVlc3RlZChIZWxwRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQl9OwotCWNvbnRyb2wuYWRkSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULkhlbHAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyKCkgewotCUtleUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEtleUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQljb250cm9sLmFkZEtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULktleURvd24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuS2V5VXAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKCkgewotCU1vdXNlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW91c2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlRG93biwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Nb3VzZVVwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlTW91c2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQlNb3VzZU1vdmVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQl9OwotCWNvbnRyb2wuYWRkTW91c2VNb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VNb3ZlLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZU1vdXNlTW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKSB7Ci0JTW91c2VUcmFja0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vdXNlVHJhY2tMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JY29udHJvbC5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VFbnRlciwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Nb3VzZUV4aXQsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VIb3ZlciwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKCkgewotCVBhaW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQl9OwotCWNvbnRyb2wuYWRkUGFpbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JR0MgZ2MgPSBldmVudC5nYyA9IG5ldyBHQyhjb250cm9sKTsJCi0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULlBhaW50LCBldmVudCk7Ci0JZ2MuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVQYWludExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQlUcmF2ZXJzZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQljb250cm9sLmFkZFRyYXZlcnNlTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuVHJhdmVyc2UsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlVHJhdmVyc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSSgpIHsKLQljb250cm9sLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUG9pbnQgc2l6ZSA9IGNvbnRyb2wuZ2V0U2l6ZSgpOwotCWNvbnRyb2wuY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpOwotCWFzc2VydEVxdWFscyhzaXplLngsIGNvbnRyb2wuZ2V0U2l6ZSgpLngpOwotCWFzc2VydEVxdWFscyhzaXplLnksIGNvbnRyb2wuZ2V0U2l6ZSgpLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCWNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQlQb2ludCBzaXplID0gY29udHJvbC5nZXRTaXplKCk7Ci0JY29udHJvbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSwgZmFsc2UpOwotCWFzc2VydEVxdWFscyhzaXplLngsIGNvbnRyb2wuZ2V0U2l6ZSgpLngpOwotCWFzc2VydEVxdWFscyhzaXplLnksIGNvbnRyb2wuZ2V0U2l6ZSgpLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvcmNlRm9jdXMoKSB7Ci0JLy8gdGhpcyBpcyBkaWZmaWN1bHQgdG8gdGVzdCBpbiBDb250cm9sLgotCS8vIHN1YmNsYXNzZXMgdGhhdCB3aXNoIHRvIHRlc3QgdGhpcyBzaG91bGQgb3ZlcnJpZGUuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWNjZXNzaWJsZSgpIHsKLQlBY2Nlc3NpYmxlIGFjY2Vzc2libGUgPSBjb250cm9sLmdldEFjY2Vzc2libGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBhY2Nlc3NpYmxlICE9IG51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3JkZXJXaWR0aCgpIHsKLQljb250cm9sLmdldEJvcmRlcldpZHRoKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEJvdW5kc0lJSUkgYW5kIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmFibGVkKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEVuYWJsZWRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExheW91dERhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb24oKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWFzc2VydFRydWUoY29udHJvbC5nZXRMb2NhdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMzIsIDQzKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lbnUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9uaXRvcigpIHsKLQlNb25pdG9yIG1vbml0b3IgPSBjb250cm9sLmdldE1vbml0b3IoKTsKLQlhc3NlcnROb3ROdWxsKG1vbml0b3IpOwotCURpc3BsYXkgZGlzcGxheSA9IGNvbnRyb2wuZ2V0RGlzcGxheSgpOwotCU1vbml0b3JbXSBtb25pdG9ycyA9IGRpc3BsYXkuZ2V0TW9uaXRvcnMoKTsKLQlpbnQgaTsKLQkvKiBtb25pdG9yIG11c3QgYmUgbGlzdGVkIGluIERpc3BsYXkuZ2V0TW9uaXRvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG1vbml0b3IuZXF1YWxzKG1vbml0b3JzW2ldKSkgYnJlYWs7Ci0JfQotCWlmIChpID09IG1vbml0b3JzLmxlbmd0aCkgewotCQlmYWlsKCJDb250cm9sLmdldE1vbml0b3IgZG9lcyBub3QgcmV0dXJuIGEgbW9uaXRvciBsaXN0ZWQgaW4gRGlzcGxheS5nZXRNb25pdG9ycyIpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKHNoZWxsLCBjb250cm9sLmdldFBhcmVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaGVsbCgpIHsKLQlhc3NlcnRFcXVhbHMoc2hlbGwsIGNvbnRyb2wuZ2V0U2hlbGwoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2l6ZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRTaXplSUkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb29sVGlwVGV4dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRWaXNpYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBpbnRlbnRpb25hbGx5IG5vdCB0ZXN0ZWQgLSBub3QgcHVibGljIEFQSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQljb250cm9sLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShjb250cm9sLmlzRW5hYmxlZCgpKTsKLQotCWNvbnRyb2wuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5pc0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb2N1c0NvbnRyb2woKSB7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5pc0ZvY3VzQ29udHJvbCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1JlcGFyZW50YWJsZSgpIHsKLQlhc3NlcnRFcXVhbHMgKCJpc1JlcGFyZW50YWJsZSIsIGNvbnRyb2wuaXNSZXBhcmVudGFibGUoKSwgaXNSZXBhcmVudGFibGVQbGF0Zm9ybSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0JY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoIWNvbnRyb2wuaXNWaXNpYmxlKCkpOyAgLy9iZWNhdXNlIHRoZSBzaGVsbCBpcyBub3QgdmlzaWJsZQotCi0JY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmlzVmlzaWJsZSgpKTsKLQotCWlmICghU3d0SnVuaXQuaXNBSVgpIHsKLQkJY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCQlhc3NlcnRUcnVlKCJXaW5kb3cgc2hvdWxkIGJlIHZpc2libGUiLCBjb250cm9sLmlzVmlzaWJsZSgpKTsKLQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWFzc2VydFRydWUoIldpbmRvdyBzaG91bGQgbm90IGJlIHZpc2libGUiLCAhY29udHJvbC5pc1Zpc2libGUoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdmVBYm92ZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCWNvbnRyb2wubW92ZUFib3ZlKG51bGwpOwotCi0JY29udHJvbC5tb3ZlQWJvdmUoY29udHJvbCk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIDApOwotCWNvbnRyb2wubW92ZUFib3ZlKGIpOwotCWIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdmVCZWxvd0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCWNvbnRyb2wubW92ZUJlbG93KG51bGwpOwotCi0JY29udHJvbC5tb3ZlQmVsb3coY29udHJvbCk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIDApOwotCWNvbnRyb2wubW92ZUJlbG93KGIpOwotCWIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3BhY2soKSB7Ci0JY29udHJvbC5wYWNrKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFja1ooKSB7Ci0JY29udHJvbC5wYWNrKHRydWUpOwotCWNvbnRyb2wucGFjayhmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3KCkgewotCWNvbnRyb2wucmVkcmF3KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3SUlJSVooKSB7Ci0JY29udHJvbC5yZWRyYXcoMCwgMCwgMCwgMCwgZmFsc2UpOwotCi0JY29udHJvbC5yZWRyYXcoMCwgMCwgMCwgMCwgdHJ1ZSk7Ci0KLQljb250cm9sLnJlZHJhdygtMTAsIC0xMCwgLTEwLCAtMTAsIHRydWUpOwotCi0JY29udHJvbC5yZWRyYXcoMTAsIDEwLCAxMCwgMTAsIHRydWUpOwotCi0JY29udHJvbC5yZWRyYXcoMTAsIDEwLCAxMCwgMTAsIGZhbHNlKTsKLQotCWNvbnRyb2wucmVkcmF3KDEwMDAwLCAxMDAwMCwgMTAwMDAsIDEwMDAwLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZU1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZE1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihjb250cm9sLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQljb250cm9sLnNldEJhY2tncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgY29udHJvbC5nZXRCYWNrZ3JvdW5kKCkpOwotCWNvbnRyb2wuc2V0QmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmdldEJhY2tncm91bmQoKS5lcXVhbHMoY29sb3IpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzSUlJSSgpIHsKLQljb250cm9sLnNldEJvdW5kcygxMCwgMjAsIDMwLCA0MCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApLCBjb250cm9sLmdldEJvdW5kcygpKTsKLQotCWNvbnRyb2wuc2V0Qm91bmRzKDIwLCAzMCwgNDAsIDUwKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNvbnRyb2wuZ2V0Qm91bmRzKCkuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApKSk7Ci0KLQljb250cm9sLnNldEJvdW5kcygxMCwgMjAsIDMwLCA0MCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZSgxMCwgMjAsIDMwLCA0MCkpOwotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMzAsIDQwKSwgY29udHJvbC5nZXRCb3VuZHMoKSk7Ci0KLQljb250cm9sLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKDIwLCAzMCwgNDAsIDUwKSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBjb250cm9sLmdldEJvdW5kcygpLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMzAsIDQwKSkpOwotCi0JdHJ5IHsKLQkJY29udHJvbC5zZXRCb3VuZHMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbnRyb2wuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDYXB0dXJlWigpIHsKLQljb250cm9sLnNldENhcHR1cmUodHJ1ZSk7Ci0KLQljb250cm9sLnNldENhcHR1cmUoZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCkgewotCWNvbnRyb2wuc2V0Q3Vyc29yKG51bGwpOwotCi0JQ3Vyc29yIGMgPSBuZXcgQ3Vyc29yKGNvbnRyb2wuZ2V0RGlzcGxheSgpLCAwKTsKLQljb250cm9sLnNldEN1cnNvcihjKTsKLQljLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQljb250cm9sLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShjb250cm9sLmdldEVuYWJsZWQoKSk7Ci0KLQljb250cm9sLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIWNvbnRyb2wuZ2V0RW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQljb250cm9sLnNldEZvY3VzKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlGb250IGZvbnQgPSBjb250cm9sLmdldEZvbnQoKTsKLQljb250cm9sLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnQsIGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkKLQlmb250ID0gbmV3IEZvbnQoY29udHJvbC5nZXREaXNwbGF5KCksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWNvbnRyb2wuc2V0Rm9udChmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udCwgY29udHJvbC5nZXRGb250KCkpOwotCi0JY29udHJvbC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWNvbnRyb2wuc2V0Rm9udChmb250KTsKLQkJY29udHJvbC5zZXRGb250KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoY29udHJvbC5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JY29udHJvbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIGNvbnRyb2wuZ2V0Rm9yZWdyb3VuZCgpKTsKLQljb250cm9sLnNldEZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5nZXRGb3JlZ3JvdW5kKCkuZXF1YWxzKGNvbG9yKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dERhdGFMamF2YV9sYW5nX09iamVjdCgpIHsKLQljb250cm9sLnNldExheW91dERhdGEodGhpcyk7Ci0JYXNzZXJ0RXF1YWxzKHRoaXMsIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpKTsKLQotCWNvbnRyb2wuc2V0TGF5b3V0RGF0YSgiYXNsZHNhaGRhaGNhc2xjc2hkYWMiKTsKLQlhc3NlcnRFcXVhbHMoImFzbGRzYWhkYWhjYXNsY3NoZGFjIiwgY29udHJvbC5nZXRMYXlvdXREYXRhKCkpOwotCi0JY29udHJvbC5zZXRMYXlvdXREYXRhKHRoaXMuZ2V0Q2xhc3MoKSk7Ci0JYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0Q2xhc3MoKSwgY29udHJvbC5nZXRMYXlvdXREYXRhKCkpOwotCi0JY29udHJvbC5zZXRMYXlvdXREYXRhKG51bGwpOwotCWFzc2VydE51bGwoY29udHJvbC5nZXRMYXlvdXREYXRhKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uSUkoKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWNvbnRyb2wuc2V0TG9jYXRpb24oMTEsIDIyKTsKLQljb250cm9sLnNldFNpemUoMzIsIDQzKTsKLQlhc3NlcnRFcXVhbHMoY29udHJvbC5nZXRMb2NhdGlvbigpLCBuZXcgUG9pbnQoMTEsIDIyKSk7Ci0KLQljb250cm9sLnNldExvY2F0aW9uKDEwLCAxMCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRyb2wuZ2V0TG9jYXRpb24oKSwgbmV3IFBvaW50KDEwLCAxMCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl0cnkgewotCQljb250cm9sLnNldExvY2F0aW9uKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsb2NhdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCVBvaW50IGxvYyA9IG5ldyBQb2ludCgzMCwgNDApOwotCWNvbnRyb2wuc2V0TG9jYXRpb24obG9jKTsKLQlhc3NlcnRFcXVhbHMoY29udHJvbC5nZXRMb2NhdGlvbigpLCBsb2MpOwotCi0JbG9jID0gbmV3IFBvaW50KDEwLCAxMCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbihsb2MpOwotCWFzc2VydEVxdWFscyhjb250cm9sLmdldExvY2F0aW9uKCksIGxvYyk7Ci0KLQlsb2MgPSBuZXcgUG9pbnQoMTAwMDAsIDEwMDAwKTsKLQljb250cm9sLnNldExvY2F0aW9uKGxvYyk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRyb2wuZ2V0TG9jYXRpb24oKSwgbG9jKTsKLQotCWxvYyA9IG5ldyBQb2ludCgtMTAsIC0xMCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbihsb2MpOwotCWFzc2VydEVxdWFscyhjb250cm9sLmdldExvY2F0aW9uKCksIGxvYyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51ICgpIHsKLQkvKiB0aGlzIGlzIGEgdmFsaWQgdGhpbmcgdG8gZG8sIHlvdSBjYW4gcmVzZXQgYSBtZW51IHRvIG5vdGhpbmcgKi8KLQljb250cm9sLnNldE1lbnUobnVsbCk7Ci0KLQlNZW51IG0gPSBuZXcgTWVudShjb250cm9sKTsKLQljb250cm9sLnNldE1lbnUobSk7Ci0JYXNzZXJ0RXF1YWxzKG0sIGNvbnRyb2wuZ2V0TWVudSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQYXJlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCkgewotCWlmIChjb250cm9sLmlzUmVwYXJlbnRhYmxlKCkpIHsKLQkJU2hlbGwgb3JpZ2luYWxQYXJlbnQgPSBuZXcgU2hlbGwoKTsKLQkJU2hlbGwgbmV3UGFyZW50ID0gbmV3IFNoZWxsKCk7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihvcmlnaW5hbFBhcmVudCwgU1dULlBVU0gpOwotCQliLnNldFBhcmVudChuZXdQYXJlbnQpOwotCQlvcmlnaW5hbFBhcmVudC5kaXNwb3NlKCk7Ci0JCWFzc2VydFRydWUoIWIuaXNEaXNwb3NlZCgpKTsKLQkJbmV3UGFyZW50LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVkcmF3WigpIHsKLQljb250cm9sLnNldFJlZHJhdyhmYWxzZSk7Ci0KLQljb250cm9sLnNldFJlZHJhdyh0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplSUkoKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMzAsIDQwKSwgY29udHJvbC5nZXRTaXplKCkpOwotCi0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWNvbnRyb2wuc2V0TG9jYXRpb24oMTEsIDIyKTsKLQljb250cm9sLnNldFNpemUoMzIsIDQzKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDMyLCA0MyksIGNvbnRyb2wuZ2V0U2l6ZSgpKTsKLQotCWNvbnRyb2wuc2V0U2l6ZSgwLCAwKTsKLQkKLQljb250cm9sLnNldFNpemUoMTAsIDEwKTsKLQotCWNvbnRyb2wuc2V0U2l6ZSgxMDAwMCwgMTAwMDApOwotCi0JY29udHJvbC5zZXRTaXplKC0xMCwgLTEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQljb250cm9sLnNldFNpemUobmV3IFBvaW50KDMwLCA0MCkpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMzAsIDQwKSwgY29udHJvbC5nZXRTaXplKCkpOwotCi0JdHJ5IHsKLQkJY29udHJvbC5zZXRTaXplKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzaXplID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29udHJvbC5zZXRTaXplKG5ldyBQb2ludCgwLCAwKSk7Ci0JCi0JY29udHJvbC5zZXRTaXplKG5ldyBQb2ludCgxMCwgMTApKTsKLQotCWNvbnRyb2wuc2V0U2l6ZShuZXcgUG9pbnQoMTAwMDAsIDEwMDAwKSk7Ci0KLQljb250cm9sLnNldFNpemUobmV3IFBvaW50KC0xMCwgLTEwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQljb250cm9sLnNldFRvb2xUaXBUZXh0KCJUaGlzIGlzIGEgdGlwIik7Ci0JYXNzZXJ0RXF1YWxzKCJUaGlzIGlzIGEgdGlwIiwgY29udHJvbC5nZXRUb29sVGlwVGV4dCgpKTsKLQotCWNvbnRyb2wuc2V0VG9vbFRpcFRleHQobnVsbCk7Ci0JYXNzZXJ0TnVsbChjb250cm9sLmdldFRvb2xUaXBUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZpc2libGVaKCkgewotCWNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKGNvbnRyb2wuZ2V0VmlzaWJsZSgpKTsKLQotCWNvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5nZXRWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvQ29udHJvbElJKCkgewotCVBvaW50IGNvbnRyb2xDb29yZHMgPSBjb250cm9sLnRvQ29udHJvbCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDAsIDApLCBjb250cm9sLnRvRGlzcGxheShjb250cm9sQ29vcmRzLngsIGNvbnRyb2xDb29yZHMueSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JUG9pbnQgY29udHJvbENvb3JkcyA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludCgwLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgwLCAwKSwgY29udHJvbC50b0Rpc3BsYXkoY29udHJvbENvb3JkcykpOwotCXRyeSB7Ci0JCWNvbnRyb2wudG9Db250cm9sKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzaXplID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvRGlzcGxheUlJKCkgewotCVBvaW50IGRpc3BsYXlDb29yZHMgPSBjb250cm9sLnRvRGlzcGxheSgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDAsIDApLCBjb250cm9sLnRvQ29udHJvbChkaXNwbGF5Q29vcmRzLngsIGRpc3BsYXlDb29yZHMueSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvRGlzcGxheUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JUG9pbnQgZGlzcGxheUNvb3JkcyA9IGNvbnRyb2wudG9EaXNwbGF5KG5ldyBQb2ludCgwLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgwLCAwKSwgY29udHJvbC50b0NvbnRyb2woZGlzcGxheUNvb3JkcykpOwotCXRyeSB7Ci0JCWNvbnRyb2wudG9EaXNwbGF5KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzaXplID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RyYXZlcnNlSSgpIHsKLQljb250cm9sLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9FU0NBUEUpOwotCWNvbnRyb2wudHJhdmVyc2UoU1dULlRSQVZFUlNFX1JFVFVSTik7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfVEFCX05FWFQpOwotCWNvbnRyb2wudHJhdmVyc2UoU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUyk7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCk7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3VwZGF0ZSgpIHsKLQljb250cm9sLnVwZGF0ZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvcmNlRm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFjY2Vzc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvcmRlcldpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExheW91dERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNb25pdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNGb2N1c0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzUmVwYXJlbnRhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdmVBYm92ZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3ZlQmVsb3dMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFjayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFja1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZHJhdyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3SUlJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENhcHR1cmVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UGFyZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVkcmF3WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvQ29udHJvbElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b0Rpc3BsYXlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9EaXNwbGF5TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdHJhdmVyc2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF91cGRhdGUiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRGb2N1c0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lciIpKSB0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKSkgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIiKSkgdGVzdF9hZGRLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb3VzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lciIpKSB0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyIikpIHRlc3RfYWRkTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyIikpIHRlc3RfYWRkTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRQYWludExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lciIpKSB0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lciIpKSB0ZXN0X2FkZFRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJIikpIHRlc3RfY29tcHV0ZVNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9yY2VGb2N1cyIpKSB0ZXN0X2ZvcmNlRm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFjY2Vzc2libGUiKSkgdGVzdF9nZXRBY2Nlc3NpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm9yZGVyV2lkdGgiKSkgdGVzdF9nZXRCb3JkZXJXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udCIpKSB0ZXN0X2dldEZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMYXlvdXREYXRhIikpIHRlc3RfZ2V0TGF5b3V0RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb24iKSkgdGVzdF9nZXRMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWVudSIpKSB0ZXN0X2dldE1lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1vbml0b3IiKSkgdGVzdF9nZXRNb25pdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNoZWxsIikpIHRlc3RfZ2V0U2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNpemUiKSkgdGVzdF9nZXRTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb29sVGlwVGV4dCIpKSB0ZXN0X2dldFRvb2xUaXBUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWaXNpYmxlIikpIHRlc3RfZ2V0VmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNGb2N1c0NvbnRyb2wiKSkgdGVzdF9pc0ZvY3VzQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNSZXBhcmVudGFibGUiKSkgdGVzdF9pc1JlcGFyZW50YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNWaXNpYmxlIikpIHRlc3RfaXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3ZlQWJvdmVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X21vdmVBYm92ZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3ZlQmVsb3dMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X21vdmVCZWxvd0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYWNrIikpIHRlc3RfcGFjaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFja1oiKSkgdGVzdF9wYWNrWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVkcmF3IikpIHRlc3RfcmVkcmF3KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXdJSUlJWiIpKSB0ZXN0X3JlZHJhd0lJSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvdW5kc0lJSUkiKSkgdGVzdF9zZXRCb3VuZHNJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDYXB0dXJlWiIpKSB0ZXN0X3NldENhcHR1cmVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpKSB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb2N1cyIpKSB0ZXN0X3NldEZvY3VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhdGlvbklJIikpIHRlc3Rfc2V0TG9jYXRpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKSkgdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBhcmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUiKSkgdGVzdF9zZXRQYXJlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWRyYXdaIikpIHRlc3Rfc2V0UmVkcmF3WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l6ZUlJIikpIHRlc3Rfc2V0U2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9Db250cm9sSUkiKSkgdGVzdF90b0NvbnRyb2xJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3RvQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvRGlzcGxheUlJIikpIHRlc3RfdG9EaXNwbGF5SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvRGlzcGxheUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF90b0Rpc3BsYXlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90cmF2ZXJzZUkiKSkgdGVzdF90cmF2ZXJzZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3VwZGF0ZSIpKSB0ZXN0X3VwZGF0ZSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLQlDb250cm9sIGNvbnRyb2w7Ci0JYm9vbGVhbiBldmVudE9jY3VycmVkOwotCi1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQljb250cm9sID0gKENvbnRyb2wpdzsKLQlzdXBlci5zZXRXaWRnZXQodyk7Ci19Ci0KLS8qIGEgZGlmZmVyZW50IG1ldGhvZCBpbiBDb25zaXN0ZW5jeVV0aWxpdHkgaXMgaW52b2tlZCBkZXBlbmRpbmcgb24gd2hhdCBtZXRob2QgCi0gKiBlcXVhbHMKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSzoKLSAqIAkJCXBhcmFtQSBpcyB0aGUgeCBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgCQkJCSAgCi0gKiAJCQlwYXJhbUIgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sCi0gKiAJCQlwYXJhbUMgaXMgdGhlIG1vdXNlIGJ1dHRvbiB0byBjbGljay4KLSAqIAkJCXBhcmFtRCBpZiBpdCBlcXVhbHMgQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VLCB0aGVuIGFub3RoZXIgY2xpY2sKLSAqIAkJCXdpbGwgYmUgbWFkZSBvbiB0aGUgYm9yZGVyIG9mIHRoZSBzaGVsbCwgdG8gZXNjYXBlIHRoZSBtZW51IHRoYXQgY2FtZSB1cAotICogCQkJKGllIHJpZ2h0IGNsaWNraW5nIGluIGEgdGV4dCB3aWRnZXQpCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0Q2xpY2soRGlzcGxheSwgUG9pbnQsIGludCkKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9ET1VCTEVDTElDSwotICogCQkJcGFyYW1BIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCAJCQkJICAKLSAqIAkJCXBhcmFtQiBpcyB0aGUgeSBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wKLSAqIAkJCXBhcmFtQyBpcyB0aGUgbW91c2UgYnV0dG9uIHRvIGNsaWNrLgotICogCQkJaW52b2tlcyBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERvdWJsZUNsaWNrKERpc3BsYXksIFBvaW50LCBpbnQpCi0gKiBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRzoKLSAqIAkJCXBhcmFtQSBpcyB0aGUgeCBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgb2YgdGhlIG9yaWdpbiBvZiBkcmFnCi0gKiAJCQlwYXJhbUIgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBvcmlnaW4gb2YgZHJhZwotICogCQkJcGFyYW1DIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgZGVzdGluYXRpb24gb2YgZHJhZwotICogCQkJcGFyYW1EIGlzIHRoZSB5IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgZGVzdGluYXRpb24gb2YgZHJhZwotICogCQkJaW52b2tlcyBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERyYWcoRGlzcGxheSwgUG9pbnQsIFBvaW50KQotICogQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUzogIAotICogCQkgCXBhcmFtQSBpcyB0aGUgY2hhcmFjdGVyIHRvIHByZXNzCi0gKiAJCQlwYXJhbUIgaXMgdGhlIGtleUNvZGUgCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0S2V5UHJlc3MoRGlzcGxheSwgaW50LCBpbnQpCi0gKiBDb25zaXN0ZW5jeVV0aWxpdHkuRE9VQkxFX0tFWV9QUkVTUzogIAotICogCQkgCXBhcmFtQSBpcyB0aGUgY2hhcmFjdGVyIHRvIHByZXNzIGFuZCBob2xkCi0gKiAJCQlwYXJhbUIgaXMgdGhlIGtleUNvZGUgCi0gKiAJCQlwYXJhbUMgaXMgdGhlIHNlY29uZCBrZXkgdG8gcHJlc3Mgd2hpbGUgdGhlIGZpcnN0IG9uZSBpcyBoZWxkIChpZSBjdHJsLWEpCi0gKiAJCQlwYXJhbUQgaXMgdGhlIHNlY29uZCBrZXljb2RlCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RG91YmxlS2V5UHJlc3MoRGlzcGxheSwgaW50LCBpbnQsIGludCwgaW50KSAKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5TRUxFQ1RJT046Ci0gKiAJCQlwYXJhbUEgaXMgdGhlIHggY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBmaXJzdCBjbGljawotICogCQkJcGFyYW1CIGlzIHRoZSB5IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgZmlyc3QgY2xpY2sKLSAqIAkJCXBhcmFtQyBpcyB0aGUgeCBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgb2YgdGhlIHNlY29uZCBjbGljawotICogCQkJcGFyYW1EIGlzIHRoZSB5IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgc2Vjb25kIGNsaWNrCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2VsZWN0aW9uKERpc3BsYXksIFBvaW50LCBQb2ludCkKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5TSEVMTF9JQ09OSUZZOgotICogCQkJcGFyYW1BIGlzIHRoZSBidXR0b24gdG8gY2xpY2sgd2l0aAotICogCQkJaW52b2tlcyBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdFNoZWxsSWNvbmlmeShEaXNwbGF5LCBQb2ludCwgaW50KQotICovCi1wcm90ZWN0ZWQgdm9pZCBjb25zaXN0ZW5jeUV2ZW50KGZpbmFsIGludCBwYXJhbUEsIGZpbmFsIGludCBwYXJhbUIsIAotICAgICAgICAJCQkJCQlmaW5hbCBpbnQgcGFyYW1DLCBmaW5hbCBpbnQgcGFyYW1ELAotICAgICAgICAJCQkJCQlmaW5hbCBpbnQgbWV0aG9kLCBWZWN0b3IgZXZlbnRzLCBib29sZWFuIGZvY3VzKSB7Ci0gICAgaWYoZlRlc3RDb25zaXN0ZW5jeSkgewotICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIGlmKGV2ZW50cyA9PSBudWxsKSAKLSAgICAgICAgICAgIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHRlc3QgPSBnZXRUZXN0TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQoKSk7Ci0gICAgICAgIHNoZWxsLnNldFRleHQoIlBhcmVudCIpOwotCi0gICAgICAgIHNoZWxsLnBhY2soKTsKLSAgICAJc2hlbGwub3BlbigpOwotICAgIAlpZihjb250cm9sIGluc3RhbmNlb2YgU2hlbGwpIHsKLSAgICAJICAgICgoU2hlbGwpY29udHJvbCkucGFjaygpOwotICAgICAgICAJKChTaGVsbCljb250cm9sKS5vcGVuKCk7Ci0gICAgCX0KLSAgICAJZmluYWwgUG9pbnRbXSBwdCA9IGRldGVybWluZUxvY2F0aW9ucyhwYXJhbUEsIHBhcmFtQiwgcGFyYW1DLCBwYXJhbUQsIG1ldGhvZCk7Ci0gICAgICAgIGlmKGZvY3VzICYmICFjb250cm9sLnNldEZvY3VzKCkpCi0gICAgICAgICAgICBjb250cm9sLmZvcmNlRm9jdXMoKTsKLSAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWRFdmVudHMgPSBob29rRXhwZWN0ZWRFdmVudHModGVzdCwgZXZlbnRzKTsKLSAgICAgICAgbmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5Lndha2UoKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2gobWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLOgotICAgICAgICAgICAgICAgIAkJQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RDbGljayhkaXNwbGF5LCBwdFswXSwgcGFyYW1DKSk7Ci0gICAgICAgICAgICAgICAgCQlpZihwYXJhbUQgPT0gQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VKSB7Ci0gICAgICAgICAgICAgICAgCQkgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0Q2xpY2soZGlzcGxheSwgcHRbMV0sIDEpKTsKLSAgICAgICAgICAgICAgICAJCX0gIAotICAgICAgICAgICAgICAgIAkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLOgotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RG91YmxlQ2xpY2soZGlzcGxheSwgcHRbMF0sIHBhcmFtQykpOwotICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0S2V5UHJlc3MoZGlzcGxheSwgcGFyYW1BLCBwYXJhbUIpKTsKLSAgICAgICAgICAgICAgICAgICAgCWJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTOgotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERvdWJsZUtleVByZXNzKGRpc3BsYXksIHBhcmFtQSwgcGFyYW1CLCBwYXJhbUMsIHBhcmFtRCkpOwotICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERyYWcoZGlzcGxheSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdFswXSwgcHRbMV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnNpc3RlbmN5VXRpbGl0eS5TRUxFQ1RJT046Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2VsZWN0aW9uKGRpc3BsYXksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRbMF0sIHB0WzFdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zaXN0ZW5jeVV0aWxpdHkuU0hFTExfSUNPTklGWToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKFN3dEp1bml0LmlzQ2FyYm9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2hlbGxJY29uaWZ5KGRpc3BsYXksIHB0WzBdLCBwYXJhbUEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdFNoZWxsSWNvbmlmeShkaXNwbGF5LCBwdFsxXSwgcGFyYW1BKSk7Ci0gICAgICAgICAgICAgICAgICAgIAlpZihjb250cm9sIGluc3RhbmNlb2YgU2hlbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICgoU2hlbGwpY29udHJvbCkuc2V0TWluaW1pemVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfX0pOwotICAgICAgICAgICAgICAgICAgICAJfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIAkgICAgZmFpbCgiSWNvbmlmeWluZyBhIG5vbiBzaGVsbCBjb250cm9sIik7Ci0gICAgICAgICAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFRocmVhZCgpIHsKLQkJCQkgICAgcHVibGljIHZvaWQgcnVuKCkgewotCQkJCSAgICAgICAgc2hlbGwuZGlzcG9zZSgpOwotCQkJCSAgICB9Ci0JCQkJfSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9LnN0YXJ0KCk7Ci0KLSAgICAgICAgd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICAgICAgfQotICAgICAgICBzZXRVcCgpOyAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW2V2ZW50cy5zaXplKCldOwotICAgICAgICBldmVudHMuY29weUludG8ocmVzdWx0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0ZXN0ICsgIiBldmVudCBvcmRlcmluZyIsIGV4cGVjdGVkRXZlbnRzLCByZXN1bHRzKTsKLSAgICB9Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGNvbnNpc3RlbmN5RXZlbnQoaW50IHBhcmFtQSwgaW50IHBhcmFtQiwgCi0JCQkJCQkJCWludCBwYXJhbUMsIGludCBwYXJhbUQsCi0JCQkJCQkJCWludCBtZXRob2QsIFZlY3RvciBldmVudHMpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBhcmFtQSwgcGFyYW1CLCBwYXJhbUMsIHBhcmFtRCwgbWV0aG9kLCBldmVudHMsIHRydWUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBjb25zaXN0ZW5jeUV2ZW50KGludCBwYXJhbUEsIGludCBwYXJhbUIsIAotCQkJCQkJCQlpbnQgcGFyYW1DLCBpbnQgcGFyYW1ELAotCQkJCQkJCQlpbnQgbWV0aG9kKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudChwYXJhbUEsIHBhcmFtQiwgcGFyYW1DLCBwYXJhbUQsIG1ldGhvZCwgbnVsbCwgdHJ1ZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCkgewotICAgIHNoZWxsLnNldExheW91dChuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0KCkpOwotICAgIHNoZWxsLnBhY2soKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoU2hlbGwgc2hlbGwpIHsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIHNoZWxsLnBhY2soKTsKLX0KLQotCi1wcm90ZWN0ZWQgUG9pbnRbXSBkZXRlcm1pbmVMb2NhdGlvbnMoaW50IHBhcmFtQSwgaW50IHBhcmFtQiwKLSAgICAgICAgCQkJCQkJICAgICBpbnQgcGFyYW1DLCBpbnQgcGFyYW1ELCBpbnQgbWV0aG9kKSB7Ci0gICAgUG9pbnRbXSBhcnJheSA9IG5ldyBQb2ludFsyXTsKLSAgICBpZihtZXRob2QgPj0gQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKQotICAgICAgICBhcnJheVswXSA9IGNvbnRyb2wudG9EaXNwbGF5KHBhcmFtQSwgcGFyYW1CKTsKLSAgICBpZihtZXRob2QgPj0gQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpIAotICAgICAgICBhcnJheVsxXSA9IGNvbnRyb2wudG9EaXNwbGF5KHBhcmFtQywgcGFyYW1EKTsKLSAgICBpZihtZXRob2QgPT0gQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLICYmIHBhcmFtRCA9PSBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUpCi0gICAgICAgIGFycmF5WzFdID0gc2hlbGwudG9EaXNwbGF5KDI1LCAtMTApOwotICAgIGVsc2UgaWYobWV0aG9kID09IENvbnNpc3RlbmN5VXRpbGl0eS5TSEVMTF9JQ09OSUZZKSB7Ci0gICAgICAgIGFycmF5WzBdID0gY29udHJvbC50b0Rpc3BsYXkoMCwwKTsKLSAgICAgICAgYXJyYXlbMV0gPSBjb250cm9sLnRvRGlzcGxheShjb250cm9sLmdldFNpemUoKS54IC0yMCwgMCk7Ci0gICAgfQotICAgIHJldHVybiBhcnJheTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMThlOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoY29vbEJhcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoICJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Db3VudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1PcmRlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbU9yZGVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbVNpemVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtU2l6ZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NrZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldExvY2tlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdyYXBJbmRpY2VzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRXcmFwSW5kaWNlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtTGF5b3V0JEkkSSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtTGF5b3V0JEkkSSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9ja2VkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TG9ja2VkWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdyYXBJbmRpY2VzJEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdyYXBJbmRpY2VzJEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1PcmRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbVNpemVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9ja2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXcmFwSW5kaWNlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUxheW91dCRJJEkkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TG9ja2VkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V3JhcEluZGljZXMkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbkRyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtT3JkZXIiKSkgdGVzdF9nZXRJdGVtT3JkZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1TaXplcyIpKSB0ZXN0X2dldEl0ZW1TaXplcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9ja2VkIikpIHRlc3RfZ2V0TG9ja2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXcmFwSW5kaWNlcyIpKSB0ZXN0X2dldFdyYXBJbmRpY2VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUxheW91dCRJJEkkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldEl0ZW1MYXlvdXQkSSRJJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2tlZFoiKSkgdGVzdF9zZXRMb2NrZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXcmFwSW5kaWNlcyRJIikpIHRlc3Rfc2V0V3JhcEluZGljZXMkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogQ3VzdG9tICovCi0KLUNvb2xCYXIgY29vbEJhcjsKLQotCi1wcml2YXRlIHZvaWQgY3JlYXRlQ29vbEJhcihWZWN0b3IgZXZlbnRzKSB7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIFN0cmluZyB0ZXN0ID0gZ2V0VGVzdE5hbWUoKTsKLSAgICBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIFNXVC5GTEFUKTsKLQlUb29sQmFyW10gY29vbEl0ZW1Ub29sQmFyID0gbmV3IFRvb2xCYXJbMl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWNvb2xJdGVtVG9vbEJhcltpXSA9IG5ldyBUb29sQmFyKGNvb2xCYXIsIFNXVC5GTEFUKTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGNvb2xJdGVtLCB0ZXN0LCBldmVudHMpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoY29vbEl0ZW1Ub29sQmFyW2ldLCB0ZXN0LCBldmVudHMpOwotCQlpbnQgdG9vbEl0ZW1XaWR0aCA9IDA7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7Ci0JCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKGNvb2xJdGVtVG9vbEJhcltpXSwgU1dULkNIRUNLKTsKLQkJCWl0ZW0uc2V0VGV4dCgiQ0IiICsgKChpKjIpICsgaikpOwotCQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiVG9vbEl0ZW0gVG9vbFRpcCIgKyBpICsgaik7Ci0JCQlpZiAoaXRlbS5nZXRXaWR0aCgpID4gdG9vbEl0ZW1XaWR0aCkKLQkJCSAgICB0b29sSXRlbVdpZHRoID0gaXRlbS5nZXRXaWR0aCgpOwotCQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIHRlc3QsIGV2ZW50cyk7Ci0JCX0KLSAgICAgICAgY29vbEl0ZW0uc2V0Q29udHJvbChjb29sSXRlbVRvb2xCYXJbaV0pOwotICAgICAgICBQb2ludCBzaXplOwotICAgICAgICBpZihpID09IDEpCi0gICAgICAgICAgICBzaXplID0gY29vbEl0ZW1Ub29sQmFyW2ldLmNvbXB1dGVTaXplKDIwLCBTV1QuREVGQVVMVCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNpemUgPSBjb29sSXRlbVRvb2xCYXJbaV0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgUG9pbnQgY29vbFNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpOwotICAgICAgICBjb29sSXRlbS5zZXRNaW5pbXVtU2l6ZSh0b29sSXRlbVdpZHRoLzMsIGNvb2xTaXplLnkpOwotICAgICAgICBjb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKGNvb2xTaXplKTsKLSAgICAgICAgY29vbEl0ZW0uc2V0U2l6ZShjb29sU2l6ZS54LzMsIGNvb2xTaXplLnkpOwotICAgICAgICBjb29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQl9Ci0Jc2V0V2lkZ2V0KGNvb2xCYXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUNvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIFBvaW50W10gcG9pbnRzID0gY29vbEJhci5nZXRJdGVtU2l6ZXMoKTsKLSAgICAvL2NoZXZyb24KLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBvaW50c1swXS54LTEyLCAwLCAzLCBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUNvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIFBvaW50W10gcG9pbnRzID0gY29vbEJhci5nZXRJdGVtU2l6ZXMoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBvaW50c1swXS54LCAyLCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbkRyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngtMTIsIDAsIHBvaW50c1swXS54LTEyLCA1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUNvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIFBvaW50W10gcG9pbnRzID0gY29vbEJhci5nZXRJdGVtU2l6ZXMoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBvaW50c1swXS54LCAwLCBwb2ludHNbMF0ueCwgNSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbk1vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngtMTIsIDAsIHBvaW50c1swXS54LTgsIDMwLCBDb25zaXN0ZW5jeVV0aWxpdHkuU0VMRUNUSU9OLCBldmVudHMpOwotfQotCi1jbGFzcyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0JcHJpdmF0ZSBNZW51IG1lbnUgPSBudWxsOwotCQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCS8qKgotCQkgKiBBIHNlbGVjdGlvbiBldmVudCB3aWxsIGJlIGZpcmVkIHdoZW4gdGhlIGNvb2wgaXRlbQotCQkgKiBpcyBzZWxlY3RlZCBieSBpdHMgZ3JpcHBlciBvciBpZiB0aGUgZHJvcCBkb3duIGFycm93Ci0JCSAqIChvciAnY2hldnJvbicpIGlzIHNlbGVjdGVkLiBFeGFtaW5lIHRoZSBldmVudCBkZXRhaWwKLQkJICogdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSB3aWRnZXQgd2FzIHNlbGVjdGVkLgotCQkgKi8KLQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCS8qIElmIHRoZSBwb3B1cCBtZW51IGlzIGFscmVhZHkgdXAgKGkuZS4gdXNlciBwcmVzc2VkIGFycm93IHR3aWNlKSwKLQkJCSAqIHRoZW4gZGlzcG9zZSBpdC4KLQkJCSAqLwotCQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJCW1lbnUuZGlzcG9zZSgpOwotCQkJCW1lbnUgPSBudWxsOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLyogR2V0IHRoZSBjb29sIGl0ZW0gYW5kIGNvbnZlcnQgaXRzIGJvdW5kcyB0byBkaXNwbGF5IGNvb3JkaW5hdGVzLiAqLwotCQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSAoQ29vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCVJlY3RhbmdsZSBpdGVtQm91bmRzID0gY29vbEl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJaXRlbUJvdW5kcy53aWR0aCA9IGV2ZW50LnggLSBpdGVtQm91bmRzLng7Ci0JCQlQb2ludCBwdCA9IGNvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCAoaXRlbUJvdW5kcy54LCBpdGVtQm91bmRzLnkpKTsKLQkJCWl0ZW1Cb3VuZHMueCA9IHB0Lng7Ci0JCQlpdGVtQm91bmRzLnkgPSBwdC55OwotCQkJCi0JCQkvKiBHZXQgdGhlIHRvb2xiYXIgZnJvbSB0aGUgY29vbCBpdGVtLiAqLwotCQkJVG9vbEJhciB0b29sQmFyID0gKFRvb2xCYXIpIGNvb2xJdGVtLmdldENvbnRyb2wgKCk7Ci0JCQlUb29sSXRlbVtdIHRvb2xzID0gdG9vbEJhci5nZXRJdGVtcyAoKTsKLQkJCWludCB0b29sQ291bnQgPSB0b29scy5sZW5ndGg7Ci0JCQkJCQkJCi0JCQkvKiBDb252ZXJ0IHRoZSBib3VuZHMgb2YgZWFjaCB0b29sIGl0ZW0gdG8gZGlzcGxheSBjb29yZGluYXRlcywKLQkJCSAqIGFuZCBkZXRlcm1pbmUgd2hpY2ggb25lcyBhcmUgcGFzdCB0aGUgYm91bmRzIG9mIHRoZSBjb29sIGl0ZW0uCi0JCQkgKi8KLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdG9vbENvdW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHRvb2xCb3VuZHMgPSB0b29sc1tpXS5nZXRCb3VuZHMgKCk7Ci0JCQkJcHQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEJvdW5kcy54LCB0b29sQm91bmRzLnkpKTsKLQkJCQl0b29sQm91bmRzLnggPSBwdC54OwotCQkJCXRvb2xCb3VuZHMueSA9IHB0Lnk7Ci0JCSAgCQlSZWN0YW5nbGUgaW50ZXJzZWN0aW9uID0gaXRlbUJvdW5kcy5pbnRlcnNlY3Rpb24gKHRvb2xCb3VuZHMpOwotCQkgIAkJaWYgKCFpbnRlcnNlY3Rpb24uZXF1YWxzICh0b29sQm91bmRzKSkgYnJlYWs7Ci0JCSAgCQlpKys7Ci0JCQl9Ci0JCQkKLQkJCS8qIENyZWF0ZSBhIHBvcC11cCBtZW51IHdpdGggaXRlbXMgZm9yIGVhY2ggb2YgdGhlIGhpZGRlbiBidXR0b25zLiAqLwotCQkJbWVudSA9IG5ldyBNZW51IChjb29sQmFyKTsKLQkJCWZvciAoaW50IGogPSBpOyBqIDwgdG9vbENvdW50OyBqKyspIHsKLQkJCQlUb29sSXRlbSB0b29sID0gdG9vbHNbal07Ci0JCQkJU3RyaW5nIHRleHQgPSB0b29sLmdldFRleHQoKTsKLQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULk5PTkUpOwotCQkJCW1lbnVJdGVtLnNldFRleHQodGV4dCk7Ci0JCQl9Ci0JCQkKLQkJCS8qIERpc3BsYXkgdGhlIHBvcC11cCBtZW51IGF0IHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgYXJyb3cgYnV0dG9uLgotCQkJICogRGlzcG9zZSB0aGUgbWVudSB3aGVuIHRoZSB1c2VyIGlzIGRvbmUgd2l0aCBpdC4KLQkJCSAqLwotCQkJcHQgPSBjb29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbiAocHQueCwgcHQueSk7Ci0JCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJRGlzcGxheSBkaXNwbGF5ID0gY29vbEJhci5nZXREaXNwbGF5ICgpOwotCQkJd2hpbGUgKG1lbnUgIT0gbnVsbCAmJiAhbWVudS5pc0Rpc3Bvc2VkKCkgJiYgbWVudS5pc1Zpc2libGUgKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQkJfQotCQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJCW1lbnUuZGlzcG9zZSAoKTsKLQkJCQltZW51ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQ5YjVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0Jc2V0V2lkZ2V0KGNvb2xJdGVtKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySSgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCQotCXRyeSB7Ci0JCW5ldyBDb29sSXRlbShudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsJCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySUkoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDAsIDApOwotCXRyeSB7Ci0JCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDAsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLQl9Ci0JdHJ5IHsKLQkJY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ID09IDIiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDEsIGNvb2xCYXIuZ2V0SXRlbUNvdW50KCkpOwotCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDAsIDEpOwotCWFzc2VydEVxdWFscygyLCBjb29sQmFyLmdldEl0ZW1Db3VudCgpKTsKLQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwLCAwKTsKLQlhc3NlcnRFcXVhbHMoMywgY29vbEJhci5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKGNvb2xJdGVtLCBjb29sQmFyLmdldEl0ZW0oMCkpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSSgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb28iKTsKLQotCVBvaW50IHNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQlQb2ludCBzaXplMiA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JYXNzZXJ0VHJ1ZShzaXplMi54ID09IHNpemUueCk7Ci0KLQlzaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoNTAsIDI1KTsKLQlzaXplMiA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKDEwMCwgMjUpOwotCWFzc2VydEVxdWFscyhzaXplLnggKyA1MCwgc2l6ZTIueCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueSwgc2l6ZTIueSk7Ci0KLQlzaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoMSwxKTsKLQlzaXplMiA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKDI2LCAyNik7Ci0JYXNzZXJ0RXF1YWxzKDI1LCBzaXplMi54IC0gc2l6ZS54KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCVJlY3RhbmdsZSByZWN0ID0gY29vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JUG9pbnQgc2l6ZSA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZS54LCByZWN0LndpZHRoKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZS55LCByZWN0LmhlaWdodCk7Ci0JCi0JY29vbEl0ZW0uc2V0U2l6ZSgyNSwgMjUpOwotCXJlY3QgPSBjb29sSXRlbS5nZXRCb3VuZHMoKTsKLQljb29sSXRlbS5zZXRTaXplKDEwMCwgMjUpOwotCVJlY3RhbmdsZSBuZXdSZWN0ID0gY29vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3Qud2lkdGggKyA3NSwgbmV3UmVjdC53aWR0aCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3QueCwgbmV3UmVjdC54KTsKLQlhc3NlcnRFcXVhbHMocmVjdC55LCBuZXdSZWN0LnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCWFzc2VydE51bGwoY29vbEl0ZW0uZ2V0Q29udHJvbCgpKTsKLQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JQ29udHJvbCBjb250cm9sID0gY29vbEl0ZW0uZ2V0Q29udHJvbCgpOwotCWFzc2VydEVxdWFscyhidXR0b24sIGNvbnRyb2wpOwotCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCWNvbnRyb2wgPSBjb29sSXRlbS5nZXRDb250cm9sKCk7Ci0JYXNzZXJ0RXF1YWxzKGJ1dHRvbiwgY29udHJvbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWluaW11bVNpemUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW1TaXplIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlhc3NlcnRFcXVhbHMoY29vbEJhciwgY29vbEl0ZW0uZ2V0UGFyZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByZWZlcnJlZFNpemUoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vYmFyIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCVBvaW50IHByZWYgPSBjb29sSXRlbS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShwcmVmKTsKLQlhc3NlcnRFcXVhbHMocHJlZiwgY29vbEl0ZW0uZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvbyIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCVJlY3RhbmdsZSByZWN0ID0gY29vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3Qud2lkdGgsIHNpemUueCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3QuaGVpZ2h0LCBzaXplLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCWNvb2xJdGVtLnNldENvbnRyb2wobnVsbCk7Ci0JCi0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb29iYXIiKTsKLQkKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQlQb2ludCBzaXplMiA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQlhc3NlcnRUcnVlKHNpemUyLnggPiBzaXplLngpOwotCQotCWlmICghTUlOSU1BTF9DT05GT1JNQU5DRSkgewotCQlzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCXNpemUyID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpOwotCQlhc3NlcnRFcXVhbHMoc2l6ZTIsIGNvb2xJdGVtLmdldFNpemUoKSk7Ci0JfQotCQotCWJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiBjb250cm9sLmlzRGlzcG9zZWQoKSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCXRyeSB7Ci0JCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biB3aGVuIGNvbnRyb2wgaGFzIHdyb25nIHBhcmVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluaW11bVNpemVJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluaW11bVNpemVJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluaW11bVNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJlZmVycmVkU2l6ZUlJKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvb2JhciIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoc2l6ZSk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueCwgY29vbEl0ZW0uZ2V0U2l6ZSgpLngpOwotCWNvb2xJdGVtLnNldFNpemUoY29vbEl0ZW0uZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZSwgY29vbEl0ZW0uZ2V0U2l6ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQcmVmZXJyZWRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb29iYXIiKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JCi0JUG9pbnQgc2l6ZSA9IG5ldyBQb2ludCg1MCwgMzApOwotCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoc2l6ZSk7Ci0JUG9pbnQgc2l6ZTIgPSBjb29sSXRlbS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZSg1MCwgMzApOwotCWFzc2VydEVxdWFscyhzaXplMiwgY29vbEl0ZW0uZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplSUkoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCi0JY29vbEl0ZW0uc2V0U2l6ZSg1MCwgNTApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoNTAsIDUwKSwgY29vbEl0ZW0uZ2V0U2l6ZSgpKTsKLQotCWNvb2xJdGVtLnNldFNpemUoMCwgMCk7Ci0JUG9pbnQgc21hbGxlc3QgPSBjb29sSXRlbS5nZXRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0U2l6ZSgxLCAxKTsKLQlhc3NlcnRFcXVhbHMoc21hbGxlc3QsIGNvb2xJdGVtLmdldFNpemUoKSk7Ci0JCi0JUmVjdGFuZ2xlIHJlY3QgPSBjb29sSXRlbS5nZXRCb3VuZHMoKTsKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWNvb2xJdGVtLnNldFNpemUocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCWFzc2VydEVxdWFscyhzaXplLCBjb29sSXRlbS5nZXRTaXplKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvbyIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlQb2ludCBzaXplID0gbmV3IFBvaW50KDUwLCA1MCk7Ci0JY29vbEl0ZW0uc2V0U2l6ZShzaXplKTsKLQlQb2ludCBzaXplMiA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQljb29sSXRlbS5zZXRTaXplKDUwLCA1MCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUyLCBjb29sSXRlbS5nZXRTaXplKCkpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNaW5pbXVtU2l6ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcmVmZXJyZWRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1TaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UHJlZmVycmVkU2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQcmVmZXJyZWRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJIikpIHRlc3RfY29tcHV0ZVNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250cm9sIikpIHRlc3RfZ2V0Q29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bVNpemUiKSkgdGVzdF9nZXRNaW5pbXVtU2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmVmZXJyZWRTaXplIikpIHRlc3RfZ2V0UHJlZmVycmVkU2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2l6ZSIpKSB0ZXN0X2dldFNpemUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1TaXplSUkiKSkgdGVzdF9zZXRNaW5pbXVtU2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5pbXVtU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRNaW5pbXVtU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFByZWZlcnJlZFNpemVJSSIpKSB0ZXN0X3NldFByZWZlcnJlZFNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UHJlZmVycmVkU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRQcmVmZXJyZWRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l6ZUlJIikpIHRlc3Rfc2V0U2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlOSU1BTF9DT05GT1JNQU5DRSA9IGZhbHNlOwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGF0ZVRpbWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EYXRlVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmJlM2JhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EYXRlVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EYXRlVGltZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGF0ZVRpbWUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGF0ZVRpbWUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCXN0YXRpYyBmaW5hbCBpbnQgSkFOID0gMCwgRkVCID0gMSwgQVVHID0gNywgTk9WID0gMTA7Ci0JRGF0ZVRpbWUgZGF0ZXRpbWU7Ci0JaW50IHN0eWxlID0gU1dULkRBVEU7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RhdGVUaW1lKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RhdGVUaW1lKFN0cmluZyBuYW1lLCBpbnQgc3R5bGUpIHsKLQl0aGlzKG5hbWUpOwotCXRoaXMuc3R5bGUgPSBzdHlsZTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWRhdGV0aW1lID0gbmV3IERhdGVUaW1lKHNoZWxsLCBzdHlsZSk7Ci0Jc2V0V2lkZ2V0KGRhdGV0aW1lKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCW5ldyBEYXRlVGltZShzaGVsbCwgU1dULk5VTEwpOwotCi0JbmV3IERhdGVUaW1lKHNoZWxsLCBTV1QuREFURSk7Ci0KLQluZXcgRGF0ZVRpbWUoc2hlbGwsIFNXVC5USU1FKTsKLQotCW5ldyBEYXRlVGltZShzaGVsbCwgU1dULkNBTEVOREFSKTsKLQotCW5ldyBEYXRlVGltZShzaGVsbCwgU1dULkRBVEUgfCBTV1QuTE9ORyk7Ci0KLQluZXcgRGF0ZVRpbWUoc2hlbGwsIFNXVC5USU1FIHwgU1dULkxPTkcpOwotCi0JbmV3IERhdGVUaW1lKHNoZWxsLCBTV1QuQ0FMRU5EQVIgfCBTV1QuTE9ORyk7Ci0KLQluZXcgRGF0ZVRpbWUoc2hlbGwsIFNXVC5EQVRFIHwgU1dULk1FRElVTSk7Ci0KLQluZXcgRGF0ZVRpbWUoc2hlbGwsIFNXVC5USU1FIHwgU1dULk1FRElVTSk7Ci0KLQluZXcgRGF0ZVRpbWUoc2hlbGwsIFNXVC5DQUxFTkRBUiB8IFNXVC5NRURJVU0pOwotCi0JbmV3IERhdGVUaW1lKHNoZWxsLCBTV1QuREFURSB8IFNXVC5TSE9SVCk7Ci0KLQluZXcgRGF0ZVRpbWUoc2hlbGwsIFNXVC5USU1FIHwgU1dULlNIT1JUKTsKLQotCW5ldyBEYXRlVGltZShzaGVsbCwgU1dULkNBTEVOREFSIHwgU1dULlNIT1JUKTsKLQotCXRyeSB7Ci0JCW5ldyBEYXRlVGltZShudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCWRhdGV0aW1lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRTZWxlY3Rpb25MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlkYXRldGltZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZGF0ZXRpbWUubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQlkYXRldGltZS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlkYXRldGltZS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZGF0ZXRpbWUubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRGYWxzZShsaXN0ZW5lckNhbGxlZCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF5KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldERheUkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIb3VycygpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRIb3Vyc0kKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW51dGVzKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldE1pbnV0ZXNJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9udGgoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TW9udGhJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2Vjb25kcygpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRTZWNvbmRzSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFllYXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0WWVhckkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREYXRlSUlJKCkgewotCWRhdGV0aW1lLnNldERhdGUoMjAwOCwgQVVHLCAzMSk7Ci0JYXNzZXJ0RXF1YWxzKDMxLCBkYXRldGltZS5nZXREYXkoKSk7Ci0JYXNzZXJ0RXF1YWxzKEFVRywgZGF0ZXRpbWUuZ2V0TW9udGgoKSk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDgsIGRhdGV0aW1lLmdldFllYXIoKSk7Ci0KLQlkYXRldGltZS5zZXREYXRlKDIwMDgsIE5PViwgMzApOwotCWFzc2VydEVxdWFscygzMCwgZGF0ZXRpbWUuZ2V0RGF5KCkpOwotCWFzc2VydEVxdWFscyhOT1YsIGRhdGV0aW1lLmdldE1vbnRoKCkpOwotCWFzc2VydEVxdWFscygyMDA4LCBkYXRldGltZS5nZXRZZWFyKCkpOwotCi0JZGF0ZXRpbWUuc2V0RGF0ZSgyMDA4LCBGRUIsIDI5KTsKLQlhc3NlcnRFcXVhbHMoMjksIGRhdGV0aW1lLmdldERheSgpKTsKLQlhc3NlcnRFcXVhbHMoRkVCLCBkYXRldGltZS5nZXRNb250aCgpKTsKLQlhc3NlcnRFcXVhbHMoMjAwOCwgZGF0ZXRpbWUuZ2V0WWVhcigpKTsKLQotCWRhdGV0aW1lLnNldERhdGUoMjAwNywgRkVCLCAyOCk7Ci0JYXNzZXJ0RXF1YWxzKDI4LCBkYXRldGltZS5nZXREYXkoKSk7Ci0JYXNzZXJ0RXF1YWxzKEZFQiwgZGF0ZXRpbWUuZ2V0TW9udGgoKSk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDcsIGRhdGV0aW1lLmdldFllYXIoKSk7Ci0KLQlkYXRldGltZS5zZXREYXRlKDIwMDgsIEpBTiwgMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGRhdGV0aW1lLmdldERheSgpKTsKLQlhc3NlcnRFcXVhbHMoSkFOLCBkYXRldGltZS5nZXRNb250aCgpKTsKLQlhc3NlcnRFcXVhbHMoMjAwOCwgZGF0ZXRpbWUuZ2V0WWVhcigpKTsKLQotCS8vIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGV5IGZhaWwgb24gV2luZG93cy4KLQkvLyBUaGUgVUsgYW5kIHRoZSBVUyBhZG9wdGVkIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIgb24gU2VwdGVtYmVyIDE0LCAxNzUyCi0JLy8gc28gdGhlIFdpbmRvd3MgY29udHJvbCBjb25zaWRlcnMgSmFuIDEsIDE3NTIgdG8gYmUgaW4gdGhlIEp1bGlhbiBjYWxlbmRhci4KLS8vCWRhdGV0aW1lLnNldERhdGUoMTc1MiwgSkFOLCAxKTsKLS8vCWFzc2VydEVxdWFscygxLCBkYXRldGltZS5nZXREYXkoKSk7Ci0vLwlhc3NlcnRFcXVhbHMoSkFOLCBkYXRldGltZS5nZXRNb250aCgpKTsKLS8vCWFzc2VydEVxdWFscygxNzUyLCBkYXRldGltZS5nZXRZZWFyKCkpOwotCi0JZGF0ZXRpbWUuc2V0RGF0ZSgxNzUyLCBOT1YsIDMwKTsKLQlhc3NlcnRFcXVhbHMoMzAsIGRhdGV0aW1lLmdldERheSgpKTsKLQlhc3NlcnRFcXVhbHMoTk9WLCBkYXRldGltZS5nZXRNb250aCgpKTsKLQlhc3NlcnRFcXVhbHMoMTc1MiwgZGF0ZXRpbWUuZ2V0WWVhcigpKTsKLQlkYXRldGltZS5zZXREYXRlKDIwMDgsIEpBTiwgMSk7Ci0KLQlkYXRldGltZS5zZXREYXRlKDk5OTksIEpBTiwgMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGRhdGV0aW1lLmdldERheSgpKTsKLQlhc3NlcnRFcXVhbHMoSkFOLCBkYXRldGltZS5nZXRNb250aCgpKTsKLQlhc3NlcnRFcXVhbHMoOTk5OSwgZGF0ZXRpbWUuZ2V0WWVhcigpKTsKLQotCWRhdGV0aW1lLnNldERhdGUoMjAwOCwgMCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGRhdGV0aW1lLmdldERheSgpKTsKLQlhc3NlcnRFcXVhbHMoMCwgZGF0ZXRpbWUuZ2V0TW9udGgoKSk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDgsIGRhdGV0aW1lLmdldFllYXIoKSk7Ci0KLQlkYXRldGltZS5zZXREYXRlKDIwMDgsIDExLCAxKTsKLQlhc3NlcnRFcXVhbHMoMSwgZGF0ZXRpbWUuZ2V0RGF5KCkpOwotCWFzc2VydEVxdWFscygxMSwgZGF0ZXRpbWUuZ2V0TW9udGgoKSk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDgsIGRhdGV0aW1lLmdldFllYXIoKSk7Ci0KLQlkYXRldGltZS5zZXREYXRlKDIwMDgsIEpBTiwgMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGRhdGV0aW1lLmdldERheSgpKTsKLQlhc3NlcnRFcXVhbHMoSkFOLCBkYXRldGltZS5nZXRNb250aCgpKTsKLQlhc3NlcnRFcXVhbHMoMjAwOCwgZGF0ZXRpbWUuZ2V0WWVhcigpKTsKLQotCWRhdGV0aW1lLnNldERhdGUoMTk5OSwgRkVCLCAyOSk7IC8vIEZlYiAyOSwgMTk5OSBpcyBub3QgdmFsaWQsIHNvIHNldERhdGUgc2hvdWxkIGJlIGlnbm9yZWQKLQlhc3NlcnRFcXVhbHMoMSwgZGF0ZXRpbWUuZ2V0RGF5KCkpOwotCWFzc2VydEVxdWFscyhKQU4sIGRhdGV0aW1lLmdldE1vbnRoKCkpOwotCWFzc2VydEVxdWFscygyMDA4LCBkYXRldGltZS5nZXRZZWFyKCkpOwotCi0JZGF0ZXRpbWUuc2V0RGF0ZSgxOTk5LCBOT1YsIDMxKTsgLy8gTm92IDMxIGlzIG5vdCB2YWxpZCwgc28gc2V0RGF0ZSBzaG91bGQgYmUgaWdub3JlZAotCWFzc2VydEVxdWFscygxLCBkYXRldGltZS5nZXREYXkoKSk7Ci0JYXNzZXJ0RXF1YWxzKEpBTiwgZGF0ZXRpbWUuZ2V0TW9udGgoKSk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDgsIGRhdGV0aW1lLmdldFllYXIoKSk7Ci0KLQlkYXRldGltZS5zZXREYXRlKDE3NTEsIEpBTiwgMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGRhdGV0aW1lLmdldERheSgpKTsKLQlhc3NlcnRFcXVhbHMoSkFOLCBkYXRldGltZS5nZXRNb250aCgpKTsKLQlhc3NlcnRFcXVhbHMoMjAwOCwgZGF0ZXRpbWUuZ2V0WWVhcigpKTsKLQotCWRhdGV0aW1lLnNldERhdGUoMTAwMDAsIEpBTiwgMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGRhdGV0aW1lLmdldERheSgpKTsKLQlhc3NlcnRFcXVhbHMoSkFOLCBkYXRldGltZS5nZXRNb250aCgpKTsKLQlhc3NlcnRFcXVhbHMoMjAwOCwgZGF0ZXRpbWUuZ2V0WWVhcigpKTsKLQotCWRhdGV0aW1lLnNldERhdGUoMjAwOCwgLTEsIDEpOwotCWFzc2VydEVxdWFscygxLCBkYXRldGltZS5nZXREYXkoKSk7Ci0JYXNzZXJ0RXF1YWxzKEpBTiwgZGF0ZXRpbWUuZ2V0TW9udGgoKSk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDgsIGRhdGV0aW1lLmdldFllYXIoKSk7Ci0KLQlkYXRldGltZS5zZXREYXRlKDIwMDgsIDEyLCAxKTsKLQlhc3NlcnRFcXVhbHMoMSwgZGF0ZXRpbWUuZ2V0RGF5KCkpOwotCWFzc2VydEVxdWFscyhKQU4sIGRhdGV0aW1lLmdldE1vbnRoKCkpOwotCWFzc2VydEVxdWFscygyMDA4LCBkYXRldGltZS5nZXRZZWFyKCkpOwotCi0JZGF0ZXRpbWUuc2V0RGF0ZSgyMDA4LCBKQU4sIDApOwotCWFzc2VydEVxdWFscygxLCBkYXRldGltZS5nZXREYXkoKSk7Ci0JYXNzZXJ0RXF1YWxzKEpBTiwgZGF0ZXRpbWUuZ2V0TW9udGgoKSk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDgsIGRhdGV0aW1lLmdldFllYXIoKSk7Ci0KLQlkYXRldGltZS5zZXREYXRlKDIwMDgsIEpBTiwgOTkpOwotCWFzc2VydEVxdWFscygxLCBkYXRldGltZS5nZXREYXkoKSk7Ci0JYXNzZXJ0RXF1YWxzKEpBTiwgZGF0ZXRpbWUuZ2V0TW9udGgoKSk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDgsIGRhdGV0aW1lLmdldFllYXIoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGF5SSgpIHsKLQlkYXRldGltZS5zZXREYXRlKDIwMDgsIEFVRywgMSk7Ci0JZm9yIChpbnQgZGF5ID0gMTsgZGF5IDw9IDMxOyBkYXkrKykgewotCQlkYXRldGltZS5zZXREYXkoZGF5KTsKLQkJYXNzZXJ0RXF1YWxzKGRheSwgZGF0ZXRpbWUuZ2V0RGF5KCkpOwotCX0KLQotCWludCBkYXkgPSBkYXRldGltZS5nZXREYXkoKTsKLQlkYXRldGltZS5zZXREYXkoMzIpOyAvLyBObyBtb250aCBoYXMgMzIgZGF5cywgc28gc2V0RGF5IHNob3VsZCBiZSBpZ25vcmVkCi0JYXNzZXJ0RXF1YWxzKGRheSwgZGF0ZXRpbWUuZ2V0RGF5KCkpOwotCi0JZGF0ZXRpbWUuc2V0RGF5KC01KTsgLy8gTWFrZSBzdXJlIG5lZ2F0aXZlIHNldERheSBpcyBpZ25vcmVkCi0JYXNzZXJ0RXF1YWxzKGRheSwgZGF0ZXRpbWUuZ2V0RGF5KCkpOwotCi0JZGF0ZXRpbWUuc2V0RGF0ZSgyMDA4LCBGRUIsIDEpOwotCWRhdGV0aW1lLnNldERheSgzMCk7IC8vIEZlYiBuZXZlciBoYXMgMzAgZGF5cywgc28gc2V0RGF5IHNob3VsZCBiZSBpZ25vcmVkCi0JYXNzZXJ0RXF1YWxzKDEsIGRhdGV0aW1lLmdldERheSgpKTsKLQotCWRhdGV0aW1lLnNldERhdGUoMjAwNywgRkVCLCA1KTsKLQlkYXRldGltZS5zZXREYXkoMjkpOyAvLyBGZWIgMjAwNyBkaWQgbm90IGhhdmUgMjkgZGF5cywgc28gc2V0RGF5IHNob3VsZCBiZSBpZ25vcmVkCi0JYXNzZXJ0RXF1YWxzKDUsIGRhdGV0aW1lLmdldERheSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIb3Vyc0koKSB7Ci0JZGF0ZXRpbWUuc2V0VGltZSgyLCAxMCwgMzApOwotCWRhdGV0aW1lLnNldEhvdXJzKDIxKTsKLQlhc3NlcnRFcXVhbHMoMjEsIGRhdGV0aW1lLmdldEhvdXJzKCkpOwotCWFzc2VydEVxdWFscygxMCwgZGF0ZXRpbWUuZ2V0TWludXRlcygpKTsKLQlhc3NlcnRFcXVhbHMoMzAsIGRhdGV0aW1lLmdldFNlY29uZHMoKSk7Ci0KLQlkYXRldGltZS5zZXRIb3VycygyNCk7IC8vIFRoZSBtYXggaXMgMjMgaG91cnMsIHNvIHRoZSBzZXRIb3VycyBzaG91bGQgYmUgaWdub3JlZAotCWFzc2VydEVxdWFscygyMSwgZGF0ZXRpbWUuZ2V0SG91cnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDEwLCBkYXRldGltZS5nZXRNaW51dGVzKCkpOwotCWFzc2VydEVxdWFscygzMCwgZGF0ZXRpbWUuZ2V0U2Vjb25kcygpKTsKLQotCWRhdGV0aW1lLnNldEhvdXJzKC0xKTsgLy8gVGhlIG1pbiBpcyAwIGhvdXJzLCBzbyB0aGUgc2V0SG91cnMgc2hvdWxkIGJlIGlnbm9yZWQKLQlhc3NlcnRFcXVhbHMoMjEsIGRhdGV0aW1lLmdldEhvdXJzKCkpOwotCWFzc2VydEVxdWFscygxMCwgZGF0ZXRpbWUuZ2V0TWludXRlcygpKTsKLQlhc3NlcnRFcXVhbHMoMzAsIGRhdGV0aW1lLmdldFNlY29uZHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWludXRlc0koKSB7Ci0JZGF0ZXRpbWUuc2V0VGltZSgyLCAxMCwgMzApOwotCWRhdGV0aW1lLnNldE1pbnV0ZXMoMjIpOwotCWFzc2VydEVxdWFscygyLCBkYXRldGltZS5nZXRIb3VycygpKTsKLQlhc3NlcnRFcXVhbHMoMjIsIGRhdGV0aW1lLmdldE1pbnV0ZXMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDMwLCBkYXRldGltZS5nZXRTZWNvbmRzKCkpOwotCi0JZGF0ZXRpbWUuc2V0TWludXRlcygwKTsKLQlhc3NlcnRFcXVhbHMoMiwgZGF0ZXRpbWUuZ2V0SG91cnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGRhdGV0aW1lLmdldE1pbnV0ZXMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDMwLCBkYXRldGltZS5nZXRTZWNvbmRzKCkpOwotCi0JZGF0ZXRpbWUuc2V0TWludXRlcyg1OSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGRhdGV0aW1lLmdldEhvdXJzKCkpOwotCWFzc2VydEVxdWFscyg1OSwgZGF0ZXRpbWUuZ2V0TWludXRlcygpKTsKLQlhc3NlcnRFcXVhbHMoMzAsIGRhdGV0aW1lLmdldFNlY29uZHMoKSk7Ci0KLQlkYXRldGltZS5zZXRNaW51dGVzKC0xKTsgLy8gVGhlIG1heCBpcyA1OSBtaW51dGVzLCBzbyB0aGUgc2V0TWludXRlcyBzaG91bGQgYmUgaWdub3JlZAotCWFzc2VydEVxdWFscygyLCBkYXRldGltZS5nZXRIb3VycygpKTsKLQlhc3NlcnRFcXVhbHMoNTksIGRhdGV0aW1lLmdldE1pbnV0ZXMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDMwLCBkYXRldGltZS5nZXRTZWNvbmRzKCkpOwotCi0JZGF0ZXRpbWUuc2V0TWludXRlcyg2MCk7IC8vIFRoZSBtaW4gaXMgMCBtaW51dGVzLCBzbyB0aGUgc2V0TWludXRlcyBzaG91bGQgYmUgaWdub3JlZAotCWFzc2VydEVxdWFscygyLCBkYXRldGltZS5nZXRIb3VycygpKTsKLQlhc3NlcnRFcXVhbHMoNTksIGRhdGV0aW1lLmdldE1pbnV0ZXMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDMwLCBkYXRldGltZS5nZXRTZWNvbmRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1vbnRoSSgpIHsKLQlkYXRldGltZS5zZXREYXRlKDIwMDgsIE5PViwgMSk7Ci0JZGF0ZXRpbWUuc2V0TW9udGgoQVVHKTsKLQlhc3NlcnRFcXVhbHMoQVVHLCBkYXRldGltZS5nZXRNb250aCgpKTsKLQotCWRhdGV0aW1lLnNldE1vbnRoKEpBTik7Ci0JYXNzZXJ0RXF1YWxzKEpBTiwgZGF0ZXRpbWUuZ2V0TW9udGgoKSk7Ci0KLQlkYXRldGltZS5zZXRNb250aChGRUIpOwotCWFzc2VydEVxdWFscyhGRUIsIGRhdGV0aW1lLmdldE1vbnRoKCkpOwotCi0JZGF0ZXRpbWUuc2V0TW9udGgoTk9WKTsKLQlhc3NlcnRFcXVhbHMoTk9WLCBkYXRldGltZS5nZXRNb250aCgpKTsKLQotCWRhdGV0aW1lLnNldERhdGUoMjAwOCwgTk9WLCAzMCk7Ci0JZGF0ZXRpbWUuc2V0TW9udGgoRkVCKTsgLy8gRmViIGRvZXMgbm90IGhhdmUgMzAgZGF5cywgc28gc2V0TW9udGggc2hvdWxkIGJlIGlnbm9yZWQKLQlhc3NlcnRFcXVhbHMoTk9WLCBkYXRldGltZS5nZXRNb250aCgpKTsKLQotCWRhdGV0aW1lLnNldERhdGUoMjAwOCwgQVVHLCAzMSk7Ci0JZGF0ZXRpbWUuc2V0TW9udGgoTk9WKTsgLy8gTm92IGRvZXMgbm90IGhhdmUgMzEgZGF5cywgc28gc2V0TW9udGggc2hvdWxkIGJlIGlnbm9yZWQKLQlhc3NlcnRFcXVhbHMoQVVHLCBkYXRldGltZS5nZXRNb250aCgpKTsKLQotCWRhdGV0aW1lLnNldERhdGUoMjAwNywgTk9WLCAyOSk7Ci0JZGF0ZXRpbWUuc2V0TW9udGgoRkVCKTsgLy8gRmViIDIwMDcgZG9lcyBub3QgaGF2ZSAyOSBkYXlzLCBzbyBzZXRNb250aCBzaG91bGQgYmUgaWdub3JlZAotCWFzc2VydEVxdWFscyhOT1YsIGRhdGV0aW1lLmdldE1vbnRoKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlY29uZHNJKCkgewotCWRhdGV0aW1lLnNldFRpbWUoMiwgMTAsIDMwKTsKLQlkYXRldGltZS5zZXRTZWNvbmRzKDUyKTsKLQlhc3NlcnRFcXVhbHMoMiwgZGF0ZXRpbWUuZ2V0SG91cnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDEwLCBkYXRldGltZS5nZXRNaW51dGVzKCkpOwotCWFzc2VydEVxdWFscyg1MiwgZGF0ZXRpbWUuZ2V0U2Vjb25kcygpKTsKLQotCWRhdGV0aW1lLnNldFNlY29uZHMoMCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGRhdGV0aW1lLmdldEhvdXJzKCkpOwotCWFzc2VydEVxdWFscygxMCwgZGF0ZXRpbWUuZ2V0TWludXRlcygpKTsKLQlhc3NlcnRFcXVhbHMoMCwgZGF0ZXRpbWUuZ2V0U2Vjb25kcygpKTsKLQotCWRhdGV0aW1lLnNldFNlY29uZHMoNTkpOwotCWFzc2VydEVxdWFscygyLCBkYXRldGltZS5nZXRIb3VycygpKTsKLQlhc3NlcnRFcXVhbHMoMTAsIGRhdGV0aW1lLmdldE1pbnV0ZXMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDU5LCBkYXRldGltZS5nZXRTZWNvbmRzKCkpOwotCi0JZGF0ZXRpbWUuc2V0U2Vjb25kcygtMSk7IC8vIFRoZSBtYXggaXMgNTkgc2Vjb25kcywgc28gdGhlIHNldFNlY29uZHMgc2hvdWxkIGJlIGlnbm9yZWQKLQlhc3NlcnRFcXVhbHMoMiwgZGF0ZXRpbWUuZ2V0SG91cnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDEwLCBkYXRldGltZS5nZXRNaW51dGVzKCkpOwotCWFzc2VydEVxdWFscyg1OSwgZGF0ZXRpbWUuZ2V0U2Vjb25kcygpKTsKLQotCWRhdGV0aW1lLnNldFNlY29uZHMoNjApOyAvLyBUaGUgbWluIGlzIDAgc2Vjb25kcywgc28gdGhlIHNldFNlY29uZHMgc2hvdWxkIGJlIGlnbm9yZWQKLQlhc3NlcnRFcXVhbHMoMiwgZGF0ZXRpbWUuZ2V0SG91cnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDEwLCBkYXRldGltZS5nZXRNaW51dGVzKCkpOwotCWFzc2VydEVxdWFscyg1OSwgZGF0ZXRpbWUuZ2V0U2Vjb25kcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUaW1lSUlJKCkgewotCWRhdGV0aW1lLnNldFRpbWUoMiwgMTAsIDMwKTsKLQlhc3NlcnRFcXVhbHMoMiwgZGF0ZXRpbWUuZ2V0SG91cnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDEwLCBkYXRldGltZS5nZXRNaW51dGVzKCkpOwotCWFzc2VydEVxdWFscygzMCwgZGF0ZXRpbWUuZ2V0U2Vjb25kcygpKTsKLQotCWRhdGV0aW1lLnNldFRpbWUoMCwgMTAsIDMwKTsKLQlhc3NlcnRFcXVhbHMoMCwgZGF0ZXRpbWUuZ2V0SG91cnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDEwLCBkYXRldGltZS5nZXRNaW51dGVzKCkpOwotCWFzc2VydEVxdWFscygzMCwgZGF0ZXRpbWUuZ2V0U2Vjb25kcygpKTsKLQotCWRhdGV0aW1lLnNldFRpbWUoMjMsIDEwLCAzMCk7Ci0JYXNzZXJ0RXF1YWxzKDIzLCBkYXRldGltZS5nZXRIb3VycygpKTsKLQlhc3NlcnRFcXVhbHMoMTAsIGRhdGV0aW1lLmdldE1pbnV0ZXMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDMwLCBkYXRldGltZS5nZXRTZWNvbmRzKCkpOwotCi0JZGF0ZXRpbWUuc2V0VGltZSgyLCAwLCAzMCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGRhdGV0aW1lLmdldEhvdXJzKCkpOwotCWFzc2VydEVxdWFscygwLCBkYXRldGltZS5nZXRNaW51dGVzKCkpOwotCWFzc2VydEVxdWFscygzMCwgZGF0ZXRpbWUuZ2V0U2Vjb25kcygpKTsKLQotCWRhdGV0aW1lLnNldFRpbWUoMiwgNTksIDMwKTsKLQlhc3NlcnRFcXVhbHMoMiwgZGF0ZXRpbWUuZ2V0SG91cnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDU5LCBkYXRldGltZS5nZXRNaW51dGVzKCkpOwotCWFzc2VydEVxdWFscygzMCwgZGF0ZXRpbWUuZ2V0U2Vjb25kcygpKTsKLQotCWRhdGV0aW1lLnNldFRpbWUoMiwgMTAsIDApOwotCWFzc2VydEVxdWFscygyLCBkYXRldGltZS5nZXRIb3VycygpKTsKLQlhc3NlcnRFcXVhbHMoMTAsIGRhdGV0aW1lLmdldE1pbnV0ZXMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGRhdGV0aW1lLmdldFNlY29uZHMoKSk7Ci0KLQlkYXRldGltZS5zZXRUaW1lKDIsIDEwLCA1OSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGRhdGV0aW1lLmdldEhvdXJzKCkpOwotCWFzc2VydEVxdWFscygxMCwgZGF0ZXRpbWUuZ2V0TWludXRlcygpKTsKLQlhc3NlcnRFcXVhbHMoNTksIGRhdGV0aW1lLmdldFNlY29uZHMoKSk7Ci0KLQlkYXRldGltZS5zZXRUaW1lKDI5LCAxMCwgMzApOyAvLyBNYXggaG91cnMgaXMgMjMgc28gdGhlIGVudGlyZSBzZXRUaW1lIHNob3VsZCBiZSBpZ25vcmVkCi0JYXNzZXJ0RXF1YWxzKDIsIGRhdGV0aW1lLmdldEhvdXJzKCkpOwotCWFzc2VydEVxdWFscygxMCwgZGF0ZXRpbWUuZ2V0TWludXRlcygpKTsKLQlhc3NlcnRFcXVhbHMoNTksIGRhdGV0aW1lLmdldFNlY29uZHMoKSk7Ci0KLQlkYXRldGltZS5zZXRUaW1lKDIsIDczLCAzMCk7IC8vIE1heCBtaW51dGVzIGlzIDU5IHNvIHRoZSBlbnRpcmUgc2V0VGltZSBzaG91bGQgYmUgaWdub3JlZAotCWFzc2VydEVxdWFscygyLCBkYXRldGltZS5nZXRIb3VycygpKTsKLQlhc3NlcnRFcXVhbHMoMTAsIGRhdGV0aW1lLmdldE1pbnV0ZXMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDU5LCBkYXRldGltZS5nZXRTZWNvbmRzKCkpOwotCi0JZGF0ZXRpbWUuc2V0VGltZSgyLCAxMCwgOTUpOyAvLyBNYXggc2Vjb25kcyBpcyA1OSBzbyB0aGUgZW50aXJlIHNldFRpbWUgc2hvdWxkIGJlIGlnbm9yZWQKLQlhc3NlcnRFcXVhbHMoMiwgZGF0ZXRpbWUuZ2V0SG91cnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKDEwLCBkYXRldGltZS5nZXRNaW51dGVzKCkpOwotCWFzc2VydEVxdWFscyg1OSwgZGF0ZXRpbWUuZ2V0U2Vjb25kcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRZZWFySSgpIHsKLQlkYXRldGltZS5zZXREYXRlKDIwMDgsIE5PViwgMSk7Ci0JZGF0ZXRpbWUuc2V0WWVhcigxOTQ3KTsKLQlhc3NlcnRFcXVhbHMoMTk0NywgZGF0ZXRpbWUuZ2V0WWVhcigpKTsKLQotCWRhdGV0aW1lLnNldFllYXIoMTc1Mik7Ci0JYXNzZXJ0RXF1YWxzKDE3NTIsIGRhdGV0aW1lLmdldFllYXIoKSk7Ci0KLQlkYXRldGltZS5zZXRZZWFyKDk5OTkpOwotCWFzc2VydEVxdWFscyg5OTk5LCBkYXRldGltZS5nZXRZZWFyKCkpOwotCi0JZGF0ZXRpbWUuc2V0WWVhcigyMDA1KTsKLQlhc3NlcnRFcXVhbHMoMjAwNSwgZGF0ZXRpbWUuZ2V0WWVhcigpKTsKLQotCWRhdGV0aW1lLnNldFllYXIoMCk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDUsIGRhdGV0aW1lLmdldFllYXIoKSk7Ci0KLQlkYXRldGltZS5zZXRZZWFyKC0xOTQ3KTsKLQlhc3NlcnRFcXVhbHMoMjAwNSwgZGF0ZXRpbWUuZ2V0WWVhcigpKTsKLQkKLQlkYXRldGltZS5zZXREYXRlKDIwMDgsIEZFQiwgMjkpOwotCWRhdGV0aW1lLnNldFllYXIoMjAwNyk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDgsIGRhdGV0aW1lLmdldFllYXIoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EYXRlVGltZShtZXRob2ROYW1lLCBTV1QuREFURSkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RhdGVUaW1lKG1ldGhvZE5hbWUsIFNXVC5USU1FKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGF0ZVRpbWUobWV0aG9kTmFtZSwgU1dULkNBTEVOREFSKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGF0ZUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGltZUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGF5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIb3VycyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWludXRlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TW9udGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlY29uZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFllYXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERheUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhvdXJzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWludXRlc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1vbnRoSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2Vjb25kc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFllYXJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGF0ZUlJSSIpKSB0ZXN0X3NldERhdGVJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRpbWVJSUkiKSkgdGVzdF9zZXRUaW1lSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREYXkiKSkgdGVzdF9nZXREYXkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhvdXJzIikpIHRlc3RfZ2V0SG91cnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1pbnV0ZXMiKSkgdGVzdF9nZXRNaW51dGVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNb250aCIpKSB0ZXN0X2dldE1vbnRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWNvbmRzIikpIHRlc3RfZ2V0U2Vjb25kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0WWVhciIpKSB0ZXN0X2dldFllYXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERheUkiKSkgdGVzdF9zZXREYXlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRIb3Vyc0kiKSkgdGVzdF9zZXRIb3Vyc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbnV0ZXNJIikpIHRlc3Rfc2V0TWludXRlc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1vbnRoSSIpKSB0ZXN0X3NldE1vbnRoSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2Vjb25kc0kiKSkgdGVzdF9zZXRTZWNvbmRzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0WWVhckkiKSkgdGVzdF9zZXRZZWFySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKGludCBzdHlsZSkgewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgZGF0ZXRpbWUgPSBuZXcgRGF0ZVRpbWUoc2hlbGwsIHN0eWxlKTsKLSAgICBzZXRXaWRnZXQoZGF0ZXRpbWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkRBVEUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5USU1FKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQ0FMRU5EQVIpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuREFURSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlRJTUUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DQUxFTkRBUik7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5EQVRFKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuVElNRSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTMsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkNBTEVOREFSKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDIwLCAyMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkRBVEUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMTUsIDE1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuVElNRSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxNSwgMTUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DQUxFTkRBUik7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxNSwgMTUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2Q3ZDAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGVjb3JhdGlvbnMKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRlY29yYXRpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQkvLyBkbyBub3RoaW5nLCBldmVuIHRob3VnaCB0aGlzIGlzIG5vdCBhbiBhYnN0cmFjdCBjbGFzcywgaXQgd2FzIG5ldmVyIG1lYW50IHRvIAotCS8vIGJlIGluc3RhbnRpYXRlZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpIHsKLQlkZWNvcmF0aW9ucy5jb21wdXRlVHJpbSgwLDAsMCwwKTsKLQlkZWNvcmF0aW9ucy5jb21wdXRlVHJpbSgwLDAsMTAsMjApOwotfQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCVJlY3RhbmdsZSByZWN0ID0gZGVjb3JhdGlvbnMuZ2V0Q2xpZW50QXJlYSgpOwotCWFzc2VydFRydWUoIjphOiIsIHJlY3QuaGVpZ2h0ID49IDApOwotCWFzc2VydFRydWUoIjpiOiIsIHJlY3Qud2lkdGggPj0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVmYXVsdEJ1dHRvbigpIHsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihkZWNvcmF0aW9ucywgU1dULlBVU0gpOwotCWRlY29yYXRpb25zLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBkZWNvcmF0aW9ucy5nZXREZWZhdWx0QnV0dG9uKCkgPT0gYnV0dG9uKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQlJbWFnZVtdIGNhc2VzID0ge251bGwsIG5ldyBJbWFnZShudWxsLCAxMDAsIDEwMCl9OwotCWZvcihpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKXsKLQkJZGVjb3JhdGlvbnMuc2V0SW1hZ2UoY2FzZXNbaV0pOwotCSAJYXNzZXJ0RXF1YWxzKGRlY29yYXRpb25zLmdldEltYWdlKCksIGNhc2VzW2ldKTsKLQkgCWlmIChjYXNlc1tpXSE9bnVsbCkKLQkgIAkJY2FzZXNbaV0uZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEltYWdlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uKCkgewotCWRlY29yYXRpb25zLnNldExvY2F0aW9uKDEwLDE1KTsKLQlhc3NlcnRUcnVlKCI6YToiLCBkZWNvcmF0aW9ucy5nZXRMb2NhdGlvbigpLnggPT0gMTApOwotCWFzc2VydFRydWUoIjpiOiIsIGRlY29yYXRpb25zLmdldExvY2F0aW9uKCkueSA9PSAxNSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW1pemVkKCkgewotCS8vIHRlc3RlZCBpbiBzZXRNYXhpbWl6ZWQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVudUJhcigpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCBkZWNvcmF0aW9ucy5nZXRNZW51QmFyKCkgPT0gbnVsbCk7Ci0JTWVudSBiYXIgPSBuZXcgTWVudSAoZGVjb3JhdGlvbnMsIFNXVC5CQVIpOwotCWRlY29yYXRpb25zLnNldE1lbnVCYXIgKGJhcik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgZGVjb3JhdGlvbnMuZ2V0TWVudUJhcigpID09IGJhcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWluaW1pemVkKCkgewotCS8vIHRlc3RlZCBpbiBzZXRNaW5pbWl6ZWQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2l6ZSgpIHsKLQkvLyBzdXBlciBjbGFzcyB0ZXN0IHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCWRlY29yYXRpb25zLnNldFRleHQoInRlc3QiKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBkZWNvcmF0aW9ucy5nZXRUZXh0KCkuZXF1YWxzKCJ0ZXN0IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzUmVwYXJlbnRhYmxlKCkgewotCS8qIERlY29yYXRpb25zIGFyZSBub3QgcmVwYXJlbnRhYmxlLCBzZWUgd2luMzIgaW1wbGVtZW50YXRpb24gb2YgaXNSZXBhcmVudGFibGUoKSAqLwotCWFzc2VydEZhbHNlKGRlY29yYXRpb25zLmlzUmVwYXJlbnRhYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERlZmF1bHRCdXR0b25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uKCkgewotCWFzc2VydE51bGwoZGVjb3JhdGlvbnMuZ2V0RGVmYXVsdEJ1dHRvbigpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihkZWNvcmF0aW9ucywgU1dULk5VTEwpOwotCWRlY29yYXRpb25zLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlhc3NlcnRUcnVlKCJidXR0b24gbm90IGRlZmF1bHQiLCBkZWNvcmF0aW9ucy5nZXREZWZhdWx0QnV0dG9uKCkgPT0gYnV0dG9uKTsKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpIHsKLQkJZGVjb3JhdGlvbnMuc2V0RGVmYXVsdEJ1dHRvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChkZWNvcmF0aW9ucy5nZXREZWZhdWx0QnV0dG9uKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JYXNzZXJ0TnVsbCgiOmE6IiwgZGVjb3JhdGlvbnMuZ2V0SW1hZ2UoKSk7Ci0JbG9hZEltYWdlcygpOwotCWRlY29yYXRpb25zLnNldEltYWdlKGltYWdlc1swXSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgaW1hZ2VzWzBdID09IGRlY29yYXRpb25zLmdldEltYWdlKCkpOwotCWFzc2VydFRydWUoIjpjOiIsIGltYWdlc1sxXSAhPSBkZWNvcmF0aW9ucy5nZXRJbWFnZSgpKTsKLQlkZWNvcmF0aW9ucy5zZXRJbWFnZShudWxsKTsKLQlhc3NlcnROdWxsKCI6ZDoiLCBkZWNvcmF0aW9ucy5nZXRJbWFnZSgpKTsKLQlmcmVlSW1hZ2VzKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW1pemVkWigpIHsKLQlkZWNvcmF0aW9ucy5zZXRNYXhpbWl6ZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjoxOiIsIGRlY29yYXRpb25zLmdldE1heGltaXplZCgpID09IGZhbHNlKTsKLQlkZWNvcmF0aW9ucy5zZXRNYXhpbWl6ZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgZGVjb3JhdGlvbnMuZ2V0TWF4aW1pemVkKCkgPT0gdHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgZGVjb3JhdGlvbnMuZ2V0TWluaW1pemVkKCkgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1lbnVCYXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpIHsKLQlhc3NlcnROdWxsKGRlY29yYXRpb25zLmdldE1lbnUoKSk7Ci0JTWVudSB0ZXN0TWVudSA9IG5ldyBNZW51KGRlY29yYXRpb25zKTsKLQlkZWNvcmF0aW9ucy5zZXRNZW51KHRlc3RNZW51KTsKLQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbWVudSIsIGRlY29yYXRpb25zLmdldE1lbnUoKSA9PSB0ZXN0TWVudSk7Ci0JZGVjb3JhdGlvbnMuc2V0TWVudShudWxsKTsKLQlhc3NlcnROdWxsKGRlY29yYXRpb25zLmdldE1lbnUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluaW1pemVkWigpIHsKLQlkZWNvcmF0aW9ucy5zZXRNaW5pbWl6ZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjoxOiIsIGRlY29yYXRpb25zLmdldE1pbmltaXplZCgpID09IGZhbHNlKTsKLQlkZWNvcmF0aW9ucy5zZXRNaW5pbWl6ZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgZGVjb3JhdGlvbnMuZ2V0TWluaW1pemVkKCkgPT0gdHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgZGVjb3JhdGlvbnMuZ2V0TWF4aW1pemVkKCkgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQlkZWNvcmF0aW9ucy5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlTdHJpbmcgdGVzdFN0ciA9ICJ0ZXN0IHN0cmluZyI7Ci0JZGVjb3JhdGlvbnMuc2V0VGV4dCh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCJhIiwgZGVjb3JhdGlvbnMuZ2V0VGV4dCgpLmVxdWFscyh0ZXN0U3RyKSk7Ci0JZGVjb3JhdGlvbnMuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiYiIsIGRlY29yYXRpb25zLmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQl0cnkgewotCQlkZWNvcmF0aW9ucy5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0JLy8gdGVzdCBpbiBzdWJjbGFzc2VzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVRyaW1JSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHRCdXR0b24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNYXhpbWl6ZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lbnVCYXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltaXplZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2l6ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNSZXBhcmVudGFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERlZmF1bHRCdXR0b25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNYXhpbWl6ZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNZW51QmFyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltaXplZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVRyaW1JSUlJIikpIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGllbnRBcmVhIikpIHRlc3RfZ2V0Q2xpZW50QXJlYSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVmYXVsdEJ1dHRvbiIpKSB0ZXN0X2dldERlZmF1bHRCdXR0b24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlIikpIHRlc3RfZ2V0SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlcyIpKSB0ZXN0X2dldEltYWdlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb24iKSkgdGVzdF9nZXRMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWF4aW1pemVkIikpIHRlc3RfZ2V0TWF4aW1pemVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZW51QmFyIikpIHRlc3RfZ2V0TWVudUJhcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW1pemVkIikpIHRlc3RfZ2V0TWluaW1pemVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaXplIikpIHRlc3RfZ2V0U2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzUmVwYXJlbnRhYmxlIikpIHRlc3RfaXNSZXBhcmVudGFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERlZmF1bHRCdXR0b25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uIikpIHRlc3Rfc2V0RGVmYXVsdEJ1dHRvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW1pemVkWiIpKSB0ZXN0X3NldE1heGltaXplZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1lbnVCYXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpKSB0ZXN0X3NldE1lbnVCYXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW1pemVkWiIpKSB0ZXN0X3NldE1pbmltaXplZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLURlY29yYXRpb25zIGRlY29yYXRpb25zOwotSW1hZ2VbXSBpbWFnZXMgPSBuZXcgSW1hZ2UgW1N3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGgqU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXMubGVuZ3RoXTsKLQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0JaWYgKGRlY29yYXRpb25zICE9IG51bGwgJiYgIWRlY29yYXRpb25zLmlzRGlzcG9zZWQoKSkKLQkJZGVjb3JhdGlvbnMuZGlzcG9zZSgpOwotCWRlY29yYXRpb25zID0gKERlY29yYXRpb25zKXc7Ci0Jc3VwZXIuc2V0V2lkZ2V0KHcpOwotfQotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKLQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JaW50IG51bUZpbGVzID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXMubGVuZ3RoOwotCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJaW50IGluZGV4ID0gaSpudW1GaWxlczsKLQkJZm9yIChpbnQgaj0wOyBqPG51bUZpbGVzOyBqKyspewotCQkJU3RyaW5nIGZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbal07Ci0JCQlJbnB1dFN0cmVhbSAgcmVzb3VyY2UgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQlpbWFnZXMgW2luZGV4K2pdID0gbmV3IEltYWdlIChzaGVsbC5nZXREaXNwbGF5KCksIHJlc291cmNlKTsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjb250aW51ZTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGZyZWVJbWFnZXMoKSB7Ci0JZm9yIChpbnQgaT0wOyBpPGltYWdlcy5sZW5ndGg7IGkrKykgaW1hZ2VzW2ldLmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0ZjNhMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpYWxvZwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCBkaWFsb2cuZ2V0UGFyZW50KCkgPT0gc2hlbGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlKCkgewotCS8vIHdlIHVzZSB0aGlzIGNhbGwgaW4gYSBDb25zdHJ1Y3RvciB0ZXN0IHNvIHRoYXQgd2UgY2FuCi0JLy8gY2hlY2sgaWYgdGhlIHN0eWxlIGlzIHRoZSBvbmUgdGhhdCB3YXMgY3JlYXRlZAotCWRpYWxvZy5nZXRTdHlsZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZGlhbG9nLmdldFRleHQoKSA9PSAiIik7Ci0JU3RyaW5nIHRlc3RTdHIgPSAidGVzdCBzdHJpbmciOwotCWRpYWxvZy5zZXRUZXh0KHRlc3RTdHIpOwotCWFzc2VydFRydWUoIjoyOiIsIGRpYWxvZy5nZXRUZXh0KCkuZXF1YWxzKHRlc3RTdHIpKTsKLQlkaWFsb2cuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgZGlhbG9nLmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQl0cnkgewotCQlkaWFsb2cuc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHlsZSIpKSB0ZXN0X2dldFN0eWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFNoZWxsIHNoZWxsOwotcHJpdmF0ZSBEaWFsb2cgZGlhbG9nOwotcHJpdmF0ZSBpbnQganVuaXRTdHlsZTsKLQotcHJvdGVjdGVkIHZvaWQgc2V0RGlhbG9nKERpYWxvZyBuZXdEaWFsb2cpIHsKLQlkaWFsb2cgPSBuZXdEaWFsb2c7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRTdHlsZShpbnQgc3R5bGUpIHsKLQlzdHlsZSA9IGp1bml0U3R5bGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMGNkNGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpcmVjdG9yeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2cKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2cgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpcmVjdG9yeURpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZGlyRGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwgU1dULk5VTEwpOwotCXNldERpYWxvZyhkaXJEaWFsb2cpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCkgewotCW5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwpOwotCXRyeSB7Ci0JCW5ldyBEaXJlY3RvcnlEaWFsb2cobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgcGFyZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0JCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsdGVyUGF0aCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB7Ci0JaWYgKGZUZXN0RGlhbG9nT3BlbikKLQkJZGlyRGlhbG9nLm9wZW4oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZGlyRGlhbG9nLmdldEZpbHRlclBhdGgoKSA9PSAiIik7Ci0JU3RyaW5nIHRlc3RTdHIgPSAiLi8qIjsKLQlkaXJEaWFsb2cuc2V0RmlsdGVyUGF0aCh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBkaXJEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLmVxdWFscyh0ZXN0U3RyKSk7Ci0JZGlyRGlhbG9nLnNldEZpbHRlclBhdGgoIiIpOwotCWFzc2VydFRydWUoIjozOiIsIGRpckRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkuZXF1YWxzKCIiKSk7Ci0JZGlyRGlhbG9nLnNldEZpbHRlclBhdGgobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6IiwgZGlyRGlhbG9nLmdldEZpbHRlclBhdGgoKSA9PSBudWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZGlyRGlhbG9nLmdldE1lc3NhZ2UoKSA9PSAiIik7Ci0JU3RyaW5nIHRlc3RTdHIgPSAidGVzdCBzdHJpbmciOwotCWRpckRpYWxvZy5zZXRNZXNzYWdlKHRlc3RTdHIpOwotCWFzc2VydFRydWUoIjoyOiIsIGRpckRpYWxvZy5nZXRNZXNzYWdlKCkuZXF1YWxzKHRlc3RTdHIpKTsKLQlkaXJEaWFsb2cuc2V0TWVzc2FnZSgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgZGlyRGlhbG9nLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKTsKLQl0cnkgewotCQlkaXJEaWFsb2cuc2V0TWVzc2FnZShudWxsKTsKLQkJZmFpbCAoIm51bGwgYXJndW1lbnQgZGlkIG5vdCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2coKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsdGVyUGF0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbHRlclBhdGgiKSkgdGVzdF9nZXRGaWx0ZXJQYXRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZXNzYWdlIikpIHRlc3RfZ2V0TWVzc2FnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGlyZWN0b3J5RGlhbG9nIGRpckRpYWxvZzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDg3YjE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkvLyBUaGVyZSBjYW4gb25seSBiZSBvbmUgRGlzcGxheSBvYmplY3QgcGVyIHRocmVhZC4KLQkvLyBJZiBhIHNlY29uZCBEaXNwbGF5IGlzIGNyZWF0ZWQgb24gdGhlIHNhbWUgdGhyZWFkLCBhbiAKLQkvLyBJbnZhbGlkVGhyZWFkQWNjZXNzRXhjZXB0aW9uIGlzIHRocm93bi4KLQkvLwotCS8vIEVhY2ggdGVzdCB3aWxsIGNyZWF0ZSBpdHMgb3duIERpc3BsYXkgYW5kIG11c3QgZGlzcG9zZSBvZiBpdCAKLQkvLyBiZWZvcmUgY29tcGxldGluZy4KLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JRGlzcGxheSBkaXNwID0gbmV3IERpc3BsYXkoKTsKLQlkaXNwLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgpIHsKLQlEaXNwbGF5IGRpc3A7Ci0JZGlzcCA9IG5ldyBEaXNwbGF5KG51bGwpOwotCWRpc3AuZGlzcG9zZSgpOwotCQotCWRpc3AgPSBuZXcgRGlzcGxheShuZXcgRGV2aWNlRGF0YSgpKTsKLQlkaXNwLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRGaWx0ZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCkgewotCWZpbmFsIGludCBDTE9TRV9DQUxMQkFDSyA9IDA7Ci0JZmluYWwgaW50IERJU1BPU0VfQ0FMTEJBQ0sgPSAxOwotCWZpbmFsIGJvb2xlYW5bXSBjYWxsYmFja1JlY2VpdmVkID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2UsIGZhbHNlfTsKLQkKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuQ2xvc2UpCi0JCQkJY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10gPSB0cnVlOwotCQkJZWxzZSBpZiAoZS50eXBlID09IFNXVC5EaXNwb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10gPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlkaXNwbGF5LmFkZEZpbHRlcihTV1QuRGlzcG9zZSwgbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRGaWx0ZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBhZGRGaWx0ZXIgd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlkaXNwbGF5LmFkZEZpbHRlcihTV1QuQ2xvc2UsIGxpc3RlbmVyKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmNsb3NlKCk7Ci0JfQotCWFzc2VydFRydWUoY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotCWFzc2VydEZhbHNlKGNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQlmaW5hbCBpbnQgQ0xPU0VfQ0FMTEJBQ0sgPSAwOwotCWZpbmFsIGludCBESVNQT1NFX0NBTExCQUNLID0gMTsKLQlmaW5hbCBib29sZWFuW10gY2FsbGJhY2tSZWNlaXZlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZX07Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUudHlwZSA9PSBTV1QuRGlzcG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBhZGRMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWRpc3BsYXkuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmNsb3NlKCk7Ci0JfQotCWFzc2VydEZhbHNlKCI6YToiLCBjYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSk7Ci0KLQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbGlzdGVuZXIpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuY2xvc2UoKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FzeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGlzcGxheS5iZWVwKCk7Ci0JCQl9Ci0JCX0pOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9iZWVwKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5iZWVwKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZGlzcGxheS5jbG9zZSgpOwotCWFzc2VydFRydWUoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2VFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSgpIHsKLQkvLyBBbHNvIHRlc3RzIGRpc3Bvc2UgYW5kIGlzRGlzcG9zZWQKLQlEaXNwbGF5IHRlc3REaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlkaXNwb3NlRXhlY1JhbiA9IGZhbHNlOwotCXRlc3REaXNwbGF5LmRpc3Bvc2VFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZGlzcG9zZUV4ZWNSYW4gPSB0cnVlOwotCQl9Ci0JfSk7Ci0JYXNzZXJ0RXF1YWxzKCJEaXNwbGF5IHNob3VsZCBub3QgYmUgZGlzcG9zZWQiLCBmYWxzZSwgdGVzdERpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLQl0ZXN0RGlzcGxheS5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZSgiRGlzcGxheSBzaG91bGQgYmUgZGlzcG9zZWQiLCB0ZXN0RGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotCWFzc2VydFRydWUoIkRpc3Bvc2VFeGVjIFJ1bm5hYmxlIGRpZCBub3QgcnVuIiwgZGlzcG9zZUV4ZWNSYW4pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbmREaXNwbGF5TGphdmFfbGFuZ19UaHJlYWQoKSB7Ci0JYXNzZXJ0TnVsbChEaXNwbGF5LmZpbmREaXNwbGF5KG5ldyBUaHJlYWQoKSkpOwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0RXF1YWxzKGRpc3BsYXksIERpc3BsYXkuZmluZERpc3BsYXkoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9maW5kV2lkZ2V0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZmluZFdpZGdldEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBY3RpdmVTaGVsbCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpID09IHNoZWxsKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGRpc3BsYXkuZ2V0Qm91bmRzKCk7Ci0JCWFzc2VydE5vdE51bGwocmVjdCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGRpc3BsYXkuZ2V0Q2xpZW50QXJlYSgpOwotCQlhc3NlcnROb3ROdWxsKHJlY3QpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDdXJyZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDdXJzb3JDb250cm9sKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5nZXRDdXJzb3JDb250cm9sKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEN1cnNvckxvY2F0aW9uKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJUG9pbnQgcHQgPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwocHQpOwotCQlhc3NlcnRUcnVlKHB0LnggPj0gMCk7Ci0JCWFzc2VydFRydWUocHQueSA+PSAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3Vyc29yU2l6ZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q3Vyc29yU2l6ZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHNldERhdGEoT2JqZWN0KSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JLy8gdGVzdGVkIGluIHNldERhdGEoU3RyaW5nLCBPYmplY3QpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlhc3NlcnROb3ROdWxsKERpc3BsYXkuZ2V0RGVmYXVsdCgpKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJaW50IGFsaWdubWVudCA9IGRpc3BsYXkuZ2V0RGlzbWlzc2FsQWxpZ25tZW50KCk7Ci0JCWFzc2VydFRydWUoImdldERpc21pc3NhbEFsaWdubWVudCBzaG91bGQgcmV0dXJuIFNXVC5MRUZUIG9yIFNXVC5SSUdIVCIsCi0JCQlhbGlnbm1lbnQgPT0gU1dULkxFRlQgfHwgYWxpZ25tZW50ID09IFNXVC5SSUdIVCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERvdWJsZUNsaWNrVGltZSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWludCB0aW1lID0gZGlzcGxheS5nZXREb3VibGVDbGlja1RpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSh0aW1lID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvY3VzQ29udHJvbCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuZ2V0Rm9jdXNDb250cm9sKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEljb25EZXB0aCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWludCBkZXB0aCA9IGRpc3BsYXkuZ2V0SWNvbkRlcHRoKCk7Ci0JCWFzc2VydFRydWUoZGVwdGggPiAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9uaXRvcnMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlNb25pdG9yW10gbW9uaXRvcnMgPSBkaXNwbGF5LmdldE1vbml0b3JzKCk7Ci0JYXNzZXJ0Tm90TnVsbChtb25pdG9ycyk7Ci0JYXNzZXJ0VHJ1ZSgiYXQgbGVhc3Qgb25lIG1vbml0b3Igc2hvdWxkIGJlIHJldHVybmVkIiwgbW9uaXRvcnMubGVuZ3RoID49IDEpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspCi0JCWFzc2VydFRydWUoIm1vbml0b3IgYXQgaW5kZXggIitpKyIgc2hvdWxkIG5vdCBiZSBudWxsIiwgbW9uaXRvcnNbaV0gIT0gbnVsbCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbWFyeU1vbml0b3IoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlNb25pdG9yIG1vbml0b3IgPSBkaXNwbGF5LmdldFByaW1hcnlNb25pdG9yKCk7Ci0JYXNzZXJ0Tm90TnVsbChtb25pdG9yKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaGVsbHMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbDEgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCVNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LmdldFNoZWxscygpLmxlbmd0aCA9PSAyKTsKLQkJc2hlbGwxLmRpc3Bvc2UoKTsKLQkJc2hlbGwyLmRpc3Bvc2UoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3luY1RocmVhZCgpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aHJlYWRSYW4gPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07Ci0JCVRocmVhZCBub25VSVRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIEFzc3VtZSBubyBzeW5jRXhlYyBydW5uYWJsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW52b2tlZC4KLQkJCQlhc3NlcnROdWxsKGRpc3BsYXkuZ2V0U3luY1RocmVhZCgpKTsKLQkJCQkKLQkJCQkvLyBDcmVhdGUgYSBydW5uYWJsZSBhbmQgaW52b2tlIHdpdGggc3luY0V4ZWMgdG8gdmVyaWZ5IHRoYXQKLQkJCQkvLyB0aGUgaW52b2tpbmcgdGhyZWFkIGlzIHRoZSBzeW5jVGhyZWFkLgotCQkJCWZpbmFsIFRocmVhZCBpbnZva2luZ1RocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWFzc2VydEVxdWFscyhpbnZva2luZ1RocmVhZCwgZGlzcGxheS5nZXRTeW5jVGhyZWFkKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJCi0JCQkJLy8gQ3JlYXRlIGEgcnVubmFibGUgYW5kIGludm9rZSB3aXRoIGFzeW5jRXhlYyB0byB2ZXJpZnkgdGhhdAotCQkJCS8vIHRoZSBzeW5jVGhyZWFkIGlzIG51bGwgd2hpbGUgaXQncyBydW5uaW5nLgotCQkJCWZpbmFsIGJvb2xlYW5bXSBhc3luY0V4ZWNSYW4gPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlhc3NlcnROdWxsKGRpc3BsYXkuZ2V0U3luY1RocmVhZCgpKTsKLQkJCQkJCWFzeW5jRXhlY1JhblswXSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQl3aGlsZSAoIWFzeW5jRXhlY1JhblswXSkgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCQl0aHJlYWRSYW5bMF0gPSB0cnVlOwotCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJfQotCQl9KTsKLQkJbm9uVUlUaHJlYWQuc3RhcnQoKTsKLQkJCi0JCXdoaWxlICghdGhyZWFkUmFuWzBdKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3lzdGVtQ29sb3JJKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJaW50IFtdIGNvbG9ySWRzID0gewotCQkJU1dULkNPTE9SX1dJREdFVF9EQVJLX1NIQURPVywgU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XLAotCQkJU1dULkNPTE9SX1dJREdFVF9MSUdIVF9TSEFET1csIFNXVC5DT0xPUl9XSURHRVRfSElHSExJR0hUX1NIQURPVywKLQkJCVNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCwgU1dULkNPTE9SX1dJREdFVF9CT1JERVIsCi0JCQlTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQsIFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQsCi0JCQlTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5ELCBTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04sCi0JCQlTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT05fVEVYVCwKLQkJfTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgY29sb3JJZHMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydE5vdE51bGwoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihjb2xvcklkc1tpXSkpOwotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN5c3RlbUZvbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlGb250IGZvbnQgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKTsKLQkJYXNzZXJ0Tm90TnVsbChmb250KTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGhyZWFkKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGRvIG5vdCB0ZXN0IGludGVybmFsIEFQSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGRvIG5vdCB0ZXN0IGludGVybmFsIEFQSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjEuc2V0Qm91bmRzKDAsMCwxMDAsMTAwKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjIuc2V0Qm91bmRzKDIwMCwxMDAsMTAwLDEwMCk7Ci0JCXNoZWxsLnNldEJvdW5kcygwLDAsNDAwLDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCVBvaW50IHNoZWxsT2Zmc2V0ID0gc2hlbGwuZ2V0TG9jYXRpb24oKTsKLQkJUG9pbnQgcmVzdWx0OwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMCwtMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgLTEwLCAtMjApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMTAsLTEyMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDMwLCA0MCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTE3MCwtNjApLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMjAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIC01LCAtMTUpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDE5NSw4NSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDI1LCAzNSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMjI1LDEzNSksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjAwIC0gc2hlbGxPZmZzZXQueCwtMTAwIC0gc2hlbGxPZmZzZXQueSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIC0yLCAtNCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMiAtIHNoZWxsT2Zmc2V0LngsLTEwNCAtIHNoZWxsT2Zmc2V0LnkpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCA2LCA4KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMTk0IC0gc2hlbGxPZmZzZXQueCwtOTIgLSBzaGVsbE9mZnNldC55KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAyMDAsc2hlbGxPZmZzZXQueSArIDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIC0zLCAtNik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoc2hlbGxPZmZzZXQueCArIDE5NyxzaGVsbE9mZnNldC55ICsgOTQpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCA5LCAxMik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoc2hlbGxPZmZzZXQueCArIDIwOSxzaGVsbE9mZnNldC55ICsgMTEyKSwgcmVzdWx0KTsKLQkJCi0JCWJ1dHRvbjEuZGlzcG9zZSgpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgMCwgMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAwLCAwKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCB0byBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUlJSSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjEuc2V0Qm91bmRzKDAsMCwxMDAsMTAwKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjIuc2V0Qm91bmRzKDIwMCwxMDAsMTAwLDEwMCk7Ci0JCXNoZWxsLnNldEJvdW5kcygwLDAsNDAwLDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCVBvaW50IHNoZWxsT2Zmc2V0ID0gc2hlbGwuZ2V0TG9jYXRpb24oKTsKLQkJUmVjdGFuZ2xlIHJlc3VsdDsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDAsIDAsIDEwMCwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMCwtMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCAtMTAsIC0yMCwgMTMwLCAxNDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjEwLC0xMjAsMTMwLDE0MCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDUwLCA2MCwgMTcwLCAxODApOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMTUwLC00MCwxNzAsMTgwKSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDAsIDAsIDEwMCwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMjAwLDEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgLTUsIC0xNSwgMTI1LCAxMzUpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgxOTUsODUsMTI1LDEzNSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDQ1LCA1NSwgMTY1LCAxNzUpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgyNDUsMTU1LDE2NSwxNzUpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgMCwgMCwgMTAwLCAxMDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjAwIC0gc2hlbGxPZmZzZXQueCwtMTAwIC0gc2hlbGxPZmZzZXQueSwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgLTIsIC00LCAxMDYsIDEwOCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0yMDIgLSBzaGVsbE9mZnNldC54LC0xMDQgLSBzaGVsbE9mZnNldC55LDEwNiwxMDgpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCAxMCwgMTIsIDExNCwgMTE2KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTE5MCAtIHNoZWxsT2Zmc2V0LngsLTg4IC0gc2hlbGxPZmZzZXQueSwxMTQsMTE2KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIDAsIDAsIDEwMCwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDIwMCxzaGVsbE9mZnNldC55ICsgMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCAtMywgLTYsIDEwOSwgMTEyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDE5NyxzaGVsbE9mZnNldC55ICsgOTQsMTA5LDExMiksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIDE1LCAxOCwgMTIxLCAxMjQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZShzaGVsbE9mZnNldC54ICsgMjE1LHNoZWxsT2Zmc2V0LnkgKyAxMTgsMTIxLDEyNCksIHJlc3VsdCk7Ci0JCQotCQlidXR0b24xLmRpc3Bvc2UoKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDAsIDAsIDEwMCwgMTAwKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCBmcm9tIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCBmcm9tIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDAsIDAsIDEwMCwgMTAwKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCB0byBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjEuc2V0Qm91bmRzKDAsMCwxMDAsMTAwKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjIuc2V0Qm91bmRzKDIwMCwxMDAsMTAwLDEwMCk7Ci0JCXNoZWxsLnNldEJvdW5kcygwLDAsNDAwLDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCVBvaW50IHJlc3VsdDsKLQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoMCwwKTsKLQkJUG9pbnQgc2hlbGxPZmZzZXQgPSBzaGVsbC5nZXRMb2NhdGlvbigpOwotCi0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBwb2ludCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMCwtMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgbmV3IFBvaW50KC0xMCwtMjApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjEwLC0xMjApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBuZXcgUG9pbnQoMzAsNDApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMTcwLC02MCksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBwb2ludCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMjAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIG5ldyBQb2ludCgtNSwtMTUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgxOTUsODUpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBuZXcgUG9pbnQoMjUsMzUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyMjUsMTM1KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIHBvaW50KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjAwIC0gc2hlbGxPZmZzZXQueCwtMTAwIC0gc2hlbGxPZmZzZXQueSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIG5ldyBQb2ludCgtMiwtNCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMDIgLSBzaGVsbE9mZnNldC54LC0xMDQgLSBzaGVsbE9mZnNldC55KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgbmV3IFBvaW50KDYsOCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0xOTQgLSBzaGVsbE9mZnNldC54LC05MiAtIHNoZWxsT2Zmc2V0LnkpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgcG9pbnQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAyMDAsc2hlbGxPZmZzZXQueSArIDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIG5ldyBQb2ludCgtMywtNikpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAxOTcsc2hlbGxPZmZzZXQueSArIDk0KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgbmV3IFBvaW50KDksMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludChzaGVsbE9mZnNldC54ICsgMjA5LHNoZWxsT2Zmc2V0LnkgKyAxMTIpLCByZXN1bHQpOwotCQkKLQkJYnV0dG9uMS5kaXNwb3NlKCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBwb2ludCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBwb2ludCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAoUG9pbnQpIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbnVsbCBwb2ludCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcG9pbnQgYmVpbmcgbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24xLnNldEJvdW5kcygwLDAsMTAwLDEwMCk7Ci0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24yLnNldEJvdW5kcygyMDAsMTAwLDEwMCwxMDApOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwwLDQwMCw0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQlSZWN0YW5nbGUgcmVzdWx0OwotCQlSZWN0YW5nbGUgcmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwwLDEwMCwxMDApOwotCQlQb2ludCBzaGVsbE9mZnNldCA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCByZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMCwtMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBuZXcgUmVjdGFuZ2xlKC0xMCwgLTIwLCAxMzAsIDE0MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjEwLC0xMjAsMTMwLDE0MCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIG5ldyBSZWN0YW5nbGUoNTAsIDYwLCAxNzAsIDE4MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMTUwLC00MCwxNzAsMTgwKSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIHJlY3QpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgyMDAsMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBuZXcgUmVjdGFuZ2xlKC01LCAtMTUsIDEyNSwgMTM1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDE5NSw4NSwxMjUsMTM1KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgbmV3IFJlY3RhbmdsZSg0NSwgNTUsIDE2NSwgMTc1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDI0NSwxNTUsMTY1LDE3NSksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCByZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMCAtIHNoZWxsT2Zmc2V0LngsLTEwMCAtIHNoZWxsT2Zmc2V0LnksMTAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIG5ldyBSZWN0YW5nbGUoLTIsIC00LCAxMDYsIDEwOCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjAyIC0gc2hlbGxPZmZzZXQueCwtMTA0IC0gc2hlbGxPZmZzZXQueSwxMDYsMTA4KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgbmV3IFJlY3RhbmdsZSgxMCwgMTIsIDExNCwgMTE2KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0xOTAgLSBzaGVsbE9mZnNldC54LC04OCAtIHNoZWxsT2Zmc2V0LnksMTE0LDExNiksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCByZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDIwMCxzaGVsbE9mZnNldC55ICsgMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCBuZXcgUmVjdGFuZ2xlKC0zLCAtNiwgMTA5LCAxMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDE5NyxzaGVsbE9mZnNldC55ICsgOTQsMTA5LDExMiksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIG5ldyBSZWN0YW5nbGUoMTUsIDE4LCAxMjEsIDEyNCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZShzaGVsbE9mZnNldC54ICsgMjE1LHNoZWxsT2Zmc2V0LnkgKyAxMTgsMTIxLDEyNCksIHJlc3VsdCk7Ci0JCQotCQotCQlidXR0b24xLmRpc3Bvc2UoKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIHJlY3QpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgcmVjdCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAoUmVjdGFuZ2xlKSBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgcG9pbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSBiZWluZyBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0JZmluYWwgaW50IEtFWUNPREUgPSBTV1QuU0hJRlQ7Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5wb3N0KG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcG9zdCB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBvc3Qgd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCXNoZWxsLnNldEJvdW5kcyhkaXNwbGF5LmdldEJvdW5kcygpKTsKLQkJc2hlbGwub3BlbigpOwotCi0JCUV2ZW50IGV2ZW50OwotCQkKLQkJLy8gVGVzdCBrZXkgZXZlbnRzIChkb3duL3VwKQotCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC50eXBlID0gU1dULktleURvd247Ci0JCWV2ZW50LmtleUNvZGUgPSAtMTsgIAkJCQkvLyBib2d1cyBrZXkgY29kZQotCQlhc3NlcnRUcnVlKGRpc3BsYXkucG9zdChldmVudCkpOwkvLyB1c2VzIGRlZmF1bHQgMCBjaGFyYWN0ZXIKLQkJLy8gZG9uJ3QgdGVzdCBLZXlEb3duL0tleVVwIHdpdGggYSBjaGFyYWN0ZXIgdG8gYXZvaWQgc2VuZGluZyB0byAKLQkJLy8gcmFuZG9tIHdpbmRvdyBpZiB0ZXN0IHNoZWxsIGxvb3NlcyBmb2N1cwotCQkKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQotCQlldmVudC50eXBlID0gU1dULktleURvd247Ci0JCWV2ZW50LmtleUNvZGUgPSBLRVlDT0RFOwotCQlzaGVsbC5zZXRGb2N1cygpOwotCQlhc3NlcnRUcnVlKGRpc3BsYXkucG9zdChldmVudCkpOwotCQlldmVudC50eXBlID0gU1dULktleVVwOwotCQlzaGVsbC5zZXRGb2N1cygpOwotCQlhc3NlcnRUcnVlKGRpc3BsYXkucG9zdChldmVudCkpOwotCQkKLQkJLy8gVGVzdCBtb3VzZSBldmVudHMgKGRvd24vdXAvbW92ZSkKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZU1vdmU7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJZXZlbnQueCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoLzI7Ci0JCWV2ZW50LnkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQvMjsKLQkJc2hlbGwuc2V0Rm9jdXMoKTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJCi0JCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VEb3duOwotCQlhc3NlcnRGYWxzZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsgIC8vIG1pc3NpbmcgYnV0dG9uCi0JCWV2ZW50LmJ1dHRvbiA9IDE7Ci0JCXNoZWxsLnNldEZvY3VzKCk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5wb3N0KGV2ZW50KSk7Ci0JCQotCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC50eXBlID0gU1dULk1vdXNlVXA7Ci0JCWFzc2VydEZhbHNlKGRpc3BsYXkucG9zdChldmVudCkpOyAgLy8gbWlzc2luZyBidXR0b24KLQkJZXZlbnQuYnV0dG9uID0gMTsKLQkJc2hlbGwuc2V0Rm9jdXMoKTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJCi0JCS8vIFRlc3QgdW5zdXBwb3J0ZWQgZXZlbnQKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZURvdWJsZUNsaWNrOwotCQlhc3NlcnRGYWxzZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJCi0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCi0JCS8vIGNhbid0IHZlcmlmeSB0aGF0IHRoZSBldmVudHMgd2VyZSBhY3R1YWxseSBzZW50IHRvIGEgbGlzdGVuZXIuCi0JCS8vIHRoZSB0ZXN0IHNoZWxsIHdvbid0IHJlY2VpdmUgYW55IGV2ZW50cyBpZiBpdCBoYXMgbG9zdCBmb2N1cywgCi0JCS8vIGUuZy4sIGR1ZSB0byB1c2VyIGludGVydmVudGlvbiBvciBhbm90aGVyIHByb2Nlc3MgcG9wcGluZyB1cCAKLQkJLy8gYSB3aW5kb3cuIAotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWFkQW5kRGlzcGF0Y2goKSB7Ci0JLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyByZWx5IG9uIHJlYWRBbmREaXNwYXRjaCBpbiBvcmRlciB0byBzdWNjZWVkLAotCS8vIHRodXMgbm8gdGVzdCBpcyBuZWVkZWQgaGVyZS4KLQkvLyAgICB0ZXN0X2dldFN5bmNUaHJlYWQoKQotCS8vICAgIHRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQlmaW5hbCBpbnQgQ0xPU0VfQ0FMTEJBQ0sgPSAwOwotCWZpbmFsIGludCBESVNQT1NFX0NBTExCQUNLID0gMTsKLQlmaW5hbCBib29sZWFuW10gY2FsbGJhY2tSZWNlaXZlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZX07Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUudHlwZSA9PSBTV1QuRGlzcG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5yZW1vdmVGaWx0ZXIoU1dULkRpc3Bvc2UsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlRmlsdGVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlRmlsdGVyIHdpdGggbnVsbCBhcmd1bWVudCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJZGlzcGxheS5hZGRGaWx0ZXIoU1dULkNsb3NlLCBsaXN0ZW5lcik7Ci0JCWRpc3BsYXkucmVtb3ZlRmlsdGVyKFNXVC5DbG9zZSwgbGlzdGVuZXIpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuY2xvc2UoKTsKLQl9Ci0JYXNzZXJ0RmFsc2UoY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotCWFzc2VydEZhbHNlKGNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQlmaW5hbCBpbnQgQ0xPU0VfQ0FMTEJBQ0sgPSAwOwotCWZpbmFsIGludCBESVNQT1NFX0NBTExCQUNLID0gMTsKLQlmaW5hbCBib29sZWFuW10gY2FsbGJhY2tSZWNlaXZlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZX07Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUudHlwZSA9PSBTV1QuRGlzcG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5yZW1vdmVMaXN0ZW5lcihTV1QuQ2xvc2UsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWRpc3BsYXkuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLQkJZGlzcGxheS5yZW1vdmVMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuY2xvc2UoKTsKLQl9Ci0JYXNzZXJ0RmFsc2UoY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotCWFzc2VydEZhbHNlKGNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbGVhc2UoKSB7Ci0JLy8gT3ZlcnJpZGluZyB0ZXN0X3JlbGVhc2UgZnJvbSBEZXZpY2UuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCURpc3BsYXkuc2V0QXBwTmFtZSgiTXkgQXBwbGljYXRpb24gTmFtZSIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEN1cnNvckxvY2F0aW9uSUkoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LnNldEN1cnNvckxvY2F0aW9uKDAsMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEN1cnNvckxvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuc2V0Q3Vyc29yTG9jYXRpb24obmV3IFBvaW50KDAsMCkpOwotCQl0cnkgewotCQkJZGlzcGxheS5zZXRDdXJzb3JMb2NhdGlvbihudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNldEN1cnNvckxvY2F0aW9uIHdpdGggbnVsbCBhcmd1bWVudCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LnNldERhdGEobmV3IEludGVnZXIoMTApKTsKLQkJSW50ZWdlciBpID0gKEludGVnZXIpZGlzcGxheS5nZXREYXRhKCk7Ci0JCWFzc2VydE5vdE51bGwoaSk7Ci0JCWFzc2VydFRydWUoaS5lcXVhbHMobmV3IEludGVnZXIoMTApKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5zZXREYXRhKCJJbnRlZ2VyIiwgbmV3IEludGVnZXIoMTApKTsKLQkJZGlzcGxheS5zZXREYXRhKCJTdHJpbmciLCAieHl6Iik7Ci0JCUludGVnZXIgaSA9IChJbnRlZ2VyKWRpc3BsYXkuZ2V0RGF0YSgiSW50ZWdlciIpOwotCQlhc3NlcnROb3ROdWxsKGkpOwotCQlhc3NlcnRUcnVlKGkuZXF1YWxzKG5ldyBJbnRlZ2VyKDEwKSkpOwotCQlTdHJpbmcgcyA9IChTdHJpbmcpZGlzcGxheS5nZXREYXRhKCJTdHJpbmciKTsKLQkJYXNzZXJ0Tm90TnVsbChzKTsKLQkJYXNzZXJ0VHJ1ZShzLmVxdWFscygieHl6IikpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTeW5jaHJvbml6ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyKCkgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgYm9vbGVhbltdIGFzeW5jRXhlY1JhbiA9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKLQkKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5zZXRTeW5jaHJvbml6ZXIobnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwb3N0IHdpdGggbnVsbCBhcmd1bWVudCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igc2V0IHN5bmNocm9uaXplciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWNsYXNzIE15U3luY2hyb25pemVyIGV4dGVuZHMgU3luY2hyb25pemVyIHsKLQkJCWJvb2xlYW4gaW52b2tlZCA9IGZhbHNlOwotCQkJTXlTeW5jaHJvbml6ZXIoRGlzcGxheSBkKSB7Ci0JCQkJc3VwZXIoZCk7Ci0JCQl9Ci0JCQlwcm90ZWN0ZWQgdm9pZCBhc3luY0V4ZWMgKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCQkJaW52b2tlZCA9IHRydWU7Ci0JCQkJc3VwZXIuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCX0KLQkJfQotCQkKLQkJTXlTeW5jaHJvbml6ZXIgbXlTeW5jaHJvbml6ZXIgPSBuZXcgTXlTeW5jaHJvbml6ZXIoZGlzcGxheSk7Ci0JCWRpc3BsYXkuc2V0U3luY2hyb25pemVyKG15U3luY2hyb25pemVyKTsKLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFzeW5jRXhlY1JhblswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQl3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkge30KLQkJYXNzZXJ0VHJ1ZShteVN5bmNocm9uaXplci5pbnZva2VkKTsKLQkJYXNzZXJ0VHJ1ZShhc3luY0V4ZWNSYW5bMF0pOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zbGVlcCgpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVRocmVhZCB0aHJlYWQ7Ci0JCWJvb2xlYW4gZXZlbnRRdWV1ZWQ7Ci0JCQotCQkvLyBFbnN1cmUgZXZlbnQgcXVldWUgaXMgZW1wdHksIG90aGVyd2lzZSBzbGVlcCgpIHdpbGwganVzdCByZXR1cm4uCi0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHt9Ci0JCXRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gRGVsYXkgdG8gZW5zdXJlIHRoZSBVSSB0aHJlYWQgaGFzIGJlZW4gcHV0IHRvIHNsZWVwLgotCQkJCQlzbGVlcCgzMDAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCQkvLyBVc2Ugd2FrZSgpIHRvIHJldml2ZSBmcm9tIHNsZWVwKCkuCi0JCQkJZGlzcGxheS53YWtlKCk7Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zdGFydCgpOwotCQkvLyBOb3RlIHRoYXQgc2xlZXAgc2VlbXMgdG8gYWx3YXlzIHJldHVybiB0cnVlLCBhdCBsZWFzdAotCQkvLyBvbiBXaW5kb3dzLCBzaW5jZSB3YWtlKCkgdXNlcyBhIG51bGwgZXZlbnQuIAotCQlldmVudFF1ZXVlZCA9IGRpc3BsYXkuc2xlZXAoKTsKLQkJCi0JCS8vIEVuc3VyZSBldmVudCBxdWV1ZSBpcyBlbXB0eSwgb3RoZXJ3aXNlIHNsZWVwKCkgd2lsbCBqdXN0IHJldHVybi4KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkge30KLQkJdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBEZWxheSB0byBlbnN1cmUgdGhlIFVJIHRocmVhZCBoYXMgYmVlbiBwdXQgdG8gc2xlZXAuCi0JCQkJCXNsZWVwKDMwMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCQkJCS8vIENhdXNlIE9TIHRvIGdlbmVyYXRlIGFuIGV2ZW50IHRvIHJldml2ZSBmcm9tIHNsZWVwKCkuCi0JCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVNoZWxsIHMgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQkJCQlzLm9wZW4oKTsKLQkJCQkJCXMuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zdGFydCgpOwotCQlldmVudFF1ZXVlZCA9IGRpc3BsYXkuc2xlZXAoKTsKLQkJYXNzZXJ0VHJ1ZShldmVudFF1ZXVlZCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N5bmNFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSgpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpc3BsYXkuYmVlcCgpOwotCQkJfQotCQl9KTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGltZXJFeGVjSUxqYXZhX2xhbmdfUnVubmFibGUoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlmaW5hbCBib29sZWFuW10gdGltZXJFeGVjUmFuID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQlmaW5hbCBib29sZWFuW10gdGhyZWFkUmFuID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQkKLQkJdHJ5IHsKLQkJCWRpc3BsYXkudGltZXJFeGVjKDAsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGltZXJFeGVjIHdpdGggbnVsbCBydW5uYWJsZSIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgdGltZXJFeGVjIHdpdGggbnVsbCBydW5uYWJsZSIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJZGlzcGxheS50aW1lckV4ZWMoLTEwMCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRpbWVyRXhlY1JhblswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQkJCQotCQlmaW5hbCBpbnQgZGVsYXkgPSAzMDAwOwotCQlmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlkaXNwbGF5LnRpbWVyRXhlYyhkZWxheSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCS8vIGRlYnVnIGludGVybWl0dGVudCB0ZXN0IGZhaWx1cmUKLQkJCQlpZiAoZW5kVGltZSA8IChzdGFydFRpbWUgKyBkZWxheSkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEaXNwbGF5LnRpbWVyRXhlYyByYW4gZWFybHkgIiArICgoc3RhcnRUaW1lICsgZGVsYXkpIC0gZW5kVGltZSkpOwotCQkJCX0KLQkJCQkvL2Fzc2VydFRydWUoIlRpbWVyIHJhbiBlYXJseSEgbXMgZWFybHk6ICIsIGVuZFRpbWUgPj0gKHN0YXJ0VGltZSArIGRlbGF5KSk7Ci0JCQkJdGhyZWFkUmFuWzBdID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXdoaWxlICghdGhyZWFkUmFuWzBdKSB7Ci0JCQkvLyBUaGUgcmVhZCBhbmQgZGlzcGF0Y2ggbG9vcCBtdXN0IGJlIHJ1bm5pbmcgaW4gb3JkZXIKLQkJCS8vIGZvciB0aGUgcnVubmFibGUgaW4gdGhlIHRpbWVyIGV4ZWMgdG8gYmUgZXhlY3V0ZWQuCi0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJCi0JCS8vIFZlcmlmeSB0aGUgdGltZXJFeGVjIHdpdGggbGVzcyB0aGFuIHplcm8gbWlsbGlzZWNvbmRzIGRpZG4ndCBleGVjdXRlLgotCQlhc3NlcnRGYWxzZSgiPCAwIG1zIHRpbWVyIGRpZCBleGVjdXRlIiwgdGltZXJFeGVjUmFuWzBdKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdXBkYXRlKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS51cGRhdGUoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2FrZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2xlZXAoKSBtZXRob2QKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hc3luY0V4ZWNMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9iZWVwIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZUV4ZWNMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maW5kRGlzcGxheUxqYXZhX2xhbmdfVGhyZWFkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maW5kV2lkZ2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWN0aXZlU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q3VycmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q3Vyc29yQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q3Vyc29yTG9jYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEN1cnNvclNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREb3VibGVDbGlja1RpbWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvY3VzQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SWNvbkRlcHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNb25pdG9ycyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJpbWFyeU1vbml0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNoZWxscyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3luY1RocmVhZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3lzdGVtQ29sb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTeXN0ZW1Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUaHJlYWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wb3N0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWFkQW5kRGlzcGF0Y2giKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDdXJzb3JMb2NhdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDdXJzb3JMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN5bmNocm9uaXplckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NsZWVwIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RpbWVyRXhlY0lMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF91cGRhdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dha2UiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X2FkZEZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYXN5bmNFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSIpKSB0ZXN0X2FzeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2JlZXAiKSkgdGVzdF9iZWVwKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9zZSIpKSB0ZXN0X2Nsb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKSkgdGVzdF9kaXNwb3NlRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbmREaXNwbGF5TGphdmFfbGFuZ19UaHJlYWQiKSkgdGVzdF9maW5kRGlzcGxheUxqYXZhX2xhbmdfVGhyZWFkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maW5kV2lkZ2V0SSIpKSB0ZXN0X2ZpbmRXaWRnZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBY3RpdmVTaGVsbCIpKSB0ZXN0X2dldEFjdGl2ZVNoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDdXJyZW50IikpIHRlc3RfZ2V0Q3VycmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q3Vyc29yQ29udHJvbCIpKSB0ZXN0X2dldEN1cnNvckNvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEN1cnNvckxvY2F0aW9uIikpIHRlc3RfZ2V0Q3Vyc29yTG9jYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEN1cnNvclNpemUiKSkgdGVzdF9nZXRDdXJzb3JTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREYXRhIikpIHRlc3RfZ2V0RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZWZhdWx0IikpIHRlc3RfZ2V0RGVmYXVsdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50IikpIHRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREb3VibGVDbGlja1RpbWUiKSkgdGVzdF9nZXREb3VibGVDbGlja1RpbWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvY3VzQ29udHJvbCIpKSB0ZXN0X2dldEZvY3VzQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SWNvbkRlcHRoIikpIHRlc3RfZ2V0SWNvbkRlcHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNb25pdG9ycyIpKSB0ZXN0X2dldE1vbml0b3JzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmltYXJ5TW9uaXRvciIpKSB0ZXN0X2dldFByaW1hcnlNb25pdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaGVsbHMiKSkgdGVzdF9nZXRTaGVsbHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN5bmNUaHJlYWQiKSkgdGVzdF9nZXRTeW5jVGhyZWFkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTeXN0ZW1Db2xvckkiKSkgdGVzdF9nZXRTeXN0ZW1Db2xvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN5c3RlbUZvbnQiKSkgdGVzdF9nZXRTeXN0ZW1Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUaHJlYWQiKSkgdGVzdF9nZXRUaHJlYWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkiKSkgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSUlJIikpIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlYWRBbmREaXNwYXRjaCIpKSB0ZXN0X3JlYWRBbmREaXNwYXRjaCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb2NhdGlvbklJIikpIHRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFN5bmNocm9uaXplckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIiKSkgdGVzdF9zZXRTeW5jaHJvbml6ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zbGVlcCIpKSB0ZXN0X3NsZWVwKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKSkgdGVzdF9zeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RpbWVyRXhlY0lMamF2YV9sYW5nX1J1bm5hYmxlIikpIHRlc3RfdGltZXJFeGVjSUxqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3VwZGF0ZSIpKSB0ZXN0X3VwZGF0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2FrZSIpKSB0ZXN0X3dha2UoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1ib29sZWFuIGRpc3Bvc2VFeGVjUmFuOwotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIHZpcnR1YWxseSBldmVyeSBtZXRob2QgYW5kIGluIHBhcnRpY3VsYXIKLQkvLyAgIHRlc3RfZGlzcG9zZUV4ZWNMamF2YV9sYW5nX1J1bm5hYmxlCi19Ci0KLS8qIE92ZXJsb2FkZWQgdGVzdHMgZnJvbSBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UgKi8KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RFBJKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJUG9pbnQgcCA9IGRpc3BsYXkuZ2V0RFBJKCk7Ci0JCWFzc2VydFRydWUoImhvcml6b250YWwgRFBJIG5vdCBncmVhdGVyIHRoYW4gemVybyIsIHAueCA+IDApOwotCQlhc3NlcnRUcnVlKCJ2ZXJ0aWNhbCBEUEkgbm90IGdyZWF0ZXIgdGhhbiB6ZXJvIiwgcC55ID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlcHRoKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJaW50IGQgPSBkaXNwbGF5LmdldERlcHRoKCk7Ci0JCWFzc2VydFRydWUoImRlcHRoIG5vdCBncmVhdGVyIHRoYW4gemVybyIsIGQgPiAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1ooKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlGb250RGF0YVtdIHNjYWxhYmxlID0gZGlzcGxheS5nZXRGb250TGlzdChudWxsLCB0cnVlKTsKLQkJRm9udERhdGFbXSBub25fc2NhbGFibGUgPSBkaXNwbGF5LmdldEZvbnRMaXN0KG51bGwsIGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gZm9udHMgZGV0ZWN0ZWQiLCAoc2NhbGFibGUubGVuZ3RoICsgbm9uX3NjYWxhYmxlLmxlbmd0aCkgPiAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2FybmluZ3MoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LmdldFdhcm5pbmdzKCk7Ci0JCS8vIFNpbmNlIHRoZSBiZWhhdmlvciBpcyBwbGF0Zm9ybSBzcGVjaWZpYywgdGhlcmUncwotCQkvLyBubyBnb29kIHRlc3QgZm9yIHRoZSByZXN1bHQgdmFsdWUuCi0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JRGlzcGxheSBkaXNwID0gbmV3IERpc3BsYXkoKTsKLQlhc3NlcnRGYWxzZShkaXNwLmlzRGlzcG9zZWQoKSk7Ci0JZGlzcC5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZShkaXNwLmlzRGlzcG9zZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V2FybmluZ3NaKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5zZXRXYXJuaW5ncyh0cnVlKTsKLQkJZGlzcGxheS5zZXRXYXJuaW5ncyhmYWxzZSk7Ci0JCS8vIFNpbmNlIHRoZSBiZWhhdmlvciBpcyBwbGF0Zm9ybSBzcGVjaWZpYywgdGhlcmUncwotCQkvLyBubyBnb29kIHRlc3QgZm9yIGludm9raW5nIHRoaXMgbWV0aG9kLgotCQkvLyBOb3RlIHRoYXQgb24gV2luZG93cywgdGhlIGltcGxlbWVudGF0aW9uIGlzIGEgbm8tb3AuCi0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJkZDA2NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmY4NTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRXhwYW5kRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5FeHBhbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FeHBhbmRCYXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV4cGFuZEJhcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRCYXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZXhwYW5kQmFyID0gbmV3IEV4cGFuZEJhcihzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGV4cGFuZEJhcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRXhwYW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19FeHBhbmRMaXN0ZW5lcigpIHsKLQlmaW5hbCBib29sZWFuW10gbGlzdGVuZXJDYWxsZWQgPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07Ci0JRXhwYW5kTGlzdGVuZXIgZXhwYW5kTGlzdGVuZXIgPSBuZXcgRXhwYW5kTGlzdGVuZXIoKSB7CQkKLQkJcHVibGljIHZvaWQgaXRlbUNvbGxhcHNlZChFeHBhbmRFdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZFswXSA9IHRydWU7CQkJCi0JCX0KLQkJcHVibGljIHZvaWQgaXRlbUV4cGFuZGVkKEV4cGFuZEV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkWzBdID0gdHJ1ZTsJCQkKLQkJfQotCX07Ci0KLQl0cnkgewotCQlleHBhbmRCYXIuYWRkRXhwYW5kTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEV4cGFuZExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWV4cGFuZEJhci5hZGRFeHBhbmRMaXN0ZW5lcihleHBhbmRMaXN0ZW5lcik7Ci0JZXhwYW5kQmFyLm5vdGlmeUxpc3RlbmVycyhTV1QuRXhwYW5kLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWRbMF0pOwotCi0JbGlzdGVuZXJDYWxsZWRbMF0gPSBmYWxzZTsKLQlleHBhbmRCYXIubm90aWZ5TGlzdGVuZXJzKFNXVC5Db2xsYXBzZSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoIjpiOiIsIGxpc3RlbmVyQ2FsbGVkWzBdKTsKLQkKLQl0cnkgewotCQlleHBhbmRCYXIucmVtb3ZlRXhwYW5kTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUV4cGFuZExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3RlbmVyQ2FsbGVkWzBdID0gZmFsc2U7Ci0JZXhwYW5kQmFyLnJlbW92ZUV4cGFuZExpc3RlbmVyKGV4cGFuZExpc3RlbmVyKTsKLQlleHBhbmRCYXIubm90aWZ5TGlzdGVuZXJzKFNXVC5FeHBhbmQsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRGYWxzZShsaXN0ZW5lckNhbGxlZFswXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQluZXcgRXhwYW5kQmFyKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCBleHBhbmRCYXIuZ2V0SXRlbUNvdW50KCkgPT0gaSk7Ci0JICAJbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCAwKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JRXhwYW5kSXRlbVtdIGl0ZW1zID0gbmV3IEV4cGFuZEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZXhwYW5kQmFyLmdldEl0ZW0oaSk9PWl0ZW1zW2ldKTsKLQl9Ci0KLQlleHBhbmRCYXIgPSBuZXcgRXhwYW5kQmFyKHNoZWxsLCAwKTsKLQludW1iZXIgPSA1OwotCWl0ZW1zID0gbmV3IEV4cGFuZEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCAwKTsKLQl9Ci0JdHJ5IHsKLQkJZXhwYW5kQmFyLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JRXhwYW5kSXRlbVtdIGl0ZW1zID0gbmV3IEV4cGFuZEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspIHsKLQkgIAlpdGVtc1tpXSA9IG5ldyBFeHBhbmRJdGVtKGV4cGFuZEJhciwgMCk7Ci0JfQotCWFzc2VydEVxdWFscyhpdGVtcywgZXhwYW5kQmFyLmdldEl0ZW1zKCkpOwotCQotCWV4cGFuZEJhci5nZXRJdGVtcygpWzBdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IEV4cGFuZEl0ZW1bXSB7aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCBleHBhbmRCYXIuZ2V0SXRlbXMoKSk7Ci0KLQlleHBhbmRCYXIuZ2V0SXRlbXMoKVszXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBFeHBhbmRJdGVtW10ge2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM119LCBleHBhbmRCYXIuZ2V0SXRlbXMoKSk7Ci0KLQlleHBhbmRCYXIuZ2V0SXRlbXMoKVsxXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBFeHBhbmRJdGVtW10ge2l0ZW1zWzFdLCBpdGVtc1szXX0sIGV4cGFuZEJhci5nZXRJdGVtcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTcGFjaW5nKCkgewotLy90ZXN0ZWQgaW4gdGVzdF9zZXRTcGFjaW5nSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JRXhwYW5kSXRlbVtdIGl0ZW1zID0gbmV3IEV4cGFuZEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JICAJaXRlbXNbaV0gPSBuZXcgRXhwYW5kSXRlbShleHBhbmRCYXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCBleHBhbmRCYXIuaW5kZXhPZihpdGVtc1tpXSApID09IGkpOwotCX0KLQkKLQlpdGVtcyA9IG5ldyBFeHBhbmRJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCSAgCWl0ZW1zW2ldID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQl0cnkgewotCQkJZXhwYW5kQmFyLmluZGV4T2YobnVsbCk7CQkKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGV4cGFuZEl0ZW0gPT0gbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUV4cGFuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRXhwYW5kTGlzdGVuZXIoKSB7Ci0vL3Rlc3RlZCBpbiB0ZXN0X2FkZEV4cGFuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRXhwYW5kTGlzdGVuZXIgCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3BhY2luZ0koKSB7Ci0JZXhwYW5kQmFyLnNldFNwYWNpbmcoMCk7Ci0JYXNzZXJ0RXF1YWxzKGV4cGFuZEJhci5nZXRTcGFjaW5nKCksIDApOwotCQotCWV4cGFuZEJhci5zZXRTcGFjaW5nKDMpOwotCWFzc2VydEVxdWFscyhleHBhbmRCYXIuZ2V0U3BhY2luZygpLCAzKTsKLQkKLQlleHBhbmRCYXIuc2V0U3BhY2luZygtNCk7Ci0JYXNzZXJ0RXF1YWxzKGV4cGFuZEJhci5nZXRTcGFjaW5nKCksIDMpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEV4cGFuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRXhwYW5kTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3BhY2luZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U3BhY2luZ0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRXhwYW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19FeHBhbmRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRXhwYW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19FeHBhbmRMaXN0ZW5lciIpKSB0ZXN0X2FkZEV4cGFuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRXhwYW5kTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNwYWNpbmciKSkgdGVzdF9nZXRTcGFjaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTcGFjaW5nSSIpKSB0ZXN0X3NldFNwYWNpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV4cGFuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRXhwYW5kTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVFeHBhbmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0V4cGFuZExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZUV4cGFuZEJhcihWZWN0b3IgZXZlbnRzKSB7Ci0JZXhwYW5kQmFyID0gbmV3IEV4cGFuZEJhcihzaGVsbCwgU1dULlZfU0NST0xMKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlFeHBhbmRJdGVtIGl0ZW0gPSBuZXcgRXhwYW5kSXRlbShleHBhbmRCYXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJFeHBhbmRCYXIiICsgaSk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLQlzZXRXaWRnZXQoZXhwYW5kQmFyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUV4cGFuZEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVFeHBhbmRCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEzLCAxMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVFeHBhbmRCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVFeHBhbmRCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCAxNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlRXhwYW5kQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMjAsIDUwLCAyMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIEV4cGFuZEJhciBleHBhbmRCYXI7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwYjkyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZXhwYW5kQmFyID0gbmV3IEV4cGFuZEJhcihzaGVsbCwgMCk7Ci0JZXhwYW5kSXRlbSA9IG5ldyBFeHBhbmRJdGVtKGV4cGFuZEJhciwgMCk7IAotCXNldFdpZGdldChleHBhbmRJdGVtKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtSSgpIHsKLQl0cnkgewotCQluZXcgRXhwYW5kSXRlbShudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtSUkoKSB7Ci0JRXhwYW5kSXRlbSBpdGVtID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCBTV1QuTlVMTCwgMCk7IC8vY3JlYXRlIGFuIGV4cGFuZCBpdGVtIGF0IGluZGV4IDAKLQlhc3NlcnROb3ROdWxsKGl0ZW0pOwotCWFzc2VydFRydWUoZXhwYW5kQmFyLmdldEl0ZW0oMCkuZXF1YWxzKGl0ZW0pKTsKLQlpdGVtID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCBTV1QuTlVMTCwgMSk7Ci0JYXNzZXJ0Tm90TnVsbChpdGVtKTsKLQlhc3NlcnRUcnVlKGV4cGFuZEJhci5nZXRJdGVtKDEpLmVxdWFscyhpdGVtKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQlhc3NlcnROdWxsKGV4cGFuZEl0ZW0uZ2V0Q29udHJvbCgpKTsKLQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGV4cGFuZEJhciwgU1dULlBVU0gpOwotCWV4cGFuZEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCUNvbnRyb2wgY29udHJvbCA9IGV4cGFuZEl0ZW0uZ2V0Q29udHJvbCgpOwotCWFzc2VydEVxdWFscyhidXR0b24sIGNvbnRyb2wpOwotCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihleHBhbmRCYXIsIFNXVC5QVVNIKTsKLQlleHBhbmRJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQljb250cm9sID0gZXhwYW5kSXRlbS5nZXRDb250cm9sKCk7Ci0JYXNzZXJ0RXF1YWxzKGJ1dHRvbiwgY29udHJvbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RXhwYW5kZWQoKSB7Ci0vL3Rlc3RlZCBpbiB0ZXN0X3NldEV4cGFuZGVkWigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVhZGVySGVpZ2h0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRIZWFkZXJIZWlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWlnaHQoKSB7Ci0vL3Rlc3RlZCBpbiB0ZXN0X3NldEhlaWdodEkoKQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7CQotCWFzc2VydEVxdWFscyhleHBhbmRJdGVtLmdldFBhcmVudCgpLCBleHBhbmRCYXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQlleHBhbmRJdGVtLnNldENvbnRyb2wobnVsbCk7CQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGV4cGFuZEJhciwgU1dULlBVU0gpOwotCWV4cGFuZEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCWJ1dHRvbiA9IG5ldyBCdXR0b24oZXhwYW5kQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlleHBhbmRJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gY29udHJvbC5pc0Rpc3Bvc2VkKCkiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQl0cnkgewotCQlleHBhbmRJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biB3aGVuIGNvbnRyb2wgaGFzIHdyb25nIHBhcmVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RXhwYW5kZWRaKCkgewotCWV4cGFuZEl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShleHBhbmRJdGVtLmdldEV4cGFuZGVkKCkpOwotCWV4cGFuZEl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhleHBhbmRJdGVtLmdldEV4cGFuZGVkKCksIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIZWlnaHRJKCkgewotCWV4cGFuZEl0ZW0uc2V0SGVpZ2h0KDMwKTsKLQlhc3NlcnRFcXVhbHMoZXhwYW5kSXRlbS5nZXRIZWlnaHQoKSwgMzApOwotCWV4cGFuZEl0ZW0uc2V0SGVpZ2h0KC04KTsKLQlhc3NlcnRFcXVhbHMoZXhwYW5kSXRlbS5nZXRIZWlnaHQoKSwgMzApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKGV4cGFuZEl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JZXhwYW5kSXRlbS5zZXRJbWFnZShpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIGV4cGFuZEl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JYXNzZXJ0VHJ1ZShleHBhbmRJdGVtLmdldEltYWdlKCkgIT0gaW1hZ2VzWzFdKTsKLQlleHBhbmRJdGVtLnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwoZXhwYW5kSXRlbS5nZXRJbWFnZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JZXhwYW5kSXRlbS5zZXRUZXh0KCJBQkNERUZHIik7Ci0JYXNzZXJ0VHJ1ZShleHBhbmRJdGVtLmdldFRleHQoKS5lcXVhbHMoIkFCQ0RFRkciKSk7Ci0JdHJ5IHsKLQkJZXhwYW5kSXRlbS5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRBcm1MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlleHBhbmRJdGVtLnNldFRleHQoIkFCQ0RFRkciKTsKLQlhc3NlcnRUcnVlKGV4cGFuZEl0ZW0uZ2V0VGV4dCgpLnN0YXJ0c1dpdGgoIkFCQ0RFRkciKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFeHBhbmRlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVhZGVySGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFeHBhbmRlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhlaWdodEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhckkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kQmFySUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFeHBhbmRlZCIpKSB0ZXN0X2dldEV4cGFuZGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWFkZXJIZWlnaHQiKSkgdGVzdF9nZXRIZWFkZXJIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlaWdodCIpKSB0ZXN0X2dldEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEV4cGFuZGVkWiIpKSB0ZXN0X3NldEV4cGFuZGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SGVpZ2h0SSIpKSB0ZXN0X3NldEhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0Jc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUV4cGFuZEJhciBleHBhbmRCYXI7Ci1FeHBhbmRJdGVtIGV4cGFuZEl0ZW07Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWE0ZDE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2cKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0RGlhbG9nKGZpbGVEaWFsb2cpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCkgewotCS8vIFRlc3QgRmlsZURpYWxvZyhTaGVsbCkKLQluZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JdHJ5IHsKLQkJbmV3IEZpbGVEaWFsb2cobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0JLy8gVGVzdCBGaWxlRGlhbG9nKFNoZWxsLCBpbnQpCi0JRmlsZURpYWxvZyBmZDsKLQlmZCA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0JaW50IHN0eWxlID0gZmQuZ2V0U3R5bGUoKTsKLQlzdHlsZSAmPSB+U1dULkxFRlRfVE9fUklHSFQ7Ci0Jc3R5bGUgJj0gflNXVC5SSUdIVF9UT19MRUZUOwotCWFzc2VydFRydWUoc3R5bGU9PVNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCi0JZmQgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQlzdHlsZSA9IGZkLmdldFN0eWxlKCk7Ci0Jc3R5bGUgJj0gflNXVC5MRUZUX1RPX1JJR0hUOwotCXN0eWxlICY9IH5TV1QuUklHSFRfVE9fTEVGVDsKLQlhc3NlcnRUcnVlKHN0eWxlPT1TV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQotCWZkID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5QUklNQVJZX01PREFMKTsKLQlzdHlsZSA9IGZkLmdldFN0eWxlKCk7Ci0Jc3R5bGUgJj0gflNXVC5MRUZUX1RPX1JJR0hUOwotCXN0eWxlICY9IH5TV1QuUklHSFRfVE9fTEVGVDsKLQlhc3NlcnRUcnVlKHN0eWxlPT1TV1QuUFJJTUFSWV9NT0RBTCk7Ci0JCi0JZmQgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULlNZU1RFTV9NT0RBTCk7Ci0Jc3R5bGUgPSBmZC5nZXRTdHlsZSgpOwotCXN0eWxlICY9IH5TV1QuTEVGVF9UT19SSUdIVDsKLQlzdHlsZSAmPSB+U1dULlJJR0hUX1RPX0xFRlQ7Ci0JYXNzZXJ0VHJ1ZShzdHlsZT09U1dULlNZU1RFTV9NT0RBTCk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGaWxlTmFtZSgpIHsKLQkvLwl0ZXN0ZWQgaW4gdGVzdF9zZXRGaWxlTmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGaWxlTmFtZXMoKSB7Ci0JU3RyaW5nW10gbmFtZXMgPSBmaWxlRGlhbG9nLmdldEZpbGVOYW1lcygpOwotCWFzc2VydFRydWUobmFtZXMubGVuZ3RoPT0wKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGaWx0ZXJFeHRlbnNpb25zKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZpbHRlckV4dGVuc2lvbnMkTGphdmFfbGFuZ19TdHJpbmcoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbHRlck5hbWVzKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZpbHRlck5hbWVzJExqYXZhX2xhbmdfU3RyaW5nKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGaWx0ZXJQYXRoKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB7Ci0JaWYgKGZUZXN0RGlhbG9nT3BlbikKLQkJZmlsZURpYWxvZy5vcGVuKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RmlsZU5hbWVMamF2YV9sYW5nX1N0cmluZygpIHsKLQlmaWxlRGlhbG9nLnNldEZpbGVOYW1lKCIiKTsKLQlTdHJpbmcgbmFtZSA9IGZpbGVEaWFsb2cuZ2V0RmlsZU5hbWUoKTsKLQlhc3NlcnRUcnVlKG5hbWUuZXF1YWxzKCIiKSk7Ci0JZmlsZURpYWxvZy5zZXRGaWxlTmFtZShudWxsKTsKLQluYW1lID0gZmlsZURpYWxvZy5nZXRGaWxlTmFtZSgpOwotCWFzc2VydFRydWUobmFtZT09bnVsbCk7Ci0JZmlsZURpYWxvZy5zZXRGaWxlTmFtZSgic29tZWZpbGUudGVzdCIpOwotCW5hbWUgPSBmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCk7Ci0JYXNzZXJ0VHJ1ZShuYW1lLmVxdWFscygic29tZWZpbGUudGVzdCIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGaWx0ZXJFeHRlbnNpb25zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyJ0eHQiLCJqYXZhIn0pOwotCVN0cmluZyBmaWx0ZXJzW10gPSBmaWxlRGlhbG9nLmdldEZpbHRlckV4dGVuc2lvbnMoKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoZmlsdGVyc1swXS5lcXVhbHMoInR4dCIpKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnNbMV0uZXF1YWxzKCJqYXZhIikpOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIifSk7Ci0JZmlsdGVycyA9IGZpbGVEaWFsb2cuZ2V0RmlsdGVyRXh0ZW5zaW9ucygpOwotCWFzc2VydFRydWUoZmlsdGVycy5sZW5ndGggPT0gMSk7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG51bGwpOwotCWZpbHRlcnMgPSBmaWxlRGlhbG9nLmdldEZpbHRlckV4dGVuc2lvbnMoKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnM9PW51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZpbHRlck5hbWVzJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWZpbGVEaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHsiYS50eHQiLCJiLmphdmEifSk7Ci0JU3RyaW5nIGZpbHRlcnNbXSA9IGZpbGVEaWFsb2cuZ2V0RmlsdGVyTmFtZXMoKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoZmlsdGVyc1swXS5lcXVhbHMoImEudHh0IikpOwotCWFzc2VydFRydWUoZmlsdGVyc1sxXS5lcXVhbHMoImIuamF2YSIpKTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7IiJ9KTsKLQlmaWx0ZXJzID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJOYW1lcygpOwotCWFzc2VydFRydWUoZmlsdGVycy5sZW5ndGggPT0gMSk7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJOYW1lcyhudWxsKTsKLQlmaWx0ZXJzID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJOYW1lcygpOwotCWFzc2VydFRydWUoZmlsdGVycz09bnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydFRydWUoIjoxOiIsIGZpbGVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpID09ICIiKTsKLQlTdHJpbmcgdGVzdFN0ciA9ICIuLyoiOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyUGF0aCh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBmaWxlRGlhbG9nLmdldEZpbHRlclBhdGgoKS5lcXVhbHModGVzdFN0cikpOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyUGF0aCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgZmlsZURpYWxvZy5nZXRGaWx0ZXJQYXRoKCkuZXF1YWxzKCIiKSk7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKG51bGwpOwotCWFzc2VydFRydWUoIjo0OiIsIGZpbGVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpID09IG51bGwpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZpbGVEaWFsb2coKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsZU5hbWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZpbGVOYW1lcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsdGVyRXh0ZW5zaW9ucyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsdGVyTmFtZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZpbHRlclBhdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbGVOYW1lTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbHRlckV4dGVuc2lvbnMkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbHRlck5hbWVzJExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbGVOYW1lIikpIHRlc3RfZ2V0RmlsZU5hbWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbGVOYW1lcyIpKSB0ZXN0X2dldEZpbGVOYW1lcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsdGVyRXh0ZW5zaW9ucyIpKSB0ZXN0X2dldEZpbHRlckV4dGVuc2lvbnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbHRlck5hbWVzIikpIHRlc3RfZ2V0RmlsdGVyTmFtZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbHRlclBhdGgiKSkgdGVzdF9nZXRGaWx0ZXJQYXRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RmlsZU5hbWVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEZpbGVOYW1lTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZpbHRlckV4dGVuc2lvbnMkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRGaWx0ZXJFeHRlbnNpb25zJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWx0ZXJOYW1lcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEZpbHRlck5hbWVzJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1GaWxlRGlhbG9nIGZpbGVEaWFsb2c7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzYWI1Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Gb250RGlhbG9nCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Gb250RGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2coU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyhzaGVsbCwgU1dULk5VTEwpOwotCXNldERpYWxvZyhmb250RGlhbG9nKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQluZXcgRm9udERpYWxvZyhzaGVsbCk7Ci0JdHJ5IHsKLQkJbmV3IEZvbnREaWFsb2cobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0JdHJ5IHsKLQkJbmV3IEZvbnREaWFsb2cobnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udERhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9udERhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udExpc3QoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvbnRMaXN0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnREYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpIHsKLQlGb250RGF0YSBbXSBmb250RGF0YSA9IG5ldyBGb250RGF0YSBbMV07Ci0JZm9udERhdGEgWzBdID0gbmV3IEZvbnREYXRhICgpOwotCi0JYXNzZXJ0TnVsbChmb250RGlhbG9nLmdldEZvbnRMaXN0KCkpOwkKLQkJCi0JZm9udERpYWxvZy5zZXRGb250TGlzdChmb250RGF0YSk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnREaWFsb2cuZ2V0Rm9udExpc3QoKSwgZm9udERhdGEpOwotCi0JZm9udERpYWxvZy5zZXRGb250TGlzdChudWxsKTsKLQlhc3NlcnROdWxsKGZvbnREaWFsb2cuZ2V0Rm9udExpc3QoKSk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMaXN0JExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMaXN0JExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpIHsKLQlSR0IgcmdiID0gbmV3IFJHQigyNTUsIDAsIDApOwotCWZvbnREaWFsb2cuc2V0UkdCKHJnYik7Ci0JUkdCIHJnYjIgPSBmb250RGlhbG9nLmdldFJHQigpOwotCWFzc2VydEVxdWFscyhyZ2IsIHJnYjIpOwkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250TGlzdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250RGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMaXN0JExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250RGF0YSIpKSB0ZXN0X2dldEZvbnREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250TGlzdCIpKSB0ZXN0X2dldEZvbnRMaXN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSR0IiKSkgdGVzdF9nZXRSR0IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250RGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKSkgdGVzdF9zZXRGb250RGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMaXN0JExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKSkgdGVzdF9zZXRGb250TGlzdCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpKSB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRm9udERpYWxvZyBmb250RGlhbG9nOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiNjc5NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXAKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZ3JvdXAgPSBuZXcgR3JvdXAoc2hlbGwsIDApOwotCXNldFdpZGdldChncm91cCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlncm91cCA9IG5ldyBHcm91cChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7U1dULlNIQURPV19JTiwgU1dULlNIQURPV19PVVQsIFNXVC5TSEFET1dfRVRDSEVEX0lOLCBTV1QuU0hBRE9XX0VUQ0hFRF9PVVR9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCWdyb3VwID0gbmV3IEdyb3VwKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlVHJpbUlJSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDbGllbnRBcmVhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nW10gY2FzZXMgPSB7IiIsICJzb21lIHRleHQiLCAibGRrYXNoZG9laHVmd2VvdmNuaHNsdmhyZWdvamViY2tyZWF2Ymt1aHhiaXVmdmN5aGJpZnV5ZXd2Yml1cmV5ZC4sY21uZXNsamxpZXdqZmNodmJ3b2lmaXZiZXdvcml4dWlldXJ2Yml1dmJvaGZsa3NqZWFoZmNsaXVyZWFmZ3ljaWFiZWxpdHZ5cnd0bGljdXlydGxpdXJleWJjbGl1eXJldWNleXZibGl1cmV5YmN0In07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQlncm91cC5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiY2FzZTogIiArIFN0cmluZy52YWx1ZU9mKGkpLCBncm91cC5nZXRUZXh0KCkuZXF1YWxzKGNhc2VzW2ldKSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Hcm91cCBncm91cDsKLQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMjAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ5OWY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbG9hZEltYWdlcygpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotCWZyZWVJbWFnZXMoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJKCkgewotCS8vIGFic3RyYWN0IGNsYXNzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SUkoKSB7Ci0JLy8gYWJzdHJhY3QgY2xhc3MKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKGl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIGl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JYXNzZXJ0VHJ1ZShpdGVtLmdldEltYWdlKCkgIT0gaW1hZ2VzWzFdKTsKLQlpdGVtLnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwoaXRlbS5nZXRJbWFnZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nIHRlc3RTdHIgPSAidGVzdCBzdHJpbmciOwotCWl0ZW0uc2V0VGV4dCh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCJhIiwgaXRlbS5nZXRUZXh0KCkuZXF1YWxzKHRlc3RTdHIpKTsKLQlpdGVtLnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoImIiLCBpdGVtLmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQl0cnkgewotCQlpdGVtLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1JdGVtIGl0ZW07Ci1JbWFnZVtdIGltYWdlcyA9IG5ldyBJbWFnZSBbU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aCpTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lcy5sZW5ndGhdOwotCi1wcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKLQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JaW50IG51bUZpbGVzID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXMubGVuZ3RoOwotCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJaW50IGluZGV4ID0gaSpudW1GaWxlczsKLQkJZm9yIChpbnQgaj0wOyBqPG51bUZpbGVzOyBqKyspewotCQkJU3RyaW5nIGZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbal07Ci0JCQlJbnB1dFN0cmVhbSAgcmVzb3VyY2UgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQlpbWFnZXMgW2luZGV4K2pdID0gbmV3IEltYWdlIChzaGVsbC5nZXREaXNwbGF5KCksIHJlc291cmNlKTsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjb250aW51ZTsKLQkJCX0KLQkJfQotCX0KLX0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgd2lkZ2V0KSB7Ci0JaXRlbSA9IChJdGVtKSB3aWRnZXQ7Ci0Jc3VwZXIuc2V0V2lkZ2V0KHdpZGdldCk7Ci19Ci0KLXByaXZhdGUgdm9pZCBmcmVlSW1hZ2VzKCkgewotCWZvciAoaW50IGk9MDsgaTxpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGltYWdlc1tpXSAhPSBudWxsKQotCQkJaW1hZ2VzW2ldLmRpc3Bvc2UoKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTY2ODI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWwKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIDApOwotCXNldFdpZGdldChsYWJlbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpewotCXRyeSB7Ci0JCWxhYmVsID0gbmV3IExhYmVsKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCAwKTsKLQotCWludFtdIGNhc2VzID0ge1NXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5DRU5URVIsIFNXVC5TRVBBUkFUT1IsIFNXVC5IT1JJWk9OVEFMLCBTV1QuVkVSVElDQUwsIFNXVC5TSEFET1dfSU4sIFNXVC5TSEFET1dfT1VUfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIHN1cGVyIGNsYXNzIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFsaWdubWVudCgpewotCWludFtdIGNhc2VzID0ge1NXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5DRU5URVJ9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0gCSAgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIGNhc2VzW2ldKTsKLQkgIGFzc2VydEVxdWFscyhsYWJlbC5nZXRBbGlnbm1lbnQoKSwgY2FzZXNbaV0pOwotCX0gCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2UoKXsKLQlJbWFnZVtdIGNhc2VzID0ge251bGwsIG5ldyBJbWFnZShudWxsLCAxMDAsIDEwMCl9OwotCWZvcihpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKXsKLQkgbGFiZWwuc2V0SW1hZ2UoY2FzZXNbaV0pOwotCSBhc3NlcnRFcXVhbHMobGFiZWwuZ2V0SW1hZ2UoKSwgY2FzZXNbaV0pOwotCSBpZiAoY2FzZXNbaV0hPW51bGwpCi0JICBjYXNlc1tpXS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKXsKLQlTdHJpbmdbXSBjYXNlcyA9IHsiIiwgInNvbWUgbmFtZSIsICJzZGFzZGxranNoY2Rhc2NlY29ld2N3ZSJ9OwotCWZvcihpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKXsKLQkgbGFiZWwuc2V0VGV4dChjYXNlc1tpXSk7Ci0JIGFzc2VydEVxdWFscyhsYWJlbC5nZXRUZXh0KCksIGNhc2VzW2ldKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpewotCWludFtdIGNhc2VzID0ge1NXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5DRU5URVJ9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0gCSAgbGFiZWwuc2V0QWxpZ25tZW50KGNhc2VzW2ldKTsKLQkgIGFzc2VydEVxdWFscyhsYWJlbC5nZXRBbGlnbm1lbnQoKSwgY2FzZXNbaV0pOwotCX0gCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9jdXMoKSB7Ci0JLy8gc3VwZXIgY2xhc3MgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCS8vIHRlc3RlZCBpbiBnZXRJbWFnZSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKXsKLQl0cnkgewotCQlsYWJlbC5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsaWdubWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFsaWdubWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxpZ25tZW50SSIpKSB0ZXN0X3NldEFsaWdubWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvY3VzIikpIHRlc3Rfc2V0Rm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1MYWJlbCBsYWJlbDsKLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDUwOGU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCVNoZWxsIHNoZWxsOwotCUNvbXBvc2l0ZSBjb21wb3NpdGU7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgMCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQljb21wb3NpdGUuZGlzcG9zZSgpOwotCX0KLQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JfQotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZGQ4N2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluawotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluawotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIHsKLQotCUxpbmsgbGluazsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluayhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbGluayA9IG5ldyBMaW5rKHNoZWxsLCBTV1QuTk9ORSk7Ci0Jc2V0V2lkZ2V0KGxpbmspOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JLy8gVGVzdCBMaW5rKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkKLQlsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5OVUxMKTsKLQlsaW5rLmRpc3Bvc2UoKTsKLQlsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5OT05FKTsKLQlsaW5rLmRpc3Bvc2UoKTsKLQlsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxpbmsuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWxpbmsgPSBuZXcgTGluayhudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZFNlbGVjdGlvbkxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWxpbmsubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQlsaW5rLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWxpbmsucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWxpbmsubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRGYWxzZShsaXN0ZW5lckNhbGxlZCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JbGluay5jb21wdXRlU2l6ZSgwLCAwKTsKLQotCWxpbmsuY29tcHV0ZVNpemUoMCwgMCwgZmFsc2UpOwotCi0JbGluay5jb21wdXRlU2l6ZSgtMTAsIC0xMCk7Ci0KLQlsaW5rLmNvbXB1dGVTaXplKC0xMCwgLTEwLCBmYWxzZSk7Ci0KLQlsaW5rLmNvbXB1dGVTaXplKDEwLCAxMCk7Ci0KLQlsaW5rLmNvbXB1dGVTaXplKDEwLCAxMCwgZmFsc2UpOwotCi0JbGluay5jb21wdXRlU2l6ZSgxMDAwMCwgMTAwMDApOwotCi0JbGluay5jb21wdXRlU2l6ZSgxMDAwMCwgMTAwMDAsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCS8vIHRlc3RlZCBpbiAgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGNhc2VzID0gewotCQkJIiIsCi0JCQkiYSIsCi0JCQkiYWEiLAotCQkJImFhYWFhYWFhYWEiLAotCQkJImEmIiwKLQkJCSImIiwKLQkJCSImYSIsCi0JCQkiJmEmIiwKLQkJCSImYSIsCi0JCQkiJjxhPiIsCi0JCQkiPGE+IiwKLQkJCSImYTxhPiIsCi0JCQkiPGE+PC9hPiIsCi0JCQkiPGE+PC9hPiYiLAotCQkJIjxhPjwvYT5hJiIsCi0JCQkiPGE+PC9hPiZhIiwKLQkJCSImYTxhPmE8L2E+JmEiLAotCQkJIiZhPGE+JmE8L2E+JmEiLAotCQkJIlRleHQgPGEgaHJlZj1cInVybC5jb21cIj5MaW5rPC9hPiB0ZXh0IDxBIGNvbG9yPSMyMTIxMjE+TGluayAyPC9BPiAiLAotCQkJIlRleHQ8YSAgXHQgICB4eHg9XCJ5eXkgIFwiICAgICAgICBpZD1cImlkc1wiIGhyZWY9XCJIUkVGXCIgICAgID5MaW5rPCAvYT5FbmQiLAotCQkJIlRlJiZ4dCAmdGV4dCAmJiA8YT5MJmluazwvYT4gaCZpIDxhPmZlJiZsaXBlPC9hPiAmbCAmZW5kJiYiLAotCQkJIlRleHQgPGEgaWQ9XCIxXCI+TGluazwvYT4gc29tZXRoaW5nIDxhIGhyZWY9XCJibGEgYmxhMlwiID5MaW5rMjwvYT4gc29tZXRoaW5nZWxzZSA8YT5MaW5rMyBsYXJnZSBsYXJnZTwvYT4uIHNvbWUgdGV4dCB0byB0ZXN0IHRoaXMgd3JhcHBpbmcgdGhpbmcgPEEgaHJlZj1cImxhc3RcIj50aGlzIGlzIHN1cHBvc2UgdG8gYmUgYSB2ZXJ5IGxvbmcgbGluayB0ZXh0IHRoZSBzcHJhd3Mgb3ZlciBzZXZlcmFsIGxpbmVzIGluIHRoZSB0ZXh0IGxheW91dDwvYT4uZW5kIiwKLQkJCSJUaGUgU1dUIGNvbXBvbmVudCBpcyBkZXNpZ25lZCB0byBwcm92aWRlIDxBPmVmZmljaWVudDwvQT4sIDxBPnBvcnRhYmxlPC9BPiA8QT5hY2Nlc3MgdG8gdGhlIHVzZXItaW50ZXJmYWNlIGZhY2lsaXRpZXMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW1zPC9BPiBvbiB3aGljaCBpdCBpcyBpbXBsZW1lbnRlZC4iLAotCQkJInNvbWUgdGV4dCIsIAotCQkJImxka2FzaGRvZWh1Zndlb3ZjbmhzbHZocmVnb2plYmNrcmVhdmJrdWh4Yml1ZnZjeWhiaWZ1eWV3dmJpdXJleWQuLGNtbmVzbGpsaWV3amZjaHZid29pZml2YmV3b3JpeHVpZXVydmJpdXZib2hmbGtzamVhaGZjbGl1cmVhZmd5Y2lhYmVsaXR2eXJ3dGxpY3V5cnRsaXVyZXliY2xpdXlyZXVjZXl2YmxpdXJleWJjdCIsIAotCQkJIlxuIFxuIFxiIFx0ICIsIAotCQkJIlwwIn07Ci0JZm9yIChpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKXsKLQkJbGluay5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKGxpbmsuZ2V0VGV4dCgpICwgY2FzZXNbaV0pOwotCX0KLQl0cnkgewotCQlsaW5rLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRleHQgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTE5ODFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWxpc3QgPSBuZXcgTGlzdChzaGVsbCwgU1dULk1VTFRJKTsKLQotCXNldFdpZGdldChsaXN0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCWxpc3QgPSBuZXcgTGlzdChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOyAvL3Nob3VsZCBuZXZlciBnZXQgaGVyZQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPQotCQl7Ci0JCQkwLAotCQkJU1dULlNJTkdMRSwKLQkJCVNXVC5NVUxUSSwKLQkJCVNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCwKLQkJCVNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCwKLQkJCVNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCWxpc3QgPSBuZXcgTGlzdChzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdC5hZGQoIiIpOwotCWFzc2VydFNhbWUoIjphOiIsIG5ldyBTdHJpbmdbXSB7IiJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIFxuIHRleHQiKTsKLQlhc3NlcnRTYW1lKCI6YjoiLCBuZXcgU3RyaW5nW10geyIiLCAic29tZSBcbiB0ZXh0In0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgdGV4dCIpOwotCWFzc2VydFNhbWUoIjpjOiIsIG5ldyBTdHJpbmdbXSB7IiIsICJzb21lIFxuIHRleHQiLCAic29tZSB0ZXh0In0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIGxpc3QKLQotCXNldFNpbmdsZUxpc3QoKTsKLQotCXRyeSB7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5hZGQoIiIpOwotCWFzc2VydFNhbWUoIjphOiIsIG5ldyBTdHJpbmdbXSB7IiJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIFxuIHRleHQiKTsKLQlhc3NlcnRTYW1lKCI6YjoiLCBuZXcgU3RyaW5nW10geyIiLCAic29tZSBcbiB0ZXh0In0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgdGV4dCIpOwotCWFzc2VydFNhbWUoIjpjOiIsIG5ldyBTdHJpbmdbXSB7IiIsICJzb21lIFxuIHRleHQiLCAic29tZSB0ZXh0In0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCXRyeSB7Ci0JCWxpc3QuYWRkKCJzb21lIHRleHQiLCAyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QuYWRkKCIiLCAwKTsKLQlhc3NlcnRTYW1lKCI6YToiLCBuZXcgU3RyaW5nW10geyIifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSBcbiB0ZXh0IiwgMSk7Ci0JYXNzZXJ0U2FtZSgiOmI6IiwgbmV3IFN0cmluZ1tdIHsiIiwgInNvbWUgXG4gdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIHRleHQiLCAwKTsKLQlhc3NlcnRTYW1lKCI6YzoiLCBuZXcgU3RyaW5nW10geyJzb21lIHRleHQiLCAiIiwgInNvbWUgXG4gdGV4dCIgfSwgbGlzdC5nZXRJdGVtcygpKTsKLQkKLQl0cnkgewotCQlsaXN0LmFkZChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBzdHJpbmcgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbGlzdC5hZGQoInN0cmluZyIsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBpbmRleCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gbGlzdAotCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JdHJ5IHsKLQkJbGlzdC5hZGQoInNvbWUgdGV4dCIsIDIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JCi0JbGlzdC5hZGQoIiIsIDApOwotCWFzc2VydFNhbWUoIjphOiIsIG5ldyBTdHJpbmdbXSB7IiJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIFxuIHRleHQiLCAxKTsKLQlhc3NlcnRTYW1lKCI6YjoiLCBuZXcgU3RyaW5nW10geyIiLCAic29tZSBcbiB0ZXh0In0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgdGV4dCIsIDApOwotCWFzc2VydFNhbWUoIjpjOiIsIG5ldyBTdHJpbmdbXSB7InNvbWUgdGV4dCIsICIiLCAic29tZSBcbiB0ZXh0IiB9LCBsaXN0LmdldEl0ZW1zKCkpOwotCQotCXRyeSB7Ci0JCWxpc3QuYWRkKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHN0cmluZyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQlsaXN0LmFkZCgic3RyaW5nIiwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGluZGV4IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQl0cnkgewotCQlsaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiLCBleGNlcHRpb25UaHJvd24pOwotCQotCWxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3Quc2VsZWN0KDApOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQlsaXN0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlsaXN0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiLCBleGNlcHRpb25UaHJvd24pOwotCQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiBsaXN0Ci0KLQlzZXRTaW5nbGVMaXN0KCk7Ci0JCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlsaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiLCBleGNlcHRpb25UaHJvd24pOwotCQotCWxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3Quc2VsZWN0KDApOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQlsaXN0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlsaXN0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiLCBleGNlcHRpb25UaHJvd24pOwotCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIHN1cGVyIGNsYXNzIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0JEkoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZSgiOmE6IiwgbGlzdC5nZXRTZWxlY3Rpb24oKSwgaXRlbXMpOwotCXRyeSB7Ci0JCWxpc3QuZGVzZWxlY3QobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIGl0ZW1zKTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7Ci0JfSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbigpLCBpdGVtcyk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10geyAwIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmlzU2VsZWN0ZWQoMCksIGZhbHNlKTsKLQlhc3NlcnRUcnVlKGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10geyAyLCAwLCAwIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDMgfSk7Ci0JLyoJYXNzZXJ0KCI6ZDoiLCAhbGlzdC5pc1NlbGVjdGVkKDApKTsKLQlhc3NlcnQoIjpkZDoiLCAhbGlzdC5pc1NlbGVjdGVkKDIpKTsKLQlhc3NlcnQoIjpkZGQ6IiwgbGlzdC5pc1NlbGVjdGVkKDEpKTsKLQlhc3NlcnQoIjpkZGQ6IiwgbGlzdC5pc1NlbGVjdGVkKDEpKTsqLwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JdHJ5IHsKLQkJbGlzdC5kZXNlbGVjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10ge30pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHsgMSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10geyAwIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7IDMgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHsgMiwgMCwgMCB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEFsbCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCVN0cmluZ1tdIGVtcHR5ID0gewotCX07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFNhbWUoaXRlbXMsIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoZW1wdHksIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9LCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKGVtcHR5LCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0SSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9ICJmcmVkIiArIGk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0KLQlTdHJpbmdbXSBpdGVtczIgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zMik7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMyKTsKLQlhc3NlcnRTYW1lKGl0ZW1zMiwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JbGlzdC5kZXNlbGVjdCg1KTsKLQlhc3NlcnRTYW1lKGl0ZW1zMiwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JbGlzdC5kZXNlbGVjdCgxKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci0JbGlzdC5kZXNlbGVjdCgxKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JbGlzdC5kZXNlbGVjdCg1KTsKLQlhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9LCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0KDIpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDIpKTsKLQlsaXN0LmRlc2VsZWN0KDEpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDEpKTsKLQlsaXN0LmRlc2VsZWN0KDEpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDEpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdElJKCkgewotCWludCBudW1iZXIgPSA1OwotCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gImZyZWQiICsgaTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0KLQkvLyB0ZXN0cyBpZiBkZXNlbGVjdChpLCBqKSBpcyB0aGUgc2FtZSBhcyBmb3IgKGk9MDsgaTw9ajsgKytpKSBkZXNlbGVjdChpKTsKLQlpbnRbXVtdIGNhc2VzID0geyB7IDMsIDEgfSwgewotCQkJLTMsIC0yIH0sIHsKLQkJCS0yLCAtMSB9LCB7Ci0JCQktMSwgLTEgfSwgewotCQkJMTAsIDEgfQotCX07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgKytpKSB7Ci0JCWRlc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCBjYXNlc1tpXVswXSwgY2FzZXNbaV1bMV0sIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQgfSk7Ci0JfQotCWlmIChmQ2hlY2tTV1RQb2xpY3kpIHsKLQkJZGVzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAzLCBuZXcgaW50W10geyA0IH0pOwotCQlkZXNlbGVjdElJX2hlbHBlcihpdGVtcywgLTEsIDMwLCBuZXcgaW50W10gewotCQl9KTsKLQl9Ci0JZGVzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDEsIDMsIG5ldyBpbnRbXSB7IDAsIDQgfSk7Ci0JZGVzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDEsIDEsIG5ldyBpbnRbXSB7IDAsIDIsIDMsIDQgfSk7Ci0JLy8gZG9uZQotCi0JU3RyaW5nW10gaXRlbXMyID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zMik7Ci0JYXNzZXJ0U2FtZSgiOmE6IiwgaXRlbXMyLCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0KDAsIDApOwotCWFzc2VydFNhbWUoIjpiOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCWxpc3QuZGVzZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0U2FtZSgiOmJiYjoiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQlsaXN0LmRlc2VsZWN0KDIsIDMpOwotCWFzc2VydEVxdWFscygiOmJiOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxIH0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMyKTsKLQlsaXN0LmRlc2VsZWN0KDAsIDIpOwotCWFzc2VydEVxdWFscygiOmRkZGQ6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtczIpOwotCWxpc3QuZGVzZWxlY3QoMiwgMCk7Ci0JYXNzZXJ0U2FtZSgKLQkJIjpkZGRkZDoiLAotCQlsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCwgMSwgMiwgMyB9KTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zMik7Ci0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCQotCWxpc3Quc2VsZWN0KDApOwotCi0JbGlzdC5kZXNlbGVjdCgtMywgLTIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQotCWxpc3QuZGVzZWxlY3QoLTIsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0KC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0KDEsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCi0JbGlzdC5kZXNlbGVjdCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQotCWxpc3QuZGVzZWxlY3QoMywgMyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWxpc3QuZGVzZWxlY3QoMSwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWxpc3QuZGVzZWxlY3QoMCwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlsaXN0LmRlc2VsZWN0KDEsIDMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb2N1c0luZGV4KCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIifTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRGb2N1c0luZGV4KCkpOwotCWxpc3Quc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscygyLCBsaXN0LmdldEZvY3VzSW5kZXgoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0KLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3QucmVtb3ZlKDIpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlsaXN0LnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3QucmVtb3ZlKDIpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlsaXN0LnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1IZWlnaHQoKSB7Ci0JRm9udERhdGEgZm9udERhdGEgPSBsaXN0LmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCWludCBsaW5lSGVpZ2h0OwotCUZvbnQgZm9udDsKLQkKLQlmb250ID0gbmV3IEZvbnQobGlzdC5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgOCwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JbGlzdC5zZXRGb250KGZvbnQpOwotCWxpbmVIZWlnaHQgPSBsaXN0LmdldEl0ZW1IZWlnaHQoKTsKLQlsaXN0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZm9udCA9IG5ldyBGb250KGxpc3QuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDEyLCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQlsaXN0LnNldEZvbnQoZm9udCk7Ci0JaW50IG5ld0xpbmVIZWlnaHQgPSBsaXN0LmdldEl0ZW1IZWlnaHQoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBuZXdMaW5lSGVpZ2h0ID4gbGluZUhlaWdodCk7Ci0JbGlzdC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JdHJ5IHsKLQkJbGlzdC5nZXRJdGVtKDUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQlsaXN0LmdldEl0ZW0oLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtKDMpLCAiaXRlbTMiKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQl0cnkgewotCQlsaXN0LmdldEl0ZW0oNSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQlsaXN0LmdldEl0ZW0oLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvL2Fzc2VydCgiOmE6IiwgbGlzdC5nZXRJdGVtKDUpPT1udWxsKTsKLQlhc3NlcnRFcXVhbHMoIml0ZW0zIiwgbGlzdC5nZXRJdGVtKDMpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCVN0cmluZ1tdW10gY2FzZXMgPSB7IHsKLQkJfSwgewotCQkJIiIgfSwgewotCQkJIiIsICIiIH0sIHsKLQkJCSJ0ZXh0MSIsICJ0ZXh0MiIgfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQlsaXN0LnNldEl0ZW1zKGNhc2VzW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKCJjYXNlOiAiICsgaSwgY2FzZXNbaV0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQlTdHJpbmdbXVtdIGNhc2VzID0geyB7Ci0JCX0sIHsKLQkJCSIiIH0sIHsKLQkJCSIiLCAiIiB9LCB7Ci0JCQkidGV4dDEiLCAidGV4dDIiIH0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJLy8JCVN5c3RlbS5vdXQucHJpbnRsbigibG9vcDoiICsgaSk7Ci0JCWxpc3Quc2V0SXRlbXMoY2FzZXNbaV0pOwotCQlsaXN0LnNldFNlbGVjdGlvbihjYXNlc1tpXSk7Ci0JCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oImxpc3Q6IiArIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCQkvLwkJU3lzdGVtLm91dC5wcmludGxuKCJjYXNlOiIgKyBpICsgY2FzZXNbaV0pOwotCQlhc3NlcnRTYW1lKCJjYXNlOiAiICsgaSwgY2FzZXNbaV0sIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCWZvciAoaW50IGkgPSAxOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJbGlzdC5zZXRJdGVtcyhjYXNlc1tpXSk7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKDApOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiY2FzZTogIiArIFN0cmluZy52YWx1ZU9mKGkpLAotCQkJbGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgY2FzZXNbaV1bMF0gfSk7Ci0JfQotCi0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlpbnRbXSBzZWwgPSB7IDAsIDIgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLmxlbmd0aCwgMik7Ci0JU3RyaW5nW10gc2VsSXRlbXMgPSBuZXcgU3RyaW5nW10ge2l0ZW1zWzBdLCBpdGVtc1syXX07Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbigpLCBzZWxJdGVtcyk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbigwLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKS5sZW5ndGgsIDIpOwotCXNlbEl0ZW1zID0gbmV3IFN0cmluZ1tdIHtpdGVtc1swXSwgaXRlbXNbMV19OwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb24oKSwgc2VsSXRlbXMpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDEsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLmxlbmd0aCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKClbMF0sIGl0ZW1zWzFdKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKDEsIDApOwotCVN0cmluZ1tdIGVtcHR5ID0gewotCX07Ci0JYXNzZXJ0RXF1YWxzKGVtcHR5LCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQotCVN0cmluZ1tdIGJvZ3VzX2l0ZW1zID0geyAiYm9ndXNfdGV4dDEiLCAiYm9ndXNfdGV4dDIiLCAiYm9ndXNfdGV4dDMiIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oYm9ndXNfaXRlbXMpOwotCWFzc2VydEVxdWFscyhlbXB0eSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gbGlzdHMgCi0KLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlzZWwgPSBuZXcgaW50W10geyAwIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXRTZWxlY3Rpb24oKS5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhpdGVtc1swXSwgbGlzdC5nZXRTZWxlY3Rpb24oKVswXSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbigxLCAxKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXRTZWxlY3Rpb24oKS5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhpdGVtc1sxXSwgbGlzdC5nZXRTZWxlY3Rpb24oKVswXSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGl0ZW1zIGNvbnRhaW5lZCBpbiB0aGUgcmVjZWl2ZXIuCi0gKgotICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGl0ZW1zCi0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0gKiAgICA8bGk+RVJST1JfQ0FOTk9UX0dFVF9DT1VOVCAtIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMgYmVjYXVzZSBvZiBhbiBvcGVyYXRpbmcgc3lzdGVtIGZhaWx1cmU8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKFN0cmluZ1tdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpLCAwKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MiIgfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCS8vIG5vdCBwcm9wZXJseSBzcGVjJ2QgZm9yIG11bHRpLXNlbGVjdCBsaXN0cwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoLTEsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAidGV4dDEiIH0pOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgInRleHQyIiB9KTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MyIgfSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkluZGljZXMoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWludFtdIHNlbCA9IHsgMCwgMSwgMiB9OwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAwIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMSB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDIgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAzIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7fSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgLTEsIDAsIDEsIDIsIDMgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsgMCwgMSwgMiB9LCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7IDEsIDIgfSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAwIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMSB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDIgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAzIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7fSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcEluZGV4KCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRUb3BJbmRleCgpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFRvcEluZGV4KCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5pbmRleE9mKCJ0ZXh0MyIpLCAyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5pbmRleE9mKCJ0ZXh0NCIpLCAtMSk7Ci0KLQl0cnkgewotCQlsaXN0LmluZGV4T2YobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JU3RyaW5nW10gaXRlbXMyID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDIiIH07IC8vdHdvIGlkZW50aWNhbAotCi0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCWFzc2VydEVxdWFscyhsaXN0LmluZGV4T2YoInRleHQyIiksIDEpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCBsaXN0LmluZGV4T2YoInRleHQzIiwgNCkpOwotCi0JCi0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuaW5kZXhPZigidGV4dDMiKSk7Ci0KLQkKLQlhc3NlcnRFcXVhbHMoLTEsIGxpc3QuaW5kZXhPZigidGV4dDQiKSk7Ci0KLQkKLQl0cnkgewotCQlsaXN0LmluZGV4T2YobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCQotCWFzc2VydEVxdWFscygxLCBsaXN0LmluZGV4T2YoInRleHQyIikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0koKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygtMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MyIsIDQpKTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5pbmRleE9mKCJ0ZXh0MyIsIDIpKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDApKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDEpKTsKLQlhc3NlcnRFcXVhbHMoLTEsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAyKSk7Ci0KLQlTdHJpbmdbXSBpdGVtczIgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MiIgfTsgLy90d28gaWRlbnRpY2FsCi0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCWFzc2VydEVxdWFscyhsaXN0LmluZGV4T2YoInRleHQyIiwgMiksIDIpOwotCi0JdHJ5IHsKLQkJIGxpc3QuaW5kZXhPZihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zMik7Ci0JLy8JYXNzZXJ0KCJsaXN0LmluZGV4T2YoXCJ0ZXh0MlwiLCAtMSk9PTEiLCBsaXN0LmluZGV4T2YoInRleHQyIiwgLTEpPT0xKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDApKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDIpKTsKLQotCXRyeSB7Ci0JCWxpc3QuaW5kZXhPZihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1NlbGVjdGVkSSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQyIiB9OyAvL3R3byBpZGVudGljYWwKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRUcnVlKGxpc3QuaXNTZWxlY3RlZCgwKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCWFzc2VydFRydWUobGlzdC5pc1NlbGVjdGVkKDIpKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgzKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkgewotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgwKSk7Ci0JCWFzc2VydFRydWUobGlzdC5pc1NlbGVjdGVkKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMikpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgzKSk7Ci0JfQotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlJEkoKSB7Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kaWNlcyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MCIsICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDEsIDAsIDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDIpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0KLQkvLyBpbmRleCA+IG51bWJlciBvZiBlbGVtZW50cyBpbiBsaXN0Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUobmV3IGludFtdIHsgNCwgMX0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBsaXN0LmdldEl0ZW1zKCksIGl0ZW1zKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDMsIDEsIC0xIH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBsaXN0LmdldEl0ZW1zKCksIGl0ZW1zKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IC0xLCAtMSB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygiOmI6IiwgbGlzdC5nZXRJdGVtcygpLCBpdGVtcyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAtMiwgLTEgfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoIjpjOiIsIGxpc3QuZ2V0SXRlbXMoKSwgaXRlbXMpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMSwgMSwgMSB9KTsKLQlhc3NlcnRFcXVhbHMoCi0JCSI6ZDoiLAotCQlsaXN0LmdldEl0ZW1zKCksIG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MCIsICJ0ZXh0MiIsICJ0ZXh0MyIgfSk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAxLCAzIH0pOwotCWFzc2VydEVxdWFscygiOmU6IiwgbGlzdC5nZXRJdGVtcygpLCBuZXcgU3RyaW5nW10geyAidGV4dDAiLCAidGV4dDIiIH0pOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JdHJ5IHsKLQkJaW50W10gaW5kaWNlcyA9IG51bGw7Ci0JCWxpc3QucmVtb3ZlKGluZGljZXMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRpY2VzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAxLCAzIH0pOwotCWFzc2VydEVxdWFscygiOmY6IiwgbGlzdC5nZXRJdGVtcygpLCBuZXcgU3RyaW5nW10geyAidGV4dDAiLCAidGV4dDIiIH0pOwotCi0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMywgMSB9KTsKLQlhc3NlcnRFcXVhbHMoIjpnOiIsIGxpc3QuZ2V0SXRlbXMoKSwgbmV3IFN0cmluZ1tdIHsgInRleHQwIiwgInRleHQyIiB9KTsKLQotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCS8vIGluZGV4ID4gbnVtYmVyIG9mIGVsZW1lbnRzIGluIGxpc3QKLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyA0LCAxfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0gCi0JYXNzZXJ0RXF1YWxzKCI6aDoiLCBsaXN0LmdldEl0ZW1zKCksIGl0ZW1zKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDMsIDEsIC0xIH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9IAotCWFzc2VydEVxdWFscygiOmg6IiwgbGlzdC5nZXRJdGVtcygpLCBpdGVtcyk7Ci0KLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAtMSwgLTEgfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygiOmk6IiwgaXRlbXMsIGxpc3QuZ2V0SXRlbXMoKSk7Ci0KLQkKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAxLCAxLCAxIH0pOwotCWFzc2VydEVxdWFscygiOmo6IiwKLQkJbmV3IFN0cmluZ1tdIHsgInRleHQwIiwgInRleHQyIiwgInRleHQzIiB9LCBsaXN0LmdldEl0ZW1zKCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiLCAidGVzdDIiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQlsaXN0LnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQlsaXN0LnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCWxpc3QucmVtb3ZlKDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtKDEpLCAidGV4dDMiKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCAzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JbGlzdC5yZW1vdmUoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDIpOwotCWxpc3QucmVtb3ZlKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtKDApLCAidGV4dDMiKTsKLQlsaXN0LnJlbW92ZSgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5yZW1vdmUoMSwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW0oMCksICJ0ZXh0MSIpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfSAKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlsaXN0LnJlbW92ZSgxKTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JYXNzZXJ0VHJ1ZShsaXN0LmdldEl0ZW0oMSkuZXF1YWxzKCJ0ZXh0MyIpKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCWxpc3QucmVtb3ZlKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAyKTsKLQlsaXN0LnJlbW92ZSgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbSgwKSwgInRleHQzIik7Ci0JbGlzdC5yZW1vdmUoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUlJKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCA0KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZSgwLCAwKTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJ0ZXh0MyIsIGxpc3QuZ2V0SXRlbSgxKSk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgtMSwgMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0YXJ0IGluZGV4IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUoMCwgMik7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZSgyLCAwKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCA0KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkKLQl0cnkgewotCQlsaXN0LnJlbW92ZSgtMSwgMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0YXJ0IGluZGV4IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkKLQlsaXN0LnJlbW92ZSgxLCAyKTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJ0ZXh0MSIsIGxpc3QuZ2V0SXRlbSgwKSk7Ci0KLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgyLCAxMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJ0ZXh0MiIsIGxpc3QuZ2V0SXRlbSgxKSk7Ci0KLQlsaXN0LnJlbW92ZSgyLCAwKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIsICJ0ZXN0MiIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKChTdHJpbmcpIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoIml0ZW1zOTg5Iik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQlsaXN0LnJlbW92ZSgidGV4dDMiKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQlsaXN0LnJlbW92ZSgidGV4dDIiKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMik7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoKFN0cmluZykgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKCJpdGVtczk4OSIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JCi0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUoInRleHQzIik7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUoInRleHQyIik7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0JEkoKSB7Ci0JdHJ5IHsKLQkJbGlzdC5zZWxlY3QoKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAwLCAyIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDIgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAxLCAzIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAxLCAzIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAxIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQlsaXN0LmFkZCgiaXRlbTQiKTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IC0xLCAwLCAxLCAyLCAzIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCi0JaW50W10gaW5kID0gbmV3IGludFszMl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbmQubGVuZ3RoOyBpKyspIGluZFtpXSA9IGk7Ci0JbGlzdC5zZWxlY3QoaW5kKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAxLCAyLCAzLCA0IH0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludFtdIHt9KTsKLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAxIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSB9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7fSk7Ci0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgLTEgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWl0ZW1zID0gbGlzdC5nZXRJdGVtcygpOwotCi0Jc2VsZWN0JElfaGVscGVyKGl0ZW1zLCAwLCAzLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCXNlbGVjdCRJX2hlbHBlcihpdGVtcywgLTEsIDMsIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0Jc2VsZWN0JElfaGVscGVyKGl0ZW1zLCAtMSwgMzAsIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQgfSk7Ci0KLQkKLQkvKi0tLSBTaW5nbGUtc2VsZWN0IC0tLSovCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCQotCXRyeSB7Ci0JCWxpc3Quc2VsZWN0KChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXXsgLTEgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMCB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAxIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSB9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDIgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAyIH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMyB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0JCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgNCB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDQgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyA1IH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgNCB9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdChuZXcgaW50W117IDAsIDEsIDIsIDMgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdeyAtMSwgMCwgMSwgMiwgMyB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlpbnRbXSBzZWxlY3Rpb24gPSBuZXcgaW50WzMyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc2VsZWN0aW9uW2ldID0gaTsKLQlsaXN0LnNlbGVjdChzZWxlY3Rpb24pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXXsgMSwgMSwgMSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXXt9KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RBbGwoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIsICJ0ZXN0MiIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkNvdW50KCksIDApOwotCWxpc3Quc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSwgNCk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQlsaXN0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0SSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0JbGlzdC5zZWxlY3QoMik7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoMik6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDIgfSk7Ci0KLQlsaXN0LnNlbGVjdCgxKTsKLQlhc3NlcnRTYW1lKCJzZWxlY3QoMSk6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIgfSk7Ci0KLQlsaXN0LnNlbGVjdCgzKTsKLQlhc3NlcnRTYW1lKAotCQkic2VsZWN0KDMpOiIsCi0JCWxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QoNSk7Ci0JYXNzZXJ0U2FtZSgKLQkJInNlbGVjdCg1KToiLAotCQlsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgwKTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCgwKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQkKLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoLTEpOwotCWFzc2VydEVxdWFscygic2VsZWN0KC0xKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgtMik7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoLTIpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KDQpOwotCWFzc2VydEVxdWFscygic2VsZWN0KDQpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0JbGlzdC5zZWxlY3QoMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAyIH0pOwotCi0JbGlzdC5zZWxlY3QoMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxIH0pOwotCi0JbGlzdC5zZWxlY3QoMyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCi0JbGlzdC5zZWxlY3QoNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KDApOwotCWFzc2VydEVxdWFscygic2VsZWN0KDApOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgtMSk7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoLTEpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KC0yKTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCgtMik6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoNCk7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoNCk6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0SUkoKSB7Ci0JbGlzdC5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJlbXB0eSBsaXN0IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdCgwLCAxKTsKLQlhc3NlcnRFcXVhbHMoImVtcHR5IGxpc3QiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KC0xLCAwKTsKLQlhc3NlcnRFcXVhbHMoImVtcHR5IGxpc3QiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWludCBudW1iZXIgPSA1OwotCi0JU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW251bWJlcl07Ci0JaW50W10gZW1wdHkgPSB7fTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gIml0ZW0iICsgaTsKLQotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMTAsIDEsIGVtcHR5KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDMsIDEsIGVtcHR5KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAtMSwgZW1wdHkpOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgNSwgNSwgZW1wdHkpOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgNCwgNSwgbmV3IGludFtdIHsgNCB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAwLCBuZXcgaW50W10geyAwIH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMiwgNCwgbmV3IGludFtdIHsgMiwgMywgNCB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDAsIDMsIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAxLCAxLCBuZXcgaW50W10geyAxIH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgLTEsIDMwLCBuZXcgaW50W10geyAwLCAxLCAyLCAzLCA0IH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgLTEsIDMsIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQlsaXN0LnNlbGVjdCgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LnNlbGVjdCgtMTAsIC05KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCi0JbGlzdC5zZWxlY3QoMTAwMCwgMjAwMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSwgMCk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoMSwgMik7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiB9KTsKLQotCWxpc3Quc2VsZWN0KDEsIDMpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0KLQlsaXN0LnNlbGVjdCgyLCAyKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QoMywgNSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMywgNCB9KTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNlbGVjdCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMoImVtcHR5IGxpc3QiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KDAsIDEpOwotCWFzc2VydEVxdWFscygiZW1wdHkgbGlzdCIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoLTEsIDApOwotCWFzc2VydEVxdWFscygiZW1wdHkgbGlzdCIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZWxlY3QoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCWxpc3Quc2VsZWN0KC0xMCwgLTkpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQlsaXN0LnNlbGVjdCgxMDAwLCAyMDAwKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQlsaXN0LnNlbGVjdCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LnNlbGVjdCgxLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEgfSk7Ci0KLQlsaXN0LnNlbGVjdCgyLCAyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDIgfSk7Ci0KLQlsaXN0LnNlbGVjdCgzLCAzKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0KLQlsaXN0LnNlbGVjdCg0LCA0KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDQgfSk7Ci0KLQlsaXN0LnNlbGVjdCg1LCA1KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDQgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoNSwgNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoMSwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoMSwgMyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoMywgNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAwLCAwLCBuZXcgaW50W117MH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMSwgMSwgbmV3IGludFtdezF9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDIsIDIsIG5ldyBpbnRbXXsyfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAzLCAzLCBuZXcgaW50W117M30pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgNCwgNCwgbmV3IGludFtdezR9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDUsIDUsIG5ldyBpbnRbXXt9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDEwLCAxLCBuZXcgaW50W117fSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAzLCAxLCBuZXcgaW50W117fSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgLTEsIG5ldyBpbnRbXXt9KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnREYXRhIGZvbnREYXRhID0gbGlzdC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlpbnQgbGluZUhlaWdodDsKLQlGb250IGZvbnQ7Ci0JCi0JZm9udCA9IG5ldyBGb250KGxpc3QuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDgsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCWxpc3Quc2V0Rm9udChmb250KTsKLQlsaW5lSGVpZ2h0ID0gbGlzdC5nZXRJdGVtSGVpZ2h0KCk7Ci0JbGlzdC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCWZvbnQgPSBuZXcgRm9udChsaXN0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCAxMiwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JbGlzdC5zZXRGb250KGZvbnQpOwotCWFzc2VydEVxdWFscyhmb250LCBsaXN0LmdldEZvbnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiaXRlbUhlaWdodD0iICsgbGlzdC5nZXRJdGVtSGVpZ2h0KCkgKyAiLCBsaW5lSGVpZ2h0PSIgKyBsaW5lSGVpZ2h0LCBsaXN0LmdldEl0ZW1IZWlnaHQoKSA+IGxpbmVIZWlnaHQpOwotCWxpc3Quc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JCi0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCWludFtdIGNhc2VzID0geyAtMTAsIDAsIDEwIH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJbGlzdC5zZXRJdGVtKGNhc2VzW2ldLCBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlsaXN0LnNldEl0ZW0oY2FzZXNbaV0sICIiKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0KLQlpbnQgY2FzZXMyW10gPSB7IDEwLCAxNSwgMCB9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMyLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlsaXN0LnNldEl0ZW0oY2FzZXMyW2ldLCAiZnJlZCIpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQl9Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldEl0ZW0oMSwgIm5ldzEiKTsKLQlhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdIHsgIml0ZW0wIiwgIm5ldzEiLCAiaXRlbTIiLCAiaXRlbTMiIH0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlsaXN0LnNldEl0ZW0oY2FzZXNbaV0sIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0KLQl9Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJbGlzdC5zZXRJdGVtKGNhc2VzW2ldLCAiIik7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlczIubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCWxpc3Quc2V0SXRlbShjYXNlczJbaV0sICJmcmVkIik7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0SXRlbSgxLCAibmV3MSIpOwotCWFzc2VydEVxdWFscyhuZXcgU3RyaW5nW10geyAiaXRlbTAiLCAibmV3MSIsICJpdGVtMiIsICJpdGVtMyIgfSwgbGlzdC5nZXRJdGVtcygpKTsKLQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQlsaXN0LnNldEl0ZW1zKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtcyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBUT0RPIEFuIFNXVEVycm9yIHNob3VsZCBuZXZlciBoYXBwZW4gYW5kIHNob3VsZCBub3QKLQkvLyBiZSBwYXJ0IG9mIHRoZSB0ZXN0IGNhc2UuICBMaXN0IHNob3VsZCB0aHJvdyBhbiAKLQkvLyBTV1RFeGNlcHRpb24uCi0vLwlTdHJpbmdbXVtdIGNhc2VzID0geyB7IG51bGwgfSwgewotLy8JCQkiZHNhZGEiLCBudWxsLCAiZHNkYXNkYXNkIiB9Ci0vLwl9OwotLy8JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotLy8JCXRyeSB7Ci0vLwkJCWxpc3Quc2V0SXRlbXMoY2FzZXNbaV0pOwotLy8JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtcyBub3QgZm91bmQiKTsKLS8vCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0vLwkJfQotLy8JfQotCi0JU3RyaW5nW11bXSBpdGVtQXJyID0geyB7Ci0JCX0sIHsKLQkJCSIiIH0sIHsKLQkJCSJzZGFzZCIgfSwgewotCQkJInNkYXNkIiwgIjMyMzQzNCIgfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQXJyLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0SXRlbXMoaXRlbUFycltpXSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtQXJyW2ldLCBsaXN0LmdldEl0ZW1zKCkpOwotCX0KLQotCXRyeSB7Ci0JCWxpc3Quc2V0SXRlbXMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1BcnIubGVuZ3RoOyBpKyspIHsKLQkJbGlzdC5zZXRJdGVtcyhpdGVtQXJyW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKCJjYXNlOiIgKyBpLCBpdGVtQXJyW2ldLCBsaXN0LmdldEl0ZW1zKCkpOwotCX0KLQotCQotCXRyeSB7Ci0JCWxpc3Quc2V0SXRlbXMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb24kSSgpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlsaXN0LmFkZCgiZnJlZCIgKyBpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbMF0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgTVVMVEk6IHNldFNlbGVjdGlvbigoaW50W10pIG51bGwpIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7Mn0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezJ9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgMik7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MywgMSwgNSwgMn0pOwotCWFzc2VydFNhbWUoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MywgMSwgNSwgMn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MSwgMiwgMywgNX0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MSwgMH0pOwotCWFzc2VydFNhbWUoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MSwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MCwgMX0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIG51bWJlcn0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgbnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXJ9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgbnVtYmVyIC0gMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MH0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDEsIDIsIDMsIDV9KTsKLQlhc3NlcnRTYW1lKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDEsIDIsIDMsIDV9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50IFtdIHswLCAxLCAyLCAzLCA1fSk7Ci0KLQlpbnRbXSBpbmRpY2VzID0gbmV3IGludCBbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWluZGljZXNbaV0gPSBpOwotCX0KLQlsaXN0LnNldFNlbGVjdGlvbihpbmRpY2VzKTsKLQlhc3NlcnRTYW1lKCJNVUxUSTogc2V0U2VsZWN0aW9uKGluZGljZXMpIiwgaW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciwgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciwgbnVtYmVyfSkiLCBuZXcgaW50WzBdLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXIgLSAxfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlciAtIDF9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgbnVtYmVyIC0gMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgbnVtYmVyLCAxfSk7Ci0JYXNzZXJ0U2FtZSgiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCBudW1iZXIsIDF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezAsIDF9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCAwLCBudW1iZXIgLSAyfSk7Ci0JYXNzZXJ0U2FtZSgiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCAwLCBudW1iZXIgLSAyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswLCBudW1iZXIgLSAyLCBudW1iZXIgLSAxfSk7Ci0JCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbMF0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCkiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MH0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMX0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMX0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMH0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIC0xfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIC0xfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIC0xfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkKLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJbGlzdC5hZGQoImZyZWQiICsgaSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFswXSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBTSU5HTEU6IHNldFNlbGVjdGlvbigoaW50W10pIG51bGwpIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7Mn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7Mn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7Mn0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAyKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlcn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MSwgMH0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MSwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAxLCAyLCAzLCA1fSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAxLCAyLCAzLCA1fSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludCBbXSB7fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgbnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlpbmRpY2VzID0gbmV3IGludCBbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWluZGljZXNbaV0gPSBpOwotCX0KLQlsaXN0LnNldFNlbGVjdGlvbihpbmRpY2VzKTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKGluZGljZXMpIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyLCBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciwgbnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyIC0gMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgbnVtYmVyLCAxfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCBudW1iZXIsIDF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIDAsIG51bWJlciAtIDJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIDAsIG51bWJlciAtIDJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbMF0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbMF0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbigoaW50W10pIG51bGwpIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MH0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MH0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMX0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIC0xfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAtMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgLTF9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlsaXN0LmFkZCgiZnJlZCAiICsgaSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpIHsKLQkJYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JfQotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKFN0cmluZ1tdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDIifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgW10geyJmcmVkIDIifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAyKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDEiLCAiZnJlZCAwIn0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbXSB7ImZyZWQgMCIsICJmcmVkIDEifSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAtMSIsICJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyAobnVtYmVyIC0gMSksICJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgLTEiLCAiZnJlZCAwIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIn0pOwotCQotCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZyBbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gImZyZWQgIiArIGk7Ci0JfQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIGl0ZW1zKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgbnVtYmVyLCAiZnJlZCAiICsgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgKG51bWJlciAtIDEpLCAiZnJlZCAiICsgKG51bWJlciAtIDEpfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDAiLCAiZnJlZCAiICsgbnVtYmVyLCAiZnJlZCAxIn0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsiZnJlZCAwIiwgImZyZWQgMSJ9KTsKLQkKLQlsaXN0LnJlbW92ZUFsbCgpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKFN0cmluZ1tdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDAiLCAiZnJlZCAwIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlsaXN0LmFkZCgiZnJlZCAiICsgaSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKFN0cmluZ1tdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDIifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ImZyZWQgMiJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDIpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIG51bWJlcn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAxIiwgImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHt9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIC0xIiwgImZyZWQgIiArIG51bWJlcn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgKG51bWJlciAtIDEpfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCi0JaXRlbXMgPSBuZXcgU3RyaW5nW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9ICJmcmVkICIgKyBpOwotCX0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIG51bWJlciwgImZyZWQgIiArIG51bWJlcn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgKG51bWJlciAtIDEpLCAiZnJlZCAiICsgKG51bWJlciAtIDEpfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMCIsICJmcmVkICIgKyBudW1iZXIsICJmcmVkIDEifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7fSk7Ci0JCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChTdHJpbmdbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDAiLCAiZnJlZCAwIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludCBudW1iZXIgPSA4OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJbGlzdC5hZGQoImZyZWQiICsgaSk7Ci0JfQotCi0JbGlzdC5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDIpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC01KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAwKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnJlbW92ZUFsbCgpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0yKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWxpc3QuYWRkKCJmcmVkIiArIGkpOwotCX0KLQotCWxpc3Quc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAyKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCBudW1iZXIgLSAxKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnJlbW92ZUFsbCgpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JSSgpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9ICJmcmVkIiArIGk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigxLCAyKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezEsIDJ9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMywgLTIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswLCAxfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTIsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDIsIG51bWJlciAtIDEpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMiwgbnVtYmVyIC0gMX0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezB9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlciArIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDApOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDIsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMSwgbnVtYmVyIC0gMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIG51bWJlciAtIDEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbigtMiwgLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigwLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigxLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigwLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezF9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDQsIDQpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHs0fSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCA0KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxLCBudW1iZXIgLSAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgbnVtYmVyIC0gMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMywgLTIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTIsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMiwgbnVtYmVyIC0gMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIgKyAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMiwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEsIG51bWJlciAtIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCBudW1iZXIgLSAxKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSwgLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BJbmRleEkoKSB7Ci0JbGlzdC5zZXRUb3BJbmRleCgzKTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRUb3BJbmRleCgzKSBpbiBlbXB0eSBsaXN0IiwgMCwgbGlzdC5nZXRUb3BJbmRleCgpKTsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJbGlzdC5zZXRUb3BJbmRleChpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0VG9wSW5kZXgoaT0iICsgaSArICIpIiwgaSwgbGlzdC5nZXRUb3BJbmRleCgpKTsKLQl9Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRUb3BJbmRleCgzKTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0VG9wSW5kZXgoMykgaW4gZW1wdHkgbGlzdCIsIDAsIGxpc3QuZ2V0VG9wSW5kZXgoKSk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0VG9wSW5kZXgoaSk7Ci0JCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRUb3BJbmRleChpPSIgKyBpICsgIikiLCBpLCBsaXN0LmdldFRvcEluZGV4KCkpOwotCX0KLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dTZWxlY3Rpb24oKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JbGlzdC5zaG93U2VsZWN0aW9uKCk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JbGlzdC5zaG93U2VsZWN0aW9uKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3QkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9jdXNJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1NlbGVjdGVkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3QkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb24kTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3QkSSIpKSB0ZXN0X2Rlc2VsZWN0JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0QWxsIikpIHRlc3RfZGVzZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0SSIpKSB0ZXN0X2Rlc2VsZWN0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJSSIpKSB0ZXN0X2Rlc2VsZWN0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvY3VzSW5kZXgiKSkgdGVzdF9nZXRGb2N1c0luZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKSkgdGVzdF9nZXRJdGVtSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGljZXMiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BJbmRleCIpKSB0ZXN0X2dldFRvcEluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1NlbGVjdGVkSSIpKSB0ZXN0X2lzU2VsZWN0ZWRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmUkSSIpKSB0ZXN0X3JlbW92ZSRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBbGwiKSkgdGVzdF9yZW1vdmVBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUkiKSkgdGVzdF9yZW1vdmVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJSSIpKSB0ZXN0X3JlbW92ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0JEkiKSkgdGVzdF9zZWxlY3QkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0QWxsIikpIHRlc3Rfc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RJIikpIHRlc3Rfc2VsZWN0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SUkiKSkgdGVzdF9zZWxlY3RJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kSSIpKSB0ZXN0X3NldFNlbGVjdGlvbiRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRTZWxlY3Rpb24kTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JSSIpKSB0ZXN0X3NldFNlbGVjdGlvbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BJbmRleEkiKSkgdGVzdF9zZXRUb3BJbmRleEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKSkgdGVzdF9zaG93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIikpIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUxpc3QgbGlzdDsKLS8qKgotICogVGVzdCBpZiAnZGVzZWxlY3QodSwgdiknIGlzIHRoZSBzYW1lIGFzICdmb3IgKGk9dTsgaTw9djsgKytpKSBkZXNlbGVjdChpKTsnCi0gKi8KLXByb3RlY3RlZCB2b2lkIGRlc2VsZWN0SUlfaGVscGVyKAotCVN0cmluZ1tdIGl0ZW1zLAotCWludCBzdGFydCwKLQlpbnQgZW5kLAotCWludFtdIGV4cGVjdGVkSW5kaWNlcykgewotCQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0KLQlsaXN0LmRlc2VsZWN0KHN0YXJ0LCBlbmQpOwotCWFzc2VydFNhbWUoCi0JCSI6KCIgKyBzdGFydCArICIsICIgKyBlbmQgKyAiKToiLAotCQlleHBlY3RlZEluZGljZXMsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlpZiAoIDAgIT0gKGxpc3QuZ2V0U3R5bGUoKSAmIFNXVC5NVUxUSSkgKSB7Ci0JCWFzc2VydFNhbWUoInNldFNlbGVjdGlvbihpdGVtcyk6IiwgaXRlbXMsIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7ICsraSkgewotCQlsaXN0LmRlc2VsZWN0KGkpOwotCX0KLQlhc3NlcnRTYW1lKAotCQkiOigiICsgc3RhcnQgKyAiLCAiICsgZW5kICsgIik6IiwKLQkJZXhwZWN0ZWRJbmRpY2VzLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci19Ci0vKioKLSAqIERpc3Bvc2Ugb2YgdGhlIG1haW4gbGlzdCBhbmQgY3JlYXRlIGEgbmV3LCBzaW5nbGUtc2VsZWN0aW9uIG9uZS4KLSAqLwotcHJvdGVjdGVkIExpc3Qgc2V0U2luZ2xlTGlzdCgpIHsKLQlsaXN0LmRpc3Bvc2UoKTsKLQlsaXN0ID0gbmV3IExpc3Qoc2hlbGwsIFNXVC5TSU5HTEUpOwotCXNldFdpZGdldChsaXN0KTsKLQlyZXR1cm4gbGlzdDsKLX0KLS8qKgotICogU2ltaWxhciB0byBkZXNlbGVjdElJX2hlbHBlciwgY2hlY2tzIGlmIHNlbGVjdCh1LCB2KSBpcyB0aGUgc2FtZSBhcwotICogZm9yIChpPXU7IGk8PXY7ICsraSkgc2VsZWN0KGkpCi0gKi8KLXByb3RlY3RlZCB2b2lkIHNlbGVjdElJX2hlbHBlcigKLQlTdHJpbmdbXSBpdGVtcywKLQlpbnQgc3RhcnQsCi0JaW50IGVuZCwKLQlpbnRbXSBleHBlY3RlZEluZGljZXMpIHsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNlbGVjdChzdGFydCwgZW5kKTsKLQlhc3NlcnRTYW1lKAotCQkiOigiICsgc3RhcnQgKyAiLCAiICsgZW5kICsgIik6IiwKLQkJZXhwZWN0ZWRJbmRpY2VzLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCJkZXNlbGVjdEFsbDoiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgLy8gPD0gb24gcHVycG9zZQotCQlsaXN0LnNlbGVjdChpKTsKLQotCWFzc2VydFNhbWUoIjooIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIpOiIsCi0JCWV4cGVjdGVkSW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotfQotLyoqCi0gKiBTaW1pbGFyIHRvIGRlc2VsZWN0SUlfaGVscGVyLCBjaGVja3MgaWYgc2VsZWN0KGludCBbXWFycikgZ2l2ZXMgdGhlIHNhbWUKLSAqIHJlc3VsdCBhcyBzZXZlcmFsIGluZGl2aWR1YWwgc2VsZWN0KGludCkgY2FsbHMuIFRoZSBpbnRbXSB1c2VkIGZvciBzZWxlY3Rpb24KLSAqIHdpbGwgYmUgZmlsbGVkIGFsbCBpbnRlZ2VycyBmcm9tIHN0YXJ0IHRvIGVuZCBpbmNsdXNpdmUsIGluIG9yZGVyLgotICovCi1wcm90ZWN0ZWQgdm9pZCBzZWxlY3QkSV9oZWxwZXIoCi0JU3RyaW5nW10gaXRlbXMsCi0JaW50IHN0YXJ0LAotCWludCBlbmQsCi0JaW50W10gZXhwZWN0ZWRJbmRpY2VzKSB7Ci0JaW50W10gc2VsZWN0aW9uID0gbmV3IGludFtlbmQgLSBzdGFydCArIDFdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgKytpKSB7Ci0JCXNlbGVjdGlvbltpXSA9IGkgKyBzdGFydDsKLQl9Ci0KLQlsaXN0LnNlbGVjdChzZWxlY3Rpb24pOwotCi0JYXNzZXJ0U2FtZSgKLQkJIjooIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIpOiIsCi0JCWV4cGVjdGVkSW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiZGVzZWxlY3RBbGw6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIC8vIDw9IG9uIHB1cnBvc2UKLQkJbGlzdC5zZWxlY3QoaSk7Ci0KLQlhc3NlcnRTYW1lKAotCQkiOigiICsgc3RhcnQgKyAiLCAiICsgZW5kICsgIik6IiwKLQkJZXhwZWN0ZWRJbmRpY2VzLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci19Ci0KLXByaXZhdGUgdm9pZCBhZGQoKSB7Ci0gICAgbGlzdC5hZGQoInRoaXMiKTsKLSAgICBsaXN0LmFkZCgiaXMiKTsKLSAgICBsaXN0LmFkZCgiU1dUIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjcsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfRE9XTiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2sgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjcsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRE9VQkxFQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjcsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyMCwgNSwgMzAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjYxNDQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjRjZTIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1lbnUgPSBuZXcgTWVudShzaGVsbCk7Ci0Jc2V0V2lkZ2V0KG1lbnUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTlVMTCk7Ci0JbmV3IE1lbnUoY29tcCk7Ci0JY29tcC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJKCkgewotCU1lbnUgbmV3TWVudTsKLQlTaGVsbCBudWxsU2hlbGwgPSBudWxsOwotCXRyeSB7Ci0JCW5ld01lbnUgPSBuZXcgTWVudShudWxsU2hlbGwsIFNXVC5OVUxMKTsKLQkJbmV3TWVudS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbmV3TWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuTlVMTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpIHsKLQluZXcgTWVudShtZW51KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpIHsKLQlNZW51IG5ld01lbnU7Ci0JTWVudUl0ZW0gbUl0ZW0gPSBudWxsOwotCXRyeSB7Ci0JCW5ld01lbnUgPSBuZXcgTWVudShtSXRlbSk7Ci0JCW5ld01lbnUuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQluZXdNZW51ID0gbmV3IE1lbnUobUl0ZW0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCUhlbHBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBIZWxwTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhlbHBSZXF1ZXN0ZWQoSGVscEV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJbWVudS5hZGRIZWxwTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEhlbHBMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQltZW51LmFkZEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudS5ub3RpZnlMaXN0ZW5lcnMoU1dULkhlbHAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQltZW51LnJlbW92ZUhlbHBMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlSGVscExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbWVudS5yZW1vdmVIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnUubm90aWZ5TGlzdGVuZXJzKFNXVC5IZWxwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCU1lbnVMaXN0ZW5lciBtZW51TGlzdGVuZXIgPSBuZXcgTWVudUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtZW51SGlkZGVuKE1lbnVFdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCi0JdHJ5IHsKLQkJbWVudS5hZGRNZW51TGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZE1lbnVMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQltZW51LmFkZE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCW1lbnUubm90aWZ5TGlzdGVuZXJzKFNXVC5TaG93LCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQltZW51Lm5vdGlmeUxpc3RlbmVycyhTV1QuSGlkZSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoIjpiOiIsIGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQltZW51LnJlbW92ZU1lbnVMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlTWVudUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbWVudS5yZW1vdmVNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLQltZW51Lm5vdGlmeUxpc3RlbmVycyhTV1QuU2hvdywgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0SXRlbSgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0RGVmYXVsdEl0ZW0gbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0RW5hYmxlZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydEVxdWFscyhtZW51LmdldEl0ZW1Db3VudCgpLCBpKTsKLQkgIAluZXcgTWVudUl0ZW0obWVudSwgMCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCU1lbnVJdGVtIG1JdGVtMCA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCk7Ci0JTWVudUl0ZW0gbUl0ZW0xID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQlhc3NlcnRFcXVhbHMobWVudS5nZXRJdGVtKDApLCBtSXRlbTApOwotCWFzc2VydEVxdWFscyhtZW51LmdldEl0ZW0oMSksIG1JdGVtMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JTWVudUl0ZW1bXSBpdGVtcyA9IG5ldyBNZW51SXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgTWVudUl0ZW0obWVudSwgMCk7Ci0JfQotCWFzc2VydEVxdWFscygiOmE6IiwgaXRlbXMsIG1lbnUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWVudS5nZXRJdGVtcygpWzBdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIG5ldyBNZW51SXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgbWVudS5nZXRJdGVtcygpKTsKLQotCW1lbnUuZ2V0SXRlbXMoKVszXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBuZXcgTWVudUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgbWVudS5nZXRJdGVtcygpKTsKLQotCW1lbnUuZ2V0SXRlbXMoKVsxXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZDoiLCBuZXcgTWVudUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbM119LCBtZW51LmdldEl0ZW1zKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHMobWVudS5nZXRQYXJlbnQoKSwgc2hlbGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudEl0ZW0oKSB7Ci0JTWVudUl0ZW0gbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNBU0NBREUpOwotCU1lbnUgbmV3TWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlhc3NlcnROdWxsKG5ld01lbnUuZ2V0UGFyZW50SXRlbSgpKTsKLQltSXRlbS5zZXRNZW51KG5ld01lbnUpOwotCWFzc2VydEVxdWFscyhuZXdNZW51LmdldFBhcmVudEl0ZW0oKSwgbUl0ZW0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudE1lbnUoKSB7Ci0JTWVudUl0ZW0gbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNBU0NBREUpOwotCU1lbnUgbmV3TWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlhc3NlcnROdWxsKG5ld01lbnUuZ2V0UGFyZW50TWVudSgpKTsKLQltSXRlbS5zZXRNZW51KG5ld01lbnUpOwotCWFzc2VydEVxdWFscyhuZXdNZW51LmdldFBhcmVudE1lbnUoKSwgbWVudSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hlbGwoKSB7Ci0JYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0U2hlbGwoKSwgc2hlbGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHNldFZpc2libGUgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JTWVudUl0ZW1bXSBtaXMgPSBuZXcgTWVudUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCW1pc1tpXSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydEVxdWFscyhtZW51LmluZGV4T2YobWlzW2ldKSwgaSk7Ci0JCWlmIChpPjEpCi0JCQlhc3NlcnRUcnVlKG1lbnUuaW5kZXhPZihtaXNbaS0xXSkgIT0gaSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0RW5hYmxlZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0JLy8gVGhpcyB0ZXN0IGNhbiBub3QgYmUgcnVuIGFzIGl0IGN1cnJlbnRseSBpcyB3cml0dGVuLiAgT24gV2luZG93cywgaWYgYSAKLQkvLyBtZW51IGhhcyBubyBtZW51IGl0ZW1zLCBpdCB3aWxsIG5vdCBiZWNvbWUgdmlzaWJsZS4KLQkvLyBJZiB3ZSBhZGQgbWVudSBpdGVtcyB0byB0aGUgbWVudSB0aGVuIGEgc2Vjb25kIHByb2JsZW0gaXMgZW5jb3VudGVyZWQgCi0JLy8gYmVjYXVzZSBtZW51LnNldFZpc2libGUoKSBlbnRlcnMgaW50byBhIG1vZGFsIGxvb3AgYW5kIGV4ZWN1dGlvbiBvZiAKLQkvLyB0aGUgSlVuaXQgdGVzdCBjYXNlIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsIHRoZSBtZW51IGlzIHNlbGVjdGVkIGFuZCBjbG9zZWQuCi0JcmV0dXJuOwotCQotLy8JbWVudS5zZXRWaXNpYmxlKHRydWUpOwotLy8JYXNzZXJ0VHJ1ZShtZW51LmlzVmlzaWJsZSgpKTsKLS8vCi0vLwkvLyBhcGkgbm90IGltcGxlbWVudGVkIHlldAotLy8JaWYgKGZDaGVja1Zpc2liaWxpdHkpIHsKLS8vCQltZW51LnNldFZpc2libGUoZmFsc2UpOwotLy8JCWFzc2VydEVxdWFscyhtZW51LmlzVmlzaWJsZSgpLCBmYWxzZSk7Ci0vLwl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRIZWxwTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTWVudUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRNZW51TGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVmYXVsdEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0JTWVudUl0ZW0gbUl0ZW0wID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQlNZW51SXRlbSBtSXRlbTEgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwpOwotCW1lbnUuc2V0RGVmYXVsdEl0ZW0obUl0ZW0wKTsKLQlhc3NlcnRFcXVhbHMobWVudS5nZXREZWZhdWx0SXRlbSgpLCBtSXRlbTApOwotCWFzc2VydFRydWUoIkFmdGVyIHNldERlZmF1bHRJdGVtKG1JdGVtMCk6IiwgbWVudS5nZXREZWZhdWx0SXRlbSgpICE9IG1JdGVtMSk7Ci0JbWVudS5zZXREZWZhdWx0SXRlbShtSXRlbTEpOwotCWFzc2VydEVxdWFscyhtZW51LmdldERlZmF1bHRJdGVtKCksIG1JdGVtMSk7Ci0JYXNzZXJ0VHJ1ZSgiQWZ0ZXIgc2V0RGVmYXVsdEl0ZW0obUl0ZW0xKToiLCBtZW51LmdldERlZmF1bHRJdGVtKCkgIT0gbUl0ZW0wKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQltZW51LnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShtZW51LmdldEVuYWJsZWQoKSk7Ci0JbWVudS5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRGYWxzZShtZW51LmdldEVuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYXRpb25JSSgpIHsKLQltZW51LnNldExvY2F0aW9uKDAsMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCW1lbnUuc2V0TG9jYXRpb24obmV3IFBvaW50KDAsMCkpOwotCXRyeSB7Ci0JCW1lbnUuc2V0TG9jYXRpb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWaXNpYmxlWigpIHsKLQkvLyBUaGlzIHRlc3QgY2FuIG5vdCBiZSBydW4gYXMgaXQgY3VycmVudGx5IGlzIHdyaXR0ZW4uICBPbiBXaW5kb3dzLCBpZiBhIAotCS8vIG1lbnUgaGFzIG5vIG1lbnUgaXRlbXMsIGl0IHdpbGwgbm90IGJlY29tZSB2aXNpYmxlLgotCS8vIElmIHdlIGFkZCBtZW51IGl0ZW1zIHRvIHRoZSBtZW51IHRoZW4gYSBzZWNvbmQgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZCAKLQkvLyBiZWNhdXNlIG1lbnUuc2V0VmlzaWJsZSgpIGVudGVycyBpbnRvIGEgbW9kYWwgbG9vcCBhbmQgZXhlY3V0aW9uIG9mIAotCS8vIHRoZSBKVW5pdCB0ZXN0IGNhc2Ugd2lsbCBub3QgY29udGludWUgdW50aWwgdGhlIG1lbnUgaXMgc2VsZWN0ZWQgYW5kIGNsb3NlZC4KLQlyZXR1cm47Ci0JCi0vLwltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0vLwlhc3NlcnRUcnVlKG1lbnUuZ2V0VmlzaWJsZSgpKTsKLS8vCS8vIEFQSSBub3QgaW1wbGVtZW50ZWQgeWV0IAotLy8JaWYgKGZDaGVja1Zpc2liaWxpdHkpIHsKLS8vCQltZW51LnNldFZpc2libGUoZmFsc2UpOwotLy8JCWFzc2VydEVxdWFscyhtZW51LmdldFZpc2libGUoKSwgZmFsc2UpOwotLy8JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRNZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTWVudUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREZWZhdWx0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIikpIHRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIiKSkgdGVzdF9hZGRNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlZmF1bHRJdGVtIikpIHRlc3RfZ2V0RGVmYXVsdEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50SXRlbSIpKSB0ZXN0X2dldFBhcmVudEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudE1lbnUiKSkgdGVzdF9nZXRQYXJlbnRNZW51KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaGVsbCIpKSB0ZXN0X2dldFNoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWaXNpYmxlIikpIHRlc3RfZ2V0VmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNWaXNpYmxlIikpIHRlc3RfaXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGVmYXVsdEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKSkgdGVzdF9zZXREZWZhdWx0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9jYXRpb25JSSIpKSB0ZXN0X3NldExvY2F0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLU1lbnUgbWVudTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjlmNDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWVudSA9IG5ldyBNZW51KHNoZWxsKTsKLQltZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCAwKTsKLQlzZXRXaWRnZXQobWVudUl0ZW0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJKCkgewotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQlhc3NlcnROb3ROdWxsKG1JdGVtKTsKLQkKLQl0cnkgewotCQluZXcgTWVudUl0ZW0obnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKLQlhc3NlcnRUcnVlKG1JdGVtLmdldFN0eWxlKCk9PVNXVC5DSEVDSyk7Ci0JbUl0ZW0uZGlzcG9zZSgpOwotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlhc3NlcnRUcnVlKG1JdGVtLmdldFN0eWxlKCk9PVNXVC5DQVNDQURFKTsKLQltSXRlbS5kaXNwb3NlKCk7Ci0JbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCWFzc2VydFRydWUobUl0ZW0uZ2V0U3R5bGUoKT09U1dULlBVU0gpOwotCW1JdGVtLmRpc3Bvc2UoKTsKLQltSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQlhc3NlcnRUcnVlKG1JdGVtLmdldFN0eWxlKCk9PVNXVC5TRVBBUkFUT1IpOwotCW1JdGVtLmRpc3Bvc2UoKTsKLQltSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUkFESU8pOwotCWFzc2VydFRydWUobUl0ZW0uZ2V0U3R5bGUoKT09U1dULlJBRElPKTsKLQltSXRlbS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUlJKCkgewotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMLCAwKTsgLy9jcmVhdGUgYSBtZW51IGl0ZW0gYXQgaW5kZXggMAotCWFzc2VydE5vdE51bGwobUl0ZW0pOwotCWFzc2VydFRydWUobWVudS5nZXRJdGVtKDApLmVxdWFscyhtSXRlbSkpOwotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMLCAxKTsKLQlhc3NlcnROb3ROdWxsKG1JdGVtKTsKLQlhc3NlcnRUcnVlKG1lbnUuZ2V0SXRlbSgxKS5lcXVhbHMobUl0ZW0pKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JQXJtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQXJtTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldEFybWVkKEFybUV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0uYWRkQXJtTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEFybUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW1lbnVJdGVtLmFkZEFybUxpc3RlbmVyKGxpc3RlbmVyKTsKLQltZW51SXRlbS5ub3RpZnlMaXN0ZW5lcnMoU1dULkFybSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUobGlzdGVuZXJDYWxsZWQpOwotCQotCXRyeSB7Ci0JCW1lbnVJdGVtLnJlbW92ZUFybUxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVBcm1MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCW1lbnVJdGVtLnJlbW92ZUFybUxpc3RlbmVyKGxpc3RlbmVyKTsKLQltZW51SXRlbS5ub3RpZnlMaXN0ZW5lcnMoU1dULkFybSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlIZWxwTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSGVscExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoZWxwUmVxdWVzdGVkKEhlbHBFdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCW1lbnVJdGVtLmFkZEhlbHBMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkSGVscExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW1lbnVJdGVtLmFkZEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudUl0ZW0ubm90aWZ5TGlzdGVuZXJzKFNXVC5IZWxwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0ucmVtb3ZlSGVscExpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVIZWxwTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQltZW51SXRlbS5yZW1vdmVIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnVJdGVtLm5vdGlmeUxpc3RlbmVycyhTV1QuSGVscCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQltZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnVJdGVtLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbWVudUl0ZW0ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnVJdGVtLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFjY2VsZXJhdG9yKCkgewotCW1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ1gnKTsKLQlhc3NlcnRFcXVhbHMobWVudUl0ZW0uZ2V0QWNjZWxlcmF0b3IoKSwgU1dULk1PRDEgKyAnWCcpOwotCW1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QyICsgJ1knKTsKLQlhc3NlcnRFcXVhbHMobWVudUl0ZW0uZ2V0QWNjZWxlcmF0b3IoKSwgU1dULk1PRDIgKyAnWScpOwotCW1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QzICsgJ1onKTsKLQlhc3NlcnRFcXVhbHMobWVudUl0ZW0uZ2V0QWNjZWxlcmF0b3IoKSwgU1dULk1PRDMgKyAnWicpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RW5hYmxlZFooKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lbnUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRQYXJlbnQoKSwgbWVudSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFNlbGVjdGlvblooKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQltZW51SXRlbS5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUobWVudUl0ZW0uaXNFbmFibGVkKCkpOwotCW1lbnVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5pc0VuYWJsZWQoKSwgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lcigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWNjZWxlcmF0b3JJKCkgewotCW1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DVFJMICsgJ1onKTsKLQlhc3NlcnRFcXVhbHMobWVudUl0ZW0uZ2V0QWNjZWxlcmF0b3IoKSwgU1dULkNUUkwgKyAnWicpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuYWJsZWRaKCkgewotCW1lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShtZW51SXRlbS5nZXRFbmFibGVkKCkpOwotCW1lbnVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRFbmFibGVkKCksIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JYXNzZXJ0TnVsbChtZW51SXRlbS5nZXRJbWFnZSgpKTsKLQltZW51SXRlbS5zZXRJbWFnZShpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIG1lbnVJdGVtLmdldEltYWdlKCkpOwotCWFzc2VydFRydWUobWVudUl0ZW0uZ2V0SW1hZ2UoKSAhPSBpbWFnZXNbMV0pOwotCW1lbnVJdGVtLnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwobWVudUl0ZW0uZ2V0SW1hZ2UoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KCkgewotCWFzc2VydE51bGwobWVudUl0ZW0uZ2V0TWVudSgpKTsKLQlNZW51SXRlbSBtSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0FTQ0FERSk7Ci0JTWVudSBuZXdNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCW1JdGVtLnNldE1lbnUobmV3TWVudSk7Ci0JYXNzZXJ0RXF1YWxzKG1JdGVtLmdldE1lbnUoKSwgbmV3TWVudSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uWigpIHsKLQotCWludFtdIGl0ZW1TdHlsZXMgPSB7U1dULkNIRUNLLCBTV1QuUkFESU99OwotCWZvciAoaW50IGk9MDsgaTxpdGVtU3R5bGVzLmxlbmd0aDsgaSsrKQotCXsKLQkJTWVudUl0ZW0gbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgaXRlbVN0eWxlc1tpXSk7Ci0JCW1JdGVtLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhtSXRlbS5nZXRTZWxlY3Rpb24oKSwgZmFsc2UpOwotCQltSXRlbS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWFzc2VydFRydWUobUl0ZW0uZ2V0U2VsZWN0aW9uKCkpOwotCQltSXRlbS5kaXNwb3NlKCk7Ci0JfSAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JbWVudUl0ZW0uc2V0VGV4dCgiQUJDREVGRyIpOwotCWFzc2VydFRydWUobWVudUl0ZW0uZ2V0VGV4dCgpLmVxdWFscygiQUJDREVGRyIpKTsKLQl0cnkgewotCQltZW51SXRlbS5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRBcm1MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQltZW51SXRlbS5zZXRUZXh0KCJBQkNERUZHIik7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnQScpOwotCWFzc2VydFRydWUobWVudUl0ZW0uZ2V0VGV4dCgpLnN0YXJ0c1dpdGgoIkFCQ0RFRkciKSk7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoMCk7Ci0JbWVudUl0ZW0uc2V0VGV4dCgiQUImQ0RFRkciKTsKLQlhc3NlcnRUcnVlKG1lbnVJdGVtLmdldFRleHQoKS5lcXVhbHMoIkFCJkNERUZHIikpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWNjZWxlcmF0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lbnUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWNjZWxlcmF0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbloiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIiKSkgdGVzdF9hZGRBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKSkgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBY2NlbGVyYXRvciIpKSB0ZXN0X2dldEFjY2VsZXJhdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWVudSIpKSB0ZXN0X2dldE1lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0VuYWJsZWQiKSkgdGVzdF9pc0VuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBY2NlbGVyYXRvckkiKSkgdGVzdF9zZXRBY2NlbGVyYXRvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51IikpIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25aIikpIHRlc3Rfc2V0U2VsZWN0aW9uWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotTWVudSBtZW51OwotTWVudUl0ZW0gbWVudUl0ZW07Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxOWJlMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3ggZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3goU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1lc3NhZ2VCb3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULk5VTEwpOwotCXNldERpYWxvZyhtZXNzYWdlQm94KTsKLX0KLQotLyoqCi0gKiBQb3NzaWJsZSBleGNlcHRpb25zOgotICogCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1NVQkNMQVNTIC0gaWYgdGhpcyBjbGFzcyBpcyBub3QgYW4gYWxsb3dlZCBzdWJjbGFzczwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCl7Ci0JbmV3IE1lc3NhZ2VCb3goc2hlbGwpOwotCXRyeSB7Ci0JCW5ldyBNZXNzYWdlQm94KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNZXNzYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLS8qKgotICogTWFrZXMgdGhlIGRpYWxvZyB2aXNpYmxlIGFuZCBicmluZ3MgaXQgdG8gdGhlIGZyb250Ci0gKiBvZiB0aGUgZGlzcGxheS4KLSAqCi0gKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGUgYnV0dG9uIHRoYXQgd2FzIHNlbGVjdGVkIHRvIGRpc21pc3MgdGhlCi0gKiAgICAgICAgIG1lc3NhZ2UgYm94IChlLmcuIFNXVC5PSywgU1dULkNBTkNFTCwgZXRjLi4uKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKXsKLQlpZiAoZlRlc3REaWFsb2dPcGVuKQotCQltZXNzYWdlQm94Lm9wZW4oKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBkaWFsb2cncyBtZXNzYWdlLCB3aGljaCBpcyBhIGRlc2NyaXB0aW9uIG9mCi0gKiB0aGUgcHVycG9zZSBmb3Igd2hpY2ggaXQgd2FzIG9wZW5lZC4gVGhpcyBtZXNzYWdlIHdpbGwgYmUKLSAqIHZpc2libGUgb24gdGhlIGRpYWxvZyB3aGlsZSBpdCBpcyBvcGVuLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpewotCWFzc2VydEVxdWFscyhtZXNzYWdlQm94LmdldE1lc3NhZ2UoKSwgIiIpOwotCVN0cmluZyB0ZXN0U3RyID0gInRlc3Qgc3RyaW5nIjsKLQltZXNzYWdlQm94LnNldE1lc3NhZ2UodGVzdFN0cik7Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2VCb3guZ2V0TWVzc2FnZSgpLCB0ZXN0U3RyKTsKLQltZXNzYWdlQm94LnNldE1lc3NhZ2UoIiIpOwotCWFzc2VydEVxdWFscyhtZXNzYWdlQm94LmdldE1lc3NhZ2UoKSwgIiIpOwotCXRyeSB7Ci0JCW1lc3NhZ2VCb3guc2V0TWVzc2FnZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3goKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZXNzYWdlIikpIHRlc3RfZ2V0TWVzc2FnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLU1lc3NhZ2VCb3ggbWVzc2FnZUJveDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2RkNDJiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1vbml0b3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1vbml0b3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTW9uaXRvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQltb25pdG9ycyA9IGRpc3BsYXkuZ2V0TW9uaXRvcnMoKTsKLQlwcmltYXJ5ID0gZGlzcGxheS5nZXRQcmltYXJ5TW9uaXRvcigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBtb25pdG9ycy5sZW5ndGg7IGkrKykgewotCQlpZiAocHJpbWFyeS5lcXVhbHMobW9uaXRvcnNbaV0pKSBicmVhazsKLQl9Ci0JaWYgKGkgPT0gbW9uaXRvcnMubGVuZ3RoKSBmYWlsKCk7Ci0JZm9yIChpID0gMDsgaSAgPCBtb25pdG9ycy5sZW5ndGg7IGkrKykgewotCQlNb25pdG9yIHRlc3QgPSBtb25pdG9yc1tpXTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBtb25pdG9ycy5sZW5ndGg7IGorKykgewotCQkJaWYgKHRlc3QuZXF1YWxzKG1vbml0b3JzW2pdKSkgewotCQkJCWlmIChpICE9IGopIGZhaWwoIk1vbml0b3JzICIraSsiIGFuZCAiK2orIiBzaG91bGQgbm90IGJlIGVxdWFsIik7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCVJlY3RhbmdsZSBib3VuZHMgPSBwcmltYXJ5LmdldEJvdW5kcygpOwotCWFzc2VydE5vdE51bGwoYm91bmRzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1vbml0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCWJvdW5kcyA9IG1vbml0b3JzW2ldLmdldEJvdW5kcygpOwotCQlhc3NlcnROb3ROdWxsKGJvdW5kcyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHByaW1hcnkuZ2V0Q2xpZW50QXJlYSgpOwotCWFzc2VydE5vdE51bGwoYm91bmRzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1vbml0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCWJvdW5kcyA9IG1vbml0b3JzW2ldLmdldENsaWVudEFyZWEoKTsKLQkJYXNzZXJ0Tm90TnVsbChib3VuZHMpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1vbml0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChwcmltYXJ5LmVxdWFscyhtb25pdG9yc1tpXSkpIHsKLQkJCWFzc2VydFRydWUocHJpbWFyeS5oYXNoQ29kZSgpID09IG1vbml0b3JzW2ldLmhhc2hDb2RlKCkpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGlzcGxheSBkaXNwbGF5ID0gbnVsbDsKLU1vbml0b3JbXSBtb25pdG9ycyA9IG51bGw7Ci1Nb25pdG9yIHByaW1hcnkgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3N2Y3NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuUHJvZ3Jlc3NCYXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlByb2dyZXNzQmFyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQocHJvZ3Jlc3NCYXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsgLy9zaG91bGQgbmV2ZXIgZ2V0IGhlcmUKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7MCwgU1dULkhPUklaT05UQUwsIFNXVC5WRVJUSUNBTH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc2hlbGwsIGNhc2VzW2ldKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNYXhpbXVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNYXhpbXVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWluaW11bSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TWluaW11bSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9jdXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvY3VzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW11bUkoKSB7Ci0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWF4aW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJcHJvZ3Jlc3NCYXIuc2V0TWF4aW11bShpbnRBcnJheVswXSk7Ci0JCXJlcG9ydCgic2V0TWF4aW11bSIsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluaW11bUkoKSB7Ci0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWluaW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJcHJvZ3Jlc3NCYXIuc2V0TWluaW11bShpbnRBcnJheVswXSk7Ci0JCXJlcG9ydCgic2V0TWluaW11bSIsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJcHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKGludEFycmF5WzBdKTsKLQkJcmVwb3J0KCJzZXRTZWxlY3Rpb24iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNYXhpbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNaW5pbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNYXhpbXVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1heGltdW0iKSkgdGVzdF9nZXRNYXhpbXVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNaW5pbXVtIikpIHRlc3RfZ2V0TWluaW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb2N1cyIpKSB0ZXN0X3NldEZvY3VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNYXhpbXVtSSIpKSB0ZXN0X3NldE1heGltdW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5pbXVtSSIpKSB0ZXN0X3NldE1pbmltdW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXI7Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgcmVwb3J0KFN0cmluZyBjYWxsLCBpbnQgc2V0LCBpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkKSB7Ci0JLy8gVW5jb21tZW50IHRoZXNlIGxpbmVzIGFuZCBjb21tZW50IG91dCBjYWxsIHRvIGNoZWNrKCkgaWYgeW91IHdhbnQgdGhlIHRlc3QgdG8gcmVwb3J0IGFsbCBlcnJvcnMgd2l0aG91dAotCS8vIHN0b3BwaW5nLgotCQotCS8vaWYgKHByb2dyZXNzQmFyLmdldE1pbmltdW0oKSAhPSBtaW5FeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBNaW5pbXVtIEV4cGVjdGVkOiAiICsgbWluRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBwcm9ncmVzc0Jhci5nZXRNaW5pbXVtKCkpOwotCS8vaWYgKHByb2dyZXNzQmFyLmdldE1heGltdW0oKSAhPSBtYXhFeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBNYXhpbXVtIEV4cGVjdGVkOiAiICsgbWF4RXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBwcm9ncmVzc0Jhci5nZXRNYXhpbXVtKCkpOwotCS8vaWYgKHByb2dyZXNzQmFyLmdldFNlbGVjdGlvbigpICE9IHNlbGVjdGlvbkV4cGVjdGVkKQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIigiICsgc2V0ICsgIik6IFNlbGVjdGlvbiBFeHBlY3RlZDogIiArIHNlbGVjdGlvbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgcHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCkpOwotCi0JY2hlY2sobWluRXhwZWN0ZWQsIG1heEV4cGVjdGVkLCBzZWxlY3Rpb25FeHBlY3RlZCk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgY2hlY2soaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCkgewotCWFzc2VydEVxdWFscyhwcm9ncmVzc0Jhci5nZXRNYXhpbXVtKCksIG1heEV4cGVjdGVkKTsKLQlhc3NlcnRFcXVhbHMocHJvZ3Jlc3NCYXIuZ2V0TWluaW11bSgpLCBtaW5FeHBlY3RlZCk7Ci0JYXNzZXJ0RXF1YWxzKHByb2dyZXNzQmFyLmdldFNlbGVjdGlvbigpLCBzZWxlY3Rpb25FeHBlY3RlZCk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWluaW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgfSwKLXstMTQsIDEwLCAxMDAsIDUwLCB9LAotey0xMywgMTAsIDEwMCwgNTAsIH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgfSwKLXstMTEsIDEwLCAxMDAsIDUwLCB9LAotey0xMCwgMTAsIDEwMCwgNTAsIH0sCi17LTksIDEwLCAxMDAsIDUwLCB9LAotey04LCAxMCwgMTAwLCA1MCwgfSwKLXstNywgMTAsIDEwMCwgNTAsIH0sCi17LTYsIDEwLCAxMDAsIDUwLCB9LAotey01LCAxMCwgMTAwLCA1MCwgfSwKLXstNCwgMTAsIDEwMCwgNTAsIH0sCi17LTMsIDEwLCAxMDAsIDUwLCB9LAotey0yLCAxMCwgMTAwLCA1MCwgfSwKLXstMSwgMTAsIDEwMCwgNTAsIH0sCi17MCwgMCwgMTAwLCA1MCwgfSwKLXsxLCAxLCAxMDAsIDUwLCB9LAotezIsIDIsIDEwMCwgNTAsIH0sCi17MywgMywgMTAwLCA1MCwgfSwKLXs0LCA0LCAxMDAsIDUwLCB9LAotezUsIDUsIDEwMCwgNTAsIH0sCi17NiwgNiwgMTAwLCA1MCwgfSwKLXs3LCA3LCAxMDAsIDUwLCB9LAotezgsIDgsIDEwMCwgNTAsIH0sCi17OSwgOSwgMTAwLCA1MCwgfSwKLXsxMCwgMTAsIDEwMCwgNTAsIH0sCi17MTEsIDExLCAxMDAsIDUwLCB9LAotezEyLCAxMiwgMTAwLCA1MCwgfSwKLXsxMywgMTMsIDEwMCwgNTAsIH0sCi17MTQsIDE0LCAxMDAsIDUwLCB9LAotezE1LCAxNSwgMTAwLCA1MCwgfSwKLXsxNiwgMTYsIDEwMCwgNTAsIH0sCi17MTcsIDE3LCAxMDAsIDUwLCB9LAotezE4LCAxOCwgMTAwLCA1MCwgfSwKLXsxOSwgMTksIDEwMCwgNTAsIH0sCi17MjAsIDIwLCAxMDAsIDUwLCB9LAotezIxLCAyMSwgMTAwLCA1MCwgfSwKLXsyMiwgMjIsIDEwMCwgNTAsIH0sCi17MjMsIDIzLCAxMDAsIDUwLCB9LAotezI0LCAyNCwgMTAwLCA1MCwgfSwKLXsyNSwgMjUsIDEwMCwgNTAsIH0sCi17MjYsIDI2LCAxMDAsIDUwLCB9LAotezI3LCAyNywgMTAwLCA1MCwgfSwKLXsyOCwgMjgsIDEwMCwgNTAsIH0sCi17MjksIDI5LCAxMDAsIDUwLCB9LAotezMwLCAzMCwgMTAwLCA1MCwgfSwKLXszMSwgMzEsIDEwMCwgNTAsIH0sCi17MzIsIDMyLCAxMDAsIDUwLCB9LAotezMzLCAzMywgMTAwLCA1MCwgfSwKLXszNCwgMzQsIDEwMCwgNTAsIH0sCi17MzUsIDM1LCAxMDAsIDUwLCB9LAotezM2LCAzNiwgMTAwLCA1MCwgfSwKLXszNywgMzcsIDEwMCwgNTAsIH0sCi17MzgsIDM4LCAxMDAsIDUwLCB9LAotezM5LCAzOSwgMTAwLCA1MCwgfSwKLXs0MCwgNDAsIDEwMCwgNTAsIH0sCi17NDEsIDQxLCAxMDAsIDUwLCB9LAotezQyLCA0MiwgMTAwLCA1MCwgfSwKLXs0MywgNDMsIDEwMCwgNTAsIH0sCi17NDQsIDQ0LCAxMDAsIDUwLCB9LAotezQ1LCA0NSwgMTAwLCA1MCwgfSwKLXs0NiwgNDYsIDEwMCwgNTAsIH0sCi17NDcsIDQ3LCAxMDAsIDUwLCB9LAotezQ4LCA0OCwgMTAwLCA1MCwgfSwKLXs0OSwgNDksIDEwMCwgNTAsIH0sCi17NTAsIDUwLCAxMDAsIDUwLCB9LAotezUxLCA1MSwgMTAwLCA1MSwgfSwKLXs1MiwgNTIsIDEwMCwgNTIsIH0sCi17NTMsIDUzLCAxMDAsIDUzLCB9LAotezU0LCA1NCwgMTAwLCA1NCwgfSwKLXs1NSwgNTUsIDEwMCwgNTUsIH0sCi17NTYsIDU2LCAxMDAsIDU2LCB9LAotezU3LCA1NywgMTAwLCA1NywgfSwKLXs1OCwgNTgsIDEwMCwgNTgsIH0sCi17NTksIDU5LCAxMDAsIDU5LCB9LAotezYwLCA2MCwgMTAwLCA2MCwgfSwKLXs2MSwgNjEsIDEwMCwgNjEsIH0sCi17NjIsIDYyLCAxMDAsIDYyLCB9LAotezYzLCA2MywgMTAwLCA2MywgfSwKLXs2NCwgNjQsIDEwMCwgNjQsIH0sCi17NjUsIDY1LCAxMDAsIDY1LCB9LAotezY2LCA2NiwgMTAwLCA2NiwgfSwKLXs2NywgNjcsIDEwMCwgNjcsIH0sCi17NjgsIDY4LCAxMDAsIDY4LCB9LAotezY5LCA2OSwgMTAwLCA2OSwgfSwKLXs3MCwgNzAsIDEwMCwgNzAsIH0sCi17NzEsIDcxLCAxMDAsIDcxLCB9LAotezcyLCA3MiwgMTAwLCA3MiwgfSwKLXs3MywgNzMsIDEwMCwgNzMsIH0sCi17NzQsIDc0LCAxMDAsIDc0LCB9LAotezc1LCA3NSwgMTAwLCA3NSwgfSwKLXs3NiwgNzYsIDEwMCwgNzYsIH0sCi17NzcsIDc3LCAxMDAsIDc3LCB9LAotezc4LCA3OCwgMTAwLCA3OCwgfSwKLXs3OSwgNzksIDEwMCwgNzksIH0sCi17ODAsIDgwLCAxMDAsIDgwLCB9LAotezgxLCA4MSwgMTAwLCA4MSwgfSwKLXs4MiwgODIsIDEwMCwgODIsIH0sCi17ODMsIDgzLCAxMDAsIDgzLCB9LAotezg0LCA4NCwgMTAwLCA4NCwgfSwKLXs4NSwgODUsIDEwMCwgODUsIH0sCi17ODYsIDg2LCAxMDAsIDg2LCB9LAotezg3LCA4NywgMTAwLCA4NywgfSwKLXs4OCwgODgsIDEwMCwgODgsIH0sCi17ODksIDg5LCAxMDAsIDg5LCB9LAotezkwLCA5MCwgMTAwLCA5MCwgfSwKLXs5MSwgOTEsIDEwMCwgOTEsIH0sCi17OTIsIDkyLCAxMDAsIDkyLCB9LAotezkzLCA5MywgMTAwLCA5MywgfSwKLXs5NCwgOTQsIDEwMCwgOTQsIH0sCi17OTUsIDk1LCAxMDAsIDk1LCB9LAotezk2LCA5NiwgMTAwLCA5NiwgfSwKLXs5NywgOTcsIDEwMCwgOTcsIH0sCi17OTgsIDk4LCAxMDAsIDk4LCB9LAotezk5LCA5OSwgMTAwLCA5OSwgfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCB9LAotezEwMSwgMTAsIDEwMCwgNTAsIH0sCi17MTAyLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDMsIDEwLCAxMDAsIDUwLCB9LAotezEwNCwgMTAsIDEwMCwgNTAsIH0sCi17MTA1LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDYsIDEwLCAxMDAsIDUwLCB9LAotezEwNywgMTAsIDEwMCwgNTAsIH0sCi17MTA4LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDksIDEwLCAxMDAsIDUwLCB9LAotezExMCwgMTAsIDEwMCwgNTAsIH0sCi17MTExLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTIsIDEwLCAxMDAsIDUwLCB9LAotezExMywgMTAsIDEwMCwgNTAsIH0sCi17MTE0LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTUsIDEwLCAxMDAsIDUwLCB9LAotezExNiwgMTAsIDEwMCwgNTAsIH0sCi17MTE3LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTgsIDEwLCAxMDAsIDUwLCB9LAotezExOSwgMTAsIDEwMCwgNTAsIH0sCi17MTIwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMjEsIDEwLCAxMDAsIDUwLCB9LAotezEyMiwgMTAsIDEwMCwgNTAsIH0sCi17MTIzLCAxMCwgMTAwLCA1MCwgfSwKLXsxMjQsIDEwLCAxMDAsIDUwLCB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNYXhpbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCB9LAotey0xNCwgMTAsIDEwMCwgNTAsIH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgfSwKLXstMTIsIDEwLCAxMDAsIDUwLCB9LAotey0xMSwgMTAsIDEwMCwgNTAsIH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgfSwKLXstOSwgMTAsIDEwMCwgNTAsIH0sCi17LTgsIDEwLCAxMDAsIDUwLCB9LAotey03LCAxMCwgMTAwLCA1MCwgfSwKLXstNiwgMTAsIDEwMCwgNTAsIH0sCi17LTUsIDEwLCAxMDAsIDUwLCB9LAotey00LCAxMCwgMTAwLCA1MCwgfSwKLXstMywgMTAsIDEwMCwgNTAsIH0sCi17LTIsIDEwLCAxMDAsIDUwLCB9LAotey0xLCAxMCwgMTAwLCA1MCwgfSwKLXswLCAxMCwgMTAwLCA1MCwgfSwKLXsxLCAxMCwgMTAwLCA1MCwgfSwKLXsyLCAxMCwgMTAwLCA1MCwgfSwKLXszLCAxMCwgMTAwLCA1MCwgfSwKLXs0LCAxMCwgMTAwLCA1MCwgfSwKLXs1LCAxMCwgMTAwLCA1MCwgfSwKLXs2LCAxMCwgMTAwLCA1MCwgfSwKLXs3LCAxMCwgMTAwLCA1MCwgfSwKLXs4LCAxMCwgMTAwLCA1MCwgfSwKLXs5LCAxMCwgMTAwLCA1MCwgfSwKLXsxMCwgMTAsIDEwMCwgNTAsIH0sCi17MTEsIDEwLCAxMSwgMTEsIH0sCi17MTIsIDEwLCAxMiwgMTIsIH0sCi17MTMsIDEwLCAxMywgMTMsIH0sCi17MTQsIDEwLCAxNCwgMTQsIH0sCi17MTUsIDEwLCAxNSwgMTUsIH0sCi17MTYsIDEwLCAxNiwgMTYsIH0sCi17MTcsIDEwLCAxNywgMTcsIH0sCi17MTgsIDEwLCAxOCwgMTgsIH0sCi17MTksIDEwLCAxOSwgMTksIH0sCi17MjAsIDEwLCAyMCwgMjAsIH0sCi17MjEsIDEwLCAyMSwgMjEsIH0sCi17MjIsIDEwLCAyMiwgMjIsIH0sCi17MjMsIDEwLCAyMywgMjMsIH0sCi17MjQsIDEwLCAyNCwgMjQsIH0sCi17MjUsIDEwLCAyNSwgMjUsIH0sCi17MjYsIDEwLCAyNiwgMjYsIH0sCi17MjcsIDEwLCAyNywgMjcsIH0sCi17MjgsIDEwLCAyOCwgMjgsIH0sCi17MjksIDEwLCAyOSwgMjksIH0sCi17MzAsIDEwLCAzMCwgMzAsIH0sCi17MzEsIDEwLCAzMSwgMzEsIH0sCi17MzIsIDEwLCAzMiwgMzIsIH0sCi17MzMsIDEwLCAzMywgMzMsIH0sCi17MzQsIDEwLCAzNCwgMzQsIH0sCi17MzUsIDEwLCAzNSwgMzUsIH0sCi17MzYsIDEwLCAzNiwgMzYsIH0sCi17MzcsIDEwLCAzNywgMzcsIH0sCi17MzgsIDEwLCAzOCwgMzgsIH0sCi17MzksIDEwLCAzOSwgMzksIH0sCi17NDAsIDEwLCA0MCwgNDAsIH0sCi17NDEsIDEwLCA0MSwgNDEsIH0sCi17NDIsIDEwLCA0MiwgNDIsIH0sCi17NDMsIDEwLCA0MywgNDMsIH0sCi17NDQsIDEwLCA0NCwgNDQsIH0sCi17NDUsIDEwLCA0NSwgNDUsIH0sCi17NDYsIDEwLCA0NiwgNDYsIH0sCi17NDcsIDEwLCA0NywgNDcsIH0sCi17NDgsIDEwLCA0OCwgNDgsIH0sCi17NDksIDEwLCA0OSwgNDksIH0sCi17NTAsIDEwLCA1MCwgNTAsIH0sCi17NTEsIDEwLCA1MSwgNTAsIH0sCi17NTIsIDEwLCA1MiwgNTAsIH0sCi17NTMsIDEwLCA1MywgNTAsIH0sCi17NTQsIDEwLCA1NCwgNTAsIH0sCi17NTUsIDEwLCA1NSwgNTAsIH0sCi17NTYsIDEwLCA1NiwgNTAsIH0sCi17NTcsIDEwLCA1NywgNTAsIH0sCi17NTgsIDEwLCA1OCwgNTAsIH0sCi17NTksIDEwLCA1OSwgNTAsIH0sCi17NjAsIDEwLCA2MCwgNTAsIH0sCi17NjEsIDEwLCA2MSwgNTAsIH0sCi17NjIsIDEwLCA2MiwgNTAsIH0sCi17NjMsIDEwLCA2MywgNTAsIH0sCi17NjQsIDEwLCA2NCwgNTAsIH0sCi17NjUsIDEwLCA2NSwgNTAsIH0sCi17NjYsIDEwLCA2NiwgNTAsIH0sCi17NjcsIDEwLCA2NywgNTAsIH0sCi17NjgsIDEwLCA2OCwgNTAsIH0sCi17NjksIDEwLCA2OSwgNTAsIH0sCi17NzAsIDEwLCA3MCwgNTAsIH0sCi17NzEsIDEwLCA3MSwgNTAsIH0sCi17NzIsIDEwLCA3MiwgNTAsIH0sCi17NzMsIDEwLCA3MywgNTAsIH0sCi17NzQsIDEwLCA3NCwgNTAsIH0sCi17NzUsIDEwLCA3NSwgNTAsIH0sCi17NzYsIDEwLCA3NiwgNTAsIH0sCi17NzcsIDEwLCA3NywgNTAsIH0sCi17NzgsIDEwLCA3OCwgNTAsIH0sCi17NzksIDEwLCA3OSwgNTAsIH0sCi17ODAsIDEwLCA4MCwgNTAsIH0sCi17ODEsIDEwLCA4MSwgNTAsIH0sCi17ODIsIDEwLCA4MiwgNTAsIH0sCi17ODMsIDEwLCA4MywgNTAsIH0sCi17ODQsIDEwLCA4NCwgNTAsIH0sCi17ODUsIDEwLCA4NSwgNTAsIH0sCi17ODYsIDEwLCA4NiwgNTAsIH0sCi17ODcsIDEwLCA4NywgNTAsIH0sCi17ODgsIDEwLCA4OCwgNTAsIH0sCi17ODksIDEwLCA4OSwgNTAsIH0sCi17OTAsIDEwLCA5MCwgNTAsIH0sCi17OTEsIDEwLCA5MSwgNTAsIH0sCi17OTIsIDEwLCA5MiwgNTAsIH0sCi17OTMsIDEwLCA5MywgNTAsIH0sCi17OTQsIDEwLCA5NCwgNTAsIH0sCi17OTUsIDEwLCA5NSwgNTAsIH0sCi17OTYsIDEwLCA5NiwgNTAsIH0sCi17OTcsIDEwLCA5NywgNTAsIH0sCi17OTgsIDEwLCA5OCwgNTAsIH0sCi17OTksIDEwLCA5OSwgNTAsIH0sCi17MTAwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDEsIDEwLCAxMDEsIDUwLCB9LAotezEwMiwgMTAsIDEwMiwgNTAsIH0sCi17MTAzLCAxMCwgMTAzLCA1MCwgfSwKLXsxMDQsIDEwLCAxMDQsIDUwLCB9LAotezEwNSwgMTAsIDEwNSwgNTAsIH0sCi17MTA2LCAxMCwgMTA2LCA1MCwgfSwKLXsxMDcsIDEwLCAxMDcsIDUwLCB9LAotezEwOCwgMTAsIDEwOCwgNTAsIH0sCi17MTA5LCAxMCwgMTA5LCA1MCwgfSwKLXsxMTAsIDEwLCAxMTAsIDUwLCB9LAotezExMSwgMTAsIDExMSwgNTAsIH0sCi17MTEyLCAxMCwgMTEyLCA1MCwgfSwKLXsxMTMsIDEwLCAxMTMsIDUwLCB9LAotezExNCwgMTAsIDExNCwgNTAsIH0sCi17MTE1LCAxMCwgMTE1LCA1MCwgfSwKLXsxMTYsIDEwLCAxMTYsIDUwLCB9LAotezExNywgMTAsIDExNywgNTAsIH0sCi17MTE4LCAxMCwgMTE4LCA1MCwgfSwKLXsxMTksIDEwLCAxMTksIDUwLCB9LAotezEyMCwgMTAsIDEyMCwgNTAsIH0sCi17MTIxLCAxMCwgMTIxLCA1MCwgfSwKLXsxMjIsIDEwLCAxMjIsIDUwLCB9LAotezEyMywgMTAsIDEyMywgNTAsIH0sCi17MTI0LCAxMCwgMTI0LCA1MCwgfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0JcHJvZ3Jlc3NCYXIuc2V0TWF4aW11bSgxMDApOwotCXByb2dyZXNzQmFyLnNldE1pbmltdW0oMTApOwotCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbig1MCk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDEwLCB9LAotey0xNCwgMTAsIDEwMCwgMTAsIH0sCi17LTEzLCAxMCwgMTAwLCAxMCwgfSwKLXstMTIsIDEwLCAxMDAsIDEwLCB9LAotey0xMSwgMTAsIDEwMCwgMTAsIH0sCi17LTEwLCAxMCwgMTAwLCAxMCwgfSwKLXstOSwgMTAsIDEwMCwgMTAsIH0sCi17LTgsIDEwLCAxMDAsIDEwLCB9LAotey03LCAxMCwgMTAwLCAxMCwgfSwKLXstNiwgMTAsIDEwMCwgMTAsIH0sCi17LTUsIDEwLCAxMDAsIDEwLCB9LAotey00LCAxMCwgMTAwLCAxMCwgfSwKLXstMywgMTAsIDEwMCwgMTAsIH0sCi17LTIsIDEwLCAxMDAsIDEwLCB9LAotey0xLCAxMCwgMTAwLCAxMCwgfSwKLXswLCAxMCwgMTAwLCAxMCwgfSwKLXsxLCAxMCwgMTAwLCAxMCwgfSwKLXsyLCAxMCwgMTAwLCAxMCwgfSwKLXszLCAxMCwgMTAwLCAxMCwgfSwKLXs0LCAxMCwgMTAwLCAxMCwgfSwKLXs1LCAxMCwgMTAwLCAxMCwgfSwKLXs2LCAxMCwgMTAwLCAxMCwgfSwKLXs3LCAxMCwgMTAwLCAxMCwgfSwKLXs4LCAxMCwgMTAwLCAxMCwgfSwKLXs5LCAxMCwgMTAwLCAxMCwgfSwKLXsxMCwgMTAsIDEwMCwgMTAsIH0sCi17MTEsIDEwLCAxMDAsIDExLCB9LAotezEyLCAxMCwgMTAwLCAxMiwgfSwKLXsxMywgMTAsIDEwMCwgMTMsIH0sCi17MTQsIDEwLCAxMDAsIDE0LCB9LAotezE1LCAxMCwgMTAwLCAxNSwgfSwKLXsxNiwgMTAsIDEwMCwgMTYsIH0sCi17MTcsIDEwLCAxMDAsIDE3LCB9LAotezE4LCAxMCwgMTAwLCAxOCwgfSwKLXsxOSwgMTAsIDEwMCwgMTksIH0sCi17MjAsIDEwLCAxMDAsIDIwLCB9LAotezIxLCAxMCwgMTAwLCAyMSwgfSwKLXsyMiwgMTAsIDEwMCwgMjIsIH0sCi17MjMsIDEwLCAxMDAsIDIzLCB9LAotezI0LCAxMCwgMTAwLCAyNCwgfSwKLXsyNSwgMTAsIDEwMCwgMjUsIH0sCi17MjYsIDEwLCAxMDAsIDI2LCB9LAotezI3LCAxMCwgMTAwLCAyNywgfSwKLXsyOCwgMTAsIDEwMCwgMjgsIH0sCi17MjksIDEwLCAxMDAsIDI5LCB9LAotezMwLCAxMCwgMTAwLCAzMCwgfSwKLXszMSwgMTAsIDEwMCwgMzEsIH0sCi17MzIsIDEwLCAxMDAsIDMyLCB9LAotezMzLCAxMCwgMTAwLCAzMywgfSwKLXszNCwgMTAsIDEwMCwgMzQsIH0sCi17MzUsIDEwLCAxMDAsIDM1LCB9LAotezM2LCAxMCwgMTAwLCAzNiwgfSwKLXszNywgMTAsIDEwMCwgMzcsIH0sCi17MzgsIDEwLCAxMDAsIDM4LCB9LAotezM5LCAxMCwgMTAwLCAzOSwgfSwKLXs0MCwgMTAsIDEwMCwgNDAsIH0sCi17NDEsIDEwLCAxMDAsIDQxLCB9LAotezQyLCAxMCwgMTAwLCA0MiwgfSwKLXs0MywgMTAsIDEwMCwgNDMsIH0sCi17NDQsIDEwLCAxMDAsIDQ0LCB9LAotezQ1LCAxMCwgMTAwLCA0NSwgfSwKLXs0NiwgMTAsIDEwMCwgNDYsIH0sCi17NDcsIDEwLCAxMDAsIDQ3LCB9LAotezQ4LCAxMCwgMTAwLCA0OCwgfSwKLXs0OSwgMTAsIDEwMCwgNDksIH0sCi17NTAsIDEwLCAxMDAsIDUwLCB9LAotezUxLCAxMCwgMTAwLCA1MSwgfSwKLXs1MiwgMTAsIDEwMCwgNTIsIH0sCi17NTMsIDEwLCAxMDAsIDUzLCB9LAotezU0LCAxMCwgMTAwLCA1NCwgfSwKLXs1NSwgMTAsIDEwMCwgNTUsIH0sCi17NTYsIDEwLCAxMDAsIDU2LCB9LAotezU3LCAxMCwgMTAwLCA1NywgfSwKLXs1OCwgMTAsIDEwMCwgNTgsIH0sCi17NTksIDEwLCAxMDAsIDU5LCB9LAotezYwLCAxMCwgMTAwLCA2MCwgfSwKLXs2MSwgMTAsIDEwMCwgNjEsIH0sCi17NjIsIDEwLCAxMDAsIDYyLCB9LAotezYzLCAxMCwgMTAwLCA2MywgfSwKLXs2NCwgMTAsIDEwMCwgNjQsIH0sCi17NjUsIDEwLCAxMDAsIDY1LCB9LAotezY2LCAxMCwgMTAwLCA2NiwgfSwKLXs2NywgMTAsIDEwMCwgNjcsIH0sCi17NjgsIDEwLCAxMDAsIDY4LCB9LAotezY5LCAxMCwgMTAwLCA2OSwgfSwKLXs3MCwgMTAsIDEwMCwgNzAsIH0sCi17NzEsIDEwLCAxMDAsIDcxLCB9LAotezcyLCAxMCwgMTAwLCA3MiwgfSwKLXs3MywgMTAsIDEwMCwgNzMsIH0sCi17NzQsIDEwLCAxMDAsIDc0LCB9LAotezc1LCAxMCwgMTAwLCA3NSwgfSwKLXs3NiwgMTAsIDEwMCwgNzYsIH0sCi17NzcsIDEwLCAxMDAsIDc3LCB9LAotezc4LCAxMCwgMTAwLCA3OCwgfSwKLXs3OSwgMTAsIDEwMCwgNzksIH0sCi17ODAsIDEwLCAxMDAsIDgwLCB9LAotezgxLCAxMCwgMTAwLCA4MSwgfSwKLXs4MiwgMTAsIDEwMCwgODIsIH0sCi17ODMsIDEwLCAxMDAsIDgzLCB9LAotezg0LCAxMCwgMTAwLCA4NCwgfSwKLXs4NSwgMTAsIDEwMCwgODUsIH0sCi17ODYsIDEwLCAxMDAsIDg2LCB9LAotezg3LCAxMCwgMTAwLCA4NywgfSwKLXs4OCwgMTAsIDEwMCwgODgsIH0sCi17ODksIDEwLCAxMDAsIDg5LCB9LAotezkwLCAxMCwgMTAwLCA5MCwgfSwKLXs5MSwgMTAsIDEwMCwgOTEsIH0sCi17OTIsIDEwLCAxMDAsIDkyLCB9LAotezkzLCAxMCwgMTAwLCA5MywgfSwKLXs5NCwgMTAsIDEwMCwgOTQsIH0sCi17OTUsIDEwLCAxMDAsIDk1LCB9LAotezk2LCAxMCwgMTAwLCA5NiwgfSwKLXs5NywgMTAsIDEwMCwgOTcsIH0sCi17OTgsIDEwLCAxMDAsIDk4LCB9LAotezk5LCAxMCwgMTAwLCA5OSwgfSwKLXsxMDAsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMDEsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMDIsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMDMsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMDQsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMDUsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMDYsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMDcsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMDgsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMDksIDEwLCAxMDAsIDEwMCwgfSwKLXsxMTAsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMTEsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMTIsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMTMsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMTQsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMTUsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMTYsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMTcsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMTgsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMTksIDEwLCAxMDAsIDEwMCwgfSwKLXsxMjAsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMjEsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMjIsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMjMsIDEwLCAxMDAsIDEwMCwgfSwKLXsxMjQsIDEwLCAxMDAsIDEwMCwgfSwKLX07Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAyMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Nhc2guamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTI2YjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Nhc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2FzaAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2FzaAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2FzaCA9IG5ldyBTYXNoKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoc2FzaCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlzYXNoID0gbmV3IFNhc2gobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsgLy9zaG91bGQgbmV2ZXIgZ2V0IGhlcmUKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7MCwgU1dULkhPUklaT05UQUwsIFNXVC5WRVJUSUNBTH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJc2FzaCA9IG5ldyBTYXNoKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCS8vIG92ZXJyaWRkZW4gZnJvbSBDb250cm9sIGJlY2F1c2UgaXQgZG9lcyBub3QgbWFrZSBzZW5zZQotCS8vIHRvIHNldCB0aGUgZm9udCBvZiBhIFNhc2guCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotU2FzaCBzYXNoOwotCi1wcml2YXRlIHZvaWQgY3JlYXRlU2FzaCgpIHsKLSAgICB0ZWFyRG93bigpOwotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotICAgIFNhc2ggc2FzaCA9IG5ldyBTYXNoKHNoZWxsLCBTV1QuVkVSVElDQUwpOwotICAgIG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLSAgICBzZXRXaWRnZXQoc2FzaCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY3JlYXRlU2FzaCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjcmVhdGVTYXNoKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCA1LCAyMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBjcmVhdGVTYXNoKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY2FsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY1NjJmNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY2FsZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2NhbGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY2FsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2NhbGUgPSBuZXcgU2NhbGUoc2hlbGwsIDApOwotCXNldFdpZGdldChzY2FsZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlzY2FsZSA9IG5ldyBTY2FsZShudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIG9jY3VycmVkIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0gezAsIFNXVC5IT1JJWk9OVEFMLCBTV1QuVkVSVElDQUx9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCXNjYWxlID0gbmV3IFNjYWxlKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluY3JlbWVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW5jcmVtZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TWF4aW11bSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQYWdlSW5jcmVtZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW5jcmVtZW50SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW5jcmVtZW50SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1heGltdW1JKCkgewotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1heGltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjYWxlLnNldE1heGltdW0oaW50QXJyYXlbMF0pOwotCQlyZXBvcnQoInNldE1heGltdW0iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1JKCkgewotCi0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWluaW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2NhbGUuc2V0TWluaW11bShpbnRBcnJheVswXSk7Ci0JCXJlcG9ydCgic2V0TWluaW11bSIsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2NhbGUuc2V0U2VsZWN0aW9uKGludEFycmF5WzBdKTsKLQkJcmVwb3J0KCJzZXRTZWxlY3Rpb24iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWF4aW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQYWdlSW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Ucm91Z2hTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5jcmVtZW50IikpIHRlc3RfZ2V0SW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbXVtIikpIHRlc3RfZ2V0TWF4aW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bSIpKSB0ZXN0X2dldE1pbmltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKSkgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbmNyZW1lbnRJIikpIHRlc3Rfc2V0SW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW11bUkiKSkgdGVzdF9zZXRNYXhpbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bUkiKSkgdGVzdF9zZXRNaW5pbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKSkgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JLy8gb3ZlcnJpZGRlbiBmcm9tIENvbnRyb2wgYmVjYXVzZSBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlCi0JLy8gdG8gc2V0IHRoZSBmb250IG9mIGEgU2NhbGUuCi19Ci0KLVNjYWxlIHNjYWxlOwotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgcmVwb3J0KFN0cmluZyBjYWxsLCBpbnQgc2V0LCBpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkKSB7Ci0JIC8vVW5jb21tZW50IHRoZXNlIGxpbmVzIGFuZCBjb21tZW50IG91dCBjYWxsIHRvIGNoZWNrKCkgaWYgeW91IHdhbnQgdGhlIHRlc3QgdG8gcmVwb3J0IGFsbCBlcnJvcnMgd2l0aG91dAotCSAvL3N0b3BwaW5nLgotCQotCS8vaWYgKHRyYWNrQmFyLmdldE1pbmltdW0oKSAhPSBtaW5FeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBNaW5pbXVtIEV4cGVjdGVkOiAiICsgbWluRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyB0cmFja0Jhci5nZXRNaW5pbXVtKCkpOwotCS8vaWYgKHRyYWNrQmFyLmdldE1heGltdW0oKSAhPSBtYXhFeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBNYXhpbXVtIEV4cGVjdGVkOiAiICsgbWF4RXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyB0cmFja0Jhci5nZXRNYXhpbXVtKCkpOwotCS8vaWYgKHRyYWNrQmFyLmdldFNlbGVjdGlvbigpICE9IHNlbGVjdGlvbkV4cGVjdGVkKQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIigiICsgc2V0ICsgIik6IFNlbGVjdGlvbiBFeHBlY3RlZDogIiArIHNlbGVjdGlvbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgdHJhY2tCYXIuZ2V0U2VsZWN0aW9uKCkpOwotCWNoZWNrKG1pbkV4cGVjdGVkLCBtYXhFeHBlY3RlZCwgc2VsZWN0aW9uRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGNoZWNrKGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQpIHsKLQlhc3NlcnRFcXVhbHMoc2NhbGUuZ2V0TWF4aW11bSgpLCBtYXhFeHBlY3RlZCk7Ci0JYXNzZXJ0RXF1YWxzKHNjYWxlLmdldE1pbmltdW0oKSwgbWluRXhwZWN0ZWQpOwotCWFzc2VydEVxdWFscyhzY2FsZS5nZXRTZWxlY3Rpb24oKSwgc2VsZWN0aW9uRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1pbmltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgfSwKLXstMTMsIDEwLCAxMDAsIDUwLCB9LAotey0xMiwgMTAsIDEwMCwgNTAsIH0sCi17LTExLCAxMCwgMTAwLCA1MCwgfSwKLXstMTAsIDEwLCAxMDAsIDUwLCB9LAotey05LCAxMCwgMTAwLCA1MCwgfSwKLXstOCwgMTAsIDEwMCwgNTAsIH0sCi17LTcsIDEwLCAxMDAsIDUwLCB9LAotey02LCAxMCwgMTAwLCA1MCwgfSwKLXstNSwgMTAsIDEwMCwgNTAsIH0sCi17LTQsIDEwLCAxMDAsIDUwLCB9LAotey0zLCAxMCwgMTAwLCA1MCwgfSwKLXstMiwgMTAsIDEwMCwgNTAsIH0sCi17LTEsIDEwLCAxMDAsIDUwLCB9LAotezAsIDAsIDEwMCwgNTAsIH0sCi17MSwgMSwgMTAwLCA1MCwgfSwKLXsyLCAyLCAxMDAsIDUwLCB9LAotezMsIDMsIDEwMCwgNTAsIH0sCi17NCwgNCwgMTAwLCA1MCwgfSwKLXs1LCA1LCAxMDAsIDUwLCB9LAotezYsIDYsIDEwMCwgNTAsIH0sCi17NywgNywgMTAwLCA1MCwgfSwKLXs4LCA4LCAxMDAsIDUwLCB9LAotezksIDksIDEwMCwgNTAsIH0sCi17MTAsIDEwLCAxMDAsIDUwLCB9LAotezExLCAxMSwgMTAwLCA1MCwgfSwKLXsxMiwgMTIsIDEwMCwgNTAsIH0sCi17MTMsIDEzLCAxMDAsIDUwLCB9LAotezE0LCAxNCwgMTAwLCA1MCwgfSwKLXsxNSwgMTUsIDEwMCwgNTAsIH0sCi17MTYsIDE2LCAxMDAsIDUwLCB9LAotezE3LCAxNywgMTAwLCA1MCwgfSwKLXsxOCwgMTgsIDEwMCwgNTAsIH0sCi17MTksIDE5LCAxMDAsIDUwLCB9LAotezIwLCAyMCwgMTAwLCA1MCwgfSwKLXsyMSwgMjEsIDEwMCwgNTAsIH0sCi17MjIsIDIyLCAxMDAsIDUwLCB9LAotezIzLCAyMywgMTAwLCA1MCwgfSwKLXsyNCwgMjQsIDEwMCwgNTAsIH0sCi17MjUsIDI1LCAxMDAsIDUwLCB9LAotezI2LCAyNiwgMTAwLCA1MCwgfSwKLXsyNywgMjcsIDEwMCwgNTAsIH0sCi17MjgsIDI4LCAxMDAsIDUwLCB9LAotezI5LCAyOSwgMTAwLCA1MCwgfSwKLXszMCwgMzAsIDEwMCwgNTAsIH0sCi17MzEsIDMxLCAxMDAsIDUwLCB9LAotezMyLCAzMiwgMTAwLCA1MCwgfSwKLXszMywgMzMsIDEwMCwgNTAsIH0sCi17MzQsIDM0LCAxMDAsIDUwLCB9LAotezM1LCAzNSwgMTAwLCA1MCwgfSwKLXszNiwgMzYsIDEwMCwgNTAsIH0sCi17MzcsIDM3LCAxMDAsIDUwLCB9LAotezM4LCAzOCwgMTAwLCA1MCwgfSwKLXszOSwgMzksIDEwMCwgNTAsIH0sCi17NDAsIDQwLCAxMDAsIDUwLCB9LAotezQxLCA0MSwgMTAwLCA1MCwgfSwKLXs0MiwgNDIsIDEwMCwgNTAsIH0sCi17NDMsIDQzLCAxMDAsIDUwLCB9LAotezQ0LCA0NCwgMTAwLCA1MCwgfSwKLXs0NSwgNDUsIDEwMCwgNTAsIH0sCi17NDYsIDQ2LCAxMDAsIDUwLCB9LAotezQ3LCA0NywgMTAwLCA1MCwgfSwKLXs0OCwgNDgsIDEwMCwgNTAsIH0sCi17NDksIDQ5LCAxMDAsIDUwLCB9LAotezUwLCA1MCwgMTAwLCA1MCwgfSwKLXs1MSwgNTEsIDEwMCwgNTEsIH0sCi17NTIsIDUyLCAxMDAsIDUyLCB9LAotezUzLCA1MywgMTAwLCA1MywgfSwKLXs1NCwgNTQsIDEwMCwgNTQsIH0sCi17NTUsIDU1LCAxMDAsIDU1LCB9LAotezU2LCA1NiwgMTAwLCA1NiwgfSwKLXs1NywgNTcsIDEwMCwgNTcsIH0sCi17NTgsIDU4LCAxMDAsIDU4LCB9LAotezU5LCA1OSwgMTAwLCA1OSwgfSwKLXs2MCwgNjAsIDEwMCwgNjAsIH0sCi17NjEsIDYxLCAxMDAsIDYxLCB9LAotezYyLCA2MiwgMTAwLCA2MiwgfSwKLXs2MywgNjMsIDEwMCwgNjMsIH0sCi17NjQsIDY0LCAxMDAsIDY0LCB9LAotezY1LCA2NSwgMTAwLCA2NSwgfSwKLXs2NiwgNjYsIDEwMCwgNjYsIH0sCi17NjcsIDY3LCAxMDAsIDY3LCB9LAotezY4LCA2OCwgMTAwLCA2OCwgfSwKLXs2OSwgNjksIDEwMCwgNjksIH0sCi17NzAsIDcwLCAxMDAsIDcwLCB9LAotezcxLCA3MSwgMTAwLCA3MSwgfSwKLXs3MiwgNzIsIDEwMCwgNzIsIH0sCi17NzMsIDczLCAxMDAsIDczLCB9LAotezc0LCA3NCwgMTAwLCA3NCwgfSwKLXs3NSwgNzUsIDEwMCwgNzUsIH0sCi17NzYsIDc2LCAxMDAsIDc2LCB9LAotezc3LCA3NywgMTAwLCA3NywgfSwKLXs3OCwgNzgsIDEwMCwgNzgsIH0sCi17NzksIDc5LCAxMDAsIDc5LCB9LAotezgwLCA4MCwgMTAwLCA4MCwgfSwKLXs4MSwgODEsIDEwMCwgODEsIH0sCi17ODIsIDgyLCAxMDAsIDgyLCB9LAotezgzLCA4MywgMTAwLCA4MywgfSwKLXs4NCwgODQsIDEwMCwgODQsIH0sCi17ODUsIDg1LCAxMDAsIDg1LCB9LAotezg2LCA4NiwgMTAwLCA4NiwgfSwKLXs4NywgODcsIDEwMCwgODcsIH0sCi17ODgsIDg4LCAxMDAsIDg4LCB9LAotezg5LCA4OSwgMTAwLCA4OSwgfSwKLXs5MCwgOTAsIDEwMCwgOTAsIH0sCi17OTEsIDkxLCAxMDAsIDkxLCB9LAotezkyLCA5MiwgMTAwLCA5MiwgfSwKLXs5MywgOTMsIDEwMCwgOTMsIH0sCi17OTQsIDk0LCAxMDAsIDk0LCB9LAotezk1LCA5NSwgMTAwLCA5NSwgfSwKLXs5NiwgOTYsIDEwMCwgOTYsIH0sCi17OTcsIDk3LCAxMDAsIDk3LCB9LAotezk4LCA5OCwgMTAwLCA5OCwgfSwKLXs5OSwgOTksIDEwMCwgOTksIH0sCi17MTAwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDEsIDEwLCAxMDAsIDUwLCB9LAotezEwMiwgMTAsIDEwMCwgNTAsIH0sCi17MTAzLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDQsIDEwLCAxMDAsIDUwLCB9LAotezEwNSwgMTAsIDEwMCwgNTAsIH0sCi17MTA2LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDcsIDEwLCAxMDAsIDUwLCB9LAotezEwOCwgMTAsIDEwMCwgNTAsIH0sCi17MTA5LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTAsIDEwLCAxMDAsIDUwLCB9LAotezExMSwgMTAsIDEwMCwgNTAsIH0sCi17MTEyLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTMsIDEwLCAxMDAsIDUwLCB9LAotezExNCwgMTAsIDEwMCwgNTAsIH0sCi17MTE1LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTYsIDEwLCAxMDAsIDUwLCB9LAotezExNywgMTAsIDEwMCwgNTAsIH0sCi17MTE4LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTksIDEwLCAxMDAsIDUwLCB9LAotezEyMCwgMTAsIDEwMCwgNTAsIH0sCi17MTIxLCAxMCwgMTAwLCA1MCwgfSwKLXsxMjIsIDEwLCAxMDAsIDUwLCB9LAotezEyMywgMTAsIDEwMCwgNTAsIH0sCi17MTI0LCAxMCwgMTAwLCA1MCwgfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWF4aW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgfSwKLXstMTQsIDEwLCAxMDAsIDUwLCB9LAotey0xMywgMTAsIDEwMCwgNTAsIH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgfSwKLXstMTEsIDEwLCAxMDAsIDUwLCB9LAotey0xMCwgMTAsIDEwMCwgNTAsIH0sCi17LTksIDEwLCAxMDAsIDUwLCB9LAotey04LCAxMCwgMTAwLCA1MCwgfSwKLXstNywgMTAsIDEwMCwgNTAsIH0sCi17LTYsIDEwLCAxMDAsIDUwLCB9LAotey01LCAxMCwgMTAwLCA1MCwgfSwKLXstNCwgMTAsIDEwMCwgNTAsIH0sCi17LTMsIDEwLCAxMDAsIDUwLCB9LAotey0yLCAxMCwgMTAwLCA1MCwgfSwKLXstMSwgMTAsIDEwMCwgNTAsIH0sCi17MCwgMTAsIDEwMCwgNTAsIH0sCi17MSwgMTAsIDEwMCwgNTAsIH0sCi17MiwgMTAsIDEwMCwgNTAsIH0sCi17MywgMTAsIDEwMCwgNTAsIH0sCi17NCwgMTAsIDEwMCwgNTAsIH0sCi17NSwgMTAsIDEwMCwgNTAsIH0sCi17NiwgMTAsIDEwMCwgNTAsIH0sCi17NywgMTAsIDEwMCwgNTAsIH0sCi17OCwgMTAsIDEwMCwgNTAsIH0sCi17OSwgMTAsIDEwMCwgNTAsIH0sCi17MTAsIDEwLCAxMDAsIDUwLCB9LAotezExLCAxMCwgMTEsIDExLCB9LAotezEyLCAxMCwgMTIsIDEyLCB9LAotezEzLCAxMCwgMTMsIDEzLCB9LAotezE0LCAxMCwgMTQsIDE0LCB9LAotezE1LCAxMCwgMTUsIDE1LCB9LAotezE2LCAxMCwgMTYsIDE2LCB9LAotezE3LCAxMCwgMTcsIDE3LCB9LAotezE4LCAxMCwgMTgsIDE4LCB9LAotezE5LCAxMCwgMTksIDE5LCB9LAotezIwLCAxMCwgMjAsIDIwLCB9LAotezIxLCAxMCwgMjEsIDIxLCB9LAotezIyLCAxMCwgMjIsIDIyLCB9LAotezIzLCAxMCwgMjMsIDIzLCB9LAotezI0LCAxMCwgMjQsIDI0LCB9LAotezI1LCAxMCwgMjUsIDI1LCB9LAotezI2LCAxMCwgMjYsIDI2LCB9LAotezI3LCAxMCwgMjcsIDI3LCB9LAotezI4LCAxMCwgMjgsIDI4LCB9LAotezI5LCAxMCwgMjksIDI5LCB9LAotezMwLCAxMCwgMzAsIDMwLCB9LAotezMxLCAxMCwgMzEsIDMxLCB9LAotezMyLCAxMCwgMzIsIDMyLCB9LAotezMzLCAxMCwgMzMsIDMzLCB9LAotezM0LCAxMCwgMzQsIDM0LCB9LAotezM1LCAxMCwgMzUsIDM1LCB9LAotezM2LCAxMCwgMzYsIDM2LCB9LAotezM3LCAxMCwgMzcsIDM3LCB9LAotezM4LCAxMCwgMzgsIDM4LCB9LAotezM5LCAxMCwgMzksIDM5LCB9LAotezQwLCAxMCwgNDAsIDQwLCB9LAotezQxLCAxMCwgNDEsIDQxLCB9LAotezQyLCAxMCwgNDIsIDQyLCB9LAotezQzLCAxMCwgNDMsIDQzLCB9LAotezQ0LCAxMCwgNDQsIDQ0LCB9LAotezQ1LCAxMCwgNDUsIDQ1LCB9LAotezQ2LCAxMCwgNDYsIDQ2LCB9LAotezQ3LCAxMCwgNDcsIDQ3LCB9LAotezQ4LCAxMCwgNDgsIDQ4LCB9LAotezQ5LCAxMCwgNDksIDQ5LCB9LAotezUwLCAxMCwgNTAsIDUwLCB9LAotezUxLCAxMCwgNTEsIDUwLCB9LAotezUyLCAxMCwgNTIsIDUwLCB9LAotezUzLCAxMCwgNTMsIDUwLCB9LAotezU0LCAxMCwgNTQsIDUwLCB9LAotezU1LCAxMCwgNTUsIDUwLCB9LAotezU2LCAxMCwgNTYsIDUwLCB9LAotezU3LCAxMCwgNTcsIDUwLCB9LAotezU4LCAxMCwgNTgsIDUwLCB9LAotezU5LCAxMCwgNTksIDUwLCB9LAotezYwLCAxMCwgNjAsIDUwLCB9LAotezYxLCAxMCwgNjEsIDUwLCB9LAotezYyLCAxMCwgNjIsIDUwLCB9LAotezYzLCAxMCwgNjMsIDUwLCB9LAotezY0LCAxMCwgNjQsIDUwLCB9LAotezY1LCAxMCwgNjUsIDUwLCB9LAotezY2LCAxMCwgNjYsIDUwLCB9LAotezY3LCAxMCwgNjcsIDUwLCB9LAotezY4LCAxMCwgNjgsIDUwLCB9LAotezY5LCAxMCwgNjksIDUwLCB9LAotezcwLCAxMCwgNzAsIDUwLCB9LAotezcxLCAxMCwgNzEsIDUwLCB9LAotezcyLCAxMCwgNzIsIDUwLCB9LAotezczLCAxMCwgNzMsIDUwLCB9LAotezc0LCAxMCwgNzQsIDUwLCB9LAotezc1LCAxMCwgNzUsIDUwLCB9LAotezc2LCAxMCwgNzYsIDUwLCB9LAotezc3LCAxMCwgNzcsIDUwLCB9LAotezc4LCAxMCwgNzgsIDUwLCB9LAotezc5LCAxMCwgNzksIDUwLCB9LAotezgwLCAxMCwgODAsIDUwLCB9LAotezgxLCAxMCwgODEsIDUwLCB9LAotezgyLCAxMCwgODIsIDUwLCB9LAotezgzLCAxMCwgODMsIDUwLCB9LAotezg0LCAxMCwgODQsIDUwLCB9LAotezg1LCAxMCwgODUsIDUwLCB9LAotezg2LCAxMCwgODYsIDUwLCB9LAotezg3LCAxMCwgODcsIDUwLCB9LAotezg4LCAxMCwgODgsIDUwLCB9LAotezg5LCAxMCwgODksIDUwLCB9LAotezkwLCAxMCwgOTAsIDUwLCB9LAotezkxLCAxMCwgOTEsIDUwLCB9LAotezkyLCAxMCwgOTIsIDUwLCB9LAotezkzLCAxMCwgOTMsIDUwLCB9LAotezk0LCAxMCwgOTQsIDUwLCB9LAotezk1LCAxMCwgOTUsIDUwLCB9LAotezk2LCAxMCwgOTYsIDUwLCB9LAotezk3LCAxMCwgOTcsIDUwLCB9LAotezk4LCAxMCwgOTgsIDUwLCB9LAotezk5LCAxMCwgOTksIDUwLCB9LAotezEwMCwgMTAsIDEwMCwgNTAsIH0sCi17MTAxLCAxMCwgMTAxLCA1MCwgfSwKLXsxMDIsIDEwLCAxMDIsIDUwLCB9LAotezEwMywgMTAsIDEwMywgNTAsIH0sCi17MTA0LCAxMCwgMTA0LCA1MCwgfSwKLXsxMDUsIDEwLCAxMDUsIDUwLCB9LAotezEwNiwgMTAsIDEwNiwgNTAsIH0sCi17MTA3LCAxMCwgMTA3LCA1MCwgfSwKLXsxMDgsIDEwLCAxMDgsIDUwLCB9LAotezEwOSwgMTAsIDEwOSwgNTAsIH0sCi17MTEwLCAxMCwgMTEwLCA1MCwgfSwKLXsxMTEsIDEwLCAxMTEsIDUwLCB9LAotezExMiwgMTAsIDExMiwgNTAsIH0sCi17MTEzLCAxMCwgMTEzLCA1MCwgfSwKLXsxMTQsIDEwLCAxMTQsIDUwLCB9LAotezExNSwgMTAsIDExNSwgNTAsIH0sCi17MTE2LCAxMCwgMTE2LCA1MCwgfSwKLXsxMTcsIDEwLCAxMTcsIDUwLCB9LAotezExOCwgMTAsIDExOCwgNTAsIH0sCi17MTE5LCAxMCwgMTE5LCA1MCwgfSwKLXsxMjAsIDEwLCAxMjAsIDUwLCB9LAotezEyMSwgMTAsIDEyMSwgNTAsIH0sCi17MTIyLCAxMCwgMTIyLCA1MCwgfSwKLXsxMjMsIDEwLCAxMjMsIDUwLCB9LAotezEyNCwgMTAsIDEyNCwgNTAsIH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotCXNjYWxlLnNldE1heGltdW0oMTAwKTsKLQlzY2FsZS5zZXRNaW5pbXVtKDEwKTsKLQlzY2FsZS5zZXRTZWxlY3Rpb24oNTApOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFNlbGVjdGlvblZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCAxMCwgfSwKLXstMTQsIDEwLCAxMDAsIDEwLCB9LAotey0xMywgMTAsIDEwMCwgMTAsIH0sCi17LTEyLCAxMCwgMTAwLCAxMCwgfSwKLXstMTEsIDEwLCAxMDAsIDEwLCB9LAotey0xMCwgMTAsIDEwMCwgMTAsIH0sCi17LTksIDEwLCAxMDAsIDEwLCB9LAotey04LCAxMCwgMTAwLCAxMCwgfSwKLXstNywgMTAsIDEwMCwgMTAsIH0sCi17LTYsIDEwLCAxMDAsIDEwLCB9LAotey01LCAxMCwgMTAwLCAxMCwgfSwKLXstNCwgMTAsIDEwMCwgMTAsIH0sCi17LTMsIDEwLCAxMDAsIDEwLCB9LAotey0yLCAxMCwgMTAwLCAxMCwgfSwKLXstMSwgMTAsIDEwMCwgMTAsIH0sCi17MCwgMTAsIDEwMCwgMTAsIH0sCi17MSwgMTAsIDEwMCwgMTAsIH0sCi17MiwgMTAsIDEwMCwgMTAsIH0sCi17MywgMTAsIDEwMCwgMTAsIH0sCi17NCwgMTAsIDEwMCwgMTAsIH0sCi17NSwgMTAsIDEwMCwgMTAsIH0sCi17NiwgMTAsIDEwMCwgMTAsIH0sCi17NywgMTAsIDEwMCwgMTAsIH0sCi17OCwgMTAsIDEwMCwgMTAsIH0sCi17OSwgMTAsIDEwMCwgMTAsIH0sCi17MTAsIDEwLCAxMDAsIDEwLCB9LAotezExLCAxMCwgMTAwLCAxMSwgfSwKLXsxMiwgMTAsIDEwMCwgMTIsIH0sCi17MTMsIDEwLCAxMDAsIDEzLCB9LAotezE0LCAxMCwgMTAwLCAxNCwgfSwKLXsxNSwgMTAsIDEwMCwgMTUsIH0sCi17MTYsIDEwLCAxMDAsIDE2LCB9LAotezE3LCAxMCwgMTAwLCAxNywgfSwKLXsxOCwgMTAsIDEwMCwgMTgsIH0sCi17MTksIDEwLCAxMDAsIDE5LCB9LAotezIwLCAxMCwgMTAwLCAyMCwgfSwKLXsyMSwgMTAsIDEwMCwgMjEsIH0sCi17MjIsIDEwLCAxMDAsIDIyLCB9LAotezIzLCAxMCwgMTAwLCAyMywgfSwKLXsyNCwgMTAsIDEwMCwgMjQsIH0sCi17MjUsIDEwLCAxMDAsIDI1LCB9LAotezI2LCAxMCwgMTAwLCAyNiwgfSwKLXsyNywgMTAsIDEwMCwgMjcsIH0sCi17MjgsIDEwLCAxMDAsIDI4LCB9LAotezI5LCAxMCwgMTAwLCAyOSwgfSwKLXszMCwgMTAsIDEwMCwgMzAsIH0sCi17MzEsIDEwLCAxMDAsIDMxLCB9LAotezMyLCAxMCwgMTAwLCAzMiwgfSwKLXszMywgMTAsIDEwMCwgMzMsIH0sCi17MzQsIDEwLCAxMDAsIDM0LCB9LAotezM1LCAxMCwgMTAwLCAzNSwgfSwKLXszNiwgMTAsIDEwMCwgMzYsIH0sCi17MzcsIDEwLCAxMDAsIDM3LCB9LAotezM4LCAxMCwgMTAwLCAzOCwgfSwKLXszOSwgMTAsIDEwMCwgMzksIH0sCi17NDAsIDEwLCAxMDAsIDQwLCB9LAotezQxLCAxMCwgMTAwLCA0MSwgfSwKLXs0MiwgMTAsIDEwMCwgNDIsIH0sCi17NDMsIDEwLCAxMDAsIDQzLCB9LAotezQ0LCAxMCwgMTAwLCA0NCwgfSwKLXs0NSwgMTAsIDEwMCwgNDUsIH0sCi17NDYsIDEwLCAxMDAsIDQ2LCB9LAotezQ3LCAxMCwgMTAwLCA0NywgfSwKLXs0OCwgMTAsIDEwMCwgNDgsIH0sCi17NDksIDEwLCAxMDAsIDQ5LCB9LAotezUwLCAxMCwgMTAwLCA1MCwgfSwKLXs1MSwgMTAsIDEwMCwgNTEsIH0sCi17NTIsIDEwLCAxMDAsIDUyLCB9LAotezUzLCAxMCwgMTAwLCA1MywgfSwKLXs1NCwgMTAsIDEwMCwgNTQsIH0sCi17NTUsIDEwLCAxMDAsIDU1LCB9LAotezU2LCAxMCwgMTAwLCA1NiwgfSwKLXs1NywgMTAsIDEwMCwgNTcsIH0sCi17NTgsIDEwLCAxMDAsIDU4LCB9LAotezU5LCAxMCwgMTAwLCA1OSwgfSwKLXs2MCwgMTAsIDEwMCwgNjAsIH0sCi17NjEsIDEwLCAxMDAsIDYxLCB9LAotezYyLCAxMCwgMTAwLCA2MiwgfSwKLXs2MywgMTAsIDEwMCwgNjMsIH0sCi17NjQsIDEwLCAxMDAsIDY0LCB9LAotezY1LCAxMCwgMTAwLCA2NSwgfSwKLXs2NiwgMTAsIDEwMCwgNjYsIH0sCi17NjcsIDEwLCAxMDAsIDY3LCB9LAotezY4LCAxMCwgMTAwLCA2OCwgfSwKLXs2OSwgMTAsIDEwMCwgNjksIH0sCi17NzAsIDEwLCAxMDAsIDcwLCB9LAotezcxLCAxMCwgMTAwLCA3MSwgfSwKLXs3MiwgMTAsIDEwMCwgNzIsIH0sCi17NzMsIDEwLCAxMDAsIDczLCB9LAotezc0LCAxMCwgMTAwLCA3NCwgfSwKLXs3NSwgMTAsIDEwMCwgNzUsIH0sCi17NzYsIDEwLCAxMDAsIDc2LCB9LAotezc3LCAxMCwgMTAwLCA3NywgfSwKLXs3OCwgMTAsIDEwMCwgNzgsIH0sCi17NzksIDEwLCAxMDAsIDc5LCB9LAotezgwLCAxMCwgMTAwLCA4MCwgfSwKLXs4MSwgMTAsIDEwMCwgODEsIH0sCi17ODIsIDEwLCAxMDAsIDgyLCB9LAotezgzLCAxMCwgMTAwLCA4MywgfSwKLXs4NCwgMTAsIDEwMCwgODQsIH0sCi17ODUsIDEwLCAxMDAsIDg1LCB9LAotezg2LCAxMCwgMTAwLCA4NiwgfSwKLXs4NywgMTAsIDEwMCwgODcsIH0sCi17ODgsIDEwLCAxMDAsIDg4LCB9LAotezg5LCAxMCwgMTAwLCA4OSwgfSwKLXs5MCwgMTAsIDEwMCwgOTAsIH0sCi17OTEsIDEwLCAxMDAsIDkxLCB9LAotezkyLCAxMCwgMTAwLCA5MiwgfSwKLXs5MywgMTAsIDEwMCwgOTMsIH0sCi17OTQsIDEwLCAxMDAsIDk0LCB9LAotezk1LCAxMCwgMTAwLCA5NSwgfSwKLXs5NiwgMTAsIDEwMCwgOTYsIH0sCi17OTcsIDEwLCAxMDAsIDk3LCB9LAotezk4LCAxMCwgMTAwLCA5OCwgfSwKLXs5OSwgMTAsIDEwMCwgOTksIH0sCi17MTAwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAxLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTA0LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA1LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA2LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA3LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA4LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA5LCAxMCwgMTAwLCAxMDAsIH0sCi17MTEwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTExLCAxMCwgMTAwLCAxMDAsIH0sCi17MTEyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTEzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTE0LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE1LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE2LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE3LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE4LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE5LCAxMCwgMTAwLCAxMDAsIH0sCi17MTIwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIxLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTI0LCAxMCwgMTAwLCAxMDAsIH0sCi19OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfUklHSFQsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDksIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDksIDUsIDMwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiODZlZDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxCYXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxCYXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5IX1NDUk9MTCk7Ci0Jc2Nyb2xsQmFyID0gY2FudmFzLmdldEhvcml6b250YWxCYXIoKTsKLQljYW52YXMuc2V0U2l6ZSgxMDAsMTAwKTsKLQlzZXRXaWRnZXQoc2Nyb2xsQmFyKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIHZhbHVlU3RyaW5nKGludFtdIGludEFycmF5KSB7Ci0JcmV0dXJuICIgKCIraW50QXJyYXlbMV0rIiwiK2ludEFycmF5WzJdKyIsIitpbnRBcnJheVszXSsiLCIraW50QXJyYXlbNF0rIikiOwotfQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JdHJ5IHsKLQkJc2Nyb2xsQmFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXNjcm9sbEJhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jc2Nyb2xsQmFyLnNldFNlbGVjdGlvbigxMDApOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQlzY3JvbGxCYXIucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXRyeSB7Ci0JCXNjcm9sbEJhci5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCS8vIHRlc3RlZCBpbiB0ZWFyRG93bgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RW5hYmxlZCgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluY3JlbWVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbmNyZW1lbnQoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNYXhpbXVtKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldE1heGltdW0oKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldE1pbmltdW0oKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFBhZ2VJbmNyZW1lbnQoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKGNhbnZhcywgc2Nyb2xsQmFyLmdldFBhcmVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0U2VsZWN0aW9uKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2l6ZSgpIHsKLQlhc3NlcnRUcnVlKHNjcm9sbEJhci5nZXRTaXplKCkueCA+IDApOwotCWFzc2VydFRydWUoc2Nyb2xsQmFyLmdldFNpemUoKS55ID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGh1bWIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGh1bWIoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFZpc2libGUoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VuYWJsZWQoKSB7Ci0Jc2Nyb2xsQmFyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzY3JvbGxCYXIuaXNFbmFibGVkKCkpOwotCi0Jc2Nyb2xsQmFyLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIXNjcm9sbEJhci5pc0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNWaXNpYmxlKCkgewotCXNjcm9sbEJhci5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoc2Nyb2xsQmFyLmlzVmlzaWJsZSgpKTsgCi0Jc2Nyb2xsQmFyLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIXNjcm9sbEJhci5pc1Zpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0Jc2Nyb2xsQmFyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzY3JvbGxCYXIuZ2V0RW5hYmxlZCgpKTsKLQotCXNjcm9sbEJhci5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFzY3JvbGxCYXIuZ2V0RW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbmNyZW1lbnRJKCkgewotCWludFtdIGNhc2VzID0gezEsIDEwLCAxMDAwMH07Ci0JZm9yIChpbnQgaT0wOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JewotCQlzY3JvbGxCYXIuc2V0SW5jcmVtZW50KGNhc2VzW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKGNhc2VzW2ldLCBzY3JvbGxCYXIuZ2V0SW5jcmVtZW50KCkpOwotCX0gCi0KLQlzY3JvbGxCYXIuc2V0SW5jcmVtZW50KDI1KTsKLQlzY3JvbGxCYXIuc2V0SW5jcmVtZW50KDApOyAvLyBzZXR0aW5nIHRvIDAgZmFpbHMgc2lsZW50bHkKLQlhc3NlcnRFcXVhbHMoMjUsIHNjcm9sbEJhci5nZXRJbmNyZW1lbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW11bUkoKXsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWF4aW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2Nyb2xsQmFyLnNldE1heGltdW0oaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0TWF4ICIraW50QXJyYXlbMF0rIHZhbHVlU3RyaW5nLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtSSgpewotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNaW5pbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzY3JvbGxCYXIuc2V0TWluaW11bShpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRNaW4gIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZywgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKXsKLQlpbnRbXSBjYXNlcyA9IHsxLCAxMCwgMTAwMDB9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0JCXNjcm9sbEJhci5zZXRQYWdlSW5jcmVtZW50KGNhc2VzW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKHNjcm9sbEJhci5nZXRQYWdlSW5jcmVtZW50KCksIGNhc2VzW2ldKTsKLQl9IAotCi0Jc2Nyb2xsQmFyLnNldFBhZ2VJbmNyZW1lbnQoMjUpOwotCXNjcm9sbEJhci5zZXRQYWdlSW5jcmVtZW50KDApOyAvLyBzZXR0aW5nIHRvIDAgZmFpbHMgc2lsZW50bHkKLQlhc3NlcnRFcXVhbHMoMjUsIHNjcm9sbEJhci5nZXRQYWdlSW5jcmVtZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKXsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2Nyb2xsQmFyLnNldFNlbGVjdGlvbihpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRTZWwgIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZyxpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUaHVtYkkoKXsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0VGh1bWJWYWx1ZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzY3JvbGxCYXIuc2V0VGh1bWIoaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0VGhtYiAiK2ludEFycmF5WzBdK3ZhbHVlU3RyaW5nLGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdLCBpbnRBcnJheVs0XSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZhbHVlc0lJSUlJSSgpIHsKLQlzY3JvbGxCYXIuc2V0VmFsdWVzKDEwLCAxMCwgNTAsIDIsIDUsIDEwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCkgPT0gMTApOwotCWFzc2VydFRydWUoIjpiOiIsIHNjcm9sbEJhci5nZXRNaW5pbXVtKCkgPT0gMTApOwotCWFzc2VydFRydWUoIjpjOiIsIHNjcm9sbEJhci5nZXRNYXhpbXVtKCkgPT0gNTApOwotCWFzc2VydFRydWUoIjpkOiIsIHNjcm9sbEJhci5nZXRUaHVtYigpID09IDIpOwotCWFzc2VydFRydWUoIjplOiIsIHNjcm9sbEJhci5nZXRJbmNyZW1lbnQoKSA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzY3JvbGxCYXIuZ2V0UGFnZUluY3JlbWVudCgpID09IDEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWaXNpYmxlWigpIHsKLQlzY3JvbGxCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHNjcm9sbEJhci5nZXRWaXNpYmxlKCkpOwotCi0Jc2Nyb2xsQmFyLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIXNjcm9sbEJhci5nZXRWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUaHVtYiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbmNyZW1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNYXhpbXVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUaHVtYkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFZhbHVlc0lJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbmNyZW1lbnQiKSkgdGVzdF9nZXRJbmNyZW1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1heGltdW0iKSkgdGVzdF9nZXRNYXhpbXVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNaW5pbXVtIikpIHRlc3RfZ2V0TWluaW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFnZUluY3JlbWVudCIpKSB0ZXN0X2dldFBhZ2VJbmNyZW1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaXplIikpIHRlc3RfZ2V0U2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGh1bWIiKSkgdGVzdF9nZXRUaHVtYigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmlzaWJsZSIpKSB0ZXN0X2dldFZpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNWaXNpYmxlIikpIHRlc3RfaXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW5jcmVtZW50SSIpKSB0ZXN0X3NldEluY3JlbWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1heGltdW1JIikpIHRlc3Rfc2V0TWF4aW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1JIikpIHRlc3Rfc2V0TWluaW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJIikpIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUaHVtYkkiKSkgdGVzdF9zZXRUaHVtYkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZhbHVlc0lJSUlJSSIpKSB0ZXN0X3NldFZhbHVlc0lJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVNjcm9sbEJhciBzY3JvbGxCYXI7Ci1DYW52YXMgY2FudmFzOwotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgcmVwb3J0KFN0cmluZyBjYWxsLCBpbnQgc2V0LCBpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkLCBpbnQgdGh1bWJFeHBlY3RlZCkgewotCS8vIFVuY29tbWVudCB0aGVzZSBsaW5lcyBhbmQgY29tbWVudCBvdXQgY2FsbCB0byBjaGVjaygpIGlmIHlvdSB3YW50IHRoZSB0ZXN0IHRvIHJlcG9ydCBhbGwgZXJyb3JzIHdpdGhvdXQKLQkvLyBzdG9wcGluZy4KLS8vCWlmIChzY3JvbGxCYXIuZ2V0TWluaW11bSgpICE9IG1pbkV4cGVjdGVkKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogTWluaW11bSBFeHBlY3RlZDogIiArIG1pbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2Nyb2xsQmFyLmdldE1pbmltdW0oKSk7Ci0vLwl9Ci0vLwlpZiAoc2Nyb2xsQmFyLmdldE1heGltdW0oKSAhPSBtYXhFeHBlY3RlZCl7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogTWF4aW11bSBFeHBlY3RlZDogIiArIG1heEV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2Nyb2xsQmFyLmdldE1heGltdW0oKSk7Ci0vLwl9Ci0vLwlpZiAoc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpICE9IHNlbGVjdGlvbkV4cGVjdGVkKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogU2VsZWN0aW9uIEV4cGVjdGVkOiAiICsgc2VsZWN0aW9uRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCkpOwotLy8JfQotLy8JaWYgKHNjcm9sbEJhci5nZXRUaHVtYigpICE9IHRodW1iRXhwZWN0ZWQpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBUaHVtYiBFeHBlY3RlZDogIiArIHRodW1iRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzY3JvbGxCYXIuZ2V0VGh1bWIoKSk7Ci0vLwl9Ci0JY2hlY2soY2FsbCwgbWluRXhwZWN0ZWQsIG1heEV4cGVjdGVkLCBzZWxlY3Rpb25FeHBlY3RlZCwgdGh1bWJFeHBlY3RlZCk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgY2hlY2soU3RyaW5nIGNhbGwsIGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQsIGludCB0aHVtYkV4cGVjdGVkKSB7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiBtYXggIiwgbWF4RXhwZWN0ZWQsIHNjcm9sbEJhci5nZXRNYXhpbXVtKCkpOwotCWFzc2VydEVxdWFscyhjYWxsKyIgbWluICIsIG1pbkV4cGVjdGVkLCBzY3JvbGxCYXIuZ2V0TWluaW11bSgpKTsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIHNlbCAiLCBzZWxlY3Rpb25FeHBlY3RlZCwgc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpKTsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIHRobWIgIiwgdGh1bWJFeHBlY3RlZCwgc2Nyb2xsQmFyLmdldFRodW1iKCkpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFRodW1iVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTExLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNywgMTAsIDEwMCwgNTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXswLCAxMCwgMTAwLCA1MCwgMTB9LAotezEsIDEwLCAxMDAsIDUwLCAxfSwKLXsyLCAxMCwgMTAwLCA1MCwgMn0sCi17MywgMTAsIDEwMCwgNTAsIDN9LAotezQsIDEwLCAxMDAsIDUwLCA0fSwKLXs1LCAxMCwgMTAwLCA1MCwgNX0sCi17NiwgMTAsIDEwMCwgNTAsIDZ9LAotezcsIDEwLCAxMDAsIDUwLCA3fSwKLXs4LCAxMCwgMTAwLCA1MCwgOH0sCi17OSwgMTAsIDEwMCwgNTAsIDl9LAotezEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExLCAxMCwgMTAwLCA1MCwgMTF9LAotezEyLCAxMCwgMTAwLCA1MCwgMTJ9LAotezEzLCAxMCwgMTAwLCA1MCwgMTN9LAotezE0LCAxMCwgMTAwLCA1MCwgMTR9LAotezE1LCAxMCwgMTAwLCA1MCwgMTV9LAotezE2LCAxMCwgMTAwLCA1MCwgMTZ9LAotezE3LCAxMCwgMTAwLCA1MCwgMTd9LAotezE4LCAxMCwgMTAwLCA1MCwgMTh9LAotezE5LCAxMCwgMTAwLCA1MCwgMTl9LAotezIwLCAxMCwgMTAwLCA1MCwgMjB9LAotezIxLCAxMCwgMTAwLCA1MCwgMjF9LAotezIyLCAxMCwgMTAwLCA1MCwgMjJ9LAotezIzLCAxMCwgMTAwLCA1MCwgMjN9LAotezI0LCAxMCwgMTAwLCA1MCwgMjR9LAotezI1LCAxMCwgMTAwLCA1MCwgMjV9LAotezI2LCAxMCwgMTAwLCA1MCwgMjZ9LAotezI3LCAxMCwgMTAwLCA1MCwgMjd9LAotezI4LCAxMCwgMTAwLCA1MCwgMjh9LAotezI5LCAxMCwgMTAwLCA1MCwgMjl9LAotezMwLCAxMCwgMTAwLCA1MCwgMzB9LAotezMxLCAxMCwgMTAwLCA1MCwgMzF9LAotezMyLCAxMCwgMTAwLCA1MCwgMzJ9LAotezMzLCAxMCwgMTAwLCA1MCwgMzN9LAotezM0LCAxMCwgMTAwLCA1MCwgMzR9LAotezM1LCAxMCwgMTAwLCA1MCwgMzV9LAotezM2LCAxMCwgMTAwLCA1MCwgMzZ9LAotezM3LCAxMCwgMTAwLCA1MCwgMzd9LAotezM4LCAxMCwgMTAwLCA1MCwgMzh9LAotezM5LCAxMCwgMTAwLCA1MCwgMzl9LAotezQwLCAxMCwgMTAwLCA1MCwgNDB9LAotezQxLCAxMCwgMTAwLCA1MCwgNDF9LAotezQyLCAxMCwgMTAwLCA1MCwgNDJ9LAotezQzLCAxMCwgMTAwLCA1MCwgNDN9LAotezQ0LCAxMCwgMTAwLCA1MCwgNDR9LAotezQ1LCAxMCwgMTAwLCA1MCwgNDV9LAotezQ2LCAxMCwgMTAwLCA1MCwgNDZ9LAotezQ3LCAxMCwgMTAwLCA1MCwgNDd9LAotezQ4LCAxMCwgMTAwLCA1MCwgNDh9LAotezQ5LCAxMCwgMTAwLCA1MCwgNDl9LAotezUwLCAxMCwgMTAwLCA1MCwgNTB9LAotezUxLCAxMCwgMTAwLCA0OSwgNTF9LAotezUyLCAxMCwgMTAwLCA0OCwgNTJ9LAotezUzLCAxMCwgMTAwLCA0NywgNTN9LAotezU0LCAxMCwgMTAwLCA0NiwgNTR9LAotezU1LCAxMCwgMTAwLCA0NSwgNTV9LAotezU2LCAxMCwgMTAwLCA0NCwgNTZ9LAotezU3LCAxMCwgMTAwLCA0MywgNTd9LAotezU4LCAxMCwgMTAwLCA0MiwgNTh9LAotezU5LCAxMCwgMTAwLCA0MSwgNTl9LAotezYwLCAxMCwgMTAwLCA0MCwgNjB9LAotezYxLCAxMCwgMTAwLCAzOSwgNjF9LAotezYyLCAxMCwgMTAwLCAzOCwgNjJ9LAotezYzLCAxMCwgMTAwLCAzNywgNjN9LAotezY0LCAxMCwgMTAwLCAzNiwgNjR9LAotezY1LCAxMCwgMTAwLCAzNSwgNjV9LAotezY2LCAxMCwgMTAwLCAzNCwgNjZ9LAotezY3LCAxMCwgMTAwLCAzMywgNjd9LAotezY4LCAxMCwgMTAwLCAzMiwgNjh9LAotezY5LCAxMCwgMTAwLCAzMSwgNjl9LAotezcwLCAxMCwgMTAwLCAzMCwgNzB9LAotezcxLCAxMCwgMTAwLCAyOSwgNzF9LAotezcyLCAxMCwgMTAwLCAyOCwgNzJ9LAotezczLCAxMCwgMTAwLCAyNywgNzN9LAotezc0LCAxMCwgMTAwLCAyNiwgNzR9LAotezc1LCAxMCwgMTAwLCAyNSwgNzV9LAotezc2LCAxMCwgMTAwLCAyNCwgNzZ9LAotezc3LCAxMCwgMTAwLCAyMywgNzd9LAotezc4LCAxMCwgMTAwLCAyMiwgNzh9LAotezc5LCAxMCwgMTAwLCAyMSwgNzl9LAotezgwLCAxMCwgMTAwLCAyMCwgODB9LAotezgxLCAxMCwgMTAwLCAxOSwgODF9LAotezgyLCAxMCwgMTAwLCAxOCwgODJ9LAotezgzLCAxMCwgMTAwLCAxNywgODN9LAotezg0LCAxMCwgMTAwLCAxNiwgODR9LAotezg1LCAxMCwgMTAwLCAxNSwgODV9LAotezg2LCAxMCwgMTAwLCAxNCwgODZ9LAotezg3LCAxMCwgMTAwLCAxMywgODd9LAotezg4LCAxMCwgMTAwLCAxMiwgODh9LAotezg5LCAxMCwgMTAwLCAxMSwgODl9LAotezkwLCAxMCwgMTAwLCAxMCwgOTB9LAotezkxLCAxMCwgMTAwLCAxMCwgOTB9LAotezkyLCAxMCwgMTAwLCAxMCwgOTB9LAotezkzLCAxMCwgMTAwLCAxMCwgOTB9LAotezk0LCAxMCwgMTAwLCAxMCwgOTB9LAotezk1LCAxMCwgMTAwLCAxMCwgOTB9LAotezk2LCAxMCwgMTAwLCAxMCwgOTB9LAotezk3LCAxMCwgMTAwLCAxMCwgOTB9LAotezk4LCAxMCwgMTAwLCAxMCwgOTB9LAotezk5LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDEsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAyLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDQsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA1LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDcsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA4LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwOSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTAsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTExLCAxMCwgMTAwLCAxMCwgOTB9LAotezExMiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTMsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE0LCAxMCwgMTAwLCAxMCwgOTB9LAotezExNSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTYsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE3LCAxMCwgMTAwLCAxMCwgOTB9LAotezExOCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTksIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIwLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjIsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIzLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyNCwgMTAsIDEwMCwgMTAsIDkwfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWluaW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTksIDEwLCAxMDAsIDUwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MCwgMCwgMTAwLCA1MCwgMTB9LAotezEsIDEsIDEwMCwgNTAsIDEwfSwKLXsyLCAyLCAxMDAsIDUwLCAxMH0sCi17MywgMywgMTAwLCA1MCwgMTB9LAotezQsIDQsIDEwMCwgNTAsIDEwfSwKLXs1LCA1LCAxMDAsIDUwLCAxMH0sCi17NiwgNiwgMTAwLCA1MCwgMTB9LAotezcsIDcsIDEwMCwgNTAsIDEwfSwKLXs4LCA4LCAxMDAsIDUwLCAxMH0sCi17OSwgOSwgMTAwLCA1MCwgMTB9LAotezEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExLCAxMSwgMTAwLCA1MCwgMTB9LAotezEyLCAxMiwgMTAwLCA1MCwgMTB9LAotezEzLCAxMywgMTAwLCA1MCwgMTB9LAotezE0LCAxNCwgMTAwLCA1MCwgMTB9LAotezE1LCAxNSwgMTAwLCA1MCwgMTB9LAotezE2LCAxNiwgMTAwLCA1MCwgMTB9LAotezE3LCAxNywgMTAwLCA1MCwgMTB9LAotezE4LCAxOCwgMTAwLCA1MCwgMTB9LAotezE5LCAxOSwgMTAwLCA1MCwgMTB9LAotezIwLCAyMCwgMTAwLCA1MCwgMTB9LAotezIxLCAyMSwgMTAwLCA1MCwgMTB9LAotezIyLCAyMiwgMTAwLCA1MCwgMTB9LAotezIzLCAyMywgMTAwLCA1MCwgMTB9LAotezI0LCAyNCwgMTAwLCA1MCwgMTB9LAotezI1LCAyNSwgMTAwLCA1MCwgMTB9LAotezI2LCAyNiwgMTAwLCA1MCwgMTB9LAotezI3LCAyNywgMTAwLCA1MCwgMTB9LAotezI4LCAyOCwgMTAwLCA1MCwgMTB9LAotezI5LCAyOSwgMTAwLCA1MCwgMTB9LAotezMwLCAzMCwgMTAwLCA1MCwgMTB9LAotezMxLCAzMSwgMTAwLCA1MCwgMTB9LAotezMyLCAzMiwgMTAwLCA1MCwgMTB9LAotezMzLCAzMywgMTAwLCA1MCwgMTB9LAotezM0LCAzNCwgMTAwLCA1MCwgMTB9LAotezM1LCAzNSwgMTAwLCA1MCwgMTB9LAotezM2LCAzNiwgMTAwLCA1MCwgMTB9LAotezM3LCAzNywgMTAwLCA1MCwgMTB9LAotezM4LCAzOCwgMTAwLCA1MCwgMTB9LAotezM5LCAzOSwgMTAwLCA1MCwgMTB9LAotezQwLCA0MCwgMTAwLCA1MCwgMTB9LAotezQxLCA0MSwgMTAwLCA1MCwgMTB9LAotezQyLCA0MiwgMTAwLCA1MCwgMTB9LAotezQzLCA0MywgMTAwLCA1MCwgMTB9LAotezQ0LCA0NCwgMTAwLCA1MCwgMTB9LAotezQ1LCA0NSwgMTAwLCA1MCwgMTB9LAotezQ2LCA0NiwgMTAwLCA1MCwgMTB9LAotezQ3LCA0NywgMTAwLCA1MCwgMTB9LAotezQ4LCA0OCwgMTAwLCA1MCwgMTB9LAotezQ5LCA0OSwgMTAwLCA1MCwgMTB9LAotezUwLCA1MCwgMTAwLCA1MCwgMTB9LAotezUxLCA1MSwgMTAwLCA1MSwgMTB9LAotezUyLCA1MiwgMTAwLCA1MiwgMTB9LAotezUzLCA1MywgMTAwLCA1MywgMTB9LAotezU0LCA1NCwgMTAwLCA1NCwgMTB9LAotezU1LCA1NSwgMTAwLCA1NSwgMTB9LAotezU2LCA1NiwgMTAwLCA1NiwgMTB9LAotezU3LCA1NywgMTAwLCA1NywgMTB9LAotezU4LCA1OCwgMTAwLCA1OCwgMTB9LAotezU5LCA1OSwgMTAwLCA1OSwgMTB9LAotezYwLCA2MCwgMTAwLCA2MCwgMTB9LAotezYxLCA2MSwgMTAwLCA2MSwgMTB9LAotezYyLCA2MiwgMTAwLCA2MiwgMTB9LAotezYzLCA2MywgMTAwLCA2MywgMTB9LAotezY0LCA2NCwgMTAwLCA2NCwgMTB9LAotezY1LCA2NSwgMTAwLCA2NSwgMTB9LAotezY2LCA2NiwgMTAwLCA2NiwgMTB9LAotezY3LCA2NywgMTAwLCA2NywgMTB9LAotezY4LCA2OCwgMTAwLCA2OCwgMTB9LAotezY5LCA2OSwgMTAwLCA2OSwgMTB9LAotezcwLCA3MCwgMTAwLCA3MCwgMTB9LAotezcxLCA3MSwgMTAwLCA3MSwgMTB9LAotezcyLCA3MiwgMTAwLCA3MiwgMTB9LAotezczLCA3MywgMTAwLCA3MywgMTB9LAotezc0LCA3NCwgMTAwLCA3NCwgMTB9LAotezc1LCA3NSwgMTAwLCA3NSwgMTB9LAotezc2LCA3NiwgMTAwLCA3NiwgMTB9LAotezc3LCA3NywgMTAwLCA3NywgMTB9LAotezc4LCA3OCwgMTAwLCA3OCwgMTB9LAotezc5LCA3OSwgMTAwLCA3OSwgMTB9LAotezgwLCA4MCwgMTAwLCA4MCwgMTB9LAotezgxLCA4MSwgMTAwLCA4MSwgMTB9LAotezgyLCA4MiwgMTAwLCA4MiwgMTB9LAotezgzLCA4MywgMTAwLCA4MywgMTB9LAotezg0LCA4NCwgMTAwLCA4NCwgMTB9LAotezg1LCA4NSwgMTAwLCA4NSwgMTB9LAotezg2LCA4NiwgMTAwLCA4NiwgMTB9LAotezg3LCA4NywgMTAwLCA4NywgMTB9LAotezg4LCA4OCwgMTAwLCA4OCwgMTB9LAotezg5LCA4OSwgMTAwLCA4OSwgMTB9LAotezkwLCA5MCwgMTAwLCA5MCwgMTB9LAotezkxLCA5MSwgMTAwLCA5MSwgOX0sCi17OTIsIDkyLCAxMDAsIDkyLCA4fSwKLXs5MywgOTMsIDEwMCwgOTMsIDd9LAotezk0LCA5NCwgMTAwLCA5NCwgNn0sCi17OTUsIDk1LCAxMDAsIDk1LCA1fSwKLXs5NiwgOTYsIDEwMCwgOTYsIDR9LAotezk3LCA5NywgMTAwLCA5NywgM30sCi17OTgsIDk4LCAxMDAsIDk4LCAyfSwKLXs5OSwgOTksIDEwMCwgOTksIDF9LAotezEwMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAyLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwMywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDQsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA1LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDcsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA4LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTExLCAxMCwgMTAwLCA1MCwgMTB9LAotezExMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotezExNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE3LCAxMCwgMTAwLCA1MCwgMTB9LAotezExOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTksIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIwLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIzLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyNCwgMTAsIDEwMCwgNTAsIDEwfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWF4aW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTksIDEwLCAxMDAsIDUwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxLCAxMCwgMTAwLCA1MCwgMTB9LAotezIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MywgMTAsIDEwMCwgNTAsIDEwfSwKLXs0LCAxMCwgMTAwLCA1MCwgMTB9LAotezUsIDEwLCAxMDAsIDUwLCAxMH0sCi17NiwgMTAsIDEwMCwgNTAsIDEwfSwKLXs3LCAxMCwgMTAwLCA1MCwgMTB9LAotezgsIDEwLCAxMDAsIDUwLCAxMH0sCi17OSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMSwgMTAsIDExLCAxMCwgMX0sCi17MTIsIDEwLCAxMiwgMTAsIDJ9LAotezEzLCAxMCwgMTMsIDEwLCAzfSwKLXsxNCwgMTAsIDE0LCAxMCwgNH0sCi17MTUsIDEwLCAxNSwgMTAsIDV9LAotezE2LCAxMCwgMTYsIDEwLCA2fSwKLXsxNywgMTAsIDE3LCAxMCwgN30sCi17MTgsIDEwLCAxOCwgMTAsIDh9LAotezE5LCAxMCwgMTksIDEwLCA5fSwKLXsyMCwgMTAsIDIwLCAxMCwgMTB9LAotezIxLCAxMCwgMjEsIDExLCAxMH0sCi17MjIsIDEwLCAyMiwgMTIsIDEwfSwKLXsyMywgMTAsIDIzLCAxMywgMTB9LAotezI0LCAxMCwgMjQsIDE0LCAxMH0sCi17MjUsIDEwLCAyNSwgMTUsIDEwfSwKLXsyNiwgMTAsIDI2LCAxNiwgMTB9LAotezI3LCAxMCwgMjcsIDE3LCAxMH0sCi17MjgsIDEwLCAyOCwgMTgsIDEwfSwKLXsyOSwgMTAsIDI5LCAxOSwgMTB9LAotezMwLCAxMCwgMzAsIDIwLCAxMH0sCi17MzEsIDEwLCAzMSwgMjEsIDEwfSwKLXszMiwgMTAsIDMyLCAyMiwgMTB9LAotezMzLCAxMCwgMzMsIDIzLCAxMH0sCi17MzQsIDEwLCAzNCwgMjQsIDEwfSwKLXszNSwgMTAsIDM1LCAyNSwgMTB9LAotezM2LCAxMCwgMzYsIDI2LCAxMH0sCi17MzcsIDEwLCAzNywgMjcsIDEwfSwKLXszOCwgMTAsIDM4LCAyOCwgMTB9LAotezM5LCAxMCwgMzksIDI5LCAxMH0sCi17NDAsIDEwLCA0MCwgMzAsIDEwfSwKLXs0MSwgMTAsIDQxLCAzMSwgMTB9LAotezQyLCAxMCwgNDIsIDMyLCAxMH0sCi17NDMsIDEwLCA0MywgMzMsIDEwfSwKLXs0NCwgMTAsIDQ0LCAzNCwgMTB9LAotezQ1LCAxMCwgNDUsIDM1LCAxMH0sCi17NDYsIDEwLCA0NiwgMzYsIDEwfSwKLXs0NywgMTAsIDQ3LCAzNywgMTB9LAotezQ4LCAxMCwgNDgsIDM4LCAxMH0sCi17NDksIDEwLCA0OSwgMzksIDEwfSwKLXs1MCwgMTAsIDUwLCA0MCwgMTB9LAotezUxLCAxMCwgNTEsIDQxLCAxMH0sCi17NTIsIDEwLCA1MiwgNDIsIDEwfSwKLXs1MywgMTAsIDUzLCA0MywgMTB9LAotezU0LCAxMCwgNTQsIDQ0LCAxMH0sCi17NTUsIDEwLCA1NSwgNDUsIDEwfSwKLXs1NiwgMTAsIDU2LCA0NiwgMTB9LAotezU3LCAxMCwgNTcsIDQ3LCAxMH0sCi17NTgsIDEwLCA1OCwgNDgsIDEwfSwKLXs1OSwgMTAsIDU5LCA0OSwgMTB9LAotezYwLCAxMCwgNjAsIDUwLCAxMH0sCi17NjEsIDEwLCA2MSwgNTAsIDEwfSwKLXs2MiwgMTAsIDYyLCA1MCwgMTB9LAotezYzLCAxMCwgNjMsIDUwLCAxMH0sCi17NjQsIDEwLCA2NCwgNTAsIDEwfSwKLXs2NSwgMTAsIDY1LCA1MCwgMTB9LAotezY2LCAxMCwgNjYsIDUwLCAxMH0sCi17NjcsIDEwLCA2NywgNTAsIDEwfSwKLXs2OCwgMTAsIDY4LCA1MCwgMTB9LAotezY5LCAxMCwgNjksIDUwLCAxMH0sCi17NzAsIDEwLCA3MCwgNTAsIDEwfSwKLXs3MSwgMTAsIDcxLCA1MCwgMTB9LAotezcyLCAxMCwgNzIsIDUwLCAxMH0sCi17NzMsIDEwLCA3MywgNTAsIDEwfSwKLXs3NCwgMTAsIDc0LCA1MCwgMTB9LAotezc1LCAxMCwgNzUsIDUwLCAxMH0sCi17NzYsIDEwLCA3NiwgNTAsIDEwfSwKLXs3NywgMTAsIDc3LCA1MCwgMTB9LAotezc4LCAxMCwgNzgsIDUwLCAxMH0sCi17NzksIDEwLCA3OSwgNTAsIDEwfSwKLXs4MCwgMTAsIDgwLCA1MCwgMTB9LAotezgxLCAxMCwgODEsIDUwLCAxMH0sCi17ODIsIDEwLCA4MiwgNTAsIDEwfSwKLXs4MywgMTAsIDgzLCA1MCwgMTB9LAotezg0LCAxMCwgODQsIDUwLCAxMH0sCi17ODUsIDEwLCA4NSwgNTAsIDEwfSwKLXs4NiwgMTAsIDg2LCA1MCwgMTB9LAotezg3LCAxMCwgODcsIDUwLCAxMH0sCi17ODgsIDEwLCA4OCwgNTAsIDEwfSwKLXs4OSwgMTAsIDg5LCA1MCwgMTB9LAotezkwLCAxMCwgOTAsIDUwLCAxMH0sCi17OTEsIDEwLCA5MSwgNTAsIDEwfSwKLXs5MiwgMTAsIDkyLCA1MCwgMTB9LAotezkzLCAxMCwgOTMsIDUwLCAxMH0sCi17OTQsIDEwLCA5NCwgNTAsIDEwfSwKLXs5NSwgMTAsIDk1LCA1MCwgMTB9LAotezk2LCAxMCwgOTYsIDUwLCAxMH0sCi17OTcsIDEwLCA5NywgNTAsIDEwfSwKLXs5OCwgMTAsIDk4LCA1MCwgMTB9LAotezk5LCAxMCwgOTksIDUwLCAxMH0sCi17MTAwLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwMSwgMTAsIDEwMSwgNTAsIDEwfSwKLXsxMDIsIDEwLCAxMDIsIDUwLCAxMH0sCi17MTAzLCAxMCwgMTAzLCA1MCwgMTB9LAotezEwNCwgMTAsIDEwNCwgNTAsIDEwfSwKLXsxMDUsIDEwLCAxMDUsIDUwLCAxMH0sCi17MTA2LCAxMCwgMTA2LCA1MCwgMTB9LAotezEwNywgMTAsIDEwNywgNTAsIDEwfSwKLXsxMDgsIDEwLCAxMDgsIDUwLCAxMH0sCi17MTA5LCAxMCwgMTA5LCA1MCwgMTB9LAotezExMCwgMTAsIDExMCwgNTAsIDEwfSwKLXsxMTEsIDEwLCAxMTEsIDUwLCAxMH0sCi17MTEyLCAxMCwgMTEyLCA1MCwgMTB9LAotezExMywgMTAsIDExMywgNTAsIDEwfSwKLXsxMTQsIDEwLCAxMTQsIDUwLCAxMH0sCi17MTE1LCAxMCwgMTE1LCA1MCwgMTB9LAotezExNiwgMTAsIDExNiwgNTAsIDEwfSwKLXsxMTcsIDEwLCAxMTcsIDUwLCAxMH0sCi17MTE4LCAxMCwgMTE4LCA1MCwgMTB9LAotezExOSwgMTAsIDExOSwgNTAsIDEwfSwKLXsxMjAsIDEwLCAxMjAsIDUwLCAxMH0sCi17MTIxLCAxMCwgMTIxLCA1MCwgMTB9LAotezEyMiwgMTAsIDEyMiwgNTAsIDEwfSwKLXsxMjMsIDEwLCAxMjMsIDUwLCAxMH0sCi17MTI0LCAxMCwgMTI0LCA1MCwgMTB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBzZXREZWZhdWx0cygpIHsKLQlzY3JvbGxCYXIuc2V0TWF4aW11bSgxMDApOwotCXNjcm9sbEJhci5zZXRNaW5pbXVtKDEwKTsKLQlzY3JvbGxCYXIuc2V0VGh1bWIoMTApOwotCXNjcm9sbEJhci5zZXRTZWxlY3Rpb24oNTApOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFNlbGVjdGlvblZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCAxMCwgMTB9LAotey0xNCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTksIDEwLCAxMDAsIDEwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDEwLCAxMH0sCi17MCwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxLCAxMCwgMTAwLCAxMCwgMTB9LAotezIsIDEwLCAxMDAsIDEwLCAxMH0sCi17MywgMTAsIDEwMCwgMTAsIDEwfSwKLXs0LCAxMCwgMTAwLCAxMCwgMTB9LAotezUsIDEwLCAxMDAsIDEwLCAxMH0sCi17NiwgMTAsIDEwMCwgMTAsIDEwfSwKLXs3LCAxMCwgMTAwLCAxMCwgMTB9LAotezgsIDEwLCAxMDAsIDEwLCAxMH0sCi17OSwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxMSwgMTAsIDEwMCwgMTEsIDEwfSwKLXsxMiwgMTAsIDEwMCwgMTIsIDEwfSwKLXsxMywgMTAsIDEwMCwgMTMsIDEwfSwKLXsxNCwgMTAsIDEwMCwgMTQsIDEwfSwKLXsxNSwgMTAsIDEwMCwgMTUsIDEwfSwKLXsxNiwgMTAsIDEwMCwgMTYsIDEwfSwKLXsxNywgMTAsIDEwMCwgMTcsIDEwfSwKLXsxOCwgMTAsIDEwMCwgMTgsIDEwfSwKLXsxOSwgMTAsIDEwMCwgMTksIDEwfSwKLXsyMCwgMTAsIDEwMCwgMjAsIDEwfSwKLXsyMSwgMTAsIDEwMCwgMjEsIDEwfSwKLXsyMiwgMTAsIDEwMCwgMjIsIDEwfSwKLXsyMywgMTAsIDEwMCwgMjMsIDEwfSwKLXsyNCwgMTAsIDEwMCwgMjQsIDEwfSwKLXsyNSwgMTAsIDEwMCwgMjUsIDEwfSwKLXsyNiwgMTAsIDEwMCwgMjYsIDEwfSwKLXsyNywgMTAsIDEwMCwgMjcsIDEwfSwKLXsyOCwgMTAsIDEwMCwgMjgsIDEwfSwKLXsyOSwgMTAsIDEwMCwgMjksIDEwfSwKLXszMCwgMTAsIDEwMCwgMzAsIDEwfSwKLXszMSwgMTAsIDEwMCwgMzEsIDEwfSwKLXszMiwgMTAsIDEwMCwgMzIsIDEwfSwKLXszMywgMTAsIDEwMCwgMzMsIDEwfSwKLXszNCwgMTAsIDEwMCwgMzQsIDEwfSwKLXszNSwgMTAsIDEwMCwgMzUsIDEwfSwKLXszNiwgMTAsIDEwMCwgMzYsIDEwfSwKLXszNywgMTAsIDEwMCwgMzcsIDEwfSwKLXszOCwgMTAsIDEwMCwgMzgsIDEwfSwKLXszOSwgMTAsIDEwMCwgMzksIDEwfSwKLXs0MCwgMTAsIDEwMCwgNDAsIDEwfSwKLXs0MSwgMTAsIDEwMCwgNDEsIDEwfSwKLXs0MiwgMTAsIDEwMCwgNDIsIDEwfSwKLXs0MywgMTAsIDEwMCwgNDMsIDEwfSwKLXs0NCwgMTAsIDEwMCwgNDQsIDEwfSwKLXs0NSwgMTAsIDEwMCwgNDUsIDEwfSwKLXs0NiwgMTAsIDEwMCwgNDYsIDEwfSwKLXs0NywgMTAsIDEwMCwgNDcsIDEwfSwKLXs0OCwgMTAsIDEwMCwgNDgsIDEwfSwKLXs0OSwgMTAsIDEwMCwgNDksIDEwfSwKLXs1MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs1MSwgMTAsIDEwMCwgNTEsIDEwfSwKLXs1MiwgMTAsIDEwMCwgNTIsIDEwfSwKLXs1MywgMTAsIDEwMCwgNTMsIDEwfSwKLXs1NCwgMTAsIDEwMCwgNTQsIDEwfSwKLXs1NSwgMTAsIDEwMCwgNTUsIDEwfSwKLXs1NiwgMTAsIDEwMCwgNTYsIDEwfSwKLXs1NywgMTAsIDEwMCwgNTcsIDEwfSwKLXs1OCwgMTAsIDEwMCwgNTgsIDEwfSwKLXs1OSwgMTAsIDEwMCwgNTksIDEwfSwKLXs2MCwgMTAsIDEwMCwgNjAsIDEwfSwKLXs2MSwgMTAsIDEwMCwgNjEsIDEwfSwKLXs2MiwgMTAsIDEwMCwgNjIsIDEwfSwKLXs2MywgMTAsIDEwMCwgNjMsIDEwfSwKLXs2NCwgMTAsIDEwMCwgNjQsIDEwfSwKLXs2NSwgMTAsIDEwMCwgNjUsIDEwfSwKLXs2NiwgMTAsIDEwMCwgNjYsIDEwfSwKLXs2NywgMTAsIDEwMCwgNjcsIDEwfSwKLXs2OCwgMTAsIDEwMCwgNjgsIDEwfSwKLXs2OSwgMTAsIDEwMCwgNjksIDEwfSwKLXs3MCwgMTAsIDEwMCwgNzAsIDEwfSwKLXs3MSwgMTAsIDEwMCwgNzEsIDEwfSwKLXs3MiwgMTAsIDEwMCwgNzIsIDEwfSwKLXs3MywgMTAsIDEwMCwgNzMsIDEwfSwKLXs3NCwgMTAsIDEwMCwgNzQsIDEwfSwKLXs3NSwgMTAsIDEwMCwgNzUsIDEwfSwKLXs3NiwgMTAsIDEwMCwgNzYsIDEwfSwKLXs3NywgMTAsIDEwMCwgNzcsIDEwfSwKLXs3OCwgMTAsIDEwMCwgNzgsIDEwfSwKLXs3OSwgMTAsIDEwMCwgNzksIDEwfSwKLXs4MCwgMTAsIDEwMCwgODAsIDEwfSwKLXs4MSwgMTAsIDEwMCwgODEsIDEwfSwKLXs4MiwgMTAsIDEwMCwgODIsIDEwfSwKLXs4MywgMTAsIDEwMCwgODMsIDEwfSwKLXs4NCwgMTAsIDEwMCwgODQsIDEwfSwKLXs4NSwgMTAsIDEwMCwgODUsIDEwfSwKLXs4NiwgMTAsIDEwMCwgODYsIDEwfSwKLXs4NywgMTAsIDEwMCwgODcsIDEwfSwKLXs4OCwgMTAsIDEwMCwgODgsIDEwfSwKLXs4OSwgMTAsIDEwMCwgODksIDEwfSwKLXs5MCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MSwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MiwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MywgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NSwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NiwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NywgMTAsIDEwMCwgOTAsIDEwfSwKLXs5OCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5OSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDAsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAxLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDMsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA0LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDYsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA3LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwOCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDksIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEwLCAxMCwgMTAwLCA5MCwgMTB9LAotezExMSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTIsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEzLCAxMCwgMTAwLCA5MCwgMTB9LAotezExNCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTUsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE2LCAxMCwgMTAwLCA5MCwgMTB9LAotezExNywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTgsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE5LCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjEsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIyLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjQsIDEwLCAxMDAsIDkwLCAxMH0sCi19OwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTk5ZmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxhYmxlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQkvLyBhYnN0cmFjdCBjbGFzcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpIHsKLQlzY3JvbGxhYmxlLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jc2Nyb2xsYWJsZS5nZXRDbGllbnRBcmVhKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SG9yaXpvbnRhbEJhcigpIHsKLQlzY3JvbGxhYmxlLmdldEhvcml6b250YWxCYXIoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWZXJ0aWNhbEJhcigpIHsKLQlzY3JvbGxhYmxlLmdldFZlcnRpY2FsQmFyKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SG9yaXpvbnRhbEJhciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmVydGljYWxCYXIiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpKSB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhvcml6b250YWxCYXIiKSkgdGVzdF9nZXRIb3Jpem9udGFsQmFyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWZXJ0aWNhbEJhciIpKSB0ZXN0X2dldFZlcnRpY2FsQmFyKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotCVNjcm9sbGFibGUgc2Nyb2xsYWJsZTsKLQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0Jc2Nyb2xsYWJsZSA9IChTY3JvbGxhYmxlKXc7Ci0Jc3VwZXIuc2V0V2lkZ2V0KHcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiY2U4Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdGVzdFNoZWxsID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHNoZWxsKTsKLQlhc3NlcnRUcnVlKHRlc3RTaGVsbC5nZXRQYXJlbnQoKSA9PSBzaGVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoKTsKLQlhc3NlcnROb3ROdWxsKCJhOiAiLCBuZXdTaGVsbC5nZXREaXNwbGF5KCkpOwotCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JLyogdGhpcyBzaG91bGQgdGVzdCB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBTVFlMRSBiaXRzLCBmb3Igbm93IGp1c3QgdGVzdCBpbmRpdmlkdWFsIGJpdHMgKi8KLQlpbnRbXSBjYXNlcyA9IHtTV1QuTk9fVFJJTSwgU1dULlJFU0laRSwgU1dULlRJVExFLCBTV1QuQ0xPU0UsIFNXVC5NRU5VLCBTV1QuTUlOLCBTV1QuQk9SREVSLCAKLQkJCQkgICBTV1QuQ0xJUF9DSElMRFJFTiwgU1dULkNMSVBfU0lCTElOR1MsIFNXVC5PTl9UT1AsIFNXVC5GTEFULCBTV1QuU01PT1RIfTsKLQlTaGVsbCBuZXdTaGVsbDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCW5ld1NoZWxsID0gbmV3IFNoZWxsKGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiYSAiICtpLCBuZXdTaGVsbC5nZXREaXNwbGF5KCkgPT0gc2hlbGwuZ2V0RGlzcGxheSgpKTsKLQkJbmV3U2hlbGwuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KCkgewotCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkoKTsKLQlTaGVsbCBuZXdTaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlhc3NlcnRUcnVlKCJhOiAiLCBuZXdTaGVsbC5nZXREaXNwbGF5KCkgPT0gZGlzcGxheSk7Ci0JbmV3U2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJKCkgewotCWludFtdIGNhc2VzID0ge1NXVC5OT19UUklNLCBTV1QuUkVTSVpFLCBTV1QuVElUTEUsIFNXVC5DTE9TRSwgU1dULk1FTlUsIFNXVC5NSU4sIFNXVC5CT1JERVIsIAotCQkJCSAgIFNXVC5DTElQX0NISUxEUkVOLCBTV1QuQ0xJUF9TSUJMSU5HUywgU1dULk9OX1RPUCwgU1dULkZMQVQsIFNXVC5TTU9PVEh9OwotCVNoZWxsIG5ld1NoZWxsOwotCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCW5ld1NoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiYSAiICtpLCBuZXdTaGVsbC5nZXREaXNwbGF5KCkgPT0gc2hlbGwuZ2V0RGlzcGxheSgpKTsKLQkJbmV3U2hlbGwuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQlTaGVsbCBuZXdTaGVsbCA9IG5ldyBTaGVsbChzaGVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiYTogIiwgbmV3U2hlbGwuZ2V0UGFyZW50KCkgPT0gc2hlbGwpOwotCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0JLyogdGhpcyBzaG91bGQgdGVzdCB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBTVFlMRSBiaXRzLCBmb3Igbm93IGp1c3QgdGVzdCBpbmRpdmlkdWFsIGJpdHMgKi8KLQlpbnRbXSBjYXNlcyA9IHtTV1QuTk9fVFJJTSwgU1dULlJFU0laRSwgU1dULlRJVExFLCBTV1QuQ0xPU0UsIFNXVC5NRU5VLCBTV1QuTUlOLCBTV1QuQk9SREVSLCAKLQkJCQkgICBTV1QuQ0xJUF9DSElMRFJFTiwgU1dULkNMSVBfU0lCTElOR1MsIFNXVC5PTl9UT1AsIFNXVC5GTEFULCBTV1QuU01PT1RIfTsKLQlTaGVsbCBuZXdTaGVsbDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCW5ld1NoZWxsID0gbmV3IFNoZWxsKHNoZWxsLCBjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoImEgIiAraSwgbmV3U2hlbGwuZ2V0UGFyZW50KCkgPT0gc2hlbGwpOwotCQluZXdTaGVsbC5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTaGVsbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNoZWxsTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNoZWxsQWN0aXZhdGVkKFNoZWxsRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNoZWxsRGVhY3RpdmF0ZWQoU2hlbGxFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2hlbGxEZWljb25pZmllZChTaGVsbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaGVsbEljb25pZmllZChTaGVsbEV2ZW50IGUpIHsKLQkJfQotCX07Ci0JdHJ5IHsKLQkJc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKGxpc3RlbmVyKTsKLQlzaGVsbC5mb3JjZUFjdGl2ZSgpOwotCS8qIGNhbid0IGFzc3VtZSBsaXN0ZW5lciBpcyBzeW5jaHJvbm91c2x5IGNhbGxlZCB3aGVuIGZvcmNlQWN0aXZlIHJldHVybmVkICovCi0JLyogYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gdHJ1ZSk7ICovCi0JCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlzaGVsbC5yZW1vdmVTaGVsbExpc3RlbmVyKGxpc3RlbmVyKTsKLQlzaGVsbC5mb3JjZUFjdGl2ZSgpOwotCS8qIGNhbid0IGFzc3VtZSBsaXN0ZW5lciBpcyBzeW5jaHJvbm91c2x5IGNhbGxlZCB3aGVuIGZvcmNlQWN0aXZlIHJldHVybmVkICovCi0JLyogYXNzZXJ0VHJ1ZSgiOmI6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOyAqLwotCXRyeSB7Ci0JCXNoZWxsLnJlbW92ZVNoZWxsTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7Ci0KLQkvLyBib2d1cyBsaW5lIHRoYXQgJ2VuYWJsZWQnIGdwZnMKLQkvLwlTaGVsbCBuZXdTaGVsbCA9IG5ldyBTaGVsbCgpOwotCXRlc3RTaGVsbC5zZXRCb3VuZHMoMjAsMzAsMjAwLCAyMDApOwotCXRlc3RTaGVsbC5vcGVuKCk7Ci0JdGVzdFNoZWxsLmNsb3NlKCk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDIwLDMwLDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQlTaGVsbCBuZXdTaGVsbCA9IG5ldyBTaGVsbCgpOwotCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9mb3JjZUFjdGl2ZSgpIHsKLQlzaGVsbC5mb3JjZUFjdGl2ZSgpOwotCS8qIGNhbid0IGFzc3VtZSBsaXN0ZW5lciBpcyBzeW5jaHJvbm91c2x5IGNhbGxlZCB3aGVuIGZvcmNlQWN0aXZlIHJldHVybmVkICovCi0JLyogYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2hlbGwuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkgPT0gc2hlbGwpOyAqLwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRCb3VuZHNJSUlJIGFuZCB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQlhc3NlcnRUcnVlKCI6YTA6Iiwgc2hlbGwuZ2V0RW5hYmxlZCgpKTsKLQlzaGVsbC5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YToiLCAhc2hlbGwuZ2V0RW5hYmxlZCgpKTsKLQlzaGVsbC5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoIjpiOiIsIHNoZWxsLmdldEVuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1lSW5wdXRNb2RlKCkgewotCWludCBtb2RlID0gc2hlbGwuZ2V0SW1lSW5wdXRNb2RlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbW9kZSA+PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbigpIHsKLQlzaGVsbC5zZXRMb2NhdGlvbigxMCwxNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2hlbGwuZ2V0TG9jYXRpb24oKS54ID09IDEwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzaGVsbC5nZXRMb2NhdGlvbigpLnkgPT0gMTUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJlZ2lvbigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRSZWdpb24oKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNoZWxsKCkgewotCWFzc2VydFRydWUoIjphOiIsIHNoZWxsLmdldFNoZWxsKCk9PXNoZWxsKTsKLQlTaGVsbCBzaGVsbF8xID0gbmV3IFNoZWxsKHNoZWxsKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzaGVsbF8xLmdldFNoZWxsKCk9PSBzaGVsbF8xKTsKLQlzaGVsbF8xLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaGVsbHMoKSB7Ci0JaW50IG51bSA9IHNoZWxsLmdldFNoZWxscygpLmxlbmd0aDsKLQlhc3NlcnRUcnVlKCI6YToiLCBudW0gPT0gMSk7Ci0JU2hlbGwgc2hlbGxfMSA9IG5ldyBTaGVsbChzaGVsbCk7Ci0JbnVtID0gc2hlbGwuZ2V0U2hlbGxzKCkubGVuZ3RoOwotCWFzc2VydFRydWUoIjphOiIsIG51bSA9PSAyKTsKLQlzaGVsbF8xLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VuYWJsZWQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2hlbGwuaXNFbmFibGVkKCkpOwotCXNoZWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsICFzaGVsbC5pc0VuYWJsZWQoKSk7Ci0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKQotCQlhc3NlcnRUcnVlKCI6YjE6IiwgIXRlc3RTaGVsbC5pc0VuYWJsZWQoKSk7Ci0Jc2hlbGwuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzaGVsbC5pc0VuYWJsZWQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGVzdFNoZWxsLmlzRW5hYmxlZCgpKTsKLQl0ZXN0U2hlbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgIXRlc3RTaGVsbC5pc0VuYWJsZWQoKSk7Ci0JdGVzdFNoZWxsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGVzdFNoZWxsLmlzRW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuKCkgewotCXNoZWxsLm9wZW4oKTsKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiByZW1vdmVTaGVsbExpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFjdGl2ZSgpIHsKLQkvKiBDcmVhdGUgc2hlbGwyIGFuZCBtYWtlIGl0IGFjdGl2ZS4gKi8KLQlTaGVsbCBzaGVsbDIgPSBuZXcgU2hlbGwoKTsKLQlzaGVsbDIub3BlbigpOwotCQotCS8qIFRlc3Qgc2V0QWN0aXZlIGZvciB2aXNpYmxlIHNoZWxsLiAqLwotCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0Jc2hlbGwuc2V0QWN0aXZlKCk7Ci0JYXNzZXJ0VHJ1ZSgidmlzaWJsZSBzaGVsbCB3YXMgbm90IG1hZGUgYWN0aXZlIiwgc2hlbGwuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkgPT0gc2hlbGwpOwotCQotCS8qIFRlc3Qgc2V0QWN0aXZlIGZvciB2aXNpYmxlIGRpYWxvZyBzaGVsbC4gKi8KLQlzaGVsbDIuc2V0QWN0aXZlKCk7Ci0JdGVzdFNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JdGVzdFNoZWxsLnNldEFjdGl2ZSgpOwotCWFzc2VydFRydWUoInZpc2libGUgZGlhbG9nIHNoZWxsIHdhcyBub3QgbWFkZSBhY3RpdmUiLCB0ZXN0U2hlbGwuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkgPT0gdGVzdFNoZWxsKTsKLQkKLQkvKiBUZXN0IHNldEFjdGl2ZSBmb3Igbm9uLXZpc2libGUgc2hlbGwuICovCi0Jc2hlbGwyLnNldEFjdGl2ZSgpOwotCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCXNoZWxsLnNldEFjdGl2ZSgpOwotCWFzc2VydFRydWUoIm5vbi12aXNpYmxlIHNoZWxsIHdhcyBtYWRlIGFjdGl2ZSIsIHNoZWxsLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpICE9IHNoZWxsKTsKLQotCS8qIFRlc3Qgc2V0QWN0aXZlIGZvciBub24tdmlzaWJsZSBkaWFsb2cgc2hlbGwuICovCi0Jc2hlbGwyLnNldEFjdGl2ZSgpOwotCXRlc3RTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQl0ZXN0U2hlbGwuc2V0QWN0aXZlKCk7Ci0JYXNzZXJ0VHJ1ZSgibm9uLXZpc2libGUgZGlhbG9nIHNoZWxsIHdhcyBtYWRlIGFjdGl2ZSIsIHRlc3RTaGVsbC5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSAhPSB0ZXN0U2hlbGwpOwotCQotCXNoZWxsMi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0JLy8gdGVzdGVkIGluIGdldEVuYWJsZWQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1lSW5wdXRNb2RlSSgpIHsKLQlzaGVsbC5zZXRJbWVJbnB1dE1vZGUoU1dULk5PTkUpOwotCWFzc2VydFRydWUoIjphOiIsIHNoZWxsLmdldEltZUlucHV0TW9kZSgpID09IFNXVC5OT05FKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSZWdpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UmVnaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWaXNpYmxlWigpIHsKLQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YToiLCAhc2hlbGwuaXNWaXNpYmxlKCkpOwotCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2hlbGwuaXNWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCS8vdGhlc2UgbXVzdCBiZSBydW4gYmVmb3JlIHRoZSBzaGVsbCB0ZXN0cyBiZWNhdXNlIG9mIHByIDc5NTA0Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9JY29uaWZ5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9DbG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfT3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQkKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvcmNlQWN0aXZlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltZUlucHV0TW9kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNoZWxscyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWN0aXZlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1lSW5wdXRNb2RlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVnaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lciIpKSB0ZXN0X2FkZFNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9zZSIpKSB0ZXN0X2Nsb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9yY2VBY3RpdmUiKSkgdGVzdF9mb3JjZUFjdGl2ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1lSW5wdXRNb2RlIikpIHRlc3RfZ2V0SW1lSW5wdXRNb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbiIpKSB0ZXN0X2dldExvY2F0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSZWdpb24iKSkgdGVzdF9nZXRSZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNoZWxsIikpIHRlc3RfZ2V0U2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNoZWxscyIpKSB0ZXN0X2dldFNoZWxscygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNFbmFibGVkIikpIHRlc3RfaXNFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWN0aXZlIikpIHRlc3Rfc2V0QWN0aXZlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWVJbnB1dE1vZGVJIikpIHRlc3Rfc2V0SW1lSW5wdXRNb2RlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UmVnaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKSkgdGVzdF9zZXRSZWdpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9JY29uaWZ5IikpIHRlc3RfY29uc2lzdGVuY3lfSWNvbmlmeSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfQ2xvc2UiKSkgdGVzdF9jb25zaXN0ZW5jeV9DbG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRGlzcG9zZSIpKSB0ZXN0X2NvbnNpc3RlbmN5X0Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X09wZW4iKSkgdGVzdF9jb25zaXN0ZW5jeV9PcGVuKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQgKCkgewotCS8vIG92ZXJyaWRpbmcgQ29udHJvbC50ZXN0X2dldFBhcmVudAotCWFzc2VydFRydWUoc2hlbGwuZ2V0UGFyZW50KCk9PW51bGwpOwotCWFzc2VydFRydWUodGVzdFNoZWxsLmdldFBhcmVudCgpID09IHNoZWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZSgpIHsKLQkvLyBvdmVycmlkaW5nIFdpZGdldC50ZXN0X2dldFN0eWxlCi0JYXNzZXJ0VHJ1ZSgidGVzdFNoZWxsIG5vdCBtb2RlbGVzcyIsICh0ZXN0U2hlbGwuZ2V0U3R5bGUgKCkgJiBTV1QuTU9ERUxFU1MpID09IFNXVC5NT0RFTEVTUyk7Ci0JaW50W10gY2FzZXMgPSB7U1dULk1PREVMRVNTLCBTV1QuUFJJTUFSWV9NT0RBTCwgU1dULkFQUExJQ0FUSU9OX01PREFMLCBTV1QuU1lTVEVNX01PREFMfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCVNoZWxsIHRlc3RTaGVsbDIgPSBuZXcgU2hlbGwoc2hlbGwsIGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgic2hlbGwgIiArIGksICh0ZXN0U2hlbGwyLmdldFN0eWxlICgpICYgY2FzZXNbaV0pID09IGNhc2VzW2ldKTsKLQkJdGVzdFNoZWxsMi5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzVmlzaWJsZSgpIHsKLQkvLyBvdmVycmlkaW5nIENvbnRyb2wudGVzdF9pc1Zpc2libGUKLQl0ZXN0U2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRlc3RTaGVsbC5pc1Zpc2libGUoKSk7Ci0Jc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHNoZWxsLmlzVmlzaWJsZSgpKTsKLQotCXRlc3RTaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgic2hlbGwuaXNWaXNpYmxlKCkgYToiLCBzaGVsbC5pc1Zpc2libGUoKSk7Ci0Jc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgic2hlbGwuaXNWaXNpYmxlKCkgYjoiLCAhc2hlbGwuaXNWaXNpYmxlKCkpOwotCWlmIChmQ2hlY2tCb2d1c1Rlc3RDYXNlcykKLQkJYXNzZXJ0VHJ1ZSgidGVzdFNoZWxsLmlzVmlzaWJsZSgpIGM6IiwgIXRlc3RTaGVsbC5pc1Zpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzSUlJSSgpIHsKLQkvLyBvdmVycmlkZGVuIGZyb20gQ29udHJvbCBiZWNhdXNlIFNoZWxscyBoYXZlIGEgbWluaW11bSBzaXplCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JLy8gb3ZlcnJpZGRlbiBmcm9tIENvbnRyb2wgYmVjYXVzZSBTaGVsbHMgaGF2ZSBhIG1pbmltdW0gc2l6ZQotLy8JLyogd2luZG93cyAqLwotLy8JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWluaW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPCAxMTIgb3IgcDEueSA8IDI3ICovCi0vLwkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtYXhpbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA+IDEyOTIgb3IgcDEueSA+IDEwMzYgKi8KLS8vCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLS8vCQlQb2ludCBwMSA9IG5ldyBQb2ludCgxMTIsIDI3KTsKLS8vCQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDIwLCAzMCwgcDEueCwgcDEueSk7Ci0vLwkJUmVjdGFuZ2xlIHIyOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgMTE7IGkrKykgewotLy8JCQl0ZXN0U2hlbGwuc2V0Qm91bmRzKHIxKTsKLS8vCQkJcjIgPSB0ZXN0U2hlbGwuZ2V0Qm91bmRzKCk7Ci0vLwkJCWFzc2VydCgiY2hpbGQgc2hlbGwgaXRlcmF0aW9uICIgKyBpICsgIiBzZXQ9IiArIHIxICsgIiBnZXQ9IiArIHIyLCByMS5lcXVhbHMocjIpKTsKLS8vCQkJcjEud2lkdGggKz0gMTAwOwotLy8JCQlyMS5oZWlnaHQgKz0gMTAwOwotLy8JCX0KLS8vCQlyMSA9IG5ldyBSZWN0YW5nbGUoMjAsIDMwLCBwMS54LCBwMS55KTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IDExOyBpKyspIHsKLS8vCQkJc2hlbGwuc2V0Qm91bmRzKHIxKTsKLS8vCQkJcjIgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLS8vCQkJYXNzZXJ0KCJwYXJlbnQgc2hlbGwgaXRlcmF0aW9uICIgKyBpICsgIiBzZXQ9IiArIHIxICsgIiBnZXQ9IiArIHIyLCByMS5lcXVhbHMocjIpKTsKLS8vCQkJcjEud2lkdGggKz0gMTAwOwotLy8JCQlyMS5oZWlnaHQgKz0gMTAwOwotLy8JCX0KLS8vCX0KLS8vCS8qIG1vdGlmICovCi0vLwkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA8IDExMiBvciBwMS55IDwgMjcgKi8KLS8vCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54ID4gMTI5MiBvciBwMS55ID4gMTAzNiAqLwotLy8JaWYgKFN3dEp1bml0LmlzTW90aWYpIHsKLS8vCQlQb2ludCBwMSA9IG5ldyBQb2ludCgxNSwzNSk7Ci0vLwkJUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgyMCwgMzAsIHAxLngsIHAxLnkpOwotLy8JCVJlY3RhbmdsZSByMjsKLS8vCQkKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IDE1OyBpKyspIHsKLS8vCQkJdGVzdFNoZWxsLnNldEJvdW5kcyhyMSk7Ci0vLwkJCXIyID0gdGVzdFNoZWxsLmdldEJvdW5kcygpOwotLy8JCQlhc3NlcnQoImNoaWxkIHNoZWxsIGl0ZXJhdGlvbiAiICsgaSArICIgc2V0PSIgKyByMSArICIgZ2V0PSIgKyByMiwgcjEuZXF1YWxzKHIyKSk7Ci0vLwkJCXIxLndpZHRoICs9IDEwMDsKLS8vCQkJcjEuaGVpZ2h0ICs9IDEwMDsKLS8vCQl9Ci0vLwkJcjEgPSBuZXcgUmVjdGFuZ2xlKDUwLCA1MCwgcDEueCwgcDEueSk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7Ci0vLwkJCXNoZWxsLnNldEJvdW5kcyhyMSk7Ci0vLwkJCXIyID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0vLwkJCWFzc2VydCgicGFyZW50IHNoZWxsIGl0ZXJhdGlvbiAiICsgaSArICIgc2V0PSIgKyByMSArICIgZ2V0PSIgKyByMiwgcjEuZXF1YWxzKHIyKSk7Ci0vLwkJCXIxLndpZHRoICs9IDEwMDsKLS8vCQkJcjEuaGVpZ2h0ICs9IDEwMDsKLS8vCQl9Ci0vLwl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlZ2lvbigpIHsKLQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCXJlZ2lvbi5hZGQobmV3IFJlY3RhbmdsZSgxMCwgMjAsIDEwMCwgMjAwKSk7Ci0JLy8gdGVzdCBzaGVsbCB3aXRob3V0IHN0eWxlIFNXVC5OT19UUklNCi0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2hlbGwuZ2V0UmVnaW9uKCkgPT0gbnVsbCk7Ci0Jc2hlbGwuc2V0UmVnaW9uKHJlZ2lvbik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2hlbGwuZ2V0UmVnaW9uKCkgPT0gbnVsbCk7Ci0Jc2hlbGwuc2V0UmVnaW9uKG51bGwpOwotCWFzc2VydFRydWUoIjpjOiIsIHNoZWxsLmdldFJlZ2lvbigpID09IG51bGwpOwotCS8vIHRlc3Qgc2hlbGwgd2l0aCBzdHlsZSBTV1QuTk9fVFJJTQotCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbDIgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULk5PX1RSSU0pOwotCWFzc2VydFRydWUoIjpkOiIsIHNoZWxsMi5nZXRSZWdpb24oKSA9PSBudWxsKTsKLQlzaGVsbDIuc2V0UmVnaW9uKHJlZ2lvbik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwgc2hlbGwyLmdldFJlZ2lvbigpLmhhbmRsZSA9PSByZWdpb24uaGFuZGxlKTsKLQlyZWdpb24uZGlzcG9zZSgpOwotCWFzc2VydFRydWUoIjpmOiIsIHNoZWxsMi5nZXRSZWdpb24oKS5pc0Rpc3Bvc2VkKCkpOwotCXNoZWxsMi5zZXRSZWdpb24obnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6Iiwgc2hlbGwyLmdldFJlZ2lvbigpID09IG51bGwpOwotfQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplSUkoKSB7Ci0JLyogd2luZG93cyAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54IDwgMTEyIG9yIHAxLnkgPCAyNyAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54ID4gMTI5MiBvciBwMS55ID4gMTAzNiAqLwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJUG9pbnQgbmV3U2l6ZSA9IG5ldyBQb2ludCgxMTIsIDI3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplLngsIG5ld1NpemUueSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggKz0gMTAwOwotCQkJbmV3U2l6ZS55ICs9IDEwMDsKLQkJfQotCQluZXdTaXplID0gbmV3IFBvaW50KDEyOTIsIDEwMzYpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUueCwgbmV3U2l6ZS55KTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCAtPSAxMDA7Ci0JCQluZXdTaXplLnkgLT0gMTAwOwotCQl9Ci0JfQotCQotCS8qIG1vdGlmICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWluaW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPCA/PyBvciBwMS55IDwgPz8gKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtYXhpbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA+ID8/IG9yIHAxLnkgPiA/PyAqLwotCWlmIChTd3RKdW5pdC5pc01vdGlmKSB7Ci0JCVBvaW50IG5ld1NpemUgPSBuZXcgUG9pbnQoMiwgMik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZS54LCBuZXdTaXplLnkpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54ICs9IDEwMDsKLQkJCW5ld1NpemUueSArPSAxMDA7Ci0JCX0KLQkJbmV3U2l6ZSA9IG5ldyBQb2ludCgxNjAwLCAxNjAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplLngsIG5ld1NpemUueSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggLT0gMTAwOwotCQkJbmV3U2l6ZS55IC09IDEwMDsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQkvKiB3aW5kb3dzICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWluaW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPCAxMTIgb3IgcDEueSA8IDI3ICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPiAxMjkyIG9yIHAxLnkgPiAxMDM2ICovCi0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQlQb2ludCBuZXdTaXplID0gbmV3IFBvaW50KDExMiwgMjcpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54ICs9IDEwMDsKLQkJCW5ld1NpemUueSArPSAxMDA7Ci0JCX0KLQkJbmV3U2l6ZSA9IG5ldyBQb2ludCgxMjkyLCAxMDM2KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplKTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCAtPSAxMDA7Ci0JCQluZXdTaXplLnkgLT0gMTAwOwotCQl9Ci0JfQotCQotCS8qIG1vdGlmICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWluaW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPCA/PyBvciBwMS55IDwgPz8gKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtYXhpbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA+ID8/IG9yIHAxLnkgPiA/PyAqLwotCWlmIChTd3RKdW5pdC5pc01vdGlmKSB7Ci0JCVBvaW50IG5ld1NpemUgPSBuZXcgUG9pbnQoMiwgMik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggKz0gMTAwOwotCQkJbmV3U2l6ZS55ICs9IDEwMDsKLQkJfQotCQluZXdTaXplID0gbmV3IFBvaW50KDE2MDAsIDE2MDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54IC09IDEwMDsKLQkJCW5ld1NpemUueSAtPSAxMDA7Ci0JCX0KLQl9Ci19Ci0KLVNoZWxsIHRlc3RTaGVsbDsKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVNoZWxsKCkgewotICAgIHRlYXJEb3duKCk7Ci0gICAgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLSAgICB0ZXN0U2hlbGwgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5NSU4pOwotCXRlc3RTaGVsbC5zZXRTaXplKDEwMCwzMDApOwotCXRlc3RTaGVsbC5zZXRUZXh0KCJTaGVsbCIpOwotICAgIHRlc3RTaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgc2V0V2lkZ2V0KHRlc3RTaGVsbCk7Ci0gICAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9PcGVuKCkgewotCWlmIChmVGVzdENvbnNpc3RlbmN5KSB7Ci0JICAgIGNyZWF0ZVNoZWxsKCk7Ci0JICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkoKTsKLQkgICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLQkgICAgU3RyaW5nW10gdGVtcCA9IGhvb2tFeHBlY3RlZEV2ZW50cyh0ZXN0U2hlbGwsIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JICAgIHNoZWxsLnBhY2soKTsKLQkgICAgc2hlbGwub3BlbigpOwotCSAgICB0ZXN0U2hlbGwucGFjaygpOwotCSAgICB0ZXN0U2hlbGwub3BlbigpOwotCSAgICBuZXcgVGhyZWFkKCkgewotCSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotCSAgICAgICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKG5ldyBUaHJlYWQoKSB7Ci0JCQkJICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkgICAgICAgIHNoZWxsLmRpc3Bvc2UoKTsKLQkJCQkgICAgfQotCQkJCX0pOwotCSAgICB9fS5zdGFydCgpOwotCQotCSAgICB3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JICAgICAgICBpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCSAgICB9Ci0JICAgIHNldFVwKCk7ICAgICAgICAKLQkgICAgU3RyaW5nW10gcmVzdWx0cyA9IG5ldyBTdHJpbmdbZXZlbnRzLnNpemUoKV07Ci0JICAgIGV2ZW50cy5jb3B5SW50byhyZXN1bHRzKTsKLQkgICAgYXNzZXJ0RXF1YWxzKGdldFRlc3ROYW1lKCkgKyAiIGV2ZW50IG9yZGVyaW5nIiwgdGVtcCwgcmVzdWx0cyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0ljb25pZnkoKSB7Ci0gICAgY3JlYXRlU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEsIDAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5TSEVMTF9JQ09OSUZZLCBudWxsLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfQ2xvc2UoKSB7Ci0gICAgY3JlYXRlU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIGlmKCFTd3RKdW5pdC5pc0NhcmJvbikKLSAgICAgICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQUxULCAwLCBTV1QuRjQsIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTKTsKLSAgICBlbHNlCi0gICAgICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIGNyZWF0ZVNoZWxsKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRGlzcG9zZSgpIHsKLSAgICBjcmVhdGVTaGVsbCgpOwotCi0gICAgZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24odGVzdFNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgYnV0dG9uLnNldFRleHQoImRpc3Bvc2UiKTsKLSAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotICAgICAgICAgICAgYnV0dG9uLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHRlc3RTaGVsbC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKHRlc3RTaGVsbCk7Ci0gICAgUG9pbnQgcHQgPSBidXR0b24uZ2V0TG9jYXRpb24oKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHB0LngsIHB0LnksIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLSAgICBjcmVhdGVTaGVsbCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGI2MDRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TbGlkZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNsaWRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNsaWRlciA9IG5ldyBTbGlkZXIoc2hlbGwsIDApOwotCXNldFdpZGdldChzbGlkZXIpOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIHZhbHVlU3RyaW5nKGludFtdIGludEFycmF5KSB7Ci0JcmV0dXJuICIgKCIraW50QXJyYXlbMV0rIiwiK2ludEFycmF5WzJdKyIsIitpbnRBcnJheVszXSsiLCIraW50QXJyYXlbNF0rIikiOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJc2xpZGVyID0gbmV3IFNsaWRlcihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7MCwgU1dULkhPUklaT05UQUwsIFNXVC5WRVJUSUNBTH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJc2xpZGVyID0gbmV3IFNsaWRlcihzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQl0cnkgewotCQlzbGlkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0Jc2xpZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlzbGlkZXIuc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQlzbGlkZXIucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXRyeSB7Ci0JCXNsaWRlci5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQkvLyBzdXBlciBjbGFzcyBtZXRob2Qgc3VmZmljaWVudCB0ZXN0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0RW5hYmxlZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbmNyZW1lbnQoKSB7Ci0JaW50W10gY2FzZXMgPSB7MSwgMTAsIDEwMDAwfTsKLQlmb3IgKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspCi0JewotCSAgc2xpZGVyLnNldEluY3JlbWVudChjYXNlc1tpXSk7Ci0JICBhc3NlcnRUcnVlKCJjYXNlOiAiICsgU3RyaW5nLnZhbHVlT2YoaSksIHNsaWRlci5nZXRJbmNyZW1lbnQoKT09Y2FzZXNbaV0pOwotCX0gCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bSgpIHsKLQlzbGlkZXIuc2V0TWF4aW11bSgyMDAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzbGlkZXIuZ2V0TWF4aW11bSgpID09IDIwMDApOwotCXNsaWRlci5zZXRNYXhpbXVtKDIwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzbGlkZXIuZ2V0TWF4aW11bSgpID09IDIwKTsKLQlzbGlkZXIuc2V0TWF4aW11bSgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSAyMCk7Ci0Jc2xpZGVyLnNldE1heGltdW0oMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSAyMCk7Ci0Jc2xpZGVyLnNldE1heGltdW0oMTApOwotCWFzc2VydFRydWUoIjpkOiIsIHNsaWRlci5nZXRNYXhpbXVtKCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW0oKSB7Ci0Jc2xpZGVyLnNldE1pbmltdW0oNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSA1KTsKLQlzbGlkZXIuc2V0TWluaW11bSgyMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSAyMCk7Ci0Jc2xpZGVyLnNldE1pbmltdW0oLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gMjApOwotCXNsaWRlci5zZXRNaW5pbXVtKDApOwotCWFzc2VydFRydWUoIjpkOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gMCk7Ci0Jc2xpZGVyLnNldE1pbmltdW0oMTApOwotCWFzc2VydFRydWUoIjpkOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhZ2VJbmNyZW1lbnQoKSB7Ci0JaW50W10gY2FzZXMgPSB7MSwgMTAsIDEwMDAwfTsKLQlmb3IgKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspCi0JewotCSAgc2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoY2FzZXNbaV0pOwotCSAgYXNzZXJ0VHJ1ZSgiY2FzZTogIiArIFN0cmluZy52YWx1ZU9mKGkpLCBzbGlkZXIuZ2V0UGFnZUluY3JlbWVudCgpPT1jYXNlc1tpXSk7Ci0JfSAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0Jc2xpZGVyLnNldFNlbGVjdGlvbigxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2xpZGVyLmdldFNlbGVjdGlvbigpPT0gMTApOwotCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRodW1iKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRodW1iKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0Jc2xpZGVyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzbGlkZXIuZ2V0RW5hYmxlZCgpKTsKLQlzbGlkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKHNsaWRlci5nZXRFbmFibGVkKCksIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbmNyZW1lbnRJKCkgewotCS8vIHRlc3RlZCBpbiBnZXRJbmNyZW1lbnQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW11bUkoKSB7Ci0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWF4aW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2xpZGVyLnNldE1heGltdW0oaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0TWF4ICIraW50QXJyYXlbMF0rIHZhbHVlU3RyaW5nLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtSSgpIHsKLQotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNaW5pbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzbGlkZXIuc2V0TWluaW11bShpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRNaW4gIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZywgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKSB7Ci0JIHNsaWRlci5zZXRQYWdlSW5jcmVtZW50KDMpOwotCSBhc3NlcnRUcnVlKCI6YToiLCBzbGlkZXIuZ2V0UGFnZUluY3JlbWVudCgpPT0gMyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2xpZGVyLnNldFNlbGVjdGlvbihpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRTZWwgIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZyxpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUaHVtYkkoKSB7Ci0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0VGh1bWJWYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNsaWRlci5zZXRUaHVtYihpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRUaG1iICIraW50QXJyYXlbMF0rdmFsdWVTdHJpbmcsaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmFsdWVzSUlJSUlJKCkgewotCXNsaWRlci5zZXRWYWx1ZXMoMTAsIDEwLCA1MCwgMiwgNSwgMTApOwotCWFzc2VydFRydWUoIjphOiIsIHNsaWRlci5nZXRTZWxlY3Rpb24oKSA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSA1MCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2xpZGVyLmdldFRodW1iKCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwgc2xpZGVyLmdldEluY3JlbWVudCgpID09IDUpOwotCWFzc2VydFRydWUoIjpmOiIsIHNsaWRlci5nZXRQYWdlSW5jcmVtZW50KCkgPT0gMTApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNYXhpbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNaW5pbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYWdlSW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRodW1iIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWF4aW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQYWdlSW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGh1bWJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWYWx1ZXNJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0Fycm93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5jcmVtZW50IikpIHRlc3RfZ2V0SW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbXVtIikpIHRlc3RfZ2V0TWF4aW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bSIpKSB0ZXN0X2dldE1pbmltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKSkgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRodW1iIikpIHRlc3RfZ2V0VGh1bWIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbmNyZW1lbnRJIikpIHRlc3Rfc2V0SW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW11bUkiKSkgdGVzdF9zZXRNYXhpbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bUkiKSkgdGVzdF9zZXRNaW5pbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKSkgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRodW1iSSIpKSB0ZXN0X3NldFRodW1iSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmFsdWVzSUlJSUlJIikpIHRlc3Rfc2V0VmFsdWVzSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9BcnJvd1NlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0Fycm93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCS8vIG92ZXJyaWRkZW4gZnJvbSBDb250cm9sIGJlY2F1c2UgaXQgZG9lcyBub3QgbWFrZSBzZW5zZQotCS8vIHRvIHNldCB0aGUgZm9udCBvZiBhIFNsaWRlci4KLX0KLQotU2xpZGVyIHNsaWRlcjsKLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHJlcG9ydChTdHJpbmcgY2FsbCwgaW50IHNldCwgaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCwgaW50IHRodW1iRXhwZWN0ZWQpIHsKLQkvLyBVbmNvbW1lbnQgdGhlc2UgbGluZXMgYW5kIGNvbW1lbnQgb3V0IGNhbGwgdG8gY2hlY2soKSBpZiB5b3Ugd2FudCB0aGUgdGVzdCB0byByZXBvcnQgYWxsIGVycm9ycyB3aXRob3V0Ci0JLy8gc3RvcHBpbmcuCi0vLwlpZiAoc2xpZGVyLmdldE1pbmltdW0oKSAhPSBtaW5FeHBlY3RlZCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IE1pbmltdW0gRXhwZWN0ZWQ6ICIgKyBtaW5FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNsaWRlci5nZXRNaW5pbXVtKCkpOwotLy8JfQotLy8JaWYgKHNsaWRlci5nZXRNYXhpbXVtKCkgIT0gbWF4RXhwZWN0ZWQpewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IE1heGltdW0gRXhwZWN0ZWQ6ICIgKyBtYXhFeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNsaWRlci5nZXRNYXhpbXVtKCkpOwotLy8JfQotLy8JaWYgKHNsaWRlci5nZXRTZWxlY3Rpb24oKSAhPSBzZWxlY3Rpb25FeHBlY3RlZCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IFNlbGVjdGlvbiBFeHBlY3RlZDogIiArIHNlbGVjdGlvbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2xpZGVyLmdldFNlbGVjdGlvbigpKTsKLS8vCX0KLS8vCWlmIChzbGlkZXIuZ2V0VGh1bWIoKSAhPSB0aHVtYkV4cGVjdGVkKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogVGh1bWIgRXhwZWN0ZWQ6ICIgKyB0aHVtYkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2xpZGVyLmdldFRodW1iKCkpOwotLy8JfQotCWNoZWNrKGNhbGwsIG1pbkV4cGVjdGVkLCBtYXhFeHBlY3RlZCwgc2VsZWN0aW9uRXhwZWN0ZWQsIHRodW1iRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGNoZWNrKFN0cmluZyBjYWxsLCBpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkLCBpbnQgdGh1bWJFeHBlY3RlZCkgewotCWFzc2VydEVxdWFscyhjYWxsKyIgbWF4ICIsIG1heEV4cGVjdGVkLCBzbGlkZXIuZ2V0TWF4aW11bSgpKTsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIG1pbiAiLCBtaW5FeHBlY3RlZCwgc2xpZGVyLmdldE1pbmltdW0oKSk7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiBzZWwgIiwgc2VsZWN0aW9uRXhwZWN0ZWQsIHNsaWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiB0aG1iICIsIHRodW1iRXhwZWN0ZWQsIHNsaWRlci5nZXRUaHVtYigpKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRUaHVtYlZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTksIDEwLCAxMDAsIDUwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxLCAxMCwgMTAwLCA1MCwgMX0sCi17MiwgMTAsIDEwMCwgNTAsIDJ9LAotezMsIDEwLCAxMDAsIDUwLCAzfSwKLXs0LCAxMCwgMTAwLCA1MCwgNH0sCi17NSwgMTAsIDEwMCwgNTAsIDV9LAotezYsIDEwLCAxMDAsIDUwLCA2fSwKLXs3LCAxMCwgMTAwLCA1MCwgN30sCi17OCwgMTAsIDEwMCwgNTAsIDh9LAotezksIDEwLCAxMDAsIDUwLCA5fSwKLXsxMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMSwgMTAsIDEwMCwgNTAsIDExfSwKLXsxMiwgMTAsIDEwMCwgNTAsIDEyfSwKLXsxMywgMTAsIDEwMCwgNTAsIDEzfSwKLXsxNCwgMTAsIDEwMCwgNTAsIDE0fSwKLXsxNSwgMTAsIDEwMCwgNTAsIDE1fSwKLXsxNiwgMTAsIDEwMCwgNTAsIDE2fSwKLXsxNywgMTAsIDEwMCwgNTAsIDE3fSwKLXsxOCwgMTAsIDEwMCwgNTAsIDE4fSwKLXsxOSwgMTAsIDEwMCwgNTAsIDE5fSwKLXsyMCwgMTAsIDEwMCwgNTAsIDIwfSwKLXsyMSwgMTAsIDEwMCwgNTAsIDIxfSwKLXsyMiwgMTAsIDEwMCwgNTAsIDIyfSwKLXsyMywgMTAsIDEwMCwgNTAsIDIzfSwKLXsyNCwgMTAsIDEwMCwgNTAsIDI0fSwKLXsyNSwgMTAsIDEwMCwgNTAsIDI1fSwKLXsyNiwgMTAsIDEwMCwgNTAsIDI2fSwKLXsyNywgMTAsIDEwMCwgNTAsIDI3fSwKLXsyOCwgMTAsIDEwMCwgNTAsIDI4fSwKLXsyOSwgMTAsIDEwMCwgNTAsIDI5fSwKLXszMCwgMTAsIDEwMCwgNTAsIDMwfSwKLXszMSwgMTAsIDEwMCwgNTAsIDMxfSwKLXszMiwgMTAsIDEwMCwgNTAsIDMyfSwKLXszMywgMTAsIDEwMCwgNTAsIDMzfSwKLXszNCwgMTAsIDEwMCwgNTAsIDM0fSwKLXszNSwgMTAsIDEwMCwgNTAsIDM1fSwKLXszNiwgMTAsIDEwMCwgNTAsIDM2fSwKLXszNywgMTAsIDEwMCwgNTAsIDM3fSwKLXszOCwgMTAsIDEwMCwgNTAsIDM4fSwKLXszOSwgMTAsIDEwMCwgNTAsIDM5fSwKLXs0MCwgMTAsIDEwMCwgNTAsIDQwfSwKLXs0MSwgMTAsIDEwMCwgNTAsIDQxfSwKLXs0MiwgMTAsIDEwMCwgNTAsIDQyfSwKLXs0MywgMTAsIDEwMCwgNTAsIDQzfSwKLXs0NCwgMTAsIDEwMCwgNTAsIDQ0fSwKLXs0NSwgMTAsIDEwMCwgNTAsIDQ1fSwKLXs0NiwgMTAsIDEwMCwgNTAsIDQ2fSwKLXs0NywgMTAsIDEwMCwgNTAsIDQ3fSwKLXs0OCwgMTAsIDEwMCwgNTAsIDQ4fSwKLXs0OSwgMTAsIDEwMCwgNTAsIDQ5fSwKLXs1MCwgMTAsIDEwMCwgNTAsIDUwfSwKLXs1MSwgMTAsIDEwMCwgNDksIDUxfSwKLXs1MiwgMTAsIDEwMCwgNDgsIDUyfSwKLXs1MywgMTAsIDEwMCwgNDcsIDUzfSwKLXs1NCwgMTAsIDEwMCwgNDYsIDU0fSwKLXs1NSwgMTAsIDEwMCwgNDUsIDU1fSwKLXs1NiwgMTAsIDEwMCwgNDQsIDU2fSwKLXs1NywgMTAsIDEwMCwgNDMsIDU3fSwKLXs1OCwgMTAsIDEwMCwgNDIsIDU4fSwKLXs1OSwgMTAsIDEwMCwgNDEsIDU5fSwKLXs2MCwgMTAsIDEwMCwgNDAsIDYwfSwKLXs2MSwgMTAsIDEwMCwgMzksIDYxfSwKLXs2MiwgMTAsIDEwMCwgMzgsIDYyfSwKLXs2MywgMTAsIDEwMCwgMzcsIDYzfSwKLXs2NCwgMTAsIDEwMCwgMzYsIDY0fSwKLXs2NSwgMTAsIDEwMCwgMzUsIDY1fSwKLXs2NiwgMTAsIDEwMCwgMzQsIDY2fSwKLXs2NywgMTAsIDEwMCwgMzMsIDY3fSwKLXs2OCwgMTAsIDEwMCwgMzIsIDY4fSwKLXs2OSwgMTAsIDEwMCwgMzEsIDY5fSwKLXs3MCwgMTAsIDEwMCwgMzAsIDcwfSwKLXs3MSwgMTAsIDEwMCwgMjksIDcxfSwKLXs3MiwgMTAsIDEwMCwgMjgsIDcyfSwKLXs3MywgMTAsIDEwMCwgMjcsIDczfSwKLXs3NCwgMTAsIDEwMCwgMjYsIDc0fSwKLXs3NSwgMTAsIDEwMCwgMjUsIDc1fSwKLXs3NiwgMTAsIDEwMCwgMjQsIDc2fSwKLXs3NywgMTAsIDEwMCwgMjMsIDc3fSwKLXs3OCwgMTAsIDEwMCwgMjIsIDc4fSwKLXs3OSwgMTAsIDEwMCwgMjEsIDc5fSwKLXs4MCwgMTAsIDEwMCwgMjAsIDgwfSwKLXs4MSwgMTAsIDEwMCwgMTksIDgxfSwKLXs4MiwgMTAsIDEwMCwgMTgsIDgyfSwKLXs4MywgMTAsIDEwMCwgMTcsIDgzfSwKLXs4NCwgMTAsIDEwMCwgMTYsIDg0fSwKLXs4NSwgMTAsIDEwMCwgMTUsIDg1fSwKLXs4NiwgMTAsIDEwMCwgMTQsIDg2fSwKLXs4NywgMTAsIDEwMCwgMTMsIDg3fSwKLXs4OCwgMTAsIDEwMCwgMTIsIDg4fSwKLXs4OSwgMTAsIDEwMCwgMTEsIDg5fSwKLXs5MCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MSwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MiwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MywgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NSwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NiwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NywgMTAsIDEwMCwgMTAsIDkwfSwKLXs5OCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5OSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDAsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAxLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDMsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA0LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDYsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA3LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwOCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDksIDEwLCAxMDAsIDEwLCA5MH0sCi17MTEwLCAxMCwgMTAwLCAxMCwgOTB9LAotezExMSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTIsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTEzLCAxMCwgMTAwLCAxMCwgOTB9LAotezExNCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTUsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE2LCAxMCwgMTAwLCAxMCwgOTB9LAotezExNywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTgsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE5LCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjEsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIyLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjQsIDEwLCAxMDAsIDEwLCA5MH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1pbmltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgMTB9LAotey05LCAxMCwgMTAwLCA1MCwgMTB9LAotey04LCAxMCwgMTAwLCA1MCwgMTB9LAotey03LCAxMCwgMTAwLCA1MCwgMTB9LAotey02LCAxMCwgMTAwLCA1MCwgMTB9LAotey01LCAxMCwgMTAwLCA1MCwgMTB9LAotey00LCAxMCwgMTAwLCA1MCwgMTB9LAotey0zLCAxMCwgMTAwLCA1MCwgMTB9LAotey0yLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xLCAxMCwgMTAwLCA1MCwgMTB9LAotezAsIDAsIDEwMCwgNTAsIDEwfSwKLXsxLCAxLCAxMDAsIDUwLCAxMH0sCi17MiwgMiwgMTAwLCA1MCwgMTB9LAotezMsIDMsIDEwMCwgNTAsIDEwfSwKLXs0LCA0LCAxMDAsIDUwLCAxMH0sCi17NSwgNSwgMTAwLCA1MCwgMTB9LAotezYsIDYsIDEwMCwgNTAsIDEwfSwKLXs3LCA3LCAxMDAsIDUwLCAxMH0sCi17OCwgOCwgMTAwLCA1MCwgMTB9LAotezksIDksIDEwMCwgNTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMSwgMTEsIDEwMCwgNTAsIDEwfSwKLXsxMiwgMTIsIDEwMCwgNTAsIDEwfSwKLXsxMywgMTMsIDEwMCwgNTAsIDEwfSwKLXsxNCwgMTQsIDEwMCwgNTAsIDEwfSwKLXsxNSwgMTUsIDEwMCwgNTAsIDEwfSwKLXsxNiwgMTYsIDEwMCwgNTAsIDEwfSwKLXsxNywgMTcsIDEwMCwgNTAsIDEwfSwKLXsxOCwgMTgsIDEwMCwgNTAsIDEwfSwKLXsxOSwgMTksIDEwMCwgNTAsIDEwfSwKLXsyMCwgMjAsIDEwMCwgNTAsIDEwfSwKLXsyMSwgMjEsIDEwMCwgNTAsIDEwfSwKLXsyMiwgMjIsIDEwMCwgNTAsIDEwfSwKLXsyMywgMjMsIDEwMCwgNTAsIDEwfSwKLXsyNCwgMjQsIDEwMCwgNTAsIDEwfSwKLXsyNSwgMjUsIDEwMCwgNTAsIDEwfSwKLXsyNiwgMjYsIDEwMCwgNTAsIDEwfSwKLXsyNywgMjcsIDEwMCwgNTAsIDEwfSwKLXsyOCwgMjgsIDEwMCwgNTAsIDEwfSwKLXsyOSwgMjksIDEwMCwgNTAsIDEwfSwKLXszMCwgMzAsIDEwMCwgNTAsIDEwfSwKLXszMSwgMzEsIDEwMCwgNTAsIDEwfSwKLXszMiwgMzIsIDEwMCwgNTAsIDEwfSwKLXszMywgMzMsIDEwMCwgNTAsIDEwfSwKLXszNCwgMzQsIDEwMCwgNTAsIDEwfSwKLXszNSwgMzUsIDEwMCwgNTAsIDEwfSwKLXszNiwgMzYsIDEwMCwgNTAsIDEwfSwKLXszNywgMzcsIDEwMCwgNTAsIDEwfSwKLXszOCwgMzgsIDEwMCwgNTAsIDEwfSwKLXszOSwgMzksIDEwMCwgNTAsIDEwfSwKLXs0MCwgNDAsIDEwMCwgNTAsIDEwfSwKLXs0MSwgNDEsIDEwMCwgNTAsIDEwfSwKLXs0MiwgNDIsIDEwMCwgNTAsIDEwfSwKLXs0MywgNDMsIDEwMCwgNTAsIDEwfSwKLXs0NCwgNDQsIDEwMCwgNTAsIDEwfSwKLXs0NSwgNDUsIDEwMCwgNTAsIDEwfSwKLXs0NiwgNDYsIDEwMCwgNTAsIDEwfSwKLXs0NywgNDcsIDEwMCwgNTAsIDEwfSwKLXs0OCwgNDgsIDEwMCwgNTAsIDEwfSwKLXs0OSwgNDksIDEwMCwgNTAsIDEwfSwKLXs1MCwgNTAsIDEwMCwgNTAsIDEwfSwKLXs1MSwgNTEsIDEwMCwgNTEsIDEwfSwKLXs1MiwgNTIsIDEwMCwgNTIsIDEwfSwKLXs1MywgNTMsIDEwMCwgNTMsIDEwfSwKLXs1NCwgNTQsIDEwMCwgNTQsIDEwfSwKLXs1NSwgNTUsIDEwMCwgNTUsIDEwfSwKLXs1NiwgNTYsIDEwMCwgNTYsIDEwfSwKLXs1NywgNTcsIDEwMCwgNTcsIDEwfSwKLXs1OCwgNTgsIDEwMCwgNTgsIDEwfSwKLXs1OSwgNTksIDEwMCwgNTksIDEwfSwKLXs2MCwgNjAsIDEwMCwgNjAsIDEwfSwKLXs2MSwgNjEsIDEwMCwgNjEsIDEwfSwKLXs2MiwgNjIsIDEwMCwgNjIsIDEwfSwKLXs2MywgNjMsIDEwMCwgNjMsIDEwfSwKLXs2NCwgNjQsIDEwMCwgNjQsIDEwfSwKLXs2NSwgNjUsIDEwMCwgNjUsIDEwfSwKLXs2NiwgNjYsIDEwMCwgNjYsIDEwfSwKLXs2NywgNjcsIDEwMCwgNjcsIDEwfSwKLXs2OCwgNjgsIDEwMCwgNjgsIDEwfSwKLXs2OSwgNjksIDEwMCwgNjksIDEwfSwKLXs3MCwgNzAsIDEwMCwgNzAsIDEwfSwKLXs3MSwgNzEsIDEwMCwgNzEsIDEwfSwKLXs3MiwgNzIsIDEwMCwgNzIsIDEwfSwKLXs3MywgNzMsIDEwMCwgNzMsIDEwfSwKLXs3NCwgNzQsIDEwMCwgNzQsIDEwfSwKLXs3NSwgNzUsIDEwMCwgNzUsIDEwfSwKLXs3NiwgNzYsIDEwMCwgNzYsIDEwfSwKLXs3NywgNzcsIDEwMCwgNzcsIDEwfSwKLXs3OCwgNzgsIDEwMCwgNzgsIDEwfSwKLXs3OSwgNzksIDEwMCwgNzksIDEwfSwKLXs4MCwgODAsIDEwMCwgODAsIDEwfSwKLXs4MSwgODEsIDEwMCwgODEsIDEwfSwKLXs4MiwgODIsIDEwMCwgODIsIDEwfSwKLXs4MywgODMsIDEwMCwgODMsIDEwfSwKLXs4NCwgODQsIDEwMCwgODQsIDEwfSwKLXs4NSwgODUsIDEwMCwgODUsIDEwfSwKLXs4NiwgODYsIDEwMCwgODYsIDEwfSwKLXs4NywgODcsIDEwMCwgODcsIDEwfSwKLXs4OCwgODgsIDEwMCwgODgsIDEwfSwKLXs4OSwgODksIDEwMCwgODksIDEwfSwKLXs5MCwgOTAsIDEwMCwgOTAsIDEwfSwKLXs5MSwgOTEsIDEwMCwgOTEsIDl9LAotezkyLCA5MiwgMTAwLCA5MiwgOH0sCi17OTMsIDkzLCAxMDAsIDkzLCA3fSwKLXs5NCwgOTQsIDEwMCwgOTQsIDZ9LAotezk1LCA5NSwgMTAwLCA5NSwgNX0sCi17OTYsIDk2LCAxMDAsIDk2LCA0fSwKLXs5NywgOTcsIDEwMCwgOTcsIDN9LAotezk4LCA5OCwgMTAwLCA5OCwgMn0sCi17OTksIDk5LCAxMDAsIDk5LCAxfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCAxMH0sIAotezEwMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAzLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDUsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA2LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDgsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA5LCAxMCwgMTAwLCA1MCwgMTB9LAotezExMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotezExMywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotezExNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE4LCAxMCwgMTAwLCA1MCwgMTB9LAotezExOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIxLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjMsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTI0LCAxMCwgMTAwLCA1MCwgMTB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNYXhpbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTExLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNywgMTAsIDEwMCwgNTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXswLCAxMCwgMTAwLCA1MCwgMTB9LAotezEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MiwgMTAsIDEwMCwgNTAsIDEwfSwKLXszLCAxMCwgMTAwLCA1MCwgMTB9LAotezQsIDEwLCAxMDAsIDUwLCAxMH0sCi17NSwgMTAsIDEwMCwgNTAsIDEwfSwKLXs2LCAxMCwgMTAwLCA1MCwgMTB9LAotezcsIDEwLCAxMDAsIDUwLCAxMH0sCi17OCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs5LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExLCAxMCwgMTEsIDEwLCAxfSwKLXsxMiwgMTAsIDEyLCAxMCwgMn0sCi17MTMsIDEwLCAxMywgMTAsIDN9LAotezE0LCAxMCwgMTQsIDEwLCA0fSwKLXsxNSwgMTAsIDE1LCAxMCwgNX0sCi17MTYsIDEwLCAxNiwgMTAsIDZ9LAotezE3LCAxMCwgMTcsIDEwLCA3fSwKLXsxOCwgMTAsIDE4LCAxMCwgOH0sCi17MTksIDEwLCAxOSwgMTAsIDl9LAotezIwLCAxMCwgMjAsIDEwLCAxMH0sCi17MjEsIDEwLCAyMSwgMTEsIDEwfSwKLXsyMiwgMTAsIDIyLCAxMiwgMTB9LAotezIzLCAxMCwgMjMsIDEzLCAxMH0sCi17MjQsIDEwLCAyNCwgMTQsIDEwfSwKLXsyNSwgMTAsIDI1LCAxNSwgMTB9LAotezI2LCAxMCwgMjYsIDE2LCAxMH0sCi17MjcsIDEwLCAyNywgMTcsIDEwfSwKLXsyOCwgMTAsIDI4LCAxOCwgMTB9LAotezI5LCAxMCwgMjksIDE5LCAxMH0sCi17MzAsIDEwLCAzMCwgMjAsIDEwfSwKLXszMSwgMTAsIDMxLCAyMSwgMTB9LAotezMyLCAxMCwgMzIsIDIyLCAxMH0sCi17MzMsIDEwLCAzMywgMjMsIDEwfSwKLXszNCwgMTAsIDM0LCAyNCwgMTB9LAotezM1LCAxMCwgMzUsIDI1LCAxMH0sCi17MzYsIDEwLCAzNiwgMjYsIDEwfSwKLXszNywgMTAsIDM3LCAyNywgMTB9LAotezM4LCAxMCwgMzgsIDI4LCAxMH0sCi17MzksIDEwLCAzOSwgMjksIDEwfSwKLXs0MCwgMTAsIDQwLCAzMCwgMTB9LAotezQxLCAxMCwgNDEsIDMxLCAxMH0sCi17NDIsIDEwLCA0MiwgMzIsIDEwfSwKLXs0MywgMTAsIDQzLCAzMywgMTB9LAotezQ0LCAxMCwgNDQsIDM0LCAxMH0sCi17NDUsIDEwLCA0NSwgMzUsIDEwfSwKLXs0NiwgMTAsIDQ2LCAzNiwgMTB9LAotezQ3LCAxMCwgNDcsIDM3LCAxMH0sCi17NDgsIDEwLCA0OCwgMzgsIDEwfSwKLXs0OSwgMTAsIDQ5LCAzOSwgMTB9LAotezUwLCAxMCwgNTAsIDQwLCAxMH0sCi17NTEsIDEwLCA1MSwgNDEsIDEwfSwKLXs1MiwgMTAsIDUyLCA0MiwgMTB9LAotezUzLCAxMCwgNTMsIDQzLCAxMH0sCi17NTQsIDEwLCA1NCwgNDQsIDEwfSwKLXs1NSwgMTAsIDU1LCA0NSwgMTB9LAotezU2LCAxMCwgNTYsIDQ2LCAxMH0sCi17NTcsIDEwLCA1NywgNDcsIDEwfSwKLXs1OCwgMTAsIDU4LCA0OCwgMTB9LAotezU5LCAxMCwgNTksIDQ5LCAxMH0sCi17NjAsIDEwLCA2MCwgNTAsIDEwfSwKLXs2MSwgMTAsIDYxLCA1MCwgMTB9LAotezYyLCAxMCwgNjIsIDUwLCAxMH0sCi17NjMsIDEwLCA2MywgNTAsIDEwfSwKLXs2NCwgMTAsIDY0LCA1MCwgMTB9LAotezY1LCAxMCwgNjUsIDUwLCAxMH0sCi17NjYsIDEwLCA2NiwgNTAsIDEwfSwKLXs2NywgMTAsIDY3LCA1MCwgMTB9LAotezY4LCAxMCwgNjgsIDUwLCAxMH0sCi17NjksIDEwLCA2OSwgNTAsIDEwfSwKLXs3MCwgMTAsIDcwLCA1MCwgMTB9LAotezcxLCAxMCwgNzEsIDUwLCAxMH0sCi17NzIsIDEwLCA3MiwgNTAsIDEwfSwKLXs3MywgMTAsIDczLCA1MCwgMTB9LAotezc0LCAxMCwgNzQsIDUwLCAxMH0sCi17NzUsIDEwLCA3NSwgNTAsIDEwfSwKLXs3NiwgMTAsIDc2LCA1MCwgMTB9LAotezc3LCAxMCwgNzcsIDUwLCAxMH0sCi17NzgsIDEwLCA3OCwgNTAsIDEwfSwKLXs3OSwgMTAsIDc5LCA1MCwgMTB9LAotezgwLCAxMCwgODAsIDUwLCAxMH0sCi17ODEsIDEwLCA4MSwgNTAsIDEwfSwKLXs4MiwgMTAsIDgyLCA1MCwgMTB9LAotezgzLCAxMCwgODMsIDUwLCAxMH0sCi17ODQsIDEwLCA4NCwgNTAsIDEwfSwKLXs4NSwgMTAsIDg1LCA1MCwgMTB9LAotezg2LCAxMCwgODYsIDUwLCAxMH0sCi17ODcsIDEwLCA4NywgNTAsIDEwfSwKLXs4OCwgMTAsIDg4LCA1MCwgMTB9LAotezg5LCAxMCwgODksIDUwLCAxMH0sCi17OTAsIDEwLCA5MCwgNTAsIDEwfSwKLXs5MSwgMTAsIDkxLCA1MCwgMTB9LAotezkyLCAxMCwgOTIsIDUwLCAxMH0sCi17OTMsIDEwLCA5MywgNTAsIDEwfSwKLXs5NCwgMTAsIDk0LCA1MCwgMTB9LAotezk1LCAxMCwgOTUsIDUwLCAxMH0sCi17OTYsIDEwLCA5NiwgNTAsIDEwfSwKLXs5NywgMTAsIDk3LCA1MCwgMTB9LAotezk4LCAxMCwgOTgsIDUwLCAxMH0sCi17OTksIDEwLCA5OSwgNTAsIDEwfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAxLCAxMCwgMTAxLCA1MCwgMTB9LAotezEwMiwgMTAsIDEwMiwgNTAsIDEwfSwKLXsxMDMsIDEwLCAxMDMsIDUwLCAxMH0sCi17MTA0LCAxMCwgMTA0LCA1MCwgMTB9LAotezEwNSwgMTAsIDEwNSwgNTAsIDEwfSwKLXsxMDYsIDEwLCAxMDYsIDUwLCAxMH0sCi17MTA3LCAxMCwgMTA3LCA1MCwgMTB9LAotezEwOCwgMTAsIDEwOCwgNTAsIDEwfSwKLXsxMDksIDEwLCAxMDksIDUwLCAxMH0sCi17MTEwLCAxMCwgMTEwLCA1MCwgMTB9LAotezExMSwgMTAsIDExMSwgNTAsIDEwfSwKLXsxMTIsIDEwLCAxMTIsIDUwLCAxMH0sCi17MTEzLCAxMCwgMTEzLCA1MCwgMTB9LAotezExNCwgMTAsIDExNCwgNTAsIDEwfSwKLXsxMTUsIDEwLCAxMTUsIDUwLCAxMH0sCi17MTE2LCAxMCwgMTE2LCA1MCwgMTB9LAotezExNywgMTAsIDExNywgNTAsIDEwfSwKLXsxMTgsIDEwLCAxMTgsIDUwLCAxMH0sCi17MTE5LCAxMCwgMTE5LCA1MCwgMTB9LAotezEyMCwgMTAsIDEyMCwgNTAsIDEwfSwKLXsxMjEsIDEwLCAxMjEsIDUwLCAxMH0sCi17MTIyLCAxMCwgMTIyLCA1MCwgMTB9LAotezEyMywgMTAsIDEyMywgNTAsIDEwfSwKLXsxMjQsIDEwLCAxMjQsIDUwLCAxMH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotCi0Jc2xpZGVyLnNldE1heGltdW0oMTAwKTsKLQlzbGlkZXIuc2V0TWluaW11bSgxMCk7Ci0Jc2xpZGVyLnNldFRodW1iKDEwKTsKLQlzbGlkZXIuc2V0U2VsZWN0aW9uKDUwKTsKLQotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFNlbGVjdGlvblZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCAxMCwgMTB9LAotey0xNCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTksIDEwLCAxMDAsIDEwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDEwLCAxMH0sCi17MCwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxLCAxMCwgMTAwLCAxMCwgMTB9LAotezIsIDEwLCAxMDAsIDEwLCAxMH0sCi17MywgMTAsIDEwMCwgMTAsIDEwfSwKLXs0LCAxMCwgMTAwLCAxMCwgMTB9LAotezUsIDEwLCAxMDAsIDEwLCAxMH0sCi17NiwgMTAsIDEwMCwgMTAsIDEwfSwKLXs3LCAxMCwgMTAwLCAxMCwgMTB9LAotezgsIDEwLCAxMDAsIDEwLCAxMH0sCi17OSwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxMSwgMTAsIDEwMCwgMTEsIDEwfSwKLXsxMiwgMTAsIDEwMCwgMTIsIDEwfSwKLXsxMywgMTAsIDEwMCwgMTMsIDEwfSwKLXsxNCwgMTAsIDEwMCwgMTQsIDEwfSwKLXsxNSwgMTAsIDEwMCwgMTUsIDEwfSwKLXsxNiwgMTAsIDEwMCwgMTYsIDEwfSwKLXsxNywgMTAsIDEwMCwgMTcsIDEwfSwKLXsxOCwgMTAsIDEwMCwgMTgsIDEwfSwKLXsxOSwgMTAsIDEwMCwgMTksIDEwfSwKLXsyMCwgMTAsIDEwMCwgMjAsIDEwfSwKLXsyMSwgMTAsIDEwMCwgMjEsIDEwfSwKLXsyMiwgMTAsIDEwMCwgMjIsIDEwfSwKLXsyMywgMTAsIDEwMCwgMjMsIDEwfSwKLXsyNCwgMTAsIDEwMCwgMjQsIDEwfSwKLXsyNSwgMTAsIDEwMCwgMjUsIDEwfSwKLXsyNiwgMTAsIDEwMCwgMjYsIDEwfSwKLXsyNywgMTAsIDEwMCwgMjcsIDEwfSwKLXsyOCwgMTAsIDEwMCwgMjgsIDEwfSwKLXsyOSwgMTAsIDEwMCwgMjksIDEwfSwKLXszMCwgMTAsIDEwMCwgMzAsIDEwfSwKLXszMSwgMTAsIDEwMCwgMzEsIDEwfSwKLXszMiwgMTAsIDEwMCwgMzIsIDEwfSwKLXszMywgMTAsIDEwMCwgMzMsIDEwfSwKLXszNCwgMTAsIDEwMCwgMzQsIDEwfSwKLXszNSwgMTAsIDEwMCwgMzUsIDEwfSwKLXszNiwgMTAsIDEwMCwgMzYsIDEwfSwKLXszNywgMTAsIDEwMCwgMzcsIDEwfSwKLXszOCwgMTAsIDEwMCwgMzgsIDEwfSwKLXszOSwgMTAsIDEwMCwgMzksIDEwfSwKLXs0MCwgMTAsIDEwMCwgNDAsIDEwfSwKLXs0MSwgMTAsIDEwMCwgNDEsIDEwfSwKLXs0MiwgMTAsIDEwMCwgNDIsIDEwfSwKLXs0MywgMTAsIDEwMCwgNDMsIDEwfSwKLXs0NCwgMTAsIDEwMCwgNDQsIDEwfSwKLXs0NSwgMTAsIDEwMCwgNDUsIDEwfSwKLXs0NiwgMTAsIDEwMCwgNDYsIDEwfSwKLXs0NywgMTAsIDEwMCwgNDcsIDEwfSwKLXs0OCwgMTAsIDEwMCwgNDgsIDEwfSwKLXs0OSwgMTAsIDEwMCwgNDksIDEwfSwKLXs1MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs1MSwgMTAsIDEwMCwgNTEsIDEwfSwKLXs1MiwgMTAsIDEwMCwgNTIsIDEwfSwKLXs1MywgMTAsIDEwMCwgNTMsIDEwfSwKLXs1NCwgMTAsIDEwMCwgNTQsIDEwfSwKLXs1NSwgMTAsIDEwMCwgNTUsIDEwfSwKLXs1NiwgMTAsIDEwMCwgNTYsIDEwfSwKLXs1NywgMTAsIDEwMCwgNTcsIDEwfSwKLXs1OCwgMTAsIDEwMCwgNTgsIDEwfSwKLXs1OSwgMTAsIDEwMCwgNTksIDEwfSwKLXs2MCwgMTAsIDEwMCwgNjAsIDEwfSwKLXs2MSwgMTAsIDEwMCwgNjEsIDEwfSwKLXs2MiwgMTAsIDEwMCwgNjIsIDEwfSwKLXs2MywgMTAsIDEwMCwgNjMsIDEwfSwKLXs2NCwgMTAsIDEwMCwgNjQsIDEwfSwKLXs2NSwgMTAsIDEwMCwgNjUsIDEwfSwKLXs2NiwgMTAsIDEwMCwgNjYsIDEwfSwKLXs2NywgMTAsIDEwMCwgNjcsIDEwfSwKLXs2OCwgMTAsIDEwMCwgNjgsIDEwfSwKLXs2OSwgMTAsIDEwMCwgNjksIDEwfSwKLXs3MCwgMTAsIDEwMCwgNzAsIDEwfSwKLXs3MSwgMTAsIDEwMCwgNzEsIDEwfSwKLXs3MiwgMTAsIDEwMCwgNzIsIDEwfSwKLXs3MywgMTAsIDEwMCwgNzMsIDEwfSwKLXs3NCwgMTAsIDEwMCwgNzQsIDEwfSwKLXs3NSwgMTAsIDEwMCwgNzUsIDEwfSwKLXs3NiwgMTAsIDEwMCwgNzYsIDEwfSwKLXs3NywgMTAsIDEwMCwgNzcsIDEwfSwKLXs3OCwgMTAsIDEwMCwgNzgsIDEwfSwKLXs3OSwgMTAsIDEwMCwgNzksIDEwfSwKLXs4MCwgMTAsIDEwMCwgODAsIDEwfSwKLXs4MSwgMTAsIDEwMCwgODEsIDEwfSwKLXs4MiwgMTAsIDEwMCwgODIsIDEwfSwKLXs4MywgMTAsIDEwMCwgODMsIDEwfSwKLXs4NCwgMTAsIDEwMCwgODQsIDEwfSwKLXs4NSwgMTAsIDEwMCwgODUsIDEwfSwKLXs4NiwgMTAsIDEwMCwgODYsIDEwfSwKLXs4NywgMTAsIDEwMCwgODcsIDEwfSwKLXs4OCwgMTAsIDEwMCwgODgsIDEwfSwKLXs4OSwgMTAsIDEwMCwgODksIDEwfSwKLXs5MCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MSwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MiwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MywgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NSwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NiwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NywgMTAsIDEwMCwgOTAsIDEwfSwKLXs5OCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5OSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDAsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAxLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDMsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA0LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDYsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA3LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwOCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDksIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEwLCAxMCwgMTAwLCA5MCwgMTB9LAotezExMSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTIsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEzLCAxMCwgMTAwLCA5MCwgMTB9LAotezExNCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTUsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE2LCAxMCwgMTAwLCA5MCwgMTB9LAotezExNywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTgsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE5LCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjEsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIyLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjQsIDEwLCAxMDAsIDkwLCAxMH0sCi19OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0Fycm93U2VsZWN0aW9uKCkgewotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChzbGlkZXIuZ2V0U2l6ZSgpLngtMTAsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BUlJPV19SSUdIVCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjUsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg0NSwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDksIDUsIDMwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTI0ZDJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TeW5jaHJvbml6ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlN5bmNocm9uaXplcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSgpIHsKLQkvLyB0ZXN0ZWQgaW4gVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5LnRlc3Rfc2V0U3luY2hyb25pemVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplcgotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjI4ZDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQluZXcgVGFiRm9sZGVyKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVRyaW1JSUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2xpZW50QXJlYSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKT09aSk7Ci0JICAJbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRUcnVlKCI6YToiICtTdHJpbmcudmFsdWVPZihpKSwgdGFiRm9sZGVyLmdldEl0ZW0oaSkuZXF1YWxzKGl0ZW1zW2ldKSk7Ci0JfQotCXRyeSB7Ci0JCXRhYkZvbGRlci5nZXRJdGVtKG51bWJlcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJdGFiRm9sZGVyLmdldEl0ZW0obnVtYmVyKzEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCXRhYkZvbGRlci5nZXRJdGVtKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCWludCBudW1iZXIgPSA1OwotCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdGFiRm9sZGVyLmdldEl0ZW1zKCkubGVuZ3RoKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKSk7Ci0JCi0JdGFiRm9sZGVyLmdldEl0ZW1zKClbMF0uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFiRm9sZGVyLmdldEl0ZW1zKCkpOwotCi0JdGFiRm9sZGVyLmdldEl0ZW1zKClbM10uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM119LCB0YWJGb2xkZXIuZ2V0SXRlbXMoKSk7Ci0KLQl0YWJGb2xkZXIuZ2V0SXRlbXMoKVsxXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzNdfSwgdGFiRm9sZGVyLmdldEl0ZW1zKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JVGFiSXRlbVtdIHRpcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAl0aXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCX0KLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKClbMF0gPT0gdGlzWzBdKTsJCi0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpKTsKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKVswXT09dGlzW2ldKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKT09MCk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk9PTIpOwotCQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFRydWUoIjpjOiIsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpPT0wKTsKLQkKLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGl0ZW1zWzJdKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKT09Mik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtKCkgewotCWludCBudW1iZXIgPSAxMDsKLQlUYWJJdGVtW10gdGlzID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCXRpc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCB0YWJGb2xkZXIuaW5kZXhPZih0aXNbaV0pPT1pKTsKLQl9Ci0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAl0aXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQl0cnkgewotCQkJdGFiRm9sZGVyLmluZGV4T2YobnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB0YWJJdGVtID09IG51bGwiKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsJCi0JbnVtYmVyID0gMjA7Ci0JVGFiSXRlbVtdIGl0ZW1zID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCQlpdGVtc1tpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQkvL2Fub3RoZXIgdGFiRm9sZGVyCi0JVGFiRm9sZGVyIHRhYkZvbGRlcl8yID0gbmV3IFRhYkZvbGRlcihzaGVsbCwgMCk7Ci0JVGFiSXRlbVtdIGl0ZW1zXzIgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNfMltpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlcl8yLCAwKTsKLQkJaXRlbXNfMltpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBTdHJpbmcudmFsdWVPZihpKSwgdGFiRm9sZGVyLmluZGV4T2YoaXRlbXNfMltpXSk9PS0xKTsKLQl9Ci0KLQkvLwotCVRhYkZvbGRlciB0YWJGb2xkZXIyID0gbmV3IFRhYkZvbGRlcihzaGVsbCwgU1dULk5VTEwpOwotCVRhYkl0ZW0gdGFiSXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlcjIsIFNXVC5OVUxMKTsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJGb2xkZXIuaW5kZXhPZih0YWJJdGVtKSA9PSAtMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uRW1wdHkoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpKTsKLQkJYXNzZXJ0RXF1YWxzKGksIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKC0xKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpLmxlbmd0aCk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpKTsKLQkJYXNzZXJ0RXF1YWxzKGksIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAluZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCSAgCWFzc2VydEVxdWFscygiaT0iICsgaSwgMCwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQludW1iZXIgPSA1OwotCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCXRyeSB7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oKFRhYkl0ZW0pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JZmluYWxseSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzBdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JdHJ5IHsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigoVGFiSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1swXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCWl0ZW1zID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzBdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbNF19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1syXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1sxXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG51bWJlciArIDEpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzFdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsJCi0KLS8vCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oLTEpOwotLy8JYXNzZXJ0RXF1YWxzKDAsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKS5sZW5ndGgpOwkKLQkKLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDMpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzNdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQotLy8JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigtMik7Ci0vLwlhc3NlcnRFcXVhbHMoMCwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpLmxlbmd0aCk7CQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaXRlbXNbMF0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzBdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzBdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IFRhYkl0ZW1bXSB7aXRlbXNbM119KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXSB7aXRlbXNbM119LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IFRhYkl0ZW1bXSB7aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXSB7aXRlbXNbNF19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtdIHtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtdIHtpdGVtc1syXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtdIHtpdGVtc1sxXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtdIHtpdGVtc1sxXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7CQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl0cnkgewotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKCBuZXcgVGFiSXRlbVtde2l0ZW1zWzBdLCBudWxsfSk7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oIG5ldyBUYWJJdGVtW117bnVsbH0pOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMF19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25FbXB0eSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfUGd1cFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpKSB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpKSB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25FbXB0eSIpKSB0ZXN0X3NldFNlbGVjdGlvbkVtcHR5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQotcHJpdmF0ZSB2b2lkIG1ha2VDbGVhbkVudmlyb25tZW50KCkgewotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotCXRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIDApOwotCXNldFdpZGdldCh0YWJGb2xkZXIpOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVGFiRm9sZGVyKFZlY3RvciBldmVudHMpIHsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIlRhYkl0ZW0gJiIgKyBpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiVGFiSXRlbSBUb29sVGlwIiArIGkpOwotCQlUZXh0IGl0ZW1UZXh0ID0gbmV3IFRleHQodGFiRm9sZGVyLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJaXRlbVRleHQuc2V0VGV4dCgiXG5UZXh0IGZvciBUYWJJdGVtICIgKyBpICsgIlxuXG5cbiIpOwotCQlpdGVtLnNldENvbnRyb2woaXRlbVRleHQpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbSwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQl9Ci0JCi0vLwl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge3RhYkZvbGRlci5nZXRJdGVtKDApfSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfUklHSFQsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHRhYkZvbGRlci5nZXRTaXplKCkueC8yLCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQ1RSTCwgMCwgU1dULlBBR0VfRE9XTiwgQ29uc2lzdGVuY3lVdGlsaXR5LkRPVUJMRV9LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbigyKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5DVFJMLCAwLCBTV1QuUEFHRV9VUCwgQ29uc2lzdGVuY3lVdGlsaXR5LkRPVUJMRV9LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICB0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDEpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNTAsIDUsIDcwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyMzViMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIDApOwotCXRhYkl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCXNldFdpZGdldCh0YWJJdGVtKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXJJKCkgewotCXRyeSB7Ci0JCW5ldyBUYWJJdGVtKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcklJKCkgewotCVRhYkl0ZW0gdEl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMLCAwKTsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKVswXSA9PSB0SXRlbSk7Ci0JCi0JdEl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMLCAxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFiRm9sZGVyLmdldEl0ZW1zKClbMV0gPT0gdEl0ZW0pOwotCQkJCQotCXRJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCwgMSk7CQotCWFzc2VydFRydWUoIjpjOiIsIHRhYkZvbGRlci5nZXRJdGVtcygpWzFdID09IHRJdGVtKTsKLQotCXRyeSB7Ci0JCW5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwsIC0xKTsJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRUcnVlKCI6ZDoiLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKVsxXSA9PSB0SXRlbSk7CQkJCi0JfQotCXRyeSB7Ci0JCW5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwsIHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKSArIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0VHJ1ZSgiOmU6IiwgdGFiRm9sZGVyLmdldEl0ZW1zKClbMV0gPT0gdEl0ZW0pOwotCX0KLQl0cnkgewotCQluZXcgVGFiSXRlbShudWxsLCBTV1QuTlVMTCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRhYkl0ZW0uZ2V0UGFyZW50KCkgPT0gdGFiRm9sZGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb29sVGlwVGV4dCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9vbFRpcFRleHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JQ29udHJvbCBjb250cm9sID0gbmV3IFRhYmxlKHRhYkZvbGRlciwgU1dULk5VTEwpOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRhYkl0ZW0uZ2V0Q29udHJvbCgpID09IG51bGwpOwkKLQotCXRhYkl0ZW0uc2V0Q29udHJvbChjb250cm9sKTsKLQlhc3NlcnRUcnVlKCI6YjogIiwgdGFiSXRlbS5nZXRDb250cm9sKCkgPT0gY29udHJvbCk7Ci0KLQl0YWJJdGVtLnNldENvbnRyb2wobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6ICIsIHRhYkl0ZW0uZ2V0Q29udHJvbCgpID09IG51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRhYkl0ZW0uc2V0VG9vbFRpcFRleHQoImZyZWQiKTsKLQlhc3NlcnRUcnVlKCI6YTogIiwgdGFiSXRlbS5nZXRUb29sVGlwVGV4dCgpLmVxdWFscygiZnJlZCIpKTsKLQl0YWJJdGVtLnNldFRvb2xUaXBUZXh0KCJmcmVkdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6ICIsIHRhYkl0ZW0uZ2V0VG9vbFRpcFRleHQoKS5lcXVhbHMoImZyZWR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQiKSk7Ci0JdGFiSXRlbS5zZXRUb29sVGlwVGV4dChudWxsKTsKLQlhc3NlcnRUcnVlKCI6YzogIiwgdGFiSXRlbS5nZXRUb29sVGlwVGV4dCgpID09IG51bGwpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9vbFRpcFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcklJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvb2xUaXBUZXh0IikpIHRlc3RfZ2V0VG9vbFRpcFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotVGFiRm9sZGVyIHRhYkZvbGRlcjsKLVRhYkl0ZW0gdGFiSXRlbTsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyMTY3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsgLy8gYnkgZGVmYXVsdCwgdXNlIG11bHRpLXNlbGVjdCB0YWJsZS4JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGUobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3QkSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHswLCAzfSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHsxLCAyfSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHsxLCAzLCA1fSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHs5LCAzLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cnl7Ci0JCXRhYmxlLmRlc2VsZWN0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdChuZXcgaW50W10ge30pOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHstMSwgMTAwLCAtMTAwMH0pOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHsyLCAtMSwgMSwgMTAwLCAyfSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci0yLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdChuZXcgaW50W10gezIsIC0xLCAxLCAxMDAsIDJ9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7MiwgLTEsIDMsIDEwMCwgMn0pOwotCWFzc2VydEVxdWFscyhudW1iZXItMywgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RBbGwoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezIsIDQsIDUsIDEwfSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDQsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0KDApOwkKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHswLCAzLCA2fSk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoMCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0KDApOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDUpOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDMpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdCgxMDApOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdElJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHswLCAzLCA2fSk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoNywgMTApOwotCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDYsIDEwKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgxLCAxMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoMCwgMTApOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDAsIDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgtMTAsIDIpOwotCWFzc2VydEVxdWFscyhudW1iZXItMywgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgtMTAsIDIwMDApOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KDIwMDAsIC0xMCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JCi0JdGFibGUuZGVzZWxlY3QoMCwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscyhudW1iZXItMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdChudW1iZXItMSwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhudW1iZXItMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JdGFibGUuZGVzZWxlY3QoLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KG51bWJlciwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5Db3VudCgpIHsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpKTsKLQljb2x1bW4yLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uSSgpIHsKLQl0cnkgewotCQl0YWJsZS5nZXRDb2x1bW4oMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCXRyeSB7Ci0JCXRhYmxlLmdldENvbHVtbigxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoY29sdW1uMCwgdGFibGUuZ2V0Q29sdW1uKDApKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjEsIHRhYmxlLmdldENvbHVtbigxKSk7Ci0JY29sdW1uMS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdGFibGUuZ2V0Q29sdW1uKDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWNvbHVtbjAuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlLmdldENvbHVtbigwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5zKCkgewotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygxLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIGNvbHVtbnNbMF0pOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULlJJR0hULCAxKTsKLQljb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygyLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIGNvbHVtbnNbMF0pOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCBjb2x1bW5zWzFdKTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQljb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygxLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjEsIGNvbHVtbnNbMF0pOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5PcmRlcigpIHsKLQkvL2luIHRlc3Rfc2V0QUNvbHVtbk9yZGVyJEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRHcmlkTGluZVdpZHRoKCkgewotCS8vIGV4ZWN1dGUgbWV0aG9kIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8gY2hlY2sgdGhlIHZhbHVlIHNpbmNlIGl0IG1heSBiZSBhbnl0aGluZyBpbmNsdWRpbmcgMAotCXRhYmxlLmdldEdyaWRMaW5lV2lkdGgoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWFkZXJIZWlnaHQoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUodGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkgPiAwKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlYWRlclZpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50W10gY2FzZXMgPSB7MCwgMTAsIDEwMH07Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCW5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaj0iKyBqLCBjYXNlc1tqXSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCQl0YWJsZS5yZW1vdmVBbGwoKTsKLQl9Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7CQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQluZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImo9IisgaiwgY2FzZXNbal0sIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1IZWlnaHQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IEl0ZW0gaGVpZ2h0IDw9IDAiLCB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgPiAwKTsKLQluZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlhc3NlcnRUcnVlKCI6YjogSXRlbSBoZWlnaHQgPD0gMCIsIHRhYmxlLmdldEl0ZW1IZWlnaHQoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKCJpPSIgKyBpLCBpdGVtc1tpXSwgdGFibGUuZ2V0SXRlbShpKSk7Ci0JdHJ5IHsKLQkJdGFibGUuZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0YWJsZS5nZXRJdGVtKG51bWJlcisxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoImk9IiArIGksIGl0ZW1zW2ldLCB0YWJsZS5nZXRJdGVtKGkpKTsKLQl9Ci0JdHJ5IHsKLQkJdGFibGUuZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0YWJsZS5nZXRJdGVtKG51bWJlcisxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50W10gY2FzZXMgPSB7MCwgMTAsIDEwMH07Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCW5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaj0iICsgaiwgY2FzZXNbal0sIHRhYmxlLmdldEl0ZW1zKCkubGVuZ3RoKTsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCi0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQkJdGkuc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JCX0KLQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImo9IiArIGogKyAiLCBpPSIgKyBpLCBTdHJpbmcudmFsdWVPZihpKSwgaXRlbXNbaV0uZ2V0VGV4dCgpKTsKLQkJfQotCQl0YWJsZS5yZW1vdmVBbGwoKTsKLQl9Ci0JCi0JLy8gbm90ZSBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCW5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaj0iICsgaiwgY2FzZXNbal0sIHRhYmxlLmdldEl0ZW1zKCkubGVuZ3RoKTsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJCXRpLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCQl9Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJqPSIgKyBqICsgIiwgaT0iICsgaSwgU3RyaW5nLnZhbHVlT2YoaSksIGl0ZW1zW2ldLmdldFRleHQoKSk7Ci0JCX0KLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVzVmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRMaW5lc1Zpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzEwXSwgaXRlbXNbbnVtYmVyLTFdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZShpdGVtcywgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtc1swXSk7Ci0JYXNzZXJ0U2FtZShuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzBdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzEwXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zW251bWJlci0xXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxMF0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXNbMl0pOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKC0xLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtc1sxMF0pOwotCWFzc2VydEVxdWFscygxMCwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoLTEsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscyhudW1iZXIgLSAxLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygxMCwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMoLTEsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MiwgMTAsIG51bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsgLy8gMTAgPCBudW1iZXIKLQotCWludFtdIGFsbCA9IG5ldyBpbnRbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXI7IGkrKykKLQkJYWxsW2ldPWk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRTYW1lKGFsbCwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117bnVtYmVyLTF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezEwfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtde30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wSW5kZXgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvcEluZGV4IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCkgewotCWludCBudW1iZXIgPSAyMDsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJaXRlbXNbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoaSwgdGFibGUuaW5kZXhPZihpdGVtc1tpXSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJdHJ5IHsKLQkJCXRhYmxlLmluZGV4T2YoKFRhYmxlSXRlbSludWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRhYmxlSXRlbSA9PSBudWxsIik7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvLyBhbm90aGVyIHRhYmxlCi0JVGFibGUgdGFibGVfMiA9IG5ldyBUYWJsZShzaGVsbCwgMCk7Ci0JVGFibGVJdGVtW10gaXRlbXNfMiA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zXzJbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlXzIsIDApOwotCQlpdGVtc18yW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJpPSIgKyBpLCAtMSwgdGFibGUuaW5kZXhPZihpdGVtc18yW2ldKSk7Ci0JfQotCQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQludW1iZXIgPSAyMDsKLQlpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJaXRlbXNbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoaSwgdGFibGUuaW5kZXhPZihpdGVtc1tpXSkpOwotCX0KLQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQlpdGVtc1tpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQl0YWJsZS5pbmRleE9mKChUYWJsZUl0ZW0pbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB0YWJsZUl0ZW0gPT0gbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQlpdGVtc1tpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQkvLyBhbm90aGVyIHRhYmxlCi0JdGFibGVfMiA9IG5ldyBUYWJsZShzaGVsbCwgMCk7Ci0JaXRlbXNfMiA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zXzJbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlXzIsIDApOwotCQlpdGVtc18yW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJpPSIgKyBpLCAtMSwgdGFibGUuaW5kZXhPZihpdGVtc18yW2ldKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzU2VsZWN0ZWRJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydFRydWUoIjphOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpZiAoaSA9PSAyIHx8IGkgPT0gbnVtYmVyLTEgfHwgaSA9PSAxMCkKLQkJCWFzc2VydFRydWUoIjpiOiIgKyBpLCB0YWJsZS5pc1NlbGVjdGVkKGkpKTsKLQkJZWxzZQotCQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksICF0YWJsZS5pc1NlbGVjdGVkKGkpKTsKLQl9Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zWzBdKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWlmIChpID09IDApCi0JCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JCWVsc2UKLQkJCWFzc2VydFRydWUoIjpiOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JfQotCQotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmM6IiArIGksIHRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQkJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6ZDoiICsgaSwgIXRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzEwXX0pOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaWYgKGkgPT0gMTApCi0JCQlhc3NlcnRUcnVlKCI6ZToiICsgaSwgdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JCWVsc2UKLQkJCWFzc2VydFRydWUoIjplOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JfQotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjpmOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZSRJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGFibGVJdGVtcyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShuZXcgaW50W10gezIsIDEsIDAsIC0xMDAsIDUsIDUsIDIsIDEsIDAsIDAsIDB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudHMiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShuZXcgaW50W10gezIsIDEsIDAsIG51bWJlciwgNSwgNSwgMiwgMSwgMCwgMCwgMH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50cyIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7fSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRUcnVlKCI6YToiLCAhaXRlbXNbMl0uaXNEaXNwb3NlZCgpKTsKLQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgaXRlbXNbMl0uaXNEaXNwb3NlZCgpKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCWFzc2VydFRydWUoIjpjOiIsICFpdGVtc1tudW1iZXItMV0uaXNEaXNwb3NlZCgpKTsKLQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHtudW1iZXItMn0pOwotCWFzc2VydFRydWUoIjpkOiIsIGl0ZW1zW251bWJlci0xXS5pc0Rpc3Bvc2VkKCkpOwotCWFzc2VydEVxdWFscyhudW1iZXItMiwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JYXNzZXJ0VHJ1ZSgiOmU6IiwgIWl0ZW1zWzNdLmlzRGlzcG9zZWQoKSk7Ci0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydFRydWUoIjpmOiIsIGl0ZW1zWzNdLmlzRGlzcG9zZWQoKSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci0zLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQlhc3NlcnRUcnVlKCI6ZzoiLCAhaXRlbXNbMF0uaXNEaXNwb3NlZCgpKTsKLQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHswfSk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgaXRlbXNbMF0uaXNEaXNwb3NlZCgpKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTQsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBbGwoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5yZW1vdmVBbGwoKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnJlbW92ZUFsbCgpOwotCXRhYmxlLnJlbW92ZUFsbCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZSgtbnVtYmVyLCBudW1iZXIgKyAxMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IHJhbmdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHt9Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoMiwgMyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMV0sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUoMiwgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhpdGVtcywgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUoMiwgbnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhpdGVtcywgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDIsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbMV19LCB0YWJsZS5nZXRJdGVtcygpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDAsIDMpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgwLCBudW1iZXItMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnJlbW92ZShuZXcgaW50W10ge30pOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKC0yMCwgLTEwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhpdGVtcywgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKDIwLCA0MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgyMDAsIDQwKTsKLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDIsIDIpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzFdLCBpdGVtc1szXSwgaXRlbXNbNF19LCB0YWJsZS5nZXRJdGVtcygpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoNCwgNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUoLTEwLCAyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KSB7Ci0JCXRhYmxlLnJlbW92ZSgxMCwgMik7Ci0JCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0JdGFibGUucmVtb3ZlKDAsIDIpOwotCWFzc2VydEVxdWFscyhudW1iZXIgLSAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKDEsIDIwMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMobnVtYmVyIC0gMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s0XX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUucmVtb3ZlKDAsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKG51bWJlciwgbnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKG51bWJlciwgbnVtYmVyICsgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQludW1iZXIgPSAxNTsKLQlpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7MiwgMSwgMCwgNSwgNX0pOwotCWFzc2VydEVxdWFscyhudW1iZXItNCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3QkSSgpIHsKLQl0cnkgewotCQl0YWJsZS5zZWxlY3QobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MiwgMTAsIDE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezIsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxMCwgMiwgMTR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MiwgMTAsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChuZXcgaW50W10ge251bWJlciwgMCwgbnVtYmVyLTF9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MCwgbnVtYmVyLTF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7bnVtYmVyLCAwLCAtMX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MCwgMTB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MCwgMiwgMTB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezAsIDIsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxNX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gey0xfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7NCwgNCwgNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsgCi0JCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRyeSB7Ci0JCXRhYmxlLnNlbGVjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JfQotCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxMH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsxMH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsyfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxNX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gey0xfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTAsIDIsIDE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7NCwgNCwgNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEFsbCgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDEsIDIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiB0YWJsZQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMobmV3IGludFtde30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTAsIDIsIDE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezIsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KDcpOwotCWFzc2VydFNhbWUobmV3IGludFtdezIsIDcsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoMCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMiwgNywgMTAsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUJCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2VsZWN0KDApOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDEwKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHsxMH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QobnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge251bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgtMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdElJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezEwLCAyLCAxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsyLCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdCg3KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsyLCA3LCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDApOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDcsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNCwgMTApOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNCwgMTQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgNyk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCg5LCA1KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZWxlY3QoLTEwMCwgMTAwMCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0KDAsIDEwMDApOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QobnVtYmVyLTEsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QobnVtYmVyLCBudW1iZXIpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCg0LCA0KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgxMCwgMTApOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezEwfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdChudW1iZXItMSwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge251bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG51bWJlciwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDAsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KC0xLCBudW1iZXIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNCwgNSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCg1LCA0KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb2x1bW5PcmRlciRJKCkgewotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50WzBdKTsKLQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Q29sdW1uT3JkZXIoKSwgbmV3IGludFswXSk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFsxXSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JCi0JVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldENvbHVtbk9yZGVyKCksIG5ldyBpbnRbXXswLCAxLCAyfSk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFswXSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFtdezAsMX0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbXXswLCAxLCAyLCAzfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFtdezAsIDAsIDF9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQl0cnkgewotCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50W117MywgMCwgMX0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbXXsyLCAxLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldENvbHVtbk9yZGVyKCksIG5ldyBpbnRbXSB7MiwgMSwgMH0pOwotCWNvbHVtbjIuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50W10gezEsIDB9KTsKLQl0cnkgewotCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50W117MCwgMSwgMn0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50W117MH0pOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50WzBdKTsKLQl0cnkgewotCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50WzFdKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQlUYWJsZSB0YWJsZTIgPSBuZXcgVGFibGUodGFibGUuZ2V0UGFyZW50KCksIFNXVC5OT05FKTsKLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlMi5nZXRDb2x1bW5PcmRlcigpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUyLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbMF0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhlYWRlclZpc2libGVaKCkgewotCWFzc2VydEZhbHNlKHRhYmxlLmdldEhlYWRlclZpc2libGUoKSk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEhlYWRlclZpc2libGUoKSk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0RmFsc2UodGFibGUuZ2V0SGVhZGVyVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lc1Zpc2libGVaKCkgewotCWlmIChTd3RKdW5pdC5pc0NhcmJvbikgewotCQkvKiBvbmx5IGNhcmJvbiB2ZXJzaW9ucyA+PSAxMC40IHN1cHBvcnQgVGFibGUgbGluZXMgKi8KLQkJYXNzZXJ0RmFsc2UodGFibGUuZ2V0TGluZXNWaXNpYmxlKCkpOwotCQlyZXR1cm47Ci0JfQotCWFzc2VydEZhbHNlKHRhYmxlLmdldExpbmVzVmlzaWJsZSgpKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRGYWxzZSh0YWJsZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVkcmF3WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UmVkcmF3WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRJKCkgewotCWludCBudW1iZXIgPSA1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W117fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXswLCAzLCAyfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMiwgM30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXszLCAyLCAxfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MSwgMiwgM30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezEsIDQsIDB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezAsIDQsIDB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezIsIDMsIDR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsyLCAzLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W117NCwgNCwgNCwgNCwgNCwgNCwgNH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezR9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiB0YWJsZQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdHJ5IHsKLQkJdGFibGUuc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiByYW5nZSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCX0KLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7NH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7bnVtYmVyLTF9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHtudW1iZXItMX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdIHtudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7LTF9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7MCwgMywgMn0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7MywgMiwgMX0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7NCwgNCwgNCwgNCwgNCwgNCwgNH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5zZXRTZWxlY3Rpb24oKFRhYmxlSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uIHJhbmdlID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JfQotCQotCXRyeSB7Ci0JCXRhYmxlLnNldFNlbGVjdGlvbigoVGFibGVJdGVtKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JfQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXt9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zWzBdKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1szXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzNdLCBpdGVtc1syXSwgaXRlbXNbMV19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydFNhbWUobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1sxXSwgaXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydFNhbWUobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzBdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbM119KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1szXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMV19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gdGFibGUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde30pOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzNdLCBpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbM10sIGl0ZW1zWzJdLCBpdGVtc1sxXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbM119LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1sxXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCQkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludCBudW1iZXIgPSA1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oMyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXszfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0JdGFibGUuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsyfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsxfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiB0YWJsZQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXszfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbigxKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDAsIDEpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbigzLCA0KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXszLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oNSwgNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDIsIDIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDEsIDQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezEsIDIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDAsIDQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDEsIDIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIHRhYmxlCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDAsIDEpOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpCi0JCWFzc2VydEVxdWFscyhuZXcgaW50W10gezF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbigyLCA0KTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oNSwgNCk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oMiwgMik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDEsIDQpOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpCi0JCWFzc2VydEVxdWFscyhuZXcgaW50W10gezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbigwLCA0KTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BJbmRleEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcEluZGV4SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dTZWxlY3Rpb24oKSB7Ci0JdGFibGUuc2hvd1NlbGVjdGlvbigpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW5Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uT3JkZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEdyaWRMaW5lV2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlYWRlckhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVhZGVyVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzU2VsZWN0ZWRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmUkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0JEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbHVtbk9yZGVyJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhlYWRlclZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMaW5lc1Zpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSZWRyYXdaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb24kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1NlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdCRJIikpIHRlc3RfZGVzZWxlY3QkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJIikpIHRlc3RfZGVzZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdElJIikpIHRlc3RfZGVzZWxlY3RJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uQ291bnQiKSkgdGVzdF9nZXRDb2x1bW5Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uSSIpKSB0ZXN0X2dldENvbHVtbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbk9yZGVyIikpIHRlc3RfZ2V0Q29sdW1uT3JkZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbnMiKSkgdGVzdF9nZXRDb2x1bW5zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRHcmlkTGluZVdpZHRoIikpIHRlc3RfZ2V0R3JpZExpbmVXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVhZGVySGVpZ2h0IikpIHRlc3RfZ2V0SGVhZGVySGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWFkZXJWaXNpYmxlIikpIHRlc3RfZ2V0SGVhZGVyVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZXNWaXNpYmxlIikpIHRlc3RfZ2V0TGluZXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGljZXMiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BJbmRleCIpKSB0ZXN0X2dldFRvcEluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNTZWxlY3RlZEkiKSkgdGVzdF9pc1NlbGVjdGVkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlJEkiKSkgdGVzdF9yZW1vdmUkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWxsIikpIHRlc3RfcmVtb3ZlQWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJIikpIHRlc3RfcmVtb3ZlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSUkiKSkgdGVzdF9yZW1vdmVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdCRJIikpIHRlc3Rfc2VsZWN0JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SSIpKSB0ZXN0X3NlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdElJIikpIHRlc3Rfc2VsZWN0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbHVtbk9yZGVyJEkiKSkgdGVzdF9zZXRDb2x1bW5PcmRlciRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SGVhZGVyVmlzaWJsZVoiKSkgdGVzdF9zZXRIZWFkZXJWaXNpYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGluZXNWaXNpYmxlWiIpKSB0ZXN0X3NldExpbmVzVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlZHJhd1oiKSkgdGVzdF9zZXRSZWRyYXdaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kSSIpKSB0ZXN0X3NldFNlbGVjdGlvbiRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSIpKSB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wSW5kZXhJIikpIHRlc3Rfc2V0VG9wSW5kZXhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIikpIHRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVGFibGUgdGFibGU7Ci0KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudChib29sZWFuIHNpbmdsZSkgewotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotCWlmICh0YWJsZSAhPSBudWxsKSB0YWJsZS5kaXNwb3NlKCk7Ci0JdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIHNpbmdsZT9TV1QuU0lOR0xFOlNXVC5NVUxUSSk7Ci0Jc2V0V2lkZ2V0KHRhYmxlKTsJCi19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZShWZWN0b3IgZXZlbnRzKSB7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sICIgKyBjb2wpOwotCQljb2x1bW4uc2V0V2lkdGgoNTApOwotCQlob29rRXhwZWN0ZWRFdmVudHMoY29sdW1uLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLQlmb3IgKGludCByb3cgPSAwOyByb3cgPCAzOyByb3crKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJDMFIiICsgcm93LCAiQzFSIiArIHJvdywgIkMyUiIgKyByb3d9KTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfRE9XTiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDIwLCB0YWJsZS5nZXRIZWFkZXJIZWlnaHQoKSArIHRhYmxlLmdldEl0ZW1IZWlnaHQoKSoyLCAKLSAgICAgICAgICAgIAkJIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyMCwgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkrIHRhYmxlLmdldEl0ZW1IZWlnaHQoKSArIDUsIDEsIDAsIAotICAgICAgICAgICAgCSAgICAgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMywgMTAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjAsIDI1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDIwLCA1MCwgMzAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGM1YTUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuU0lOR0xFKTsJCQotCXRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7CQotCXNldFdpZGdldCh0YWJsZUNvbHVtbik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCkgewotCXRyeSB7Ci0JCW5ldyBUYWJsZUNvbHVtbihudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJKCkgewotCXRyeSB7Ci0JCW5ldyBUYWJsZUNvbHVtbihudWxsLCBTV1QuTlVMTCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5VTEwsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl0cnkgewotCQl0YWJsZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBbGlnbm1lbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QWxpZ25tZW50SQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1vdmVhYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldE1vdmVhYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVzaXphYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFJlc2l6ZWFibGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2lkdGgoKSB7Ci0JaW50IHRlc3RXaWR0aCA9IDQyOwotCQotLy8JdHJ5IHsKLS8vCQl0YWJsZUNvbHVtbi5zZXRXaWR0aCgtMSk7Ci0vLwkJYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIHRocm93biIsIGZhbHNlKTsKLS8vCX0KLS8vCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotLy8JCWFzc2VydFRydWUoIldyb25nIGVycm9yIHRocm93bjogIiArIGUsIGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiQXJndW1lbnQgbm90IHZhbGlkIikpOwotLy8JfQotLy8JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0vLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgZXJyb3IgdGhyb3duOiAiICsgZSwgZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJBcmd1bWVudCBub3QgdmFsaWQiKSk7Ci0vLwl9Ci0KLQl0YWJsZUNvbHVtbi5zZXRXaWR0aCgwKTsKLQlhc3NlcnRUcnVlKCI6YTogd2lkdGg9IiArIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkgKyAiIHNob3VsZCBiZT0iICsgMCwgdGFibGVDb2x1bW4uZ2V0V2lkdGgoKSA9PSAwKTsKLQotCXRhYmxlQ29sdW1uLnNldFdpZHRoKHRlc3RXaWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IHdpZHRoPSIgKyB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIHRlc3RXaWR0aCwgdGFibGVDb2x1bW4uZ2V0V2lkdGgoKSA9PSB0ZXN0V2lkdGgpOwotCi0JdGFibGVDb2x1bW4uc2V0V2lkdGgodGVzdFdpZHRoKTsKLQlhc3NlcnRUcnVlKCI6Yzogd2lkdGg9IiArIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkgKyAiIHNob3VsZCBiZT0iICsgdGVzdFdpZHRoLCB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpID09IHRlc3RXaWR0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFjaygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcGFjayBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fX07Ci0KLQl0YWJsZUNvbHVtbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQotCXRhYmxlQ29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsJCQotCXRhYmxlQ29sdW1uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsJCi0JdHJ5IHsKLQkJdGFibGVDb2x1bW4ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpIHsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRhYmxlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCXRhYmxlQ29sdW1uLnNldEFsaWdubWVudCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFibGVDb2x1bW4uZ2V0QWxpZ25tZW50KCkgPT0gU1dULkxFRlQpOwotCi0JdGFibGVDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7Ci0JYXNzZXJ0VHJ1ZSgKLQkJIjpjOiBTaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gc2V0IGFsaWdubWVudCBvZiB0aGUgZmlyc3QgY29sdW1uIiwgCi0JCXRhYmxlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCWNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydFRydWUoIjpkOiIsIGNvbHVtbjIuZ2V0QWxpZ25tZW50KCkgPT0gU1dULlJJR0hUKTsKLQkKLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuQ0VOVEVSKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5DRU5URVIpOwkKLQotCWNvbHVtbjIuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNb3ZlYWJsZVooKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGFibGVDb2x1bW4uZ2V0TW92ZWFibGUoKSA9PSBmYWxzZSk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRNb3ZlYWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0YWJsZUNvbHVtbi5nZXRNb3ZlYWJsZSgpID09IHRydWUpOwotCi0JdGFibGVDb2x1bW4uc2V0TW92ZWFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGFibGVDb2x1bW4uZ2V0TW92ZWFibGUoKSA9PSB0cnVlKTsKLQotCXRhYmxlQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0YWJsZUNvbHVtbi5nZXRNb3ZlYWJsZSgpID09IGZhbHNlKTsKLQkKLQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGVDb2x1bW4uZ2V0UGFyZW50KCksIFNXVC5OT05FKTsKLQl0YWJsZUNvbHVtbjIuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlQ29sdW1uMi5nZXRNb3ZlYWJsZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGVDb2x1bW4yLnNldE1vdmVhYmxlKHRydWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVzaXphYmxlWigpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJsZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSB0cnVlKTsKLQotCXRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFibGVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gZmFsc2UpOwotCi0JdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0YWJsZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSBmYWxzZSk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGFibGVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydEVxdWFscygiOmE6IiwgdGFibGVDb2x1bW4uZ2V0VGV4dCgpLCAiIik7Ci0KLQl0YWJsZUNvbHVtbi5zZXRUZXh0KCJ0ZXh0Iik7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCB0YWJsZUNvbHVtbi5nZXRUZXh0KCksICJ0ZXh0Iik7Ci0KLQl0cnkgewotCQl0YWJsZUNvbHVtbi5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2x1bW4gaGVhZGVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdpZHRoSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V2lkdGhJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsaWdubWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TW92ZWFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UmVzaXphYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFjayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbGlnbm1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1vdmVhYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVzaXphYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXaWR0aEkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNb3ZlYWJsZSIpKSB0ZXN0X2dldE1vdmVhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJlc2l6YWJsZSIpKSB0ZXN0X2dldFJlc2l6YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2lkdGgiKSkgdGVzdF9nZXRXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFjayIpKSB0ZXN0X3BhY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFsaWdubWVudEkiKSkgdGVzdF9zZXRBbGlnbm1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1vdmVhYmxlWiIpKSB0ZXN0X3NldE1vdmVhYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UmVzaXphYmxlWiIpKSB0ZXN0X3NldFJlc2l6YWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2lkdGhJIikpIHRlc3Rfc2V0V2lkdGhJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uOwotcHJvdGVjdGVkIFRhYmxlIHRhYmxlOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzMzMWRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGVJdGVtKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWZvciAoaW50IGk9MDsgaTwxMDsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsJCi0JfQotCWFzc2VydEVxdWFscygxMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FLCA1KTsJCi0JYXNzZXJ0RXF1YWxzKDEyLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSwgNSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHNJKCkgewotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwotCVJlY3RhbmdsZSBib3VuZHM7Ci0JUmVjdGFuZ2xlIGJvdW5kczI7Ci0JCi0JLy8gbm8gY29sdW1ucwotIAlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxYToiLCBib3VuZHMueCA+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+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KTsKLSAJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VJbmRlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEltYWdlSW5kZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydEVxdWFscyh0YWJsZSwgdGFibGVJdGVtLmdldFBhcmVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0SSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUZXh0SUxKYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRhYmxlSXRlbS5nZXREaXNwbGF5KCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRCYWNrZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEJhY2tncm91bmQoKSwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEJhY2tncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDEwKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEJhY2tncm91bmQoKSwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMTApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0QmFja2dyb3VuZCgpLHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIGJsdWUpOwotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKGJsdWUsIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEJhY2tncm91bmQoKSx0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JdHJ5IHsgCi0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJdGFibGVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IodGFibGVJdGVtLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgpKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0QmFja2dyb3VuZCgpLHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJdGFibGVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2hlY2tlZFooKSB7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0YWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotIAlUYWJsZSB0ID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0odCwgU1dULk5VTEwpOwotCXRpLnNldENoZWNrZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0aS5nZXRDaGVja2VkKCkpOwotCQotCXRpLnNldENoZWNrZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGkuZ2V0Q2hlY2tlZCgpKTsKLQl0LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRhYmxlSXRlbS5nZXREaXNwbGF5KCk7Ci0JRm9udCBmb250ID0gdGFibGVJdGVtLmdldEZvbnQoKTsKLQl0YWJsZUl0ZW0uc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KCkpKTsKLQkKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JdGFibGVJdGVtLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyggdGFibGVJdGVtLmdldEZvbnQoKSkpOwotCi0JdGFibGVJdGVtLnNldEZvbnQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KCkpKTsKLQkKLQlmb250LmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0Rm9udChmb250KTsKLQkJdGFibGVJdGVtLnNldEZvbnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0YWJsZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQlhc3NlcnRUcnVlKHRhYmxlSXRlbS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JdGFibGVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEZvbnQoMTAsIGZvbnQpOwotCWFzc2VydFRydWUodGFibGVJdGVtLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMTApKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0Rm9udCgxMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZUl0ZW0uZ2V0Rm9udCgpLmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgxMCkpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JdGFibGVJdGVtLnNldEZvbnQoMCwgbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMjAsIFNXVC5OT1JNQUwpOwotCQotCXRhYmxlSXRlbS5zZXRGb250KDAsIGZvbnQpOwotCXRhYmxlSXRlbS5zZXRGb250KGZvbnQyKTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvbnQoMCwgbnVsbCk7Ci0JYXNzZXJ0VHJ1ZShmb250Mi5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9udChudWxsKTsKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQlmb250LmRpc3Bvc2UoKTsKLQlmb250Mi5kaXNwb3NlKCk7Ci0JCi0JdHJ5IHsKLQkJdGFibGVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JCXRhYmxlSXRlbS5zZXRGb250KDAsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRhYmxlSXRlbS5nZXREaXNwbGF5KCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRGb3JlZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEZvcmVncm91bmQoKSwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDEwKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEZvcmVncm91bmQoKSwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoMTApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Rm9yZWdyb3VuZCgpLHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIGJsdWUpOwotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKGJsdWUsIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEZvcmVncm91bmQoKSx0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdHJ5IHsgCi0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJdGFibGVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IodGFibGVJdGVtLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Rm9yZWdyb3VuZCgpLHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJdGFibGVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEdyYXllZFooKSB7Ci0JVGFibGUgbmV3VGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVGFibGVJdGVtIHRJdGVtID0gbmV3IFRhYmxlSXRlbShuZXdUYWJsZSwwKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRJdGVtLmdldEdyYXllZCgpKTsKLQl0SXRlbS5zZXRHcmF5ZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0SXRlbS5nZXRHcmF5ZWQoKSk7Ci0JdEl0ZW0uc2V0R3JheWVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRJdGVtLmdldEdyYXllZCgpKTsKLQluZXdUYWJsZS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKHRhYmxlSXRlbS5nZXRJbWFnZSgxKSk7CQotIAl0YWJsZUl0ZW0uc2V0SW1hZ2UoLTEsIG51bGwpOwkJCi0JYXNzZXJ0TnVsbCh0YWJsZUl0ZW0uZ2V0SW1hZ2UoLTEpKTsJCi0JCQotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7CQotIAlTdHJpbmcgdGV4dHNbXSA9IG5ldyBTdHJpbmdbaW1hZ2VzLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0cy5sZW5ndGg7IGkrKykgewotCQl0ZXh0c1tpXSA9IFN0cmluZy52YWx1ZU9mKGkpOwotCX0KLQkKLQkvL3RhYmxlLnNldFRleHQodGV4dHMpOwkJCQkvLyBjcmVhdGUgZW5vdWdoIGNvbHVtbnMgZm9yIFRhYmxlSXRlbS5zZXRJbWFnZShJbWFnZVtdKSB0byB3b3JrCi0JaW50IGNvbHVtbkNvdW50ID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCB0ZXh0cy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspewotCQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCX0KLQl9Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJY29sdW1uc1tpXS5zZXRUZXh0KHRleHRzW2ldKTsKLQl9Ci0JdGFibGVJdGVtLnNldEltYWdlKDEsIGltYWdlc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1sxXSwgdGFibGVJdGVtLmdldEltYWdlKDEpKTsJCi0gCXRhYmxlSXRlbS5zZXRJbWFnZShpbWFnZXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhpbWFnZXNbaV0sIHRhYmxlSXRlbS5nZXRJbWFnZShpKSk7Ci0JfQotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRJbWFnZSgoSW1hZ2UgW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbWFnZXMgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQkJLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyhudWxsLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMTAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRhYmxlSXRlbS5nZXRJbWFnZSgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEltYWdlKDEwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhudWxsLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMTApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMobnVsbCwgdGFibGVJdGVtLmdldEltYWdlKDApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoaW1hZ2VzWzFdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzFdLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCXRhYmxlSXRlbS5zZXRJbWFnZShpbWFnZXNbMV0pOwotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JaW1hZ2VzWzBdLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQkJdGFibGVJdGVtLnNldEltYWdlKDAsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VJbmRlbnRJKCkgewotCWlmIChTd3RKdW5pdC5pc0NhcmJvbiB8fCBTd3RKdW5pdC5pc0NvY29hIHx8IFN3dEp1bml0LmlzR1RLKSB7Ci0JCS8vc2V0SW1hZ2VJbmRlbnQgbm90IGltcGxlbWVudGVkIG9uIENhcmJvbgotCQl0YWJsZUl0ZW0uc2V0SW1hZ2VJbmRlbnQoMSk7Ci0JCXJldHVybjsgCi0JfQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0SW1hZ2VJbmRlbnQoKSk7Ci0gCXRhYmxlSXRlbS5zZXRJbWFnZUluZGVudCgxKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGVJdGVtLmdldEltYWdlSW5kZW50KCkpOwotIAl0YWJsZUl0ZW0uc2V0SW1hZ2VJbmRlbnQoLTEpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZUl0ZW0uZ2V0SW1hZ2VJbmRlbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZyA9ICJ0ZXN0IjsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZ3NbXSA9IG5ldyBTdHJpbmdbXSB7VGVzdFN0cmluZywgVGVzdFN0cmluZyArICIxIiwgVGVzdFN0cmluZyArICIyIn07Ci0JCi0JdHJ5IHsKLQkJdGFibGVJdGVtLnNldFRleHQoKFN0cmluZyBbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZ3MgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRhYmxlIHRoYXQgaGFzIG9ubHkgCi0gCSogdGhlIGRlZmF1bHQgY29sdW1uLgotIAkqLwotCQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7Ci0JCi0JdGFibGVJdGVtLnNldFRleHQoVGVzdFN0cmluZ3MpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nc1swXSwgdGFibGVJdGVtLmdldFRleHQoMCkpOwotCWZvciAoaW50IGkgPSAxOyBpIDwgVGVzdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KGkpLmxlbmd0aCgpKTsKLQl9Ci0JCi0JCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRhYmxlIHRoYXQgZW5vdWdoIAotIAkqIGNvbHVtbnMgdG8gZml0IGFsbCB0ZXN0IGl0ZW0gdGV4dHMuCi0gCSovCi0gCQkKLQlpbnQgY29sdW1uQ291bnQgPSB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOwotCWlmIChjb2x1bW5Db3VudCA8IGltYWdlcy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKXsKLQkJCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQl9Ci0JfQotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IFRlc3RTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dChUZXN0U3RyaW5nc1tpXSk7Ci0JfQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmcgPSAidGVzdCI7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmdzW10gPSBuZXcgU3RyaW5nW10ge1Rlc3RTdHJpbmcsIFRlc3RTdHJpbmcgKyAiMSIsIFRlc3RTdHJpbmcgKyAiMiJ9OwotCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRhYmxlIHRoYXQgaGFzIG9ubHkgCi0gCSogdGhlIGRlZmF1bHQgY29sdW1uLgotIAkqLwotCQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7CQotIAl0YWJsZUl0ZW0uc2V0VGV4dCgxLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwkKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMCkubGVuZ3RoKCkpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KDAsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nLCB0YWJsZUl0ZW0uZ2V0VGV4dCgwKSk7Ci0gCXRhYmxlSXRlbS5zZXRUZXh0KC0xLCBUZXN0U3RyaW5nc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KC0xKS5sZW5ndGgoKSk7CQotCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRhYmxlIHRoYXQgZW5vdWdoIAotIAkqIGNvbHVtbnMgdG8gZml0IGFsbCB0ZXN0IGl0ZW0gdGV4dHMuCi0gCSovCi0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCS8vdGFibGUuc2V0VGV4dChUZXN0U3RyaW5ncyk7CQkJCS8vIGNyZWF0ZSBhbm91Z2ggY29sdW1ucyBmb3IgVGFibGVJdGVtLnNldFRleHQoU3RyaW5nW10pIHRvIHdvcmsKLQlpbnQgY29sdW1uQ291bnQgPSB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOwotCWlmIChjb2x1bW5Db3VudCA8IGltYWdlcy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKXsKLQkJCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQl9Ci0JfQotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IFRlc3RTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dChUZXN0U3RyaW5nc1tpXSk7Ci0JfQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7CQotCi0KLQl0YWJsZUl0ZW0uc2V0VGV4dCgxLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZywgdGFibGVJdGVtLmdldFRleHQoMSkpOwkKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMCkubGVuZ3RoKCkpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KDAsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nLCB0YWJsZUl0ZW0uZ2V0VGV4dCgwKSk7Ci0KLQotCXRhYmxlSXRlbS5zZXRUZXh0KC0xLCBUZXN0U3RyaW5nc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KC0xKS5sZW5ndGgoKSk7CQotCi0KLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0VGV4dCgtMSwgbnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRUZXh0KDAsIG51bGwpOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0gCi0KLQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGVja2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEdyYXllZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VCb3VuZHNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlSW5kZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDaGVja2VkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEdyYXllZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlSW5kZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZCIpKSB0ZXN0X2dldEJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmRJIikpIHRlc3RfZ2V0QmFja2dyb3VuZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kc0kiKSkgdGVzdF9nZXRCb3VuZHNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGVja2VkIikpIHRlc3RfZ2V0Q2hlY2tlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udCIpKSB0ZXN0X2dldEZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnRJIikpIHRlc3RfZ2V0Rm9udEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kSSIpKSB0ZXN0X2dldEZvcmVncm91bmRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRHcmF5ZWQiKSkgdGVzdF9nZXRHcmF5ZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlQm91bmRzSSIpKSB0ZXN0X2dldEltYWdlQm91bmRzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VJIikpIHRlc3RfZ2V0SW1hZ2VJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZUluZGVudCIpKSB0ZXN0X2dldEltYWdlSW5kZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRJIikpIHRlc3RfZ2V0VGV4dEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2hlY2tlZFoiKSkgdGVzdF9zZXRDaGVja2VkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0R3JheWVkWiIpKSB0ZXN0X3NldEdyYXllZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VJbmRlbnRJIikpIHRlc3Rfc2V0SW1hZ2VJbmRlbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotVGFibGUgdGFibGU7Ci1UYWJsZUl0ZW0gdGFibGVJdGVtOwotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgbWFrZUNsZWFuRW52aXJvbm1lbnQoKSB7Ci0JaWYgKCB0YWJsZUl0ZW0gIT0gbnVsbCApIHRhYmxlSXRlbS5kaXNwb3NlKCk7Ci0JaWYgKCB0YWJsZSAhPSBudWxsICkgdGFibGUuZGlzcG9zZSgpOwotCXRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCAwKTsKLQl0YWJsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlzZXRXaWRnZXQodGFibGVJdGVtKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWVhNzcyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsgLy8gdXNlIG11bHRpLWxpbmUgYnkgZGVmYXVsdAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJdGV4dCA9IG5ldyBUZXh0KG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHswLCBTV1QuU0lOR0xFLCBTV1QuTVVMVEksIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwsIAotCQkJCQlTV1QuV1JBUH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCU1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JLy8gdGVzdCB3aGV0aGVyIGFsbCBjb250ZW50IG1vZGlmeWluZyBBUEkgbWV0aG9kcyBzZW5kIGEgTW9kaWZ5IGV2ZW50CQotCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KCJuZXcgdGV4dCIpOwkKLQlhc3NlcnRUcnVlKCJzZXRUZXh0IGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KCJsaW5lIik7CQotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCXRyeSB7Ci0JCXRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0NSIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDEsMyk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCXRleHQucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXRyeSB7Ci0JCXRleHQucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpIHsKLQlmaW5hbCBTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JZmluYWwgU3RyaW5nIG5ld0xpbmUgPSAiTmV3TGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQkKLQkvLyB0ZXN0IG51bGwgbGlzdGVuZXIgY2FzZQotCXRyeSB7Ci0JCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gdGVzdCBhcHBlbmQgY2FzZQotCVZlcmlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC50ZXh0ID0gbmV3TGluZTsKLQkJfQotCX07CQotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5hcHBlbmQobGluZSk7CQotCWFzc2VydFRydWUoImFwcGVuZCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JLy8gdGVzdCBpbnNlcnQgY2FzZQotCWxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCA4LCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCA4LCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC50ZXh0ID0gbmV3TGluZTsKLQkJfQotCX07CQotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5pbnNlcnQobGluZSk7CQotCWFzc2VydFRydWUoImluc2VydCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSArIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCS8vIHRlc3Qgc2V0VGV4dCBjYXNlCi0JbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDE2LCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC50ZXh0ID0gbmV3TGluZTsKLQkJfQotCX07CQotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgic2V0VGV4dCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCi0JLy8gdGVzdCByZW1vdmUgY2FzZQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJdGV4dC5hcHBlbmQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQl0ZXh0LmFwcGVuZCgiMjMiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjMiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5hcHBlbmQoIjQ1Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDUiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5hcHBlbmQoIjY3Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2NyIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQl0ZXh0LmFwcGVuZCgiMjMiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjMiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5hcHBlbmQoIjQiICsgZGVsaW1pdGVyU3RyaW5nKyAiNSIpOwotCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nICsiNSIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LmFwcGVuZCgiNjciKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3IiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRyeSB7Ci0JCXRleHQuYXBwZW5kKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIG9uIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQl0ZXh0LmFwcGVuZCgiMjMiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjMiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5hcHBlbmQoIjQ1Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDUiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5hcHBlbmQoIjY3Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2NyIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQl0ZXh0LmFwcGVuZCgiMjMiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjMiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5hcHBlbmQoIjQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjUiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5hcHBlbmQoIjY3Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjU2NyIsIHRleHQuZ2V0VGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbGVhclNlbGVjdGlvbigpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5jbGVhclNlbGVjdGlvbigpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQkvLyBzdXBlciBjbGFzcyB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb3B5KCkgewotCXRleHQuY29weSgpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmNvcHkoKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDAwMDAiKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY29weSgpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMDAwMCIsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5jb3B5KCk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY29weSgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMDAwMCIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRFcXVhbHMoIjAwMDAwIiwgdGV4dC5nZXRUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2N1dCgpIHsKLQl0ZXh0LmN1dCgpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA1KTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiMDE1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuY3V0KCk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNSk7Ci0JdGV4dC5jdXQoKTsKLQlhc3NlcnRFcXVhbHMoIjAxNTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENhcmV0TGluZU51bWJlcigpIHsKLQl0ZXh0LnNldEJvdW5kcygwLCAwLCA1MDAsIDUwMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAwKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldENhcmV0TGluZU51bWJlcigpID09IDApOwotCi0JdGV4dC5hcHBlbmQoIkxpbmUxIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAxKTsKLQlTdHJpbmcgbmV3VGV4dCA9ICJMaW5lLTFcclxuIjsKLQl0ZXh0LnNldFNlbGVjdGlvbigwLDApOwotCXRleHQuaW5zZXJ0KG5ld1RleHQpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbigwLDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oOCw4KTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldENhcmV0TGluZU51bWJlcigpID09IDEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENhcmV0TG9jYXRpb24oKSB7Ci0JLy8gYWNjb3VudCBmb3IgaW5zZXRzIHdoZW4gYXNzZXJ0aW5nCi0JdGV4dC5zZXRTaXplKDIwMCw1MCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCwwKTsKLQl0ZXh0Lmluc2VydCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueCA+PSAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS55ID49IDApOwotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuTGluZTFcclxuTGluZTIiKTsKLQl0ZXh0Lmluc2VydCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueCA+PSAwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS55ID49IDApOwotCXRleHQuc2V0U2VsZWN0aW9uKDEsMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueCA+IDApOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLnkgPj0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXRQb3NpdGlvbigpIHsKLQl0ZXh0LnNldFRleHQoIkxpbmUiKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENhcmV0UG9zaXRpb24oKSA9PSAwKTsKLQl0ZXh0LmFwcGVuZCgiMTIzIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldFBvc2l0aW9uKCkgPT0gNyk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMSwzKTsKLQl0ZXh0Lmluc2VydCgiMTIzIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldFBvc2l0aW9uKCkgPT0gNCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hhckNvdW50KCkgewotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDExLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1IiArIGRlbGltaXRlclN0cmluZysiNjc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTEgICsgZGVsaW1pdGVyU3RyaW5nLmxlbmd0aCgpLCB0ZXh0LmdldENoYXJDb3VudCgpKTsgLy9taWdodCBiZSBib2d1cyBvbiBVTklYCi0KLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0XHQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTIsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCi0JLy8KLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDExLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1IiArIGRlbGltaXRlclN0cmluZysiNjc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTEgICsgZGVsaW1pdGVyU3RyaW5nLmxlbmd0aCgpLCB0ZXh0LmdldENoYXJDb3VudCgpKTsgLy9taWdodCBiZSBib2d1cyBvbiBVTklYCi0KLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0XHQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTIsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMSwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKSB7Ci0JCXRleHQuc2V0VGV4dCgiMDEyMzQ1IisgZGVsaW1pdGVyU3RyaW5nICsgIjY3ODkwIik7Ci0JCWFzc2VydEVxdWFscygxMSAgKyBkZWxpbWl0ZXJTdHJpbmcubGVuZ3RoKCksIHRleHQuZ2V0Q2hhckNvdW50KCkpOyAvL21pZ2h0IGJlIGJvZ3VzIG9uIFVOSVgKLQl9Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JaWYgKCFTd3RKdW5pdC5pc0FJWCkgewkKLQkJdGV4dC5zZXRUZXh0KCIwMTIzNFx0NTY3ODkwIik7Ci0JCWFzc2VydEVxdWFscygxMiwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCgpIHsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotCQotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotCQotCS8vIHRoaXMgbWV0aG9kIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotCQotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVjaG9DaGFyKCkgewotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldEVjaG9DaGFyKCdhJyk7Ci0JYXNzZXJ0RXF1YWxzKCdhJywgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFZGl0YWJsZSgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVDb3VudCgpIHsKLQl0ZXh0LnNldEJvdW5kcygwLCAwLCA1MDAsIDUwMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuYXBwZW5kKCJkZGRhc2QiICsgZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JdGV4dC5hcHBlbmQoImRkYXNkYXNkYXNkYXNkIiArIGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JdGV4dC5hcHBlbmQoImRkZGFzZCIgKyBkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQl0ZXh0LmFwcGVuZCgiZGRhc2Rhc2Rhc2Rhc2QiICsgZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZURlbGltaXRlcigpIHsKLQlTdHJpbmcgcGxhdGZvcm0gPSBTV1QuZ2V0UGxhdGZvcm0oKTsKLQlTdHJpbmcgZGVsaW1pdGVyID0gdGV4dC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JaWYgKHBsYXRmb3JtLmVxdWFscygid2luMzIiKSkgewotCQlhc3NlcnRUcnVlKCI6YToiLCBkZWxpbWl0ZXIuZXF1YWxzKCJcclxuIikpOwotCX0gZWxzZSBpZiAocGxhdGZvcm0uZXF1YWxzKCJtb3RpZiIpKSB7Ci0JCWFzc2VydFRydWUoIjphOiIsIGRlbGltaXRlci5lcXVhbHMoIlxuIikpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lSGVpZ2h0KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUhlaWdodCgpID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T3JpZW50YXRpb24oKSB7Ci0JLy8gdGVzdGVkIGluIHNldE9yaWVudGF0aW9uCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMiwgMikpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgyLCAyKSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAzKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDIsIDMpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDExKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDMsIDExKSkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoNCwgNCkpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigxMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDExLCAxMSkpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMikpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMiwgMykpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09MCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0yKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCAxMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT05KTsKLQl0ZXh0LnNldFRleHQoIjAxMjNcbjQ1Njc4OTAiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTApOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09Mik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTIpOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09MTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvblRleHQoKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMsIDcpOwotCWFzc2VydEVxdWFscygiMzQ1NiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUYWJzKCkgewotCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsKLQkJLy8gQVBJIG5vdCBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcyAoZS5nLiwgTW90aWYpCi0JCXRleHQuc2V0VGFicygxKTsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUYWJzKCkgPT0gMSk7Ci0JCXRleHQuc2V0VGFicyg4KTsKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUYWJzKCkgPT0gOCk7Ci0JCXRleHQuc2V0VGV4dCgiTGluZVx0MVxyXG4iKTsKLQkJYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUYWJzKCkgPT0gOCk7Ci0JCXRleHQuc2V0VGFicyg3KTsKLQkJYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUYWJzKCkgPT0gNyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQlTdHJpbmcgc3RyaW5nID0gIjAxMjM0NSIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiNjc4OTAiOwotCXRleHQuc2V0VGV4dChzdHJpbmcpOwotCWFzc2VydEVxdWFscyhzdHJpbmcsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yIHdpdGggYm9yZGVyCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSwgdHJ1ZSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0SUkoKSB7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTQpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtMikpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0yLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwxKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMTAsMjApKTsKLQkKLQl0ZXh0LnNldFRleHQoImEiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtNCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC0yKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTIsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwtMSkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgtMSwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KDAsMCkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgwLDEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgxMCwyMCkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjM0NSIsIHRleHQuZ2V0VGV4dCgzLCA1KSk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIiLCB0ZXh0LmdldFRleHQoLTEsIDIpKTsKLQlhc3NlcnRFcXVhbHMoIjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDUsIDMpKTsKLQlhc3NlcnRFcXVhbHMoIjAiLCB0ZXh0LmdldFRleHQoMTAsMjApKTsKLQkKLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2V0RWNob0NoYXIoJyonKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtNCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC0yKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTIsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLDEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgxMCwyMCkpOwotCQotCXRleHQuc2V0VGV4dCgiYSIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC00KSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTIpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMiwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KC0xLDApKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoMCwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KDAsMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDEwLDIwKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMzQ1IiwgdGV4dC5nZXRUZXh0KDMsIDUpKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0VGV4dCgtMSwgMikpOwotCWFzc2VydEVxdWFscygiMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoMywgMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoNSwgMykpOwotCWFzc2VydEVxdWFscygiMCIsIHRleHQuZ2V0VGV4dCgxMCwyMCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtNCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC0yKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTIsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLDEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgxMCwyMCkpOwotCQotCXRleHQuc2V0VGV4dCgiYSIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC00KSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTIpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMiwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KC0xLDApKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoMCwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KDAsMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDEwLDIwKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMzQ1IiwgdGV4dC5nZXRUZXh0KDMsIDUpKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0VGV4dCgtMSwgMikpOwotCWFzc2VydEVxdWFscygiMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoMywgMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoNSwgMykpOwotCWFzc2VydEVxdWFscygiMCIsIHRleHQuZ2V0VGV4dCgxMCwyMCkpOwotCQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5zZXRFY2hvQ2hhcignKicpOwotCQotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC00KSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTIpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMiwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDAsMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDAsMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDEwLDIwKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJhIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTQpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtMikpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0yLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsLTEpKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoLTEsMCkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgwLDApKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoMCwxKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMTAsMjApKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIzNDUiLCB0ZXh0LmdldFRleHQoMywgNSkpOwotCWFzc2VydEVxdWFscygiMDEyIiwgdGV4dC5nZXRUZXh0KC0xLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgzLCAxMDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCg1LCAzKSk7Ci0JYXNzZXJ0RXF1YWxzKCIwIiwgdGV4dC5nZXRUZXh0KDEwLDIwKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUsIHRydWUpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC00KSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTIpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMiwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDAsMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDAsMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDEwLDIwKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJhIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTQpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtMikpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0yLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsLTEpKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoLTEsMCkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgwLDApKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoMCwxKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMTAsMjApKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIzNDUiLCB0ZXh0LmdldFRleHQoMywgNSkpOwotCWFzc2VydEVxdWFscygiMDEyIiwgdGV4dC5nZXRUZXh0KC0xLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgzLCAxMDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCg1LCAzKSk7Ci0JYXNzZXJ0RXF1YWxzKCIwIiwgdGV4dC5nZXRUZXh0KDEwLDIwKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldEVjaG9DaGFyKCcqJyk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTQpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtMikpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0yLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwxKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMTAsMjApKTsKLQkKLQl0ZXh0LnNldFRleHQoImEiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtNCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC0yKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTIsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwtMSkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgtMSwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KDAsMCkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgwLDEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgxMCwyMCkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjM0NSIsIHRleHQuZ2V0VGV4dCgzLCA1KSk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIiLCB0ZXh0LmdldFRleHQoLTEsIDIpKTsKLQlhc3NlcnRFcXVhbHMoIjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDUsIDMpKTsKLQlhc3NlcnRFcXVhbHMoIjAiLCB0ZXh0LmdldFRleHQoMTAsMjApKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0TGltaXQoKSB7Ci0JdGV4dC5zZXRUZXh0TGltaXQoMTApOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcEluZGV4KCkgewotCXRleHQuc2V0U2l6ZSg1MCx0ZXh0LmdldExpbmVIZWlnaHQoKSAqIDIpOwotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JdGV4dC5hcHBlbmQoZGVsaW1pdGVyU3RyaW5nICsiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxNyk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wUGl4ZWwoKSB7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMGFcclxuIik7Ci0KLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSB0ZXh0LmdldExpbmVIZWlnaHQoKSk7Ci0JdGV4dC5zZXRTaXplKDEwLCB0ZXh0LmdldExpbmVIZWlnaHQoKSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgyKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAyKTsKLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDMpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIDIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRleHQuc2V0Qm91bmRzKDAsIDAsIDUwMCwgNTAwKTsKLQl0cnkgewotCQl0ZXh0Lmluc2VydChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5pbnNlcnQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuaW5zZXJ0KCJmcmVkIik7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIpOwotCXRleHQuaW5zZXJ0KCJoZWxtdXQiKTsKLQlhc3NlcnRFcXVhbHMoImZyaGVsbXV0ZWQiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuaW5zZXJ0KGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRyeSB7Ci0JCXRleHQuaW5zZXJ0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIG9uIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0Lmluc2VydCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5pbnNlcnQoImZyZWQiKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0JdGV4dC5pbnNlcnQoImhlbG11dCIpOwotCWFzc2VydEVxdWFscygiZnJoZWxtdXRlZCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuaW5zZXJ0KFRleHQuREVMSU1JVEVSKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5pbnNlcnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gb24gc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzVmlzaWJsZSgpIHsKLQkvLyBvdmVycmlkaW5nIHRlc3RfaXNWaXNpYmxlKCkgZnJvbSBDb250cm9sCi0JY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoY29udHJvbC5pc1Zpc2libGUoKSk7ICAKLQotCWNvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5pc1Zpc2libGUoKSk7Ci0KLQlpZiAoIVN3dEp1bml0LmlzQUlYKSB7Ci0JCWNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLQkJc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgiV2luZG93IHNob3VsZCBiZSB2aXNpYmxlIiwgY29udHJvbC5pc1Zpc2libGUoKSk7Ci0JCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQlhc3NlcnRUcnVlKCJXaW5kb3cgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwgIWNvbnRyb2wuaXNWaXNpYmxlKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYXN0ZSgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIyMzAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuY29weSgpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMpOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRFcXVhbHMoIjIzMDIzMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIgKyAiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMjMwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIyMzAyMzEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwIiArIGRlbGltaXRlclN0cmluZyArICIxIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LnBhc3RlKCk7Ci0KLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMoIjAiICsgZGVsaW1pdGVyU3RyaW5nICsgIjEiICsgIjAiICsgZGVsaW1pdGVyU3RyaW5nICsgIjEiLCB0ZXh0LmdldFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkTW9kaWZ5TGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkVmVyaWZ5TGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0QWxsKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCWlmIChmQ2hlY2tCb2d1c1Rlc3RDYXNlcykgewotCQl0ZXh0LnNldFRleHQoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3ODkwIik7Ci0JCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JCXRleHQuY3V0KCk7Ci0JCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaKCkgewotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUodGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUodGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWNob0NoYXJDKCkgewotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspewotCQl0ZXh0LnNldEVjaG9DaGFyKChjaGFyKSBpKTsKLQkJYXNzZXJ0RXF1YWxzKChjaGFyKWksIHRleHQuZ2V0RWNob0NoYXIoKSk7Ci0JfQotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldEVjaG9DaGFyKCdhJyk7Ci0JYXNzZXJ0RXF1YWxzKCdhJywgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLQotCXRleHQuc2V0RWNob0NoYXIoKGNoYXIpIDApOwotCWFzc2VydEVxdWFscygoY2hhcikwLCB0ZXh0LmdldEVjaG9DaGFyKCkpOwotCi0JdGV4dC5zZXRFY2hvQ2hhcignXG4nKTsKLQlhc3NlcnRFcXVhbHMoJ1xuJywgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLQotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKyl7Ci0JCXRleHQuc2V0RWNob0NoYXIoKGNoYXIpIGkpOwotCQlhc3NlcnRFcXVhbHMoKGNoYXIpaSwgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdGFibGVaKCkgewotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnREYXRhIGZvbnREYXRhID0gdGV4dC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlpbnQgbGluZUhlaWdodDsKLQlGb250IGZvbnQ7Ci0JCi0JZm9udCA9IG5ldyBGb250KHRleHQuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDgsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCXRleHQuc2V0Rm9udChmb250KTsKLQlsaW5lSGVpZ2h0ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCk7Ci0JdGV4dC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCWZvbnQgPSBuZXcgRm9udCh0ZXh0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCAxMiwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JdGV4dC5zZXRGb250KGZvbnQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUhlaWdodCgpID4gbGluZUhlaWdodCAmJiBmb250LmVxdWFscyh0ZXh0LmdldEZvbnQoKSkpOwotCXRleHQuc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmllbnRhdGlvbkkoKSB7Ci0JdGV4dC5zZXRPcmllbnRhdGlvbihTV1QuUklHSFRfVE9fTEVGVCk7Ci0JaWYgKCh0ZXh0LmdldFN0eWxlKCkgJiBTV1QuTUlSUk9SRUQpICE9IDApIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRPcmllbnRhdGlvbigpPT1TV1QuUklHSFRfVE9fTEVGVCk7Ci0JfQotCXRleHQuc2V0T3JpZW50YXRpb24oU1dULkxFRlRfVE9fUklHSFQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0T3JpZW50YXRpb24oKT09U1dULkxFRlRfVE9fUklHSFQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlZHJhd1ooKSB7Ci0JdGV4dC5zZXRSZWRyYXcoZmFsc2UpOwotCXRleHQuc2V0UmVkcmF3KHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMsIDcpOwotCWFzc2VydEVxdWFscygiMzQ1NiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JSSgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTAwKTsKLQlhc3NlcnRFcXVhbHMoOSwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMyIgKyBkZWxpbWl0ZXJTdHJpbmcgKyI0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTAwKTsKLQlhc3NlcnRFcXVhbHMoOSArIGRlbGltaXRlclN0cmluZy5sZW5ndGgoKSwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKDksIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzIisgZGVsaW1pdGVyU3RyaW5nKyI0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKSB7Ci0JCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEwMCk7Ci0JCWFzc2VydEVxdWFscyg5ICtkZWxpbWl0ZXJTdHJpbmcubGVuZ3RoKCksIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JdGV4dC5zZXRUZXh0KCJkc2RzZGFzZHNsYWFzZGFzIik7Ci0JdHJ5IHsKLQkJdGV4dC5zZXRTZWxlY3Rpb24oKFBvaW50KSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyLCAyKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMikpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMiwgMyksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMywgMTEpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDQsIDQpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgxMSwgMTEpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJkc2RzZGFzZHNsYWFzZGFzIik7Ci0JdHJ5IHsKLQkJdGV4dC5zZXRTZWxlY3Rpb24oKFBvaW50KSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyLCAyKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMikpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMiwgMyksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMywgMTEpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCg0LCA0KSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbigxMDApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMTEsIDExKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGFic0koKSB7Ci0JaWYgKFN3dEp1bml0LmlzTW90aWYpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7IGkrKykgewotCQkJdGV4dC5zZXRUYWJzKGkpOwotCQkJYXNzZXJ0RXF1YWxzKDgsIHRleHQuZ2V0VGFicygpKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKLQkJCXRleHQuc2V0VGFicyhpKTsKLQkJCWFzc2VydEVxdWFscyhpLCB0ZXh0LmdldFRhYnMoKSk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExpbWl0SSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRleHQuc2V0VGV4dExpbWl0KDEwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHRMaW1pdCgpID09IDEwKTsKLQotCXRleHQuc2V0VGV4dExpbWl0KFRleHQuTElNSVQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gVGV4dC5MSU1JVCk7Ci0KLQl0cnkgewotCQl0ZXh0LnNldFRleHRMaW1pdCgwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCXRleHQuc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpIHsKLQkJdGV4dC5zZXRUZXh0KCIwMTIzNDUiICsgZGVsaW1pdGVyU3RyaW5nKyAiNjc4OTAiKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMTIzNDUiICsgZGVsaW1pdGVyU3RyaW5nICsiNjc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JfQotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMzQ1IiwgdGV4dC5nZXRUZXh0KDMsIDUpKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0VGV4dCgtMSwgMikpOwotCWFzc2VydEVxdWFscygiMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoMywgMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoNSwgMykpOwotCQotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsIDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLCAxMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDEsIDApKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BJbmRleEkoKSB7Ci0JaW50IG51bWJlciA9IDEwMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRleHQuYXBwZW5kKCIwMTIzNFxuIik7Ci0JfQotCWZvciAoaW50IGkgPSAxOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJdGV4dC5zZXRUb3BJbmRleChpKTsKLQkJYXNzZXJ0RXF1YWxzKGksIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JfQotCQotCXRleHQuc2V0VG9wSW5kZXgobnVtYmVyKzUpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LmFwcGVuZChUZXh0LkRFTElNSVRFUiArIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCXRleHQuc2V0VG9wSW5kZXgoMTcpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQl0ZXh0LmFwcGVuZCgiMDEyMzQiICsgVGV4dC5ERUxJTUlURVIpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRleHQuc2V0VG9wSW5kZXgoaSk7Ci0JCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93U2VsZWN0aW9uKCkgewotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQotCXRleHQuc2V0VGV4dCgiMDAwMDAiKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQkKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCi0KLQl0ZXh0LnNldFRleHQoIjAwMDAwIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQotCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbGVhclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvcHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2N1dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2FyZXRMaW5lTnVtYmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDYXJldExvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDYXJldFBvc2l0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGFyQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RWNob0NoYXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVkaXRhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVEZWxpbWl0ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9yaWVudGF0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25UZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUYWJzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRMaW1pdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcFBpeGVsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFzdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWNob0NoYXJDIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFZGl0YWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVkcmF3WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRhYnNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGltaXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcEluZGV4SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1NlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIikpIHRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xlYXJTZWxlY3Rpb24iKSkgdGVzdF9jbGVhclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weSIpKSB0ZXN0X2NvcHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2N1dCIpKSB0ZXN0X2N1dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXRMaW5lTnVtYmVyIikpIHRlc3RfZ2V0Q2FyZXRMaW5lTnVtYmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldExvY2F0aW9uIikpIHRlc3RfZ2V0Q2FyZXRMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXRQb3NpdGlvbiIpKSB0ZXN0X2dldENhcmV0UG9zaXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoYXJDb3VudCIpKSB0ZXN0X2dldENoYXJDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkIikpIHRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFY2hvQ2hhciIpKSB0ZXN0X2dldEVjaG9DaGFyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFZGl0YWJsZSIpKSB0ZXN0X2dldEVkaXRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQ291bnQiKSkgdGVzdF9nZXRMaW5lQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVEZWxpbWl0ZXIiKSkgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lSGVpZ2h0IikpIHRlc3RfZ2V0TGluZUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T3JpZW50YXRpb24iKSkgdGVzdF9nZXRPcmllbnRhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25UZXh0IikpIHRlc3RfZ2V0U2VsZWN0aW9uVGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGFicyIpKSB0ZXN0X2dldFRhYnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SUkiKSkgdGVzdF9nZXRUZXh0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRMaW1pdCIpKSB0ZXN0X2dldFRleHRMaW1pdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wSW5kZXgiKSkgdGVzdF9nZXRUb3BJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wUGl4ZWwiKSkgdGVzdF9nZXRUb3BQaXhlbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFzdGUiKSkgdGVzdF9wYXN0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0QWxsIikpIHRlc3Rfc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaIikpIHRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWNob0NoYXJDIikpIHRlc3Rfc2V0RWNob0NoYXJDKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFZGl0YWJsZVoiKSkgdGVzdF9zZXRFZGl0YWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmllbnRhdGlvbkkiKSkgdGVzdF9zZXRPcmllbnRhdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlZHJhd1oiKSkgdGVzdF9zZXRSZWRyYXdaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRhYnNJIikpIHRlc3Rfc2V0VGFic0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMaW1pdEkiKSkgdGVzdF9zZXRUZXh0TGltaXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcEluZGV4SSIpKSB0ZXN0X3NldFRvcEluZGV4SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotVGV4dCB0ZXh0OwotU3RyaW5nIGRlbGltaXRlclN0cmluZzsKLQotLyoqCi0gKiBDbGVhbiB1cCB0aGUgZW52aXJvbm1lbnQgZm9yIGEgbmV3IHRlc3QuCi0gKiAKLSAqIEBwYXJhbSBzaW5nbGUgdHJ1ZSBpZiB0aGUgbmV3IHRleHQgd2lkZ2V0IHNob3VsZCBiZSBzaW5nbGUtbGluZS4KLSAqLwotCi1wcml2YXRlIHZvaWQgbWFrZUNsZWFuRW52aXJvbm1lbnQoYm9vbGVhbiBzaW5nbGUpIHsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCAoc2luZ2xlLCBmYWxzZSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudChib29sZWFuIHNpbmdsZSwgYm9vbGVhbiBib3JkZXIpIHsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLQlpZiAoIHRleHQgIT0gbnVsbCApIHRleHQuZGlzcG9zZSgpOwotCi0JaWYgKCBzaW5nbGUgPT0gdHJ1ZSApCi0JCXRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IChib3JkZXIgPyBTV1QuQk9SREVSIDogU1dULk5VTEwpKTsJCi0JZWxzZQotCQl0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IChib3JkZXIgPyBTV1QuQk9SREVSIDogU1dULk5VTEwpKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0JZGVsaW1pdGVyU3RyaW5nID0gVGV4dC5ERUxJTUlURVI7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgdykgewotCXRleHQgPSAoVGV4dCl3OwotCXN1cGVyLnNldFdpZGdldCh3KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0gICAgbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMywgMTAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSgpIHsKLSAgICBtYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCdhJywgMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDMsIENvbnNpc3RlbmN5VXRpbGl0eS5FU0NBUEVfTUVOVSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBtYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAxMCwgNTAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjFiYjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQodG9vbEJhcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQluZXcgVG9vbEJhcihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVRyaW1JSUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgdG9vbEJhci5nZXRJdGVtQ291bnQoKT09aSk7Ci0JICAJbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUb29sSXRlbVtdIGl0ZW1zID0gbmV3IFRvb2xJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAlpdGVtc1tpXSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgdG9vbEJhci5nZXRJdGVtKGkpPT1pdGVtc1tpXSk7Ci0JfQotCi0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCAwKTsKLQludW1iZXIgPSA1OwotCWl0ZW1zID0gbmV3IFRvb2xJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAlpdGVtc1tpXSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci0JdHJ5IHsKLQkJdG9vbEJhci5nZXRJdGVtKG51bWJlcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCWludCBudW1iZXIgPSA1OwotCVRvb2xJdGVtW10gaXRlbXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOwotCX0KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRvb2xCYXIuZ2V0SXRlbXMoKSk7Ci0JCi0JdG9vbEJhci5nZXRJdGVtcygpWzBdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRvb2xJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCB0b29sQmFyLmdldEl0ZW1zKCkpOwotCi0JdG9vbEJhci5nZXRJdGVtcygpWzNdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRvb2xJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRvb2xCYXIuZ2V0SXRlbXMoKSk7Ci0KLQl0b29sQmFyLmdldEl0ZW1zKClbMV0uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyhuZXcgVG9vbEl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbM119LCB0b29sQmFyLmdldEl0ZW1zKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJvd0NvdW50KCkgewotCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgU1dULldSQVApOwotCWludCBudW1iZXIgPSA1OwotCVRvb2xJdGVtW10gaXRlbXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOwotCX0KLQlhc3NlcnRUcnVlKCI6YToiICsgdG9vbEJhci5nZXRSb3dDb3VudCgpLCB0b29sQmFyLmdldFJvd0NvdW50KCk9PW51bWJlcik7ICAvLz8/Pz8gIGJlY2F1c2Ugb2YgU2l6ZSgwLCAwKQotCi0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCAwKTsKLQludW1iZXIgPSA1OwotCWl0ZW1zID0gbmV3IFRvb2xJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAlpdGVtc1tpXSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdG9vbEJhci5nZXRSb3dDb3VudCgpPT0xKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtKCkgewotCWludCBudW1iZXIgPSAxMDsKLQlUb29sSXRlbVtdIHRpcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJdGlzW2ldID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgdG9vbEJhci5pbmRleE9mKHRpc1tpXSk9PWkpOwotCX0KLQotCW51bWJlciA9IDEwOwotCXRpcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJdGlzW2ldID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQl0cnkgewotCQkJdG9vbEJhci5pbmRleE9mKG51bGwpOwkJCi0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB0b29sSXRlbSA9PSBudWxsIik7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVRyaW1JSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJvd0NvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpKSB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSb3dDb3VudCIpKSB0ZXN0X2dldFJvd0NvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFRvb2xCYXIgdG9vbEJhcjsKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRvb2xCYXIoVmVjdG9yIGV2ZW50cykgewotCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgU1dULkZMQVQgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiVG9vbEJhciIgKyBpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiVG9vbEl0ZW0gVG9vbFRpcCIgKyBpKTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotCXNldFdpZGdldCh0b29sQmFyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEzLCAxMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVG9vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNTAsIDE1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMjAsIDUwLCAyMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZWEwZDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgMCk7Ci0JdG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7IAotCXNldFdpZGdldCh0b29sSXRlbSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhckkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRvb2xJdGVtKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Qm91bmRzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERpc2FibGVkSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERpc2FibGVkSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmFibGVkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRFbmFibGVkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SG90SW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEhvdEltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQYXJlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW0uZ2V0U2VsZWN0aW9uKCkKLQl3YXJuVW5pbXBsKCAiVGVzdCBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLnRlc3RfNV9nZXRTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb29sVGlwVGV4dCgpIHsKLQl0b29sSXRlbS5zZXRUb29sVGlwVGV4dCgiZnJlZCIpOwotCWFzc2VydFRydWUoIjphOiAiLCB0b29sSXRlbS5nZXRUb29sVGlwVGV4dCgpLmVxdWFscygiZnJlZCIpKTsKLQl0b29sSXRlbS5zZXRUb29sVGlwVGV4dCgiZnJlZHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dCIpOwotCWFzc2VydFRydWUoIjphOiAiLCB0b29sSXRlbS5nZXRUb29sVGlwVGV4dCgpLmVxdWFscygiZnJlZHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dCIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRXaWR0aCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0V2lkdGggbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VuYWJsZWQoKSB7Ci0JLy8gVGVzdCBmb3IgbWV0aG9kIGJvb2xlYW4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW0uaXNFbmFibGVkKCkKLQl3YXJuVW5pbXBsKCAiVGVzdCBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLnRlc3RfN19pc0VuYWJsZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQkvLyBUZXN0IGZvciBtZXRob2Qgdm9pZCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbS5zZXRFbmFibGVkKGJvb2xlYW4pCi0Jd2FyblVuaW1wbCggIlRlc3QgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS50ZXN0Xzhfc2V0RW5hYmxlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhvdEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SG90SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25aKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTZWxlY3Rpb25aIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V2lkdGhJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRXaWR0aEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERpc2FibGVkSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhvdEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9vbFRpcFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIb3RJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXaWR0aEkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhckkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhcklJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250cm9sIikpIHRlc3RfZ2V0Q29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGlzYWJsZWRJbWFnZSIpKSB0ZXN0X2dldERpc2FibGVkSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIb3RJbWFnZSIpKSB0ZXN0X2dldEhvdEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9vbFRpcFRleHQiKSkgdGVzdF9nZXRUb29sVGlwVGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2lkdGgiKSkgdGVzdF9nZXRXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNFbmFibGVkIikpIHRlc3RfaXNFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRIb3RJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRIb3RJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uWiIpKSB0ZXN0X3NldFNlbGVjdGlvblooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdpZHRoSSIpKSB0ZXN0X3NldFdpZHRoSSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVRvb2xCYXIgdG9vbEJhcjsKLVRvb2xJdGVtIHRvb2xJdGVtOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiODY4OTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJhY2tlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJhY2tlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdHJhY2tlciA9IG5ldyBUcmFja2VyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQodHJhY2tlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Nsb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVjdGFuZ2xlcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UmVjdGFuZ2xlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0aXBwbGVkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdGlwcGxlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X29wZW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlY3RhbmdsZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFJlY3RhbmdsZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTdGlwcGxlZFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFN0aXBwbGVkWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJlY3RhbmdsZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0aXBwbGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSZWN0YW5nbGVzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTdGlwcGxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9zZSIpKSB0ZXN0X2Nsb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSZWN0YW5nbGVzIikpIHRlc3RfZ2V0UmVjdGFuZ2xlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3RpcHBsZWQiKSkgdGVzdF9nZXRTdGlwcGxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IiKSkgdGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UmVjdGFuZ2xlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3NldFJlY3RhbmdsZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFN0aXBwbGVkWiIpKSB0ZXN0X3NldFN0aXBwbGVkWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLQlUcmFja2VyIHRyYWNrZXI7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAxYjNhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5NVUxUSSk7Ci0Jc2V0V2lkZ2V0KHRyZWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJdHJlZSA9IG5ldyBUcmVlKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHswLCBTV1QuQk9SREVSfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQl0cmVlID0gbmV3IFRyZWUoc2hlbGwsIGNhc2VzW2ldKTsKLQotCWNhc2VzID0gbmV3IGludFtdezAsIDEwLCAxMDB9OwotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQluZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGNhc2VzW2pdLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQkJdHJlZS5yZW1vdmVBbGwoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RBbGwoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQkKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzRdLCBpdGVtc1s1XSwgaXRlbXNbMTBdfSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDQsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJlZS5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJlZS5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbkNvdW50KCkgewotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotCVRyZWVDb2x1bW4gY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRyZWUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscygzLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygyLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotCWNvbHVtbjIuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbkkoKSB7Ci0JdHJ5IHsKLQkJdHJlZS5nZXRDb2x1bW4oMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCXRyeSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhjb2x1bW4wLCB0cmVlLmdldENvbHVtbigwKSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCB0cmVlLmdldENvbHVtbigxKSk7Ci0JY29sdW1uMS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdHJlZS5nZXRDb2x1bW4oMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdHJlZS5nZXRDb2x1bW4oMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1ucygpIHsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQlhc3NlcnRFcXVhbHMoMSwgY29sdW1ucy5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhjb2x1bW4wLCBjb2x1bW5zWzBdKTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLQljb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5SSUdIVCwgMSk7Ci0JY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygyLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIGNvbHVtbnNbMF0pOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCBjb2x1bW5zWzFdKTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQljb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGNvbHVtbnMubGVuZ3RoKTsKLQlhc3NlcnRFcXVhbHMoY29sdW1uMSwgY29sdW1uc1swXSk7Ci0JY29sdW1uMS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JpZExpbmVXaWR0aCgpIHsKLQl0cmVlLmdldEdyaWRMaW5lV2lkdGgoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWFkZXJIZWlnaHQoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SGVhZGVySGVpZ2h0KCkpOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0SGVhZGVySGVpZ2h0KCkgPiAwKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEhlYWRlckhlaWdodCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWFkZXJWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEhlYWRlclZpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCS8vdGVzdGVkIGluIHRlc3Rfc2V0SXRlbUNvdW50SQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1IZWlnaHQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IEl0ZW0gaGVpZ2h0IGlzIDAiLCB0cmVlLmdldEl0ZW1IZWlnaHQoKSA+IDApOwotCW5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQlhc3NlcnRUcnVlKCI6YjogSXRlbSBoZWlnaHQgaXMgMCIsIHRyZWUuZ2V0SXRlbUhlaWdodCgpID4gMCk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRFcXVhbHMoImk9IiArIGksIGl0ZW1zW2ldLCB0cmVlLmdldEl0ZW0oaSkpOwotCXRyeSB7Ci0JCXRyZWUuZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0cmVlLmdldEl0ZW0obnVtYmVyKzEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0cmVlLmdldEl0ZW0oLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQlpbnRbXSBjYXNlcyA9IHswLCAxMCwgMTAwfTsKLQlUcmVlSXRlbSBbXVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtIFtjYXNlcy5sZW5ndGhdW107Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlpdGVtcyBbal0gPSBuZXcgVHJlZUl0ZW0gW2Nhc2VzIFtqXV07Ci0JfQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUcmVlSXRlbSB0aSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQkJCWl0ZW1zIFtqXVtpXSA9IHRpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpdGVtc1tqXSwgdHJlZS5nZXRJdGVtcygpKTsKLQkJdHJlZS5yZW1vdmVBbGwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JCQl0aS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQkJfQotCQlUcmVlSXRlbVtdIGl0ZW1zMiA9IHRyZWUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtczIubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKSwgaXRlbXMyW2ldLmdldFRleHQoKSk7Ci0JCX0KLQkJdHJlZS5yZW1vdmVBbGwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lc1Zpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnRJdGVtKCkgewotCWFzc2VydE51bGwodHJlZS5nZXRQYXJlbnRJdGVtKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQkvLyBUZXN0ZWQgaW4gc2V0U2VsZWN0aW9uLgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygxNSwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde30pOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOyAvLyB1c2Ugc2luZ2xlLXNlbGVjdGlvbiB0cmVlLgotCQotCWl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117fSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wSXRlbSgpIHsKLS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRvcEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBbGwoKSB7Ci0JdHJlZS5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQlpbnQgbnVtYmVyID0gMjA7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JfQotCWFzc2VydEVxdWFscyhudW1iZXIsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJlZS5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0QWxsKCkgewotCWludCBudW1iZXIgPSA1OwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRyZWUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOyAvLyBzaW5nbGUtc2VsZWN0aW9uIHRyZWUKLQkJCi0JaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRyZWUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW5zZXJ0TWFya0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1aIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVooKSB7Ci0JYXNzZXJ0RmFsc2UodHJlZS5nZXRIZWFkZXJWaXNpYmxlKCkpOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0SGVhZGVyVmlzaWJsZSgpKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCWFzc2VydEZhbHNlKHRyZWUuZ2V0SGVhZGVyVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtQ291bnRJKCkgewotCXRyZWUucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCWZvciAoaW50IGk9MDsgaTw4OyBpKyspIHsKLQkJbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OVUxMKTsKLQkJYXNzZXJ0RXF1YWxzKGkrMSwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCWFzc2VydEVxdWFscyg4LCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQlhc3NlcnRFcXVhbHMoNCwgdHJlZS5pbmRleE9mKHRyZWUuZ2V0SXRlbXMoKVs0XSkpOwotCXRyZWUuZ2V0SXRlbSgxKS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDcsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCW5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5VTEwsIDApOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmluZGV4T2YodHJlZS5nZXRJdGVtcygpWzFdKSk7Ci0JYXNzZXJ0RXF1YWxzKDgsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCXRyZWUucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCXRyZWUuc2V0SXRlbUNvdW50KDApOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl0cmVlLnNldEl0ZW1Db3VudCgtMSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCXRyZWUuc2V0SXRlbUNvdW50KDEwKTsKLQlhc3NlcnRFcXVhbHMoMTAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCXRyZWUuZ2V0SXRlbSgxKS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDksIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscyg0LCB0cmVlLmluZGV4T2YodHJlZS5nZXRJdGVtcygpWzRdKSk7Ci0JdHJlZS5zZXRJdGVtQ291bnQoMyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCXRyeSB7Ci0JCXRyZWUuZ2V0SXRlbSg0KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JdHJlZS5zZXRJdGVtQ291bnQoNDApOwotCWFzc2VydEVxdWFscyg0MCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JdHJlZS5nZXRJdGVtKDM5KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lc1Zpc2libGVaKCkgewotCWlmIChTd3RKdW5pdC5pc0NhcmJvbikgewotCQkvLyBjYXJib24gZG9lcyBub3Qgc3VwcG9ydCBsaW5lcwotCQl0cmVlLmdldExpbmVzVmlzaWJsZSgpOwotCQlyZXR1cm47Ci0JfQotCWFzc2VydEZhbHNlKHRyZWUuZ2V0TGluZXNWaXNpYmxlKCkpOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUodHJlZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci0JdHJlZS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCWFzc2VydEZhbHNlKHRyZWUuZ2V0TGluZXNWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlZHJhd1ooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFJlZHJhd1ogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCkgewotCWludCBudW1iZXIgPSAyMDsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzVdLCBpdGVtc1sxNl0sIGl0ZW1zWzE5XX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzVdLCBpdGVtc1sxNl0sIGl0ZW1zWzE5XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFNhbWUoaXRlbXMsIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKHRyZWUuZ2V0SXRlbXMoKSk7Ci0JYXNzZXJ0U2FtZSh0cmVlLmdldEl0ZW1zKCksIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyeSB7Ci0JCXRyZWUuc2V0U2VsZWN0aW9uKChUcmVlSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbXMgPT0gbnVsbCIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117bnVsbH0pOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1sxMF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zW251bWJlci0xXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzEwXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1syXX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1sxMF0sIGl0ZW1zW251bWJlciAtIDFdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzNdLCBpdGVtc1syXX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzNdLCBpdGVtc1syXSwgaXRlbXNbMV19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM119LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbNF0sIGl0ZW1zWzBdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVHJlZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMV0sIGl0ZW1zWzRdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW117aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117aXRlbXNbNF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzBdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbM119KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzNdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s0XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1sxXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMV19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnJlbW92ZUFsbCgpOwotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7IC8vIHNpbmdsZS1zZWxlY3Rpb24gdHJlZQotCQotCWl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzVdLCBpdGVtc1sxNl0sIGl0ZW1zWzE5XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbih0cmVlLmdldEl0ZW1zKCkpOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge30pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJ5IHsKLQkJdHJlZS5zZXRTZWxlY3Rpb24oKFRyZWVJdGVtW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtcyA9PSBudWxsIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzEwXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbbnVtYmVyLTFdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMTBdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbM10sIGl0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzNdLCBpdGVtc1syXSwgaXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXXt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbNF0sIGl0ZW1zWzBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXXt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzBdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbM119KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzNdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s0XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1sxXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMV19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnJlbW92ZUFsbCgpOwotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKSB7Ci0JdHJlZS5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJbmV3IFRyZWVJdGVtKHRyZWUsIDApOwkKLQl9Ci0JVHJlZUl0ZW0gdG9wID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQluZXcgVHJlZUl0ZW0odHJlZSwgMCk7CQotCX0KLQl0cmVlLnNldFNpemUoNTAsNTApOwotCXNoZWxsLm9wZW4oKTsKLQl0cmVlLnNldFRvcEl0ZW0odG9wKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJbmV3IFRyZWVJdGVtKHRyZWUsIDApOwkKLQl9Ci0JVHJlZUl0ZW0gdG9wMiA9IHRyZWUuZ2V0VG9wSXRlbSgpOwotCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydEVxdWFscyh0b3AsIHRvcDIpOwotCXRyeSB7Ci0JCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JCXRyZWUuc2V0VG9wSXRlbShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9IGZpbmFsbHkgewotCQlzaGVsbC5zZXRWaXNpYmxlIChmYWxzZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKSB7Ci0JdHJ5IHsKLQkJdHJlZS5zaG93SXRlbShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlpbnQgbnVtYmVyID0gMjA7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JfQotCWZvcihpbnQgaT0wOyBpPG51bWJlcjsgaSsrKQotCQl0cmVlLnNob3dJdGVtKGl0ZW1zW2ldKTsKLQotCXRyZWUucmVtb3ZlQWxsKCk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JLy9zaG93aW5nIHNvbWVib2R5IGVsc2UncyBpdGVtcwotCQotCWl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQl9Ci0KLQlUcmVlIHRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIDApOwotCVRyZWVJdGVtW10gaXRlbXMyID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtczJbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZTIsIDApOwotCX0KLQotCWZvcihpbnQgaT0wOyBpPG51bWJlcjsgaSsrKQotCQl0cmVlLnNob3dJdGVtKGl0ZW1zMltpXSk7Ci0KLQl0cmVlLnJlbW92ZUFsbCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dTZWxlY3Rpb24oKSB7Ci0JVHJlZUl0ZW0gaXRlbTsKLQkKLQl0cmVlLnNob3dTZWxlY3Rpb24oKTsKLQlpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW19KTsKLQl0cmVlLnNob3dTZWxlY3Rpb24oKTsJCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEdyaWRMaW5lV2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlYWRlckhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVhZGVyVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhlYWRlclZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUNvdW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGluZXNWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVkcmF3WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wSXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1NlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIikpIHRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdEFsbCIpKSB0ZXN0X2Rlc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW5Db3VudCIpKSB0ZXN0X2dldENvbHVtbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW5JIikpIHRlc3RfZ2V0Q29sdW1uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1ucyIpKSB0ZXN0X2dldENvbHVtbnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEdyaWRMaW5lV2lkdGgiKSkgdGVzdF9nZXRHcmlkTGluZVdpZHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWFkZXJIZWlnaHQiKSkgdGVzdF9nZXRIZWFkZXJIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlYWRlclZpc2libGUiKSkgdGVzdF9nZXRIZWFkZXJWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKSkgdGVzdF9nZXRJdGVtSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lc1Zpc2libGUiKSkgdGVzdF9nZXRMaW5lc1Zpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudEl0ZW0iKSkgdGVzdF9nZXRQYXJlbnRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcEl0ZW0iKSkgdGVzdF9nZXRUb3BJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBbGwiKSkgdGVzdF9yZW1vdmVBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhlYWRlclZpc2libGVaIikpIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1aIikpIHRlc3Rfc2V0SW5zZXJ0TWFya0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1Db3VudEkiKSkgdGVzdF9zZXRJdGVtQ291bnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMaW5lc1Zpc2libGVaIikpIHRlc3Rfc2V0TGluZXNWaXNpYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UmVkcmF3WiIpKSB0ZXN0X3NldFJlZHJhd1ooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIikpIHRlc3Rfc2V0VG9wSXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uIikpIHRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpKSB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQiKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIikpIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBUcmVlIHRyZWU7Ci0KLS8qKgotICogQ2xlYW4gdXAgdGhlIGVudmlyb25tZW50IGZvciBhIG5ldyB0ZXN0LgotICogCi0gKiBAcGFyYW0gc2luZ2xlIHRydWUgaWYgdGhlIG5ldyB0cmVlIHNob3VsZCBiZSBhIHNpbmdsZS1zZWxlY3Rpb24gb25lLAotICogb3RoZXJ3aXNlIHVzZSBtdWx0aS1zZWxlY3Rpb24uCi0gKi8KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudChib29sZWFuIHNpbmdsZSkgewotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotCWlmICh0cmVlICE9IG51bGwpIHRyZWUuZGlzcG9zZSgpOwotCXRyZWUgPSBuZXcgVHJlZShzaGVsbCwgc2luZ2xlP1NXVC5TSU5HTEU6U1dULk1VTFRJKTsKLQlzZXRXaWRnZXQodHJlZSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVUcmVlKFZlY3RvciBldmVudHMpIHsKLSAgICBtYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJUcmVlSXRlbSIgKyBpKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCXRpLnNldFRleHQoIlRyZWVJdGVtIiArIGkgKyBqKTsKLQkJCWhvb2tFeHBlY3RlZEV2ZW50cyh0aSwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQkJfQotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbSwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMzAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDExLCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBpbnQgY29kZT1TV1QuQVJST1dfUklHSFQ7Ci0gICAgaWYoU3d0SnVuaXQuaXNHVEspCi0gICAgICAgIGNvZGUgPSBTV1QuS0VZUEFEX0FERDsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIGNvZGUsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2sgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyMCwgdHJlZS5nZXRJdGVtSGVpZ2h0KCkqMiwgMSwgMCwgCi0gICAgICAgICAgICAJICAgICBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRE9VQkxFQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTMsIDEwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1MCwgMjUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAyMCwgNTAsIDMwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjlhMmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW4KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbiBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULlNJTkdMRSk7CQkKLQl0cmVlQ29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5VTEwpOwkKLQlzZXRXaWRnZXQodHJlZUNvbHVtbik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRyZWVDb2x1bW4obnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJKCkgewotCXRyeSB7Ci0JCW5ldyBUcmVlQ29sdW1uKG51bGwsIFNXVC5OVUxMLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5VTEwsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5VTEwsIDIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JdHJ5IHsKLQkJdHJlZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBbGlnbm1lbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEFsaWdubWVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVzaXphYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRSZXNpemFibGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRXaWR0aCgpIHsKLQlpbnQgdGVzdFdpZHRoID0gNDI7Ci0JCi0vLwl0cnkgewotLy8JCXRyZWVDb2x1bW4uc2V0V2lkdGgoLTEpOwotLy8JCWFzc2VydFRydWUoIk5vIGV4Y2VwdGlvbiB0aHJvd24iLCBmYWxzZSk7Ci0vLwl9Ci0vLwljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLS8vCQlhc3NlcnRUcnVlKCJXcm9uZyBlcnJvciB0aHJvd246ICIgKyBlLCBlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkFyZ3VtZW50IG5vdCB2YWxpZCIpKTsKLS8vCX0KLS8vCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotLy8JCWFzc2VydFRydWUoIldyb25nIGVycm9yIHRocm93bjogIiArIGUsIGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiQXJndW1lbnQgbm90IHZhbGlkIikpOwotLy8JfQotCi0JdHJlZUNvbHVtbi5zZXRXaWR0aCgwKTsKLQlhc3NlcnRUcnVlKCI6YTogd2lkdGg9IiArIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSArICIgc2hvdWxkIGJlPSIgKyAwLCB0cmVlQ29sdW1uLmdldFdpZHRoKCkgPT0gMCk7Ci0KLQl0cmVlQ29sdW1uLnNldFdpZHRoKHRlc3RXaWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IHdpZHRoPSIgKyB0cmVlQ29sdW1uLmdldFdpZHRoKCkgKyAiIHNob3VsZCBiZT0iICsgdGVzdFdpZHRoLCB0cmVlQ29sdW1uLmdldFdpZHRoKCkgPT0gdGVzdFdpZHRoKTsKLQotCXRyZWVDb2x1bW4uc2V0V2lkdGgodGVzdFdpZHRoKTsKLQlhc3NlcnRUcnVlKCI6Yzogd2lkdGg9IiArIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSArICIgc2hvdWxkIGJlPSIgKyB0ZXN0V2lkdGgsIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSA9PSB0ZXN0V2lkdGgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3BhY2soKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3BhY2sgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge319OwotCi0JdHJlZUNvbHVtbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQotCXRyZWVDb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwkJCi0JdHJlZUNvbHVtbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQotCXRyeSB7Ci0JCXRyZWVDb2x1bW4ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpIHsKLQlUcmVlQ29sdW1uIGNvbHVtbjI7Ci0JCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdHJlZUNvbHVtbi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7Ci0KLQl0cmVlQ29sdW1uLnNldEFsaWdubWVudCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdHJlZUNvbHVtbi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7Ci0KLQl0cmVlQ29sdW1uLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydFRydWUoCi0JCSI6YzogU2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIHNldCBhbGlnbm1lbnQgb2YgdGhlIGZpcnN0IGNvbHVtbiIsIAotCQl0cmVlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCWNvbHVtbjIgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTlVMTCk7Ci0JY29sdW1uMi5zZXRBbGlnbm1lbnQoU1dULlJJR0hUKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5SSUdIVCk7Ci0JCi0JY29sdW1uMi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgY29sdW1uMi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuQ0VOVEVSKTsJCi0KLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgY29sdW1uMi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVzaXphYmxlWigpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0cmVlQ29sdW1uLmdldFJlc2l6YWJsZSgpID09IHRydWUpOwotCi0JdHJlZUNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsIHRyZWVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gZmFsc2UpOwotCi0JdHJlZUNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRyZWVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gZmFsc2UpOwotCi0JdHJlZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdHJlZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCB0cmVlQ29sdW1uLmdldFRleHQoKSwgIiIpOwotCi0JdHJlZUNvbHVtbi5zZXRUZXh0KCJ0ZXh0Iik7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCB0cmVlQ29sdW1uLmdldFRleHQoKSwgInRleHQiKTsKLQotCXRyeSB7Ci0JCXRyZWVDb2x1bW4uc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sdW1uIGhlYWRlciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdpZHRoSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbGlnbm1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UmVzaXphYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFjayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbGlnbm1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlc2l6YWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V2lkdGhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJlc2l6YWJsZSIpKSB0ZXN0X2dldFJlc2l6YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2lkdGgiKSkgdGVzdF9nZXRXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFjayIpKSB0ZXN0X3BhY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFsaWdubWVudEkiKSkgdGVzdF9zZXRBbGlnbm1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlc2l6YWJsZVoiKSkgdGVzdF9zZXRSZXNpemFibGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdpZHRoSSIpKSB0ZXN0X3NldFdpZHRoSSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUcmVlQ29sdW1uIHRyZWVDb2x1bW47Ci1wcm90ZWN0ZWQgVHJlZSB0cmVlOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg0YmNhZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJKCkgewotCXRyeSB7Ci0JCW5ldyBUcmVlSXRlbSgoVHJlZUl0ZW0pbnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlmb3IgKGludCBpPTA7IGk8MTA7IGkrKykgewotCQluZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwkKLQl9Ci0JYXNzZXJ0RXF1YWxzKDExLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQluZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUsIDUpOwkKLQlhc3NlcnRFcXVhbHMoMTIsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSgpIHsKLQl0cnkgewotCQluZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUsIDUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUkoKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCX0KLQlhc3NlcnRFcXVhbHMoMTAsIHRyZWVJdGVtLmdldEl0ZW1Db3VudCgpKTsKLQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FLCA1KTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JSSgpIHsKLQl0cnkgewotCQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FLCA1KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHt9Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07Ci0JUmVjdGFuZ2xlIGJvdW5kczsKLQlSZWN0YW5nbGUgYm91bmRzMjsKLQlTdHJpbmcgc3RyaW5nID0gImhlbGxvIjsKLQkKLQkvLyBubyBjb2x1bW5zCi0gCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCQotCXRyZWVJdGVtLnNldFRleHQoc3RyaW5nKTsKLQlHQyBnYyA9IG5ldyBHQyh0cmVlKTsKLQlQb2ludCBleHRlbnQgPSBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nKTsKLQlnYy5kaXNwb3NlKCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gZXh0ZW50LnkgJiYgYm91bmRzLndpZHRoID4gZXh0ZW50LngpOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCXRyZWVJdGVtLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPj0gcmVjdC5oZWlnaHQpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgYm91bmRzLnggPj0gYm91bmRzMi54ICsgYm91bmRzMi53aWR0aCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxZToiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWY6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxZzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlzdWJJdGVtLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWg6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IGV4dGVudC55ICYmIGJvdW5kcy53aWR0aCA+IGV4dGVudC54KTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0Jc3ViSXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCXN1Ykl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFpOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID49IHJlY3QuaGVpZ2h0KTsKLQlib3VuZHMyID0gc3ViSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWo6IiwgYm91bmRzLnggPj0gYm91bmRzMi54ICsgYm91bmRzMi53aWR0aCk7Ci0JCi0JLy8gVE9ETyBubyBjb2x1bW5zIGFuZCBDSEVDSyBzdHlsZQotCS8vIFRPRE8gd2l0aCBjb2x1bW5zCi0JLy8gVE9ETyB3aXRoIGNvbHVtbnMgYW5kIENIRUNLIHN0eWxlCi19Ci12b2lkIHRlc3RfZ2V0Qm91bmRzSUEoKSB7CQotCS8vIG5vIGNvbHVtbnMgLSBwbGFpbiBzdHlsZQotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwotCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCVN0cmluZyBzdHJpbmcgPSAiaGVsbG8iOwotCUdDIGdjID0gbmV3IEdDKHRyZWUpOwotCVBvaW50IHN0cmluZ0V4dGVudCA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcpOwotCWdjLmRpc3Bvc2UoKTsKLQkKLQlSZWN0YW5nbGUgYm91bmRzOwotCVJlY3RhbmdsZSBib3VuZHMyOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLSAJYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwkKLSAJYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjoxYzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkvLyB1bmV4cGFuZGVkIGl0ZW0KLQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWY6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWc6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudC55ICYmIGJvdW5kcy53aWR0aCA+IHN0cmluZ0V4dGVudC54KTsJCi0JCi0JdHJlZUl0ZW0uc2V0VGV4dChzdHJpbmcpOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWg6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQueSAmJiBib3VuZHMud2lkdGggPiBzdHJpbmdFeHRlbnQueCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCS8vYXNzZXJ0VHJ1ZSgiOjFuZXc6IiwgYm91bmRzLmVxdWFscyhib3VuZHMyKSk7IC8vIFRPRE8gc2hvdWxkIGJvdW5kcyBiZSBlcXVhbD8KLQl0cmVlSXRlbS5zZXRUZXh0KCIiKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxaToiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFqOiIsIGJvdW5kczIud2lkdGggPCBib3VuZHMud2lkdGgpOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQl0cmVlSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxazoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoID49IGltYWdlQm91bmRzLndpZHRoKTsKLQl0cmVlSXRlbS5zZXRJbWFnZSgoSW1hZ2UpbnVsbCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWw6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotLy8JYXNzZXJ0VHJ1ZSgiOjFtOiIsIGJvdW5kczIud2lkdGggPiBib3VuZHMud2lkdGgpOyAvLyBvbmNlIGFuIGltYWdlIGlzIGFkZGVkIHRoZSBzcGFjZSBmb3IgaXQgaXMgYWx3YXlzIHRoZXJlCi0gCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCXRyZWVJdGVtLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxbjoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFvOiIsIGJvdW5kczIud2lkdGggPiBib3VuZHMud2lkdGgpOwotCWFzc2VydFRydWUoIjoxcCIsIGJvdW5kczIud2lkdGggPj0gc3RyaW5nRXh0ZW50LnggKyBpbWFnZUJvdW5kcy53aWR0aCAmJiBib3VuZHMyLmhlaWdodCA+PSBNYXRoLm1heChzdHJpbmdFeHRlbnQueSwgaW1hZ2VCb3VuZHMuaGVpZ2h0KSk7Ci19Ci12b2lkIHRlc3RfZ2V0Qm91bmRzSUIoKSB7Ci0JLy8gbm8gY29sdW1ucyBhbmQgQ0hFQ0sgc3R5bGUKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsKLQlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlTdHJpbmcgc3RyaW5nID0gImhlbGxvIjsKLQlHQyBnYyA9IG5ldyBHQyh0cmVlKTsKLQlQb2ludCBzdHJpbmdFeHRlbnQgPSBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JUmVjdGFuZ2xlIGJvdW5kczsKLQlSZWN0YW5nbGUgYm91bmRzMjsKLQkKLQlUcmVlIHRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVHJlZUl0ZW0gdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JCi0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjoyYzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkvLyB1bmV4cGFuZGVkIGl0ZW0KLQlUcmVlSXRlbSBzdWJJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbTIsIFNXVC5OT05FKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJkOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtMi5zZXRFeHBhbmRlZCh0cnVlKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJlOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JdHJlZUl0ZW0yLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJmOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtMi5zZXRFeHBhbmRlZCh0cnVlKTsKLQlzdWJJdGVtMi5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyZzoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50LnkgJiYgYm91bmRzLndpZHRoID4gc3RyaW5nRXh0ZW50LngpOwkKLQotCXRyZWVJdGVtMi5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmg6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQueSAmJiBib3VuZHMud2lkdGggPiBzdHJpbmdFeHRlbnQueCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoKTsKLQkvL2Fzc2VydFRydWUoIjoybmV3OiIsIGJvdW5kcy5lcXVhbHMoYm91bmRzMikpOyAvLyBUT0RPIHNob3VsZCBib3VuZHMgYmUgZXF1YWw/Ci0JdHJlZUl0ZW0yLnNldFRleHQoIiIpOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyaToiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJqOiIsIGJvdW5kczIud2lkdGggPCBib3VuZHMud2lkdGgpOwotCQotCXRyZWUyLmRpc3Bvc2UoKTsKLQl0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCQotCXRyZWVJdGVtMi5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mms6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCA+PSBpbWFnZUJvdW5kcy53aWR0aCk7Ci0JdHJlZUl0ZW0yLnNldEltYWdlKChJbWFnZSludWxsKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmw6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCS8vYXNzZXJ0VHJ1ZSgiOjJtOiIsIGJvdW5kczIud2lkdGggPCBib3VuZHMud2lkdGgpOyAgLy8gb25jZSBhbiBpbWFnZSBpcyBhZGRlZCB0aGUgc3BhY2UgZm9yIGl0IGlzIGFsd2F5cyB0aGVyZQotCQotCXRyZWUyLmRpc3Bvc2UoKTsKLQl0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCQotCXRyZWVJdGVtMi5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQl0cmVlSXRlbTIuc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoybjoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJvOiIsIGJvdW5kczIud2lkdGggPiBib3VuZHMud2lkdGgpOwotCWFzc2VydFRydWUoIjoxcCIsIGJvdW5kczIud2lkdGggPj0gc3RyaW5nRXh0ZW50LnggKyBpbWFnZUJvdW5kcy53aWR0aCAmJiBib3VuZHMyLmhlaWdodCA+PSBNYXRoLm1heChzdHJpbmdFeHRlbnQueSwgaW1hZ2VCb3VuZHMuaGVpZ2h0KSk7Ci19Ci12b2lkIHRlc3RfZ2V0Qm91bmRzSUMoKSB7Ci0JLy8gd2l0aCBjb2x1bW5zCi0JCi0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07Ci0JUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JU3RyaW5nIHN0cmluZzEgPSAiaGVsbG8iOwotCVN0cmluZyBzdHJpbmcyID0gIndvcmxkIjsKLQlHQyBnYyA9IG5ldyBHQyh0cmVlKTsKLQlQb2ludCBzdHJpbmdFeHRlbnQxID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZzEpOwotCS8vUG9pbnQgc3RyaW5nRXh0ZW50MiA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcyKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JUmVjdGFuZ2xlIGJvdW5kczsKLQlSZWN0YW5nbGUgYm91bmRzMjsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0KLQlUcmVlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCi0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgLypib3VuZHMueCA+IDAgJiYqLyBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7IC8vIFRPRE8gYm91bmRzLnggPT0gMCBJcyB0aGlzIHJpZ2h0PwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwkKLSAJYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDIpOwotCWFzc2VydFRydWUoIjozZDoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkvLyB1bmV4cGFuZGVkIGl0ZW0KLQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNlOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozZjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2c6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7c3RyaW5nMSwgc3RyaW5nMn0pOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNoOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID09IDApOwkKLQotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNpOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozajoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNrOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwkKLQotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNsOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozbToiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDIwMCk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10ge3N0cmluZzEsIHN0cmluZzJ9KTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNuOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNvOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQl0cmVlSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IiIsICIifSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozcDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozcToiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCWNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCi0JdHJlZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge2ltYWdlLCBpbWFnZX0pOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M3I6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNzOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0gCXRyZWVJdGVtLnNldEltYWdlKG5ldyBJbWFnZVtdIHtudWxsLCBudWxsfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozdDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M3U6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7c3RyaW5nMSwgc3RyaW5nMn0pOwotCXRyZWVJdGVtLnNldEltYWdlKG5ldyBJbWFnZVtdIHtpbWFnZSwgaW1hZ2V9KTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjN2OiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjN3OiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dChzdHJpbmcxKTsKLQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuUklHSFQpOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M3g6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoICA9PSAwKTsKLX0KLQotdm9pZCB0ZXN0X2dldEJvdW5kc0lEKCkgewotCS8vIHdpdGggY29sdW1ucyBhbmQgQ0hFQ0sgc3R5bGUKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsKLQlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlTdHJpbmcgc3RyaW5nMSA9ICJoZWxsbyI7Ci0JU3RyaW5nIHN0cmluZzIgPSAid29ybGQiOwotCUdDIGdjID0gbmV3IEdDKHRyZWUpOwotCVBvaW50IHN0cmluZ0V4dGVudDEgPSBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nMSk7Ci0JLy9Qb2ludCBzdHJpbmdFeHRlbnQyID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZzIpOwotCWdjLmRpc3Bvc2UoKTsKLQkKLQlSZWN0YW5nbGUgYm91bmRzOwotCVJlY3RhbmdsZSBib3VuZHMyOwotCQotCVRyZWUgdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUcmVlSXRlbSB0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OT05FKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULkxFRlQpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuQ0VOVEVSKTsKLQkKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0YToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIC8qYm91bmRzLnggPiAwICYmKi8gYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOyAvLyBUT0RPIGJvdW5kcy54ID09IDAgSXMgdGhpcyByaWdodD8KLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDIpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkvLyB1bmV4cGFuZGVkIGl0ZW0KLQlUcmVlSXRlbSBzdWJJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbTIsIFNXVC5OT05FKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtMi5zZXRFeHBhbmRlZCh0cnVlKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRmOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JdHJlZUl0ZW0yLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRnOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtMi5zZXRFeHBhbmRlZCh0cnVlKTsKLQlzdWJJdGVtMi5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7c3RyaW5nMSwgc3RyaW5nMn0pOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGg6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPT0gMCk7CQotCQotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0aToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRqOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0azoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsJCi0KLQkKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGw6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0bToiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDIwMCk7Ci0JCi0JdHJlZUl0ZW0yLnNldFRleHQobmV3IFN0cmluZ1tdIHtzdHJpbmcxLCBzdHJpbmcyfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NG46IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRvOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQl0cmVlSXRlbTIuc2V0VGV4dChuZXcgU3RyaW5nW10geyIiLCAiIn0pOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRwOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0cToiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQl0cmVlMi5kaXNwb3NlKCk7Ci0JdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OT05FKTsKLQljb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5DRU5URVIpOwotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCi0JdHJlZUl0ZW0yLnNldEltYWdlKG5ldyBJbWFnZVtdIHtpbWFnZSwgaW1hZ2V9KTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0cjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRzOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0gCXRyZWVJdGVtMi5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7bnVsbCwgbnVsbH0pOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjR0OiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NHU6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCXRyZWUyLmRpc3Bvc2UoKTsKLQl0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCWNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULkNFTlRFUik7Ci0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkKLQl0cmVlSXRlbTIuc2V0VGV4dChuZXcgU3RyaW5nW10ge3N0cmluZzEsIHN0cmluZzJ9KTsKLQl0cmVlSXRlbTIuc2V0SW1hZ2UobmV3IEltYWdlW10ge2ltYWdlLCBpbWFnZX0pOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjR2OiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0dzoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQl0cmVlMi5kaXNwb3NlKCk7Ci0JdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OT05FKTsKLQkKLQl0cmVlSXRlbTIuc2V0VGV4dChzdHJpbmcxKTsKLQluZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULlJJR0hUKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0eDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggID09IDApOwotfQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHNJKCkgewotCXRlc3RfZ2V0Qm91bmRzSUEoKTsKLQl0ZXN0X2dldEJvdW5kc0lCKCk7Ci0JdGVzdF9nZXRCb3VuZHNJQygpOwotCXRlc3RfZ2V0Qm91bmRzSUQoKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hlY2tlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRDaGVja2VkWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEV4cGFuZGVkKCkgewotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0JLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgc3ViaXRlbSBiZWZvcmUgeW91IGNhbiBzZXQgdGhlIHRyZWVpdGVtIGV4cGFuZGVkCi0JbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCAwKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvcmVncm91bmRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEdyYXllZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRHcmF5ZWRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VCb3VuZHNJKCkgewotLyoqCi0gKiBUZXN0IHdpdGhvdXQgaXRlbSBpbWFnZQotICovCi0JUmVjdGFuZ2xlIGJvdW5kczsKLQlUcmVlIHRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVHJlZUl0ZW0gdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTlVMTCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtLmdldEltYWdlQm91bmRzKC0xKSk7Ci0JCi0JLy8gVE9ETyAtIHNob3VsZCB0aGlzIHdpZHRoIGJlIDAgb3IgYSB2YWx1ZT8KLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBib3VuZHMud2lkdGggPT0gMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtLmdldEltYWdlQm91bmRzKDEpKTsKLQkKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKC0xKSk7Ci0JCi0JLy8gVE9ETyAtIHNob3VsZCB0aGlzIHdpZHRoIGJlIDAgb3IgYSB2YWx1ZT8KLQkvL2JvdW5kcyA9IHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygwKTsKLQkvL2Fzc2VydFRydWUoIjplOiIsIGJvdW5kcy53aWR0aCA9PSAwKTsKLQkKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKDEpKTsKLSAJLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwkKLS8vCWludCBpbWFnZVdpZHRoID0gaW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGg7Ci0vLwlpbnQgaW1hZ2VIZWlnaHQ7Ci0JCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2UpOwotLy8JaW1hZ2VIZWlnaHQgPSB0cmVlLmdldEl0ZW1IZWlnaHQoKSAtIHRyZWUuZ2V0R3JpZExpbmVXaWR0aCgpOwotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEltYWdlQm91bmRzKDApOwotLy8JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy53aWR0aCA9PSBpbWFnZVdpZHRoICYmIGJvdW5kcy5oZWlnaHQgPT0gaW1hZ2VIZWlnaHQpOwkKLS8vIAlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMSkpOwkKLQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwkKLQkKLQl0cmVlMi5kaXNwb3NlKCk7Ci0JdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0cmVlSXRlbTIuZGlzcG9zZSgpOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5VTEwpOwotLy8JUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0vLwlpbWFnZVdpZHRoID0gaW1hZ2VCb3VuZHMud2lkdGg7IAl0cmVlSXRlbTIuc2V0SW1hZ2UoMCwgaW1hZ2UpOwotLy8JaW1hZ2VIZWlnaHQgPSB0cmVlMi5nZXRJdGVtSGVpZ2h0KCkgLSB0cmVlMi5nZXRHcmlkTGluZVdpZHRoKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygwKTsJLy8gYm91bmRzLndpZHRoIHNob3VsZCBiZSBjaGVjayBib3ggd2lkdGggaWYgdGhleSBhcmUgd2lkZXIgdGhhbiBpbWFnZQotLy8JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLmhlaWdodCA9PSBpbWFnZUhlaWdodCk7Ci0vLyAJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygxKSk7CQotCi0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0KLQl0cmVlMi5kaXNwb3NlKCk7Ci0JdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0cmVlSXRlbTIuZGlzcG9zZSgpOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5VTEwpOwotCWltYWdlID0gaW1hZ2VzWzFdOwotLy8JaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLS8vCWltYWdlV2lkdGggPSBpbWFnZUJvdW5kcy53aWR0aDsKLSAJdHJlZUl0ZW0yLnNldEltYWdlKDAsIGltYWdlKTsKLS8vCWltYWdlSGVpZ2h0ID0gdHJlZTIuZ2V0SXRlbUhlaWdodCgpIC0gdHJlZTIuZ2V0R3JpZExpbmVXaWR0aCgpOwotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLSAJYm91bmRzID0gdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKDApOwkvLyBib3VuZHMud2lkdGggc2hvdWxkIGJlIGNoZWNrIGJveCB3aWR0aCBpZiBjaGVjayBib3ggaXMgd2lkZXIgdGhhbiBpbWFnZQotLy8JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLmhlaWdodCA9PSBpbWFnZUhlaWdodCk7Ci0gCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgMCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRFcXVhbHMoImk9IiArIGksIGl0ZW1zW2ldLCB0cmVlSXRlbS5nZXRJdGVtKGkpKTsKLQl0cnkgewotCQl0cmVlSXRlbS5nZXRJdGVtKG51bWJlcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRyZWVJdGVtLmdldEl0ZW0obnVtYmVyKzEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0cmVlSXRlbS5nZXRJdGVtKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoaSwgdHJlZUl0ZW0uZ2V0SXRlbUNvdW50KCkpOwotCQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIDApOwotCX0KLQlhc3NlcnRUcnVlKCJiOiAiLCB0cmVlSXRlbS5nZXRJdGVtQ291bnQoKSA9PSAxMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50W10gY2FzZXMgPSB7MCwgMTAsIDEwMH07Ci0JVHJlZUl0ZW0gW11bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbSBbY2FzZXMubGVuZ3RoXVtdOwotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJaXRlbXMgW2pdID0gbmV3IFRyZWVJdGVtIFtjYXNlcyBbal1dOwotCX0KLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIDApOwotCQkJaXRlbXMgW2pdW2ldID0gdGk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zW2pdLCB0cmVlSXRlbS5nZXRJdGVtcygpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlpdGVtcyBbal1baV0uZGlzcG9zZSgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHModHJlZSwgdHJlZUl0ZW0uZ2V0UGFyZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudEl0ZW0oKSB7Ci0JVHJlZUl0ZW0gdEl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OVUxMKTsKLQlhc3NlcnRFcXVhbHModHJlZUl0ZW0sIHRJdGVtLmdldFBhcmVudEl0ZW0oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGV4dElMSmF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0cmVlSXRlbS5nZXREaXNwbGF5KCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyh0cmVlLmdldEJhY2tncm91bmQoKSwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEJhY2tncm91bmQoKSwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgpLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDEwKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEJhY2tncm91bmQoKSwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgxMCkpOwotCQotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEJhY2tncm91bmQoKSx0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMCwgYmx1ZSk7Ci0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZChyZWQpOwotCWFzc2VydEVxdWFscyhibHVlLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyhyZWQsIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCXRyZWVJdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWUuZ2V0QmFja2dyb3VuZCgpLHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCXRyeSB7IAotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCXRyZWVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IodHJlZUl0ZW0uZ2V0RGlzcGxheSgpLCAyNTUsIDAsIDApOwotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgpKTsKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEJhY2tncm91bmQoKSx0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJdHJlZUl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yIGRpc3Bvc2VkIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENoZWNrZWRaKCkgewotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLQkKLQl0cmVlSXRlbS5zZXRDaGVja2VkKHRydWUpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLQotCVRyZWUgdCA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKHQsIFNXVC5OVUxMKTsKLQl0aS5zZXRDaGVja2VkKHRydWUpOwotCWFzc2VydFRydWUodGkuZ2V0Q2hlY2tlZCgpKTsKLQkKLQl0aS5zZXRDaGVja2VkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRpLmdldENoZWNrZWQoKSk7Ci0JdC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RXhwYW5kZWRaKCkgewotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0JCi0JLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgc3ViaXRlbSBiZWZvcmUgeW91IGNhbiBzZXQgdGhlIHRyZWVpdGVtIGV4cGFuZGVkCi0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLQotCi0JbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTlVMTCk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLQkJCi0JVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OVUxMKTsKLQl0aS5zZXRFeHBhbmRlZCh0cnVlKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aS5nZXRFeHBhbmRlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnQgZm9udCA9IHRyZWVJdGVtLmdldEZvbnQoKTsKLQl0cmVlSXRlbS5zZXRGb250KGZvbnQpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgpKSk7Ci0JCi0JZm9udCA9IG5ldyBGb250KHRyZWVJdGVtLmdldERpc3BsYXkoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JdHJlZUl0ZW0uc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoKSkpOwotCi0JdHJlZUl0ZW0uc2V0Rm9udChudWxsKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0Rm9udCgpLmVxdWFscyggdHJlZUl0ZW0uZ2V0Rm9udCgpKSk7Ci0JCi0JZm9udC5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0Rm9udChmb250KTsKLQkJdHJlZUl0ZW0uc2V0Rm9udChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRyZWVJdGVtLmdldERpc3BsYXkoKTsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQkKLQkvLyBubyBjb2x1bW5zCi0JYXNzZXJ0VHJ1ZSh0cmVlLmdldEZvbnQoKS5lcXVhbHMoIHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQlhc3NlcnRUcnVlKHRyZWVJdGVtLmdldEZvbnQoKS5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCXRyZWVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRGb250KDEwLCBmb250KTsKLQlhc3NlcnRUcnVlKHRyZWVJdGVtLmdldEZvbnQoKS5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgxMCkpKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMKLQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0Rm9udCgxMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlSXRlbS5nZXRGb250KCkuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMTApKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQl0cmVlSXRlbS5zZXRGb250KDAsIG51bGwpOwotCWFzc2VydFRydWUodHJlZS5nZXRGb250KCkuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAyMCwgU1dULk5PUk1BTCk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQl0cmVlSXRlbS5zZXRGb250KGZvbnQyKTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQl0cmVlSXRlbS5zZXRGb250KDAsIG51bGwpOwotCWFzc2VydFRydWUoZm9udDIuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQl0cmVlSXRlbS5zZXRGb250KG51bGwpOwotCWFzc2VydFRydWUodHJlZS5nZXRGb250KCkuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQlmb250LmRpc3Bvc2UoKTsKLQlmb250Mi5kaXNwb3NlKCk7Ci0JCi0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQkJdHJlZUl0ZW0uc2V0Rm9udCgwLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0cmVlSXRlbS5nZXREaXNwbGF5KCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyh0cmVlLmdldEZvcmVncm91bmQoKSwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEZvcmVncm91bmQoKSwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDEwKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEZvcmVncm91bmQoKSwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgxMCkpOwotCQotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEZvcmVncm91bmQoKSx0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMCwgYmx1ZSk7Ci0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZChyZWQpOwotCWFzc2VydEVxdWFscyhibHVlLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyhyZWQsIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCXRyZWVJdGVtLnNldEZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWUuZ2V0Rm9yZWdyb3VuZCgpLHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCXRyeSB7IAotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCXRyZWVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IodHJlZUl0ZW0uZ2V0RGlzcGxheSgpLCAyNTUsIDAsIDApOwotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpKTsKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEZvcmVncm91bmQoKSx0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yIGRpc3Bvc2VkIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0R3JheWVkWigpIHsKLQlUcmVlIG5ld1RyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUcmVlSXRlbSB0SXRlbSA9IG5ldyBUcmVlSXRlbShuZXdUcmVlLDApOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdEl0ZW0uZ2V0R3JheWVkKCkpOwotCXRJdGVtLnNldEdyYXllZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRJdGVtLmdldEdyYXllZCgpKTsKLQl0SXRlbS5zZXRHcmF5ZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdEl0ZW0uZ2V0R3JheWVkKCkpOwotCW5ld1RyZWUuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JYXNzZXJ0TnVsbCh0cmVlSXRlbS5nZXRJbWFnZSgxKSk7CQotIAl0cmVlSXRlbS5zZXRJbWFnZSgtMSwgbnVsbCk7CQkKLQlhc3NlcnROdWxsKHRyZWVJdGVtLmdldEltYWdlKC0xKSk7CQotCQkKLQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRyZWVJdGVtLmdldEltYWdlKDApKTsJCi0gCVN0cmluZyB0ZXh0c1tdID0gbmV3IFN0cmluZ1tpbWFnZXMubGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCXRleHRzW2ldID0gU3RyaW5nLnZhbHVlT2YoaSk7Ci0JfQotCQotCS8vdHJlZS5zZXRUZXh0KHRleHRzKTsJCQkJLy8gY3JlYXRlIGVub3VnaCBjb2x1bW5zIGZvciBUcmVlSXRlbS5zZXRJbWFnZShJbWFnZVtdKSB0byB3b3JrCi0JaW50IGNvbHVtbkNvdW50ID0gdHJlZS5nZXRDb2x1bW5Db3VudCgpOwotCWlmIChjb2x1bW5Db3VudCA8IHRleHRzLmxlbmd0aCkgewotCQlmb3IgKGludCBpID0gY29sdW1uQ291bnQ7IGkgPCB0ZXh0cy5sZW5ndGg7IGkrKyl7Ci0JCQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCX0KLQl9Ci0JVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dCh0ZXh0c1tpXSk7Ci0JfQotCXRyZWVJdGVtLnNldEltYWdlKDEsIGltYWdlc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1sxXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMSkpOwkKLSAJdHJlZUl0ZW0uc2V0SW1hZ2UoaW1hZ2VzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoaW1hZ2VzW2ldLCB0cmVlSXRlbS5nZXRJbWFnZShpKSk7Ci0JfQotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldEltYWdlKChJbWFnZSBbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGltYWdlcyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHMobnVsbCwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCXRyZWVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMTAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRyZWVJdGVtLmdldEltYWdlKDEwKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEltYWdlKDEwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhudWxsLCB0cmVlSXRlbS5nZXRJbWFnZSgxMCkpOwotCQotCXRyZWVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCXRyZWVJdGVtLnNldEltYWdlKDAsIG51bGwpOwotCWFzc2VydEVxdWFscyhudWxsLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQl0cmVlSXRlbS5zZXRJbWFnZShpbWFnZXNbMV0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMV0sIHRyZWVJdGVtLmdldEltYWdlKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRJbWFnZShpbWFnZXNbMV0pOwotCXRyZWVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCWltYWdlc1swXS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQkJdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nID0gInRlc3QiOwotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nc1tdID0gbmV3IFN0cmluZ1tdIHtUZXN0U3RyaW5nLCBUZXN0U3RyaW5nICsgIjEiLCBUZXN0U3RyaW5nICsgIjIifTsKLQkKLQl0cnkgewotCQl0cmVlSXRlbS5zZXRUZXh0KChTdHJpbmcgW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmdzID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUcmVlIHRoYXQgaGFzIG9ubHkgCi0gCSogdGhlIGRlZmF1bHQgY29sdW1uLgotIAkqLwotCQotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KFRlc3RTdHJpbmdzKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZ3NbMF0sIHRyZWVJdGVtLmdldFRleHQoMCkpOwotCWZvciAoaW50IGkgPSAxOyBpIDwgVGVzdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoaSkubGVuZ3RoKCkpOwotCX0KLQkKLQkKLSAgIC8qCi0gCSogVGVzdCB0aGUgZ2V0VGV4dC9zZXRUZXh0IEFQSSB3aXRoIGEgVHJlZSB0aGF0IGVub3VnaCAKLSAJKiBjb2x1bW5zIHRvIGZpdCBhbGwgdGVzdCBpdGVtIHRleHRzLgotIAkqLwotIAkJCi0JaW50IGNvbHVtbkNvdW50ID0gdHJlZS5nZXRDb2x1bW5Db3VudCgpOwotCWlmIChjb2x1bW5Db3VudCA8IGltYWdlcy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKXsKLQkJCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJfQotCX0KLQlUcmVlQ29sdW1uW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgVGVzdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJY29sdW1uc1tpXS5zZXRUZXh0KFRlc3RTdHJpbmdzW2ldKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZygpewotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nID0gInRlc3QiOwotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nc1tdID0gbmV3IFN0cmluZ1tdIHtUZXN0U3RyaW5nLCBUZXN0U3RyaW5nICsgIjEiLCBUZXN0U3RyaW5nICsgIjIifTsKLQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUcmVlIHRoYXQgaGFzIG9ubHkgCi0gCSogdGhlIGRlZmF1bHQgY29sdW1uLgotIAkqLwotCQotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsJCi0gCXRyZWVJdGVtLnNldFRleHQoMSwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwkKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgwKS5sZW5ndGgoKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dCgwLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZywgdHJlZUl0ZW0uZ2V0VGV4dCgwKSk7Ci0gCXRyZWVJdGVtLnNldFRleHQoLTEsIFRlc3RTdHJpbmdzWzFdKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgtMSkubGVuZ3RoKCkpOwkKLQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUcmVlIHRoYXQgZW5vdWdoIAotIAkqIGNvbHVtbnMgdG8gZml0IGFsbCB0ZXN0IGl0ZW0gdGV4dHMuCi0gCSovCi0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCS8vdHJlZS5zZXRUZXh0KFRlc3RTdHJpbmdzKTsJCQkJLy8gY3JlYXRlIGFub3VnaCBjb2x1bW5zIGZvciBUcmVlSXRlbS5zZXRUZXh0KFN0cmluZ1tdKSB0byB3b3JrCi0JaW50IGNvbHVtbkNvdW50ID0gdHJlZS5nZXRDb2x1bW5Db3VudCgpOwotCWlmIChjb2x1bW5Db3VudCA8IGltYWdlcy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKXsKLQkJCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJfQotCX0KLQlUcmVlQ29sdW1uW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgVGVzdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJY29sdW1uc1tpXS5zZXRUZXh0KFRlc3RTdHJpbmdzW2ldKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwkKLQotCi0JdHJlZUl0ZW0uc2V0VGV4dCgxLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZywgdHJlZUl0ZW0uZ2V0VGV4dCgxKSk7CQotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDApLmxlbmd0aCgpKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KDAsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nLCB0cmVlSXRlbS5nZXRUZXh0KDApKTsKLQotCi0JdHJlZUl0ZW0uc2V0VGV4dCgtMSwgVGVzdFN0cmluZ3NbMV0pOwotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KC0xKS5sZW5ndGgoKSk7CQotCi0KLQl0cnkgewotCQl0cmVlSXRlbS5zZXRUZXh0KC0xLCBudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0VGV4dCgwLCBudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9IAotCi0KLX0KLQotLy9wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLS8vCXRyeSB7Ci0vLwkJdHJlZUl0ZW0uc2V0VGV4dCgoU3RyaW5nKW51bGwpOwkJCi0vLwkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLS8vCX0KLS8vCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotLy8JfQotLy99Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGVja2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFeHBhbmRlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmF5ZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlQm91bmRzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2hlY2tlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEV4cGFuZGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEdyYXllZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZCIpKSB0ZXN0X2dldEJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmRJIikpIHRlc3RfZ2V0QmFja2dyb3VuZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kc0kiKSkgdGVzdF9nZXRCb3VuZHNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoZWNrZWQiKSkgdGVzdF9nZXRDaGVja2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFeHBhbmRlZCIpKSB0ZXN0X2dldEV4cGFuZGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250IikpIHRlc3RfZ2V0Rm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udEkiKSkgdGVzdF9nZXRGb250SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmRJIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEdyYXllZCIpKSB0ZXN0X2dldEdyYXllZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VCb3VuZHNJIikpIHRlc3RfZ2V0SW1hZ2VCb3VuZHNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZUkiKSkgdGVzdF9nZXRJbWFnZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpICB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50SXRlbSIpKSB0ZXN0X2dldFBhcmVudEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRJIikpIHRlc3RfZ2V0VGV4dEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2hlY2tlZFoiKSkgdGVzdF9zZXRDaGVja2VkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RXhwYW5kZWRaIikpIHRlc3Rfc2V0RXhwYW5kZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRHcmF5ZWRaIikpIHRlc3Rfc2V0R3JheWVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotVHJlZUl0ZW0gdHJlZUl0ZW07Ci1UcmVlIHRyZWU7Ci0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudCgpIHsKLQlpZiAoIHRyZWVJdGVtICE9IG51bGwgKSB0cmVlSXRlbS5kaXNwb3NlKCk7Ci0JaWYgKCB0cmVlICE9IG51bGwgKSB0cmVlLmRpc3Bvc2UoKTsKLQl0cmVlID0gbmV3IFRyZWUoc2hlbGwsIDApOwotCXRyZWVJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCXNldFdpZGdldCh0cmVlSXRlbSk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHlwZWRMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmNGY3ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHlwZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlR5cGVkTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlR5cGVkTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHlwZWRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHlwZWRMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX1NXVEV2ZW50TGlzdGVuZXIoKSB7Ci0JLy8gZG8gbm90IHRlc3QgaW50ZXJuYWwgcHVibGljIG1ldGhvZHMgKG5vbi1BUEkpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RXZlbnRMaXN0ZW5lcigpIHsKLQkvLyBkbyBub3QgdGVzdCBpbnRlcm5hbCBwdWJsaWMgbWV0aG9kcyAobm9uLUFQSSkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQkvLyBkbyBub3QgdGVzdCBpbnRlcm5hbCBwdWJsaWMgbWV0aG9kcyAobm9uLUFQSSkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9TV1RFdmVudExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFdmVudExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfU1dURXZlbnRMaXN0ZW5lciIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9TV1RFdmVudExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFdmVudExpc3RlbmVyIikpIHRlc3RfZ2V0RXZlbnRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTI5ZTJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JLy8gVXNlIHRoaXMgdmFyaWFibGUgdG8gaGVscCB2YWxpZGF0ZSBjYWxsYmFja3MKLQlib29sZWFuIGxpc3RlbmVyQ2FsbGVkOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB3aWRnZXQuaXNEaXNwb3NlZCgpKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBzaGVsbC5pc0Rpc3Bvc2VkKCkpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKLQkJYXNzZXJ0VHJ1ZSh3aWRnZXQuaXNEaXNwb3NlZCgpKTsKLQl9Ci0JYXNzZXJ0VHJ1ZShzaGVsbC5pc0Rpc3Bvc2VkKCkpOwotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SSgpIHsKLQkvLyBhYnN0cmFjdCBjbGFzcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZERpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcigpIHsKLQlEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQl9Ci0JfTsKLQl3aWRnZXQuYWRkRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl3aWRnZXQucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKSB7Ci0JdHJ5IHsKLQkJd2lkZ2V0LmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQl9Ci0JfTsKLQl3aWRnZXQuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLQl3aWRnZXQucmVtb3ZlTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCS8vIHRlc3RlZCBpbiB0ZWFyRG93bgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzcGxheSgpIHsKLQlhc3NlcnRFcXVhbHMod2lkZ2V0LmdldERpc3BsYXkoKSwgd2lkZ2V0LmdldERpc3BsYXkoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGUoKSB7Ci0JLy8gdGhpcyB0ZXN0IHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IGxlYWYgc3ViY2xhc3NlcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB3aWRnZXQuaXNEaXNwb3NlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdpZGdldC5ub3RpZnlMaXN0ZW5lcnMoMCwgbnVsbCk7Ci0JRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQlHQyBnYyA9IG51bGw7Ci0JaWYgKHdpZGdldCBpbnN0YW5jZW9mIENvbnRyb2wpIHsKLQkJZ2MgPSBldmVudC5nYyA9IG5ldyBHQygoQ29udHJvbCl3aWRnZXQpOwotCX0KLQl3aWRnZXQubm90aWZ5TGlzdGVuZXJzKFNXVC5QYWludCwgZXZlbnQpOwotCWlmIChnYyAhPSBudWxsKSBnYy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZERpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQkvLyB0aGlzIG1ldGhvZCBpcyBmdXJ0aGVyIHRlc3RlZCBieSBhbGwgb2YgdGhlIHJlbW92ZVR5cGVkTGlzdGVuZXIgdGVzdHMKLQl0cnkgewotCQl3aWRnZXQucmVtb3ZlTGlzdGVuZXIoU1dULlBhaW50LCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl3aWRnZXQucmVtb3ZlTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJfQotCX0pOwotCQotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCX0KLQl9OwotCXdpZGdldC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIGxpc3RlbmVyKTsKLQl3aWRnZXQucmVtb3ZlTGlzdGVuZXIoU1dULlBhaW50LCBsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0KCkgewotCXdpZGdldC5zZXREYXRhKHdpZGdldCk7Ci0JYXNzZXJ0RXF1YWxzKHdpZGdldCwgd2lkZ2V0LmdldERhdGEoKSk7Ci0KLQl3aWRnZXQuc2V0RGF0YShudWxsKTsKLQlhc3NlcnROdWxsKHdpZGdldC5nZXREYXRhKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCXdpZGdldC5zZXREYXRhKCJ0aGUgd2lkZ2V0Iiwgd2lkZ2V0KTsKLQlhc3NlcnRFcXVhbHMod2lkZ2V0LCB3aWRnZXQuZ2V0RGF0YSgidGhlIHdpZGdldCIpKTsKLQotCXdpZGdldC5zZXREYXRhKCJ0aGUgd2lkZ2V0IiwgbnVsbCk7Ci0JYXNzZXJ0TnVsbCh3aWRnZXQuZ2V0RGF0YSgidGhlIHdpZGdldCIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlhc3NlcnROb3ROdWxsKHdpZGdldC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKHdpZGdldC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGlzcGxheSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZURpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyIikpIHRlc3RfYWRkRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKSkgdGVzdF9hZGRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREYXRhIikpIHRlc3RfZ2V0RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREaXNwbGF5IikpIHRlc3RfZ2V0RGlzcGxheSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGUiKSkgdGVzdF9nZXRTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVEaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVEaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFNoZWxsIHNoZWxsOwotcHJpdmF0ZSBXaWRnZXQgd2lkZ2V0OwotCi1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQl3aWRnZXQgPSB3OwotfQotCi1wcm90ZWN0ZWQgdm9pZCBob29rTGlzdGVuZXJzKFdpZGdldCB3LCBpbnRbXSB0eXBlcywgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIHcuYWRkTGlzdGVuZXIodHlwZXNbaV0sIGxpc3RlbmVyKTsKLSAgICB9Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmdbXSBob29rRXhwZWN0ZWRFdmVudHMoU3RyaW5nIHR5cGUsIGZpbmFsIGphdmEudXRpbC5WZWN0b3IgZXZlbnRzKSB7Ci0gICAgcmV0dXJuIGhvb2tFeHBlY3RlZEV2ZW50cyh3aWRnZXQsIHR5cGUsIGV2ZW50cyk7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmdbXSBob29rRXhwZWN0ZWRFdmVudHMoV2lkZ2V0IHcsIFN0cmluZyB0eXBlLCBmaW5hbCBqYXZhLnV0aWwuVmVjdG9yIGV2ZW50cykgewotICAgIFN0cmluZ1tdIGV4cGVjdGVkRXZlbnRzID0gKFN0cmluZ1tdKUNvbnNpc3RlbmN5VXRpbGl0eS5ldmVudE9yZGVyaW5nLmdldCh0eXBlKTsKLSAgICBob29rRXhwZWN0ZWRFdmVudHModywgZXhwZWN0ZWRFdmVudHMsIGV2ZW50cyk7Ci0gICAgcmV0dXJuIGV4cGVjdGVkRXZlbnRzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBob29rRXhwZWN0ZWRFdmVudHMoV2lkZ2V0IHcsIFN0cmluZ1tdIHR5cGVzLCBmaW5hbCBqYXZhLnV0aWwuVmVjdG9yIGV2ZW50cykgewotICAgIGhvb2tMaXN0ZW5lcnModywgQ29uc2lzdGVuY3lVdGlsaXR5LmNvbnZlcnRFdmVudE5hbWVzKHR5cGVzKSwgCi0JICAgICAgICBuZXcgTGlzdGVuZXIoKSB7Ci0JICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCSAgICAgICAgICAgICAgICBTdHJpbmcgdGVtcCA9IENvbnNpc3RlbmN5VXRpbGl0eS5ldmVudE5hbWVzW2UudHlwZV07Ci0JICAgICAgICAgICAgICAgIGlmKGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpCi0JICAgICAgICAgICAgICAgICAgICB0ZW1wICs9ICI6IitDb25zaXN0ZW5jeVV0aWxpdHkuZ2V0VHJhdmVyc2FsVHlwZShlLmRldGFpbCk7Ci0JICAgICAgICAgICAgICAgIGVsc2UgaWYoZS50eXBlID09IFNXVC5TZWxlY3Rpb24pCi0JICAgICAgICAgICAgICAgICAgICB0ZW1wICs9ICI6IitDb25zaXN0ZW5jeVV0aWxpdHkuZ2V0U2VsZWN0aW9uVHlwZShlLmRldGFpbCk7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hZGQodGVtcCk7Ci0JICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0ZW1wICsgZS53aWRnZXQpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0pOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIGdldFRlc3ROYW1lKCkgewotICAgIFN0cmluZyB0ZXN0ID0gZ2V0TmFtZSgpOwotICAgIGludCBpbmRleCA9IHRlc3QubGFzdEluZGV4T2YoJ18nKTsKLSAgICBpZihpbmRleCAhPSAtMSkKLSAgICAgICAgdGVzdCA9IHRlc3Quc3Vic3RyaW5nKGluZGV4KzEsIHRlc3QubGVuZ3RoKCkpOwotICAgIFN0cmluZyBjbHNzID0gZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgaWYoKCF0ZXN0LmVxdWFscygiTWVudURldGVjdCIpIHx8IGNsc3MuZXF1YWxzKCJUYWJsZSIpIHx8IGNsc3MuZXF1YWxzKCJUYWJsZVRyZWUiKSB8fCB0ZXN0LnN0YXJ0c1dpdGgoIkNoZXZyb24iKSkgJiYKLSAgICAgICAoIXRlc3QuZXF1YWxzKCJEcmFnRGV0ZWN0IikgfHwgY2xzcy5lcXVhbHMoIlRyZWUiKSB8fCBjbHNzLmVxdWFscygiVGFibGVUcmVlIikgfHwgdGVzdC5zdGFydHNXaXRoKCJDaGV2cm9uIikpICYmCi0gICAgICAgKCF0ZXN0LmVxdWFscygiRG91YmxlQ2xpY2siKSB8fCBjbHNzLmVxdWFscygiTGlzdCIpKSAmJgotICAgICAgICghdGVzdC5lcXVhbHMoIktleVNlbGVjdGlvbiIpIHx8IGNsc3MuZXF1YWxzKCJTbGlkZXIiKSB8fCBjbHNzLmVxdWFscygiQ29tYm8iKSB8fCBjbHNzLmVxdWFscygiQ0NvbWJvIikgfHwgY2xzcy5lcXVhbHMoIkNUYWJGb2xkZXIiKSkgJiYKLSAgICAgICAoIXRlc3QuZXF1YWxzKCJFbnRlclNlbGVjdGlvbiIpIHx8IGNsc3MuZXF1YWxzKCJCdXR0b24iKSB8fCBjbHNzLmVxdWFscygiVG9vbEJhciIpIHx8IGNsc3MuZXF1YWxzKCJDQ29tYm8iKSB8fCBjbHNzLmVxdWFscygiRXhwYW5kQmFyIikpKQotICAgICAgICB0ZXN0ID0gY2xzcyArIHRlc3Q7Ci0gICAgcmV0dXJuIHRlc3Q7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgIFN0cmluZyBjbGF6eiA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgIGludCBpbmRleCA9IGNsYXp6Lmxhc3RJbmRleE9mKCdfJyk7Ci0gICAgaWYoaW5kZXggIT0gLTEpCi0gICAgICAgIGNsYXp6ID0gY2xhenouc3Vic3RyaW5nKGluZGV4KzEsIGNsYXp6Lmxlbmd0aCgpKTsKLSAgICByZXR1cm4gY2xheno7Ci19Ci0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzYzMTE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5Td3RKdW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjEgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbG9jYXRpb25DaGFuZ2luZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsb2NhdGlvbkNoYW5nZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNb3ppbGxhID0gU3d0SnVuaXQuaXNHVEsgfHwgU3d0SnVuaXQuaXNNb3RpZjsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVUkwgTG9hZGluZyAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IExvY2F0aW9uLmNoYW5naW5nID4gTG9jYXRpb24uY2hhbmdlZCAodG9wIHRydWUpPiBQcm9ncmVzcy5jb21wbGV0ZWQiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWxvY2F0aW9uQ2hhbmdpbmcgPSBsb2NhdGlvbkNoYW5nZWQgPSBwcm9ncmVzc0NvbXBsZXRlZCA9IGZhbHNlOwotCQkJCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdpbmcgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJLyogY2VydGFpbiBicm93c2VycyBkbyBzZW5kIG11bHRpcGxlIGNoYW5naW5nIGV2ZW50cy4gU2FmYXJpIGRvZXMgdGhpcy4gKi8KLQkJCQkvKiB2ZXJpZnkgdGhlIHBhZ2UgaGFzIG5vdCBiZWVuIHJlcG9ydGVkIGFzIGJlaW5nIGxvYWRlZCAqLwotCQkJCXBhc3NlZCA9ICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZWQgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJLyogaWdub3JlIG5vbiB0b3AgZnJhbWUgbG9hZGluZyAqLwotCQkJCWlmICghZXZlbnQudG9wKSByZXR1cm47Ci0JCQkJLyogdmVyaWZ5IGEgY2hhbmdlZCBmb2xsb3dzIGF0IGxlYXN0IG9uZSBjaGFuZ2luZyAqLwotCQkJCS8qIHZlcmlmeSB0aGUgcGFnZSBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgYXMgYmVpbmcgbG9hZGVkICovCi0JCQkJcGFzc2VkID0gbG9jYXRpb25DaGFuZ2luZyAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZWQiKTsKLQkJCQlwYXNzZWQgPSBsb2NhdGlvbkNoYW5naW5nICYmIGxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJcHJvZ3Jlc3NDb21wbGV0ZWQgPSB0cnVlOwotCQkJCS8vIFRFTVBPUkFSSUxZIENPTU1FTlRFRCBPVVQKLQkJCQkvKmlmICghcGFzc2VkKSovIHNoZWxsLmNsb3NlKCk7Ci0vKgkJCQlpZiAocGFzc2VkKSB7Ci0JCQkJCSB3YWl0IGEgbGl0dGxlIGJpdCBtb3JlIGJlZm9yZSBkZWNsYXJpbmcgaXQgYSBzdWNjZXNzLAotCQkJCQkgKiBpbiBjYXNlIGJvZ3VzIGV2ZW50cyBmb2xsb3cgdGhpcyBvbmUuCi0JCQkJCSAKLQkJCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge307Ci0JCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLmNsb3NlKCk7CQkJCQkJCQotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBvdmVyIik7Ci0JCQkJCQl9OwotCQkJCQl9LnN0YXJ0KCk7Ci0JCQkJfQotKi8JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDIoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVUkwgTG9hZGluZyBGaWx0ZXJpbmcgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSA+IG5vIExvY2F0aW9uLmNoYW5nZWQsIG5vIFByb2dyZXNzLmNvbXBsZXRlZCIpOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2luZyAiK2V2ZW50LmxvY2F0aW9uKTsKLQkJCQlwYXNzZWQgPSAhbG9jYXRpb25DaGFuZ2luZyAmJiAhbG9jYXRpb25DaGFuZ2VkICYmICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgewotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQluZXcgVGhyZWFkKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJdHJ5IHsgc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwuY2xvc2UoKTsJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIG92ZXIiKTsKLQkJCQkJfQotCQkJCX0uc3RhcnQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCS8qCi0JCQkJICogRmVhdHVyZSBvbiBJbnRlcm5ldCBFeHBsb3Jlci4gSWYgdGhlcmUgaXMgbm8gY3VycmVudCBsb2NhdGlvbiwgSUUgc3RpbGwgZmlyZXMgYSBEb2N1bWVudENvbXBsZXRlCi0JCQkJICogZm9sbG93aW5nIHRoZSBCZWZvcmVOYXZpZ2F0ZTIgY2FuY2VsIGV2ZW50LiBUaGlzIERvY3VtZW50Q29tcGxldGUgZXZlbnQgY29udGFpbnMgYW4gZW1wdHkgVVJMCi0JCQkJICogc2luY2UgdGhlIFVSTCBpbiBCZWZvcmVOYXZpZ2F0ZTIgd2FzIGNvcnJlY3RseSBjYW5jZWxsZWQuCi0JCQkJICogVGhlIHRlc3QgY29uc2lkZXJzIGl0IGlzIE9LIHRvIHNlbmQgYSBMb2NhdGlvbi5jaGFuZ2VkIGFuZCBhIFByb2dyZXNzLmNvbXBsZXRlZCBldmVudHMgYWZ0ZXIKLQkJCQkgKiBhIExvY2F0aW9uLmNoYW5naW5nIGNhbmNlbCB0cnVlIC0gYXQgdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIGlzIGVtcHR5LAotCQkJCSAqIG90aGVyd2lzZSBpdCBpcyBjb25zaWRlcmVkIHRoYXQgdGhlIGxvY2F0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNhbmNlbGxlZC4gCi0JCQkJICovCi0JCQkJcGFzc2VkID0gZXZlbnQubG9jYXRpb24ubGVuZ3RoKCkgPT0gMDsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkICIrZXZlbnQubG9jYXRpb24rIiAiK3Bhc3NlZCk7Ci0JCQkJbG9jYXRpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQkvKgotCQkJCSAqIEZlYXR1cmUgb24gSW50ZXJuZXQgRXhwbG9yZXIuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgbG9jYXRpb24sIElFIHN0aWxsIGZpcmVzIGEgRG9jdW1lbnRDb21wbGV0ZQotCQkJCSAqIGZvbGxvd2luZyB0aGUgQmVmb3JlTmF2aWdhdGUyIGNhbmNlbCBldmVudC4gVGhpcyBEb2N1bWVudENvbXBsZXRlIGV2ZW50IGNvbnRhaW5zIGFuIGVtcHR5IFVSTAotCQkJCSAqIHNpbmNlIHRoZSBVUkwgaW4gQmVmb3JlTmF2aWdhdGUyIHdhcyBjb3JyZWN0bHkgY2FuY2VsbGVkLgotCQkJCSAqIFRoZSB0ZXN0IGNvbnNpZGVycyBpdCBpcyBPSyB0byBzZW5kIGEgTG9jYXRpb24uY2hhbmdlZCBhbmQgYSBQcm9ncmVzcy5jb21wbGV0ZWQgZXZlbnRzIGFmdGVyCi0JCQkJICogYSBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSAtIGF0IHRoZSBjb25kaXRpb24gdGhhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpcyBlbXB0eSwKLQkJCQkgKiBvdGhlcndpc2UgaXQgaXMgY29uc2lkZXJlZCB0aGF0IHRoZSBsb2NhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQuIAotCQkJCSAqLwotCQkJCVN0cmluZyBsb2NhdGlvbiA9IGJyb3dzZXIuZ2V0VXJsKCk7Ci0JCQkJcGFzc2VkID0gbG9jYXRpb24ubGVuZ3RoKCkgPT0gMDsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZWQgIitwYXNzZWQpOwotCQkJCXByb2dyZXNzQ29tcGxldGVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsKLQkJU3RyaW5nW10gdXJscyA9IHsiaHR0cDovL3d3dy5nb29nbGUuY29tIn07Ci0JCS8vIFRFTVBPUkFSSUxZIE5PVCBSVU4gRk9SIE1PWklMTEEKLQkJaWYgKCFpc01vemlsbGEpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDEodXJsc1tpXSk7IAotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCQlib29sZWFuIHJlc3VsdCA9IHRlc3QyKHVybHNbaV0pOyAKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQkJfQotCQl9Ci0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWMyM2NiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyMiB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7CQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsb2NhdGlvbkNoYW5naW5nID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGxvY2F0aW9uQ2hhbmdlZCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9ncmVzc0NvbXBsZXRlZCA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MShTdHJpbmcgaHRtbCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJzZXRUZXh0IC0gYXJnczogIitodG1sKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IExvY2F0aW9uLmNoYW5naW5nID4gTG9jYXRpb24uY2hhbmdlZCA+IFByb2dyZXNzLmNvbXBsZXRlZCIpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJbG9jYXRpb25DaGFuZ2luZyA9IGxvY2F0aW9uQ2hhbmdlZCA9IHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2luZyAiK2V2ZW50LmxvY2F0aW9uKTsKLQkJCQkvKiBjZXJ0YWluIGJyb3dzZXJzIGRvIHNlbmQgbXVsdGlwbGUgY2hhbmdpbmcgZXZlbnRzLiBTYWZhcmkgZG9lcyB0aGlzLiAqLwotCQkJCXBhc3NlZCA9ICFsb2NhdGlvbkNoYW5nZWQgJiYgIXByb2dyZXNzQ29tcGxldGVkOwotCQkJCWxvY2F0aW9uQ2hhbmdpbmcgPSB0cnVlOwotCQkJCWlmICghcGFzc2VkKSBzaGVsbC5jbG9zZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlZCAiK2V2ZW50LmxvY2F0aW9uKTsKLQkJCQlwYXNzZWQgPSBsb2NhdGlvbkNoYW5naW5nICYmICFsb2NhdGlvbkNoYW5nZWQgJiYgIXByb2dyZXNzQ29tcGxldGVkOwotCQkJCWxvY2F0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JCQkJaWYgKCFwYXNzZWQpIHNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcGxldGVkIik7Ci0JCQkJcGFzc2VkID0gbG9jYXRpb25DaGFuZ2luZyAmJiBsb2NhdGlvbkNoYW5nZWQgJiYgIXByb2dyZXNzQ29tcGxldGVkOwotCQkJCXByb2dyZXNzQ29tcGxldGVkID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgc2hlbGwuY2xvc2UoKTsKLQkJCQlpZiAocGFzc2VkKSB7Ci0JCQkJCS8qIHdhaXQgYSBsaXR0bGUgYml0IG1vcmUgYmVmb3JlIGRlY2xhcmluZyBpdCBhIHN1Y2Nlc3MsCi0JCQkJCSAqIGluIGNhc2UgYm9ndXMgZXZlbnRzIGZvbGxvdyB0aGlzIG9uZS4KLQkJCQkJICovCi0JCQkJCW5ldyBUaHJlYWQoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgc3RhcnQiKTsKLQkJCQkJCQl0cnkgeyBzbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLmNsb3NlKCk7CQkJCQkJCQotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBvdmVyIik7Ci0JCQkJCQl9Ci0JCQkJCX0uc3RhcnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCQotCQlib29sZWFuIHRpbWVvdXQgPSBydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDYwMCk7Ci0JCWlmICh0aW1lb3V0KSBwYXNzZWQgPSBmYWxzZTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MihTdHJpbmcgaHRtbCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJzZXRUZXh0IFVSTCBMb2FkaW5nIEZpbHRlcmluZyAtIGFyZ3M6ICIraHRtbCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSA+IG5vIExvY2F0aW9uLmNoYW5nZWQsIG5vIFByb2dyZXNzLmNvbXBsZXRlZCIpOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2luZyAiK2V2ZW50LmxvY2F0aW9uKTsKLQkJCQkvKgotCQkJCSogRmVhdHVyZSBvbiBJbnRlcm5ldCBFeHBsb3Jlci4gIFdoZW4gcGVuZGluZyByZXF1ZXN0cyBhcmUgc3RvcHBlZCwgSUUKLQkJCQkqIGVtaXRzIGEgTG9jYXRpb24uY2hhbmdpbmcgd2l0aCByZXM6Ly9DOlxXSU5ET1dTXFN5c3RlbTMyXHNoZG9jbGMuZGxsL25hdmNhbmNsLmh0bS4KLQkJCQkqIFBlbmRpbmcgcmVxdWVzdHMgYXJlIHN0b3BwZWQgYmVmb3JlIGdvaW5nIHRvIHRoZSBibGFuayBwYWdlIHRvIHNldCBIVE1MIGluIG1lbW9yeQotCQkJCSogd2l0aCBzZXRUZXh0LgotCQkJCSogVGhlIHRlc3QgY29uc2lkZXJzIGl0IGlzIE9LIHRvIGdldCBtdWx0aXBsZSBMb2NhdGlvbi5jaGFuZ2luZyBldmVudHMgYXQgdGhlIGNvbmRpdGlvbgotCQkJCSogdGhhdCBubyBsb2NhdGlvbkNoYW5nZWQgYW5kIHByb2dyZXNzQ29tcGxldGVkIGFyZSByZXBvcnRlZC4KLQkJCQkqLwotCQkJCXBhc3NlZCA9ICFsb2NhdGlvbkNoYW5nZWQgJiYgIXByb2dyZXNzQ29tcGxldGVkOwotCQkJCWxvY2F0aW9uQ2hhbmdpbmcgPSB0cnVlOwotCQkJCWlmICghcGFzc2VkKSB7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCW5ldyBUaHJlYWQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIHN0YXJ0Iik7Ci0JCQkJCQl0cnkgeyBzbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBhc3luY2V4ZWMgc2hlbGwuY2xvc2UiKTsKLQkJCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5jbG9zZSgpOwkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgb3ZlciIpOwotCQkJCQl9Ci0JCQkJfS5zdGFydCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLyoKLQkJCQkgKiBGZWF0dXJlIG9uIEludGVybmV0IEV4cGxvcmVyLiBJZiB0aGVyZSBpcyBubyBjdXJyZW50IGxvY2F0aW9uLCBJRSBzdGlsbCBmaXJlcyBhIERvY3VtZW50Q29tcGxldGUKLQkJCQkgKiBmb2xsb3dpbmcgdGhlIEJlZm9yZU5hdmlnYXRlMiBjYW5jZWwgZXZlbnQuIFRoaXMgRG9jdW1lbnRDb21wbGV0ZSBldmVudCBjb250YWlucyBhbiBlbXB0eSBVUkwKLQkJCQkgKiBzaW5jZSB0aGUgVVJMIGluIEJlZm9yZU5hdmlnYXRlMiB3YXMgY29ycmVjdGx5IGNhbmNlbGxlZC4KLQkJCQkgKiBUaGUgdGVzdCBjb25zaWRlcnMgaXQgaXMgT0sgdG8gc2VuZCBhIExvY2F0aW9uLmNoYW5nZWQgYW5kIGEgUHJvZ3Jlc3MuY29tcGxldGVkIGV2ZW50cyBhZnRlcgotCQkJCSAqIGEgTG9jYXRpb24uY2hhbmdpbmcgY2FuY2VsIHRydWUgLSBhdCB0aGUgY29uZGl0aW9uIHRoYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaXMgZW1wdHksCi0JCQkJICogb3RoZXJ3aXNlIGl0IGlzIGNvbnNpZGVyZWQgdGhhdCB0aGUgbG9jYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLiAKLQkJCQkgKi8KLQkJCQlwYXNzZWQgPSBldmVudC5sb2NhdGlvbi5sZW5ndGgoKSA9PSAwOwotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZWQgIitldmVudC5sb2NhdGlvbisiICIrcGFzc2VkKTsKLQkJCQkvKiBpZ25vcmUgTG9jYXRpb25DaGFuZ2VkIHRoYXQgYXJlIGVtcHR5ICovCi0JCQkJbG9jYXRpb25DaGFuZ2VkID0gIXBhc3NlZDsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQkvKgotCQkJCSAqIEZlYXR1cmUgb24gSW50ZXJuZXQgRXhwbG9yZXIuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgbG9jYXRpb24sIElFIHN0aWxsIGZpcmVzIGEgRG9jdW1lbnRDb21wbGV0ZQotCQkJCSAqIGZvbGxvd2luZyB0aGUgQmVmb3JlTmF2aWdhdGUyIGNhbmNlbCBldmVudC4gVGhpcyBEb2N1bWVudENvbXBsZXRlIGV2ZW50IGNvbnRhaW5zIGFuIGVtcHR5IFVSTAotCQkJCSAqIHNpbmNlIHRoZSBVUkwgaW4gQmVmb3JlTmF2aWdhdGUyIHdhcyBjb3JyZWN0bHkgY2FuY2VsbGVkLgotCQkJCSAqIFRoZSB0ZXN0IGNvbnNpZGVycyBpdCBpcyBPSyB0byBzZW5kIGEgTG9jYXRpb24uY2hhbmdlZCBhbmQgYSBQcm9ncmVzcy5jb21wbGV0ZWQgZXZlbnRzIGFmdGVyCi0JCQkJICogYSBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSAtIGF0IHRoZSBjb25kaXRpb24gdGhhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpcyBlbXB0eSwKLQkJCQkgKiBvdGhlcndpc2UgaXQgaXMgY29uc2lkZXJlZCB0aGF0IHRoZSBsb2NhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQuIAotCQkJCSAqLwotCQkJCVN0cmluZyBsb2NhdGlvbiA9IGJyb3dzZXIuZ2V0VXJsKCk7Ci0JCQkJcGFzc2VkID0gbG9jYXRpb24ubGVuZ3RoKCkgPT0gMDsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZWQgIitwYXNzZWQpOwotCQkJCXByb2dyZXNzQ29tcGxldGVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlib29sZWFuIHRpbWVvdXQgPSBydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDYwMCk7Ci0JCWlmICh0aW1lb3V0KSBwYXNzZWQgPSBmYWxzZTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwotCQlTdHJpbmdbXSBodG1sID0ge2ZpbGUxfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QxKGh0bWxbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGh0bWwubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDIoaHRtbFtpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlMSA9ICI8SFRNTD48SEVBRD4iKwotCQkiPE1FVEEgSFRUUC1FUVVJVj1cIkNvbnRlbnQtVHlwZVwiIENPTlRFTlQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMVwiPiIrCi0JCSI8VElUTEU+VGVzdCB3aXRoIDIgZnJhbWVzPC9USVRMRT4iKwotCQkiPC9IRUFEPjxCT0RZPnNvbWUgc2ltcGxlIHRlc3QgY2FzZSBoZXJlPC9CT0RZPjwvSFRNTD4iOwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBhN2Y1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyMyB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7CQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuV2luZG93LCBsb2NhdGlvbkNoYW5naW5nLCBsb2NhdGlvbkNoYW5nZWQsIHZpc2liaWxpdHlTaG93LCBwcm9ncmVzc0NvbXBsZXRlZDsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJqYXZhc2NyaXB0IHdpbmRvdy5vcGVuIC0gYXJnczogIit1cmwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogQnJvd3NlcjE6T3BlbldpbmRvdy5vcGVuID4geyBCcm93c2VyMjpMb2NhdGlvbi5jaGFuZ2luZywgQnJvd3NlcjI6VmlzaWJpbGl0eS5zaG93LCBCcm93c2VyMjpMb2NhdGlvbi5jaGFuZ2VkIH0gPiBCcm93c2VyMjpQcm9ncmVzcy5jb21wbGV0ZWQiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWxvY2F0aW9uQ2hhbmdpbmcgPSBsb2NhdGlvbkNoYW5nZWQgPSBwcm9ncmVzc0NvbXBsZXRlZCA9IGZhbHNlOwotCQkJCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIxID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwyID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbDIuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIyID0gbmV3IEJyb3dzZXIoc2hlbGwyLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIxLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJCW9wZW5XaW5kb3cgPSB0cnVlOwotCQkJCUJyb3dzZXIgc3JjID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCWlmIChzcmMgIT0gYnJvd3NlcjEpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIGV4cGVjdGVkICIrYnJvd3NlcjErIiwgZ290ICIrc3JjKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGV2ZW50LmJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gZXhwZWN0ZWQgbnVsbCwgZ290ICIrZXZlbnQuYnJvd3Nlcik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWV2ZW50LmJyb3dzZXIgPSBicm93c2VyMjsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9wZW5XaW5kb3cgfHwgIWxvY2F0aW9uQ2hhbmdpbmcpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIExvY2F0aW9uRXZlbnQuY2hhbmdpbmcgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlsb2NhdGlvbkNoYW5nZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICghb3BlbldpbmRvdykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gTG9jYXRpb25FdmVudC5jaGFuZ2luZyByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWxvY2F0aW9uQ2hhbmdpbmcgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoaWRlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIGRpZCBub3QgZXhwZWN0IFZpc2liaWxpdHlFdmVudC5oaWRlIik7Ci0JCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9wZW5XaW5kb3cpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIFZpc2liaWxpdHlFdmVudC5zaG93IHJlY2VpdmVkIGF0IHdyb25nIHRpbWUiKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsJCQkJCQotCQkJCX0KLQkJCQlzaGVsbDIub3BlbigpOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCW5ldyBUaHJlYWQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIHN0YXJ0Iik7Ci0JCQkJCQl0cnkgeyBzbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCQkJCQlwYXNzZWQgPSB0cnVlOwotCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwuY2xvc2UoKTsJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIG92ZXIiKTsKLQkJCQkJfQotCQkJCX0uc3RhcnQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIxLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsJCQotCQlTdHJpbmcgdXJsOwotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyMy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyMy5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXIzLmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0ge3VybH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MSh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0YTgyMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjQgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbldpbmRvdywgbG9jYXRpb25DaGFuZ2luZywgbG9jYXRpb25DaGFuZ2VkLCB2aXNpYmlsaXR5U2hvdywgcHJvZ3Jlc3NDb21wbGV0ZWQsIGNsb3NlV2luZG93OwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MShTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImphdmFzY3JpcHQgd2luZG93Lm9wZW4gLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBCcm93c2VyMTpPcGVuV2luZG93Lm9wZW4gPiB7IEJyb3dzZXIyOkxvY2F0aW9uLmNoYW5naW5nLCBCcm93c2VyMjpWaXNpYmlsaXR5LnNob3csIEJyb3dzZXIyOkxvY2F0aW9uLmNoYW5nZWQgfSA+IEJyb3dzZXIyOlByb2dyZXNzLmNvbXBsZXRlZCA+IEJyb3dzZXIyLkNsb3NlV2luZG93LmNsb3NlIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyMSA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwyLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyMiA9IG5ldyBCcm93c2VyKHNoZWxsMiwgU1dULk5PTkUpOwotCQlicm93c2VyMS5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlvcGVuV2luZG93ID0gdHJ1ZTsKLQkJCQlCcm93c2VyIHNyYyA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlpZiAoc3JjICE9IGJyb3dzZXIxKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBleHBlY3RlZCAiK2Jyb3dzZXIxKyIsIGdvdCAiK3NyYyk7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChldmVudC5icm93c2VyICE9IG51bGwpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIGV4cGVjdGVkIG51bGwsIGdvdCAiK2V2ZW50LmJyb3dzZXIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlldmVudC5icm93c2VyID0gYnJvd3NlcjI7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93IHx8ICFsb2NhdGlvbkNoYW5naW5nKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBMb2NhdGlvbi5jaGFuZ2luZyByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWxvY2F0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBMb2NhdGlvbi5jaGFuZ2luZyByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWxvY2F0aW9uQ2hhbmdpbmcgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoaWRlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIGRpZCBub3QgZXhwZWN0IFZpc2liaWxpdHlFdmVudC5oaWRlIik7Ci0JCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9wZW5XaW5kb3cpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIFZpc2liaWxpdHkuc2hvdyByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47CQkJCQkKLQkJCQl9Ci0JCQkJc2hlbGwyLm9wZW4oKTsKLQkJCQl2aXNpYmlsaXR5U2hvdyA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFsb2NhdGlvbkNoYW5naW5nIHx8ICFsb2NhdGlvbkNoYW5nZWQgfHwgIXZpc2liaWxpdHlTaG93KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBQcm9ncmVzcy5jb21wbGV0ZWQgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlwcm9ncmVzc0NvbXBsZXRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG5ldyBDbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIXByb2dyZXNzQ29tcGxldGVkKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBDbG9zZVdpbmRvdy5jbG9zZSByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNsb3NlV2luZG93ID0gdHJ1ZTsKLQkJCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJU2hlbGwgcGFyZW50ID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCXBhcmVudC5jbG9zZSgpOwotCQkJCQotCQkJCW5ldyBUaHJlYWQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIHN0YXJ0Iik7Ci0JCQkJCQl0cnkgeyBzbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCQkJCQlwYXNzZWQgPSB0cnVlOwotCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwuY2xvc2UoKTsJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIG92ZXIiKTsKLQkJCQkJfQotCQkJCX0uc3RhcnQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIxLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsJCQotCQlTdHJpbmcgdXJsOwotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyNC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNC5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI0Lmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0ge3VybH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MSh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI1LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyNjI2Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuU3d0SnVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXI1IHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLQlzdGF0aWMgUG9pbnRbXVtdIHJlZ3Jlc3Npb25Cb3VuZHMgPSB7Ci0JCQkJe25ldyBQb2ludCgxMCwyMDApLCBuZXcgUG9pbnQoMzAwLDEwMCl9LAotCQkJCXtuZXcgUG9pbnQoMTAsMjAwKSwgbnVsbH0sCi0JCQkJe251bGwsIG5ldyBQb2ludCgzMDAsMTAwKX0sCi0JCQkJe251bGwsIG51bGx9fTsKLQlzdGF0aWMgaW50IGluZGV4ID0gMDsKLQlzdGF0aWMgaW50IGNudFBhc3NlZCA9IDA7Ci0Jc3RhdGljIGludCBjbnRDbG9zZWQgPSAwOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vemlsbGEgPSBTd3RKdW5pdC5pc0dUSyB8fCBTd3RKdW5pdC5pc01vdGlmOwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MShTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImphdmFzY3JpcHQgd2luZG93Lm9wZW4gd2l0aCBsb2NhdGlvbiBhbmQgc2l6ZSBwYXJhbWV0ZXJzIC0gYXJnczogIit1cmwrIlxuICBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogVmlzaWJpbGl0eS5zaG93Iik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQkJCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIk9wZW5XaW5kb3cgIitpbmRleCk7Ci0JCQkJU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQkJbmV3U2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKG5ld1NoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJYnJvd3Nlci5zZXREYXRhKCJpbmRleCIsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JCQkJYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQkJCVNoZWxsIHBhcmVudCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCQkJCVBvaW50IGxvY2F0aW9uID0gZXZlbnQubG9jYXRpb247Ci0JCQkJCQlQb2ludCBzaXplID0gZXZlbnQuc2l6ZTsKLQkJCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSBwYXJlbnQuc2V0TG9jYXRpb24obG9jYXRpb24pOwotCQkJCQkJaWYgKHNpemUgIT0gbnVsbCkgcGFyZW50LnNldFNpemUoc2l6ZSk7Ci0JCQkJCQlpbnQgaW5kZXggPSAoKEludGVnZXIpYnJvd3Nlci5nZXREYXRhKCJpbmRleCIpKS5pbnRWYWx1ZSgpOwotCQkJCQkJcGFyZW50LnNldFRleHQoIlNXVCBCcm93c2VyIHNoZWxsICIraW5kZXgpOwotCQkJCQkJcGFyZW50Lm9wZW4oKTsKLQkJCQkJCWlmIChpbmRleCA8IDApIHsKLQkJCQkJCQkvKiBDZXJ0YWluIGJyb3dzZXJzIGZpcmUgbXVsdGlwbGUgc2hvdyBldmVudHMgZm9yIG5vIGdvb2QgcmVhc29uLiBGdXJ0aGVyIHNob3cgZXZlbnRzCi0JCQkJCQkJICogYXJlIGNvbnNpZGVyZWQgJ2xlZ2FsJyBhcyBsb25nIGFzIHRoZXkgZG9uJ3QgY29udGFpbiBzaXplIGFuZCBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQkJCQkJCQkgKi8KLQkJCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCB8fCBzaXplICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIEJyb3dzZXIgIitpbmRleCsiIGlzIHJlY2VpdmluZyBtdWx0aXBsZSBzaG93IGV2ZW50cyIpOwotCQkJCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVbm5lY2Vzc2FyeSAoYnV0IGhhcm1sZXNzKSB2aXNpYmlsaXR5LnNob3cgZXZlbnQgQnJvd3NlciAiK2luZGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2liaWxpdHkuc2hvdyBicm93c2VyICIraW5kZXgrIiBsb2NhdGlvbiAiK2xvY2F0aW9uKyIgc2l6ZSAiK3NpemUpOwotCQkJCQkJCWJyb3dzZXIuc2V0RGF0YSgiaW5kZXgiLCBuZXcgSW50ZWdlcigtMTAwLWluZGV4KSk7Ci0KLQkJCQkJCQkvKiBDZXJ0YWluIGJyb3dzZXJzIGluY2x1ZGUgZGVjb3JhdGlvbnMgaW4gYWRkaXRpb24gdG8gdGhlIGV4cGVjdGVkIHNpemUuCi0JCQkJCQkJICogQWNjZXB0IHNpemVzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZXhwZWN0ZWQgc2l6ZS4KLQkJCQkJCQkgKiBDZXJ0YWluIGJyb3dzZXJzIGludmVudCBzaXplIG9yIGxvY2F0aW9uIHdoZW4gc29tZSBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLgotCQkJCQkJCSAqIElmIHdlIGV4cGVjdCBudWxsIGZvciBvbmUgb2Ygc2l6ZSBvciBsb2NhdGlvbiwgYWxzbyBhY2NlcHQgbm9uIG51bGwgYW5zd2Vycy4KLQkJCQkJCQkgKi8KLQkJCQkJCQlQb2ludCBleHBlY3RlZExvY2F0aW9uID0gcmVncmVzc2lvbkJvdW5kc1tpbmRleF1bMF07Ci0JCQkJCQkJUG9pbnQgZXhwZWN0ZWRTaXplID0gcmVncmVzc2lvbkJvdW5kc1tpbmRleF1bMV07Ci0JCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgbG9jYXRpb24gIitleHBlY3RlZExvY2F0aW9uKyIgc2l6ZSAiK2V4cGVjdGVkU2l6ZSk7Ci0JCQkJCQkJYm9vbGVhbiBjaGVja0xvY2F0aW9uID0gKGxvY2F0aW9uID09IG51bGwgJiYgZXhwZWN0ZWRMb2NhdGlvbiA9PSBudWxsKSB8fAotCQkJCQkJCQkobG9jYXRpb24gIT0gbnVsbCAmJiBsb2NhdGlvbi5lcXVhbHMoZXhwZWN0ZWRMb2NhdGlvbikgfHwKLQkJCQkJCQkJKGxvY2F0aW9uICE9IG51bGwgJiYgZXhwZWN0ZWRMb2NhdGlvbiA9PSBudWxsKSk7Ci0JCQkJCQkJYm9vbGVhbiBjaGVja1NpemUgID0gKHNpemUgPT0gbnVsbCAmJiBleHBlY3RlZFNpemUgPT0gbnVsbCkgfHwgCi0JCQkJCQkJCShzaXplICE9IG51bGwgJiYgc2l6ZS5lcXVhbHMoZXhwZWN0ZWRTaXplKSkgfHwKLQkJCQkJCQkJKHNpemUgIT0gbnVsbCAmJiBleHBlY3RlZFNpemUgPT0gbnVsbCkgfHwKLQkJCQkJCQkJKHNpemUgIT0gbnVsbCAmJiBzaXplLnggPj0gZXhwZWN0ZWRTaXplLnggJiYgc2l6ZS55ID49IGV4cGVjdGVkU2l6ZS55KTsKLQkJCQkJCQlpZiAoIWNoZWNrU2l6ZSB8fCAhY2hlY2tMb2NhdGlvbikgewotCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIJRmFpbHVyZSAiKTsKLQkJCQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9IGVsc2UgY250UGFzc2VkKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJCQljbnRDbG9zZWQrKzsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkNsb3NlIik7Ci0JCQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJCQlicm93c2VyLmdldFNoZWxsKCkuY2xvc2UoKTsKLQkJCQkJCWlmIChjbnRQYXNzZWQgPT0gcmVncmVzc2lvbkJvdW5kcy5sZW5ndGgpIHBhc3NlZCA9IHRydWU7Ci0JCQkJCQlpZiAoY250Q2xvc2VkID09IHJlZ3Jlc3Npb25Cb3VuZHMubGVuZ3RoKSB7Ci0JCQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlldmVudC5icm93c2VyID0gYnJvd3NlcjsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsJCQotCQlTdHJpbmcgdXJsOwotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyNS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNS5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI1Lmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0ge3VybH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJLy8gVEVTVDEgVEVNUE9SQVJJTFkgTk9UIFJVTiBGT1IgTU9aSUxMQQotCQkJaWYgKCFpc01vemlsbGEpIHsKLQkJCQlib29sZWFuIHJlc3VsdCA9IHRlc3QxKHVybHNbaV0pOyAKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJCWlmICghcmVzdWx0KSBmYWlsKys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI2LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjNzRiNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuU3d0SnVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXI2IHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNb3ppbGxhID0gU3d0SnVuaXQuaXNHVEsgfHwgU3d0SnVuaXQuaXNNb3RpZjsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVUkwgTG9hZGluZywgdmVyaWZ5IGdldCB0aXRsZSBldmVudCAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IFRpdGxlLmNoYW5nZWQiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihuZXcgVGl0bGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlTdHJpbmcgdXJsID0gYnJvd3Nlci5nZXRVcmwoKTsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJUaXRsZSBjaGFuZ2VkIDwiK2V2ZW50LnRpdGxlKyI+IGZvciBsb2NhdGlvbiA8Iit1cmwrIj4iKTsKLQkJCQlwYXNzZWQgPSB0cnVlOwotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlpZiAoaXNNb3ppbGxhKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDIoU3RyaW5nIHVybCwgZmluYWwgU3RyaW5nIGV4cGVjdGVkVGl0bGUpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVVJMIExvYWRpbmcsIHZlcmlmeSBnZXQgdGl0bGUgZXZlbnQgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBUaXRsZS5jaGFuZ2VkIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChUaXRsZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVN0cmluZyB1cmwgPSBicm93c2VyLmdldFVybCgpOwotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlRpdGxlIGNoYW5nZWQgPCIrZXZlbnQudGl0bGUrIj4gZm9yIGxvY2F0aW9uIDwiK3VybCsiPiIpOwotCQkJCWlmIChldmVudC50aXRsZS5lcXVhbHMoZXhwZWN0ZWRUaXRsZSkpIHsKLQkJCQkJcGFzc2VkID0gdHJ1ZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJCi0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7Ci0JCQotCQlTdHJpbmdbXSB1cmxzID0geyJodHRwOi8vd3d3Lmdvb2dsZS5jb20ifTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBURVNUMSBURU1QT1JBUklMWSBOT1QgUlVOIEZPUiBNT1pJTExBCi0JCQlpZiAoIWlzTW96aWxsYSkgewotCQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDEodXJsc1tpXSk7IAotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsKLQkJCX0KLQkJfQotCQkKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQkJU3RyaW5nIHVybDsKLQkJaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgdXJsID0gQnJvd3NlcjYuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgiYnJvd3NlcjYuaHRtbCIpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgdXJsID0gcGx1Z2luUGF0aCArICIvZGF0YS9icm93c2VyNi5odG1sIjsKLQkJdXJscyA9IG5ldyBTdHJpbmdbXSB7dXJsfTsKLQkJU3RyaW5nW10gdGl0bGVzID0geyJUaGlzIGlzIGEgdGVzdCB0aXRsZSB0aGF0IG11c3QgYmUgY2FyZWZ1bGx5IGNoZWNrZWQgd2hlbiB0aGF0IHBhZ2UgaXMgbG9hZGVkIn07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0Mih1cmxzW2ldLCB0aXRsZXNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQkKLQkJCi0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjcuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzBmMGVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyNyB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7CQotCQotCXN0YXRpYyBpbnQgY250T3BlbiA9IDA7Ci0Jc3RhdGljIGludCBjbnRTaG93ID0gMDsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdChTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIndpbmRvdy5vcGVuLCB2ZXJpZnkgZ2V0IFdpbmRvdy5vcGVuIGFuZCBXaW5kb3cuc2hvdyBldmVudHMgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBXaW5kb3cub3BlbiwgV2luZG93LnNob3cgbXVsdGlwbGUgdGltZXMiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCQotCQljbnRPcGVuID0gMDsKLQkJY250U2hvdyA9IDA7Ci0JCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCAxMCk7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIldpbmRvdyBvcGVuZWQ6ICIrY250T3BlbisiIFdpbmRvdyBzaG93bjogIitjbnRTaG93KTsKLQkJLyoKLQkJICogQnVnIGluIE1vemlsbGEuIE11bHRpcGxlIHNob3cgZXZlbnRzIGFyZSBmaXJlZCBieSBNb3ppbGxhLgotCQkgKi8KLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGNudE9wZW4gPT0gNCAmJiBjbnRTaG93ID49IDQ7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQotCXN0YXRpYyB2b2lkIGluaXRpYWxpemUoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBCcm93c2VyIGJyb3dzZXIpIHsKLQkJYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIub3BlbiIpOwotCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCXNoZWxsLnNldFRleHQoIk5ldyBXaW5kb3ciKTsKLQkJCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCQkJCWV2ZW50LmJyb3dzZXIgPSBicm93c2VyOwotCQkJCWNudE9wZW4rKzsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoaWRlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lci5zaG93IGxvY2F0aW9uPSIrZXZlbnQubG9jYXRpb24rIiBzaXplPSIrZXZlbnQuc2l6ZSsiIGFkZHJlc3NCYXI9IitldmVudC5hZGRyZXNzQmFyKyIgbWVudUJhcj0iK2V2ZW50Lm1lbnVCYXIrIiBzdGF0dXNCYXI9IitldmVudC5zdGF0dXNCYXIrIiB0b29sQmFyPSIrZXZlbnQudG9vbEJhcik7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCWlmIChldmVudC5sb2NhdGlvbiAhPSBudWxsKSBzaGVsbC5zZXRMb2NhdGlvbihldmVudC5sb2NhdGlvbik7Ci0JCQkJaWYgKGV2ZW50LnNpemUgIT0gbnVsbCkgewotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuc2l6ZTsKLQkJCQkJc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSkpOwotCQkJCX0KLQkJCQljbnRTaG93Kys7Ci0JCQkJc2hlbGwub3BlbigpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG5ldyBDbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci19Ci0JIAotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwotCQkJCQotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlTdHJpbmcgdXJsOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyNy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNy5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI3Lmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0gbmV3IFN0cmluZ1tdIHt1cmx9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdCh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyOC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxM2Y1NGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlN3dEp1bml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyOCB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTW96aWxsYSA9IFN3dEp1bml0LmlzR1RLIHx8IFN3dEp1bml0LmlzTW90aWY7Ci0JCi0Jc3RhdGljIFN0cmluZyBodG1sW10gPSB7IjxodG1sPjx0aXRsZT5TbmlwcGV0PC90aXRsZT48Ym9keT48cCBpZD0nbXlpZCc+QmVzdCBGcmllbmRzPC9wPjxwIGlkPSdteWlkMic+Q2F0IGFuZCBEb2c8L3A+PC9ib2R5PjwvaHRtbD4ifTsKLQlzdGF0aWMgU3RyaW5nIHNjcmlwdFtdID0gewotCQkidmFyIG5ld05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdQJyk7IFxyXG4iKwotCQkidmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnQXQgbGVhc3Qgd2hlbiBJIGFtIGFyb3VuZCcpO1xyXG4iKwotCQkibmV3Tm9kZS5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuIisKLQkJImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteWlkJykuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiIrCi0JCSJcclxuIisKLQkJImRvY3VtZW50LmJnQ29sb3I9J3llbGxvdyc7In07Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoZmluYWwgaW50IGluZGV4KSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkphdmFzY3JpcHQgLSB2ZXJpZnkgZXhlY3V0ZSgpIHdvcmtzIG9uIEhUTUwgcmVuZGVyZWQgZnJvbSBtZW1vcnkgd2l0aCBnZXRUZXh0IC0gc2NyaXB0IGluZGV4ICIraW5kZXgpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlwYXNzZWQgPSBicm93c2VyLmV4ZWN1dGUoc2NyaXB0W2luZGV4XSk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VGV4dChodG1sW2luZGV4XSk7Ci0JCQotCQlydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDEwKTsKLQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JIAotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwotCQkJCQotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlTdHJpbmcgdXJsOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyOC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNy5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI3Lmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0gbmV3IFN0cmluZ1tdIHt1cmx9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIFRFU1QgVEVNUE9SQVJJTFkgTk9UIFJVTiBGT1IgTU9aSUxMQQotCQkJaWYgKCFpc01vemlsbGEpIHsKLQkJCQlib29sZWFuIHJlc3VsdCA9IHRlc3QoaSk7IAotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL1Rlc3RfQnJvd3NlclN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvVGVzdF9Ccm93c2VyU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwY2M1YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvVGVzdF9Ccm93c2VyU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9Ccm93c2VyU3VpdGUgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQotcHVibGljIFRlc3RfQnJvd3NlclN1aXRlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjEoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjEgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXIxLnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXIyKCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXIyICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyMi50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyMygpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyMyAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjMudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjQoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjQgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXI0LnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXI1KCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXI1ICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyNS50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyNigpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyNiAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjYudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjcoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjcgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXI3LnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXI4KCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXI4ICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyOC50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X0Jyb3dzZXJTdWl0ZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyMSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXIyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyNCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXI1Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjYiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyNyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXI4Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JLyoKLQkgKiBUaGUgdGVzdHMgaW4gdGhpcyBzdWl0ZSBtYW5hZ2UgdGhlaXIgb3duIERpc3BsYXkgYW5kIGV2ZW50IGxvb3AKLQkgKiB0byB2YWxpZGF0ZSBhc3luY2hyb25vdXMgdXNlIGNhc2VzLgotCSAqIERpc3Bvc2UgYW55IHByZXZpb3VzbHkgZXhpc3RpbmcgZGlzcGxheSBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkCi0JICogYmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0cy4KLQkgKi8KLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlpZiAoZGlzcGxheSAhPSBudWxsKSBkaXNwbGF5LmRpc3Bvc2UoKTsKLQkKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjEiKSkgQnJvd3NlcjEoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjIiKSkgQnJvd3NlcjIoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjMiKSkgQnJvd3NlcjMoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjQiKSkgQnJvd3NlcjQoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjUiKSkgQnJvd3NlcjUoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjYiKSkgQnJvd3NlcjYoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjciKSkgQnJvd3NlcjcoKTsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygiQnJvd3NlcjgiKSkgQnJvd3NlcjgoKTsKLQotCS8qCi0JICogRW5zdXJlIHdlIGRvbid0IGxlYXZlIGEgRGlzcGxheSBmcm9tIHRoZSB0ZXN0cyB3ZSBydW4uCi0JICovCQotCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlpZiAoZGlzcGxheSAhPSBudWxsKSBkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5ibXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDFkM2FiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkYzhlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuZ2lmCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotR0lGODdhEgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTAxOWRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5qcGcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi3/2P8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4NjBhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0QmFkQml0RGVwdGgucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0QmFkQml0RGVwdGgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDNjYjkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdEJhZEJpdERlcHRoLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZW1wdHkudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9lbXB0eS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9lbXB0eS50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzQzNTFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUxN2M3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NzAxNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWYyZGMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5ibXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmExMjE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4ODZiYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmpwZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjg4ODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjM2ZDYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ludGVybGFjZWRfdGFyZ2V0LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvaW50ZXJsYWNlZF90YXJnZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQ3NDU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvaW50ZXJsYWNlZF90YXJnZXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9qdW5pdEdlbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9qdW5pdEdlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmUwOTFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvanVuaXRHZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLS8qKgotICogQ3JlYXRlIFNXVCBKdW5pdCBzdHVicyBiYXNlZCBvbiBhIHN3dCBqYXIgdXNlZCBhcyBhIHJlZmVyZW5jZQotICogQ29tbWFuZCBsaW5lIHRvb2wgLSBydW4gd2l0aG91dCBwYXJhbWV0ZXJzIHRvIGdldCBoZWxwIGluZm9ybWF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBqdW5pdEdlbiB7Ci0JU3RyaW5nIGRlc3RGb2xkZXIgPSBudWxsOwotCWludCBjb3VudGVyID0gMDsKLQkKLQkvKioKLQkgKiBAcGFyYW0gamFyZmlsZSB0aGUgdXJsIG9mIGEgamFyIGZpbGUKLQkgKiBAcmV0dXJuIGFsbCBwdWJsaWMgY2xhc3NlcyBpbiB0aGUgamFyCi0JICovCi0JcHVibGljIFZlY3RvciBnZXRDbGFzc2VzKFN0cmluZyBqYXJmaWxlKSB7Ci0JCVZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JCXRyeSB7Ci0JCQlaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShqYXJmaWxlKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGphcmZpbGUpOwotCQkJVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKLQkJCUNsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW10geyB1cmwgfSk7Ci0KLQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSB6aXBGaWxlLmVudHJpZXMoKTsKLQkJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtICIuY2xhc3MiLmxlbmd0aCgpKTsKLQkJCQkJbmFtZSA9IG5hbWUucmVwbGFjZSgnLycsICcuJyk7Ci0JCQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgbG9hZGVyKTsKLQkJCQkJaWYgKGZpbHRlckNsYXNzKGNsYXp6KSkgdmVjdG9yLmFkZChjbGF6eik7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gIiArIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHZlY3RvcjsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlIGEgSnVuaXQgamF2YSB0ZXN0IGZpbGUKLQkgKiBAcGFyYW0gY2xhenogY2xhc3MgdG8gY3JlYXRlIHRoZSB0ZXN0IGZvcgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbGVUZXN0KENsYXNzIGNsYXp6KSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0JCQluYW1lID0gZGVzdEZvbGRlciArICIvIiArIG5hbWUgKyAiLmphdmEiOwotCQkJRmlsZVdyaXRlciB3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihuYW1lKTsKLQkJCWNyZWF0ZVN3dFRlc3Qod3JpdGVyLCBjbGF6eik7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uICIgKyBlKTsKLQkJfQotCQkKLQl9Ci0KLQl2b2lkIGNyZWF0ZVN3dFRlc3QoRmlsZVdyaXRlciB3cml0ZXIsIENsYXNzIGNsYXp6KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTd3RUZXN0IHRlc3QgPSBuZXcgU3d0VGVzdCh3cml0ZXIsIGNsYXp6KTsKLQkJdGVzdC53cml0ZUNvcHlSaWdodHMoKTsKLQkJdGVzdC53cml0ZVBhY2thZ2UoKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVJbXBvcnRzKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlQ2xhc3NDb21tZW50cygpOwotCQl0ZXN0LndyaXRlQ2xhc3NEZWNsYXJhdGlvbigpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZUNvbnN0cnVjdG9yKCk7CQkKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVNYWluKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlU2V0VXAoKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVUZWFyRG93bigpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZU1ldGhvZHMoKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVTdWl0ZSgpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZU1ldGhvZE5hbWVzKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlUnVuVGVzdCgpOwotCQl0ZXN0LndyaXRlQ2xhc3NDbG9zdXJlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uRm9sZGVyKFN0cmluZyBkZXN0KSB7Ci0JCWRlc3RGb2xkZXIgPSBkZXN0OwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRDb3VudGVyKCkgewotCQljb3VudGVyKys7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0Q291bnRlcigpIHsKLQkJcmV0dXJuIGNvdW50ZXI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVUZXN0cyhTdHJpbmcgamFyZmlsZSwgU3RyaW5nIGRlc3RGb2xkZXIpIHsKLQkJanVuaXRHZW4gZ2VuID0gbmV3IGp1bml0R2VuKCk7Ci0JCVZlY3RvciBjbGFzc2VzID0gZ2VuLmdldENsYXNzZXMoamFyZmlsZSk7Ci0JCWdlbi5zZXREZXN0aW5hdGlvbkZvbGRlcihkZXN0Rm9sZGVyKTsKLQkJaWYgKGNsYXNzZXMgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyBjbGFzc2VzIGZvdW5kLiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSBjbGFzc2VzLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlnZW4uY3JlYXRlRmlsZVRlc3QoKENsYXNzKWVudHJpZXMubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHN0dWJzIHdyaXR0ZW46ICIgKyBnZW4uZ2V0Q291bnRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaWZmKFZlY3RvciBvbGRDbGFzc2VzLCBWZWN0b3IgbmV3Q2xhc3NlcykgewotCQlTd3REaWZmIGRpZmYgPSBuZXcgU3d0RGlmZihvbGRDbGFzc2VzLCBuZXdDbGFzc2VzKTsKLQkJZGlmZi5jb21wdXRlKCk7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpZmZUZXN0cyhTdHJpbmcgamFyZmlsZU9sZCwgU3RyaW5nIGphcmZpbGVOZXcpIHsKLQkJanVuaXRHZW4gZ2VuID0gbmV3IGp1bml0R2VuKCk7Ci0JCVZlY3RvciBvbGRDbGFzc2VzID0gZ2VuLmdldENsYXNzZXMoamFyZmlsZU9sZCk7Ci0JCWlmIChvbGRDbGFzc2VzID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gY2xhc3NlcyBmb3VuZCBpbiBvbGQgamFyIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVmVjdG9yIG5ld0NsYXNzZXMgPSBnZW4uZ2V0Q2xhc3NlcyhqYXJmaWxlTmV3KTsKLQkJaWYgKG5ld0NsYXNzZXMgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyBjbGFzc2VzIGZvdW5kIGluIG5ldyBqYXIiKTsKLQkJCXJldHVybjsKLQkJfQotCQlnZW4uZGlmZihvbGRDbGFzc2VzLCBuZXdDbGFzc2VzKTsJCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncyA9PSBudWxsIHx8IGFyZ3MubGVuZ3RoIDwgMykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YSBqdW5pdEdlbiBmbGFnIGFyZzEgYXJnMiAuLi4iKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIHdoZXJlIGZsYWcgaXMgb25lIG9mOiIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGU6IGNyZWF0ZSB0aGUganVuaXQgdGVzdCBzdHVicyIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgYXJnMTogc291cmNlIGphciBlLmcuIGQ6L3N3dC5qYXIiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIGFyZzI6IGRlc3RpbmF0aW9uIGUuZy4gZDovdGVzdHMiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGlmZjogICBkaWZmIDIgamFycyBzaG93aW5nIHdoaWNoIHRlc3RzIG11c3QgYmUgcmVtb3ZlZCwiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBhbmQgYWRkZWQiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIGFyZzE6IG9sZCBqYXIgZS5nLiBkOi9vbGQvc3d0LmphciIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgYXJnMjogbmV3IGphciBlLmcuIGQ6L25ldy9zd3QuamFyIik7CQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChhcmdzWzBdLmVxdWFscygiY3JlYXRlIikpIGNyZWF0ZVRlc3RzKGFyZ3NbMV0sIGFyZ3NbMl0pOwotCQllbHNlIGlmIChhcmdzWzBdLmVxdWFscygiZGlmZiIpKSBkaWZmVGVzdHMoYXJnc1sxXSwgYXJnc1syXSk7Ci0JfQotCQotCWJvb2xlYW4gZmlsdGVyQ2xhc3MoQ2xhc3MgY2xhenopIHsKLQkJLyogSlVuaXQgdGVzdHMgZm9yIHB1YmxpYyBjbGFzc2VzIG9ubHkgKi8KLQkJaW50IG1vZGlmaWVycyA9IGNsYXp6LmdldE1vZGlmaWVycygpOwotCQlpZiAoIU1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpIHJldHVybiBmYWxzZTsKLQotCQkvKiBKVW5pdCB0ZXN0cyBmb3IgY2xhc3NlcyB3aGljaCBhcmUgbm90IHBhcnQgb2YgYW4gaW50ZXJuYWwgcGFja2FnZSAqLwotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBjbGF6ei5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQlpZiAocGFja2FnZU5hbWUuaW5kZXhPZigiaW50ZXJuYWwiKSAhPSAtMSkgcmV0dXJuIGZhbHNlOwotCi0JCS8qIEpVbml0IHRlc3RzIGZvciBjbGFzc2VzIHdpdGggcHVibGljIGNvbnN0cnVjdG9ycyBvciBwdWJsaWMgbWV0aG9kcyAqLwotCQlDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKGNsYXp6KTsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGdldEZpbHRlcmVkTWV0aG9kcyhjbGF6eik7Ci0JCWlmIChjb25zdHJ1Y3RvcnMubGVuZ3RoID09IDAgJiYgbWV0aG9kcy5sZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0Q2xhc3NOYW1lKENsYXNzIGNsYXp6KSB7Ci0JCVN0cmluZyBuYW1lID0gY2xhenouZ2V0TmFtZSgpOwotCQluYW1lID0gIlRlc3RfIiArIG5hbWUucmVwbGFjZSgnLicsICdfJyk7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCVN0cmluZyBnZXRNZXRob2ROYW1lKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7Ci0JCVN0cmluZyBuYW1lID0gInRlc3RfQ29uc3RydWN0b3IiOwotCQlDbGFzc1tdIHBhcmFtZXRlcnMgPSBjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCW5hbWUgKz0gZ2V0VHlwZVNpZ25hdHVyZShwYXJhbWV0ZXJzW2ldKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0TWV0aG9kTmFtZShNZXRob2QgbWV0aG9kKSB7Ci0JCVN0cmluZyBuYW1lID0gInRlc3RfIiArIG1ldGhvZC5nZXROYW1lKCk7Ci0JCUNsYXNzW10gcGFyYW1ldGVycyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCW5hbWUgKz0gZ2V0VHlwZVNpZ25hdHVyZShwYXJhbWV0ZXJzW2ldKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCQotCVN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKENsYXNzIGNsYXp6KSB7Ci0JCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiAiSSI7Ci0JCWlmIChjbGF6eiA9PSBCb29sZWFuLlRZUEUpIHJldHVybiAiWiI7Ci0JCWlmIChjbGF6eiA9PSBMb25nLlRZUEUpIHJldHVybiAiSiI7Ci0JCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gIlMiOwotCQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAiQyI7Ci0JCWlmIChjbGF6eiA9PSBCeXRlLlRZUEUpIHJldHVybiAiQiI7Ci0JCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gIkYiOwotCQlpZiAoY2xhenogPT0gRG91YmxlLlRZUEUpIHJldHVybiAiRCI7Ci0JCWlmIChjbGF6ei5pc0FycmF5KCkpIHsKLQkJCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQlyZXR1cm4gIiQiICsgZ2V0VHlwZVNpZ25hdHVyZShjb21wb25lbnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gIkwiICsgY2xhenouZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnXycpOwotCX0KLQotCUNvbnN0cnVjdG9yW10gZ2V0RmlsdGVyZWRDb25zdHJ1Y3RvcnMoQ2xhc3MgY2xhenopIHsKLQkJQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcnMoKTsKLQkJQXJyYXlzLnNvcnQoY29uc3RydWN0b3JzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQlyZXR1cm4gKGdldE1ldGhvZE5hbWUoKENvbnN0cnVjdG9yKWEpLmNvbXBhcmVUbyhnZXRNZXRob2ROYW1lKChDb25zdHJ1Y3RvciliKSkpOwkJCQkJCi0JCQl9Ci0JCX0pOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcnNbaV07Ci0JCQlpbnQgbW9kaWZpZXJzID0gY29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCk7Ci0JCQlpZiAoTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkgewotCQkJCWNvbnN0cnVjdG9yc1tjb3VudCsrXSA9IGNvbnN0cnVjdG9yc1tpXTsKLQkJCX0KLQkJfQotCQlDb25zdHJ1Y3RvcltdIHJlc3VsdCA9IG5ldyBDb25zdHJ1Y3Rvcltjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY29uc3RydWN0b3JzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCQotCU1ldGhvZFtdIGdldEZpbHRlcmVkTWV0aG9kcyhDbGFzcyBjbGF6eikgewotCQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCUFycmF5cy5zb3J0KG1ldGhvZHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCXJldHVybiAoZ2V0TWV0aG9kTmFtZSgoTWV0aG9kKWEpLmNvbXBhcmVUbyhnZXRNZXRob2ROYW1lKChNZXRob2QpYikpKTsJCQkJCQotCQkJfQotCQl9KTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCWludCBtb2RpZmllcnMgPSBtZXRob2QuZ2V0TW9kaWZpZXJzKCk7Ci0JCQlpZiAoTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkgewotCQkJCW1ldGhvZHNbY291bnQrK10gPSBtZXRob2RzW2ldOwotCQkJfQotCQl9Ci0JCU1ldGhvZFtdIHJlc3VsdCA9IG5ldyBNZXRob2RbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZHMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwkJCi0JfQotCi0KLQlwdWJsaWMgY2xhc3MgU3d0VGVzdCB7Ci0JCUZpbGVXcml0ZXIgd3JpdGVyOwotCQlDbGFzcyBjbGF6ejsKLQkJU3RyaW5nIGxpbmVTZXAgPSAiXHJcbiI7Ci0JCQotCQlTd3RUZXN0KEZpbGVXcml0ZXIgd3JpdGVyLCBDbGFzcyBjbGF6eikgewotCQkJdGhpcy53cml0ZXIgPSB3cml0ZXI7Ci0JCQl0aGlzLmNsYXp6ID0gY2xheno7Ci0JCX0KLQkJCi0JCXZvaWQgbmV3TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVQYWNrYWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgicGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Iik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVDb3B5UmlnaHRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiICsgbGluZVNlcCArCi0gCQkJCSIgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIiArIGxpbmVTZXAgKwotIAkJCQkiICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyIgKyBsaW5lU2VwICsKLSAJCQkJIiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCIgKyBsaW5lU2VwICsKLSAJCQkJIiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IiArIGxpbmVTZXAgKwotIAkJCQkiICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiICsgbGluZVNlcCArCi0gCQkJCSIgKiAiICsgbGluZVNlcCArCi0gCQkJCSIgKiBDb250cmlidXRvcnM6IiArIGxpbmVTZXAgKwotIAkJCQkiICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgKyBsaW5lU2VwICsKLQkJCQkiICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVJbXBvcnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkiaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOyIgKyBsaW5lU2VwICsKLQkJCQkiaW1wb3J0IGp1bml0LnRleHR1aS4qOyIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlQ2xhc3NDb21tZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJIi8qKiIgKyBsaW5lU2VwICsKLQkJCQkiICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzICIgKyBjbGF6ei5nZXROYW1lKCkgKyBsaW5lU2VwICsKLQkJCQkiICoiICsgbGluZVNlcCArCi0JCQkJIiAqIEBzZWUgIiArIGNsYXp6LmdldE5hbWUoKSArIGxpbmVTZXAgKwotCQkJCSIgKi8iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0KLQkJYm9vbGVhbiBoYXNTd3RKdW5pdFN1cGVyQ2xhc3MoQ2xhc3MgY2xhenopIHsKLQkJCUNsYXNzIHN1cGVyQ2xhc3MgPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJDbGFzcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBzdXBlckNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0JCQlpZiAoIXBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLnN3dCIpKSByZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIWZpbHRlckNsYXNzKHN1cGVyQ2xhc3MpKSByZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdHJ1ZTsJCQkJCQkKLQkJfQotCQkKLQkJU3RyaW5nIGdldFN3dEp1bml0U3VwZXJDbGFzc05hbWUoQ2xhc3MgY2xhenopIHsKLQkJCVN0cmluZyBkZWZhdWx0Q2xhc3MgPSAiU3d0VGVzdENhc2UiOwotCQkJQ2xhc3Mgc3VwZXJDbGFzcyA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlckNsYXNzID09IG51bGwpIHJldHVybiBkZWZhdWx0Q2xhc3M7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBzdXBlckNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0JCQlpZiAoIXBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLnN3dCIpKSByZXR1cm4gZGVmYXVsdENsYXNzOwotCQkJaWYgKCFmaWx0ZXJDbGFzcyhzdXBlckNsYXNzKSkgcmV0dXJuIGRlZmF1bHRDbGFzczsKLQkJCXJldHVybiBnZXRDbGFzc05hbWUoc3VwZXJDbGFzcyk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVDbGFzc0RlY2xhcmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQkJCVN0cmluZyBzdXBlckNsYXNzTmFtZSA9IGdldFN3dEp1bml0U3VwZXJDbGFzc05hbWUoY2xhenopOwotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwdWJsaWMgY2xhc3MgIiArIG5hbWUgKyAiIGV4dGVuZHMgIiArIHN1cGVyQ2xhc3NOYW1lICsiIHsiCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlQ29uc3RydWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIG5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwdWJsaWMgIiArIG5hbWUgKyAiKFN0cmluZyBuYW1lKSB7IiArIGxpbmVTZXAgKwotCQkJCSIJc3VwZXIobmFtZSk7IiArIGxpbmVTZXAgKwotCQkJCSJ9IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQkJCi0JCQotCQl2b2lkIHdyaXRlTWFpbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsiICsgbGluZVNlcCArCi0JCQkJIglUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsiICsgbGluZVNlcCArCi0JCQkJIn0iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0KLQkJdm9pZCB3cml0ZVNldFVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCWlmIChoYXNTd3RKdW5pdFN1cGVyQ2xhc3MoY2xhenopKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCIJc3VwZXIuc2V0VXAoKTsiKTsKLQkJCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9Ci0JCQl3cml0ZXIud3JpdGUoIn0iKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCi0JCXZvaWQgd3JpdGVUZWFyRG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeyIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlpZiAoaGFzU3d0SnVuaXRTdXBlckNsYXNzKGNsYXp6KSkgewotCQkJCXdyaXRlci53cml0ZSgiCXN1cGVyLnRlYXJEb3duKCk7Iik7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJd3JpdGVyLndyaXRlKCJ9Iik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVNZXRob2RzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCUNvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzID0gZ2V0RmlsdGVyZWRDb25zdHJ1Y3RvcnMoY2xhenopOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQl3cml0ZU1ldGhvZChjb25zdHJ1Y3RvcnNbaV0pOwotCQkJCWlmIChpIDwgY29uc3RydWN0b3JzLmxlbmd0aCAtIDEpIHdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCQotCQkJTWV0aG9kW10gbWV0aG9kcyA9IGdldEZpbHRlcmVkTWV0aG9kcyhjbGF6eik7Ci0JCQlpZiAoY29uc3RydWN0b3JzLmxlbmd0aCA+IDAgJiYgbWV0aG9kcy5sZW5ndGggPiAwKSB3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQl3cml0ZU1ldGhvZChtZXRob2RzW2ldKTsKLQkJCQlpZiAoaSA8IG1ldGhvZHMubGVuZ3RoIC0gMSkgd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQl9Ci0JCQotCQl2b2lkIHdyaXRlTWV0aG9kKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIG5hbWUgPSBnZXRNZXRob2ROYW1lKGNvbnN0cnVjdG9yKTsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljIHZvaWQgIiArIG5hbWUgKyAiKCkgeyIgKyBsaW5lU2VwICsKLQkJCQkiCXdhcm5VbmltcGwoXCJUZXN0ICIgKyBuYW1lICsgIiBub3Qgd3JpdHRlblwiKTsiICsgbGluZVNlcCArCi0JCQkJIn0iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJaW5jcmVtZW50Q291bnRlcigpOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlTWV0aG9kKE1ldGhvZCBtZXRob2QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldE1ldGhvZE5hbWUobWV0aG9kKTsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljIHZvaWQgIiArIG5hbWUgKyAiKCkgeyIgKyBsaW5lU2VwICsKLQkJCQkiCXdhcm5VbmltcGwoXCJUZXN0ICIgKyBuYW1lICsgIiBub3Qgd3JpdHRlblwiKTsiICsgbGluZVNlcCArCi0JCQkJIn0iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJaW5jcmVtZW50Q291bnRlcigpOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlU3VpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIG5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IiArIGxpbmVTZXAgKwotCQkJCSIJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOyIgKyBsaW5lU2VwICsJCi0JCQkJIglqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsiICsgbGluZVNlcCArCi0JCQkJIglqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7IiArIGxpbmVTZXAgKwotCQkJCSIJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsiICsgbGluZVNlcCArCi0JCQkJIgkJc3VpdGUuYWRkVGVzdChuZXcgIiArIG5hbWUgKyAiKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7IiArIGxpbmVTZXAgKwotCQkJCSIJfSIgKyBsaW5lU2VwICsKLQkJCQkiCXJldHVybiBzdWl0ZTsiICsgbGluZVNlcCArCi0JCQkJIn0iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0KLQkJdm9pZCB3cml0ZU1ldGhvZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgeyIgKyBsaW5lU2VwICsKLQkJCQkiCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOyIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKGNsYXp6KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RydWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXRNZXRob2ROYW1lKGNvbnN0cnVjdG9yc1tpXSk7Ci0JCQkJd3JpdGVyLndyaXRlKAotCQkJCQkiCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoXCIiICsgbmFtZSArICJcIik7IgotCQkJCSk7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJTWV0aG9kW10gbWV0aG9kcyA9IGdldEZpbHRlcmVkTWV0aG9kcyhjbGF6eik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGdldE1ldGhvZE5hbWUobWV0aG9kc1tpXSk7Ci0JCQkJd3JpdGVyLndyaXRlKAotCQkJCQkiCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoXCIiICsgbmFtZSArICJcIik7IgotCQkJCSk7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJaWYgKGhhc1N3dEp1bml0U3VwZXJDbGFzcyhjbGF6eikpIHsKLQkJCQlTdHJpbmcgc3VwZXJDbGFzc05hbWUgPSBnZXRTd3RKdW5pdFN1cGVyQ2xhc3NOYW1lKGNsYXp6KTsKLQkJCQl3cml0ZXIud3JpdGUoIgltZXRob2ROYW1lcy5hZGRBbGwoIiArIHN1cGVyQ2xhc3NOYW1lICsgIi5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzIik7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJd3JpdGVyLndyaXRlKAotCQkJCSIJcmV0dXJuIG1ldGhvZE5hbWVzOyIgKyBsaW5lU2VwICsKLQkJCQkifSIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVSdW5UZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgeyIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKGNsYXp6KTsKLQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMoY2xhenopOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoICsgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpID09IDApIHdyaXRlci53cml0ZSgiCWlmIik7IGVsc2Ugd3JpdGVyLndyaXRlKCIJZWxzZSBpZiIpOwotCQkJCVN0cmluZyBuYW1lID0gaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGggPyBnZXRNZXRob2ROYW1lKGNvbnN0cnVjdG9yc1tpXSkgOiBnZXRNZXRob2ROYW1lKG1ldGhvZHNbaSAtIGNvbnN0cnVjdG9ycy5sZW5ndGhdKTsKLQkJCQl3cml0ZXIud3JpdGUoCi0JCQkJCSIgKGdldE5hbWUoKS5lcXVhbHMoXCIiICsgbmFtZSArICJcIikpICIgKyBuYW1lICsgIigpOyIKLQkJCQkpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCWlmIChoYXNTd3RKdW5pdFN1cGVyQ2xhc3MoY2xhenopKSB7Ci0JCQkJaWYgKGNvbnN0cnVjdG9ycy5sZW5ndGggKyBtZXRob2RzLmxlbmd0aCA+IDApIHsKLQkJCQkJd3JpdGVyLndyaXRlKCIJZWxzZSAiKTsKLQkJCQl9IGVsc2UgewotCQkJCQl3cml0ZXIud3JpdGUoIgkiKTsKLQkJCQl9Ci0JCQkJd3JpdGVyLndyaXRlKCJzdXBlci5ydW5UZXN0KCk7Iik7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQkJCQotCQkJd3JpdGVyLndyaXRlKCJ9Iik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7CQkKLQkJfQotCQkKLQkJdm9pZCB3cml0ZUNsYXNzQ2xvc3VyZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoIn0iKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgRGlmZkNsYXNzIHsKLQkJLyogdGhlIG5ld0NsYXNzIGhhcyBiZWVuIGFkZGVkICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FVyA9IDE7Ci0JCS8qIHRoZSBvbGRDbGFzcyBoYXMgYmVlbiByZW1vdmVkICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRUQgPSAyOwotCQkvKiB0aGUgcmVtb3ZlZE1ldGhvZHMgZnJvbSBvbGRDbGFzcyBoYXZlIGJlZW4gcmVtb3ZlZCAoaWYgYW55KQotCQkgKiB0aGUgbmV3TWV0aG9kcyBmcm9tIG5ld0NsYXNzIGhhdmUgYmVlbiBhZGRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ESUZJRUQgPSAzOwotCQkKLQkJaW50IHR5cGU7Ci0JCUNsYXNzIG9sZENsYXNzOwotCQlDbGFzcyBuZXdDbGFzczsKLQkJTWV0aG9kW10gcmVtb3ZlZE1ldGhvZHM7Ci0JCU1ldGhvZFtdIG5ld01ldGhvZHM7Ci0JCUNvbnN0cnVjdG9yW10gcmVtb3ZlZENvbnN0cnVjdG9yczsKLQkJQ29uc3RydWN0b3JbXSBuZXdDb25zdHJ1Y3RvcnM7Ci0KLQkJcHVibGljIERpZmZDbGFzcyhpbnQgdHlwZSwgCi0JCQlDbGFzcyBvbGRDbGFzcywgQ2xhc3MgbmV3Q2xhc3MsIAotCQkJTWV0aG9kW10gcmVtb3ZlZE1ldGhvZHMsIE1ldGhvZFtdIG5ld01ldGhvZHMsCi0JCQlDb25zdHJ1Y3RvcltdIHJlbW92ZWRDb25zdHJ1Y3RvcnMsIENvbnN0cnVjdG9yW10gbmV3Q29uc3RydWN0b3JzKSB7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5vbGRDbGFzcyA9IG9sZENsYXNzOwotCQkJdGhpcy5uZXdDbGFzcyA9IG5ld0NsYXNzOwotCQkJdGhpcy5yZW1vdmVkTWV0aG9kcyA9IHJlbW92ZWRNZXRob2RzOwotCQkJdGhpcy5uZXdNZXRob2RzID0gbmV3TWV0aG9kczsKLQkJCXRoaXMucmVtb3ZlZENvbnN0cnVjdG9ycyA9IHJlbW92ZWRDb25zdHJ1Y3RvcnM7Ci0JCQl0aGlzLm5ld0NvbnN0cnVjdG9ycyA9IG5ld0NvbnN0cnVjdG9yczsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgTkVXOiB7Ci0JCQkJCXJldHVybiAiTkVXOiAiICsgZ2V0Q2xhc3NOYW1lKG5ld0NsYXNzKTsKLQkJCQl9Ci0JCQkJY2FzZSBSRU1PVkVEOiB7Ci0JCQkJCXJldHVybiAiUkVNT1ZFRDogIiArIGdldENsYXNzTmFtZShvbGRDbGFzcyk7Ci0JCQkJfQotCQkJCWNhc2UgTU9ESUZJRUQ6IHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICJNT0RJRklFRDogIiArIGdldENsYXNzTmFtZShvbGRDbGFzcyk7Ci0JCQkJCWlmIChyZW1vdmVkQ29uc3RydWN0b3JzICE9IG51bGwpIHsKLQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIHJlbW92ZWRDb25zdHJ1Y3RvcnMubGVuZ3RoICsgIiBjb25zdHJ1Y3RvcihzKSByZW1vdmVkIjsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZENvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIGdldE1ldGhvZE5hbWUocmVtb3ZlZENvbnN0cnVjdG9yc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAobmV3Q29uc3RydWN0b3JzICE9IG51bGwpIHsKLQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIG5ld0NvbnN0cnVjdG9ycy5sZW5ndGggKyAiIGNvbnN0cnVjdG9yKHMpIGFkZGVkIjsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3Q29uc3RydWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgZ2V0TWV0aG9kTmFtZShuZXdDb25zdHJ1Y3RvcnNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyZW1vdmVkTWV0aG9kcyAhPSBudWxsKSB7Ci0JCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyByZW1vdmVkTWV0aG9kcy5sZW5ndGggKyAiIG1ldGhvZChzKSByZW1vdmVkIjsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyBnZXRNZXRob2ROYW1lKHJlbW92ZWRNZXRob2RzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChuZXdNZXRob2RzICE9IG51bGwpIHsKLQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIG5ld01ldGhvZHMubGVuZ3RoICsgIiBtZXRob2QocykgYWRkZWQiOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgZ2V0TWV0aG9kTmFtZShuZXdNZXRob2RzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gc3RyaW5nOwotCQkJCX0KLQkJCQlkZWZhdWx0OiB7Ci0JCQkJCXJldHVybiAiaW52YWxpZCBEaWZmQ2xhc3MgIit0eXBlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgU3d0RGlmZiB7Ci0JCUNsYXNzW10gb2xkQ2xhc3NlcywgbmV3Q2xhc3NlczsKLQkJLyogcmVtb3ZlZFtpXSB0cnVlIG1lYW5zIG9sZENsYXNzZXNbaV0gaGFzIGJlZW4gcmVtb3ZlZCAqLwotCQlib29sZWFuW10gcmVtb3ZlZDsKLQkJLyogYWRkZWRbaV0gdHJ1ZSBtZWFucyBuZXdDbGFzc2VzW2ldIGhhcyBiZWVuIGFkZGVkICovCi0JCWJvb2xlYW5bXSBhZGRlZDsKLQkJLyogb2xkMk5ld1tpXSA9PSBqID49IDAgbWVhbnMgb2xkQ2xhc3Nlc1tpXSBjb3JyZXNwb25kcyB0byBuZXdDbGFzc2VzW2pdICovCi0JCWludFtdIG9sZDJOZXc7Ci0JCWludFtdIG5ldzJPbGQ7Ci0JCVZlY3RvciBkaWZmcyA9IG5ldyBWZWN0b3IoKTsKLQkJCi0JCXB1YmxpYyBTd3REaWZmKFZlY3RvciBvbGRDbGFzc2VzLCBWZWN0b3IgbmV3Q2xhc3NlcykgewotCQkJRW51bWVyYXRpb24gb2xkQ2xhc3Nlc0VudW0gPSBvbGRDbGFzc2VzLmVsZW1lbnRzKCk7Ci0JCQl0aGlzLm9sZENsYXNzZXMgPSBuZXcgQ2xhc3Nbb2xkQ2xhc3Nlcy5zaXplKCldOwotCQkJaW50IGNudCA9IDA7Ci0JCQl3aGlsZSAob2xkQ2xhc3Nlc0VudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQl0aGlzLm9sZENsYXNzZXNbY250KytdID0gKENsYXNzKW9sZENsYXNzZXNFbnVtLm5leHRFbGVtZW50KCk7Ci0JCQl9Ci0KLQkJCUVudW1lcmF0aW9uIG5ld0NsYXNzZXNFbnVtID0gbmV3Q2xhc3Nlcy5lbGVtZW50cygpOwotCQkJdGhpcy5uZXdDbGFzc2VzID0gbmV3IENsYXNzW25ld0NsYXNzZXMuc2l6ZSgpXTsKLQkJCWNudCA9IDA7Ci0JCQl3aGlsZSAobmV3Q2xhc3Nlc0VudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQl0aGlzLm5ld0NsYXNzZXNbY250KytdID0gKENsYXNzKW5ld0NsYXNzZXNFbnVtLm5leHRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlvbGQyTmV3ID0gbmV3IGludFt0aGlzLm9sZENsYXNzZXMubGVuZ3RoXTsKLQkJCW5ldzJPbGQgPSBuZXcgaW50W3RoaXMubmV3Q2xhc3Nlcy5sZW5ndGhdOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjb21wdXRlKCkgewotCQkJY29tcGFyZUNsYXNzZXMoKTsKLQkJCWNyZWF0ZUNsYXNzRGlmZigpOwotCQkJb3V0cHV0Q2xhc3NEaWZmKCk7CQkKLQkJfQotCi0JCXZvaWQgY29tcGFyZUNsYXNzZXMoKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZENsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvbGQyTmV3W2ldID0gLTE7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuZXdDbGFzc2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChvbGRDbGFzc2VzW2ldLmdldE5hbWUoKS5lcXVhbHMobmV3Q2xhc3Nlc1tqXS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlvbGQyTmV3W2ldID0gajsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbmV3Mk9sZFtpXSA9IC0xOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkQ2xhc3Nlcy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAobmV3Q2xhc3Nlc1tpXS5nZXROYW1lKCkuZXF1YWxzKG9sZENsYXNzZXNbal0uZ2V0TmFtZSgpKSkgewotCQkJCQkJbmV3Mk9sZFtpXSA9IGo7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXZvaWQgY3JlYXRlQ2xhc3NEaWZmKCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGQyTmV3Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9sZDJOZXdbaV0gPCAwKSB7Ci0JCQkJCS8qIEZvdW5kIGEgY2xhc3Mgd2hpY2ggaGFzIGJlZW4gcmVtb3ZlZCAqLwotCQkJCQlEaWZmQ2xhc3MgZGlmZiA9IG5ldyBEaWZmQ2xhc3MoCi0JCQkJCQlEaWZmQ2xhc3MuUkVNT1ZFRCwKLQkJCQkJCW9sZENsYXNzZXNbaV0sCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCk7Ci0JCQkJCWRpZmZzLmFkZChkaWZmKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBGb3VuZCBhIGNsYXNzIHdoaWNoIGlzIGVpdGhlciBpZGVudGljYWwgb3Igd2hpY2ggY29udGFpbnMKLQkJCQkJICogbW9kaWZpZWQgbWV0aG9kcwotCQkJCQkgKi8KLQkJCQkJQ2xhc3Mgb2xkQ2xhc3MgPSBvbGRDbGFzc2VzW2ldOwotCQkJCQlDbGFzcyBuZXdDbGFzcyA9IG5ld0NsYXNzZXNbb2xkMk5ld1tpXV07Ci0JCQkJCU1ldGhvZFtdIHJlbW92ZWRNZXRob2RzID0gZ2V0UmVtb3ZlZE1ldGhvZHMob2xkQ2xhc3MsIG5ld0NsYXNzKTsKLQkJCQkJTWV0aG9kW10gYWRkZWRNZXRob2RzID0gZ2V0QWRkZWRNZXRob2RzKG9sZENsYXNzLCBuZXdDbGFzcyk7Ci0JCQkJCUNvbnN0cnVjdG9yW10gcmVtb3ZlZENvbnN0cnVjdG9ycyA9IGdldFJlbW92ZWRDb25zdHJ1Y3RvcnMob2xkQ2xhc3MsIG5ld0NsYXNzKTsKLQkJCQkJQ29uc3RydWN0b3JbXSBhZGRlZENvbnN0cnVjdG9ycyA9IGdldEFkZGVkQ29uc3RydWN0b3JzKG9sZENsYXNzLCBuZXdDbGFzcyk7Ci0JCQkJCWlmIChyZW1vdmVkTWV0aG9kcyAhPSBudWxsIHx8IGFkZGVkTWV0aG9kcyAhPSBudWxsIHx8IAotCQkJCQkJcmVtb3ZlZENvbnN0cnVjdG9ycyAhPSBudWxsIHx8IGFkZGVkQ29uc3RydWN0b3JzICE9IG51bGwpIHsKLQkJCQkJCURpZmZDbGFzcyBkaWZmID0gbmV3IERpZmZDbGFzcygKLQkJCQkJIAkJRGlmZkNsYXNzLk1PRElGSUVELAotCQkJCQkgCQlvbGRDbGFzcywKLQkJCQkJIAkJbmV3Q2xhc3MsCi0JCQkJCSAJCXJlbW92ZWRNZXRob2RzLAotCQkJCQkgCQlhZGRlZE1ldGhvZHMsCi0JCQkJCSAJCXJlbW92ZWRDb25zdHJ1Y3RvcnMsCi0JCQkJCSAJCWFkZGVkQ29uc3RydWN0b3JzCi0JCQkJCSAJKTsKLQkJCQkJIAlkaWZmcy5hZGQoZGlmZik7Ci0JCQkJCSB9Ci0JCQkJfQotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXcyT2xkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG5ldzJPbGRbaV0gPCAwKSB7Ci0JCQkJCS8qIEZvdW5kIGEgY2xhc3Mgd2hpY2ggaGFzIGJlZW4gYWRkZWQgKi8KLQkJCQkJRGlmZkNsYXNzIGRpZmYgPSBuZXcgRGlmZkNsYXNzKAotCQkJCQkJRGlmZkNsYXNzLk5FVywKLQkJCQkJCW51bGwsCi0JCQkJCQluZXdDbGFzc2VzW2ldLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbAotCQkJCQkpOwotCQkJCQlkaWZmcy5hZGQoZGlmZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTWV0aG9kW10gZ2V0UmVtb3ZlZE1ldGhvZHMoQ2xhc3Mgb2xkQ2xhc3MsIENsYXNzIG5ld0NsYXNzKSB7Ci0JCQlNZXRob2RbXSBvbGRNZXRob2RzID0gZ2V0RmlsdGVyZWRNZXRob2RzKG9sZENsYXNzKTsKLQkJCU1ldGhvZFtdIG5ld01ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMobmV3Q2xhc3MpOwotCQkJCi0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG9sZE5hbWUgPSBnZXRNZXRob2ROYW1lKG9sZE1ldGhvZHNbaV0pOwotCQkJCWJvb2xlYW4gcmVtb3ZlZCA9IHRydWU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuZXdNZXRob2RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVN0cmluZyBuZXdOYW1lID0gZ2V0TWV0aG9kTmFtZShuZXdNZXRob2RzW2pdKTsKLQkJCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCQlyZW1vdmVkID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVtb3ZlZCkgb2xkTWV0aG9kc1tjb3VudCsrXSA9IG9sZE1ldGhvZHNbaV07Ci0JCQl9Ci0JCQlpZiAoY291bnQgPT0gMCkgcmV0dXJuIG51bGw7Ci0JCQlNZXRob2RbXSByZXN1bHQgPSBuZXcgTWV0aG9kW2NvdW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkTWV0aG9kcywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlNZXRob2RbXSBnZXRBZGRlZE1ldGhvZHMoQ2xhc3Mgb2xkQ2xhc3MsIENsYXNzIG5ld0NsYXNzKSB7Ci0JCQlyZXR1cm4gZ2V0UmVtb3ZlZE1ldGhvZHMobmV3Q2xhc3MsIG9sZENsYXNzKTsKLQkJfQotCQkKLQkJQ29uc3RydWN0b3JbXSBnZXRSZW1vdmVkQ29uc3RydWN0b3JzKENsYXNzIG9sZENsYXNzLCBDbGFzcyBuZXdDbGFzcykgewotCQkJQ29uc3RydWN0b3JbXSBvbGRDb25zdHJ1Y3RvcnMgPSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhvbGRDbGFzcyk7Ci0JCQlDb25zdHJ1Y3RvcltdIG5ld0NvbnN0cnVjdG9ycyA9IGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKG5ld0NsYXNzKTsKLQkJCQotCQkJaW50IGNvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkQ29uc3RydWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG9sZE5hbWUgPSBnZXRNZXRob2ROYW1lKG9sZENvbnN0cnVjdG9yc1tpXSk7Ci0JCQkJYm9vbGVhbiByZW1vdmVkID0gdHJ1ZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5ld0NvbnN0cnVjdG9ycy5sZW5ndGg7IGorKykgewotCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGdldE1ldGhvZE5hbWUobmV3Q29uc3RydWN0b3JzW2pdKTsKLQkJCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCQlyZW1vdmVkID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVtb3ZlZCkgb2xkQ29uc3RydWN0b3JzW2NvdW50KytdID0gb2xkQ29uc3RydWN0b3JzW2ldOwotCQkJfQotCQkJaWYgKGNvdW50ID09IDApIHJldHVybiBudWxsOwotCQkJQ29uc3RydWN0b3JbXSByZXN1bHQgPSBuZXcgQ29uc3RydWN0b3JbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRDb25zdHJ1Y3RvcnMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJQ29uc3RydWN0b3JbXSBnZXRBZGRlZENvbnN0cnVjdG9ycyhDbGFzcyBvbGRDbGFzcywgQ2xhc3MgbmV3Q2xhc3MpIHsKLQkJCXJldHVybiBnZXRSZW1vdmVkQ29uc3RydWN0b3JzKG5ld0NsYXNzLCBvbGRDbGFzcyk7Ci0JCX0KLQkJCi0JCXZvaWQgb3V0cHV0Q2xhc3NEaWZmKCkgewotCQkJRW51bWVyYXRpb24gZWxlbWVudHMgPSBkaWZmcy5lbGVtZW50cygpOwotCQkJaW50IGNoYW5nZXMgPSAwOwotCQkJd2hpbGUgKGVsZW1lbnRzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJRGlmZkNsYXNzIGRpZmYgPSAoRGlmZkNsYXNzKWVsZW1lbnRzLm5leHRFbGVtZW50KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJbIitjaGFuZ2VzKyJdICIrIGRpZmYpOwotCQkJCWNoYW5nZXMrKzsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDEzYWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LnBlcmZvcm1hbmNlOwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgcnVubmluZyBTV1QgcGVyZm9ybWFuY2UgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIFBlcmZvcm1hbmNlVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBQZXJmb3JtYW5jZVRlc3RzKCk7Ci19Ci0KLXB1YmxpYyBQZXJmb3JtYW5jZVRlc3RzKCkgewotCXN1cGVyKCk7Ci0JYWRkVGVzdChUZXN0X3NpdHVhdGlvbmFsLnN1aXRlKCkpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9Td3RQZXJmb3JtYW5jZVRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1N3dFBlcmZvcm1hbmNlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViMGU1ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1N3dFBlcmZvcm1hbmNlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LnBlcmZvcm1hbmNlOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLio7Ci0KLQotcHVibGljIGNsYXNzIFN3dFBlcmZvcm1hbmNlVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLy8gdXNlZCB0byBzcGVjaWZ5IHZlcmJvc2UgbW9kZSwgaWYgdHJ1ZSB1bmltcGxlbWVudGVkIHdhcm5pbmcgbWVzc2FnZXMgd2lsbCAKLQkvLyBiZSB3cml0dGVuIHRvIFN5c3RlbS5vdXQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzR1RLID0gU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJndGsiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzID0gU1dULmdldFBsYXRmb3JtKCkuc3RhcnRzV2l0aCgid2luMzIiKTsKLQkKLQkvLyBhbGxvdyBzcGVjaWZpYyBpbWFnZSBmb3JtYXRzIHRvIGJlIHRlc3RlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gaW1hZ2VGb3JtYXRzID0gbmV3IFN0cmluZ1tdIHsiYm1wIiwgImpwZyIsICJnaWYiLCAicG5nIn07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBpbWFnZUZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbXSB7ImZvbGRlciIsICJmb2xkZXJPcGVuIiwgInRhcmdldCJ9OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdHJhbnNwYXJlbnRJbWFnZUZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbXSB7InRyYW5zcGFyZW50LnBuZyJ9OwotCi0JCi1wdWJsaWMgU3d0UGVyZm9ybWFuY2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wcm90ZWN0ZWQgUGVyZm9ybWFuY2VNZXRlciBjcmVhdGVNZXRlcihTdHJpbmcgaWQpIHsKLQlQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZSA9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQlTdHJpbmcgc2NlbmFyaW9JZCA9ICJvcmcuZWNsaXBzZS5zd3QudGVzdC4iICsgaWQ7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IHBlcmZvcm1hbmNlLmNyZWF0ZVBlcmZvcm1hbmNlTWV0ZXIoc2NlbmFyaW9JZCk7Ci0JcGVyZm9ybWFuY2UudGFnQXNTdW1tYXJ5KG1ldGVyLCBpZCwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0JcmV0dXJuIG1ldGVyOwotfQotCi1wcm90ZWN0ZWQgUGVyZm9ybWFuY2VNZXRlciBjcmVhdGVNZXRlcldpdGhvdXRTdW1tYXJ5KFN0cmluZyBpZCkgewotCVBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlID0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCVN0cmluZyBzY2VuYXJpb0lkID0gIm9yZy5lY2xpcHNlLnN3dC50ZXN0LiIgKyBpZDsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gcGVyZm9ybWFuY2UuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihzY2VuYXJpb0lkKTsKLQlyZXR1cm4gbWV0ZXI7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VNZXRlcihQZXJmb3JtYW5jZU1ldGVyIG1ldGVyKSB7Ci0JdHJ5IHsKLQkJbWV0ZXIuY29tbWl0KCk7Ci0JCVBlcmZvcm1hbmNlLmdldERlZmF1bHQoKS5hc3NlcnRQZXJmb3JtYW5jZShtZXRlcik7Ci0JfSBmaW5hbGx5IHsKLQkJbWV0ZXIuZGlzcG9zZSgpOwotCX0KLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoKFN0cmluZyBmaWxlTmFtZSkgewotCVN0cmluZyB1cmxQYXRoOwotCQotCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCX0KLQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB7Ci0JCVVSTCB1cmwgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoZmlsZU5hbWUpOwotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCWZhaWwoIlVSTCA9PSBudWxsIGZvciBmaWxlICIgKyBmaWxlTmFtZSk7Ci0JCX0KLQkJdXJsUGF0aCA9IHVybC5nZXRGaWxlKCk7Ci0JfSBlbHNlIHsKLQkJdXJsUGF0aCA9IHBsdWdpblBhdGggKyAiL2RhdGEvIiArIGZpbGVOYW1lOwotCX0KLQkKLQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgdXJsUGF0aCA9IHVybFBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CQotCWlmIChpc1dpbmRvd3MgJiYgdXJsUGF0aC5pbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikgPT0gMCkgdXJsUGF0aCA9IHVybFBhdGguc3Vic3RyaW5nKDEpOwotCXVybFBhdGggPSB1cmxQYXRoLnJlcGxhY2VBbGwoIiUyMCIsICIgIik7CQotCQotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb2x2ZWQgZmlsZSBuYW1lIGZvciAiICsgZmlsZU5hbWUgKyAiID0gIiArIHVybFBhdGgpOwotCX0KLQlyZXR1cm4gdXJsUGF0aDsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNKMk1FKCkgewotCXRyeSB7Ci0JCUNvbXBhdGliaWxpdHkubmV3RmlsZUlucHV0U3RyZWFtKCIiKTsKLQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9UZXN0X3NpdHVhdGlvbmFsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1Rlc3Rfc2l0dWF0aW9uYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5MTFmYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1Rlc3Rfc2l0dWF0aW9uYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VNZXRlcjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgUGVyZm9ybWFuY2UgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfc2l0dWF0aW9uYWwgZXh0ZW5kcyBTd3RQZXJmb3JtYW5jZVRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfc2l0dWF0aW9uYWwoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCXN1cGVyLnNldFVwKCk7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi0KLS8qKgotICogU2l0dWF0aW9uczoKLSAqIAotICogLSBXaWRnZXQgY3JlYXRpb24KLSAqIC0gc3luY0V4ZWMvYXN5bmNFeGVjIHBlcmZvcm1hbmNlCi0gKiAtIEltYWdlIGNyZWF0aW9uCi0gKiAtIERyYXdpbmcgb3BlcmF0aW9ucwotICogLSBTdHJpbmcgbWVhc3VyaW5nCi0gKiAtIFN0cmluZyBkcmF3aW5nCi0gKiAtIFJlZ2lvbiBvcGVyYXRpb25zCi0gKiAtIEZvbnRzCi0gKiAtIEltYWdlIGxvYWRpbmcKLSAqIC0gTGF5b3V0cwotICovCi1wdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNvbXBvc2l0ZXMoKSB7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IGNyZWF0ZU1ldGVyKCJDcmVhdGUgY29tcG9zaXRlcyIpOwotCWludCBzYW1wbGVzOwotCi0gICAgUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCQotCS8vIFdhcm0gdXAuCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMjsgc2FtcGxlcysrKSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgewotCQkJCW5ldyBDb21wb3NpdGUoYywgU1dULk5PTkUpOwotCQkJfQotCQl9Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCX0KLQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwMDsgc2FtcGxlcysrKSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQltZXRlci5zdGFydCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNTA7IGorKykgewotCQkJCW5ldyBDb21wb3NpdGUoYywgU1dULk5PTkUpOwotCQkJfQotCQl9Ci0JCW1ldGVyLnN0b3AoKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JfQkKLQlkaXNwb3NlTWV0ZXIobWV0ZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVdpZGdldHMoKSB7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IGNyZWF0ZU1ldGVyKCJDcmVhdGUgY29tcG9zaXRlcyBhbmQgd2lkZ2V0cyIpOwotCWludCBzYW1wbGVzOwotCi0gICAgUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2UgPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0gICAgcGVyZm9ybWFuY2UudGFnQXNHbG9iYWxTdW1tYXJ5KG1ldGVyLCAiQ3JlYXRlIGNvbXBvc2l0ZXMgYW5kIHdpZGdldHMiLCBEaW1lbnNpb24uRUxBUFNFRF9QUk9DRVNTKTsKLQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwOyBzYW1wbGVzKyspIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJbWV0ZXIuc3RhcnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7Ci0JCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgewotCQkJCW5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotCQkJCW5ldyBMYWJlbChjLCBTV1QuTk9ORSk7Ci0JCQkJbmV3IFNjYWxlKGMsIFNXVC5OT05FKTsKLQkJCQluZXcgUHJvZ3Jlc3NCYXIoYywgU1dULk5PTkUpOwotCQkJCW5ldyBMaXN0KGMsIFNXVC5OT05FKTsKLQkJCQluZXcgVGV4dChjLCBTV1QuU0lOR0xFKTsKLQkJCQluZXcgVGV4dChjLCBTV1QuTVVMVEkpOwotCQkJCW5ldyBTbGlkZXIoYywgU1dULk5PTkUpOwotCQkJCW5ldyBUcmVlKGMsIFNXVC5OT05FKTsKLQkJCQluZXcgVGFibGUoYywgU1dULk5PTkUpOwotCQkJCW5ldyBUYWJGb2xkZXIoYywgU1dULk5PTkUpOwotCQkJCW5ldyBHcm91cChjLCBTV1QuQk9SREVSKTsJCQkJCi0JCQkJbmV3IENvbXBvc2l0ZShjLCBTV1QuTk9ORSk7Ci0JCQl9Ci0JCX0KLQkJbWV0ZXIuc3RvcCgpOwotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0KCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcigiTGF5b3V0IENvbXBvc2l0ZXMiKTsKLQlpbnQgc2FtcGxlczsKLQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwOyBzYW1wbGVzKyspIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJU3RyaW5nIGN1clRleHQgPSAiIjsKLQkJTGFiZWwgY2hhbmdlZExhYmVsOwotCQlDb21wb3NpdGUgcGFyZW50ID0gc2hlbGw7Ci0JCUdyaWREYXRhIGRhdGE7Ci0JCQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQljLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkJCi0JCQlDb21wb3NpdGUgYzEgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5CT1JERVIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS53aWR0aEhpbnQgPSBkYXRhLmhlaWdodEhpbnQgPSAyOwotCQkJYzEuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJQ29tcG9zaXRlIGMyID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEud2lkdGhIaW50ID0gZGF0YS5oZWlnaHRIaW50ID0gMjsKLQkJCWMyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCUNvbXBvc2l0ZSBjMyA9IG5ldyBDb21wb3NpdGUoYywgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLndpZHRoSGludCA9IGRhdGEuaGVpZ2h0SGludCA9IDI7Ci0JCQljMy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQlDb21wb3NpdGUgYzQgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5CT1JERVIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJYzQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWM0LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCXBhcmVudCA9IGM0OwotCQl9Ci0JCWNoYW5nZWRMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWNoYW5nZWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JCXRyeSB7IFRocmVhZC5zbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQkJbWV0ZXIuc3RhcnQoKTsKLQkJZm9yKGludCBudW1sYXlvdXRzID0gMDsgbnVtbGF5b3V0cyA8IDIwOyBudW1sYXlvdXRzKyspIHsKLQkJCXNoZWxsLmxheW91dCh0cnVlKTsKLQkJCWN1clRleHQgPSAiISEhIiArIGN1clRleHQgKyAiISEhXG4hIjsKLQkJCWNoYW5nZWRMYWJlbC5zZXRUZXh0KGN1clRleHQpOwotCQkJLy93aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKTsKLQkJfQotCQltZXRlci5zdG9wKCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbWFnZURyYXdpbmcoKSB7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IGNyZWF0ZU1ldGVyKCJEcmF3IG9uIGFuIGltYWdlIik7Ci0JaW50IHNhbXBsZXM7Ci0JCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMTA7IHNhbXBsZXMrKykgewotCQlpbnQgd2lkdGggPSA2NDA7Ci0JCWludCBoZWlnaHQgPSA0ODA7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHdpZHRoLCBoZWlnaHQpOwotCQlDb2xvciBjb2xvcjEgPSBuZXcgQ29sb3IoZGlzcGxheSwgMHhmZiwgMCwgMHhmZik7Ci0JCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAweGZmLCAweGZmKTsKLQkJaW50IHgxID0gMCwgeTEgPSBoZWlnaHQvMiwgeDIgPSB3aWR0aC8yLCB5MiA9IDA7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKLQkJCXgxID0gKHgxICsgNSkgJSB3aWR0aDsgeTEgPSAoeTEgKyA1KSAlIGhlaWdodDsgeDIgPSAoeDIgKyA1KSAlIHdpZHRoOyB5MiA9ICh5MiArIDUpICUgaGVpZ2h0OwotCQkJZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQkJCWdjLmRyYXdMaW5lKHgxLCB5MSwgeDIsIHkyKTsKLQkJCWdjLnNldEZvcmVncm91bmQoKGkgJiAxKSA9PSAwID8gY29sb3IxIDogY29sb3IyKTsKLQkJCWdjLnNldEJhY2tncm91bmQoKGkgJiAxKSA9PSAwID8gY29sb3IxIDogY29sb3IyKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUoeDEsIHkxLCAyMDAsIDIwMCk7Ci0JCQlnYy5kcmF3Um91bmRSZWN0YW5nbGUoeDIsIHkyLCAyMDAsIDIwMCwgNTAsIDUwKTsKLQkJCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIRE9UKTsKLQkJCWdjLmRyYXdMaW5lKHgyLCB5MSwgeDEsIHkyKTsKLQkJfQotCQlnYy5kaXNwb3NlKCk7Ci0JCW1ldGVyLnN0b3AoKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQljb2xvcjEuZGlzcG9zZSgpOwotCQljb2xvcjIuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JfQkKLQlkaXNwb3NlTWV0ZXIobWV0ZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbmRvd0RyYXdpbmcoKSB7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IGNyZWF0ZU1ldGVyKCJEcmF3IG9uIGEgd2luZG93Iik7Ci0JUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2U9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQlwZXJmb3JtYW5jZS5zZXRDb21tZW50KG1ldGVyLCAKLQkJCVBlcmZvcm1hbmNlLkVYUExBSU5TX0RFR1JBREFUSU9OX0NPTU1FTlQsIAotCQkJIlJlZ3Jlc3Npb24gZHVlIHRvIGEgaXNzdWUgb24gdGhlIFJlbGVuZyB0ZXN0IG1hY2hpbmUiKTsKLQkJCQotCWludCBzYW1wbGVzOwotCQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwOyBzYW1wbGVzKyspIHsKLQkJaW50IHdpZHRoID0gNjQwOwotCQlpbnQgaGVpZ2h0ID0gNDgwOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDYW52YXMgYyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlkYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQkJdHJ5IHsgVGhyZWFkLnNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCQlDb2xvciBjb2xvcjEgPSBuZXcgQ29sb3IoZGlzcGxheSwgMHhmZiwgMCwgMHhmZik7Ci0JCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAweGZmLCAweGZmKTsKLQkJaW50IHgxID0gMCwgeTEgPSBoZWlnaHQvMiwgeDIgPSB3aWR0aC8yLCB5MiA9IDA7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCUdDIGdjID0gbmV3IEdDKGMpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgNjAwMDsgaSsrKSB7Ci0JCQl4MSA9ICh4MSArIDUpICUgd2lkdGg7IHkxID0gKHkxICsgNSkgJSBoZWlnaHQ7IHgyID0gKHgyICsgNSkgJSB3aWR0aDsgeTIgPSAoeTIgKyA1KSAlIGhlaWdodDsKLQkJCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JCQlnYy5kcmF3TGluZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKChpICYgMSkgPT0gMCA/IGNvbG9yMSA6IGNvbG9yMik7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKChpICYgMSkgPT0gMCA/IGNvbG9yMSA6IGNvbG9yMik7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKHgxLCB5MSwgMjAwLCAyMDApOwotCQkJZ2MuZHJhd1JvdW5kUmVjdGFuZ2xlKHgyLCB5MiwgMjAwLCAyMDAsIDUwLCA1MCk7Ci0JCQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSERPVCk7Ci0JCQlnYy5kcmF3TGluZSh4MiwgeTEsIHgxLCB5Mik7Ci0JCX0KLQkJZ2MuZGlzcG9zZSgpOwotCQltZXRlci5zdG9wKCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJY29sb3IxLmRpc3Bvc2UoKTsKLQkJY29sb3IyLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdHJpbmdEcmF3aW5nKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcldpdGhvdXRTdW1tYXJ5KCJEcmF3IHN0cmluZ3MgdXNpbmcgR0MuZHJhd1RleHQiKTsKLQlpbnQgc2FtcGxlczsKLQkKLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDsgc2FtcGxlcysrKSB7Ci0JCWludCB3aWR0aCA9IDY0MDsKLQkJaW50IGhlaWdodCA9IDQ4MDsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ2FudmFzIGMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQljLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JCXRyeSB7IFRocmVhZC5zbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yKGRpc3BsYXksIDB4ZmYsIDAsIDB4ZmYpOwotCQlDb2xvciBjb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMHhmZiwgMHhmZik7Ci0JCUZvbnQgZm9udDEgPSBuZXcgRm9udChkaXNwbGF5LCAiSGVsdmV0aWNhIiwgMjAsIFNXVC5OT05FKTsKLQkJRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksICJIZWx2ZXRpY2EiLCAxMCwgU1dULkJPTEQpOwotCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJUaGUgcXVpY2sgXHRiciZvd24gU1dUIGp1bSZwZWQgZm94aWx5IG9cbnZlciB0aGUgbGF6eSBkb2cuIjsKLQkJaW50IHgxID0gMCwgeTEgPSBoZWlnaHQvMiwgeDIgPSB3aWR0aC8yLCB5MiA9IDA7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCUdDIGdjID0gbmV3IEdDKGMpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgNDAwMDsgaSsrKSB7Ci0JCQl4MSA9ICh4MSArIDUpICUgd2lkdGg7IHkxID0gKHkxICsgNSkgJSBoZWlnaHQ7IHgyID0gKHgyICsgNSkgJSB3aWR0aDsgeTIgPSAoeTIgKyA1KSAlIGhlaWdodDsKLQkJCWdjLnNldEZvbnQoKGkgJiAxKSA9PSAwID8gZm9udDEgOiBmb250Mik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKChpICYgMSkgPT0gMCA/IGNvbG9yMSA6IGNvbG9yMik7Ci0JCQlnYy50ZXh0RXh0ZW50KHRlc3RTdHJpbmcpOwotCQkJZ2MuZHJhd1RleHQodGVzdFN0cmluZywgeDIsIHkxKTsKLQkJCWdjLmRyYXdUZXh0KHRlc3RTdHJpbmcsIHgyLCB5MS8yLCBTV1QuRFJBV19NTkVNT05JQyB8IFNXVC5EUkFXX1RSQU5TUEFSRU5UKTsKLQkJCWdjLmRyYXdUZXh0KHRlc3RTdHJpbmcsIHgyLCB5MiwgdHJ1ZSk7Ci0JCX0KLQkJZ2MuZGlzcG9zZSgpOwotCQltZXRlci5zdG9wKCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJY29sb3IxLmRpc3Bvc2UoKTsKLQkJY29sb3IyLmRpc3Bvc2UoKTsKLQkJZm9udDEuZGlzcG9zZSgpOwotCQlmb250Mi5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmFzdFN0cmluZ0RyYXdpbmcoKSB7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IGNyZWF0ZU1ldGVyV2l0aG91dFN1bW1hcnkoIkRyYXcgc3RyaW5ncyB1c2luZyBHQy5kcmF3U3RyaW5nKCkiKTsKLQlpbnQgc2FtcGxlczsKLQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwOyBzYW1wbGVzKyspIHsKLQkJaW50IHdpZHRoID0gNjQwOwotCQlpbnQgaGVpZ2h0ID0gNDgwOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDYW52YXMgYyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlkYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQkJdHJ5IHsgVGhyZWFkLnNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCQlDb2xvciBjb2xvcjEgPSBuZXcgQ29sb3IoZGlzcGxheSwgMHhmZiwgMCwgMHhmZik7Ci0JCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAweGZmLCAweGZmKTsKLQkJRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksICJIZWx2ZXRpY2EiLCAyMCwgU1dULk5PTkUpOwotCQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgIkhlbHZldGljYSIsIDEwLCBTV1QuQk9MRCk7Ci0JCVN0cmluZyB0ZXN0U3RyaW5nID0gIlRoZSBxdWljayBicm93biBTV1QganVtcGVkIGZveGlseSBvdmVyIHRoZSBsYXp5IGRvZy4iOwotCQlpbnQgeDEgPSAwLCB5MSA9IGhlaWdodC8yLCB4MiA9IHdpZHRoLzIsIHkyID0gMDsKLQkJbWV0ZXIuc3RhcnQoKTsKLQkJR0MgZ2MgPSBuZXcgR0MoYyk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKLQkJCXgxID0gKHgxICsgNSkgJSB3aWR0aDsgeTEgPSAoeTEgKyA1KSAlIGhlaWdodDsgeDIgPSAoeDIgKyA1KSAlIHdpZHRoOyB5MiA9ICh5MiArIDUpICUgaGVpZ2h0OwotCQkJZ2Muc2V0Rm9udCgoaSAmIDEpID09IDAgPyBmb250MSA6IGZvbnQyKTsKLQkJCWdjLnNldEZvcmVncm91bmQoKGkgJiAxKSA9PSAwID8gY29sb3IxIDogY29sb3IyKTsKLQkJCWdjLnN0cmluZ0V4dGVudCh0ZXN0U3RyaW5nKTsKLQkJCWdjLmRyYXdTdHJpbmcodGVzdFN0cmluZywgeDEsIHkyKTsKLQkJCWdjLmRyYXdTdHJpbmcodGVzdFN0cmluZywgeDEsIHkxLCB0cnVlKTsKLQkJfQotCQlnYy5kaXNwb3NlKCk7Ci0JCW1ldGVyLnN0b3AoKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCQljb2xvcjEuZGlzcG9zZSgpOwotCQljb2xvcjIuZGlzcG9zZSgpOwotCQlmb250MS5kaXNwb3NlKCk7Ci0JCWZvbnQyLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9zaXR1YXRpb25hbCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jcmVhdGVDb21wb3NpdGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jcmVhdGVXaWRnZXRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbWFnZURyYXdpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbmRvd0RyYXdpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N0cmluZ0RyYXdpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Zhc3RTdHJpbmdEcmF3aW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY3JlYXRlQ29tcG9zaXRlcyIpKSB0ZXN0X2NyZWF0ZUNvbXBvc2l0ZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NyZWF0ZVdpZGdldHMiKSkgdGVzdF9jcmVhdGVXaWRnZXRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXQiKSkgdGVzdF9sYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ltYWdlRHJhd2luZyIpKSB0ZXN0X2ltYWdlRHJhd2luZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luZG93RHJhd2luZyIpKSB0ZXN0X3dpbmRvd0RyYXdpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0cmluZ0RyYXdpbmciKSkgdGVzdF9zdHJpbmdEcmF3aW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mYXN0U3RyaW5nRHJhd2luZyIpKSB0ZXN0X2Zhc3RTdHJpbmdEcmF3aW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGlzcGxheSBkaXNwbGF5OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzdkNTA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlOGI1YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3M2VhMWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVkN2ViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdHJhbnNwYXJlbnQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90cmFuc3BhcmVudC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjVmMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90cmFuc3BhcmVudC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDQzMzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN3dC50ZXN0cwotQnVuZGxlLVZlcnNpb246IDMuNC4wCi1CdW5kbGUtQ2xhc3NQYXRoOiBzd3R0ZXN0cy5qYXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdCwKLSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlciwKLSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQucGVyZm9ybWFuY2UKLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2Uuc3d0LAotIG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxMjE4NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS5zd3R0ZXN0cy5qYXI9SlVuaXQgVGVzdHMvCi0KLWJpbi5pbmNsdWRlcyA9ICouamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBkYXRhLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjMuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXIzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxY2EwYmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPGh0bWw+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/wpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODYwYWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0QmFkQml0RGVwdGgucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdEJhZEJpdERlcHRoLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzY2I5MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0QmFkQml0RGVwdGgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZW1wdHkudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZW1wdHkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2VtcHR5LnR4dAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0MzUxZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTdjNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODcwMTcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmMmRjMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5ibXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhMTIxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODg2YmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmpwZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWY4ODgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzNmQ2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5ibXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzdkNTA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlOGI1YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmpwZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3M2VhMWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVkN2ViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90cmFuc3BhcmVudC5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90cmFuc3BhcmVudC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjVmMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdHJhbnNwYXJlbnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzBhOGQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBUZXN0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNGQwNjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgbW9yZSB0aWdodGx5IGNvdXBsZWQgd2l0aCB0aGUgLS0+Ci0gIDwhLS0gb3JnLmVjbGlwc2UudWkgcGx1Z2luLCBmb3IgdGVzdGluZy4gLS0+Ci0KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIvPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3QudGVzdHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2Ryb3BpbnMvZWNsaXBzZS9wbHVnaW5zLyR7b3JnLmVjbGlwc2Uuc3d0LnRlc3RzfSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2Ryb3BpbnMvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiIHVubGVzcz0icGVyZm9ybWFuY2UiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3N3dF9zbmlmZl9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtsb2NhdGlvbjF9IiBxdWlldD0idHJ1ZSIvPgotICAgIDwhLS0gUnVuIGFsbCBTV1QgdGVzdHMgb24gV2luZG93cywgYW5kIGVpdGhlciBDYXJib24gdGVzdHMgb3IgR3RrIHRlc3RzIG90aGVyd2lzZS4gLS0+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY2xhc3MtdGVzdHMiIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuQWxsR3RrVGVzdHMiPgotICAgICAgPGVxdWFscyBhcmcxPSIke29zfSIgYXJnMj0ibGludXgiLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjbGFzcy10ZXN0cyIgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5BbGxDb2NvYVRlc3RzIj4KLSAgICAgIDxlcXVhbHMgYXJnMT0iJHt3c30iIGFyZzI9ImNvY29hIi8+Ci0gICAgPC9jb25kaXRpb24+Ci0gIAk8Y29uZGl0aW9uIHByb3BlcnR5PSJjbGFzcy10ZXN0cyIgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5BbGxDYXJib25UZXN0cyI+Ci0gICAgICA8ZXF1YWxzIGFyZzE9IiR7d3N9IiBhcmcyPSJjYXJib24iLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjbGFzcy10ZXN0cyIgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5BbGxUZXN0cyI+Ci0gICAgICA8ZXF1YWxzIGFyZzE9IiR7b3N9IiBhcmcyPSJ3aW4zMiIvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtkYXRhfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSIke2NsYXNzLXRlc3RzfSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciB0aGUgdGVzdHMgLS0+Ci0gIDwhLS0gaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0byBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tICBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSBwZXJmb3JtYW5jZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4gCi0gIDx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2Utc3VpdGUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzd3QtcGVyZm9ybWFuY2UtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3N3dF9wZXJmb3JtYW5jZV9mb2xkZXIiIC8+IAotICAgIDxkZWxldGUgZGlyPSIke3N3dC1wZXJmb3JtYW5jZS1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIgLz4gCi0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0idGltZW91dCIgdmFsdWU9IjE0NDAwMDAwIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3N3dC1wZXJmb3JtYW5jZS1mb2xkZXJ9IiAvPiAKLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9IiAvPiAKLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0cyIgLz4gCi0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2UiIGRlcGVuZHM9ImluaXQscGVyZm9ybWFuY2Utc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiIC8+IAotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIiAvPiAKLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIGFmdGVyIGFsbCAtLT4KLSAgPCEtLSB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gIAotPC9wcm9qZWN0Pgo=